From e0a1ca72da5c5922f5ecfbf7576432fb4fe1a18a Mon Sep 17 00:00:00 2001 From: Alexthw46 <77152778+Alexthw46@users.noreply.github.com> Date: Mon, 1 Apr 2024 10:04:57 +0200 Subject: [PATCH 001/363] first test --- .../client/particle/GlowParticleData.java | 4 --- .../common/entity/EntityProjectileSpell.java | 25 +++++++++++++------ .../common/spell/method/MethodProjectile.java | 2 +- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/GlowParticleData.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/GlowParticleData.java index f4ad32712b..2baffe3246 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/GlowParticleData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/GlowParticleData.java @@ -1,10 +1,6 @@ package com.hollingsworth.arsnouveau.client.particle; import com.hollingsworth.arsnouveau.client.registry.ModParticles; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleProvider; -import net.minecraft.client.particle.SpriteSet; import net.minecraft.core.particles.ParticleOptions; @Deprecated diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java index c67723c4df..1414991ce5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java @@ -7,6 +7,7 @@ import com.hollingsworth.arsnouveau.common.lib.EntityTags; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketANEffect; +import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAOE; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentPierce; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentSensitive; import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; @@ -25,9 +26,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.BlockTags; import net.minecraft.util.Mth; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.*; import net.minecraft.world.entity.projectile.ProjectileUtil; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; @@ -53,7 +52,7 @@ public class EntityProjectileSpell extends ColoredProjectile implements IEntityA //to use if you want the bounce augment indipendent from the pierce augment //public int bouncesLeft; public int numSensitive; - + public float size = 1; public boolean isNoGravity = true; public boolean canTraversePortals = true; public int prismRedirect; @@ -86,7 +85,9 @@ public EntityProjectileSpell(EntityType entityT this.spellResolver = resolver; this.pierceLeft = resolver.spell.getBuffsAtIndex(0, resolver.spellContext.getUnwrappedCaster(), AugmentPierce.INSTANCE); this.numSensitive = resolver.spell.getBuffsAtIndex(0, resolver.spellContext.getUnwrappedCaster(), AugmentSensitive.INSTANCE); + this.size = 1 + resolver.spell.getBuffsAtIndex(0, resolver.spellContext.getUnwrappedCaster(), AugmentAOE.INSTANCE); setColor(resolver.spellContext.getColors()); + refreshDimensions(); } public EntityProjectileSpell(Level world, SpellResolver resolver) { @@ -206,10 +207,13 @@ public void playParticles() { double deltaX = getX() - xOld; double deltaY = getY() - yOld; double deltaZ = getZ() - zOld; + deltaX *= size; + deltaY *= size; + deltaZ *= size; double dist = Math.ceil(Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) * 6); for (double j = 0; j < dist; j++) { double coeff = j / dist; - level.addParticle(GlowParticleData.createData(getParticleColor()), + level.addParticle(GlowParticleData.createData(getParticleColor(), 0.25f + size, 1.0f, 36), (float) (xo + deltaX * coeff), (float) (yo + deltaY * coeff) + 0.1, (float) (zo + deltaZ * coeff), @@ -374,11 +378,13 @@ public Packet getAddEntityPacket() { public void writeSpawnData(FriendlyByteBuf buffer) { buffer.writeBoolean(isNoGravity); buffer.writeInt(numSensitive); + buffer.writeFloat(size); } public void readSpawnData(FriendlyByteBuf additionalData) { isNoGravity = additionalData.readBoolean(); numSensitive = additionalData.readInt(); + size = additionalData.readFloat(); } public void recreateFromPacket(ClientboundAddEntityPacket pPacket) { @@ -392,9 +398,9 @@ public void recreateFromPacket(ClientboundAddEntityPacket pPacket) { @Override public void setOwner(@org.jetbrains.annotations.Nullable Entity pOwner) { super.setOwner(pOwner); - if(pOwner != null) { + if (pOwner != null) { this.entityData.set(OWNER_ID, pOwner.getId()); - }else{ + } else { this.entityData.set(OWNER_ID, -1); } } @@ -416,4 +422,9 @@ public void addAdditionalSaveData(CompoundTag tag) { tag.putBoolean("gravity", isNoGravity); tag.putInt("ownerId", this.entityData.get(OWNER_ID)); } + + @Override + public EntityDimensions getDimensions(Pose pPose) { + return super.getDimensions(pPose).scale(1 + size); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodProjectile.java index 2a08c1a66e..bdab99a155 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodProjectile.java @@ -124,7 +124,7 @@ public CastResolveType onCastOnEntity(ItemStack stack, LivingEntity caster, Enti @NotNull @Override public Set getCompatibleAugments() { - return augmentSetOf(AugmentPierce.INSTANCE, AugmentSplit.INSTANCE, AugmentAccelerate.INSTANCE, AugmentDecelerate.INSTANCE, AugmentSensitive.INSTANCE); + return augmentSetOf(AugmentAOE.INSTANCE, AugmentPierce.INSTANCE, AugmentSplit.INSTANCE, AugmentAccelerate.INSTANCE, AugmentDecelerate.INSTANCE, AugmentSensitive.INSTANCE); } @Override From 5d8f9a4015bd123b010a624eedc4ca445401545e Mon Sep 17 00:00:00 2001 From: Jarva <4622609+Jarva@users.noreply.github.com> Date: Fri, 21 Jun 2024 15:23:48 +0100 Subject: [PATCH 002/363] [WIP] 1.20.6 (#1327) * feat: initial commit with port efforts * feat: finish all registries other than block and capability * Update ITimedEvent.java --------- Co-authored-by: Bailey Hollingsworth --- .gitignore | 2 +- build.gradle | 364 ++++------------ gradle.properties | 32 +- gradle/wrapper/gradle-wrapper.jar | Bin 62076 -> 43462 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 24 +- gradlew.bat | 20 +- settings.gradle | 11 + .../hollingsworth/arsnouveau/ArsNouveau.java | 67 +-- .../arsnouveau/api/ANFakePlayer.java | 20 +- .../arsnouveau/api/ArsNouveauAPI.java | 26 +- .../api/camera/ICameraMountable.java | 6 +- .../EnchantingApparatusRecipe.java | 7 +- .../EnchantmentRecipe.java | 3 +- .../SpellWriteRecipe.java | 6 +- .../arsnouveau/api/entity/ISummon.java | 5 +- .../arsnouveau/api/event/DispelEvent.java | 5 +- .../api/event/EffectResolveEvent.java | 2 +- .../arsnouveau/api/event/EventQueue.java | 31 +- .../api/event/FadeLightTimedEvent.java | 1 + .../api/event/FamiliarSummonEvent.java | 2 +- .../arsnouveau/api/event/ITimedEvent.java | 5 - .../api/event/ManaRegenCalcEvent.java | 2 +- .../api/event/MaxManaCalcEvent.java | 2 +- .../arsnouveau/api/event/SpellCastEvent.java | 4 +- .../api/event/SpellCostCalcEvent.java | 2 +- .../api/event/SpellDamageEvent.java | 2 +- .../api/event/SpellModifierEvent.java | 3 +- .../api/event/SpellProjectileHitEvent.java | 2 +- .../api/event/SpellResolveEvent.java | 2 +- .../arsnouveau/api/event/SummonEvent.java | 3 +- .../arsnouveau/api/item/ICosmeticItem.java | 4 +- .../arsnouveau/api/item/IRadialProvider.java | 4 +- .../api/item/ISpellHotkeyListener.java | 4 +- .../api/item/inv/CombinedHandlerInv.java | 5 +- .../api/item/inv/ExtractedStack.java | 4 +- .../api/item/inv/FilterableItemHandler.java | 4 +- .../api/item/inv/InventoryManager.java | 5 +- .../api/item/inv/SlotReference.java | 3 +- .../api/item/inv/StorageItemHandler.java | 4 +- .../api/loot/DungeonLootEnhancerModifier.java | 49 +-- .../api/loot/DungeonLootTables.java | 16 +- .../arsnouveau/api/mana/IManaCap.java | 2 +- .../arsnouveau/api/perk/PerkAttributes.java | 45 +- .../arsnouveau/api/potion/PotionData.java | 3 +- .../arsnouveau/api/recipe/IRecipeWrapper.java | 3 +- .../api/recipe/MultiRecipeWrapper.java | 24 +- .../api/recipe/PotionIngredient.java | 46 +- .../api/recipe/SummonRitualRecipe.java | 166 ++------ .../api/registry/CasterTomeRegistry.java | 2 +- .../api/registry/GlyphRegistry.java | 11 +- .../arsnouveau/api/ritual/RitualUtil.java | 2 +- .../api/scrying/SingleBlockScryer.java | 2 +- .../arsnouveau/api/scrying/TagScryer.java | 2 +- .../api/source/AbstractSourceMachine.java | 3 +- .../arsnouveau/api/source/SourceManager.java | 8 +- .../api/source/SourcelinkEventQueue.java | 3 +- .../api/spell/AbstractCastMethod.java | 5 +- .../arsnouveau/api/spell/AbstractEffect.java | 59 ++- .../api/spell/AbstractSpellPart.java | 22 +- .../arsnouveau/api/spell/IDamageEffect.java | 6 +- .../arsnouveau/api/spell/SpellContext.java | 1 + .../arsnouveau/api/spell/SpellResolver.java | 13 +- .../arsnouveau/api/spell/SpellStats.java | 5 +- .../spell/wrapped_caster/LivingCaster.java | 6 +- .../spell/wrapped_caster/PlayerCaster.java | 2 +- .../arsnouveau/api/util/ANExplosion.java | 2 +- .../arsnouveau/api/util/BlockUtil.java | 29 +- .../arsnouveau/api/util/CuriosUtil.java | 4 +- .../arsnouveau/api/util/InvUtil.java | 12 +- .../arsnouveau/api/util/ManaUtil.java | 10 +- .../arsnouveau/api/util/SourceUtil.java | 5 +- .../arsnouveau/api/util/SpellUtil.java | 8 +- .../arsnouveau/client/SkyTextureHandler.java | 10 +- .../AbstractStorageTerminalScreen.java | 2 +- .../container/CraftingTerminalScreen.java | 1 + .../client/container/TerminalSyncManager.java | 3 +- .../client/events/ClientEvents.java | 23 +- .../client/events/ClientPlayerEvent.java | 8 +- .../arsnouveau/client/gui/BookSlider.java | 4 +- .../client/gui/GlyphRecipeTooltip.java | 5 +- .../client/gui/GuiEntityInfoHUD.java | 18 +- .../arsnouveau/client/gui/GuiManaHUD.java | 6 +- .../arsnouveau/client/gui/GuiSpellHUD.java | 6 +- .../client/gui/book/GlyphUnlockMenu.java | 6 +- .../client/gui/book/GuiColorScreen.java | 2 +- .../client/gui/buttons/GlyphButton.java | 12 +- .../client/gui/buttons/ItemButton.java | 5 +- .../client/gui/buttons/UnlockGlyphButton.java | 12 +- .../client/gui/radial_menu/GuiRadialMenu.java | 11 +- .../client/jei/DyeRecipeCategory.java | 2 +- .../client/jei/MultiInputCategory.java | 2 +- .../client/keybindings/KeyHandler.java | 14 +- .../client/particle/LineParticleProvider.java | 4 +- .../client/particle/ParticleGlow.java | 4 +- .../client/registry/ClientHandler.java | 25 +- .../client/registry/ModKeyBindings.java | 11 +- .../client/registry/ModParticles.java | 16 +- .../client/registry/ShaderRegistry.java | 10 +- .../renderer/entity/AnimBlockRenderer.java | 3 +- .../tile/AlterationTableRenderer.java | 6 +- .../tile/EnchantedFallingBlockRenderer.java | 5 +- .../renderer/tile/FalseweaveRenderer.java | 2 +- .../client/renderer/tile/GenericRenderer.java | 2 +- .../renderer/tile/GhostweaveRenderer.java | 2 +- .../renderer/tile/IntangibleAirRenderer.java | 3 +- .../renderer/tile/MirrorweaveRenderer.java | 4 +- .../renderer/tile/PortalTileRenderer.java | 4 +- .../renderer/tile/SkyBlockRenderer.java | 8 +- .../renderer/world/WorldEventContext.java | 2 +- .../advancement/ANCriteriaTriggers.java | 41 +- .../common/armor/AnimatedMagicArmor.java | 6 +- .../common/block/ArchwoodChest.java | 5 +- .../common/block/BasicSpellTurret.java | 2 +- .../arsnouveau/common/block/PortalBlock.java | 5 +- .../common/block/PotionDiffuserBlock.java | 2 +- .../common/block/RotatingSpellTurret.java | 2 +- .../arsnouveau/common/block/ScribesBlock.java | 10 +- .../common/block/ScryersOculus.java | 4 +- .../common/block/SourceBerryBush.java | 4 +- .../common/block/StrippableLog.java | 6 +- .../block/tile/AgronomicSourcelinkTile.java | 10 +- .../block/tile/BasicSpellTurretTile.java | 2 +- .../block/tile/CraftingLecternTile.java | 6 +- .../common/block/tile/ImbuementTile.java | 26 +- .../common/block/tile/ItemDetectorTile.java | 10 +- .../common/block/tile/LecternInvWrapper.java | 2 +- .../common/block/tile/MirrorWeaveTile.java | 3 +- .../common/block/tile/ModdedTile.java | 20 +- .../common/block/tile/PortalTile.java | 5 +- .../common/block/tile/PotionJarTile.java | 2 +- .../common/block/tile/RedstoneRelayTile.java | 15 +- .../common/block/tile/RelayTile.java | 2 +- .../common/block/tile/RepositoryTile.java | 2 +- .../common/block/tile/RitualBrazierTile.java | 4 +- .../common/block/tile/ScribesTile.java | 10 +- .../common/block/tile/SingleItemTile.java | 14 +- .../common/block/tile/SourceJarTile.java | 2 +- .../common/block/tile/SourcelinkTile.java | 4 +- .../common/block/tile/SpellSensorTile.java | 2 +- .../common/block/tile/StorageLecternTile.java | 20 +- .../common/block/tile/SummoningTile.java | 2 +- .../block/tile/VitalicSourcelinkTile.java | 12 +- .../block/tile/VolcanicSourcelinkTile.java | 6 +- .../common/block/tile/WixieCauldronTile.java | 10 +- .../camera/ANIChunkStorageProvider.java | 1 + .../common/camera/CameraController.java | 10 +- .../common/camera/CameraEvents.java | 14 +- .../common/camera/ClientCameraEvents.java | 18 +- .../capability/ANPlayerCapAttacher.java | 10 +- .../common/capability/IPlayerCap.java | 3 +- .../common/capability/ManaCapAttacher.java | 10 +- .../common/command/PathCommand.java | 2 +- .../common/command/ToggleLightCommand.java | 2 +- .../common/compat/PatchouliHandler.java | 2 +- .../crafting/recipes/BookUpgradeRecipe.java | 2 +- .../common/crafting/recipes/CrushRecipe.java | 2 +- .../common/crafting/recipes/DyeRecipe.java | 4 +- .../common/crafting/recipes/GlyphRecipe.java | 3 +- .../crafting/recipes/ImbuementRecipe.java | 22 +- .../crafting/recipes/PotionFlaskRecipe.java | 2 +- .../common/crafting/recipes/RecipeUtil.java | 2 +- .../common/datagen/ANAdvancements.java | 7 +- .../datagen/ApparatusRecipeBuilder.java | 2 +- .../datagen/ApparatusRecipeProvider.java | 3 +- .../common/datagen/AtlasProvider.java | 5 +- .../common/datagen/BiomeTagProvider.java | 4 +- .../common/datagen/BlockStatesDatagen.java | 12 +- .../common/datagen/BlockTagProvider.java | 15 +- .../common/datagen/CompostablesProvider.java | 57 +++ .../common/datagen/CrushRecipeProvider.java | 11 +- .../common/datagen/DamageTypesProvider.java | 10 +- .../common/datagen/DefaultTableProvider.java | 104 +++-- .../common/datagen/DyeRecipeDatagen.java | 2 +- .../common/datagen/EntityTagProvider.java | 4 +- .../common/datagen/GlyphRecipeProvider.java | 3 +- .../datagen/ImbuementRecipeProvider.java | 3 +- .../common/datagen/ItemModelGenerator.java | 9 +- .../common/datagen/ItemTagProvider.java | 12 +- .../common/datagen/LangDatagen.java | 3 +- .../arsnouveau/common/datagen/ModDatagen.java | 23 +- .../common/datagen/PatchouliProvider.java | 7 +- .../datagen/PlacedFeatureTagProvider.java | 2 +- .../datagen/PotionEffectTagProvider.java | 2 +- .../common/datagen/RecipeDatagen.java | 69 ++- .../common/datagen/StructureTagProvider.java | 2 +- .../common/datagen/WorldgenProvider.java | 24 +- .../advancement/ANAdvancementBuilder.java | 81 ++-- .../datagen/advancement/ANAdvancements.java | 64 +-- .../datagen/patchouli/ApparatusPage.java | 2 +- .../datagen/patchouli/ApparatusTextPage.java | 2 +- .../datagen/patchouli/CraftingPage.java | 2 +- .../datagen/patchouli/MultiblockPage.java | 2 +- .../datagen/patchouli/PatchouliBuilder.java | 2 +- .../common/entity/AnimHeadSummon.java | 4 +- .../common/entity/EnchantedSkull.java | 4 +- .../common/entity/EntityBookwyrm.java | 2 +- .../entity/EntityChimeraProjectile.java | 4 +- .../common/entity/EntityDrygmy.java | 2 +- .../arsnouveau/common/entity/EntityDummy.java | 5 +- .../common/entity/EntityEvokerFangs.java | 5 +- .../common/entity/EntityFlyingItem.java | 4 +- .../common/entity/EntityFollowProjectile.java | 4 +- .../common/entity/EntityLingeringSpell.java | 2 +- .../common/entity/EntityOrbitProjectile.java | 4 +- .../common/entity/EntityProjectileSpell.java | 11 +- .../common/entity/EntityRitualProjectile.java | 4 +- .../common/entity/EntitySpellArrow.java | 6 +- .../common/entity/EntityWallSpell.java | 2 +- .../arsnouveau/common/entity/EntityWixie.java | 2 +- .../common/entity/GiftStarbuncle.java | 2 +- .../common/entity/LightningEntity.java | 27 +- .../common/entity/ScryerCamera.java | 6 +- .../arsnouveau/common/entity/Starbuncle.java | 8 +- .../arsnouveau/common/entity/Whirlisprig.java | 2 +- .../common/entity/WildenChimera.java | 4 +- .../familiar/FamiliarAmethystGolem.java | 2 +- .../entity/familiar/FamiliarBookwyrm.java | 12 +- .../entity/familiar/FamiliarDrygmy.java | 4 +- .../entity/familiar/FamiliarEntity.java | 19 +- .../entity/familiar/FamiliarStarbuncle.java | 2 +- .../entity/familiar/FamiliarWhirlisprig.java | 2 +- .../common/entity/familiar/FamiliarWixie.java | 30 +- .../amethyst_golem/DepositAmethystGoal.java | 7 +- .../amethyst_golem/PickupAmethystGoal.java | 5 +- .../carbuncle/StarbyTransportBehavior.java | 16 +- .../entity/goal/carbuncle/StoreItemGoal.java | 4 +- .../entity/goal/carbuncle/TakeItemGoal.java | 2 +- .../goal/carbuncle/UntamedFindItem.java | 3 +- .../goal/chimera/ChimeraLeapRamGoal.java | 2 +- .../entity/goal/chimera/ChimeraRamGoal.java | 4 +- .../entity/goal/wixie/FindNextItemGoal.java | 9 +- .../common/entity/pathfinding/ChunkCache.java | 5 +- .../pathfinding/ClientEventHandler.java | 12 +- .../entity/pathfinding/FMLEventHandler.java | 4 +- .../entity/pathfinding/Pathfinding.java | 5 +- .../arsnouveau/common/event/ArsEvents.java | 18 +- .../arsnouveau/common/event/EventHandler.java | 39 +- .../common/event/FamiliarEvents.java | 12 +- .../arsnouveau/common/event/JarEvents.java | 10 +- .../arsnouveau/common/event/LightEvents.java | 11 +- .../common/event/ManaCapEvents.java | 13 +- .../common/event/OpenChestEvent.java | 2 +- .../arsnouveau/common/event/PerkEvents.java | 13 +- .../common/event/ReactiveEvents.java | 12 +- .../arsnouveau/common/event/ScryEvents.java | 19 +- .../arsnouveau/common/event/SummonEvents.java | 6 +- .../common/items/AlchemistsCrown.java | 6 +- .../common/items/AnimBlockItem.java | 6 +- .../common/items/EnchantersMirror.java | 2 +- .../common/items/EnchantersShield.java | 2 +- .../common/items/EnchantersSword.java | 2 +- .../arsnouveau/common/items/FlaskCannon.java | 6 +- .../arsnouveau/common/items/Glyph.java | 5 +- .../arsnouveau/common/items/ItemScroll.java | 3 +- .../arsnouveau/common/items/MobJarItem.java | 2 +- .../arsnouveau/common/items/ModBlockItem.java | 5 +- .../arsnouveau/common/items/ModItem.java | 10 +- .../arsnouveau/common/items/PerkItem.java | 5 +- .../common/items/RendererBlockItem.java | 8 +- .../arsnouveau/common/items/ScryCaster.java | 2 +- .../arsnouveau/common/items/SpellBook.java | 6 +- .../arsnouveau/common/items/SpellBow.java | 14 +- .../common/items/SpellCrossbow.java | 4 +- .../common/items/StarbuncleShades.java | 3 +- .../arsnouveau/common/items/Wand.java | 2 +- .../arsnouveau/common/items/WixieHat.java | 3 +- .../common/items/curios/JumpingRing.java | 4 +- .../common/items/curios/SummoningFocus.java | 9 +- .../items/itemscrolls/AllowItemScroll.java | 2 +- .../items/itemscrolls/DenyItemScroll.java | 2 +- .../items/itemscrolls/MimicItemScroll.java | 2 +- .../common/light/DynamLightUtil.java | 2 +- .../arsnouveau/common/light/LightManager.java | 4 +- .../common/mixin/PotionRecipeMixin.java | 2 +- .../mixin/camera/ClientChunkCacheMixin.java | 8 +- .../common/mixin/light/LightEntityMixin.java | 1 + .../common/network/AbstractPacket.java | 3 +- .../common/network/ChangeBiomePacket.java | 3 +- .../network/ClientToServerStoragePacket.java | 5 +- .../common/network/HighlightAreaPacket.java | 3 +- .../arsnouveau/common/network/Networking.java | 9 +- .../common/network/NotEnoughManaPacket.java | 3 +- .../common/network/PacketANEffect.java | 3 +- .../common/network/PacketAddFadingLight.java | 3 +- .../common/network/PacketAnimEntity.java | 3 +- .../network/PacketClientDelayEffect.java | 3 +- .../common/network/PacketConsumePotion.java | 3 +- .../common/network/PacketDismountCamera.java | 3 +- .../common/network/PacketDispelFamiliars.java | 3 +- .../network/PacketGenericClientMessage.java | 3 +- .../network/PacketGetPersistentData.java | 3 +- .../common/network/PacketHotkeyPressed.java | 3 +- .../common/network/PacketJoinedServer.java | 3 +- .../common/network/PacketMountCamera.java | 3 +- .../network/PacketNoSpamChatMessage.java | 3 +- .../network/PacketOneShotAnimation.java | 3 +- .../common/network/PacketOpenGlyphCraft.java | 3 +- .../common/network/PacketOpenSpellBook.java | 3 +- .../common/network/PacketQuickCast.java | 3 +- .../common/network/PacketReactiveSpell.java | 3 +- .../common/network/PacketSetBookMode.java | 3 +- .../common/network/PacketSetCameraView.java | 3 +- .../common/network/PacketSetLauncher.java | 3 +- .../common/network/PacketSetScribeRecipe.java | 3 +- .../common/network/PacketSetSound.java | 5 +- .../common/network/PacketSummonFamiliar.java | 7 +- .../common/network/PacketSummonLily.java | 3 +- .../common/network/PacketSyncLitEntities.java | 3 +- .../common/network/PacketSyncPlayerCap.java | 3 +- .../common/network/PacketSyncTag.java | 3 +- .../common/network/PacketTimedEvent.java | 3 +- .../common/network/PacketToggleFamiliar.java | 7 +- .../common/network/PacketToggleLight.java | 3 +- .../common/network/PacketTogglePathing.java | 3 +- .../common/network/PacketUnsummonLily.java | 3 +- .../common/network/PacketUpdateBookGUI.java | 3 +- .../common/network/PacketUpdateCaster.java | 5 +- .../common/network/PacketUpdateFlight.java | 3 +- .../common/network/PacketUpdateMana.java | 3 +- .../network/PacketUpdateSpellColorAll.java | 5 +- .../network/PacketUpdateSpellColors.java | 5 +- .../network/PacketUpdateSpellSoundAll.java | 5 +- .../common/network/PacketWarpPosition.java | 3 +- .../common/network/PotionSyncPacket.java | 7 +- .../network/ServerToClientStoragePacket.java | 5 +- .../common/network/SyncPathMessage.java | 3 +- .../network/SyncPathReachedMessage.java | 3 +- .../arsnouveau/common/perk/DepthsPerk.java | 5 +- .../common/perk/StepHeightPerk.java | 5 +- .../common/potions/BounceEffect.java | 10 +- .../common/potions/GravityEffect.java | 10 +- .../common/potions/ShockedEffect.java | 10 +- .../common/ritual/DenySpawnRitual.java | 2 +- .../common/ritual/RitualAnimalSummoning.java | 33 +- .../common/ritual/RitualFlight.java | 2 +- .../common/ritual/RitualHealing.java | 3 +- .../common/ritual/RitualMobCapture.java | 2 +- .../common/ritual/RitualPillagerRaid.java | 3 +- .../common/ritual/RitualScrying.java | 2 +- .../common/ritual/RitualWildenSummoning.java | 2 +- .../common/spell/casters/ReactiveCaster.java | 2 +- .../common/spell/effect/EffectAnimate.java | 4 +- .../common/spell/effect/EffectBlink.java | 12 +- .../common/spell/effect/EffectBounce.java | 4 +- .../common/spell/effect/EffectBurst.java | 4 +- .../common/spell/effect/EffectColdSnap.java | 4 +- .../common/spell/effect/EffectCrush.java | 4 +- .../common/spell/effect/EffectCut.java | 16 +- .../common/spell/effect/EffectDelay.java | 4 +- .../common/spell/effect/EffectDispel.java | 10 +- .../common/spell/effect/EffectEnderChest.java | 2 +- .../common/spell/effect/EffectExchange.java | 6 +- .../common/spell/effect/EffectExplosion.java | 12 +- .../common/spell/effect/EffectFangs.java | 4 +- .../common/spell/effect/EffectFell.java | 6 +- .../common/spell/effect/EffectFlare.java | 4 +- .../common/spell/effect/EffectFreeze.java | 4 +- .../common/spell/effect/EffectGlide.java | 4 +- .../common/spell/effect/EffectGravity.java | 4 +- .../common/spell/effect/EffectHarm.java | 4 +- .../common/spell/effect/EffectHeal.java | 4 +- .../common/spell/effect/EffectHex.java | 4 +- .../common/spell/effect/EffectIgnite.java | 4 +- .../common/spell/effect/EffectIntangible.java | 4 +- .../common/spell/effect/EffectInteract.java | 2 +- .../spell/effect/EffectInvisibility.java | 4 +- .../common/spell/effect/EffectKnockback.java | 4 +- .../common/spell/effect/EffectLaunch.java | 4 +- .../common/spell/effect/EffectLeap.java | 6 +- .../common/spell/effect/EffectLight.java | 4 +- .../common/spell/effect/EffectLightning.java | 4 +- .../common/spell/effect/EffectLinger.java | 4 +- .../common/spell/effect/EffectPickup.java | 8 +- .../common/spell/effect/EffectPlaceBlock.java | 10 +- .../common/spell/effect/EffectPull.java | 4 +- .../common/spell/effect/EffectRedstone.java | 16 +- .../common/spell/effect/EffectSenseMagic.java | 4 +- .../common/spell/effect/EffectSlowfall.java | 4 +- .../common/spell/effect/EffectSnare.java | 4 +- .../spell/effect/EffectSummonDecoy.java | 4 +- .../spell/effect/EffectSummonSteed.java | 4 +- .../spell/effect/EffectSummonUndead.java | 4 +- .../common/spell/effect/EffectSummonVex.java | 4 +- .../spell/effect/EffectSummonWolves.java | 4 +- .../common/spell/effect/EffectToss.java | 8 +- .../common/spell/effect/EffectWall.java | 4 +- .../common/spell/effect/EffectWindshear.java | 4 +- .../common/spell/effect/EffectWither.java | 4 +- .../common/spell/effect/EffectWololo.java | 2 +- .../common/spell/method/MethodProjectile.java | 6 +- .../common/tomes/CasterTomeData.java | 2 +- .../arsnouveau/common/util/PotionUtil.java | 27 +- .../common/util/SpellPartConfigUtil.java | 31 +- .../BlockEntityTypeRegistryWrapper.java | 11 + .../util/registry/BlockRegistryWrapper.java | 10 + .../util/registry/ItemRegistryWrapper.java | 11 + .../util/{ => registry}/RegistryWrapper.java | 20 +- .../processors/WaterloggingFixProcessor.java | 4 +- .../world/saved_data/RedstoneSavedData.java | 10 +- .../common/world/saved_data/RedstoneUtil.java | 1 + .../common/world/structure/WildenDen.java | 7 +- .../world/structure/WildenGuardianDen.java | 5 +- .../AbstractSupplierBlockStateProvider.java | 3 +- .../common/world/tree/MagicTree.java | 18 +- .../common/world/tree/MagicTrunkPlacer.java | 3 +- .../arsnouveau/setup/ModSetup.java | 30 +- .../arsnouveau/setup/config/ANModConfig.java | 11 +- .../arsnouveau/setup/config/Config.java | 110 ++--- .../arsnouveau/setup/config/ConfigUtil.java | 5 +- .../arsnouveau/setup/config/ServerConfig.java | 41 +- .../setup/registry/APIRegistry.java | 3 +- .../setup/registry/BiomeRegistry.java | 8 +- .../setup/registry/BlockRegistry.java | 393 +++++++++--------- .../setup/registry/CapabilityRegistry.java | 20 +- .../setup/registry/CreativeTabRegistry.java | 11 +- .../setup/registry/DataSerializers.java | 27 +- .../setup/registry/EnchantmentRegistry.java | 14 +- .../setup/registry/ItemsRegistry.java | 254 ++++++----- .../setup/registry/LootRegistry.java | 17 +- .../setup/registry/MenuRegistry.java | 10 +- .../setup/registry/ModEntities.java | 156 +++---- .../arsnouveau/setup/registry/ModPotions.java | 183 ++++---- .../setup/registry/RecipeRegistry.java | 85 ++-- .../setup/registry/RegistryHelper.java | 13 +- .../setup/registry/SoundRegistry.java | 30 +- .../setup/registry/StructureRegistry.java | 11 +- .../setup/registry/VillagerRegistry.java | 18 +- .../setup/registry/WorldgenRegistry.java | 19 +- .../arsnouveau/setup/reward/Rewards.java | 3 +- .../resources/META-INF/accesstransformer.cfg | 1 + .../{mods.toml => neoforge.mods.toml} | 2 +- 432 files changed, 2462 insertions(+), 2737 deletions(-) mode change 100644 => 100755 gradlew create mode 100644 settings.gradle create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/datagen/CompostablesProvider.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/util/registry/BlockEntityTypeRegistryWrapper.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/util/registry/BlockRegistryWrapper.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/util/registry/ItemRegistryWrapper.java rename src/main/java/com/hollingsworth/arsnouveau/common/util/{ => registry}/RegistryWrapper.java (62%) rename src/main/resources/META-INF/{mods.toml => neoforge.mods.toml} (98%) diff --git a/.gitignore b/.gitignore index e32697bfef..d9aa287284 100644 --- a/.gitignore +++ b/.gitignore @@ -21,7 +21,7 @@ build # other eclipse run +server # Files from Forge MDK forge*changelog.txt -server/* \ No newline at end of file diff --git a/build.gradle b/build.gradle index e6b293e76e..5c7d8a7056 100644 --- a/build.gradle +++ b/build.gradle @@ -1,322 +1,134 @@ -buildscript { - repositories { - maven { url 'https://files.minecraftforge.net/maven' } - maven { url "https://maven.neoforged.net/releases" } - mavenCentral() - maven { url 'https://modmaven.dev/' } - maven { - name "Sponge" - url "https://repo.spongepowered.org/repository/maven-public/" - } - maven { url = 'https://maven.parchmentmc.org' } - } - dependencies { - classpath group: 'net.neoforged', name: 'NeoGradle', version: '6.0.+', changing: true - classpath group: 'org.spongepowered', name: 'mixingradle', version: '0.7.+' - classpath 'org.parchmentmc:librarian:1.+' - } - +plugins { + id 'java-library' + id 'eclipse' + id 'idea' + id 'maven-publish' + id 'net.neoforged.gradle.userdev' version '7.0.124' } -//plugins { -// id 'com.github.johnrengelman.shadow' version '7.1.2' -//} -apply plugin: 'net.neoforged.gradle' -apply plugin: 'org.spongepowered.mixin' -apply plugin: 'org.parchmentmc.librarian.forgegradle' -// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. -apply plugin: 'eclipse' -apply plugin: 'maven-publish' -version = '4.12.1' +version = mod_version + if (System.getenv('BUILD_NUMBER') != null) { version += "." + System.getenv('BUILD_NUMBER') } + group = 'com.hollingsworth.ars_nouveau' // http://maven.apache.org/guides/mini/guide-naming-conventions.html -archivesBaseName = 'ars_nouveau-1.20.1' -java.toolchain.languageVersion = JavaLanguageVersion.of(17) -java.withSourcesJar() +base { + archivesName = mod_id + '-' + minecraft_version +} -//// Used to manually add non-mc libraries to the runtime classpaths found in build/classpath -//// If you have any module issues, check these files to make sure there are no duplicate dependencies -//minecraft.runs.configureEach { -// lazyToken('minecraft_classpath') { -// configurations.library.copyRecursive().resolve().collect { it.absolutePath }.join(File.pathSeparator) -// } -//} +java.toolchain.languageVersion = JavaLanguageVersion.of(21) +java.withSourcesJar() minecraft { + accessTransformers { + file rootProject.file('src/main/resources/META-INF/accesstransformer.cfg') + } +} +subsystems { + parchment { + minecraftVersion = project.minecraft_version + mappingsVersion = project.parchment_version + } +} - // The mappings can be changed at any time, and must be in the following format. - // snapshot_YYYYMMDD Snapshot are built nightly. - // stable_# Stables are built at the discretion of the MCP team. - // Use non-default mappings at your own risk. they may not always work. - // Simply re-run your setup task after changing the mappings to update your workspace. - - mappings channel: 'parchment', version: '2023.07.02-1.20.1' - accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') - // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. - - // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') - - // Default run configurations. - // These can be tweaked, removed, or duplicated as needed. - runs { - client { - workingDirectory project.file('run') - // Recommended logging data for a userdev environment - property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - arg "-mixin.config="+"ars_nouveau"+".mixins.json" - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - mods { - ars_nouveau { - source sourceSets.main - } - } - } - - server { - workingDirectory project.file('server') - // Recommended logging data for a userdev environment - property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - arg "-mixin.config="+"ars_nouveau"+".mixins.json" - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - mods { - ars_nouveau { - source sourceSets.main - } - } - } - - data { - workingDirectory project.file('run') +runs { + configureEach { + systemProperty 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + systemProperty 'forge.logging.console.level', 'debug' - // Recommended logging data for a userdev environment - property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' + modSource sourceSets.main + } - args '--mod', 'ars_nouveau', '--all', '--output', file('src/generated/resources/'), "--existing", file('src/main/resources/') + server { + programArgument '--nogui' + workingDirectory 'server' + } - mods { - ars_nouveau { - source sourceSets.main - } - } - } + data { + programArguments.addAll '--mod', mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() } } -// Include resources generated by data generators. + sourceSets.main.resources { srcDir 'src/generated/resources' } -repositories { +configurations { + runtimeClasspath.extendsFrom localRuntime +} + +repositories { + mavenLocal() maven { - url = "https://maven.theillusivec4.top/" - } - maven { - // location of a maven mirror for JEI files, as a fallback - name = "ModMaven" - url = "https://modmaven.k-4u.nl" - } - maven { - url "https://maven.blamejared.com" - } - maven { - url "https://www.cursemaven.com" + name = 'GeckoLib' + url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' content { - includeGroup "curse.maven" + includeGroup("software.bernie.geckolib") } } maven { - name 'LDTTeam - Modding' - url 'https://ldtteam.jfrog.io/ldtteam/modding/' + name = "Illusive Soulworks maven" + url = "https://maven.theillusivec4.top/" } maven { - url "https://maven.tterrag.com/" - content { - includeGroup "com.simibubi.create" - includeGroup "com.jozufozu.flywheel" - } + name = "Jared's maven" + url = "https://maven.blamejared.com/" } - maven { url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' } - mavenCentral() - maven { url 'https://jitpack.io' } } jarJar.enable() -dependencies { - - minecraft "net.neoforged:forge:${mc_version}-${forge_version}" - implementation 'org.jetbrains:annotations:23.0.0' - - implementation(annotationProcessor("com.github.llamalad7.mixinextras:mixinextras-common:${mixin_extras_version}")) - implementation(jarJar("com.github.llamalad7.mixinextras:mixinextras-forge:${mixin_extras_version}")) { - jarJar.ranged(it, "[${mixin_extras_version},)") - } - - jarJar(group: 'software.bernie.geckolib', name: 'geckolib-forge-1.20.1', version: "[4.0,)") { - jarJar.pin(it, "${gecko_version}") - } - implementation fg.deobf("software.bernie.geckolib:geckolib-forge-${mc_version}:${gecko_version}") - - - implementation fg.deobf("vazkii.patchouli:Patchouli:${patchouli_version}") - - compileOnly fg.deobf("mezz.jei:jei-${mc_version}-common-api:${jei_version}") - compileOnly fg.deobf("mezz.jei:jei-${mc_version}-forge-api:${jei_version}") - // at runtime, use the full JEI - runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}-common:${jei_version}") - runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}-forge:${jei_version}") - - implementation fg.deobf("curse.maven:curios-309927:4583413") - - implementation fg.deobf("curse.maven:terrablender-563928:4590487") - - implementation fg.deobf("curse.maven:jade-324717:4573193") // jade - implementation fg.deobf("curse.maven:caelus-308989:4581481") // caelus - implementation fg.deobf("curse.maven:placebo-283644:4691637") - implementation fg.deobf("curse.maven:aphoattr-898963:4688147") -// runtimeOnly fg.deobf("curse.maven:byg-247560:4027228") // BYG -// runtimeOnly fg.deobf("curse.maven:bop-220318:4034263") // BOP -// compileOnly fg.deobf("curse.maven:ars_elemental-561470:4345275") // ars elemental -// runtimeOnly fg.deobf("curse.maven:tmg-560595:4001247") // toomanyglyphs - -// implementation fg.deobf("curse.maven:cyanide-541676:3832812") // Cyanide -// compileOnly fg.deobf("top.theillusivec4.caelus:caelus-forge:1.19-3.0.0.3:api") -// implementation fg.deobf("curse.maven:jade-324717:4318618") -// runtimeOnly fg.deobf("curse.maven:config-457570:4011355") -// implementation fg.deobf("com.simibubi.create:create-1.19.2:0.5.0.f-15:slim"){ transitive = false } -// implementation fg.deobf("com.jozufozu.flywheel:flywheel-forge-1.19.2:0.6.7-9") -// implementation fg.deobf("com.tterrag.registrate:Registrate:MC1.19-1.1.5") -// runtimeOnly fg.deobf("curse.maven:config-443900:4064952") -// runtimeOnly fg.deobf("curse.maven:config-314906:4229131") // ftb chunks -// runtimeOnly fg.deobf("curse.maven:config-419699:4147353") // arch -// runtimeOnly fg.deobf("curse.maven:config-404465:4210870") // ftb library -// runtimeOnly fg.deobf("curse.maven:config-404468:4229140") // ftb teams - implementation fg.deobf("curse.maven:functional-storage-556861:4878053") // functional storage - implementation fg.deobf("curse.maven:titanium-287342:4943665") // titanium -// runtimeOnly fg.deobf("curse.maven:commandstructures-565119:3823785") - - annotationProcessor "org.spongepowered:mixin:0.8.5:processor" - annotationProcessor("com.github.LlamaLad7:MixinExtras:${mixin_extras_version}") - -} +tasks.named('jarJar') {} +dependencies { + implementation "net.neoforged:neoforge:${neo_version}" -// Example for how to get properties into the manifest for reading by the runtime.. -jar { - manifest { - attributes([ - "Specification-Title": "ArsNouveau", - "Specification-Vendor": "baileyh", - "Specification-Version": "1", // We are version 1 of ourselves - "Implementation-Title": project.name, - "Implementation-Version": "${version}", - "Implementation-Vendor" :"baileyh", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), - "MixinConfigs": "ars_nouveau.mixins.json" - ]) + jarJar(group: 'software.bernie.geckolib', name: "geckolib-neoforge-${minecraft_version}", version: "[4.5,)") { + jarJar.pin(it, "${geckolib_version}") } -} - -// Example configuration to allow publishing using the maven-publish task -// we define a custom artifact that is sourced from the reobfJar output task -// and then declare that to be published -// Note you'll need to add a repository here + implementation "software.bernie.geckolib:geckolib-neoforge-${minecraft_version}:${geckolib_version}" -//shadowJar { -// configurations = [project.configurations.shade] // <- Tell shadowJar to shade dependencies from 'shade' -//// exclude 'software/bernie/example/**' -//// exclude 'assets/geckolib3/**' -//// exclude '**/*.java' -//// -//// classifier '' -//// relocate 'com.llamalad7', 'shadowed.llamalad7' -//// relocate 'software.bernie.shadowed', 'software.bernie.ars_nouveau.shadowed' -//// relocate 'software.bernie.geckolib', 'software.bernie.ars_nouveau.geckolib' -// finalizedBy 'reobfShadowJar' // <- Finish shading with reobfuscation -// mergeServiceFiles() -//} -// -//reobf { // <- Add the output of shadowJar to reobfuscation, so shadowed content is reobfuscated -// shadowJar {} -//} + implementation "vazkii.patchouli:Patchouli:1.20.4-${patchouli_version}" + implementation "top.theillusivec4.caelus:neoforge:${caelus_version}+${minecraft_version}" + compileOnly "top.theillusivec4.curios:curios-neoforge:${curios_version}+${minecraft_version}:api" + localRuntime "top.theillusivec4.curios:curios-neoforge:${curios_version}+${minecraft_version}" -artifacts { - archives sourcesJar + compileOnly "mezz.jei:jei-1.20.4-neoforge-api:${jei_version}" + localRuntime "mezz.jei:jei-1.20.4-neoforge:${jei_version}" } -publishing { - publications { - mavenJava(MavenPublication) { - groupId project.group - artifactId project.archivesBaseName - version project.version - from components.java - // Allows the maven pom file to be modified. - pom.withXml { - - // Go through all the dependencies. - asNode().dependencies.dependency.each { dep -> - - println 'Surpressing artifact ' + dep.artifactId.last().value().last() + ' from maven dependencies.' - assert dep.parent().remove(dep) - } - } - } - } - repositories { - maven { - url "file://" + System.getenv("local_maven") - } +tasks.withType(ProcessResources).configureEach { + var replaceProperties = [ + minecraft_version : minecraft_version, + minecraft_version_range: minecraft_version_range, + neo_version : neo_version, + neo_version_range : neo_version_range, + loader_version_range : loader_version_range, + mod_id : mod_id, + mod_name : mod_name, + mod_license : mod_license, + mod_version : mod_version, + mod_authors : mod_authors, + mod_description : mod_description + ] + inputs.properties replaceProperties + + filesMatching(['META-INF/neoforge.mods.toml']) { + expand replaceProperties } } -// 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. -tasks.withType(GenerateModuleMetadata) { - enabled = false -} -mixin { - add sourceSets.main, "ars_nouveau.refmap.json" +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation } -// Prevent Mixin annotation processor from getting into IDEA's annotation processor settings -// Copied from Botania -if (System.getProperty("idea.sync.active") == "true") { - afterEvaluate { - tasks.withType(JavaCompile).configureEach { - it.options.annotationProcessorPath = files() - } +// IDEA no longer automatically downloads sources/javadoc jars for dependencies, so we need to explicitly enable the behavior. +idea { + module { + downloadSources = true + downloadJavadoc = true } -} -tasks.withType(JavaCompile).configureEach({ - options.encoding = 'UTF-8' - options.compilerArgs.addAll(["-Xmaxerrs", "100000"]) -}) - -tasks.register('jarJarRelease') { - doLast { - tasks.jarJar { - classifier = '' - } - } - finalizedBy tasks.jarJar -} -tasks.jarJar.finalizedBy('reobfJarJar') - +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 0b611880b9..9a81e2de9c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,10 +2,28 @@ # This is required to provide enough memory for the Minecraft decompilation process. org.gradle.jvmargs=-Xmx4G org.gradle.daemon=false -mc_version=1.20.1 -jei_version=15.0.0.12 -curios_version=5.1.1.0 -gecko_version=4.4.4 -mixin_extras_version=0.2.0-beta.8 -forge_version=47.1.64 -patchouli_version=1.20.1-83-FORGE +org.gradle.debug=false + +neogradle.subsystems.parchment.minecraftVersion=1.20.6 +neogradle.subsystems.parchment.mappingsVersion=2024.05.01 + +minecraft_version=1.20.6 +parchment_version=2024.05.01 +minecraft_version_range=[1.20.6,1.21) +neo_version=20.6.62-beta +neo_version_range=[20.6,) +loader_version_range=[2,) + +mod_id=ars_nouveau +mod_name=Ars Nouveau +mod_license=LGPL +mod_version=4.11.0 +mod_group_id=com.hollingsworth.ars_nouveau +mod_authors=Bailey Hollingsworth +mod_description=Craft spells, create powerful baubles, and summon magical creatures! + +jei_version=17.3.0.52 +curios_version=8.0.0-beta +geckolib_version=4.5.1 +patchouli_version=85-NEOFORGE +caelus_version=6.0.0 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c1962a79e29d3e0ab67b14947c167a862655af9b..d64cd4917707c1f8861d8cb53dd15194d4248596 100644 GIT binary patch literal 43462 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 literal 62076 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0c85a1f751..b82aa23a4f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 index 1de6d36db3..1aa94a4269 --- a/gradlew +++ b/gradlew @@ -61,7 +61,7 @@ # You can find Gradle at https://github.com/gradle/gradle/. # ############################################################################## - + # Attempt to set APP_HOME # Resolve links: $0 may be a link @@ -83,7 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -130,10 +131,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -141,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -149,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -198,11 +202,11 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/gradlew.bat b/gradlew.bat index 93e3f59f13..25da30dbde 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000000..ada876e2ed --- /dev/null +++ b/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + mavenLocal() + gradlePluginPortal() + maven { url = 'https://maven.neoforged.net/releases' } + } +} + +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java index bf6727afa2..6507590b46 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java +++ b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java @@ -25,32 +25,34 @@ import com.hollingsworth.arsnouveau.setup.registry.*; import com.hollingsworth.arsnouveau.setup.reward.Rewards; import net.minecraft.client.gui.screens.MenuScreens; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.ComposterBlock; import net.minecraft.world.level.block.DispenserBlock; import net.minecraft.world.level.block.FlowerPotBlock; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.server.ServerStartedEvent; -import net.minecraftforge.event.server.ServerStoppingEvent; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; -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.FMLClientSetupEvent; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; -import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.DistExecutor; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.ModList; +import net.neoforged.fml.ModLoadingContext; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; +import net.neoforged.fml.event.lifecycle.InterModEnqueueEvent; +import net.neoforged.fml.loading.FMLEnvironment; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.server.ServerStartedEvent; +import net.neoforged.neoforge.event.server.ServerStoppingEvent; @Mod(ArsNouveau.MODID) -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class ArsNouveau { public static final String MODID = "ars_nouveau"; @SuppressWarnings("deprecation") // Has to be runForDist, SafeRunForDist will throw a sided crash @@ -61,27 +63,29 @@ public class ArsNouveau { public static boolean sodiumLoaded = false; public static boolean patchouliLoaded = false; - public ArsNouveau(){ - Mod.EventBusSubscriber.Bus.FORGE.bus().get().register(FMLEventHandler.class); + public ArsNouveau(IEventBus modEventBus, ModContainer modContainer){ + NeoForge.EVENT_BUS.register(this); + NeoForge.EVENT_BUS.register(FMLEventHandler.class); caelusLoaded = ModList.get().isLoaded("caelus"); terrablenderLoaded = ModList.get().isLoaded("terrablender"); sodiumLoaded = ModList.get().isLoaded("rubidium"); patchouliLoaded = ModList.get().isLoaded("patchouli"); APIRegistry.setup(); - ANModConfig serverConfig = new ANModConfig(ModConfig.Type.SERVER, ServerConfig.SERVER_CONFIG, ModLoadingContext.get().getActiveContainer(),MODID + "-server"); - ModLoadingContext.get().getActiveContainer().addConfig(serverConfig); - ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, Config.COMMON_CONFIG); - ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, Config.CLIENT_CONFIG); - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> Mod.EventBusSubscriber.Bus.FORGE.bus().get().register(ClientEventHandler.class)); + ANModConfig serverConfig = new ANModConfig(ModConfig.Type.SERVER, ServerConfig.SERVER_CONFIG, modContainer,MODID + "-server"); + modContainer.addConfig(serverConfig); + modContainer.registerConfig(ModConfig.Type.COMMON, Config.COMMON_CONFIG); + modContainer.registerConfig(ModConfig.Type.CLIENT, Config.CLIENT_CONFIG); + if (FMLEnvironment.dist.isClient()) { + NeoForge.EVENT_BUS.register(ClientEventHandler.class); + } - IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); modEventBus.addListener(ModSetup::registerEvents); ModSetup.registers(modEventBus); modEventBus.addListener(this::setup); modEventBus.addListener(this::postModLoadEvent); modEventBus.addListener(this::clientSetup); modEventBus.addListener(this::sendImc); - MinecraftForge.EVENT_BUS.register(this); + NeoForge.EVENT_BUS.register(this); ANCriteriaTriggers.init(); try { Thread thread = new Thread(Rewards::init); @@ -95,16 +99,17 @@ public ArsNouveau(){ public void setup(final FMLCommonSetupEvent event) { APIRegistry.postInit(); Networking.registerMessages(); - event.enqueueWork(ModPotions::addRecipes); event.enqueueWork(ModEntities::registerPlacements); if (terrablenderLoaded && Config.ARCHWOOD_FOREST_WEIGHT.get() > 0) { event.enqueueWork(Terrablender::registerBiomes); } - MinecraftForge.EVENT_BUS.addListener((ServerStartedEvent e) -> { + + NeoForge.EVENT_BUS.addListener((ServerStartedEvent e) -> { CasterTomeRegistry.reloadTomeData(e.getServer().getRecipeManager(), e.getServer().getLevel(Level.OVERWORLD)); BuddingConversionRegistry.reloadBuddingConversionRecipes(e.getServer().getRecipeManager()); ScryRitualRegistry.reloadScryRitualRecipes(e.getServer().getRecipeManager()); }); + } public void postModLoadEvent(final FMLLoadCompleteEvent event) { @@ -138,7 +143,7 @@ public void postModLoadEvent(final FMLLoadCompleteEvent event) { } public void clientSetup(final FMLClientSetupEvent event) { - FMLJavaModLoadingContext.get().getModEventBus().addListener(ClientHandler::init); + ModLoadingContext.get().getActiveContainer().getEventBus().addListener(ClientHandler::init); event.enqueueWork(() ->{ MenuScreens.register(MenuRegistry.STORAGE.get(), CraftingTerminalScreen::new); }); @@ -160,4 +165,8 @@ public static void onServerStopped(final ServerStoppingEvent event) { EventQueue.getServerInstance().clear(); EventQueue.getClientQueue().clear(); } + + public static ResourceLocation prefix(String str) { + return new ResourceLocation(MODID, str); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/ANFakePlayer.java b/src/main/java/com/hollingsworth/arsnouveau/api/ANFakePlayer.java index 991b47c60f..c16d8029e2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/ANFakePlayer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/ANFakePlayer.java @@ -9,9 +9,10 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.CommonListenerCookie; import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.world.MenuProvider; -import net.minecraftforge.common.util.FakePlayer; +import net.neoforged.neoforge.common.util.FakePlayer; import org.jetbrains.annotations.Nullable; import java.lang.ref.WeakReference; @@ -27,17 +28,16 @@ public class ANFakePlayer extends FakePlayer { public static final GameProfile PROFILE = new GameProfile(UUID.fromString("7400926d-1007-4e53-880f-b43e67f2bf29"), "Ars_Nouveau"); + private ANFakePlayer(ServerLevel world) { + super(world, PROFILE); + connection = new FakePlayNetHandler(world.getServer(), this, CommonListenerCookie.createInitial(PROFILE, false)); + } @Override - public double getBlockReach() { + public double entityInteractionRange() { return 4.5; } - private ANFakePlayer(ServerLevel world) { - super(world, PROFILE); - connection = new FakePlayNetHandler(world.getServer(), this); - } - private static WeakReference FAKE_PLAYER = null; public static ANFakePlayer getPlayer(ServerLevel world) { @@ -46,7 +46,7 @@ public static ANFakePlayer getPlayer(ServerLevel world) { ret = new ANFakePlayer(world); FAKE_PLAYER = new WeakReference<>(ret); } - FAKE_PLAYER.get().level = world; + FAKE_PLAYER.get().setLevel(world); return FAKE_PLAYER.get(); } @@ -62,8 +62,8 @@ public Component getDisplayName() { } private static class FakePlayNetHandler extends ServerGamePacketListenerImpl { - public FakePlayNetHandler(MinecraftServer server, ServerPlayer playerIn) { - super(server, NETWORK_MANAGER, playerIn); + public FakePlayNetHandler(MinecraftServer server, ServerPlayer playerIn, CommonListenerCookie pCookie) { + super(server, NETWORK_MANAGER, playerIn, pCookie); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/ArsNouveauAPI.java b/src/main/java/com/hollingsworth/arsnouveau/api/ArsNouveauAPI.java index a8f4b446c3..72196dec92 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/ArsNouveauAPI.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/ArsNouveauAPI.java @@ -10,13 +10,13 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.PotionBrewing; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; -import net.minecraftforge.common.brewing.BrewingRecipe; -import net.minecraftforge.common.brewing.BrewingRecipeRegistry; -import net.minecraftforge.fml.loading.FMLEnvironment; -import net.minecraftforge.fml.loading.FMLPaths; +import net.neoforged.fml.loading.FMLEnvironment; +import net.neoforged.fml.loading.FMLPaths; +import net.neoforged.neoforge.common.brewing.BrewingRecipe; import javax.annotation.Nullable; import java.util.ArrayList; @@ -49,7 +49,7 @@ public class ArsNouveauAPI { */ private ISpellValidator castingSpellValidator; - private List enchantingApparatusRecipes = new ArrayList<>(); + private List> enchantingApparatusRecipes = new ArrayList<>(); private List brewingRecipes = new ArrayList<>(); @@ -58,10 +58,10 @@ public Set> getEnchantingRecipeTypes() { } - public List getEnchantingApparatusRecipes(Level world) { - List recipes = new ArrayList<>(enchantingApparatusRecipes); + public List> getEnchantingApparatusRecipes(Level world) { + List> recipes = new ArrayList<>(enchantingApparatusRecipes); RecipeManager manager = world.getRecipeManager(); - List recipesByType = new ArrayList<>(); // todo lazy init enchanting types + List> recipesByType = new ArrayList<>(); // todo lazy init enchanting types for (RecipeType type : enchantingRecipeTypes) { recipesByType.addAll(manager.getAllRecipesFor(type)); } @@ -69,17 +69,17 @@ public List getEnchantingApparatusRecipes(Level world) { return recipes; } - public List getAllPotionRecipes() { + public List getAllPotionRecipes(Level world) { if (brewingRecipes.isEmpty()) { - BrewingRecipeRegistry.getRecipes().forEach(ib -> { + world.potionBrewing().getRecipes().forEach(ib -> { if (ib instanceof BrewingRecipe brewingRecipe) brewingRecipes.add(brewingRecipe); }); for(PotionBrewing.Mix mix : PotionRecipeMixin.mixList()){ brewingRecipes.add(new BrewingRecipe( - PotionIngredient.fromPotion(mix.from.get()), - mix.ingredient, - PotionIngredient.fromPotion(mix.to.get()).getStack() + PotionIngredient.fromPotion(mix.from()), + mix.ingredient(), + PotionIngredient.fromPotion(mix.to()).getItems()[0] )); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java b/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java index ecfcd20ae9..900475485a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java @@ -11,8 +11,8 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraftforge.common.world.ForgeChunkManager; -import net.minecraftforge.network.PacketDistributor; +import net.neoforged.neoforge.common.world.ForcedChunkManager; +import net.neoforged.neoforge.network.PacketDistributor; public interface ICameraMountable { @@ -34,7 +34,7 @@ default void mountCamera(Level level, BlockPos pos, Player player) { for (int x = chunkPos.getX() - viewDistance; x <= chunkPos.getX() + viewDistance; x++) { for (int z = chunkPos.getZ() - viewDistance; z <= chunkPos.getZ() + viewDistance; z++) { - ForgeChunkManager.forceChunk(serverLevel, ArsNouveau.MODID, dummyEntity, x, z, true, false); + ForcedChunkManager.forceChunk(serverLevel, ArsNouveau.MODID, dummyEntity, x, z, true, false); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantingApparatusRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantingApparatusRecipe.java index c3112b0ca5..0124266cbd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantingApparatusRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantingApparatusRecipe.java @@ -19,8 +19,7 @@ import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.ShapedRecipe; import net.minecraft.world.level.Level; -import net.minecraftforge.registries.ForgeRegistries; - +import net.neoforged.neoforge.registries.ForgeRegistries; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -100,7 +99,7 @@ public static boolean doItemsMatch(List inputs, List reci for (ItemStack i : inputs) recipeitemhelper.accountStack(i, 1); - return inputs.size() == recipeItems.size() && (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs, recipeItems) != null); + return inputs.size() == recipeItems.size() && (net.neoforged.neoforge.common.util.RecipeMatcher.findMatches(inputs, recipeItems) != null); } @Override @@ -121,7 +120,7 @@ public int hashCode() { @Override public String toString() { return "EnchantingApparatusRecipe{" + - "catalyst=" + reagent + + "augment=" + reagent + ", result=" + result + ", pedestalItems=" + pedestalItems + '}'; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java index 7c579f1104..2daaacef75 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java @@ -20,8 +20,7 @@ import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraftforge.registries.ForgeRegistries; - +import net.neoforged.neoforge.registries.ForgeRegistries; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/SpellWriteRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/SpellWriteRecipe.java index 2c5cdb0aa9..13fcf4ccaa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/SpellWriteRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/SpellWriteRecipe.java @@ -10,6 +10,8 @@ import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.common.spell.casters.ReactiveCaster; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.core.component.DataComponents; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -20,6 +22,7 @@ import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.ItemEnchantments; import javax.annotation.Nullable; import java.util.ArrayList; @@ -47,7 +50,8 @@ public boolean excludeJei() { @Override public boolean isMatch(List pedestalItems, ItemStack reagent, EnchantingApparatusTile enchantingApparatusTile, @Nullable Player player) { - int level = EnchantmentHelper.getEnchantments(reagent).getOrDefault(EnchantmentRegistry.REACTIVE_ENCHANTMENT.get(), 0); + ItemEnchantments enchantments = reagent.get(DataComponents.ENCHANTMENTS); + int level = enchantments.getLevel(EnchantmentRegistry.REACTIVE_ENCHANTMENT.get()); ItemStack parchment = getParchment(pedestalItems); return !parchment.isEmpty() && !CasterUtil.getCaster(parchment).getSpell().isEmpty() && level > 0 && super.isMatch(pedestalItems, reagent, enchantingApparatusTile, player); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/entity/ISummon.java b/src/main/java/com/hollingsworth/arsnouveau/api/entity/ISummon.java index da7236d224..532745bd69 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/entity/ISummon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/entity/ISummon.java @@ -8,8 +8,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.OwnableEntity; import net.minecraft.world.level.Level; -import net.minecraftforge.common.MinecraftForge; - +import net.neoforged.neoforge.common.NeoForge; import javax.annotation.Nullable; import java.util.UUID; @@ -29,7 +28,7 @@ public interface ISummon extends OwnableEntity { void setOwnerID(UUID uuid); default void onSummonDeath(Level world, @Nullable DamageSource source, boolean didExpire) { - MinecraftForge.EVENT_BUS.post(new SummonEvent.Death(world, this, source, didExpire)); + NeoForge.EVENT_BUS.post(new SummonEvent.Death(world, this, source, didExpire)); } default void writeOwner(CompoundTag tag) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/DispelEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/DispelEvent.java index 37352914a3..e6079a905e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/DispelEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/DispelEvent.java @@ -5,9 +5,8 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; - +import net.neoforged.bus.api.Cancelable; +import net.neoforged.bus.api.Event; import javax.annotation.Nullable; /** diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/EffectResolveEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/EffectResolveEvent.java index 8e86fbad00..1033f6e4df 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/EffectResolveEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/EffectResolveEvent.java @@ -4,7 +4,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; -import net.minecraftforge.eventbus.api.Event; +import net.neoforged.bus.api.Event; import org.jetbrains.annotations.NotNull; public class EffectResolveEvent extends Event { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/EventQueue.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/EventQueue.java index 96980f84b7..0819072da5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/EventQueue.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/EventQueue.java @@ -1,23 +1,25 @@ package com.hollingsworth.arsnouveau.api.event; import com.hollingsworth.arsnouveau.ArsNouveau; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.ClientTickEvent; +import net.neoforged.neoforge.event.tick.ServerTickEvent; import org.jetbrains.annotations.NotNull; + import java.util.ArrayList; import java.util.List; +import net.neoforged.bus.api.SubscribeEvent; /** * For queuing deferred or over-time tasks. Tick refers to the Server or Client Tick event. */ @SuppressWarnings("ForLoopReplaceableByForEach") -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class EventQueue { @NotNull List events = new ArrayList<>();; - public void tick(TickEvent tickEvent) { + public void tick(boolean serverSide) { if (events.isEmpty()) { return; } @@ -29,7 +31,7 @@ public void tick(TickEvent tickEvent) { if (event.isExpired()) { stale.add(event); } else { - event.tickEvent(tickEvent); + event.tick(serverSide); } } this.events.removeAll(stale); @@ -69,20 +71,13 @@ private EventQueue() { } @SubscribeEvent - public static void serverTick(TickEvent.ServerTickEvent e) { - - if (e.phase != TickEvent.Phase.END) - return; - - EventQueue.getServerInstance().tick(e); + public static void serverTick(ServerTickEvent.Post e) { + EventQueue.getServerInstance().tick(true); } @SubscribeEvent - public static void clientTickEvent(TickEvent.ClientTickEvent e) { - - if (e.phase != TickEvent.Phase.END) - return; - - EventQueue.getClientQueue().tick(e); + public static void clientTickEvent(ClientTickEvent.Post e) { + EventQueue.getClientQueue().tick(false); } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/FadeLightTimedEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/FadeLightTimedEvent.java index 0bfafd3adc..56f2d37c81 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/FadeLightTimedEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/FadeLightTimedEvent.java @@ -12,6 +12,7 @@ import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; +import var; public class FadeLightTimedEvent implements ITimedEvent, LambDynamicLight { protected int lambdynlights$luminance = 0; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/FamiliarSummonEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/FamiliarSummonEvent.java index 06433cf78d..7b37b37fac 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/FamiliarSummonEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/FamiliarSummonEvent.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.api.event; import net.minecraft.world.entity.Entity; -import net.minecraftforge.event.entity.EntityEvent; +import net.neoforged.neoforge.event.entity.EntityEvent; public class FamiliarSummonEvent extends EntityEvent { public Entity owner; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/ITimedEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/ITimedEvent.java index c93a397ae5..1d3497f3ee 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/ITimedEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/ITimedEvent.java @@ -1,17 +1,12 @@ package com.hollingsworth.arsnouveau.api.event; import net.minecraft.nbt.CompoundTag; -import net.minecraftforge.event.TickEvent; /** * A basic timed event for the EventQueue. */ public interface ITimedEvent { - default void tickEvent(TickEvent event){ - tick(event.side.isServer()); - } - void tick(boolean serverSide); /** diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/ManaRegenCalcEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/ManaRegenCalcEvent.java index e1155274c4..c37675725a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/ManaRegenCalcEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/ManaRegenCalcEvent.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.api.event; import net.minecraft.world.entity.LivingEntity; -import net.minecraftforge.event.entity.living.LivingEvent; +import net.neoforged.neoforge.event.entity.living.LivingEvent; public class ManaRegenCalcEvent extends LivingEvent { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/MaxManaCalcEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/MaxManaCalcEvent.java index 2c1374a443..448cbaa634 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/MaxManaCalcEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/MaxManaCalcEvent.java @@ -2,7 +2,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.entity.LivingEntity; -import net.minecraftforge.event.entity.living.LivingEvent; +import net.neoforged.neoforge.event.entity.living.LivingEvent; /** * An event that fires after Ars Nouveau has calculated the preliminary Max Mana provided by gear, glyphs, and book tiers. diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellCastEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellCastEvent.java index b9e1b4e249..8894f35da5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellCastEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellCastEvent.java @@ -3,8 +3,8 @@ import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.api.spell.SpellContext; import net.minecraft.world.level.Level; -import net.minecraftforge.event.entity.living.LivingEvent; -import net.minecraftforge.eventbus.api.Cancelable; +import net.neoforged.bus.api.Cancelable; +import net.neoforged.neoforge.event.entity.living.LivingEvent; @Cancelable public class SpellCastEvent extends LivingEvent { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellCostCalcEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellCostCalcEvent.java index c42453b91b..7743c88506 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellCostCalcEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellCostCalcEvent.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.api.event; import com.hollingsworth.arsnouveau.api.spell.SpellContext; -import net.minecraftforge.eventbus.api.Event; +import net.neoforged.bus.api.Event; public class SpellCostCalcEvent extends Event { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellDamageEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellDamageEvent.java index 8ceb23f6df..52577e5041 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellDamageEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellDamageEvent.java @@ -4,7 +4,7 @@ import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; -import net.minecraftforge.eventbus.api.Event; +import net.neoforged.bus.api.Event; import org.jetbrains.annotations.NotNull; public class SpellDamageEvent extends Event { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellModifierEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellModifierEvent.java index 13a8c372b5..03f4efb322 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellModifierEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellModifierEvent.java @@ -6,8 +6,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; -import net.minecraftforge.eventbus.api.Event; - +import net.neoforged.bus.api.Event; import javax.annotation.Nullable; /** diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellProjectileHitEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellProjectileHitEvent.java index 97636b2700..9710018d42 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellProjectileHitEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellProjectileHitEvent.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.common.entity.EntityProjectileSpell; import net.minecraft.world.phys.HitResult; -import net.minecraftforge.event.entity.EntityEvent; +import net.neoforged.neoforge.event.entity.EntityEvent; /** * Event fired when a spell projectile hits something. diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellResolveEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellResolveEvent.java index 138d371da6..880b2644ef 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellResolveEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellResolveEvent.java @@ -6,7 +6,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; -import net.minecraftforge.eventbus.api.Event; +import net.neoforged.bus.api.Event; import org.jetbrains.annotations.NotNull; public class SpellResolveEvent extends Event { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/SummonEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/SummonEvent.java index caea09a93f..dab4e9f723 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/SummonEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/SummonEvent.java @@ -7,8 +7,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; -import net.minecraftforge.eventbus.api.Event; - +import net.neoforged.bus.api.Event; import javax.annotation.Nullable; public class SummonEvent extends Event { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICosmeticItem.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICosmeticItem.java index 667f5bdf3e..69e2747a2d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICosmeticItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICosmeticItem.java @@ -3,8 +3,8 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; public interface ICosmeticItem { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/IRadialProvider.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/IRadialProvider.java index d68badb071..5757f0d6fb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/IRadialProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/IRadialProvider.java @@ -3,8 +3,8 @@ import com.hollingsworth.arsnouveau.client.registry.ModKeyBindings; import net.minecraft.world.entity.player.Player; 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; public interface IRadialProvider { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/ISpellHotkeyListener.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/ISpellHotkeyListener.java index 7ea028bc32..5efb42e703 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/ISpellHotkeyListener.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/ISpellHotkeyListener.java @@ -6,8 +6,8 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; 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; public interface ISpellHotkeyListener { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/CombinedHandlerInv.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/CombinedHandlerInv.java index ddb12d8258..8ab220e9b8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/CombinedHandlerInv.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/CombinedHandlerInv.java @@ -1,9 +1,8 @@ package com.hollingsworth.arsnouveau.api.item.inv; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.wrapper.EmptyHandler; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.wrapper.EmptyHandler; import org.jetbrains.annotations.NotNull; public class CombinedHandlerInv implements IItemHandler { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/ExtractedStack.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/ExtractedStack.java index 003ee87855..f4678003f7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/ExtractedStack.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/ExtractedStack.java @@ -4,8 +4,8 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.ItemHandlerHelper; public class ExtractedStack extends SlotReference{ diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/FilterableItemHandler.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/FilterableItemHandler.java index 35064cff32..6b19de0ac1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/FilterableItemHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/FilterableItemHandler.java @@ -1,10 +1,10 @@ package com.hollingsworth.arsnouveau.api.item.inv; +import InteractResult; import com.hollingsworth.arsnouveau.common.items.ItemScroll; import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; - +import net.neoforged.neoforge.items.IItemHandler; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/InventoryManager.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/InventoryManager.java index edf6280fe5..4efb5697ad 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/InventoryManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/InventoryManager.java @@ -8,9 +8,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; - +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.ItemHandlerHelper; import java.util.ArrayList; import java.util.List; import java.util.Random; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/SlotReference.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/SlotReference.java index 8b47c9ab7d..b5239fd36b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/SlotReference.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/SlotReference.java @@ -1,8 +1,7 @@ package com.hollingsworth.arsnouveau.api.item.inv; -import net.minecraftforge.items.IItemHandler; - import javax.annotation.Nullable; +import net.neoforged.neoforge.items.IItemHandler; /** * References a slot in an inventory. diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/StorageItemHandler.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/StorageItemHandler.java index d8684af6c4..ac46a9c87d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/StorageItemHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/StorageItemHandler.java @@ -1,9 +1,9 @@ package com.hollingsworth.arsnouveau.api.item.inv; +import InteractResult; import com.hollingsworth.arsnouveau.common.items.ItemScroll; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; - +import net.neoforged.neoforge.items.IItemHandler; import java.util.List; import java.util.function.Function; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/loot/DungeonLootEnhancerModifier.java b/src/main/java/com/hollingsworth/arsnouveau/api/loot/DungeonLootEnhancerModifier.java index 7d1e912a59..f0ea3d784a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/loot/DungeonLootEnhancerModifier.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/loot/DungeonLootEnhancerModifier.java @@ -1,18 +1,15 @@ package com.hollingsworth.arsnouveau.api.loot; 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 java.util.function.Supplier; - -public class DungeonLootEnhancerModifier extends LootModifier{ +import net.neoforged.neoforge.common.loot.LootModifier; +public class DungeonLootEnhancerModifier extends LootModifier { public double commonChance; public double uncommonChance; @@ -22,7 +19,6 @@ public class DungeonLootEnhancerModifier extends LootModifier{ public int uncommonRolls; public int rareRolls; - public DungeonLootEnhancerModifier(final LootItemCondition[] conditionsIn, double commonChance, double uncommonChance, double rareChance, int commonRolls, int uncommonRolls, int rareRolls) { super(conditionsIn); this.commonChance = commonChance; @@ -34,34 +30,29 @@ public DungeonLootEnhancerModifier(final LootItemCondition[] conditionsIn, doubl this.rareRolls = rareRolls; } - public DungeonLootEnhancerModifier(final LootItemCondition[] conditionsIn) { - super(conditionsIn); - this.commonChance = 0.30; - this.uncommonChance = 0.2; - this.rareChance = 0.1; - - this.commonRolls = 3; - this.uncommonRolls = 2; - this.rareRolls = 1; - } - @Override protected ObjectArrayList doApply(ObjectArrayList generatedLoot, LootContext context) { generatedLoot.addAll(DungeonLootTables.getRandomRoll(this)); return generatedLoot; } - public static final Supplier> CODEC = () -> RecordCodecBuilder.create(instance -> instance.group( - LOOT_CONDITIONS_CODEC.fieldOf("conditions").forGetter(lm -> lm.conditions), - Codec.DOUBLE.fieldOf("common_chance").forGetter(d -> d.commonChance), - Codec.DOUBLE.fieldOf("uncommon_chance").forGetter(d -> d.uncommonChance), - Codec.DOUBLE.fieldOf("rare_chance").forGetter(d -> d.rareChance), - Codec.INT.fieldOf("common_rolls").forGetter(d -> d.commonRolls), - Codec.INT.fieldOf("uncommon_rolls").forGetter(d -> d.uncommonRolls), - Codec.INT.fieldOf("rare_rolls").forGetter(d -> d.rareRolls) - ).apply(instance, DungeonLootEnhancerModifier::new)); + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> + codecStart(instance) + .and( + instance.group( + Codec.DOUBLE.optionalFieldOf("common_chance", 0.30).forGetter(d -> d.commonChance), + Codec.DOUBLE.optionalFieldOf("uncommon_chance", 0.2).forGetter(d -> d.uncommonChance), + Codec.DOUBLE.optionalFieldOf("rare_chance", 0.1).forGetter(d -> d.rareChance), + Codec.INT.optionalFieldOf("common_rolls", 3).forGetter(d -> d.commonRolls), + Codec.INT.optionalFieldOf("uncommon_rolls", 2).forGetter(d -> d.uncommonRolls), + Codec.INT.optionalFieldOf("rare_rolls", 1).forGetter(d -> d.rareRolls) + ) + ) + .apply(instance, DungeonLootEnhancerModifier::new)); + @Override - public Codec codec() { - return CODEC.get(); + public MapCodec codec() { + return CODEC; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/loot/DungeonLootTables.java b/src/main/java/com/hollingsworth/arsnouveau/api/loot/DungeonLootTables.java index 7bb6c2c6b0..30d4ec1dd2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/loot/DungeonLootTables.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/loot/DungeonLootTables.java @@ -6,10 +6,15 @@ import com.hollingsworth.arsnouveau.setup.config.Config; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; -import com.hollingsworth.arsnouveau.setup.registry.ModPotions; + +import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.PotionContents; + +import com.hollingsworth.arsnouveau.setup.registry.ModPotions; + + import java.util.ArrayList; import java.util.List; @@ -34,19 +39,19 @@ public class DungeonLootTables { BASIC_LOOT.add(() -> new ItemStack(BlockRegistry.SOURCEBERRY_BUSH, 1 + r.nextInt(3))); BASIC_LOOT.add(() -> { ItemStack stack = new ItemStack(Items.POTION); - PotionUtils.setPotion(stack, ModPotions.LONG_MANA_REGEN_POTION.get()); + stack.set(DataComponents.POTION_CONTENTS, new PotionContents(ModPotions.LONG_MANA_REGEN_POTION)); return stack; }); BASIC_LOOT.add(() -> { ItemStack stack = new ItemStack(Items.POTION); - PotionUtils.setPotion(stack, ModPotions.STRONG_MANA_REGEN_POTION.get()); + stack.set(DataComponents.POTION_CONTENTS, new PotionContents(ModPotions.STRONG_MANA_REGEN_POTION)); return stack; }); BASIC_LOOT.add(() -> { ItemStack stack = new ItemStack(Items.POTION); - PotionUtils.setPotion(stack, ModPotions.MANA_REGEN_POTION.get()); + stack.set(DataComponents.POTION_CONTENTS, new PotionContents(ModPotions.MANA_REGEN_POTION)); return stack; }); @@ -71,7 +76,6 @@ public class DungeonLootTables { RARE_LOOT.add(() -> new ItemStack(ItemsRegistry.FIREL_DISC.get())); RARE_LOOT.add(() -> new ItemStack(ItemsRegistry.SOUND_OF_GLASS.get())); RARE_LOOT.add(() -> new ItemStack(ItemsRegistry.WILD_HUNT.get())); - } public static ItemStack getRandomItem(List> pool) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/mana/IManaCap.java b/src/main/java/com/hollingsworth/arsnouveau/api/mana/IManaCap.java index b24c68c332..3b48e82223 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/mana/IManaCap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/mana/IManaCap.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.api.mana; import net.minecraft.nbt.CompoundTag; -import net.minecraftforge.common.util.INBTSerializable; +import net.neoforged.neoforge.common.util.INBTSerializable; public interface IManaCap extends INBTSerializable { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkAttributes.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkAttributes.java index b5bb1817c0..2d64cd4e93 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkAttributes.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkAttributes.java @@ -1,46 +1,45 @@ package com.hollingsworth.arsnouveau.api.perk; import com.hollingsworth.arsnouveau.ArsNouveau; +import net.minecraft.core.registries.Registries; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.RangedAttribute; -import net.minecraftforge.event.entity.EntityAttributeModificationEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; - +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.entity.EntityAttributeModificationEvent; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; import java.util.HashMap; import java.util.UUID; import java.util.function.Function; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) +@EventBusSubscriber(modid = ArsNouveau.MODID, bus = EventBusSubscriber.Bus.MOD) public class PerkAttributes { - public static final HashMap, UUID> UUIDS = new HashMap<>(); - public static final DeferredRegister ATTRIBUTES = DeferredRegister.create(ForgeRegistries.ATTRIBUTES, ArsNouveau.MODID); + public static final HashMap, UUID> UUIDS = new HashMap, UUID>(); + public static final DeferredRegister ATTRIBUTES = DeferredRegister.create(Registries.ATTRIBUTE, ArsNouveau.MODID); - public static final RegistryObject WARDING = registerAttribute("ars_nouveau.perk.warding", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 1024.0D).setSyncable(true), "07625fbb-f186-46c3-8b5f-989b747f29f8"); - public static final RegistryObject MANA_REGEN_BONUS = registerAttribute("ars_nouveau.perk.mana_regen", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 2000.0D).setSyncable(true), "0c877091-ee4f-4eda-9868-4194d9a18833"); + public static final DeferredHolder WARDING = registerAttribute("ars_nouveau.perk.warding", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 1024.0D).setSyncable(true), "07625fbb-f186-46c3-8b5f-989b747f29f8"); + public static final DeferredHolder MANA_REGEN_BONUS = registerAttribute("ars_nouveau.perk.mana_regen", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 2000.0D).setSyncable(true), "0c877091-ee4f-4eda-9868-4194d9a18833"); - public static final RegistryObject MAX_MANA = registerAttribute("ars_nouveau.perk.max_mana", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 10000.0D).setSyncable(true), "22980b24-83e5-4683-a215-8997c4011389"); + public static final DeferredHolder MAX_MANA = registerAttribute("ars_nouveau.perk.max_mana", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 10000.0D).setSyncable(true), "22980b24-83e5-4683-a215-8997c4011389"); @Deprecated - public static final RegistryObject MAX_MANA_BONUS = MAX_MANA, FLAT_MANA_BONUS = MAX_MANA; + public static final DeferredHolder MAX_MANA_BONUS = MAX_MANA, FLAT_MANA_BONUS = MAX_MANA; - public static final RegistryObject SPELL_DAMAGE_BONUS = registerAttribute("ars_nouveau.perk.spell_damage", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 10000.0D).setSyncable(true), "50b50137-9c92-4e64-b350-6044e9e609de"); - public static final RegistryObject WHIRLIESPRIG = registerAttribute("ars_nouveau.perk.saturation", (id) -> new RangedAttribute(id, 1.0, 0.0D, 10000.0D).setSyncable(true), "152810f7-0d01-484e-a512-73fe70af3db7"); - public static final RegistryObject WIXIE = registerAttribute("ars_nouveau.perk.wixie", (id) -> new RangedAttribute(id, 1.0D, 0.0D, 1024.0D).setSyncable(true), "bae5d566-c9f6-4abf-9fe0-6ac140a34db1"); + public static final DeferredHolder SPELL_DAMAGE_BONUS = registerAttribute("ars_nouveau.perk.spell_damage", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 10000.0D).setSyncable(true), "50b50137-9c92-4e64-b350-6044e9e609de"); + public static final DeferredHolder WHIRLIESPRIG = registerAttribute("ars_nouveau.perk.saturation", (id) -> new RangedAttribute(id, 1.0, 0.0D, 10000.0D).setSyncable(true), "152810f7-0d01-484e-a512-73fe70af3db7"); + public static final DeferredHolder WIXIE = registerAttribute("ars_nouveau.perk.wixie", (id) -> new RangedAttribute(id, 1.0D, 0.0D, 1024.0D).setSyncable(true), "bae5d566-c9f6-4abf-9fe0-6ac140a34db1"); - public static final RegistryObject FEATHER = registerAttribute("ars_nouveau.perk.feather", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 1.0D).setSyncable(true), "ee3a4090-c5f5-4a26-a9c2-69837237b35f"); - //public static final RegistryObject TOUGHNESS = registerAttribute("ars_nouveau.perk.toughness", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 1024.0D).setSyncable(true), "eb1ccdaf-38e3-4a1a-a5fb-b0dc698157ff"); + public static final DeferredHolder FEATHER = registerAttribute("ars_nouveau.perk.feather", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 1.0D).setSyncable(true), "ee3a4090-c5f5-4a26-a9c2-69837237b35f"); + //public static final DeferredHolder TOUGHNESS = registerAttribute("ars_nouveau.perk.toughness", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 1024.0D).setSyncable(true), "eb1ccdaf-38e3-4a1a-a5fb-b0dc698157ff"); - public static RegistryObject registerAttribute(String name, Function attribute, String uuid) { + public static DeferredHolder registerAttribute(String name, Function attribute, String uuid) { return registerAttribute(name, attribute, UUID.fromString(uuid)); } - public static RegistryObject registerAttribute(String name, Function attribute, UUID uuid) { - RegistryObject registryObject = ATTRIBUTES.register(name, () -> attribute.apply(name)); + public static DeferredHolder registerAttribute(String name, Function attribute, UUID uuid) { + DeferredHolder registryObject = ATTRIBUTES.register(name, () -> attribute.apply(name)); UUIDS.put(registryObject, uuid); return registryObject; } @@ -49,7 +48,7 @@ public static RegistryObject registerAttribute(String name, Function< public static void modifyEntityAttributes(EntityAttributeModificationEvent event) { event.getTypes().stream().filter(e -> e == EntityType.PLAYER).forEach(e -> { ATTRIBUTES.getEntries().forEach((v) -> { - event.add(e, v.get()); + event.add(e, v); }); }); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionData.java b/src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionData.java index 129f2c3bc7..6b411b7e9a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionData.java @@ -13,8 +13,7 @@ import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.PotionUtils; import net.minecraft.world.item.alchemy.Potions; -import net.minecraftforge.registries.ForgeRegistries; - +import net.neoforged.neoforge.registries.ForgeRegistries; import java.util.*; import java.util.stream.Collectors; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/IRecipeWrapper.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/IRecipeWrapper.java index 080b6f00aa..5aa3f1b2cf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/IRecipeWrapper.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/IRecipeWrapper.java @@ -4,8 +4,9 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; - +import record; import javax.annotation.Nullable; +import InstructionsForRecipe; import java.util.List; import java.util.Map; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/MultiRecipeWrapper.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/MultiRecipeWrapper.java index 1c04935659..1b30dfa256 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/MultiRecipeWrapper.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/MultiRecipeWrapper.java @@ -3,18 +3,17 @@ import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; import com.hollingsworth.arsnouveau.common.block.tile.WixieCauldronTile; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.Potion; -import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.alchemy.Potions; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.ShapedRecipe; -import net.minecraft.world.item.crafting.ShapelessRecipe; +import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.Level; -import net.minecraftforge.common.brewing.BrewingRecipe; +import net.neoforged.neoforge.common.brewing.BrewingRecipe; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -36,10 +35,10 @@ public MultiRecipeWrapper() { public static MultiRecipeWrapper fromStack(ItemStack stack, Level level){ MultiRecipeWrapper wrapper = new MultiRecipeWrapper(); if (stack.getItem() == Items.POTION) { - for (BrewingRecipe r : ArsNouveauAPI.getInstance().getAllPotionRecipes()) { + for (BrewingRecipe r : ArsNouveauAPI.getInstance().getAllPotionRecipes(level)) { if (ItemStack.matches(stack, r.getOutput())) { List list = new ArrayList<>(); - list.add(new PotionIngredient(r.getInput().getItems()[0])); + list.add(PotionIngredient.getIngredient(r.getInput().getItems()[0])); list.add(r.getIngredient()); wrapper.addRecipe(list, r.getOutput(), null); } @@ -48,7 +47,8 @@ public static MultiRecipeWrapper fromStack(ItemStack stack, Level level){ if(RECIPE_CACHE.containsKey(stack.getItem())){ return RECIPE_CACHE.get(stack.getItem()); } - for (Recipe r : level.getServer().getRecipeManager().getRecipes()) { + for (RecipeHolder rh : level.getServer().getRecipeManager().getRecipes()) { + Recipe r = rh.value(); if (r.getResultItem(level.registryAccess()) == null || r.getResultItem(level.registryAccess()).getItem() != stack.getItem()) continue; @@ -94,7 +94,11 @@ public List getItemsNeeded(Map inventory, Level world, for (ItemStack stack : i.getItems()) { // Return success if we could consume this potion as a liquid from a jar if (stack.getItem() == Items.POTION) { - Potion potion = PotionUtils.getPotion(stack); + PotionContents potionContents = stack.get(DataComponents.POTION_CONTENTS); + if (potionContents == null) continue; + Optional> potionOpt = potionContents.potion(); + if (potionOpt.isEmpty()) continue; + Potion potion = potionOpt.get().value(); if (potion == Potions.WATER || WixieCauldronTile.findNeededPotion(potion, 300, world, pos) != null) { foundStack = true; break; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionIngredient.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionIngredient.java index 2769e26516..5663ddccca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionIngredient.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionIngredient.java @@ -1,48 +1,22 @@ package com.hollingsworth.arsnouveau.api.recipe; +import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.Potion; -import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.crafting.Ingredient; +import net.neoforged.neoforge.common.crafting.DataComponentIngredient; -import javax.annotation.Nullable; -import java.util.stream.Stream; -/** - * @deprecated Use PartialNBTIngredient instead - * TODO: Remove in 1.20 - */ -@Deprecated -public class PotionIngredient extends Ingredient { - private final ItemStack stack; - - public PotionIngredient(ItemStack stack) { - super(Stream.of(new ItemValue(stack))); - this.stack = stack; - } - - public static PotionIngredient fromPotion(Potion potion) { +public class PotionIngredient { + public static Ingredient fromPotion(Holder potion) { ItemStack stack = new ItemStack(Items.POTION); - PotionUtils.setPotion(stack, potion); - return new PotionIngredient(stack); - } - - public ItemStack getStack() { - return stack; - } - - @Override - public boolean test(@Nullable ItemStack input) { - if (input == null) { - return false; - } else { - return this.stack.getItem() == input.getItem() && PotionUtils.getPotion(input).equals(PotionUtils.getPotion(stack)) && PotionUtils.getCustomEffects(input).equals(PotionUtils.getCustomEffects(stack)); - } + stack.set(DataComponents.POTION_CONTENTS, new PotionContents(potion)); + return PotionIngredient.getIngredient(stack); } - @Override - public boolean isSimple() { - return false; + public static Ingredient getIngredient(ItemStack input) { + return DataComponentIngredient.of(false, input); } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/SummonRitualRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/SummonRitualRecipe.java index 038e60e572..b09e411848 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/SummonRitualRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/SummonRitualRecipe.java @@ -1,17 +1,20 @@ package com.hollingsworth.arsnouveau.api.recipe; -import com.google.common.collect.Lists; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.network.FriendlyByteBuf; +import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.MapLike; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.HolderLookup; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; -import net.minecraft.util.random.Weight; -import net.minecraft.util.random.WeightedEntry; +import net.minecraft.util.random.WeightedRandomList; import net.minecraft.world.Container; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -19,47 +22,24 @@ import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import net.minecraft.world.level.biome.MobSpawnSettings; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; -public class SummonRitualRecipe implements Recipe { - - public final ResourceLocation id; - public final Ingredient catalyst; - public final MobSource mobSource; - public final int count; - public ArrayList mobs; - - public SummonRitualRecipe(ResourceLocation id, Ingredient catalyst, MobSource source, int count, ArrayList mobs) { - this.id = id; - this.catalyst = catalyst; - this.mobSource = source; - this.count = count; - this.mobs = mobs; - } - - public SummonRitualRecipe(ResourceLocation id, Ingredient catalyst, MobSource source, int count) { - this.id = id; - this.catalyst = catalyst; - this.mobSource = source; - this.count = count; - } - +public record SummonRitualRecipe(ResourceLocation id, Ingredient augment, Integer count, WeightedRandomList mobs) implements Recipe { @Override public boolean matches(Container pContainer, Level pLevel) { return false; } public boolean matches(List augments) { - return EnchantingApparatusRecipe.doItemsMatch(augments, Arrays.stream(this.catalyst.getItems()).map(Ingredient::of).toList()); + return EnchantingApparatusRecipe.doItemsMatch(augments, Arrays.stream(this.augment.getItems()).map(Ingredient::of).toList()); } @Override - public ItemStack assemble(Container p_44001_, RegistryAccess p_267165_) { + public ItemStack assemble(Container pCraftingContainer, HolderLookup.Provider pRegistries) { return ItemStack.EMPTY; } @@ -69,15 +49,10 @@ public boolean canCraftInDimensions(int pWidth, int pHeight) { } @Override - public ItemStack getResultItem(RegistryAccess p_267052_) { + public ItemStack getResultItem(HolderLookup.Provider pRegistries) { return ItemStack.EMPTY; } - @Override - public ResourceLocation getId() { - return id; - } - @Override public RecipeSerializer getSerializer() { return RecipeRegistry.SUMMON_RITUAL_SERIALIZER.get(); @@ -94,108 +69,39 @@ public boolean isSpecial() { } public JsonElement asRecipe() { - JsonObject jsonobject = new JsonObject(); - jsonobject.addProperty("type", "ars_nouveau:summon_ritual"); - JsonArray mobs = new JsonArray(); - this.mobs.forEach(mob -> { - mobs.add(mob.toJson()); - }); - jsonobject.add("mobs", mobs); - jsonobject.addProperty("source", this.mobSource.toString()); - jsonobject.addProperty("count", this.count); - jsonobject.add("augment", catalyst.toJson()); - return jsonobject; - } - - public static class Serializer implements RecipeSerializer { - - @Override - public SummonRitualRecipe fromJson(ResourceLocation pRecipeId, JsonObject json) { - Ingredient augment = Ingredient.fromJson(GsonHelper.isArrayNode(json, "augment") ? GsonHelper.getAsJsonArray(json, "augment") : GsonHelper.getAsJsonObject(json, "augment")); - MobSource source = MobSource.valueOf(GsonHelper.getAsString(json, "source", "MOB_LIST")); - ArrayList mobs = new ArrayList<>(); - if (json.has("mob")) { - mobs.add(new WeightedMobType(ResourceLocation.tryParse(json.get("mob").getAsString()))); - } - if (json.has("mobs")) { - GsonHelper.getAsJsonArray(json, "mobs").forEach(el -> { - mobs.add(WeightedMobType.fromJson(el.getAsJsonObject())); - }); - } - int count = GsonHelper.getAsInt(json, "count", 1); - - return new SummonRitualRecipe(pRecipeId, augment, source, count, mobs); - } + Optional encoded = Serializer.CODEC.encoder().encodeStart(JsonOps.INSTANCE, this).result(); + if (encoded.isEmpty()) return null; - @Override - public @Nullable SummonRitualRecipe fromNetwork(ResourceLocation pRecipeId, FriendlyByteBuf pBuffer) { - Ingredient catalyst = Ingredient.fromNetwork(pBuffer); - MobSource source = pBuffer.readEnum(MobSource.class); - int count = pBuffer.readInt(); - ArrayList mobs = pBuffer.readCollection(Lists::newArrayListWithCapacity, new WeightedMobType.Reader()); - - return new SummonRitualRecipe(pRecipeId, catalyst, source, count, mobs); - } + JsonObject obj = encoded.get().getAsJsonObject(); + obj.addProperty("type", "ars_nouveau:summon_ritual"); - @Override - public void toNetwork(FriendlyByteBuf pBuffer, SummonRitualRecipe pRecipe) { - pRecipe.catalyst.toNetwork(pBuffer); - pBuffer.writeEnum(pRecipe.mobSource); - pBuffer.writeInt(pRecipe.count); - pBuffer.writeCollection(pRecipe.mobs, new WeightedMobType.Writer()); - } + return obj; } + public static class Serializer implements RecipeSerializer { + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + ResourceLocation.CODEC.fieldOf("id").forGetter(SummonRitualRecipe::id), + net.minecraft.world.item.crafting.Ingredient.CODEC.fieldOf("augment").forGetter(SummonRitualRecipe::augment), + Codec.INT.fieldOf("count").forGetter(SummonRitualRecipe::count), + WeightedRandomList.codec(MobSpawnSettings.SpawnerData.CODEC).fieldOf("mobs").forGetter(SummonRitualRecipe::mobs) + ).apply(instance, SummonRitualRecipe::new)); - // A possible expansion of the summon ritual recipe to allow for multiple mob types to be spawned - public final List mobTypes = new ArrayList<>(); - /** - * A mob type with a weight and a chance to be selected for spawning - * - * @param mob The mob to spawn - * @param weight If there is more than one mob in the list, this is the chance that this mob will be selected - */ - public record WeightedMobType(ResourceLocation mob, int weight) implements WeightedEntry { - - public WeightedMobType(ResourceLocation mob) { - this(mob, 1); - } - - public JsonObject toJson() { - JsonObject jsonobject = new JsonObject(); - jsonobject.addProperty("mob", this.mob.toString()); - jsonobject.addProperty("weight", this.weight); - return jsonobject; - } - - public static WeightedMobType fromJson(JsonObject json) { - return new WeightedMobType(ResourceLocation.tryParse(GsonHelper.getAsString(json, "mob")), GsonHelper.getAsInt(json, "weight")); + @Override + public MapCodec codec() { + return CODEC; } @Override - public @NotNull Weight getWeight() { - return Weight.of(this.weight); + public StreamCodec streamCodec() { + return StreamCodec.of(this::toNetwork, this::fromNetwork); } - public static class Writer implements FriendlyByteBuf.Writer { - @Override - public void accept(FriendlyByteBuf friendlyByteBuf, WeightedMobType weightedMobType) { - friendlyByteBuf.writeResourceLocation(weightedMobType.mob); - friendlyByteBuf.writeInt(weightedMobType.weight); - } + private void toNetwork(RegistryFriendlyByteBuf friendlyByteBuf, SummonRitualRecipe recipe) { + friendlyByteBuf.writeJsonWithCodec(CODEC.codec(), recipe); } - public static class Reader implements FriendlyByteBuf.Reader { - @Override - public WeightedMobType apply(FriendlyByteBuf friendlyByteBuf) { - return new WeightedMobType(friendlyByteBuf.readResourceLocation(), friendlyByteBuf.readInt()); - } + private SummonRitualRecipe fromNetwork(RegistryFriendlyByteBuf friendlyByteBuf) { + return friendlyByteBuf.readJsonWithCodec(CODEC.codec()); } } - - public enum MobSource { - CURRENT_BIOME, - MOB_LIST - } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java index 8b0a5a3d06..fca7653fbd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java @@ -5,7 +5,7 @@ import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.level.Level; - +import var; import java.util.ArrayList; import java.util.Collections; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/GlyphRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/GlyphRegistry.java index 35174a5fa8..a497ec46b3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/GlyphRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/GlyphRegistry.java @@ -5,10 +5,9 @@ import com.hollingsworth.arsnouveau.setup.config.ANModConfig; import com.hollingsworth.arsnouveau.setup.config.Config; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.config.ModConfig; - +import net.neoforged.fml.ModLoadingContext; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.neoforge.common.ModConfigSpec; import javax.annotation.Nullable; import java.util.List; import java.util.Map; @@ -35,8 +34,8 @@ public static AbstractSpellPart registerSpell(AbstractSpellPart part) { glyphItemMap.put(part.getRegistryName(), part::getGlyph); //register the spell part's config in - ForgeConfigSpec spec; - ForgeConfigSpec.Builder spellBuilder = new ForgeConfigSpec.Builder(); + ModConfigSpec spec; + ModConfigSpec.Builder spellBuilder = new ModConfigSpec.Builder(); part.buildConfig(spellBuilder); spec = spellBuilder.build(); part.CONFIG = spec; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/RitualUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/RitualUtil.java index 402cf9ecf3..ea5676a2ed 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/RitualUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/RitualUtil.java @@ -15,7 +15,7 @@ import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.chunk.PalettedContainer; -import net.minecraftforge.network.PacketDistributor; +import net.neoforged.neoforge.network.PacketDistributor; public class RitualUtil { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java index c4427b998a..b1ea8af760 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java @@ -8,7 +8,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.registries.ForgeRegistries; public class SingleBlockScryer implements IScryer { public static SingleBlockScryer INSTANCE = new SingleBlockScryer(null); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java index ce71e33266..766e926e18 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java @@ -9,7 +9,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.registries.ForgeRegistries; public class TagScryer implements IScryer { public static final TagScryer INSTANCE = new TagScryer(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java b/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java index 169ccec75f..ea59459c76 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java @@ -2,9 +2,8 @@ import com.hollingsworth.arsnouveau.api.util.IWololoable; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; -import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.block.tile.ModdedTile; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/source/SourceManager.java b/src/main/java/com/hollingsworth/arsnouveau/api/source/SourceManager.java index 315353b975..34666de7fd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/source/SourceManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/source/SourceManager.java @@ -3,16 +3,16 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.TickEvent; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class SourceManager { private Map> posMap = new ConcurrentHashMap<>(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/source/SourcelinkEventQueue.java b/src/main/java/com/hollingsworth/arsnouveau/api/source/SourcelinkEventQueue.java index d437702ac1..3ba785d958 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/source/SourcelinkEventQueue.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/source/SourcelinkEventQueue.java @@ -4,8 +4,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.eventbus.api.Event; - +import net.neoforged.bus.api.Event; import java.util.*; import java.util.concurrent.ConcurrentHashMap; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCastMethod.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCastMethod.java index 86a392757f..8b871333dc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCastMethod.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCastMethod.java @@ -8,8 +8,7 @@ import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; -import net.minecraftforge.common.ForgeConfigSpec; - +import net.neoforged.neoforge.common.ModConfigSpec; import javax.annotation.Nullable; import java.util.HashMap; import java.util.Map; @@ -51,7 +50,7 @@ public Integer getTypeIndex() { public abstract CastResolveType onCastOnEntity(@Nullable ItemStack stack, LivingEntity caster, Entity target, InteractionHand hand, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver); @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); Map defaultAugmentLimits = new HashMap<>(); addDefaultAugmentLimits(defaultAugmentLimits); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractEffect.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractEffect.java index 4eb4cd612e..01d714100b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractEffect.java @@ -22,9 +22,9 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.util.FakePlayer; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.common.ModConfigSpec; +import net.neoforged.neoforge.common.util.FakePlayer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -64,11 +64,11 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull } public boolean canSummon(LivingEntity playerEntity) { - return isRealPlayer(playerEntity) && (playerEntity.getEffect(ModPotions.SUMMONING_SICKNESS_EFFECT.get()) == null || (playerEntity instanceof Player player && player.isCreative())); + return isRealPlayer(playerEntity) && (playerEntity.getEffect(ModPotions.SUMMONING_SICKNESS_EFFECT) == null || (playerEntity instanceof Player player && player.isCreative())); } public void applySummoningSickness(LivingEntity playerEntity, int time) { - playerEntity.addEffect(new MobEffectInstance(ModPotions.SUMMONING_SICKNESS_EFFECT.get(), time)); + playerEntity.addEffect(new MobEffectInstance(ModPotions.SUMMONING_SICKNESS_EFFECT, time)); } public void summonLivingEntity(HitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats augments, SpellContext spellContext, @Nullable SpellResolver resolver, ISummon summon) { @@ -84,7 +84,7 @@ public void summonLivingEntity(HitResult rayTraceResult, Level world, @NotNull L } } - MinecraftForge.EVENT_BUS.post(new SummonEvent(rayTraceResult, world, shooter, augments, spellContext, summon)); + NeoForge.EVENT_BUS.post(new SummonEvent(rayTraceResult, world, shooter, augments, spellContext, summon)); } public Player getPlayer(LivingEntity entity, ServerLevel world) { @@ -118,21 +118,21 @@ public void applyEnchantments(SpellStats stats, ItemStack stack) { } if (stats.hasBuff(AugmentFortune.INSTANCE)) { - stack.enchant(Enchantments.BLOCK_FORTUNE, stats.getBuffCount(AugmentFortune.INSTANCE)); + stack.enchant(Enchantments.FORTUNE, stats.getBuffCount(AugmentFortune.INSTANCE)); } } - // TODO: Convert seconds to ticks for default configs - public ForgeConfigSpec.DoubleValue DAMAGE; - public ForgeConfigSpec.DoubleValue AMP_VALUE; - public ForgeConfigSpec.IntValue POTION_TIME; - public ForgeConfigSpec.IntValue EXTEND_TIME; - public ForgeConfigSpec.IntValue DURATION_DOWN_TIME; - public ForgeConfigSpec.IntValue GENERIC_INT; - public ForgeConfigSpec.DoubleValue GENERIC_DOUBLE; - public ForgeConfigSpec.DoubleValue RANDOMIZE_CHANCE; + + public ModConfigSpec.DoubleValue DAMAGE; + public ModConfigSpec.DoubleValue AMP_VALUE; + public ModConfigSpec.IntValue POTION_TIME; + public ModConfigSpec.IntValue EXTEND_TIME; + public ModConfigSpec.IntValue DURATION_DOWN_TIME; + public ModConfigSpec.IntValue GENERIC_INT; + public ModConfigSpec.DoubleValue GENERIC_DOUBLE; + public ModConfigSpec.DoubleValue RANDOMIZE_CHANCE; @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); Map defaultAugmentLimits = new HashMap<>(); addDefaultAugmentLimits(defaultAugmentLimits); @@ -145,44 +145,39 @@ public void buildConfig(ForgeConfigSpec.Builder builder) { super.buildInvalidCombosConfig(builder, getDefaultInvalidCombos(new HashSet<>())); } - public void addDamageConfig(ForgeConfigSpec.Builder builder, double defaultValue) { + public void addDamageConfig(ModConfigSpec.Builder builder, double defaultValue) { DAMAGE = builder.defineInRange("damage", defaultValue, 0, Integer.MAX_VALUE); } - public void addAmpConfig(ForgeConfigSpec.Builder builder, double defaultValue) { + public void addAmpConfig(ModConfigSpec.Builder builder, double defaultValue) { AMP_VALUE = builder.defineInRange("amplify", defaultValue, 0, Integer.MAX_VALUE); } - public void addPotionConfig(ForgeConfigSpec.Builder builder, int defaultTime) { + public void addPotionConfig(ModConfigSpec.Builder builder, int defaultTime) { POTION_TIME = builder.comment("Potion duration, in seconds").defineInRange("potion_time", defaultTime, 0, Integer.MAX_VALUE); } - - @Deprecated(forRemoval = true) - public void addExtendTimeConfig(ForgeConfigSpec.Builder builder, int defaultTime) { + public void addExtendTimeConfig(ModConfigSpec.Builder builder, int defaultTime) { EXTEND_TIME = builder.comment("Extend time duration, in seconds").defineInRange("extend_time", defaultTime, 0, Integer.MAX_VALUE); } - public void addExtendTimeTicksConfig(ForgeConfigSpec.Builder builder, int defaultTime) { - EXTEND_TIME = builder.comment("Extend time duration, in ticks").defineInRange("extend_time", defaultTime, 0, Integer.MAX_VALUE); + public void addRandomizeConfig(ModConfigSpec.Builder builder, float defaultChance) { + RANDOMIZE_CHANCE = builder.comment("Randomize chance, in percentage (0-1 = 0% - 100%)").defineInRange("extend_time", defaultChance, 0.0f, Integer.MAX_VALUE); } - public void addDurationDownConfig(ForgeConfigSpec.Builder builder, int defaultTime) { + public void addDurationDownConfig(ModConfigSpec.Builder builder, int defaultTime) { DURATION_DOWN_TIME = builder.comment("Duration down time, in ticks").defineInRange("duration_down_time", defaultTime, 0, Integer.MAX_VALUE); } - public void addRandomizeConfig(ForgeConfigSpec.Builder builder, float defaultChance) { - RANDOMIZE_CHANCE = builder.comment("Randomize chance, in percentage (0-1 = 0% - 100%)").defineInRange("extend_time", defaultChance, 0.0f, Integer.MAX_VALUE); - } - public void addGenericInt(ForgeConfigSpec.Builder builder, int val, String comment, String path) { + public void addGenericInt(ModConfigSpec.Builder builder, int val, String comment, String path) { GENERIC_INT = builder.comment(comment).defineInRange(path, val, 0, Integer.MAX_VALUE); } - public void addGenericDouble(ForgeConfigSpec.Builder builder, double val, String comment, String path) { + public void addGenericDouble(ModConfigSpec.Builder builder, double val, String comment, String path) { GENERIC_DOUBLE = builder.comment(comment).defineInRange(path, val, 0.0, Double.MAX_VALUE); } - public void addDefaultPotionConfig(ForgeConfigSpec.Builder builder) { + public void addDefaultPotionConfig(ModConfigSpec.Builder builder) { addPotionConfig(builder, 30); addExtendTimeConfig(builder, 8); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java index bc27073829..58bd195972 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java @@ -5,7 +5,7 @@ import com.hollingsworth.arsnouveau.common.util.SpellPartConfigUtil; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -149,15 +149,15 @@ public Component getBookDescLang() { return Component.translatable(getRegistryName().getNamespace() + ".glyph_desc." + getRegistryName().getPath()); } - public @Nullable ForgeConfigSpec CONFIG; - public @Nullable ForgeConfigSpec.IntValue COST; - public @Nullable ForgeConfigSpec.BooleanValue ENABLED; - public @Nullable ForgeConfigSpec.BooleanValue STARTER_SPELL; - public @Nullable ForgeConfigSpec.IntValue PER_SPELL_LIMIT; - public @Nullable ForgeConfigSpec.IntValue GLYPH_TIER; + public @Nullable ModConfigSpec CONFIG; + public @Nullable ModConfigSpec.IntValue COST; + public @Nullable ModConfigSpec.BooleanValue ENABLED; + public @Nullable ModConfigSpec.BooleanValue STARTER_SPELL; + public @Nullable ModConfigSpec.IntValue PER_SPELL_LIMIT; + public @Nullable ModConfigSpec.IntValue GLYPH_TIER; - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { builder.comment("General settings").push("general"); ENABLED = builder.comment("Is Enabled?").define("enabled", true); COST = builder.comment("Cost").defineInRange("cost", getDefaultManaCost(), Integer.MIN_VALUE, Integer.MAX_VALUE); @@ -198,17 +198,17 @@ public int getAugmentLimit(ResourceLocation augmentTag) { /** * Registers the glyph_limits configuration entry for augmentation limits. */ - protected void buildAugmentLimitsConfig(ForgeConfigSpec.Builder builder, Map defaults) { + protected void buildAugmentLimitsConfig(ModConfigSpec.Builder builder, Map defaults) { this.augmentLimits = SpellPartConfigUtil.buildAugmentLimitsConfig(builder, defaults); } - protected void buildAugmentCostOverrideConfig(ForgeConfigSpec.Builder builder, Map defaults) { + protected void buildAugmentCostOverrideConfig(ModConfigSpec.Builder builder, Map defaults) { this.augmentCosts = SpellPartConfigUtil.buildAugmentCosts(builder, defaults); } /** * Registers the glyph_limits configuration entry for combo limits. */ - protected void buildInvalidCombosConfig(ForgeConfigSpec.Builder builder, Set defaults) { + protected void buildInvalidCombosConfig(ModConfigSpec.Builder builder, Set defaults) { this.invalidCombinations = SpellPartConfigUtil.buildInvalidCombosConfig(builder, defaults); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/IDamageEffect.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/IDamageEffect.java index d98e934475..a0f8ad1212 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/IDamageEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/IDamageEffect.java @@ -19,7 +19,7 @@ import net.minecraft.world.level.storage.loot.LootParams; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; -import net.minecraftforge.common.MinecraftForge; +import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -53,7 +53,7 @@ default boolean attemptDamage(Level world, @NotNull LivingEntity shooter, SpellS totalDamage += randomRolls(stats, server); SpellDamageEvent.Pre preDamage = new SpellDamageEvent.Pre(source, shooter, entity, totalDamage, spellContext); - MinecraftForge.EVENT_BUS.post(preDamage); + NeoForge.EVENT_BUS.post(preDamage); source = preDamage.damageSource; totalDamage = preDamage.damage; @@ -67,7 +67,7 @@ default boolean attemptDamage(Level world, @NotNull LivingEntity shooter, SpellS shooter.setLastHurtMob(entity); SpellDamageEvent.Post postDamage = new SpellDamageEvent.Post(source, shooter, entity, totalDamage, spellContext); - MinecraftForge.EVENT_BUS.post(postDamage); + NeoForge.EVENT_BUS.post(postDamage); if (entity instanceof LivingEntity mob && mob.getHealth() <= 0 && !mob.isRemoved() && stats.hasBuff(AugmentFortune.INSTANCE)) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java index 162ae58c97..01a51ba849 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.api.spell; +import CancelReason; import com.hollingsworth.arsnouveau.api.ANFakePlayer; import com.hollingsworth.arsnouveau.api.event.DelayedSpellEvent; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.IWrappedCaster; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java index 1628f9e0b3..a3c2f4afbe 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java @@ -25,8 +25,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; -import net.minecraftforge.common.MinecraftForge; - +import net.neoforged.neoforge.common.NeoForge; import javax.annotation.Nullable; import java.util.List; @@ -169,7 +168,7 @@ protected void resolveAllEffects(Level world) { public void resume(Level world){ LivingEntity shooter = spellContext.getUnwrappedCaster(); SpellResolveEvent.Pre spellResolveEvent = new SpellResolveEvent.Pre(world, shooter, this.hitResult, spell, spellContext, this); - MinecraftForge.EVENT_BUS.post(spellResolveEvent); + NeoForge.EVENT_BUS.post(spellResolveEvent); if (spellResolveEvent.isCanceled()) return; while (spellContext.hasNextPart()) { @@ -188,13 +187,13 @@ public void resume(Level world){ continue; EffectResolveEvent.Pre preEvent = new EffectResolveEvent.Pre(world, shooter, this.hitResult, spell, spellContext, effect, stats, this); - if (MinecraftForge.EVENT_BUS.post(preEvent)) + if (NeoForge.EVENT_BUS.post(preEvent)) continue; effect.onResolve(this.hitResult, world, shooter, stats, spellContext, this); - MinecraftForge.EVENT_BUS.post(new EffectResolveEvent.Post(world, shooter, this.hitResult, spell, spellContext, effect, stats, this)); + NeoForge.EVENT_BUS.post(new EffectResolveEvent.Post(world, shooter, this.hitResult, spell, spellContext, effect, stats, this)); } - MinecraftForge.EVENT_BUS.post(new SpellResolveEvent.Post(world, shooter, this.hitResult, spell, spellContext, this)); + NeoForge.EVENT_BUS.post(new SpellResolveEvent.Post(world, shooter, this.hitResult, spell, spellContext, this)); } public void expendMana() { @@ -208,7 +207,7 @@ public void expendMana() { public int getResolveCost() { int cost = spellContext.getSpell().getCost() - getPlayerDiscounts(spellContext.getUnwrappedCaster(), spell, spellContext.getCasterTool()); SpellCostCalcEvent event = new SpellCostCalcEvent(spellContext, cost); - MinecraftForge.EVENT_BUS.post(event); + NeoForge.EVENT_BUS.post(event); cost = Math.max(0, event.currentCost); return cost; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellStats.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellStats.java index e72effa59c..3b8b2aae9b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellStats.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellStats.java @@ -10,8 +10,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; -import net.minecraftforge.common.MinecraftForge; - +import net.neoforged.neoforge.common.NeoForge; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -148,7 +147,7 @@ public SpellStats build(AbstractSpellPart spellPart, @Nullable HitResult rayTrac } } SpellModifierEvent modifierEvent = new SpellModifierEvent(shooter, this, spellPart, rayTraceResult, world, spellContext); - MinecraftForge.EVENT_BUS.post(modifierEvent); + NeoForge.EVENT_BUS.post(modifierEvent); return spellStats; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/LivingCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/LivingCaster.java index afaf3f75b7..add6e70b3e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/LivingCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/LivingCaster.java @@ -6,8 +6,8 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.FakePlayer; +import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.common.util.FakePlayer; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -35,7 +35,7 @@ public SpellContext.CasterType getCasterType() { @Override public @NotNull List getInventory() { List filterableItemHandlers = new ArrayList<>(); - livingEntity.getCapability(ForgeCapabilities.ITEM_HANDLER).ifPresent(cap -> filterableItemHandlers.add(new FilterableItemHandler(cap))); + livingEntity.getCapability(Capabilities.ITEM_HANDLER).ifPresent(cap -> filterableItemHandlers.add(new FilterableItemHandler(cap))); return filterableItemHandlers; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/PlayerCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/PlayerCaster.java index aaaf7b2cd0..b9bfc4cecc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/PlayerCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/PlayerCaster.java @@ -4,7 +4,7 @@ import com.hollingsworth.arsnouveau.api.item.inv.InventoryManager; import com.hollingsworth.arsnouveau.api.spell.SpellContext; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.items.wrapper.PlayerMainInvWrapper; +import net.neoforged.neoforge.items.wrapper.PlayerMainInvWrapper; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/ANExplosion.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/ANExplosion.java index bce3a3e579..f3525415c6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/ANExplosion.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/ANExplosion.java @@ -98,7 +98,7 @@ public void explode() { int j2 = Mth.floor(this.z - (double) f2 - 1.0D); int j1 = Mth.floor(this.z + (double) f2 + 1.0D); List list = this.level.getEntities(this.source, new AABB(k1, i2, j2, l1, i1, j1)); - net.minecraftforge.event.ForgeEventFactory.onExplosionDetonate(this.level, this, list, f2); + net.neoforged.neoforge.event.EventHooks.onExplosionDetonate(this.level, this, list, f2); Vec3 vector3d = new Vec3(this.x, this.y, this.z); for (Entity entity : list) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java index 9a9f9250d8..0f8ca062d3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java @@ -21,15 +21,14 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.UsernameCache; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.FakePlayerFactory; -import net.minecraftforge.event.level.BlockEvent; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; - +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.common.UsernameCache; +import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.common.util.FakePlayer; +import net.neoforged.neoforge.common.util.FakePlayerFactory; +import net.neoforged.neoforge.event.level.BlockEvent; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.ItemHandlerHelper; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -88,7 +87,7 @@ public static boolean destroyBlockSafely(Level world, BlockPos pos, boolean drop if (!(world instanceof ServerLevel)) return false; Player playerEntity = caster instanceof Player ? (Player) caster : ANFakePlayer.getPlayer((ServerLevel) world); - if (MinecraftForge.EVENT_BUS.post(new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), playerEntity))) + if (NeoForge.EVENT_BUS.post(new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), playerEntity))) return false; world.getBlockState(pos).getBlock().playerWillDestroy(world, pos, world.getBlockState(pos), playerEntity); return world.destroyBlock(pos, dropBlock); @@ -102,7 +101,7 @@ public static boolean destroyRespectsClaim(LivingEntity caster, Level world, Blo public static boolean destroyRespectsClaim(Entity caster, Level world, BlockPos pos) { Player playerEntity = caster instanceof Player ? (Player) caster : ANFakePlayer.getPlayer((ServerLevel) world); - return !MinecraftForge.EVENT_BUS.post(new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), playerEntity)); + return !NeoForge.EVENT_BUS.post(new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), playerEntity)); } public static void safelyUpdateState(Level world, BlockPos pos, BlockState state) { @@ -123,7 +122,7 @@ public static boolean destroyBlockSafelyWithoutSound(Level world, BlockPos pos, return false; Player playerEntity = caster instanceof Player ? (Player) caster : ANFakePlayer.getPlayer((ServerLevel) world); - if (MinecraftForge.EVENT_BUS.post(new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), playerEntity))) + if (NeoForge.EVENT_BUS.post(new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), playerEntity))) return false; return destroyBlockWithoutSound(world, pos, dropBlock); @@ -155,7 +154,7 @@ public static List getAdjacentInventories(Level world, BlockPos po BlockEntity tileEntity = world.getBlockEntity(pos.relative(d)); if (tileEntity == null) continue; - tileEntity.getCapability(ForgeCapabilities.ITEM_HANDLER).ifPresent(iInventories::add); + tileEntity.getCapability(Capabilities.ITEM_HANDLER).ifPresent(iInventories::add); } return iInventories; @@ -336,7 +335,7 @@ public static boolean breakExtraBlock(ServerLevel world, BlockPos pos, ItemStack } GameType type = player.getAbilities().instabuild ? GameType.CREATIVE : GameType.SURVIVAL; - int exp = net.minecraftforge.common.ForgeHooks.onBlockBreakEvent(world, type, player, pos); + int exp = net.neoforged.neoforge.common.CommonHooks.onBlockBreakEvent(world, type, player, pos); if (exp == -1) { return false; } else { @@ -358,7 +357,7 @@ public static boolean breakExtraBlock(ServerLevel world, BlockPos pos, ItemStack boolean canHarvest = blockstate.canHarvestBlock(world, pos, player) || bypassToolCheck; mainhand.mineBlock(world, blockstate, pos, player); if (mainhand.isEmpty() && !copyMain.isEmpty()){ - net.minecraftforge.event.ForgeEventFactory.onPlayerDestroyItem(player, copyMain, InteractionHand.MAIN_HAND); + net.neoforged.neoforge.event.EventHooks.onPlayerDestroyItem(player, copyMain, InteractionHand.MAIN_HAND); } boolean removed = removeBlock(world, player, pos, canHarvest); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/CuriosUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/CuriosUtil.java index 2c882cfbc8..ae5543a31d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/CuriosUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/CuriosUtil.java @@ -3,8 +3,8 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.IItemHandlerModifiable; +import net.neoforged.neoforge.common.util.LazyOptional; +import net.neoforged.neoforge.items.IItemHandlerModifiable; import org.jetbrains.annotations.NotNull; import top.theillusivec4.curios.api.CuriosApi; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java index 973662c356..198e78a0f9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java @@ -10,9 +10,9 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.AABB; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.wrapper.PlayerMainInvWrapper; +import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.wrapper.PlayerMainInvWrapper; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -28,7 +28,7 @@ public static List adjacentInventories(Level level, Block if (adjacentInvTile == null || adjacentInvTile.isRemoved()) continue; - IItemHandler handler = adjacentInvTile.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null); + IItemHandler handler = adjacentInvTile.getCapability(Capabilities.ITEM_HANDLER).orElse(null); if(handler == null) continue; inventories.add(new FilterableItemHandler(handler, filtersOnTile(adjacentInvTile))); @@ -37,7 +37,7 @@ public static List adjacentInventories(Level level, Block } public static FilterableItemHandler getFilteredHandler(@NotNull BlockEntity tile){ - return new FilterableItemHandler(tile.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null), filtersOnTile(tile)); + return new FilterableItemHandler(tile.getCapability(Capabilities.ITEM_HANDLER).orElse(null), filtersOnTile(tile)); } public static List> filtersOnTile(@Nullable BlockEntity thisTile){ @@ -47,7 +47,7 @@ public static List> filtersOnTile(@Null Level level = thisTile.getLevel(); BlockPos pos = thisTile.getBlockPos(); List> filters = new ArrayList<>(); - IItemHandler inv = thisTile.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null); + IItemHandler inv = thisTile.getCapability(Capabilities.ITEM_HANDLER).orElse(null); if(inv == null) return filters; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java index 898f6507e1..9bdd1eafaf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.api.util; +import Mana; import com.hollingsworth.arsnouveau.api.event.ManaRegenCalcEvent; import com.hollingsworth.arsnouveau.api.event.MaxManaCalcEvent; import com.hollingsworth.arsnouveau.api.mana.IManaCap; @@ -12,8 +13,9 @@ import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.MinecraftForge; - +import net.neoforged.neoforge.common.NeoForge; +import record; +import var; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; @@ -85,7 +87,7 @@ public static Mana calcMaxMana(Player e) { int max = (int) rawMax; MaxManaCalcEvent event = new MaxManaCalcEvent(e, max); - MinecraftForge.EVENT_BUS.post(event); + NeoForge.EVENT_BUS.post(event); max = event.getMax(); float reserve = event.getReserve(); return new Mana(max, reserve); @@ -120,7 +122,7 @@ public static double getManaRegen(Player e) { } ManaRegenCalcEvent event = new ManaRegenCalcEvent(e, regen); - MinecraftForge.EVENT_BUS.post(event); + NeoForge.EVENT_BUS.post(event); regen = event.getRegen(); return regen; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java index 697cfa97b2..7a3c2d4250 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java @@ -8,14 +8,13 @@ import com.hollingsworth.arsnouveau.common.entity.EntityFollowProjectile; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; -import net.minecraftforge.fml.common.Mod; - +import net.neoforged.fml.common.Mod; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.Optional; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class SourceUtil { public static List canGiveSource(BlockPos pos, Level world, int range) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/SpellUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/SpellUtil.java index b97aa322da..7fc2d20e1e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/SpellUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/SpellUtil.java @@ -17,17 +17,15 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.TierSortingRegistry; -import net.minecraftforge.common.util.FakePlayer; - +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.common.util.FakePlayer; import java.util.*; import java.util.function.Predicate; public class SpellUtil { public static boolean postEvent(SpellCastEvent e) { - return MinecraftForge.EVENT_BUS.post(e); + return NeoForge.EVENT_BUS.post(e); } public static List calcAOEBlocks(LivingEntity caster, BlockPos origin, BlockHitResult mop, int aoeBonus) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/SkyTextureHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/SkyTextureHandler.java index fdac9475b5..17dd15356f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/SkyTextureHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/SkyTextureHandler.java @@ -14,15 +14,15 @@ import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.util.Mth; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.RenderLevelStageEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.event.RenderLevelStageEvent; import org.joml.Matrix4f; import static com.hollingsworth.arsnouveau.client.ClientInfo.skyRenderTarget; -@Mod.EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID) +@EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID) public class SkyTextureHandler { @SubscribeEvent diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java index bd8c1c6c90..ae9acaca57 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java @@ -27,7 +27,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import org.lwjgl.glfw.GLFW; - +import var; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java index f9527e78fe..84ecb61cb1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.client.container; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.client.container.CraftingTerminalMenu.TerminalRecipeItemHelper; import com.hollingsworth.arsnouveau.client.gui.buttons.GuiImageButton; import com.hollingsworth.arsnouveau.setup.config.Config; import net.minecraft.client.gui.GuiGraphics; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java index 4c78772ffb..d568331087 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java @@ -18,8 +18,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.registries.ForgeRegistries; - +import net.neoforged.neoforge.registries.ForgeRegistries; import java.util.*; import java.util.function.Consumer; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java index e6dabb8248..f70a940671 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java @@ -16,22 +16,21 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.RegisterClientTooltipComponentFactoriesEvent; -import net.minecraftforge.client.event.RenderGuiOverlayEvent; -import net.minecraftforge.client.event.RenderHighlightEvent; -import net.minecraftforge.client.event.RenderTooltipEvent; -import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; -import net.minecraftforge.event.entity.player.ItemTooltipEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; - +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.event.RegisterClientTooltipComponentFactoriesEvent; +import net.neoforged.neoforge.client.event.RenderGuiOverlayEvent; +import net.neoforged.neoforge.client.event.RenderHighlightEvent; +import net.neoforged.neoforge.client.event.RenderTooltipEvent; +import net.neoforged.neoforge.client.gui.overlay.VanillaGuiOverlay; +import net.neoforged.neoforge.event.entity.player.ItemTooltipEvent; import java.util.Collections; -@Mod.EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID) +@EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID) public class ClientEvents { - @Mod.EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) + @EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID, bus = EventBusSubscriber.Bus.MOD) static class ClientModEvents { @SubscribeEvent public static void registerTooltipFactory(RegisterClientTooltipComponentFactoriesEvent event) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientPlayerEvent.java b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientPlayerEvent.java index a1182d3d55..123b618f8e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientPlayerEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientPlayerEvent.java @@ -5,12 +5,12 @@ import com.hollingsworth.arsnouveau.common.items.SpellBook; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class ClientPlayerEvent { @SubscribeEvent diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/BookSlider.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/BookSlider.java index f08cb0072e..fab5bd2a72 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/BookSlider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/BookSlider.java @@ -9,9 +9,9 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; -import net.minecraftforge.client.gui.widget.ForgeSlider; +import net.neoforged.neoforge.client.gui.widget.ExtendedSlider; -public class BookSlider extends ForgeSlider { +public class BookSlider extends ExtendedSlider { public BookSlider(int x, int y, int width, int height, Component prefix, Component suffix, double minValue, double maxValue, double currentValue, double stepSize, int precision, boolean drawString) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GlyphRecipeTooltip.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GlyphRecipeTooltip.java index 0468ab2be1..41076620ac 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GlyphRecipeTooltip.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GlyphRecipeTooltip.java @@ -7,9 +7,8 @@ import net.minecraft.resources.ResourceLocation; 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 java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java index 361d20f221..91e747c3b8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java @@ -22,11 +22,11 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; -import net.minecraftforge.client.ForgeHooksClient; -import net.minecraftforge.client.event.RenderTooltipEvent; -import net.minecraftforge.client.gui.overlay.ForgeGui; -import net.minecraftforge.client.gui.overlay.IGuiOverlay; -import net.minecraftforge.common.MinecraftForge; +import net.neoforged.neoforge.client.ClientHooks; +import net.neoforged.neoforge.client.event.RenderTooltipEvent; +import net.neoforged.neoforge.client.gui.overlay.ExtendedGui; +import net.neoforged.neoforge.client.gui.overlay.IGuiOverlay; +import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.NotNull; import org.joml.Matrix4f; @@ -39,7 +39,7 @@ public class GuiEntityInfoHUD { public static int hoverTicks = 0; public static Object lastHovered = null; - public static void renderOverlay(ForgeGui gui, GuiGraphics graphics, float partialTicks, int width, + public static void renderOverlay(ExtendedGui gui, GuiGraphics graphics, float partialTicks, int width, int height) { PoseStack poseStack = graphics.pose(); Minecraft mc = Minecraft.getInstance(); @@ -130,10 +130,10 @@ public static void drawHoveringText(@NotNull final ItemStack stack, GuiGraphics if (textLines.isEmpty()) return; PoseStack pStack = graphics.pose(); - List list = ForgeHooksClient.gatherTooltipComponents(stack, textLines, stack.getTooltipImage(), mouseX, screenWidth, screenHeight, font); + List list = ClientHooks.gatherTooltipComponents(stack, textLines, stack.getTooltipImage(), mouseX, screenWidth, screenHeight, font); RenderTooltipEvent.Pre event = new RenderTooltipEvent.Pre(stack, graphics, mouseX, mouseY, screenWidth, screenHeight, font, list, DefaultTooltipPositioner.INSTANCE); - if (MinecraftForge.EVENT_BUS.post(event)) + if (NeoForge.EVENT_BUS.post(event)) return; mouseX = event.getX(); @@ -216,7 +216,7 @@ else if (tooltipY + tooltipHeight + 4 > screenHeight) final int zLevel = 400; RenderTooltipEvent.Color colorEvent = new RenderTooltipEvent.Color(stack, graphics, tooltipX, tooltipY, font, backgroundColor, borderColorStart, borderColorEnd, list); - MinecraftForge.EVENT_BUS.post(colorEvent); + NeoForge.EVENT_BUS.post(colorEvent); backgroundColor = colorEvent.getBackgroundStart(); borderColorStart = colorEvent.getBorderStart(); borderColorEnd = colorEvent.getBorderEnd(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java index 03991c3276..ee767e16f9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java @@ -16,8 +16,8 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.client.gui.overlay.ForgeGui; -import net.minecraftforge.client.gui.overlay.IGuiOverlay; +import net.neoforged.neoforge.client.gui.overlay.ExtendedGui; +import net.neoforged.neoforge.client.gui.overlay.IGuiOverlay; public class GuiManaHUD { public static final IGuiOverlay OVERLAY = GuiManaHUD::renderOverlay; @@ -32,7 +32,7 @@ public static boolean shouldDisplayBar() { || (ManaUtil.getMaxMana(minecraft.player) > ManaUtil.getCurrentMana(minecraft.player)); } - public static void renderOverlay(ForgeGui gui, GuiGraphics guiGraphics, float pt, int width, + public static void renderOverlay(ExtendedGui gui, GuiGraphics guiGraphics, float pt, int width, int height) { if (!shouldDisplayBar()) return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java index e6eff37091..ba22fe7471 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java @@ -7,8 +7,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.client.gui.overlay.ForgeGui; -import net.minecraftforge.client.gui.overlay.IGuiOverlay; +import net.neoforged.neoforge.client.gui.overlay.ExtendedGui; +import net.neoforged.neoforge.client.gui.overlay.IGuiOverlay; public class GuiSpellHUD { @@ -16,7 +16,7 @@ public class GuiSpellHUD { private static final Minecraft minecraft = Minecraft.getInstance(); - public static void renderOverlay(ForgeGui gui, GuiGraphics graphics, float pt, int width, + public static void renderOverlay(ExtendedGui gui, GuiGraphics graphics, float pt, int width, int height) { ItemStack stack = StackUtil.getHeldSpellbook(minecraft.player); if (stack != ItemStack.EMPTY && stack.getItem() instanceof SpellBook && stack.getTag() != null) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java index 28a80d9364..1f4eed3625 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java @@ -350,7 +350,7 @@ public void drawTooltip(GuiGraphics stack, int mouseX, int mouseY) { MutableComponent component = Component.translatable("ars_nouveau.levels_required", ScribesTile.getLevelsFromExp(hoveredRecipe.exp)).withStyle(Style.EMPTY.withColor(ChatFormatting.GREEN)); tooltip.add(component); } - List components = new ArrayList<>(net.minecraftforge.client.ForgeHooksClient.gatherTooltipComponents(ItemStack.EMPTY, tooltip, mouseX, width, height, this.font)); + List components = new ArrayList<>(net.neoforged.neoforge.client.ClientHooks.gatherTooltipComponents(ItemStack.EMPTY, tooltip, mouseX, width, height, this.font)); if (hoveredRecipe != null) components.add(new GlyphRecipeTooltip(hoveredRecipe.inputs)); renderTooltipInternal(stack, components, mouseX, mouseY); @@ -361,7 +361,7 @@ public void renderTooltipInternal(GuiGraphics graphics, List components = new ArrayList<>(ForgeHooksClient.gatherTooltipComponents(ItemStack.EMPTY, Screen.getTooltipFromItem(Minecraft.getInstance(), stack), parX, width, height, font)); + List components = new ArrayList<>(ClientHooks.gatherTooltipComponents(ItemStack.EMPTY, Screen.getTooltipFromItem(Minecraft.getInstance(), stack), parX, width, height, font)); parent.renderTooltipInternal(graphics, components, parX, parY); } RenderUtils.drawItemAsIcon(stack, graphics, x + 3, y + 2, 16, false); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java index c25fa132c6..f3683caf0f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java @@ -12,12 +12,12 @@ import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.Recipe; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.fml.ModContainer; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.forgespi.language.IModInfo; - +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.ModList; +import net.neoforged.neoforgespi.language.IModInfo; +import var; import java.util.List; @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java index 30d43bb3c0..a9ac194fa7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java @@ -14,14 +14,13 @@ import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.MovementInputUpdateEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; - +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.event.MovementInputUpdateEvent; import java.util.List; -@Mod.EventBusSubscriber(Dist.CLIENT) +@EventBusSubscriber(Dist.CLIENT) public class GuiRadialMenu extends Screen { private static final float PRECISION = 5.0f; private static final int MAX_SLOTS = 20; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/DyeRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/DyeRecipeCategory.java index 1b4b159671..ce0d2a4103 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/DyeRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/DyeRecipeCategory.java @@ -12,7 +12,7 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.DyeItem; import net.minecraft.world.item.ItemStack; - +import var; import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/MultiInputCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/MultiInputCategory.java index 910fe532d9..e7f3ce5db0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/MultiInputCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/MultiInputCategory.java @@ -9,7 +9,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.phys.Vec2; - +import record; import javax.annotation.Nullable; import java.util.List; import java.util.function.Function; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/keybindings/KeyHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/keybindings/KeyHandler.java index fd1b6ab4e0..9a320cc823 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/keybindings/KeyHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/keybindings/KeyHandler.java @@ -15,16 +15,16 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.InputEvent; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.items.IItemHandlerModifiable; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.event.InputEvent; +import net.neoforged.neoforge.common.util.LazyOptional; +import net.neoforged.neoforge.items.IItemHandlerModifiable; import static com.hollingsworth.arsnouveau.api.util.StackUtil.getHeldSpellbook; -@Mod.EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID) +@EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID) public class KeyHandler { private static final Minecraft MINECRAFT = Minecraft.getInstance(); public static KeyMapping[] CURIO_MAPPINGS = new KeyMapping[]{ diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/LineParticleProvider.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/LineParticleProvider.java index f1bf0ec0cc..ecea332c75 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/LineParticleProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/LineParticleProvider.java @@ -4,8 +4,8 @@ import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleProvider; import net.minecraft.client.particle.SpriteSet; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) public class LineParticleProvider implements ParticleProvider { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleGlow.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleGlow.java index 6d5320f0ee..402958eb9d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleGlow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleGlow.java @@ -5,8 +5,8 @@ import net.minecraft.client.particle.ParticleRenderType; import net.minecraft.client.particle.SpriteSet; import net.minecraft.client.particle.TextureSheetParticle; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) public class ParticleGlow extends TextureSheetParticle { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index 9e4c68c596..2e1af634a5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -13,7 +13,6 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.renderer.entity.*; import com.hollingsworth.arsnouveau.client.renderer.entity.familiar.*; -import com.hollingsworth.arsnouveau.client.renderer.tile.GenericRenderer; import com.hollingsworth.arsnouveau.client.renderer.tile.*; import com.hollingsworth.arsnouveau.common.block.tile.MageBlockTile; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; @@ -42,24 +41,24 @@ import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.event.EntityRenderersEvent; -import net.minecraftforge.client.event.RegisterColorHandlersEvent; -import net.minecraftforge.client.event.RegisterGuiOverlaysEvent; -import net.minecraftforge.client.gui.overlay.NamedGuiOverlay; -import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.neoforge.client.event.EntityRenderersEvent; +import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; +import net.neoforged.neoforge.client.event.RegisterGuiOverlaysEvent; +import net.neoforged.neoforge.client.gui.overlay.NamedGuiOverlay; +import net.neoforged.neoforge.client.gui.overlay.VanillaGuiOverlay; +import net.neoforged.neoforge.registries.ForgeRegistries; import org.jetbrains.annotations.Nullable; import static com.hollingsworth.arsnouveau.client.events.ClientEvents.localize; @SuppressWarnings("unchecked") -@Mod.EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) +@EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID, bus = EventBusSubscriber.Bus.MOD) @OnlyIn(Dist.CLIENT) public class ClientHandler { @SubscribeEvent diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModKeyBindings.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModKeyBindings.java index a8d822acac..91725e2093 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModKeyBindings.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModKeyBindings.java @@ -2,14 +2,15 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.client.KeyMapping; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.RegisterKeyMappingsEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; import org.lwjgl.glfw.GLFW; +import record; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) +@EventBusSubscriber(modid = ArsNouveau.MODID, value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD) public class ModKeyBindings { public static final String CATEGORY = "key.category.ars_nouveau.general"; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java index cfc0ec0e3e..d0a42e1f6b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java @@ -3,18 +3,18 @@ import com.hollingsworth.arsnouveau.client.particle.*; import net.minecraft.client.Minecraft; import net.minecraft.core.particles.ParticleType; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.RegisterParticleProvidersEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.event.RegisterParticleProvidersEvent; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.registries.ForgeRegistries; +import net.neoforged.neoforge.registries.RegistryObject; import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; -@Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) +@EventBusSubscriber(modid = MODID, bus = EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) public class ModParticles { public static final DeferredRegister> PARTICLES = DeferredRegister.create(ForgeRegistries.PARTICLE_TYPES, MODID); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ShaderRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ShaderRegistry.java index ba09d32c0f..fcedd07839 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ShaderRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ShaderRegistry.java @@ -13,10 +13,10 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.RegisterShadersEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.event.RegisterShadersEvent; import org.apache.commons.lang3.function.TriFunction; import org.apache.commons.lang3.tuple.Triple; @@ -25,7 +25,7 @@ import java.util.Map; import java.util.function.BiFunction; -@Mod.EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) +@EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID, bus = EventBusSubscriber.Bus.MOD) public class ShaderRegistry extends RenderType { private ShaderRegistry(String name, VertexFormat format, VertexFormat.Mode mode, int bufferSize, boolean affectsCrumbling, boolean sortOnUpload, Runnable setupState, Runnable clearState) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java index cb89fad32d..7c34613008 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java @@ -17,7 +17,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.client.model.data.ModelData; +import net.neoforged.neoforge.client.model.data.ModelData; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.core.animatable.model.CoreGeoBone; @@ -26,6 +26,7 @@ import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.renderer.GeoEntityRenderer; import software.bernie.geckolib.util.RenderUtils; +import var; public class AnimBlockRenderer extends GeoEntityRenderer { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java index 471835f25a..8b64cff07e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java @@ -32,7 +32,7 @@ import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.client.ForgeHooksClient; +import net.neoforged.neoforge.client.ClientHooks; import org.joml.Quaternionf; import org.joml.Vector3d; import software.bernie.geckolib.cache.object.BakedGeoModel; @@ -150,7 +150,7 @@ private void renderArmorPiece(AlterationTile tile, ItemStack itemstack, PoseStac } protected net.minecraft.client.model.Model getArmorModelHook(ItemStack itemStack, EquipmentSlot slot, HumanoidModel model) { - return net.minecraftforge.client.ForgeHooksClient.getArmorModel(Minecraft.getInstance().player, itemStack, slot, model); + return net.neoforged.neoforge.client.ClientHooks.getArmorModel(Minecraft.getInstance().player, itemStack, slot, model); } private void renderModel(PoseStack pPoseStack, MultiBufferSource pBuffer, int packedLight, boolean p_117111_, net.minecraft.client.model.Model pModel, float p_117114_, float p_117115_, float p_117116_, ResourceLocation armorResource) { @@ -169,7 +169,7 @@ public ResourceLocation getArmorResource(ItemStack stack, EquipmentSlot slot, @N } String s1 = String.format(java.util.Locale.ROOT, "%s:textures/models/armor/%s_layer_%d%s.png", domain, texture, (usesInnerModel(slot) ? 2 : 1), type == null ? "" : String.format(java.util.Locale.ROOT, "_%s", type)); - s1 = ForgeHooksClient.getArmorTexture(Minecraft.getInstance().player, stack, s1, slot, type); + s1 = ClientHooks.getArmorTexture(Minecraft.getInstance().player, stack, s1, slot, type); ResourceLocation resourcelocation = ARMOR_LOCATION_CACHE.get(s1); if (resourcelocation == null) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantedFallingBlockRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantedFallingBlockRenderer.java index 6ec02fa9a4..538a620d31 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantedFallingBlockRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantedFallingBlockRenderer.java @@ -14,6 +14,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; +import var; public class EnchantedFallingBlockRenderer extends EntityRenderer { private final BlockRenderDispatcher dispatcher; @@ -32,8 +33,8 @@ public void render(T pEntity, float pEntityYaw, float pPartialTicks, PoseStack p BlockPos blockpos = BlockPos.containing(pEntity.getX(), pEntity.getBoundingBox().maxY, pEntity.getZ()); pMatrixStack.translate(-0.5D, 0.0D, -0.5D); var model = this.dispatcher.getBlockModel(blockstate); - for (var renderType : model.getRenderTypes(blockstate, RandomSource.create(blockstate.getSeed(pEntity.getStartPos())), net.minecraftforge.client.model.data.ModelData.EMPTY)) - this.dispatcher.getModelRenderer().tesselateBlock(level, model, blockstate, blockpos, pMatrixStack, pBuffer.getBuffer(renderType), false, RandomSource.create(), blockstate.getSeed(pEntity.getStartPos()), OverlayTexture.NO_OVERLAY, net.minecraftforge.client.model.data.ModelData.EMPTY, renderType); + for (var renderType : model.getRenderTypes(blockstate, RandomSource.create(blockstate.getSeed(pEntity.getStartPos())), net.neoforged.neoforge.client.model.data.ModelData.EMPTY)) + this.dispatcher.getModelRenderer().tesselateBlock(level, model, blockstate, blockpos, pMatrixStack, pBuffer.getBuffer(renderType), false, RandomSource.create(), blockstate.getSeed(pEntity.getStartPos()), OverlayTexture.NO_OVERLAY, net.neoforged.neoforge.client.model.data.ModelData.EMPTY, renderType); pMatrixStack.popPose(); super.render(pEntity, pEntityYaw, pPartialTicks, pMatrixStack, pBuffer, pPackedLight); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/FalseweaveRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/FalseweaveRenderer.java index 6c703fd3c4..04d8c60c9c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/FalseweaveRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/FalseweaveRenderer.java @@ -35,7 +35,7 @@ public void render(FalseWeaveTile tileEntityIn, float partialTick, PoseStack pPo } private void renderBlock(BlockPos pPos, BlockState pState, PoseStack pPoseStack, MultiBufferSource pBufferSource, Level pLevel, boolean pExtended, int pPackedOverlay) { - net.minecraftforge.client.ForgeHooksClient.renderPistonMovedBlocks(pPos, pState, pPoseStack, pBufferSource, pLevel, pExtended, pPackedOverlay, blockRenderer == null ? blockRenderer = net.minecraft.client.Minecraft.getInstance().getBlockRenderer() : blockRenderer); + net.neoforged.neoforge.client.ClientHooks.renderPistonMovedBlocks(pPos, pState, pPoseStack, pBufferSource, pLevel, pExtended, pPackedOverlay, blockRenderer == null ? blockRenderer = net.minecraft.client.Minecraft.getInstance().getBlockRenderer() : blockRenderer); } public int getViewDistance() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericRenderer.java index 5f4ec23fd2..e824d0a70f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericRenderer.java @@ -4,7 +4,7 @@ import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.world.level.block.entity.BlockEntity; -import software.bernie.geckolib.core.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.GeoAnimatable; import software.bernie.geckolib.renderer.GeoBlockRenderer; import java.util.function.Supplier; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GhostweaveRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GhostweaveRenderer.java index a6f38c0728..b32caa4f15 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GhostweaveRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GhostweaveRenderer.java @@ -36,7 +36,7 @@ public void render(GhostWeaveTile tileEntityIn, float partialTick, PoseStack pPo } private void renderBlock(BlockPos pPos, BlockState pState, PoseStack pPoseStack, MultiBufferSource pBufferSource, Level pLevel, boolean pExtended, int pPackedOverlay) { - net.minecraftforge.client.ForgeHooksClient.renderPistonMovedBlocks(pPos, pState, pPoseStack, pBufferSource, pLevel, pExtended, pPackedOverlay, blockRenderer == null ? blockRenderer = net.minecraft.client.Minecraft.getInstance().getBlockRenderer() : blockRenderer); + net.neoforged.neoforge.client.ClientHooks.renderPistonMovedBlocks(pPos, pState, pPoseStack, pBufferSource, pLevel, pExtended, pPackedOverlay, blockRenderer == null ? blockRenderer = net.minecraft.client.Minecraft.getInstance().getBlockRenderer() : blockRenderer); } public int getViewDistance() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/IntangibleAirRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/IntangibleAirRenderer.java index 70835608e2..01fcc93960 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/IntangibleAirRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/IntangibleAirRenderer.java @@ -22,8 +22,7 @@ import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.client.model.data.ModelData; - +import net.neoforged.neoforge.client.model.data.ModelData; import java.util.List; public class IntangibleAirRenderer implements BlockEntityRenderer { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/MirrorweaveRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/MirrorweaveRenderer.java index 5cf3591b7d..abe83bf0d9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/MirrorweaveRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/MirrorweaveRenderer.java @@ -13,7 +13,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.client.ForgeHooksClient; +import net.neoforged.neoforge.client.ClientHooks; public class MirrorweaveRenderer implements BlockEntityRenderer { private BlockRenderDispatcher blockRenderer; @@ -37,7 +37,7 @@ public void render(MirrorWeaveTile tileEntityIn, float partialTick, PoseStack pP } private void renderBlock(BlockPos pPos, BlockState pState, PoseStack pPoseStack, MultiBufferSource pBufferSource, Level pLevel, boolean pExtended, int pPackedOverlay) { - ForgeHooksClient.renderPistonMovedBlocks(pPos, pState, pPoseStack, pBufferSource, pLevel, pExtended, pPackedOverlay, blockRenderer == null ? blockRenderer = net.minecraft.client.Minecraft.getInstance().getBlockRenderer() : blockRenderer); + ClientHooks.renderPistonMovedBlocks(pPos, pState, pPoseStack, pBufferSource, pLevel, pExtended, pPackedOverlay, blockRenderer == null ? blockRenderer = net.minecraft.client.Minecraft.getInstance().getBlockRenderer() : blockRenderer); } public int getViewDistance() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PortalTileRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PortalTileRenderer.java index 53ad0e893a..77644dbe6b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PortalTileRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PortalTileRenderer.java @@ -11,8 +11,8 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.core.Direction; -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.joml.Matrix4f; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/SkyBlockRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/SkyBlockRenderer.java index 334b777f11..2b8940e6a7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/SkyBlockRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/SkyBlockRenderer.java @@ -16,9 +16,9 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.ForgeHooksClient; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.client.ClientHooks; import org.joml.Matrix4f; @OnlyIn(Dist.CLIENT) @@ -63,7 +63,7 @@ private void renderFace(SkyBlockTile tileEntityIn, Matrix4f matrix, VertexConsum } private void renderBlock(BlockPos pPos, BlockState pState, PoseStack pPoseStack, MultiBufferSource pBufferSource, Level pLevel, boolean pExtended, int pPackedOverlay) { - ForgeHooksClient.renderPistonMovedBlocks(pPos, pState, pPoseStack, pBufferSource, pLevel, pExtended, pPackedOverlay, blockRenderer == null ? blockRenderer = net.minecraft.client.Minecraft.getInstance().getBlockRenderer() : blockRenderer); + ClientHooks.renderPistonMovedBlocks(pPos, pState, pPoseStack, pBufferSource, pLevel, pExtended, pPackedOverlay, blockRenderer == null ? blockRenderer = net.minecraft.client.Minecraft.getInstance().getBlockRenderer() : blockRenderer); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/world/WorldEventContext.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/world/WorldEventContext.java index 4e8b97b751..90e92fa71b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/world/WorldEventContext.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/world/WorldEventContext.java @@ -6,7 +6,7 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.client.event.RenderLevelStageEvent; +import net.neoforged.neoforge.client.event.RenderLevelStageEvent; /** * Main class for handling world rendering. diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/advancement/ANCriteriaTriggers.java b/src/main/java/com/hollingsworth/arsnouveau/common/advancement/ANCriteriaTriggers.java index 6fac2e6fb1..311387d34a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/advancement/ANCriteriaTriggers.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/advancement/ANCriteriaTriggers.java @@ -1,24 +1,31 @@ package com.hollingsworth.arsnouveau.common.advancement; -import com.hollingsworth.arsnouveau.ArsNouveau; -import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.advancements.Criterion; import net.minecraft.advancements.CriterionTrigger; +import net.minecraft.advancements.CriterionTriggerInstance; import net.minecraft.advancements.critereon.PlayerTrigger; import net.minecraft.core.BlockPos; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.phys.AABB; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.Optional; + +import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; public class ANCriteriaTriggers { - public static final PlayerTrigger POOF_MOB = register(new PlayerTrigger(new ResourceLocation(ArsNouveau.MODID, "poof_mob"))); - public static final PlayerTrigger FAMILIAR = register(new PlayerTrigger(new ResourceLocation(ArsNouveau.MODID, "familiar"))); - public static final PlayerTrigger CHIMERA_EXPLOSION = register(new PlayerTrigger(new ResourceLocation(ArsNouveau.MODID, "chimera_explosion"))); - public static final PlayerTrigger CREATE_PORTAL = register(new PlayerTrigger(new ResourceLocation(ArsNouveau.MODID, "portals"))); - public static final PlayerTrigger PRISMATIC = register(new PlayerTrigger(new ResourceLocation(ArsNouveau.MODID, "prismatic"))); - public static final PlayerTrigger SHRUNK_STARBY = register(new PlayerTrigger(new ResourceLocation(ArsNouveau.MODID, "shrunk_starby"))); - public static final PlayerTrigger CAUGHT_LIGHTNING = register(new PlayerTrigger(new ResourceLocation(ArsNouveau.MODID, "catch_lightning"))); - public static final PlayerTrigger TIME_IN_BOTTLE = register(new PlayerTrigger(new ResourceLocation(ArsNouveau.MODID, "time_in_bottle"))); + public static final DeferredRegister> TRIGGERS = DeferredRegister.create(BuiltInRegistries.TRIGGER_TYPES, MODID); + public static final DeferredHolder, PlayerTrigger> POOF_MOB = register("poof_mob"); + public static final DeferredHolder, PlayerTrigger> FAMILIAR = register("familiar"); + public static final DeferredHolder, PlayerTrigger> CHIMERA_EXPLOSION = register("chimera_explosion"); + public static final DeferredHolder, PlayerTrigger> CREATE_PORTAL = register("portals"); + public static final DeferredHolder, PlayerTrigger> PRISMATIC = register("prismatic"); + public static final DeferredHolder, PlayerTrigger> SHRUNK_STARBY = register("shrunk_starby"); + public static final DeferredHolder, PlayerTrigger> CAUGHT_LIGHTNING = register("catch_lightning"); + public static final DeferredHolder, PlayerTrigger> TIME_IN_BOTTLE = register("time_in_bottle"); public static void rewardNearbyPlayers(PlayerTrigger criteria, ServerLevel level, BlockPos pos, int radius){ AABB aabb = new AABB(pos).inflate(radius); @@ -29,9 +36,17 @@ public static void rewardNearbyPlayers(PlayerTrigger criteria, ServerLevel level } } - public static > T register(T trigger) { - return CriteriaTriggers.register(trigger); + public static > DeferredHolder, PlayerTrigger> register(String pName) { + return register(pName, new PlayerTrigger()); + } + + public static > DeferredHolder, T> register(String pName, T pTrigger) { + return TRIGGERS.register(pName, () -> pTrigger); } public static void init() {} + + public static Criterion createCriterion(DeferredHolder, PlayerTrigger> holder) { + return holder.get().createCriterion(new PlayerTrigger.TriggerInstance(Optional.empty())); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java index 0061683b73..759b3629e0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java @@ -25,9 +25,9 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.*; import net.minecraft.world.level.Level; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoItem; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ArchwoodChest.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ArchwoodChest.java index 59e45a873c..abeb3dfb63 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ArchwoodChest.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ArchwoodChest.java @@ -16,8 +16,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; - +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import java.util.function.Consumer; public class ArchwoodChest extends ChestBlock { @@ -32,7 +31,7 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { public static class Item extends BlockItem { - public Item(Block block, Properties props) { + public Item(Block block, net.minecraft.world.item.Item.Properties props) { super(block, props); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java index b41098c98b..a4518a253b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java @@ -42,7 +42,7 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.common.util.FakePlayer; +import net.neoforged.neoforge.common.util.FakePlayer; import org.jetbrains.annotations.NotNull; import java.util.HashMap; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java index 420bd2deca..770645876f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java @@ -33,9 +33,8 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -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 javax.annotation.Nullable; import static com.hollingsworth.arsnouveau.setup.config.ServerConfig.ENABLE_WARP_PORTALS; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionDiffuserBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionDiffuserBlock.java index 8ffc1abfa6..ae4a567265 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionDiffuserBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionDiffuserBlock.java @@ -21,7 +21,7 @@ public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { } @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + protected boolean isPathfindable(BlockState pState, PathComputationType pPathComputationType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java index 2cb590b757..84c7646b06 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java @@ -26,7 +26,7 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.util.FakePlayer; +import net.neoforged.neoforge.common.util.FakePlayer; import org.jetbrains.annotations.Nullable; import java.util.HashMap; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScribesBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScribesBlock.java index d1998fde51..cfc1c6ba3b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScribesBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScribesBlock.java @@ -23,16 +23,16 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.BlockHitResult; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.network.PacketDistributor; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; +import net.neoforged.neoforge.network.PacketDistributor; public class ScribesBlock extends TableBlock { public ScribesBlock() { super(); - MinecraftForge.EVENT_BUS.register(this); + NeoForge.EVENT_BUS.register(this); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java index 6f0468454c..a1deb292ca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java @@ -26,8 +26,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.BlockHitResult; -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.Nullable; import java.util.ArrayList; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java index b2778ee17c..059703f7bd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java @@ -70,9 +70,9 @@ public boolean isRandomlyTicking(BlockState state) { public void randomTick(BlockState state, ServerLevel worldIn, BlockPos pos, RandomSource random) { super.randomTick(state, worldIn, pos, random); int i = state.getValue(AGE); - if (i < 3 && worldIn.getRawBrightness(pos.above(), 0) >= 9 && net.minecraftforge.common.ForgeHooks.onCropsGrowPre(worldIn, pos, state, random.nextInt(5) == 0)) { + if (i < 3 && worldIn.getRawBrightness(pos.above(), 0) >= 9 && net.neoforged.neoforge.common.CommonHooks.onCropsGrowPre(worldIn, pos, state, random.nextInt(5) == 0)) { worldIn.setBlock(pos, state.setValue(AGE, i + 1), 2); - net.minecraftforge.common.ForgeHooks.onCropsGrowPost(worldIn, pos, state); + net.neoforged.neoforge.common.CommonHooks.onCropsGrowPost(worldIn, pos, state); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/StrippableLog.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/StrippableLog.java index c0fe54bc11..52f3cfd68a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/StrippableLog.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/StrippableLog.java @@ -1,12 +1,12 @@ package com.hollingsworth.arsnouveau.common.block; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.RotatedPillarBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.ToolAction; -import net.minecraftforge.common.ToolActions; +import net.neoforged.neoforge.common.ToolAction; +import net.neoforged.neoforge.common.ToolActions; import org.jetbrains.annotations.Nullable; import java.util.function.Supplier; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AgronomicSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AgronomicSourcelinkTile.java index 9c108eeecf..8632f0deef 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AgronomicSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AgronomicSourcelinkTile.java @@ -7,12 +7,12 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.event.level.BlockEvent; -import net.minecraftforge.event.level.SaplingGrowTreeEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.level.BlockEvent; +import net.neoforged.neoforge.event.level.SaplingGrowTreeEvent; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class AgronomicSourcelinkTile extends SourcelinkTile { public AgronomicSourcelinkTile(BlockPos pos, BlockState state) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java index 359849cfae..3568c21883 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java @@ -5,7 +5,7 @@ import com.hollingsworth.arsnouveau.api.spell.ISpellCasterProvider; import com.hollingsworth.arsnouveau.api.spell.TurretSpellCaster; import com.hollingsworth.arsnouveau.common.block.ITickable; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java index f8af4198e9..6c7ed2fe18 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java @@ -20,8 +20,8 @@ import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.items.ItemHandlerHelper; +import net.neoforged.neoforge.event.EventHooks; +import net.neoforged.neoforge.items.ItemHandlerHelper; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; @@ -131,7 +131,7 @@ public void craftShift(Player player, @Nullable String tab) { } crafted.onCraftedBy(player.level, player, amountCrafted); - ForgeEventFactory.firePlayerCraftingEvent(player, ItemHandlerHelper.copyStackWithSize(crafted, amountCrafted), craftMatrix); + EventHooks.firePlayerCraftingEvent(player, ItemHandlerHelper.copyStackWithSize(crafted, amountCrafted), craftMatrix); } public void craft(Player thePlayer, @Nullable String tab) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java index a4e353e197..e7b8f88954 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java @@ -9,7 +9,6 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleLineData; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.block.ITickable; -import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; import com.hollingsworth.arsnouveau.common.entity.EntityFlyingItem; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; @@ -23,14 +22,15 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.wrapper.InvWrapper; +import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.common.capabilities.Capability; +import net.neoforged.neoforge.common.util.LazyOptional; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; @@ -40,7 +40,7 @@ import software.bernie.geckolib.core.animation.RawAnimation; import software.bernie.geckolib.core.object.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; - +import var; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -51,7 +51,7 @@ public class ImbuementTile extends AbstractSourceMachine implements Container, I public ItemStack stack = ItemStack.EMPTY; public ItemEntity entity; public boolean draining; - ImbuementRecipe recipe; + RecipeHolder recipe; int backoff; public float frames; boolean hasRecipe; @@ -111,7 +111,7 @@ public void tick() { // Restore the recipe on world restart if (recipe == null) { - var foundRecipe = getRecipeNow(); + RecipeHolder foundRecipe = getRecipeNow(); if(foundRecipe != null){ this.recipe = foundRecipe; this.craftTicks = 100; @@ -206,7 +206,7 @@ public boolean canPlaceItem(int slot, ItemStack stack) { if (stack.isEmpty() || !this.stack.isEmpty()) return false; this.stack = stack.copy(); - ImbuementRecipe recipe = getRecipeNow(); + RecipeHolder recipe = getRecipeNow(); this.stack = ItemStack.EMPTY; return recipe != null; } @@ -257,7 +257,7 @@ public void clearContent() { @NotNull @Override public LazyOptional getCapability(@NotNull Capability cap, final @Nullable Direction side) { - if (cap == ForgeCapabilities.ITEM_HANDLER) { + if (cap == Capabilities.ITEM_HANDLER) { return itemHandler.cast(); } return super.getCapability(cap, side); @@ -306,14 +306,14 @@ public List getNearbyPedestals() { return pedestalList(getBlockPos(), 1, getLevel()); } - public @Nullable ImbuementRecipe getRecipeNow(){ + public @Nullable RecipeHolder getRecipeNow(){ return level.getRecipeManager().getAllRecipesFor(RecipeRegistry.IMBUEMENT_TYPE.get()).stream() .filter(f -> f.matches(this, level)).findFirst().orElse(null); } @Override public void getTooltip(List tooltip) { - var recipe = getRecipeNow(); + RecipeHolder recipe = getRecipeNow(); if(recipe != null && !recipe.output.isEmpty() && stack != null && !stack.isEmpty()) { tooltip.add(Component.translatable("ars_nouveau.crafting", recipe.output.getHoverName())); if(recipe.source > 0) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java index 109559e942..053baf5acd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java @@ -19,9 +19,9 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.wrapper.CombinedInvWrapper; +import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.wrapper.CombinedInvWrapper; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -52,7 +52,7 @@ public void tick() { if(tile == null){ return; } - IItemHandler handler = tile.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null); + IItemHandler handler = tile.getCapability(Capabilities.ITEM_HANDLER).orElse(null); if(handler == null){ return; } @@ -118,7 +118,7 @@ public void setFilterStack(ItemStack stack){ @Override public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable LivingEntity storedEntity, Player playerEntity) { if(storedPos != null){ - if(level.getBlockEntity(storedPos) == null || !level.getBlockEntity(storedPos).getCapability(ForgeCapabilities.ITEM_HANDLER).isPresent()){ + if(level.getBlockEntity(storedPos) == null || !level.getBlockEntity(storedPos).getCapability(Capabilities.ITEM_HANDLER).isPresent()){ return; } if(BlockUtil.distanceFrom(storedPos, worldPosition) > 30){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/LecternInvWrapper.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/LecternInvWrapper.java index 3459cb312f..a994d54174 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/LecternInvWrapper.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/LecternInvWrapper.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.api.item.inv.CombinedHandlerInv; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; +import net.neoforged.neoforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; public class LecternInvWrapper extends CombinedHandlerInv { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MirrorWeaveTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MirrorWeaveTile.java index c6b7081b6b..fb13d4f002 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MirrorWeaveTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MirrorWeaveTile.java @@ -5,7 +5,7 @@ import com.hollingsworth.arsnouveau.api.spell.SpellStats; import com.hollingsworth.arsnouveau.common.block.MirrorWeave; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDampen; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderGetter; @@ -13,7 +13,6 @@ import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ModdedTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ModdedTile.java index 3826472c69..84d949ce7d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ModdedTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ModdedTile.java @@ -1,7 +1,9 @@ package com.hollingsworth.arsnouveau.common.block.tile; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.BlockEntityTypeRegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.Connection; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; @@ -17,7 +19,7 @@ public ModdedTile(BlockEntityType tileEntityTypeIn, BlockPos pos, BlockState super(tileEntityTypeIn, pos, state); } - public ModdedTile(RegistryWrapper> tileEntityTypeIn, BlockPos pos, BlockState state) { + public ModdedTile(BlockEntityTypeRegistryWrapper tileEntityTypeIn, BlockPos pos, BlockState state) { this(tileEntityTypeIn.get(), pos, state); } @@ -28,14 +30,14 @@ public ClientboundBlockEntityDataPacket getUpdatePacket() { } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + protected void saveAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { + super.saveAdditional(pTag, pRegistries); } @Override - public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt) { - super.onDataPacket(net, pkt); - handleUpdateTag(pkt.getTag() == null ? new CompoundTag() : pkt.getTag()); + public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, HolderLookup.Provider lookupProvider) { + super.onDataPacket(net, pkt, lookupProvider); + handleUpdateTag(pkt.getTag() == null ? new CompoundTag() : pkt.getTag(), lookupProvider); } public boolean updateBlock() { @@ -49,9 +51,9 @@ public boolean updateBlock() { } @Override - public CompoundTag getUpdateTag() { + public CompoundTag getUpdateTag(HolderLookup.Provider pRegistries) { CompoundTag tag = new CompoundTag(); - this.saveAdditional(tag); + this.saveAdditional(tag, pRegistries); return tag; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java index 54a6b5d471..8b9a7ba67d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java @@ -28,9 +28,8 @@ import net.minecraft.world.level.portal.PortalInfo; import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.ITeleporter; - +import net.neoforged.neoforge.common.util.FakePlayer; +import net.neoforged.neoforge.common.util.ITeleporter; import javax.annotation.Nullable; import java.util.HashSet; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java index e63de1d983..dbc5eae0d0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java @@ -14,7 +14,7 @@ import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RedstoneRelayTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RedstoneRelayTile.java index 25200b5631..cb3cd3ff91 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RedstoneRelayTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RedstoneRelayTile.java @@ -9,6 +9,7 @@ import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.network.chat.Component; @@ -16,14 +17,10 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.animatable.GeoAnimatable; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.GeoAnimatable; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.ArrayList; @@ -184,8 +181,8 @@ public void onFinishedConnectionFirst(@javax.annotation.Nullable BlockPos stored } @Override - public void load(CompoundTag pTag) { - super.load(pTag); + public void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { + super.loadAdditional(pTag, pRegistries); poweredFrom = new ArrayList<>(); powering = new ArrayList<>(); currentParent = null; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java index c84e2d4125..d049785c71 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java @@ -11,7 +11,7 @@ import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.items.DominionWand; import com.hollingsworth.arsnouveau.common.util.PortUtil; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RepositoryTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RepositoryTile.java index fcc2e86f2a..2c89fd7f7e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RepositoryTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RepositoryTile.java @@ -24,7 +24,7 @@ import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.core.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; - +import var; import javax.annotation.Nullable; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java index 810d7a127a..c6e48473e6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java @@ -40,8 +40,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.HitResult; -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.Nullable; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java index 878aa937e2..79fb3aea60 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java @@ -31,10 +31,10 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.wrapper.InvWrapper; +import net.neoforged.neoforge.common.capabilities.Capability; +import net.neoforged.neoforge.common.util.LazyOptional; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.core.animatable.GeoAnimatable; @@ -50,7 +50,7 @@ import java.util.ArrayList; import java.util.List; -import static net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER; +import static net.neoforged.neoforge.common.capabilities.Capabilities.ITEM_HANDLER; public class ScribesTile extends ModdedTile implements GeoBlockEntity, ITickable, Container, ITooltipProvider, IAnimationListener, IWandable { private final LazyOptional itemHandler = LazyOptional.of(() -> new InvWrapper(this)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java index 1e1ef95efb..f37881e928 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.common.block.tile; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -10,11 +10,11 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.wrapper.InvWrapper; +import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.common.capabilities.Capability; +import net.neoforged.neoforge.common.util.LazyOptional; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -102,7 +102,7 @@ public void setStack(ItemStack otherStack){ @NotNull @Override public LazyOptional getCapability(@NotNull Capability cap, final @Nullable Direction side) { - if (cap == ForgeCapabilities.ITEM_HANDLER) { + if (cap == Capabilities.ITEM_HANDLER) { return itemHandler.cast(); } return super.getCapability(cap, side); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java index a46fe20799..acd3c43f3d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java @@ -4,7 +4,7 @@ import com.hollingsworth.arsnouveau.api.source.AbstractSourceMachine; import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.block.SourceJar; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java index 5aa54f7817..af04705ab9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java @@ -7,13 +7,13 @@ import com.hollingsworth.arsnouveau.api.util.SourceUtil; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.block.ITickable; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.eventbus.api.Event; +import net.neoforged.bus.api.Event; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.core.animatable.GeoAnimatable; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java index 4c2f148fd1..613fcbd2d6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java @@ -28,7 +28,7 @@ import net.minecraft.world.level.block.state.properties.SculkSensorPhase; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; - +import var; import java.util.List; import java.util.Objects; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java index 8f23dcb238..ecbe804829 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java @@ -41,12 +41,12 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.IItemHandler; +import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.common.capabilities.Capability; +import net.neoforged.neoforge.common.util.LazyOptional; +import net.neoforged.neoforge.items.IItemHandler; import org.jetbrains.annotations.Nullable; - +import record; import java.util.*; @@ -88,7 +88,7 @@ public InventoryManager getInvManager(@Nullable String tab) { @Override public LazyOptional getCapability(Capability cap, Direction side) { - if (!this.remove && cap == ForgeCapabilities.ITEM_HANDLER) { + if (!this.remove && cap == Capabilities.ITEM_HANDLER) { StorageLecternTile lecternTile = getMainLectern(); if (lecternTile == null) { this.lecternInvWrapper = LazyOptional.of(() -> new LecternInvWrapper(this)); @@ -98,7 +98,7 @@ public LazyOptional getCapability(Capability cap, Direction side) { for (BlockPos pos : lecternTile.connectedInventories) { BlockEntity invTile = lecternTile.level.getBlockEntity(pos); if (invTile != null) { - IItemHandler lih = invTile.getCapability(ForgeCapabilities.ITEM_HANDLER, null).orElse(null); + IItemHandler lih = invTile.getCapability(Capabilities.ITEM_HANDLER, null).orElse(null); if (lih == null) { continue; } @@ -265,7 +265,7 @@ public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable Dir PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.storage.no_tile")); return; } - IItemHandler handler = tile.getCapability(ForgeCapabilities.ITEM_HANDLER, side).orElse(null); + IItemHandler handler = tile.getCapability(Capabilities.ITEM_HANDLER, side).orElse(null); if (handler == null) { PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.storage.no_tile")); return; @@ -367,7 +367,7 @@ public void updateItems() { if (invTile == null) { continue; } - IItemHandler handler = invTile.getCapability(ForgeCapabilities.ITEM_HANDLER, null).orElse(null); + IItemHandler handler = invTile.getCapability(Capabilities.ITEM_HANDLER, null).orElse(null); if (handler == null) { continue; } @@ -430,7 +430,7 @@ public void insertNearbyItems(){ BlockEntity tile = this.level.getBlockEntity(pos); if(tile == null || mainLectern.connectedInventories.contains(pos)) continue; - IItemHandler handler = tile.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null); + IItemHandler handler = tile.getCapability(Capabilities.ITEM_HANDLER).orElse(null); if(handler == null) continue; for(int i = 0; i < handler.getSlots(); i++){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SummoningTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SummoningTile.java index b2d998867b..f91b3db3c3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SummoningTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SummoningTile.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.block.tile; import com.hollingsworth.arsnouveau.common.block.ITickable; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VitalicSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VitalicSourcelinkTile.java index b190ed5146..c4f2a8425e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VitalicSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VitalicSourcelinkTile.java @@ -11,13 +11,13 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; -import net.minecraftforge.event.entity.living.BabyEntitySpawnEvent; -import net.minecraftforge.event.entity.living.LivingDeathEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.ModList; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.entity.living.BabyEntitySpawnEvent; +import net.neoforged.neoforge.event.entity.living.LivingDeathEvent; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class VitalicSourcelinkTile extends SourcelinkTile { public VitalicSourcelinkTile(BlockEntityType tileEntityTypeIn, BlockPos pos, BlockState state) { super(tileEntityTypeIn, pos, state); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java index fb46d15642..74d0bbd424 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java @@ -14,8 +14,8 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; -import net.minecraftforge.common.ForgeHooks; -import net.minecraftforge.common.Tags; +import net.neoforged.neoforge.common.CommonHooks; +import net.neoforged.neoforge.common.Tags; import software.bernie.geckolib.core.animatable.GeoAnimatable; import java.util.concurrent.atomic.AtomicBoolean; @@ -74,7 +74,7 @@ public boolean canConsumeEntireItem(ItemStack i){ public int getSourceValue(ItemStack i) { int source = 0; int progress = 0; - int burnTime = ForgeHooks.getBurnTime(i, null); + int burnTime = CommonHooks.getBurnTime(i, null); if (burnTime > 0) { source = burnTime / 12; progress = 1; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java index b83da4807d..990757c229 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java @@ -35,8 +35,8 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.items.IItemHandler; +import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.items.IItemHandler; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -101,7 +101,7 @@ public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable Liv if(blockEntity == null){ return; } - IItemHandler itemHandler = blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null); + IItemHandler itemHandler = blockEntity.getCapability(Capabilities.ITEM_HANDLER).orElse(null); if(itemHandler == null){ return; } @@ -243,7 +243,7 @@ public void updateInventories() { BlockEntity blockEntity = level.getBlockEntity(bPos); if(blockEntity == null || blockEntity instanceof ArcanePedestalTile) continue; - if(!blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER).isPresent()) + if(!blockEntity.getCapability(Capabilities.ITEM_HANDLER).isPresent()) continue; cachedInventories.add(bPos.immutable()); } @@ -304,7 +304,7 @@ private Map getInventoryCount() { stale.add(p); continue; } - IItemHandler handler = blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null); + IItemHandler handler = blockEntity.getCapability(Capabilities.ITEM_HANDLER).orElse(null); if(handler == null) { stale.add(p); continue; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/camera/ANIChunkStorageProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/camera/ANIChunkStorageProvider.java index fe3b5bd838..2adb7c981c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/camera/ANIChunkStorageProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/camera/ANIChunkStorageProvider.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.common.camera; import net.minecraft.client.multiplayer.ClientChunkCache; +import net.minecraft.client.multiplayer.ClientChunkCache.Storage; /** * https://github.com/Geforce132/SecurityCraft/blob/34699802f2ab334ab3e3f5e6412a5d74879b8ba8/src/main/java/net/geforcemods/securitycraft/misc/IChunkStorageProvider.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java index fd2db04dc7..f8d64855f9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java @@ -14,12 +14,12 @@ import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.TickEvent; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID, value = Dist.CLIENT) +@EventBusSubscriber(modid = ArsNouveau.MODID, value = Dist.CLIENT) public class CameraController { public static CameraType previousCameraType; public static boolean resetOverlaysAfterDismount = false; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraEvents.java index dda37ab52c..373174c804 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraEvents.java @@ -7,15 +7,15 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; -import net.minecraftforge.event.entity.living.LivingHurtEvent; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent.LeftClickBlock; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent; +import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; +import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent.LeftClickBlock; // https://github.com/Geforce132/SecurityCraft/blob/fbef0c9d3f5959f09f2f0a1a351a9a86604566ed/src/main/java/net/geforcemods/securitycraft/SCEventHandler.java -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class CameraEvents { @SubscribeEvent diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/camera/ClientCameraEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/camera/ClientCameraEvents.java index 2da0814b86..a692893dad 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/camera/ClientCameraEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/camera/ClientCameraEvents.java @@ -2,16 +2,16 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.util.ClientCameraUtil; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.event.InputEvent; -import net.minecraftforge.client.event.RenderGuiOverlayEvent; -import net.minecraftforge.client.event.RenderHandEvent; -import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.event.InputEvent; +import net.neoforged.neoforge.client.event.RenderGuiOverlayEvent; +import net.neoforged.neoforge.client.event.RenderHandEvent; +import net.neoforged.neoforge.client.gui.overlay.VanillaGuiOverlay; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID, value = Dist.CLIENT) +@EventBusSubscriber(modid = ArsNouveau.MODID, value = Dist.CLIENT) public class ClientCameraEvents { @SubscribeEvent diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerCapAttacher.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerCapAttacher.java index d6768fb2c1..3848f1ae89 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerCapAttacher.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerCapAttacher.java @@ -6,11 +6,11 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.common.util.INBTSerializable; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.neoforged.neoforge.common.capabilities.Capability; +import net.neoforged.neoforge.common.capabilities.ICapabilityProvider; +import net.neoforged.neoforge.common.util.INBTSerializable; +import net.neoforged.neoforge.common.util.LazyOptional; +import net.neoforged.neoforge.event.AttachCapabilitiesEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/IPlayerCap.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/IPlayerCap.java index 93de69ac73..58d6f7b15b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/capability/IPlayerCap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/capability/IPlayerCap.java @@ -4,8 +4,7 @@ import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.common.util.INBTSerializable; - +import net.neoforged.neoforge.common.util.INBTSerializable; import javax.annotation.Nullable; import java.util.Collection; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCapAttacher.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCapAttacher.java index f4baa89973..6226902f7b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCapAttacher.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCapAttacher.java @@ -7,11 +7,11 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.common.util.INBTSerializable; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.neoforged.neoforge.common.capabilities.Capability; +import net.neoforged.neoforge.common.capabilities.ICapabilityProvider; +import net.neoforged.neoforge.common.util.INBTSerializable; +import net.neoforged.neoforge.common.util.LazyOptional; +import net.neoforged.neoforge.event.AttachCapabilitiesEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/command/PathCommand.java b/src/main/java/com/hollingsworth/arsnouveau/common/command/PathCommand.java index 473c3c326e..84c73376c6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/command/PathCommand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/command/PathCommand.java @@ -8,7 +8,7 @@ import net.minecraft.commands.Commands; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; -import net.minecraftforge.network.PacketDistributor; +import net.neoforged.neoforge.network.PacketDistributor; public class PathCommand { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/command/ToggleLightCommand.java b/src/main/java/com/hollingsworth/arsnouveau/common/command/ToggleLightCommand.java index 2d807886db..a098d92f87 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/command/ToggleLightCommand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/command/ToggleLightCommand.java @@ -8,7 +8,7 @@ import net.minecraft.commands.Commands; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.PacketDistributor; +import net.neoforged.neoforge.network.PacketDistributor; public class ToggleLightCommand { public static void register(CommandDispatcher dispatcher) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java index c52580e47e..e5c4886f0f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java @@ -5,7 +5,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.registries.ForgeRegistries; import vazkii.patchouli.api.PatchouliAPI; import vazkii.patchouli.client.book.gui.GuiBookEntry; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BookUpgradeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BookUpgradeRecipe.java index b81e5d02a9..59ddfc8449 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BookUpgradeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BookUpgradeRecipe.java @@ -14,7 +14,7 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.ShapelessRecipe; -import net.minecraftforge.common.crafting.CraftingHelper; +import net.neoforged.neoforge.common.crafting.CraftingHelper; public class BookUpgradeRecipe extends ShapelessRecipe { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java index 6fc800bca1..58e743c067 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java @@ -17,7 +17,7 @@ import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java index e34e9ca8ed..96fa89fbc3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java @@ -17,8 +17,8 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.ShapelessRecipe; -import net.minecraftforge.common.Tags; -import net.minecraftforge.common.crafting.CraftingHelper; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.common.crafting.CraftingHelper; import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java index 3cee8b4d8c..4fc8c92a01 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java @@ -20,8 +20,7 @@ import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; -import net.minecraftforge.registries.RegistryObject; - +import net.neoforged.neoforge.registries.RegistryObject; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java index fd82efaa09..9850e5548c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java @@ -7,10 +7,15 @@ import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; import com.hollingsworth.arsnouveau.common.block.tile.ImbuementTile; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import net.minecraft.core.DefaultedRegistry; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.Registry; import net.minecraft.core.RegistryAccess; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.GsonHelper; +import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -20,9 +25,9 @@ import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; - +import net.neoforged.neoforge.registries.ForgeRegistries; +import net.neoforged.neoforge.registries.NeoForgeRegistries; +import net.neoforged.neoforge.registries.RegistryObject; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -89,7 +94,7 @@ public boolean matches(ImbuementTile pContainer, Level pLevel) { } @Override - public ItemStack assemble(ImbuementTile p_44001_, RegistryAccess p_267165_) { + public ItemStack assemble(ImbuementTile pCraftingContainer, HolderLookup.Provider pRegistries) { return ItemStack.EMPTY; } @@ -99,15 +104,10 @@ public boolean canCraftInDimensions(int p_43999_, int p_44000_) { } @Override - public ItemStack getResultItem(RegistryAccess p_267052_) { + public ItemStack getResultItem(HolderLookup.Provider pRegistries) { return ItemStack.EMPTY; } - @Override - public ResourceLocation getId() { - return id; - } - @Override public RecipeSerializer getSerializer() { return RecipeRegistry.IMBUEMENT_SERIALIZER.get(); @@ -115,7 +115,7 @@ public RecipeSerializer getSerializer() { @Override public RecipeType getType() { - return ForgeRegistries.RECIPE_TYPES.getValue(new ResourceLocation(ArsNouveau.MODID, RecipeRegistry.IMBUEMENT_RECIPE_ID)); + return BuiltInRegistries.RECIPE_TYPE.get(new ResourceLocation(ArsNouveau.MODID, RecipeRegistry.IMBUEMENT_RECIPE_ID)); } public JsonElement asRecipe() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java index c3bbf7cd3c..346307f5b6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java @@ -17,7 +17,7 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.ShapelessRecipe; -import net.minecraftforge.common.crafting.CraftingHelper; +import net.neoforged.neoforge.common.crafting.CraftingHelper; public class PotionFlaskRecipe extends ShapelessRecipe { public PotionFlaskRecipe(ResourceLocation idIn, String groupIn, ItemStack recipeOutputIn, NonNullList recipeItemsIn) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/RecipeUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/RecipeUtil.java index 025ffbee91..6009510608 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/RecipeUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/RecipeUtil.java @@ -7,7 +7,7 @@ import net.minecraft.core.NonNullList; import net.minecraft.util.GsonHelper; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraftforge.common.crafting.CraftingHelper; +import net.neoforged.neoforge.common.crafting.CraftingHelper; /** * https://github.com/Choonster-Minecraft-Mods/TestMod3/blob/1.14.4/src/main/java/choonster/testmod3/crafting/recipe/RecipeUtil.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ANAdvancements.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ANAdvancements.java index 776d0204ae..1740782959 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ANAdvancements.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ANAdvancements.java @@ -3,13 +3,12 @@ import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.common.data.ForgeAdvancementProvider; - +import net.neoforged.neoforge.common.data.AdvancementProvider; +import net.neoforged.neoforge.common.data.ExistingFileHelper; import java.util.List; import java.util.concurrent.CompletableFuture; -public class ANAdvancements extends ForgeAdvancementProvider { +public class ANAdvancements extends AdvancementProvider { public ANAdvancements(PackOutput output, CompletableFuture registries, ExistingFileHelper existingFileHelper) { super(output, registries, existingFileHelper, List.of(new com.hollingsworth.arsnouveau.common.datagen.advancement.ANAdvancements())); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java index 60a3131a6f..8c219d41d1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java @@ -10,7 +10,7 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.level.ItemLike; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.RegistryObject; import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java index c817039564..3ed759d050 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java @@ -20,8 +20,7 @@ import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Blocks; -import net.minecraftforge.common.Tags; - +import net.neoforged.neoforge.common.Tags; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AtlasProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AtlasProvider.java index dabb5f2b74..74e77967e1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AtlasProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AtlasProvider.java @@ -10,9 +10,8 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.properties.ChestType; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.common.data.SpriteSourceProvider; - +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.common.data.SpriteSourceProvider; import java.util.EnumMap; import java.util.Map; import java.util.Optional; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BiomeTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BiomeTagProvider.java index 87c3f2c14b..b0e23b04b8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BiomeTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BiomeTagProvider.java @@ -10,8 +10,8 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biomes; -import net.minecraftforge.common.Tags; -import net.minecraftforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.common.data.ExistingFileHelper; import org.jetbrains.annotations.Nullable; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java index 822379dbb5..59e1481bc1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java @@ -3,7 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; @@ -11,11 +11,11 @@ import net.minecraft.world.level.block.DoorBlock; import net.minecraft.world.level.block.SlabBlock; import net.minecraft.world.level.block.StairBlock; -import net.minecraftforge.client.model.generators.BlockStateProvider; -import net.minecraftforge.client.model.generators.ConfiguredModel; -import net.minecraftforge.client.model.generators.ModelFile; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.client.model.generators.BlockStateProvider; +import net.neoforged.neoforge.client.model.generators.ConfiguredModel; +import net.neoforged.neoforge.client.model.generators.ModelFile; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.registries.ForgeRegistries; public class BlockStatesDatagen extends BlockStateProvider { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java index 4c17b7e5c1..339207cb99 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.data.PackOutput; import net.minecraft.data.tags.IntrinsicHolderTagsProvider; @@ -12,10 +13,8 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; -import net.minecraftforge.common.Tags; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.registries.ForgeRegistries; - +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.common.data.ExistingFileHelper; import java.util.concurrent.CompletableFuture; public class BlockTagProvider extends IntrinsicHolderTagsProvider { @@ -36,7 +35,7 @@ public class BlockTagProvider extends IntrinsicHolderTagsProvider { public static TagKey CLUSTER_BLOCKS = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "golem/cluster")); public static TagKey BREAK_WITH_PICKAXE = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "break_with_pickaxe")); public static TagKey AUTOPULL_DISABLED = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "storage/autopull_disabled")); - public static TagKey RELOCATION_NOT_SUPPORTED = BlockTags.create(new ResourceLocation("forge", "relocation_not_supported")); + public static TagKey RELOCATION_NOT_SUPPORTED = BlockTags.create(new ResourceLocation("c", "relocation_not_supported")); public static TagKey OCCLUDES_SPELL_SENSOR = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "occludes_spell_sensor")); public static TagKey INTERACT_BLACKLIST = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "interact_blacklist")); public static TagKey CASCADING_LOGS = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "cascading_logs")); @@ -141,9 +140,9 @@ protected void addTags(HolderLookup.Provider pProvider) { this.tag(Tags.Blocks.CHESTS).add(BlockRegistry.ARCHWOOD_CHEST.get()); this.tag(Tags.Blocks.CHESTS_WOODEN).add(BlockRegistry.ARCHWOOD_CHEST.get()); for (String s : LibBlockNames.DECORATIVE_SOURCESTONE) { - Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(ArsNouveau.MODID, s)); - Block stair = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(ArsNouveau.MODID, s + "_stairs")); - Block slab = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(ArsNouveau.MODID, s + "_slab")); + Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s)); + Block stair = BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s + "_stairs")); + Block slab = BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s + "_slab")); this.tag(DECORATIVE_AN).add(block, stair, slab); this.tag(BlockTags.MINEABLE_WITH_PICKAXE).add(block, stair, slab); this.tag(BlockTags.STAIRS).add(stair); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CompostablesProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CompostablesProvider.java new file mode 100644 index 0000000000..6b2e98645c --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CompostablesProvider.java @@ -0,0 +1,57 @@ +package com.hollingsworth.arsnouveau.common.datagen; + + +import com.hollingsworth.arsnouveau.api.recipe.SummonRitualRecipe; +import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.neoforged.neoforge.common.data.DataMapProvider; +import net.neoforged.neoforge.registries.datamaps.DataMapType; +import net.neoforged.neoforge.registries.datamaps.builtin.Compostable; +import net.neoforged.neoforge.registries.datamaps.builtin.NeoForgeDataMaps; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class CompostablesProvider extends DataMapProvider { + + /** + * Create a new provider. + * + * @param packOutput the output location + * @param lookupProvider a {@linkplain CompletableFuture} supplying the registries + */ + protected CompostablesProvider(PackOutput packOutput, CompletableFuture lookupProvider) { + super(packOutput, lookupProvider); + } + + @Override + protected void gather() { + builder(NeoForgeDataMaps.COMPOSTABLES) + .add(BlockRegistry.BLAZING_SAPLING.getResourceLocation(), new Compostable(0.3f), false) + .add(BlockRegistry.CASCADING_SAPLING.getResourceLocation(), new Compostable(0.3f), false) + .add(BlockRegistry.FLOURISHING_SAPLING.getResourceLocation(), new Compostable(0.3f), false) + .add(BlockRegistry.VEXING_SAPLING.getResourceLocation(), new Compostable(0.3f), false) + .add(BlockRegistry.SOURCEBERRY_BUSH.getResourceLocation(), new Compostable(0.3f), false) + .add(ItemsRegistry.MAGE_BLOOM.getResourceLocation(), new Compostable(0.65f), false) + .add(BlockRegistry.MAGE_BLOOM_CROP.getResourceLocation(), new Compostable(0.65f), false) + .add(BlockRegistry.BOMBEGRANTE_POD.getResourceLocation(), new Compostable(0.65f), false) + .add(BlockRegistry.MENDOSTEEN_POD.getResourceLocation(), new Compostable(0.65f), false) + .add(BlockRegistry.FROSTAYA_POD.getResourceLocation(), new Compostable(0.65f), false) + .add(BlockRegistry.BASTION_POD.getResourceLocation(), new Compostable(0.65f), false) + .add(BlockRegistry.FLOURISHING_LEAVES.getResourceLocation(), new Compostable(0.3f), false) + .add(BlockRegistry.VEXING_LEAVES.getResourceLocation(), new Compostable(0.3f), false) + .add(BlockRegistry.CASCADING_LEAVE.getResourceLocation(), new Compostable(0.3f), false) + .add(BlockRegistry.BLAZING_LEAVES.getResourceLocation(), new Compostable(0.3f), false) + .build(); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CrushRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CrushRecipeProvider.java index 146a547fa2..84ce72ad9f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CrushRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CrushRecipeProvider.java @@ -8,8 +8,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.block.Blocks; -import net.minecraftforge.common.Tags; - +import net.neoforged.neoforge.common.Tags; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; @@ -24,12 +23,12 @@ public CrushRecipeProvider(DataGenerator generatorIn) { @Override public void collectJsons(CachedOutput pOutput) { - recipes.add(new CrushRecipe("stone", Ingredient.of(Tags.Items.STONE)) + recipes.add(new CrushRecipe("stone", Ingredient.of(Tags.Items.STONES)) .withItems(Items.GRAVEL.getDefaultInstance(), 1.0f)); - recipes.add(new CrushRecipe("gravel", Ingredient.of(Tags.Items.GRAVEL)) + recipes.add(new CrushRecipe("gravel", Ingredient.of(Tags.Items.GRAVELS)) .withItems(Items.SAND.getDefaultInstance(), 1.0f) .withItems(Items.FLINT.getDefaultInstance(), 0.02f)); - recipes.add(new CrushRecipe("cobblestone", Ingredient.of(Tags.Items.COBBLESTONE)).withItems(Items.GRAVEL.getDefaultInstance(), 1.0f)); + recipes.add(new CrushRecipe("cobblestone", Ingredient.of(Tags.Items.COBBLESTONES)).withItems(Items.GRAVEL.getDefaultInstance(), 1.0f)); recipes.add(new CrushRecipe("white_dye", Ingredient.of(Items.LILY_OF_THE_VALLEY)).withItems(new ItemStack(Items.WHITE_DYE, 2))); recipes.add(new CrushRecipe("orange_dye", Ingredient.of(Items.ORANGE_TULIP)).withItems(new ItemStack(Items.ORANGE_DYE, 2))); recipes.add(new CrushRecipe("magenta_dye", Ingredient.of(Items.ALLIUM)).withItems(new ItemStack(Items.MAGENTA_DYE, 2))); @@ -53,7 +52,7 @@ public void collectJsons(CachedOutput pOutput) { recipes.add(new CrushRecipe("terracotta", Ingredient.of(Items.TERRACOTTA)).withItems(Items.RED_SAND.getDefaultInstance())); recipes.add(new CrushRecipe("sugar_cane", Ingredient.of(Items.SUGAR_CANE)).withItems(new ItemStack(Items.SUGAR, 2))); recipes.add(new CrushRecipe("sandstone_to_sand", Ingredient.of(Items.SANDSTONE)).withItems(Items.SAND.getDefaultInstance())); - recipes.add(new CrushRecipe("quartz_block_to_quartz", Ingredient.of(Tags.Items.STORAGE_BLOCKS_QUARTZ)).withItems((new ItemStack(Items.QUARTZ, 4)))); + recipes.add(new CrushRecipe("quartz_block_to_quartz", Ingredient.of(ItemTagProvider.STORAGE_BLOCKS_QUARTZ)).withItems((new ItemStack(Items.QUARTZ, 4)))); recipes.add(new CrushRecipe("glowstone_block_to_dust", Ingredient.of(Blocks.GLOWSTONE)).withItems((new ItemStack(Items.GLOWSTONE_DUST, 4)))); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DamageTypesProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DamageTypesProvider.java index 29e0e5e2b8..6f1e40b543 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DamageTypesProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DamageTypesProvider.java @@ -7,13 +7,13 @@ import net.minecraft.core.registries.Registries; import net.minecraft.data.PackOutput; import net.minecraft.data.tags.DamageTypeTagsProvider; -import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.DamageTypeTags; import net.minecraft.tags.TagKey; import net.minecraft.world.damagesource.DamageType; -import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; -import net.minecraftforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; +import net.neoforged.neoforge.common.data.ExistingFileHelper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -25,7 +25,7 @@ public class DamageTypesProvider extends DatapackBuiltinEntriesProvider { .add(Registries.DAMAGE_TYPE, DamageTypesProvider::bootstrap); - public static void bootstrap(BootstapContext ctx) { + public static void bootstrap(BootstrapContext ctx) { ctx.register(DamageTypesRegistry.GENERIC_SPELL_DAMAGE, new DamageType("player", 0.1F)); ctx.register(DamageTypesRegistry.COLD_SNAP, new DamageType("freeze", 0.1F)); ctx.register(DamageTypesRegistry.FLARE, new DamageType("fire", 0.1F)); @@ -48,7 +48,7 @@ public String getName() { public static class DamageTypesTagsProvider extends DamageTypeTagsProvider { - TagKey FORGE_MAGIC = TagKey.create(Registries.DAMAGE_TYPE, new ResourceLocation("forge", "is_magic")); + TagKey FORGE_MAGIC = TagKey.create(Registries.DAMAGE_TYPE, new ResourceLocation("c", "is_magic")); public DamageTypesTagsProvider(PackOutput pPackOutput, CompletableFuture provider, @Nullable ExistingFileHelper existingFileHelper) { super(pPackOutput, provider, ArsNouveau.MODID, existingFileHelper); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java index 3ba418c3d2..ef0280be1e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java @@ -5,21 +5,24 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.common.block.AlterationTable; -import com.hollingsworth.arsnouveau.common.block.ArchfruitPod; -import com.hollingsworth.arsnouveau.common.block.ScribesBlock; -import com.hollingsworth.arsnouveau.common.block.ThreePartBlock; +import com.hollingsworth.arsnouveau.common.block.*; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.BlockRegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.advancements.critereon.StatePropertiesPredicate; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.WritableRegistry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.PackOutput; import net.minecraft.data.loot.BlockLootSubProvider; import net.minecraft.data.loot.EntityLootSubProvider; import net.minecraft.data.loot.LootTableProvider; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.ProblemReporter; import net.minecraft.util.StringRepresentable; import net.minecraft.world.entity.EntityType; import net.minecraft.world.flag.FeatureFlags; @@ -35,7 +38,6 @@ import net.minecraft.world.level.storage.loot.LootPool; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.ValidationContext; -import net.minecraft.world.level.storage.loot.entries.DynamicLoot; import net.minecraft.world.level.storage.loot.entries.LootItem; import net.minecraft.world.level.storage.loot.functions.*; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; @@ -43,18 +45,16 @@ import net.minecraft.world.level.storage.loot.providers.nbt.ContextNbtProvider; import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; - import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.function.BiConsumer; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; public class DefaultTableProvider extends LootTableProvider { - public DefaultTableProvider(PackOutput pOutput) { - super(pOutput, new HashSet<>(), List.of(new LootTableProvider.SubProviderEntry(BlockLootTable::new, LootContextParamSets.BLOCK), new LootTableProvider.SubProviderEntry(EntityLootTable::new, LootContextParamSets.ENTITY))); + public DefaultTableProvider(PackOutput pOutput, CompletableFuture pRegistries) { + super(pOutput, new HashSet<>(), List.of(new LootTableProvider.SubProviderEntry(BlockLootTable::new, LootContextParamSets.BLOCK), new LootTableProvider.SubProviderEntry(EntityLootTable::new, LootContextParamSets.ENTITY)), pRegistries); } private static final float[] DEFAULT_SAPLING_DROP_RATES = new float[]{0.05F, 0.0625F, 0.083333336F, 0.1F}; @@ -160,9 +160,9 @@ protected void generate() { registerDropSelf(BlockRegistry.POTION_DIFFUSER); for (String s : LibBlockNames.DECORATIVE_SOURCESTONE) { registerDropSelf(BlockRegistry.getBlock(s)); - Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(ArsNouveau.MODID, s + "_stairs")); + Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s + "_stairs")); registerDropSelf(block); - Block slab = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(ArsNouveau.MODID, s + "_slab")); + Block slab = BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s + "_slab")); registerDropSelf(slab); } @@ -183,14 +183,12 @@ protected void generate() { .setRolls(ConstantValue.exactly(1)) .add(LootItem.lootTableItem(BlockRegistry.POTION_JAR) .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) - .apply(CopyNbtFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) - .copy("potionData", "BlockEntityTag.potionData", CopyNbtFunction.MergeStrategy.REPLACE) - .copy("currentFill", "BlockEntityTag.currentFill", CopyNbtFunction.MergeStrategy.REPLACE) - .copy("locked", "BlockEntityTag.locked", CopyNbtFunction.MergeStrategy.REPLACE) - .copy("potionNames", "potionNames", CopyNbtFunction.MergeStrategy.REPLACE) - .copy("currentFill", "fill", CopyNbtFunction.MergeStrategy.REPLACE)) - .apply(SetContainerContents.setContents(BlockRegistry.POTION_JAR_TYPE.get()) - .withEntry(DynamicLoot.dynamicEntry(new ResourceLocation("minecraft", "contents")))) + .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) + .copy("potionData", "BlockEntityTag.potionData", CopyCustomDataFunction.MergeStrategy.REPLACE) + .copy("currentFill", "BlockEntityTag.currentFill", CopyCustomDataFunction.MergeStrategy.REPLACE) + .copy("locked", "BlockEntityTag.locked", CopyCustomDataFunction.MergeStrategy.REPLACE) + .copy("potionNames", "potionNames", CopyCustomDataFunction.MergeStrategy.REPLACE) + .copy("currentFill", "fill", CopyCustomDataFunction.MergeStrategy.REPLACE)) ); add(BlockRegistry.POTION_JAR.get(), LootTable.lootTable().withPool(potionJarBuilder)); add(BlockRegistry.BASTION_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.BASTION_POD.asItem(), BlockRegistry.BASTION_POD.get()))); @@ -202,11 +200,9 @@ protected void generate() { .setRolls(ConstantValue.exactly(1)) .add(LootItem.lootTableItem(BlockRegistry.MOB_JAR) .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) - .apply(CopyNbtFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) - .copy("entityTag", "BlockEntityTag.entityTag", CopyNbtFunction.MergeStrategy.REPLACE) - .copy("entityId", "entityId", CopyNbtFunction.MergeStrategy.REPLACE)) - .apply(SetContainerContents.setContents(BlockRegistry.MOB_JAR_TILE.get()) - .withEntry(DynamicLoot.dynamicEntry(new ResourceLocation("minecraft", "contents")))) + .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) + .copy("entityTag", "BlockEntityTag.entityTag", CopyCustomDataFunction.MergeStrategy.REPLACE) + .copy("entityId", "entityId", CopyCustomDataFunction.MergeStrategy.REPLACE)) ); add(BlockRegistry.MOB_JAR.get(), LootTable.lootTable().withPool(mobJarBuilder)); //CustomName @@ -235,12 +231,12 @@ protected void add(Block pBlock, Function pFactory) { } - protected void add(RegistryWrapper pBlock, LootTable.Builder pBuilder) { + protected void add(RegistryWrapper pBlock, LootTable.Builder pBuilder) { add(pBlock.get(), pBuilder); } - protected void add(RegistryWrapper pBlock, Function pFactory) { + protected void add(RegistryWrapper pBlock, Function pFactory) { add(pBlock.get(), pFactory); } @@ -257,11 +253,9 @@ public LootTable.Builder createManaManchineTable(Block block) { .setRolls(ConstantValue.exactly(1)) .add(LootItem.lootTableItem(block) .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) - .apply(CopyNbtFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) - .copy("inv", "BlockEntityTag.inv", CopyNbtFunction.MergeStrategy.REPLACE) //addOperation - .copy("source", "BlockEntityTag.source", CopyNbtFunction.MergeStrategy.REPLACE)) - .apply(SetContainerContents.setContents(BlockRegistry.SOURCE_JAR_TILE.get()) - .withEntry(DynamicLoot.dynamicEntry(new ResourceLocation("minecraft", "contents")))) + .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) + .copy("inv", "BlockEntityTag.inv", CopyCustomDataFunction.MergeStrategy.REPLACE) //addOperation + .copy("source", "BlockEntityTag.source", CopyCustomDataFunction.MergeStrategy.REPLACE)) ); return LootTable.lootTable().withPool(builder); } @@ -275,21 +269,23 @@ protected void registerSlabItemTable(Block p_124291_) { } // Override and ignore the missing loot table error + + @Override - public void generate(BiConsumer p_249322_) { + public void generate(HolderLookup.Provider pRegistries, BiConsumer, LootTable.Builder> pGenerator) { this.generate(); - Set set = new HashSet<>(); + Set> set = new HashSet<>(); for (Block block : list) { if (block.isEnabled(this.enabledFeatures)) { - ResourceLocation resourcelocation = block.getLootTable(); + ResourceKey resourcelocation = block.getLootTable(); if (resourcelocation != BuiltInLootTables.EMPTY && set.add(resourcelocation)) { LootTable.Builder loottable$builder = this.map.remove(resourcelocation); if (loottable$builder == null) { continue; } - p_249322_.accept(resourcelocation, loottable$builder); + pGenerator.accept(resourcelocation, loottable$builder); } } } @@ -311,9 +307,8 @@ public void registerDropDoor(Block block) { this.add(block, createDoorTable(block)); } - public void registerDropSelf(RegistryWrapper block) { - list.add((Block) block.get()); - dropSelf((Block) block.get()); + private void registerDropSelf(BlockRegistryWrapper block) { + registerDropSelf(block.get()); } public void registerDropSelf(Block block) { @@ -321,11 +316,6 @@ public void registerDropSelf(Block block) { dropSelf(block); } - public void registerDropSelf(RegistryObject block) { - list.add(block.get()); - dropSelf(block.get()); - } - public void registerDrop(Block input, ItemLike output) { list.add(input); dropOther(input, output); @@ -333,14 +323,14 @@ public void registerDrop(Block input, ItemLike output) { @Override protected Iterable getKnownBlocks() { - return ForgeRegistries.BLOCKS.getValues().stream().filter(block -> ForgeRegistries.BLOCKS.getKey(block).getNamespace().equals(ArsNouveau.MODID)).collect(Collectors.toList()); + return BuiltInRegistries.BLOCK.stream().filter(block -> BuiltInRegistries.BLOCK.getKey(block).getNamespace().equals(ArsNouveau.MODID)).collect(Collectors.toList()); } } public static class EntityLootTable extends EntityLootSubProvider { - private final Map, Map> map = Maps.newHashMap(); + private final Map, Map, LootTable.Builder>> map = Maps.newHashMap(); protected EntityLootTable() { super(FeatureFlags.REGISTRY.allFlags()); @@ -375,7 +365,7 @@ protected void add(EntityType pEntityType, LootTable.Builder pBuilder) { } @Override - protected void add(EntityType pEntityType, ResourceLocation pLootTableLocation, LootTable.Builder pBuilder) { + protected void add(EntityType pEntityType, ResourceKey pLootTableLocation, LootTable.Builder pBuilder) { super.add(pEntityType, pLootTableLocation, pBuilder); this.map.computeIfAbsent(pEntityType, (p_249004_) -> { return Maps.newHashMap(); @@ -383,27 +373,27 @@ protected void add(EntityType pEntityType, ResourceLocation pLootTableLocatio } @Override - public void generate(BiConsumer p_251751_) { + public void generate(HolderLookup.Provider pRegistries, BiConsumer, LootTable.Builder> pGenerator) { this.generate(); - Set set = Sets.newHashSet(); + Set> set = Sets.newHashSet(); this.getKnownEntityTypes().map(EntityType::builtInRegistryHolder).forEach((p_249003_) -> { EntityType entitytype = p_249003_.value(); if (canHaveLootTable(entitytype)) { - Map map = this.map.remove(entitytype); - ResourceLocation resourcelocation = entitytype.getDefaultLootTable(); + Map, LootTable.Builder> map = this.map.remove(entitytype); + ResourceKey resourcelocation = entitytype.getDefaultLootTable(); if (map != null) { map.forEach((p_250376_, p_250972_) -> { if (!set.add(p_250376_)) { throw new IllegalStateException(String.format(Locale.ROOT, "Duplicate loottable '%s' for '%s'", p_250376_, p_249003_.key().location())); } else { - p_251751_.accept(p_250376_, p_250972_); + pGenerator.accept(p_250376_, p_250972_); } }); } } else { - Map map1 = this.map.remove(entitytype); + Map, LootTable.Builder> map1 = this.map.remove(entitytype); if (map1 != null) { - throw new IllegalStateException(String.format(Locale.ROOT, "Weird loottables '%s' for '%s', not a LivingEntity so should not have loot", map1.keySet().stream().map(ResourceLocation::toString).collect(Collectors.joining(",")), p_249003_.key().location())); + throw new IllegalStateException(String.format(Locale.ROOT, "Weird loottables '%s' for '%s', not a LivingEntity so should not have loot", map1.keySet().stream().map(ResourceKey::toString).collect(Collectors.joining(",")), p_249003_.key().location())); } } @@ -412,12 +402,12 @@ public void generate(BiConsumer p_251751_) @Override protected Stream> getKnownEntityTypes() { - return ForgeRegistries.ENTITY_TYPES.getValues().stream().filter(block -> ForgeRegistries.ENTITY_TYPES.getKey(block).getNamespace().equals(ArsNouveau.MODID)).toList().stream(); + return BuiltInRegistries.ENTITY_TYPE.stream().filter(block -> BuiltInRegistries.ENTITY_TYPE.getKey(block).getNamespace().equals(ArsNouveau.MODID)).toList().stream(); } } @Override - protected void validate(Map map, ValidationContext validationtracker) { + protected void validate(WritableRegistry writableregistry, ValidationContext validationcontext, ProblemReporter.Collector problemreporter$collector) { } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DyeRecipeDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DyeRecipeDatagen.java index 28f03f558b..fd66360fbf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DyeRecipeDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DyeRecipeDatagen.java @@ -6,7 +6,7 @@ import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; import net.minecraft.world.level.ItemLike; - +import record; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java index f4b8883fdb..b7c9fc6a7d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java @@ -9,8 +9,8 @@ import net.minecraft.data.tags.EntityTypeTagsProvider; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; -import net.minecraftforge.common.Tags; -import net.minecraftforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.common.data.ExistingFileHelper; import org.jetbrains.annotations.Nullable; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java index 92a9ce3d86..d2334aca13 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java @@ -16,8 +16,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraftforge.common.Tags; - +import net.neoforged.neoforge.common.Tags; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java index 4a74db4a65..48e8afa186 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java @@ -10,8 +10,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraftforge.common.Tags; - +import net.neoforged.neoforge.common.Tags; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java index d8ab7390e4..df74f7cf58 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java @@ -11,16 +11,15 @@ import com.hollingsworth.arsnouveau.common.items.PerkItem; import com.hollingsworth.arsnouveau.common.items.RitualTablet; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; -import net.minecraftforge.client.model.generators.ItemModelProvider; -import net.minecraftforge.client.model.generators.ModelFile; -import net.minecraftforge.common.data.ExistingFileHelper; - +import net.neoforged.neoforge.client.model.generators.ItemModelProvider; +import net.neoforged.neoforge.client.model.generators.ModelFile; +import net.neoforged.neoforge.common.data.ExistingFileHelper; import java.util.function.Supplier; import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java index 90e4285078..94271377a0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java @@ -12,10 +12,8 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; -import net.minecraftforge.common.Tags; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.versions.forge.ForgeVersion; - +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.common.data.ExistingFileHelper; import java.util.concurrent.CompletableFuture; public class ItemTagProvider extends IntrinsicHolderTagsProvider { @@ -26,13 +24,15 @@ public class ItemTagProvider extends IntrinsicHolderTagsProvider { public static TagKey MAGIC_FOOD = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "magic_food")); public static TagKey WILDEN_DROP_TAG = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "wilden_drop")); public static TagKey SHARD_TAG = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "golem/shard")); - public static TagKey BERRY_TAG = ItemTags.create(new ResourceLocation(ForgeVersion.MOD_ID, "fruits/berry")); + public static TagKey BERRY_TAG = ItemTags.create(new ResourceLocation("c", "fruits/berry")); public static final TagKey SUMMON_SHARDS_TAG = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "magic_shards")); public static TagKey JAR_ITEM_BLACKLIST = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "interact_jar_blacklist")); public static TagKey RITUAL_LOOT_BLACKLIST = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "ritual_loot_blacklist")); public static TagKey RITUAL_TRADE_BLACKLIST = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "ritual_trade_blacklist")); + public static TagKey STORAGE_BLOCKS_QUARTZ = ItemTags.create(new ResourceLocation("storage_blocks/quartz")); public static TagKey SHADY_WIZARD_FRUITS = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "shady_wizard_fruits")); + public ItemTagProvider(PackOutput output, CompletableFuture future, ExistingFileHelper helper) { super(output, Registries.ITEM, future, item -> item.builtInRegistryHolder().key(), ArsNouveau.MODID, helper); } @@ -120,7 +120,7 @@ protected void addTags(HolderLookup.Provider pProvider) { ); - this.tag(ItemTags.create(new ResourceLocation("forge", "planks/archwood"))) + this.tag(ItemTags.create(new ResourceLocation("c", "planks/archwood"))) .add(BlockRegistry.ARCHWOOD_PLANK.asItem()); this.tag(Tags.Items.SEEDS) .add(BlockRegistry.MAGE_BLOOM_CROP.asItem()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 637850b2d5..e9d1c37a10 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -14,8 +14,7 @@ import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; import net.minecraft.data.PackOutput; import net.minecraft.world.item.Item; -import net.minecraftforge.common.data.LanguageProvider; - +import net.neoforged.neoforge.common.data.LanguageProvider; import java.util.Map; import java.util.TreeMap; import java.util.function.Supplier; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java index 05075c099c..5be39ebce6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java @@ -4,15 +4,15 @@ import com.hollingsworth.arsnouveau.setup.registry.APIRegistry; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; -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.minecraftforge.fml.common.Mod; - +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.data.event.GatherDataEvent; import java.util.concurrent.CompletableFuture; -@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD) public class ModDatagen { @SubscribeEvent @@ -25,12 +25,12 @@ public static void datagen(GatherDataEvent event) { event.getGenerator().addProvider(event.includeServer(), new BlockTagProvider(output, provider, fileHelper)); event.getGenerator().addProvider(event.includeClient(), new LangDatagen(output, ArsNouveau.MODID, "en_us")); - event.getGenerator().addProvider(event.includeServer(), new RecipeDatagen(output)); + event.getGenerator().addProvider(event.includeServer(), new RecipeDatagen(output, provider)); event.getGenerator().addProvider(event.includeServer(), new BlockStatesDatagen(output, ArsNouveau.MODID, fileHelper)); event.getGenerator().addProvider(event.includeServer(), new GlyphRecipeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new ApparatusRecipeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new PatchouliProvider(event.getGenerator())); - event.getGenerator().addProvider(event.includeServer(), new DefaultTableProvider(output)); + event.getGenerator().addProvider(event.includeServer(), new DefaultTableProvider(output, provider)); event.getGenerator().addProvider(event.includeServer(), new ImbuementRecipeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new CrushRecipeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new ItemTagProvider(output, provider, fileHelper)); @@ -48,14 +48,11 @@ public static void datagen(GatherDataEvent event) { event.getGenerator().addProvider(event.includeClient(), new AtlasProvider(output, fileHelper)); event.getGenerator().addProvider(event.includeServer(), new DamageTypesProvider(output, provider)); event.getGenerator().addProvider(event.includeServer(), new DamageTypesProvider.DamageTypesTagsProvider(output, provider, fileHelper)); - - - + event.getGenerator().addProvider(event.includeServer(), new CompostablesProvider(output, provider)); DatapackBuiltinEntriesProvider datapackProvider = new WorldgenProvider(output, provider); event.getGenerator().addProvider(event.includeServer(), datapackProvider); CompletableFuture lookupProvider = datapackProvider.getRegistryProvider(); event.getGenerator().addProvider(event.includeServer(), new BiomeTagProvider(output, lookupProvider, fileHelper)); } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java index 20a9a1d28e..1b7f8dff7f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java @@ -30,9 +30,10 @@ import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.RegistryObject; import org.apache.commons.io.FilenameUtils; - +import record; +import var; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; @@ -40,6 +41,8 @@ import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; +import PatchouliPage; + // public class PatchouliProvider extends SimpleDataProvider{ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PlacedFeatureTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PlacedFeatureTagProvider.java index 58905e26f7..1e710eb094 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PlacedFeatureTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PlacedFeatureTagProvider.java @@ -9,7 +9,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.level.levelgen.placement.PlacedFeature; -import net.minecraftforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.common.data.ExistingFileHelper; import org.jetbrains.annotations.Nullable; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PotionEffectTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PotionEffectTagProvider.java index c8f05fe7e9..426c3fb1d4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PotionEffectTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PotionEffectTagProvider.java @@ -11,7 +11,7 @@ import net.minecraft.data.tags.IntrinsicHolderTagsProvider; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffects; -import net.minecraftforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.common.data.ExistingFileHelper; import org.jetbrains.annotations.Nullable; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java index 82ad0ac86b..4c2f187161 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java @@ -9,6 +9,8 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.advancements.critereon.InventoryChangeTrigger; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.PackOutput; import net.minecraft.data.recipes.*; import net.minecraft.resources.ResourceLocation; @@ -17,10 +19,9 @@ import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; -import net.minecraftforge.common.Tags; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.common.Tags; -import java.util.function.Consumer; +import java.util.concurrent.CompletableFuture; public class RecipeDatagen extends RecipeProvider { @@ -31,16 +32,16 @@ public class RecipeDatagen extends RecipeProvider { public static Ingredient SUMMON_SHARDS = Ingredient.of(ItemTagProvider.SUMMON_SHARDS_TAG); - public Consumer consumer; + public RecipeOutput consumer; - public RecipeDatagen(PackOutput pOutput) { - super(pOutput); + public RecipeDatagen(PackOutput pOutput, CompletableFuture pRegistries) { + super(pOutput, pRegistries); } @Override - protected void buildRecipes(Consumer pWriter) { + protected void buildRecipes(RecipeOutput pRecipeOutput) { { - this.consumer = pWriter; + this.consumer = pRecipeOutput; Block SOURCESTONE = BlockRegistry.getBlock(LibBlockNames.SOURCESTONE); @@ -60,7 +61,7 @@ protected void buildRecipes(Consumer pWriter) { ShapedRecipeBuilder.shaped(RecipeCategory.MISC, BlockRegistry.SOURCE_JAR).unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) .pattern("yyy") .pattern("x x") - .pattern("yyy").define('x', Tags.Items.GLASS).define('y', BlockRegistry.ARCHWOOD_SLABS).save(consumer); + .pattern("yyy").define('x', Tags.Items.GLASS_BLOCKS).define('y', BlockRegistry.ARCHWOOD_SLABS).save(consumer); ShapedRecipeBuilder.shaped(RecipeCategory.MISC, BlockRegistry.ARCANE_PEDESTAL.get()).unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) .pattern("xzx") @@ -79,7 +80,7 @@ protected void buildRecipes(Consumer pWriter) { .pattern(" ") .pattern("xyx") .pattern(" x ") - .define('x', Tags.Items.LEATHER) + .define('x', Tags.Items.LEATHERS) .define('y', SOURCE_GEM).save(consumer); ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ItemsRegistry.RING_OF_POTENTIAL).unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) @@ -109,7 +110,7 @@ protected void buildRecipes(Consumer pWriter) { ShapedRecipeBuilder.shaped(RecipeCategory.MISC, SOURCESTONE, 8).unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) .pattern("xxx") .pattern("xyx") - .pattern("xxx").define('y', SOURCE_GEM).define('x', Tags.Items.STONE).save(consumer); + .pattern("xxx").define('y', SOURCE_GEM).define('x', Tags.Items.STONES).save(consumer); ShapedRecipeBuilder.shaped(RecipeCategory.MISC, BlockRegistry.IMBUEMENT_BLOCK.asItem(), 1).unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) .pattern("xyx") @@ -130,7 +131,7 @@ protected void buildRecipes(Consumer pWriter) { ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ItemsRegistry.DENY_ITEM_SCROLL, 1).unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) .requires(ItemsRegistry.BLANK_PARCHMENT, 1) - .requires(Ingredient.of(Tags.Items.COBBLESTONE), 1) + .requires(Ingredient.of(Tags.Items.COBBLESTONES), 1) .save(consumer); ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ItemsRegistry.WARP_SCROLL).unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) @@ -434,7 +435,7 @@ protected void buildRecipes(Consumer pWriter) { .pattern("gxg") .define('x', BlockRegistry.ARCHWOOD_PLANK) .define('g', Ingredient.of(Tags.Items.INGOTS_GOLD)) - .define('n', Ingredient.of(Tags.Items.STORAGE_BLOCKS_QUARTZ)) + .define('n', Ingredient.of(ItemTagProvider.STORAGE_BLOCKS_QUARTZ)) .save(consumer); shapelessBuilder(Items.CHEST).requires(BlockRegistry.ARCHWOOD_CHEST).save(consumer, new ResourceLocation(ArsNouveau.MODID, "archwood_to_chest")); @@ -468,14 +469,14 @@ protected void buildRecipes(Consumer pWriter) { .pattern("xxx") .pattern("xyx") .pattern("xxx") - .define('x', Tags.Items.SAND) + .define('x', Tags.Items.SANDS) .define('y', ItemsRegistry.CONJURATION_ESSENCE) .save(consumer, new ResourceLocation(ArsNouveau.MODID, "conjuration_essence_to_soul_sand")); shapedBuilder(Items.END_STONE, 8) .pattern("xxx") .pattern("xyx") .pattern("xxx") - .define('x', Tags.Items.STONE) + .define('x', Tags.Items.STONES) .define('y', ItemsRegistry.CONJURATION_ESSENCE) .save(consumer, new ResourceLocation(ArsNouveau.MODID, "conjuration_essence_to_end_stone")); @@ -484,7 +485,7 @@ protected void buildRecipes(Consumer pWriter) { .pattern("xxx") .pattern("xyx") .pattern("xxx") - .define('x', Tags.Items.STONE) + .define('x', Tags.Items.STONES) .define('y', ItemsRegistry.FIRE_ESSENCE) .save(consumer, new ResourceLocation(ArsNouveau.MODID, "fire_essence_to_magma_block")); @@ -618,8 +619,8 @@ protected void buildRecipes(Consumer pWriter) { makeStonecutter(consumer, BlockRegistry.getBlock(LibBlockNames.SOURCESTONE), BlockRegistry.getBlock(s), LibBlockNames.SOURCESTONE); shapelessBuilder(SOURCESTONE).requires(BlockRegistry.getBlock(s)).save(consumer, new ResourceLocation(ArsNouveau.MODID, s + "_to_sourcestone")); - Block stair = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(ArsNouveau.MODID, s + "_stairs")); - Block slab = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(ArsNouveau.MODID, s + "_slab")); + Block stair = BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s + "_stairs")); + Block slab = BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s + "_slab")); SingleItemRecipeBuilder.stonecutting(Ingredient.of(BlockRegistry.getBlock(s)), RecipeCategory.BUILDING_BLOCKS, stair) .unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) .save(consumer, new ResourceLocation(ArsNouveau.MODID, s + "_stonecutter_stair")); @@ -657,13 +658,13 @@ protected void buildRecipes(Consumer pWriter) { shapedBuilder(BlockRegistry.MOB_JAR) .pattern("yyy") .pattern("x x") - .pattern("xxx").define('y', BlockRegistry.ARCHWOOD_SLABS).define('x', Ingredient.of(Tags.Items.GLASS)).save(consumer); + .pattern("xxx").define('y', BlockRegistry.ARCHWOOD_SLABS).define('x', Ingredient.of(Tags.Items.GLASS_BLOCKS)).save(consumer); shapelessBuilder(getRitualItem(RitualLib.CONTAINMENT)).requires(BlockRegistry.VEXING_LOG).requires(ItemsRegistry.MANIPULATION_ESSENCE).requires(Items.GLASS_BOTTLE, 3).save(consumer); shapedBuilder(BlockRegistry.VOID_PRISM) .pattern("xxx") .pattern("xyx") - .pattern("xxx").define('y', BlockRegistry.SPELL_PRISM).define('x', Ingredient.of(Tags.Items.OBSIDIAN)).save(consumer); + .pattern("xxx").define('y', BlockRegistry.SPELL_PRISM).define('x', Ingredient.of(Tags.Items.OBSIDIANS)).save(consumer); shapedBuilder(BlockRegistry.MAGEBLOOM_BLOCK) .pattern("xx ") @@ -708,7 +709,7 @@ protected void buildRecipes(Consumer pWriter) { shapedBuilder(BlockRegistry.ITEM_DETECTOR) .pattern("xxx") .pattern("xyx") - .pattern("zzz").define('x', Tags.Items.GLASS).define('y', Blocks.OBSERVER).define('z', BlockRegistry.ARCHWOOD_PLANK).save(consumer); + .pattern("zzz").define('x', Tags.Items.GLASS_BLOCKS).define('y', Blocks.OBSERVER).define('z', BlockRegistry.ARCHWOOD_PLANK).save(consumer); shapedBuilder(BlockRegistry.REPOSITORY) .pattern("yxy") .pattern("x x") @@ -750,11 +751,11 @@ public static ShapedRecipeBuilder makeWood(ItemLike logs, ItemLike wood, int cou .pattern("xx ").define('x', logs); } - private static void shapedWoodenTrapdoor(Consumer recipeConsumer, ItemLike trapdoor, ItemLike input) { + private static void shapedWoodenTrapdoor(RecipeOutput recipeConsumer, ItemLike trapdoor, ItemLike input) { ShapedRecipeBuilder.shaped(RecipeCategory.MISC, trapdoor, 2).define('#', input).pattern("###").pattern("###").group("wooden_trapdoor") .unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)).save(recipeConsumer); } - public static void shapedWoodenStairs(Consumer recipeConsumer, ItemLike stairs, ItemLike input) { + public static void shapedWoodenStairs(RecipeOutput recipeConsumer, ItemLike stairs, ItemLike input) { ShapedRecipeBuilder.shaped(RecipeCategory.MISC, stairs, 4) .define('#', input) .pattern("# ") @@ -763,7 +764,7 @@ public static void shapedWoodenStairs(Consumer recipeConsumer, I .save(recipeConsumer); } - public static void shapedWoodenStairs(Consumer recipeConsumer, ItemLike stairs, ItemLike input, String name) { + public static void shapedWoodenStairs(RecipeOutput recipeConsumer, ItemLike stairs, ItemLike input, String name) { ShapedRecipeBuilder.shaped(RecipeCategory.MISC,stairs, 4) .define('#', input) .pattern("# ") @@ -773,49 +774,49 @@ public static void shapedWoodenStairs(Consumer recipeConsumer, I } - private static void shapelessWoodenButton(Consumer recipeConsumer, ItemLike button, ItemLike input) { + private static void shapelessWoodenButton(RecipeOutput recipeConsumer, ItemLike button, ItemLike input) { ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, button).requires(input) .unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) .save(recipeConsumer); } - private static void strippedLogToWood(Consumer recipeConsumer, ItemLike stripped, ItemLike output) { + private static void strippedLogToWood(RecipeOutput recipeConsumer, ItemLike stripped, ItemLike output) { ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, output, 3).define('#', stripped).pattern("##").pattern("##").group("bark") .unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) .save(recipeConsumer); } - private static void shapedWoodenDoor(Consumer recipeConsumer, ItemLike door, ItemLike input) { + private static void shapedWoodenDoor(RecipeOutput recipeConsumer, ItemLike door, ItemLike input) { ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, door, 3).define('#', input).pattern("##").pattern("##").pattern("##").group("wooden_door") .unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) .save(recipeConsumer); } - private static void shapedWoodenFence(Consumer recipeConsumer, ItemLike fence, ItemLike input) { + private static void shapedWoodenFence(RecipeOutput recipeConsumer, ItemLike fence, ItemLike input) { ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, fence, 3).define('#', Items.STICK).define('W', input).pattern("W#W").pattern("W#W").group("wooden_fence") .unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) .save(recipeConsumer); } - private static void shapedWoodenFenceGate(Consumer recipeConsumer, ItemLike fenceGate, ItemLike input) { + private static void shapedWoodenFenceGate(RecipeOutput recipeConsumer, ItemLike fenceGate, ItemLike input) { ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, fenceGate).define('#', Items.STICK).define('W', input).pattern("#W#").pattern("#W#").group("wooden_fence_gate") .unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) .save(recipeConsumer); } - private static void shapedWoodenPressurePlate(Consumer recipeConsumer, ItemLike pressurePlate, ItemLike input) { + private static void shapedWoodenPressurePlate(RecipeOutput recipeConsumer, ItemLike pressurePlate, ItemLike input) { ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, pressurePlate).define('#', input).pattern("##").group("wooden_pressure_plate") .unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) .save(recipeConsumer); } - private static void shapedWoodenSlab(Consumer recipeConsumer, ItemLike slab, ItemLike input) { + private static void shapedWoodenSlab(RecipeOutput recipeConsumer, ItemLike slab, ItemLike input) { ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, slab, 6).define('#', input).pattern("###").group("wooden_slab") .unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) .save(recipeConsumer); } - private static void shapedWoodenSlab(Consumer recipeConsumer, ItemLike slab, ItemLike input, String name) { + private static void shapedWoodenSlab(RecipeOutput recipeConsumer, ItemLike slab, ItemLike input, String name) { ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, slab, 6).define('#', input).pattern("###").group("wooden_slab") .unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) .save(recipeConsumer, new ResourceLocation(ArsNouveau.MODID, name)); @@ -831,10 +832,8 @@ public ShapelessRecipeBuilder shapelessBuilder(ItemLike result, int resultCount) private static int STONECUTTER_COUNTER = 0; - public static void makeStonecutter(Consumer consumer, ItemLike input, ItemLike output, String reg) { + public static void makeStonecutter(RecipeOutput consumer, ItemLike input, ItemLike output, String reg) { SingleItemRecipeBuilder.stonecutting(Ingredient.of(input), RecipeCategory.DECORATIONS, output).unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)).save(consumer, new ResourceLocation(ArsNouveau.MODID, reg + "_" + STONECUTTER_COUNTER)); STONECUTTER_COUNTER++; } - - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/StructureTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/StructureTagProvider.java index 6cd796bbcf..7cbaa06860 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/StructureTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/StructureTagProvider.java @@ -9,7 +9,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.level.levelgen.structure.Structure; -import net.minecraftforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.common.data.ExistingFileHelper; import org.jetbrains.annotations.Nullable; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java index 1c2885a103..9ea6e55052 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java @@ -11,7 +11,7 @@ import net.minecraft.core.RegistrySetBuilder; import net.minecraft.core.registries.Registries; import net.minecraft.data.PackOutput; -import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BiomeTags; @@ -19,10 +19,10 @@ import net.minecraft.world.level.biome.MobSpawnSettings; import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.placement.PlacedFeature; -import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; -import net.minecraftforge.common.world.BiomeModifier; -import net.minecraftforge.common.world.ForgeBiomeModifiers; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; +import net.neoforged.neoforge.common.world.BiomeModifier; +import net.neoforged.neoforge.common.world.BiomeModifiers; +import net.neoforged.neoforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -47,23 +47,23 @@ public static class BiomeModifierRegistry { public static final ResourceKey ARCHWOOD_MIX_RARE = ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, prefix("rare_archwood_mix")); public static final ResourceKey BERRY_COMMON = ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, prefix("common_source_berry")); - public static void bootstrap(BootstapContext context) { + public static void bootstrap(BootstrapContext context) { HolderSet OVERWORLD_TAG = context.lookup(Registries.BIOME).getOrThrow(BiomeTags.IS_OVERWORLD); HolderSet.Named BERRY_BIOMES = context.lookup(Registries.BIOME).getOrThrow(BiomeTagProvider.BERRY_SPAWN); Holder.Reference BERRY_SET = context.lookup(Registries.PLACED_FEATURE).get(WorldgenRegistry.PLACED_BERRY_BUSH).get(); Holder.Reference TREE_SET = context.lookup(Registries.PLACED_FEATURE).get(WorldgenRegistry.PLACED_MIX_ARCHWOODS).get(); - context.register(STARBUNCLE_SPAWN, ForgeBiomeModifiers.AddSpawnsBiomeModifier.singleSpawn(OVERWORLD_TAG, new MobSpawnSettings.SpawnerData(ModEntities.STARBUNCLE_TYPE.get(), + context.register(STARBUNCLE_SPAWN, BiomeModifiers.AddSpawnsBiomeModifier.singleSpawn(OVERWORLD_TAG, new MobSpawnSettings.SpawnerData(ModEntities.STARBUNCLE_TYPE.get(), 5, 1, 2))); - context.register(GIFT_STARBUNCLE_SPAWN, ForgeBiomeModifiers.AddSpawnsBiomeModifier.singleSpawn(OVERWORLD_TAG, new MobSpawnSettings.SpawnerData(ModEntities.GIFT_STARBY.get(), + context.register(GIFT_STARBUNCLE_SPAWN, BiomeModifiers.AddSpawnsBiomeModifier.singleSpawn(OVERWORLD_TAG, new MobSpawnSettings.SpawnerData(ModEntities.GIFT_STARBY.get(), 1, 1, 1))); - context.register(DRYGMY_SPAWN, ForgeBiomeModifiers.AddSpawnsBiomeModifier.singleSpawn(OVERWORLD_TAG, new MobSpawnSettings.SpawnerData(ModEntities.ENTITY_DRYGMY.get(), + context.register(DRYGMY_SPAWN, BiomeModifiers.AddSpawnsBiomeModifier.singleSpawn(OVERWORLD_TAG, new MobSpawnSettings.SpawnerData(ModEntities.ENTITY_DRYGMY.get(), 3, 1, 2))); - context.register(WHIRLISPRIG_SPAWN, ForgeBiomeModifiers.AddSpawnsBiomeModifier.singleSpawn(OVERWORLD_TAG, new MobSpawnSettings.SpawnerData(ModEntities.WHIRLISPRIG_TYPE.get(), + context.register(WHIRLISPRIG_SPAWN, BiomeModifiers.AddSpawnsBiomeModifier.singleSpawn(OVERWORLD_TAG, new MobSpawnSettings.SpawnerData(ModEntities.WHIRLISPRIG_TYPE.get(), 5, 1, 2))); - context.register(BERRY_COMMON, new ForgeBiomeModifiers.AddFeaturesBiomeModifier(BERRY_BIOMES, HolderSet.direct(BERRY_SET), GenerationStep.Decoration.VEGETAL_DECORATION)); - context.register(ARCHWOOD_MIX_RARE, new ForgeBiomeModifiers.AddFeaturesBiomeModifier(OVERWORLD_TAG, HolderSet.direct(TREE_SET), GenerationStep.Decoration.VEGETAL_DECORATION)); + context.register(BERRY_COMMON, new BiomeModifiers.AddFeaturesBiomeModifier(BERRY_BIOMES, HolderSet.direct(BERRY_SET), GenerationStep.Decoration.VEGETAL_DECORATION)); + context.register(ARCHWOOD_MIX_RARE, new BiomeModifiers.AddFeaturesBiomeModifier(OVERWORLD_TAG, HolderSet.direct(TREE_SET), GenerationStep.Decoration.VEGETAL_DECORATION)); } @NotNull diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java index 436ae12c23..62754fb375 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java @@ -3,23 +3,23 @@ import com.google.common.collect.Maps; import net.minecraft.advancements.*; import net.minecraft.advancements.critereon.InventoryChangeTrigger; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; -import net.minecraftforge.registries.ForgeRegistries; - import javax.annotation.Nullable; import java.util.Arrays; import java.util.Map; +import java.util.Optional; import java.util.function.Consumer; import java.util.function.Function; /** * Copied from Advancements.Builder with extentions to reduce copy pasta */ -public class ANAdvancementBuilder implements net.minecraftforge.common.extensions.IForgeAdvancementBuilder{ +public class ANAdvancementBuilder implements net.neoforged.neoforge.common.extensions.IAdvancementBuilderExtension{ @Nullable private ResourceLocation parentId; @Nullable @@ -27,14 +27,14 @@ public class ANAdvancementBuilder implements net.minecraftforge.common.extension @Nullable private DisplayInfo display; private AdvancementRewards rewards = AdvancementRewards.EMPTY; - private Map criteria = Maps.newLinkedHashMap(); + private Map> criteria = Maps.newLinkedHashMap(); @Nullable - private String[][] requirements; - private RequirementsStrategy requirementsStrategy = RequirementsStrategy.AND; + private AdvancementRequirements requirements; + private AdvancementRequirements.Strategy requirementsStrategy = AdvancementRequirements.Strategy.AND; private String modid; private String fileKey; - private ANAdvancementBuilder(@Nullable ResourceLocation pParentId, @Nullable DisplayInfo pDisplay, AdvancementRewards pRewards, Map pCriteria, String[][] pRequirements) { + private ANAdvancementBuilder(@Nullable ResourceLocation pParentId, @Nullable DisplayInfo pDisplay, AdvancementRewards pRewards, Map> pCriteria, AdvancementRequirements pRequirements) { this.parentId = pParentId; this.display = pDisplay; this.rewards = pRewards; @@ -51,9 +51,8 @@ public static ANAdvancementBuilder builder(String modid, String fileKey) { return new ANAdvancementBuilder(modid, fileKey); } - public ANAdvancementBuilder parent(Advancement pParent) { - this.parent = pParent; - return this; + public ANAdvancementBuilder parent(AdvancementHolder parent) { + return this.parent(parent.id()); } public ANAdvancementBuilder parent(ResourceLocation pParentId) { @@ -61,12 +60,12 @@ public ANAdvancementBuilder parent(ResourceLocation pParentId) { return this; } - public ANAdvancementBuilder display(ItemStack pStack, Component pTitle, Component pDescription, @Nullable ResourceLocation pBackground, FrameType pFrame, boolean pShowToast, boolean pAnnounceToChat, boolean pHidden) { - return this.display(new DisplayInfo(pStack, pTitle, pDescription, pBackground, pFrame, pShowToast, pAnnounceToChat, pHidden)); + public ANAdvancementBuilder display(ItemStack pStack, Component pTitle, Component pDescription, @Nullable ResourceLocation pBackground, AdvancementType pFrame, boolean pShowToast, boolean pAnnounceToChat, boolean pHidden) { + return this.display(new DisplayInfo(pStack, pTitle, pDescription, Optional.ofNullable(pBackground), pFrame, pShowToast, pAnnounceToChat, pHidden)); } - public ANAdvancementBuilder display(ItemLike pItem, Component pTitle, Component pDescription, @Nullable ResourceLocation pBackground, FrameType pFrame, boolean pShowToast, boolean pAnnounceToChat, boolean pHidden) { - return this.display(new DisplayInfo(new ItemStack(pItem.asItem()), pTitle, pDescription, pBackground, pFrame, pShowToast, pAnnounceToChat, pHidden)); + public ANAdvancementBuilder display(ItemLike pItem, Component pTitle, Component pDescription, @Nullable ResourceLocation pBackground, AdvancementType pFrame, boolean pShowToast, boolean pAnnounceToChat, boolean pHidden) { + return this.display(new DisplayInfo(new ItemStack(pItem.asItem()), pTitle, pDescription, Optional.ofNullable(pBackground), pFrame, pShowToast, pAnnounceToChat, pHidden)); } public ANAdvancementBuilder display(DisplayInfo pDisplay) { @@ -75,20 +74,20 @@ public ANAdvancementBuilder display(DisplayInfo pDisplay) { } // The following displays cannot be used for roots. - public ANAdvancementBuilder display(ItemStack pItem, FrameType pFrame) { + public ANAdvancementBuilder display(ItemStack pItem, AdvancementType pFrame) { return this.display(new DisplayInfo(pItem, this.getComponent("title"), this.getComponent("desc"), null, pFrame, true, true, false)); } - public ANAdvancementBuilder display(ItemLike pItem, FrameType pFrame) { + public ANAdvancementBuilder display(ItemLike pItem, AdvancementType pFrame) { return this.display(new ItemStack(pItem), pFrame); } // The following displays cannot be used for roots. - public ANAdvancementBuilder display(ItemStack pItem, FrameType pFrame, boolean hidden) { + public ANAdvancementBuilder display(ItemStack pItem, AdvancementType pFrame, boolean hidden) { return this.display(new DisplayInfo(pItem, this.getComponent("title"), this.getComponent("desc"), null, pFrame, true, true, hidden)); } - public ANAdvancementBuilder display(ItemLike pItem, FrameType pFrame, boolean hidden) { + public ANAdvancementBuilder display(ItemLike pItem, AdvancementType pFrame, boolean hidden) { return this.display(new ItemStack(pItem), pFrame, hidden); } @@ -102,15 +101,11 @@ public ANAdvancementBuilder rewards(AdvancementRewards pRewards) { return this; } - public ANAdvancementBuilder addCriterion(String pKey, CriterionTriggerInstance pCriterion) { - return this.addCriterion(pKey, new Criterion(pCriterion)); - } - - public ANAdvancementBuilder addCriterion(CriterionTriggerInstance pCriterion) { - return this.addCriterion(fileKey, new Criterion(pCriterion)); + public ANAdvancementBuilder addCriterion(Criterion pCriterion) { + return this.addCriterion(fileKey, pCriterion); } - public ANAdvancementBuilder addCriterion(String pKey, Criterion pCriterion) { + public ANAdvancementBuilder addCriterion(String pKey, Criterion pCriterion) { if (this.criteria.containsKey(pKey)) { throw new IllegalArgumentException("Duplicate criterion " + pKey); } else { @@ -119,22 +114,22 @@ public ANAdvancementBuilder addCriterion(String pKey, Criterion pCriterion) { } } - public ANAdvancementBuilder requirements(RequirementsStrategy pStrategy) { + public ANAdvancementBuilder requirements(AdvancementRequirements.Strategy pStrategy) { this.requirementsStrategy = pStrategy; return this; } - public ANAdvancementBuilder requirements(String[][] pRequirements) { + public ANAdvancementBuilder requirements(AdvancementRequirements pRequirements) { this.requirements = pRequirements; return this; } public ANAdvancementBuilder normalItemRequirement(ItemLike item){ - return this.display(item, FrameType.TASK).requireItem(item); + return this.display(item, AdvancementType.TASK).requireItem(item); } public ANAdvancementBuilder requireItem(ItemLike item){ - return this.addCriterion("has_" + ForgeRegistries.ITEMS.getKey(item.asItem()).getPath(), InventoryChangeTrigger.TriggerInstance.hasItems(item)); + return this.addCriterion("has_" + BuiltInRegistries.ITEM.getKey(item.asItem()).getPath(), InventoryChangeTrigger.TriggerInstance.hasItems(item)); } public MutableComponent getComponent(String type){ @@ -145,46 +140,38 @@ public MutableComponent getComponent(String type){ * Tries to resolve the parent of this advancement, if possible. Returns true on success. */ public boolean canBuild(Function pParentLookup) { - if (this.parentId == null) { - return true; - } else { - if (this.parent == null) { - this.parent = pParentLookup.apply(this.parentId); - } - - return this.parent != null; - } + return this.parentId != null; } - public Advancement build(ResourceLocation pId) { + public Advancement build() { if (!this.canBuild((p_138407_) -> { return null; })) { throw new IllegalStateException("Tried to build incomplete advancement!"); } else { if (this.requirements == null) { - this.requirements = this.requirementsStrategy.createRequirements(this.criteria.keySet()); + this.requirements = this.requirementsStrategy.create(this.criteria.keySet()); } - return new Advancement(pId, this.parent, this.display, this.rewards, this.criteria, this.requirements, false); + return new Advancement(Optional.ofNullable(this.parentId), Optional.ofNullable(this.display), this.rewards, this.criteria, this.requirements, false); } } - public Advancement save(Consumer pConsumer, String pId) { - Advancement advancement = this.build(new ResourceLocation(pId)); + public AdvancementHolder save(Consumer pConsumer, ResourceLocation pId) { + AdvancementHolder advancement = new AdvancementHolder(pId, this.build()); pConsumer.accept(advancement); return advancement; } - public Advancement save(Consumer pConsumer) { - return this.save(pConsumer, new ResourceLocation(modid, fileKey).toString()); + public AdvancementHolder save(Consumer pConsumer) { + return this.save(pConsumer, new ResourceLocation(modid, fileKey)); } public String toString() { - return "Task Advancement{parentId=" + this.parentId + ", display=" + this.display + ", rewards=" + this.rewards + ", criteria=" + this.criteria + ", requirements=" + Arrays.deepToString(this.requirements) + "}"; + return "Task Advancement{parentId=" + this.parentId + ", display=" + this.display + ", rewards=" + this.rewards + ", criteria=" + this.criteria + ", requirements=" + this.requirements.toString() + "}"; } - public Map getCriteria() { + public Map> getCriteria() { return this.criteria; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancements.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancements.java index c716d3ebe5..f9575e86c6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancements.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancements.java @@ -7,57 +7,57 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModPotions; -import net.minecraft.advancements.Advancement; -import net.minecraft.advancements.FrameType; +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.advancements.AdvancementType; import net.minecraft.advancements.critereon.*; import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Items; import net.minecraft.world.level.ItemLike; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.common.data.ForgeAdvancementProvider; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.common.data.AdvancementProvider; +import net.neoforged.neoforge.common.data.ExistingFileHelper; import java.util.function.Consumer; -public class ANAdvancements implements ForgeAdvancementProvider.AdvancementGenerator { - Consumer advCon; +public class ANAdvancements implements AdvancementProvider.AdvancementGenerator { + Consumer advCon; @Override - public void generate(HolderLookup.Provider registries, Consumer con, ExistingFileHelper existingFileHelper) { + public void generate(HolderLookup.Provider registries, Consumer con, ExistingFileHelper existingFileHelper) { this.advCon = con; - Advancement root = builder(ArsNouveau.MODID).display(ItemsRegistry.WORN_NOTEBOOK, Component.translatable("ars_nouveau.advancement.title.root"), + AdvancementHolder root = builder(ArsNouveau.MODID).display(ItemsRegistry.WORN_NOTEBOOK, Component.translatable("ars_nouveau.advancement.title.root"), Component.translatable("ars_nouveau.advancement.desc.root"), new ResourceLocation("ars_nouveau:textures/gui/advancements/backgrounds/sourcestone.png"), - FrameType.TASK, false, false, false).addCriterion("ars_nouveau:worn_notebook", - InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)).save(con, "ars_nouveau:root"); - Advancement poofMob = builder("poof_mob").display(Items.GOLD_NUGGET, FrameType.TASK).addCriterion(new PlayerTrigger.TriggerInstance(ANCriteriaTriggers.POOF_MOB.getId(), ContextAwarePredicate.ANY)).parent(root).save(con); + AdvancementType.TASK, false, false, false).addCriterion("ars_nouveau:worn_notebook", + InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)).save(con, ArsNouveau.prefix("root")); + AdvancementHolder poofMob = builder("poof_mob").display(Items.GOLD_NUGGET, AdvancementType.TASK).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.POOF_MOB)).parent(root).save(con); saveBasicItem(ItemsRegistry.WIXIE_CHARM, poofMob); saveBasicItem(ItemsRegistry.WHIRLISPRIG_CHARM, poofMob); saveBasicItem(ItemsRegistry.DRYGMY_CHARM, poofMob); - Advancement starbyCharm = builder("starby_charm").normalItemRequirement(ItemsRegistry.STARBUNCLE_CHARM).parent(poofMob).save(con); + AdvancementHolder starbyCharm = builder("starby_charm").normalItemRequirement(ItemsRegistry.STARBUNCLE_CHARM).parent(poofMob).save(con); saveBasicItem(ItemsRegistry.STARBUNCLE_SHADES, starbyCharm); saveBasicItem(ItemsRegistry.WIXIE_HAT, starbyCharm); - Advancement novice = saveBasicItem(ItemsRegistry.NOVICE_SPELLBOOK, root); - Advancement mages = saveBasicItem(ItemsRegistry.APPRENTICE_SPELLBOOK, novice); - var tribue = saveBasicItem(ItemsRegistry.WILDEN_TRIBUTE, mages); - builder("wilden_explosion").display(ItemsRegistry.WILDEN_TRIBUTE, FrameType.CHALLENGE, true).addCriterion(new PlayerTrigger.TriggerInstance(ANCriteriaTriggers.CHIMERA_EXPLOSION.getId(),ContextAwarePredicate.ANY)).parent(tribue).save(con); - saveBasicItem(ItemsRegistry.ARCHMAGE_SPELLBOOK, tribue); - saveBasicItem(ItemsRegistry.SUMMONING_FOCUS, tribue); + AdvancementHolder novice = saveBasicItem(ItemsRegistry.NOVICE_SPELLBOOK, root); + AdvancementHolder mages = saveBasicItem(ItemsRegistry.APPRENTICE_SPELLBOOK, novice); + AdvancementHolder tribute = saveBasicItem(ItemsRegistry.WILDEN_TRIBUTE, mages); + builder("wilden_explosion").display(ItemsRegistry.WILDEN_TRIBUTE, AdvancementType.CHALLENGE, true).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.CHIMERA_EXPLOSION)).parent(tribute).save(con); + saveBasicItem(ItemsRegistry.ARCHMAGE_SPELLBOOK, tribute); + saveBasicItem(ItemsRegistry.SUMMONING_FOCUS, tribute); saveBasicItem(ItemsRegistry.SHAPERS_FOCUS, novice); - builder("eat_bombegranate").display(BlockRegistry.BOMBEGRANTE_POD, FrameType.TASK, true).addCriterion(ConsumeItemTrigger.TriggerInstance.usedItem(BlockRegistry.BOMBEGRANTE_POD)).parent(root).save(con); + builder("eat_bombegranate").display(BlockRegistry.BOMBEGRANTE_POD, AdvancementType.TASK, true).addCriterion(ConsumeItemTrigger.TriggerInstance.usedItem(BlockRegistry.BOMBEGRANTE_POD)).parent(root).save(con); - Advancement rituals = saveBasicItem(BlockRegistry.RITUAL_BLOCK, root); + AdvancementHolder rituals = saveBasicItem(BlockRegistry.RITUAL_BLOCK, root); saveBasicItem(ItemsRegistry.AMETHYST_GOLEM_CHARM, rituals); - builder("familiar").display(RitualRegistry.getRitualItemMap().get(new ResourceLocation(ArsNouveau.MODID, RitualLib.BINDING)), FrameType.GOAL) - .addCriterion(new PlayerTrigger.TriggerInstance(ANCriteriaTriggers.FAMILIAR.getId(),ContextAwarePredicate.ANY)).parent(rituals).save(con); + builder("familiar").display(RitualRegistry.getRitualItemMap().get(new ResourceLocation(ArsNouveau.MODID, RitualLib.BINDING)), AdvancementType.GOAL) + .addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.FAMILIAR)).parent(rituals).save(con); var jars = saveBasicItem(BlockRegistry.MOB_JAR, rituals); - builder("shrunk_starbuncle").display(ItemsRegistry.STARBUNCLE_CHARM, FrameType.CHALLENGE, true).addCriterion(new PlayerTrigger.TriggerInstance(ANCriteriaTriggers.SHRUNK_STARBY.getId(),ContextAwarePredicate.ANY)).parent(jars).save(con); - builder("catch_lightning").display(Items.LIGHTNING_ROD, FrameType.CHALLENGE, true).addCriterion(new PlayerTrigger.TriggerInstance(ANCriteriaTriggers.CAUGHT_LIGHTNING.getId(),ContextAwarePredicate.ANY)).parent(jars).save(con); - builder("time_in_a_bottle").display(Items.CLOCK, FrameType.CHALLENGE, true).addCriterion(new PlayerTrigger.TriggerInstance(ANCriteriaTriggers.TIME_IN_BOTTLE.getId(),ContextAwarePredicate.ANY)).parent(jars).save(con); + builder("shrunk_starbuncle").display(ItemsRegistry.STARBUNCLE_CHARM, AdvancementType.CHALLENGE, true).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.SHRUNK_STARBY)).parent(jars).save(con); + builder("catch_lightning").display(Items.LIGHTNING_ROD, AdvancementType.CHALLENGE, true).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.CAUGHT_LIGHTNING)).parent(jars).save(con); + builder("time_in_a_bottle").display(Items.CLOCK, AdvancementType.CHALLENGE, true).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.TIME_IN_BOTTLE)).parent(jars).save(con); var chamber = saveBasicItem(BlockRegistry.IMBUEMENT_BLOCK, root); var jar = saveBasicItem(BlockRegistry.SOURCE_JAR, chamber); @@ -69,20 +69,20 @@ public void generate(HolderLookup.Provider registries, Consumer con saveBasicItem(ItemsRegistry.POTION_FLASK, potionJar); var turret = saveBasicItem(BlockRegistry.BASIC_SPELL_TURRET, apparatus); var prism = saveBasicItem(BlockRegistry.SPELL_PRISM, turret); - builder("prismatic").display(BlockRegistry.SPELL_PRISM, FrameType.CHALLENGE, true).addCriterion(new PlayerTrigger.TriggerInstance(ANCriteriaTriggers.PRISMATIC.getId(),ContextAwarePredicate.ANY)).parent(prism).save(con); + builder("prismatic").display(BlockRegistry.SPELL_PRISM, AdvancementType.CHALLENGE, true).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.PRISMATIC)).parent(prism).save(con); var magebloom = saveBasicItem(BlockRegistry.MAGE_BLOOM_CROP, apparatus); var warpScroll = saveBasicItem(ItemsRegistry.WARP_SCROLL, magebloom); - builder("create_portal").display(BlockRegistry.CREATIVE_SOURCE_JAR, FrameType.CHALLENGE, false).addCriterion(new PlayerTrigger.TriggerInstance(ANCriteriaTriggers.CREATE_PORTAL.getId(),ContextAwarePredicate.ANY)).parent(warpScroll).save(con); + builder("create_portal").display(BlockRegistry.CREATIVE_SOURCE_JAR, AdvancementType.CHALLENGE, false).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.CREATE_PORTAL)).parent(warpScroll).save(con); var alteration = saveBasicItem(BlockRegistry.ALTERATION_TABLE, magebloom); - builder("ritual_gravity").display(RitualRegistry.getRitualItemMap().get(new ResourceLocation(ArsNouveau.MODID, RitualLib.GRAVITY)), FrameType.GOAL).addCriterion("gravity_effect", EffectsChangedTrigger.TriggerInstance.hasEffects(MobEffectsPredicate.effects().and(ModPotions.GRAVITY_EFFECT.get()))).parent(rituals).save(con); + builder("ritual_gravity").display(RitualRegistry.getRitualItemMap().get(new ResourceLocation(ArsNouveau.MODID, RitualLib.GRAVITY)), AdvancementType.GOAL).addCriterion("gravity_effect", EffectsChangedTrigger.TriggerInstance.hasEffects(MobEffectsPredicate.Builder.effects().and(ModPotions.GRAVITY_EFFECT))).parent(rituals).save(con); } - public ANAdvancementBuilder buildBasicItem(ItemLike item, Advancement parent){ - return builder(ForgeRegistries.ITEMS.getKey(item.asItem()).getPath()).normalItemRequirement(item).parent(parent); + public ANAdvancementBuilder buildBasicItem(ItemLike item, AdvancementHolder parent){ + return builder(BuiltInRegistries.ITEM.getKey(item.asItem()).getPath()).normalItemRequirement(item).parent(parent.id()); } - public Advancement saveBasicItem(ItemLike item, Advancement parent){ + public AdvancementHolder saveBasicItem(ItemLike item, AdvancementHolder parent){ return buildBasicItem(item, parent).save(advCon); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusPage.java index 23c16fc949..2689921481 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusPage.java @@ -3,7 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.RegistryObject; import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusTextPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusTextPage.java index 6713043e2f..2846da6c86 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusTextPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusTextPage.java @@ -3,7 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.RegistryObject; public class ApparatusTextPage extends ApparatusPage{ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/CraftingPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/CraftingPage.java index d123a1d055..3089abf8af 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/CraftingPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/CraftingPage.java @@ -2,7 +2,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.RegistryObject; import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/MultiblockPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/MultiblockPage.java index d1b244e8bc..f9234634bd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/MultiblockPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/MultiblockPage.java @@ -3,7 +3,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import net.minecraft.resources.ResourceLocation; - +import record; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/PatchouliBuilder.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/PatchouliBuilder.java index 22de072205..5880de9def 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/PatchouliBuilder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/PatchouliBuilder.java @@ -4,7 +4,7 @@ import com.google.gson.JsonObject; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.RegistryObject; import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimHeadSummon.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimHeadSummon.java index ad26f17ccd..dd0e88166d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimHeadSummon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimHeadSummon.java @@ -14,8 +14,8 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.entity.IEntityAdditionalSpawnData; -import net.minecraftforge.network.NetworkHooks; +import net.neoforged.neoforge.entity.IEntityAdditionalSpawnData; +import net.neoforged.neoforge.network.NetworkHooks; public class AnimHeadSummon extends AnimBlockSummon implements IEntityAdditionalSpawnData { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java index 13b8a4fa88..c8d736f12d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java @@ -13,8 +13,8 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.entity.IEntityAdditionalSpawnData; -import net.minecraftforge.network.NetworkHooks; +import net.neoforged.neoforge.entity.IEntityAdditionalSpawnData; +import net.neoforged.neoforge.network.NetworkHooks; import org.jetbrains.annotations.Nullable; public class EnchantedSkull extends EnchantedFallingBlock implements IEntityAdditionalSpawnData { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java index 2ce8dcd9a4..f21acf8a5b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java @@ -42,7 +42,7 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraftforge.common.Tags; +import net.neoforged.neoforge.common.Tags; import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java index fb5359623b..3dd35ec999 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java @@ -14,8 +14,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.network.NetworkHooks; -import net.minecraftforge.network.PlayMessages; +import net.neoforged.neoforge.network.NetworkHooks; +import net.neoforged.neoforge.network.PlayMessages; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.core.animation.AnimatableManager; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java index 893fa423b7..72b30fc8a3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java @@ -49,7 +49,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.Tags; +import net.neoforged.neoforge.common.Tags; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.core.animation.AnimatableManager; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDummy.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDummy.java index b7c43df1ed..337bf00976 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDummy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDummy.java @@ -29,9 +29,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.scores.PlayerTeam; -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 javax.annotation.Nullable; import java.util.ArrayList; import java.util.Optional; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityEvokerFangs.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityEvokerFangs.java index 3dd919be2c..7c4f387206 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityEvokerFangs.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityEvokerFangs.java @@ -7,9 +7,8 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.projectile.EvokerFangs; import net.minecraft.world.level.Level; -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 java.util.UUID; public class EntityEvokerFangs extends EvokerFangs { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java index 46f0eb5fc2..32193a0546 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java @@ -22,8 +22,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.network.NetworkHooks; -import net.minecraftforge.network.PlayMessages; +import net.neoforged.neoforge.network.NetworkHooks; +import net.neoforged.neoforge.network.PlayMessages; public class EntityFlyingItem extends ColoredProjectile { public static final EntityDataAccessor to = SynchedEntityData.defineId(EntityFlyingItem.class, DataSerializers.VEC.get()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java index 8949ed1a5d..f9fca2142a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java @@ -17,8 +17,8 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.network.NetworkHooks; -import net.minecraftforge.network.PlayMessages; +import net.neoforged.neoforge.network.NetworkHooks; +import net.neoforged.neoforge.network.PlayMessages; public class EntityFollowProjectile extends ColoredProjectile { public static final EntityDataAccessor to = SynchedEntityData.defineId(EntityFollowProjectile.class, EntityDataSerializers.BLOCK_POS); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityLingeringSpell.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityLingeringSpell.java index df9248e1aa..98e8bc6600 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityLingeringSpell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityLingeringSpell.java @@ -17,7 +17,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.*; -import net.minecraftforge.network.PlayMessages; +import net.neoforged.neoforge.network.PlayMessages; import org.jetbrains.annotations.Nullable; public class EntityLingeringSpell extends EntityProjectileSpell { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityOrbitProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityOrbitProjectile.java index a303180eda..19196912aa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityOrbitProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityOrbitProjectile.java @@ -20,8 +20,8 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.network.NetworkHooks; -import net.minecraftforge.network.PlayMessages; +import net.neoforged.neoforge.network.NetworkHooks; +import net.neoforged.neoforge.network.PlayMessages; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java index c67723c4df..8c37b06eda 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java @@ -37,10 +37,9 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.entity.IEntityAdditionalSpawnData; -import net.minecraftforge.network.NetworkHooks; - +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.entity.IEntityAdditionalSpawnData; +import net.neoforged.neoforge.network.NetworkHooks; import javax.annotation.Nullable; import java.util.HashSet; import java.util.Set; @@ -152,7 +151,7 @@ public void traceAnyHit(@Nullable HitResult raytraceresult, Vec3 thisPosition, V raytraceresult = entityraytraceresult; } - if (raytraceresult != null && raytraceresult.getType() != HitResult.Type.MISS && !net.minecraftforge.event.ForgeEventFactory.onProjectileImpact(this, raytraceresult)) { + if (raytraceresult != null && raytraceresult.getType() != HitResult.Type.MISS && !net.neoforged.neoforge.event.EventHooks.onProjectileImpact(this, raytraceresult)) { this.onHit(raytraceresult); this.hasImpulse = true; } @@ -309,7 +308,7 @@ protected void onHit(HitResult result) { if (!level.isClientSide) { SpellProjectileHitEvent event = new SpellProjectileHitEvent(this, result); - MinecraftForge.EVENT_BUS.post(event); + NeoForge.EVENT_BUS.post(event); if (event.isCanceled()) { return; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityRitualProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityRitualProjectile.java index 1331dd37ac..3670587802 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityRitualProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityRitualProjectile.java @@ -12,8 +12,8 @@ import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; -import net.minecraftforge.network.NetworkHooks; -import net.minecraftforge.network.PlayMessages; +import net.neoforged.neoforge.network.NetworkHooks; +import net.neoforged.neoforge.network.PlayMessages; public class EntityRitualProjectile extends ColoredProjectile { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java index d23d1ffc69..a2f69e88ff 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java @@ -27,8 +27,8 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.network.NetworkHooks; -import net.minecraftforge.network.PlayMessages; +import net.neoforged.neoforge.network.NetworkHooks; +import net.neoforged.neoforge.network.PlayMessages; public class EntitySpellArrow extends Arrow { public SpellResolver spellResolver; @@ -116,7 +116,7 @@ public void tick() { } } - if (raytraceresult != null && raytraceresult.getType() != HitResult.Type.MISS && !isNoClip && !net.minecraftforge.event.ForgeEventFactory.onProjectileImpact(this, raytraceresult)) { + if (raytraceresult != null && raytraceresult.getType() != HitResult.Type.MISS && !isNoClip && !net.neoforged.neoforge.event.EventHooks.onProjectileImpact(this, raytraceresult)) { this.onHit(raytraceresult); this.hasImpulse = true; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWallSpell.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWallSpell.java index 87f9202938..f6f0096c37 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWallSpell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWallSpell.java @@ -18,7 +18,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.*; -import net.minecraftforge.network.PlayMessages; +import net.neoforged.neoforge.network.PlayMessages; import org.jetbrains.annotations.Nullable; import java.lang.ref.WeakReference; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java index cb431d4023..2e97e25ee8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java @@ -37,7 +37,7 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraftforge.common.Tags; +import net.neoforged.neoforge.common.Tags; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.core.animatable.GeoAnimatable; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/GiftStarbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/GiftStarbuncle.java index 87c1905763..9f431dc2cb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/GiftStarbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/GiftStarbuncle.java @@ -27,7 +27,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraftforge.common.Tags; +import net.neoforged.neoforge.common.Tags; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.core.animation.AnimatableManager; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/LightningEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/LightningEntity.java index dd11e01ed0..803fc953ed 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/LightningEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/LightningEntity.java @@ -23,15 +23,14 @@ import net.minecraft.world.level.block.BaseFireBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.energy.IEnergyStorage; -import net.minecraftforge.event.entity.EntityStruckByLightningEvent; -import net.minecraftforge.network.NetworkHooks; -import net.minecraftforge.network.PlayMessages; - +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.energy.IEnergyStorage; +import net.neoforged.neoforge.event.entity.EntityStruckByLightningEvent; +import net.neoforged.neoforge.network.NetworkHooks; +import net.neoforged.neoforge.network.PlayMessages; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -100,11 +99,11 @@ public void tick() { } else if (!this.effectOnly) { List list = this.level.getEntities(this, new AABB(this.getX() - 3.0D, this.getY() - 3.0D, this.getZ() - 3.0D, this.getX() + 3.0D, this.getY() + 6.0D + 3.0D, this.getZ() + 3.0D), Entity::isAlive); for (Entity entity : list) { - if (!net.minecraftforge.event.ForgeEventFactory.onEntityStruckByLightning(entity, this)) { + if (!net.neoforged.neoforge.event.EventHooks.onEntityStruckByLightning(entity, this)) { float origDamage = this.getDamage(); this.setDamage(this.getDamage(entity)); EntityStruckByLightningEvent event = new EntityStruckByLightningEvent(entity, this); - MinecraftForge.EVENT_BUS.post(event); + NeoForge.EVENT_BUS.post(event); if (event.isCanceled()) continue; entity.thunderHit((ServerLevel) this.level, this); @@ -151,16 +150,16 @@ public float getDamage(Entity entity) { float baseDamage = getDamage() + ampScalar * amps + (entity.isInWaterOrRain() ? wetBonus : 0.0f); int multiplier = 1; for (ItemStack i : entity.getArmorSlots()) { - IEnergyStorage energyStorage = i.getCapability(ForgeCapabilities.ENERGY).orElse(null); + IEnergyStorage energyStorage = i.getCapability(Capabilities.ENERGY).orElse(null); if (energyStorage != null) { multiplier++; } } if (entity instanceof LivingEntity) { - IEnergyStorage energyStorage = ((LivingEntity) entity).getMainHandItem().getCapability(ForgeCapabilities.ENERGY).orElse(null); + IEnergyStorage energyStorage = ((LivingEntity) entity).getMainHandItem().getCapability(Capabilities.ENERGY).orElse(null); if (energyStorage != null) multiplier++; - energyStorage = ((LivingEntity) entity).getOffhandItem().getCapability(ForgeCapabilities.ENERGY).orElse(null); + energyStorage = ((LivingEntity) entity).getOffhandItem().getCapability(Capabilities.ENERGY).orElse(null); if (energyStorage != null) multiplier++; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/ScryerCamera.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/ScryerCamera.java index 2559207dc2..b98811e87e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/ScryerCamera.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/ScryerCamera.java @@ -22,8 +22,8 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.common.world.ForgeChunkManager; -import net.minecraftforge.network.PacketDistributor; +import net.neoforged.neoforge.common.world.ForcedChunkManager; +import net.neoforged.neoforge.network.PacketDistributor; /** * Camera work is taken from SecurityCraft: @@ -149,7 +149,7 @@ public void discardCamera() { for (int x = chunkPos.getX() - view; x <= chunkPos.getX() + view; x++) { for (int z = chunkPos.getZ() - view; z <= chunkPos.getZ() + view; z++) { - ForgeChunkManager.forceChunk((ServerLevel) this.level, ArsNouveau.MODID, this, x, z, false, false); + ForcedChunkManager.forceChunk((ServerLevel) this.level, ArsNouveau.MODID, this, x, z, false, false); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 7422453792..259dc631e6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -70,10 +70,10 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.pathfinder.BlockPathTypes; import net.minecraft.world.phys.AABB; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.common.Tags; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.registries.ForgeRegistries; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.core.animation.AnimatableManager; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java index 0d724884eb..91db20dc2d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java @@ -54,7 +54,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.Tags; +import net.neoforged.neoforge.common.Tags; import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java index 2ad9e51af3..f647409a8b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java @@ -62,7 +62,7 @@ import net.minecraft.world.level.pathfinder.BlockPathTypes; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.fluids.FluidType; +import net.neoforged.neoforge.fluids.FluidType; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.core.animation.AnimatableManager; @@ -70,7 +70,7 @@ import software.bernie.geckolib.core.animation.RawAnimation; import software.bernie.geckolib.core.object.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; - +import var; import java.util.ArrayList; public class WildenChimera extends Monster implements GeoEntity { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java index 169074dbdd..0ddd386878 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java @@ -11,7 +11,7 @@ import net.minecraft.world.entity.PathfinderMob; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraftforge.common.Tags; +import net.neoforged.neoforge.common.Tags; import software.bernie.geckolib.core.animation.AnimationState; import software.bernie.geckolib.core.animation.RawAnimation; import software.bernie.geckolib.core.object.PlayState; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java index fdcb1c51e0..6d230b8ac0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java @@ -15,10 +15,10 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.Tags; -import net.minecraftforge.event.entity.player.EntityItemPickupEvent; -import net.minecraftforge.items.wrapper.PlayerMainInvWrapper; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.event.entity.player.EntityItemPickupEvent; +import net.neoforged.neoforge.items.wrapper.PlayerMainInvWrapper; import software.bernie.geckolib.core.animation.AnimationState; import software.bernie.geckolib.core.animation.RawAnimation; import software.bernie.geckolib.core.object.PlayState; @@ -65,7 +65,7 @@ public void tick() { if(entity instanceof ItemEntity i){ ItemStack stack = i.getItem(); if (stack.isEmpty() - || MinecraftForge.EVENT_BUS.post(new EntityItemPickupEvent(player, i)) + || NeoForge.EVENT_BUS.post(new EntityItemPickupEvent(player, i)) || getOwnerID().equals(i.getOwner()) || i.hasPickUpDelay() || i.getPersistentData().getBoolean("PreventRemoteMovement") @@ -75,7 +75,7 @@ public void tick() { i.setItem(stack); } if(entity instanceof ExperienceOrb orb){ - if (orb.isRemoved() || MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.entity.player.PlayerXpEvent.PickupXp(player, orb))) + if (orb.isRemoved() || NeoForge.EVENT_BUS.post(new net.neoforged.neoforge.event.entity.player.PlayerXpEvent.PickupXp(player, orb))) continue; player.giveExperiencePoints(orb.value); orb.remove(Entity.RemovalReason.DISCARDED); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java index fa0ab34fea..79540f0e33 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java @@ -14,8 +14,8 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraftforge.common.Tags; -import net.minecraftforge.event.entity.living.LootingLevelEvent; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.event.entity.living.LootingLevelEvent; import software.bernie.geckolib.core.animation.AnimationState; import software.bernie.geckolib.core.animation.RawAnimation; import software.bernie.geckolib.core.object.PlayState; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java index 695a105263..ddfb9b77dc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java @@ -35,13 +35,12 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.network.NetworkHooks; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -189,7 +188,7 @@ public ItemStack getCosmeticItem() { //use this for tag reload public void setCosmeticItem(ItemStack stack, boolean shouldDrop) { if (!this.entityData.get(COSMETIC).isEmpty() && shouldDrop) - this.level.addFreshEntity(new ItemEntity(this.level, this.getX(), this.getY(), this.getZ(), this.entityData.get(COSMETIC))); + this.level().addFreshEntity(new ItemEntity(this.level(), this.getX(), this.getY(), this.getZ(), this.entityData.get(COSMETIC))); this.entityData.set(COSMETIC, stack); this.persistentData.cosmetic = stack; syncTag(); @@ -206,7 +205,7 @@ public Packet getAddEntityPacket() { public static AttributeSupplier.Builder attributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 100d) - .add(Attributes.MOVEMENT_SPEED, 0.2d).add(Attributes.FLYING_SPEED, Attributes.FLYING_SPEED.getDefaultValue()) + .add(Attributes.MOVEMENT_SPEED, 0.2d).add(Attributes.FLYING_SPEED, Attributes.FLYING_SPEED.value().getDefaultValue()) .add(Attributes.FOLLOW_RANGE, 16D); } @@ -222,9 +221,9 @@ protected boolean canRide(Entity p_184228_1_) { @Override public boolean onDispel(@Nullable LivingEntity caster) { - if (!level.isClientSide && getOwner() != null && getOwner().equals(caster)) { + if (!level().isClientSide && getOwner() != null && getOwner().equals(caster)) { this.remove(RemovalReason.DISCARDED); - ParticleUtil.spawnPoof((ServerLevel) level, blockPosition()); + ParticleUtil.spawnPoof((ServerLevel) level(), blockPosition()); return true; } return false; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java index 4499e37c75..3b2e6dda18 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java @@ -19,7 +19,7 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraftforge.common.Tags; +import net.neoforged.neoforge.common.Tags; import software.bernie.geckolib.core.animation.AnimationState; import software.bernie.geckolib.core.animation.RawAnimation; import software.bernie.geckolib.core.object.PlayState; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java index 2fdb48c3b8..0cc2c80827 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java @@ -18,7 +18,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent; +import net.neoforged.neoforge.event.entity.living.LivingEntityUseItemEvent; import software.bernie.geckolib.core.animation.AnimationState; import software.bernie.geckolib.core.animation.RawAnimation; import software.bernie.geckolib.core.object.PlayState; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java index 5b914fb770..67c29e0668 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java @@ -6,6 +6,7 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.block.tile.IAnimationListener; import com.hollingsworth.arsnouveau.common.entity.EntityWixie; +import com.hollingsworth.arsnouveau.common.util.PotionUtil; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketAnimEntity; @@ -29,9 +30,10 @@ import net.minecraft.world.item.alchemy.PotionUtils; import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.Level; -import net.minecraftforge.common.Tags; -import net.minecraftforge.common.brewing.BrewingRecipe; -import net.minecraftforge.event.entity.living.MobEffectEvent; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.common.brewing.BrewingRecipe; +import net.neoforged.neoforge.event.entity.living.MobEffectEvent; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.core.animation.AnimationState; import software.bernie.geckolib.core.animation.RawAnimation; import software.bernie.geckolib.core.object.PlayState; @@ -50,7 +52,7 @@ public FamiliarWixie(EntityType ent, Level world) { @Override protected InteractionResult mobInteract(Player player, InteractionHand hand) { - if (level.isClientSide || hand != InteractionHand.MAIN_HAND) + if (level().isClientSide || hand != InteractionHand.MAIN_HAND) return InteractionResult.SUCCESS; ItemStack stack = player.getItemInHand(hand); @@ -62,18 +64,18 @@ protected InteractionResult mobInteract(Player player, InteractionHand hand) { setColor(color); return InteractionResult.SUCCESS; }else{ - for (BrewingRecipe r : ArsNouveauAPI.getInstance().getAllPotionRecipes()) { - ItemStack water = PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER); - ItemStack awkard = PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.AWKWARD); + for (BrewingRecipe r : ArsNouveauAPI.getInstance().getAllPotionRecipes(level())) { + ItemStack water = PotionUtil.getPotion(Potions.WATER); + ItemStack awkward = PotionUtil.getPotion(Potions.AWKWARD); - if(r.isIngredient(stack) && (r.getInput().test(awkard) || r.getInput().test(water))){ + if(r.isIngredient(stack) && (r.getInput().test(awkward) || r.getInput().test(water))){ PotionData data = new PotionData(r.getOutput().copy()); if(!data.isEmpty()){ data.applyEffects(player, player, player); PortUtil.sendMessage(player, Component.translatable("ars_nouveau.wixie_familiar.applied",data.asPotionStack().getHoverName().getString())); - Networking.sendToNearby(level, this, new PacketAnimEntity(this.getId(), EntityWixie.Animations.CAST.ordinal())); - ParticleUtil.spawnPoof((ServerLevel) level, player.blockPosition().above()); + Networking.sendToNearby(level(), this, new PacketAnimEntity(this.getId(), EntityWixie.Animations.CAST.ordinal())); + ParticleUtil.spawnPoof((ServerLevel) level(), player.blockPosition().above()); stack.shrink(1); return InteractionResult.SUCCESS; } @@ -92,7 +94,8 @@ public void potionEvent(MobEffectEvent.Added event) { boolean isBeneficialOwner = target.equals(getOwner()) && event.getEffectInstance().getEffect().isBeneficial(); boolean isApplierOwner = applier != null && applier.equals(this.getOwner()); if(isBeneficialOwner || isApplierOwner){ - event.getEffectInstance().duration += event.getEffectInstance().duration * .2; + event.getEffectInstance().getCures(); + event.getEffectInstance().mapDuration(duration -> duration + duration * 2); } } @@ -137,6 +140,11 @@ public ResourceLocation getTexture(FamiliarEntity entity) { return new ResourceLocation(ArsNouveau.MODID, "textures/entity/wixie_" + color + ".png"); } + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { + + } + public static class DebuffTargetGoal extends Goal { FamiliarWixie wixie; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/DepositAmethystGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/DepositAmethystGoal.java index 5448c2e773..83a738c06c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/DepositAmethystGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/DepositAmethystGoal.java @@ -5,12 +5,11 @@ import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; - +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.ItemHandlerHelper; import java.util.function.Supplier; -import static net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER; +import static net.neoforged.neoforge.common.capabilities.Capabilities.ITEM_HANDLER; public class DepositAmethystGoal extends Goal { public AmethystGolem golem; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/PickupAmethystGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/PickupAmethystGoal.java index b006a91991..82d3ef4d49 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/PickupAmethystGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/PickupAmethystGoal.java @@ -6,8 +6,7 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.AABB; -import net.minecraftforge.common.capabilities.ForgeCapabilities; - +import net.neoforged.neoforge.common.capabilities.Capabilities; import java.util.function.Supplier; import static com.hollingsworth.arsnouveau.common.datagen.ItemTagProvider.SHARD_TAG; @@ -106,6 +105,6 @@ public boolean canUse() { if (golem.getHome() == null) return false; BlockEntity entity = golem.level().getBlockEntity(golem.getHome()); - return canUse.get() && golem.pickupCooldown <= 0 && entity != null && entity.getCapability(ForgeCapabilities.ITEM_HANDLER).isPresent(); + return canUse.get() && golem.pickupCooldown <= 0 && entity != null && entity.getCapability(Capabilities.ITEM_HANDLER).isPresent(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java index 9a35107666..5c26551611 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java @@ -27,11 +27,11 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.AABB; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; +import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.ItemHandlerHelper; import org.jetbrains.annotations.Nullable; - +import var; import java.util.List; import java.util.concurrent.TimeUnit; @@ -140,8 +140,8 @@ public boolean isPickupDisabled() { } public @Nullable IItemHandler getItemCapFromTile(BlockEntity blockEntity, @Nullable Direction face) { - if (blockEntity != null && blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER, face).isPresent()) { - var lazy = blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER, face).resolve(); + if (blockEntity != null && blockEntity.getCapability(Capabilities.ITEM_HANDLER, face).isPresent()) { + var lazy = blockEntity.getCapability(Capabilities.ITEM_HANDLER, face).resolve(); if (lazy.isPresent()) return lazy.get(); } @@ -248,7 +248,7 @@ public void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @Nullable Di if (storedPos == null) return; BlockEntity blockEntity = level.getBlockEntity(storedPos); - if (blockEntity != null && blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER, side).isPresent()) { + if (blockEntity != null && blockEntity.getCapability(Capabilities.ITEM_HANDLER, side).isPresent()) { PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.starbuncle.store")); addToPos(storedPos, side); } @@ -261,7 +261,7 @@ public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable Dir return; BlockEntity blockEntity = level.getBlockEntity(storedPos); - if (blockEntity != null && blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER, side).isPresent()) { + if (blockEntity != null && blockEntity.getCapability(Capabilities.ITEM_HANDLER, side).isPresent()) { PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.starbuncle.take")); addFromPos(storedPos, side); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StoreItemGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StoreItemGoal.java index 6885df35c7..8a768a4f9f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StoreItemGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StoreItemGoal.java @@ -10,8 +10,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.ItemHandlerHelper; public class StoreItemGoal extends GoToPosGoal { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/TakeItemGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/TakeItemGoal.java index e100dc7bc6..c9abcb3273 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/TakeItemGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/TakeItemGoal.java @@ -10,7 +10,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.items.IItemHandler; +import net.neoforged.neoforge.items.IItemHandler; import org.jetbrains.annotations.Nullable; public class TakeItemGoal extends GoToPosGoal { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/UntamedFindItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/UntamedFindItem.java index 28719c2522..240fc21c3e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/UntamedFindItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/UntamedFindItem.java @@ -6,8 +6,7 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.pathfinder.Path; -import net.minecraftforge.common.Tags; - +import net.neoforged.neoforge.common.Tags; import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraLeapRamGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraLeapRamGoal.java index bacf94d412..74dd57f0f2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraLeapRamGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraLeapRamGoal.java @@ -94,7 +94,7 @@ public void tick() { } public void breakBlocks() { - if (!net.minecraftforge.event.ForgeEventFactory.getMobGriefingEvent(this.boss.level, this.boss)) { + if (!net.neoforged.neoforge.event.EventHooks.getMobGriefingEvent(this.boss.level, this.boss)) { return; } Direction facing = boss.getDirection(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraRamGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraRamGoal.java index a65e4494d8..5a3764a806 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraRamGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraRamGoal.java @@ -11,7 +11,7 @@ import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.level.pathfinder.Path; import net.minecraft.world.phys.AABB; - +import var; import java.util.EnumSet; import java.util.List; @@ -94,7 +94,7 @@ public void tick() { } public void breakBlocks() { - if (!net.minecraftforge.event.ForgeEventFactory.getMobGriefingEvent(this.boss.level, this.boss)) { + if (!net.neoforged.neoforge.event.EventHooks.getMobGriefingEvent(this.boss.level, this.boss)) { return; } Direction facing = boss.getDirection(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java index 31cf4d48c6..e7a51c458f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java @@ -17,9 +17,8 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.items.IItemHandler; - +import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.items.IItemHandler; import java.util.*; public class FindNextItemGoal extends ExtendedRangeGoal { @@ -55,7 +54,7 @@ public void start() { BlockEntity blockEntity = world.getBlockEntity(b); if(blockEntity == null) continue; - IItemHandler itemHandler = blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null); + IItemHandler itemHandler = blockEntity.getCapability(Capabilities.ITEM_HANDLER).orElse(null); if (itemHandler == null) continue; for(int i = 0; i < itemHandler.getSlots(); i++){ @@ -114,7 +113,7 @@ public void tick() { BlockEntity blockEntity = world.getBlockEntity(b); if(blockEntity == null) continue; - IItemHandler itemHandler = blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null); + IItemHandler itemHandler = blockEntity.getCapability(Capabilities.ITEM_HANDLER).orElse(null); if (itemHandler == null) continue; handlers.add(new StorageLecternTile.HandlerPos(b.immutable(), itemHandler)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/ChunkCache.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/ChunkCache.java index 13005710d7..8a8b0cb29b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/ChunkCache.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/ChunkCache.java @@ -26,9 +26,8 @@ import net.minecraft.world.level.material.Fluids; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.shapes.VoxelShape; -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 javax.annotation.Nullable; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/ClientEventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/ClientEventHandler.java index ec6e913a48..6d6498faf3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/ClientEventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/ClientEventHandler.java @@ -7,12 +7,12 @@ import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.event.ClientPlayerNetworkEvent; -import net.minecraftforge.client.event.RenderLevelStageEvent; -import net.minecraftforge.eventbus.api.EventPriority; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.bus.api.EventPriority; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent; +import net.neoforged.neoforge.client.event.RenderLevelStageEvent; /** * Used to handle client events. diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/FMLEventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/FMLEventHandler.java index 9acc1e52c5..9733ca0368 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/FMLEventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/FMLEventHandler.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.entity.pathfinding; -import net.minecraftforge.event.server.ServerStoppingEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.event.server.ServerStoppingEvent; /** * Event handler used to catch various forge events. diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/Pathfinding.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/Pathfinding.java index be02c9c28b..1b3cf78fa8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/Pathfinding.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/Pathfinding.java @@ -3,10 +3,9 @@ import com.hollingsworth.arsnouveau.common.entity.pathfinding.pathjobs.AbstractPathJob; import com.hollingsworth.arsnouveau.common.util.Log; import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - import java.util.concurrent.*; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; /** * Static class the handles all the Pathfinding. diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java index 5387c3240f..eb33105718 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java @@ -19,13 +19,13 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ShieldItem; import net.minecraft.world.phys.BlockHitResult; -import net.minecraftforge.event.ItemAttributeModifierEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; - +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.ItemAttributeModifierEvent; import java.util.UUID; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class ArsEvents { @SubscribeEvent @@ -71,8 +71,8 @@ public static void spellResolve(SpellResolveEvent.Post e) { @SubscribeEvent public static void preSpellDamage(SpellDamageEvent.Pre e) { - if (e.damageSource.is(DamageTypeTags.IS_FIRE) && e.caster.hasEffect(ModPotions.IMMOLATE_EFFECT.get())) { - e.damage += 2 * (e.caster.getEffect(ModPotions.IMMOLATE_EFFECT.get()).getAmplifier() + 1); + if (e.damageSource.is(DamageTypeTags.IS_FIRE) && e.caster.hasEffect(ModPotions.IMMOLATE_EFFECT)) { + e.damage += 2 * (e.caster.getEffect(ModPotions.IMMOLATE_EFFECT).getAmplifier() + 1); } } @@ -98,11 +98,11 @@ public static void modifyItemAttributes(ItemAttributeModifierEvent event) { if (itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.get()) > 0) { UUID uuid = getEnchantBoostBySlot(event.getSlotType()); - event.addModifier(PerkAttributes.MAX_MANA.get(), new AttributeModifier(uuid, "max_mana_enchant", ServerConfig.MANA_BOOST_BONUS.get() * itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.get()), AttributeModifier.Operation.ADDITION)); + event.addModifier(PerkAttributes.MAX_MANA, new AttributeModifier(uuid, "max_mana_enchant", ServerConfig.MANA_BOOST_BONUS.get() * itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.get()), AttributeModifier.Operation.ADD_VALUE)); } if (itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.get()) > 0) { UUID uuid = getEnchantBoostBySlot(event.getSlotType()); - event.addModifier(PerkAttributes.MANA_REGEN_BONUS.get(), new AttributeModifier(uuid, "mana_regen_enchant", ServerConfig.MANA_REGEN_ENCHANT_BONUS.get() * itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.get()), AttributeModifier.Operation.ADDITION)); + event.addModifier(PerkAttributes.MANA_REGEN_BONUS, new AttributeModifier(uuid, "mana_regen_enchant", ServerConfig.MANA_REGEN_ENCHANT_BONUS.get() * itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.get()), AttributeModifier.Operation.ADD_VALUE)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index cf56e260be..a0e0934d38 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -68,25 +68,34 @@ import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.event.AddReloadListenerEvent; -import net.minecraftforge.event.RegisterCommandsEvent; -import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.living.*; -import net.minecraftforge.event.entity.player.EntityItemPickupEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.level.SaplingGrowTreeEvent; -import net.minecraftforge.event.village.VillagerTradesEvent; -import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.eventbus.api.EventPriority; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.items.ItemHandlerHelper; -import net.minecraftforge.registries.ForgeRegistries; - +import net.neoforged.bus.api.Event; +import net.neoforged.bus.api.EventPriority; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.AddReloadListenerEvent; +import net.neoforged.neoforge.event.RegisterCommandsEvent; +import net.neoforged.neoforge.event.TickEvent; +import net.neoforged.neoforge.event.entity.living.LivingAttackEvent; +import net.neoforged.neoforge.event.entity.living.LivingEntityUseItemEvent; +import net.neoforged.neoforge.event.entity.living.LivingEvent; +import net.neoforged.neoforge.event.entity.living.LivingFallEvent; +import net.neoforged.neoforge.event.entity.living.LivingHealEvent; +import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; +import net.neoforged.neoforge.event.entity.living.LootingLevelEvent; +import net.neoforged.neoforge.event.entity.living.MobEffectEvent; +import net.neoforged.neoforge.event.entity.living.MobSpawnEvent; +import net.neoforged.neoforge.event.entity.living.ShieldBlockEvent; +import net.neoforged.neoforge.event.entity.player.EntityItemPickupEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.event.level.SaplingGrowTreeEvent; +import net.neoforged.neoforge.event.village.VillagerTradesEvent; +import net.neoforged.neoforge.items.ItemHandlerHelper; +import net.neoforged.neoforge.registries.ForgeRegistries; import java.util.*; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class EventHandler { @SubscribeEvent(priority = EventPriority.LOWEST) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/FamiliarEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/FamiliarEvents.java index a2ffedb741..1715057a93 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/FamiliarEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/FamiliarEvents.java @@ -9,14 +9,18 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraftforge.event.entity.living.*; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; - +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.entity.living.LivingEntityUseItemEvent; +import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; +import net.neoforged.neoforge.event.entity.living.LivingKnockBackEvent; +import net.neoforged.neoforge.event.entity.living.LootingLevelEvent; +import net.neoforged.neoforge.event.entity.living.MobEffectEvent; import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class FamiliarEvents { public static List getFamiliars(Predicate predicate) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/JarEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/JarEvents.java index 9a2115b5c8..040c183c3d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/JarEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/JarEvents.java @@ -11,12 +11,12 @@ import net.minecraft.world.entity.LightningBolt; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.LevelAccessor; -import net.minecraftforge.event.entity.EntityMountEvent; -import net.minecraftforge.event.level.NoteBlockEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.entity.EntityMountEvent; +import net.neoforged.neoforge.event.level.NoteBlockEvent; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class JarEvents { @SubscribeEvent diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/LightEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/LightEvents.java index 61c7c40564..5068fcc8bf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/LightEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/LightEvents.java @@ -7,15 +7,14 @@ import net.minecraft.core.NonNullList; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.network.PacketDistributor; - +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.TickEvent; +import net.neoforged.neoforge.network.PacketDistributor; import java.util.ArrayList; import java.util.List; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class LightEvents { @SubscribeEvent diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java index 3ec5d11658..dcc7951c26 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java @@ -9,13 +9,14 @@ import com.hollingsworth.arsnouveau.setup.config.ServerConfig; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.network.PacketDistributor; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.TickEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.network.PacketDistributor; +import var; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class ManaCapEvents { public static double MEAN_TPS = 20.0; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/OpenChestEvent.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/OpenChestEvent.java index c86315527e..f318948605 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/OpenChestEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/OpenChestEvent.java @@ -5,7 +5,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.block.entity.ChestBlockEntity; -import net.minecraftforge.common.util.FakePlayer; +import net.neoforged.neoforge.common.util.FakePlayer; public class OpenChestEvent implements ITimedEvent { ServerLevel level; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java index 83957d2d21..747d911a1f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java @@ -19,16 +19,15 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.event.entity.living.LivingDeathEvent; -import net.minecraftforge.event.entity.living.LivingEquipmentChangeEvent; -import net.minecraftforge.event.level.SleepFinishedTimeEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; - +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.entity.living.LivingDeathEvent; +import net.neoforged.neoforge.event.entity.living.LivingEquipmentChangeEvent; +import net.neoforged.neoforge.event.level.SleepFinishedTimeEvent; import java.util.ArrayList; import java.util.List; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class PerkEvents { @SubscribeEvent diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java index d1b11d1104..a13c15625e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java @@ -9,13 +9,13 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.event.entity.living.LivingHurtEvent; -import net.minecraftforge.event.entity.player.AttackEntityEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; +import net.neoforged.neoforge.event.entity.player.AttackEntityEvent; +import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class ReactiveEvents { @SubscribeEvent diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ScryEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ScryEvents.java index 06e694a523..79914ed552 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ScryEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ScryEvents.java @@ -22,19 +22,18 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.RenderLevelStageEvent; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.LogicalSide; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.network.PacketDistributor; - +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.LogicalSide; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.event.RenderLevelStageEvent; +import net.neoforged.neoforge.event.TickEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent; +import net.neoforged.neoforge.network.PacketDistributor; import java.util.ArrayList; import java.util.List; -@Mod.EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID) +@EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID) public class ScryEvents { @SubscribeEvent public static void playerLoginEvent(final PlayerLoggedInEvent event) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/SummonEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/SummonEvents.java index 5ae94caf04..9c5594dc43 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/SummonEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/SummonEvents.java @@ -2,10 +2,10 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.event.SummonEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class SummonEvents { @SubscribeEvent diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java index 94234b3390..92a463988a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java @@ -18,10 +18,10 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -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.Nullable; - +import record; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AnimBlockItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AnimBlockItem.java index 6b34f76fd2..64c5aeedd7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AnimBlockItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AnimBlockItem.java @@ -2,8 +2,8 @@ import net.minecraft.world.level.block.Block; import software.bernie.geckolib.animatable.GeoItem; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; @@ -15,7 +15,7 @@ public AnimBlockItem(Block blockIn, Properties builder) { } @Override - public void registerControllers(AnimatableManager.ControllerRegistrar animatableManager) { + public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java index 11b3fd1de5..5910e0541b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java @@ -17,7 +17,7 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.core.animation.AnimatableManager; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersShield.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersShield.java index 26a473e400..278192a37f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersShield.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersShield.java @@ -11,7 +11,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ShieldItem; import net.minecraft.world.level.Level; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.core.animation.AnimatableManager; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java index 1c4bb7a6c0..5740b9f084 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java @@ -23,7 +23,7 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.core.animation.AnimatableManager; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java index 3531cc9d5d..dfbc2b1491 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java @@ -30,9 +30,9 @@ import net.minecraft.world.item.alchemy.PotionUtils; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.core.animation.AnimatableManager; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java index a2734db1a1..8b8ed754f7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java @@ -18,9 +18,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -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 javax.annotation.Nullable; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java index c6538f7b08..ef10a1032a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java @@ -13,8 +13,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -import net.minecraftforge.items.IItemHandler; - +import net.neoforged.neoforge.items.IItemHandler; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java index 73d8f6e537..695096b951 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java @@ -14,7 +14,7 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ModBlockItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ModBlockItem.java index 8b3fb70ed4..f2321ff7ff 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ModBlockItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ModBlockItem.java @@ -7,9 +7,8 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -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 javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java index ab4ab881f2..557b8f3022 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java @@ -7,9 +7,8 @@ import net.minecraft.world.item.Rarity; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -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 javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -41,11 +40,6 @@ public ModItem withRarity(Rarity rarity) { return this; } - @Override - public Rarity getRarity(ItemStack stack) { - return rarity != null ? rarity : super.getRarity(stack); - } - /** * allows items to add custom lines of information to the mouseover description */ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/PerkItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/PerkItem.java index 2b72295b14..963df96e16 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/PerkItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/PerkItem.java @@ -8,9 +8,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -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 javax.annotation.Nullable; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/RendererBlockItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/RendererBlockItem.java index 3259fabd90..2b9a81d20d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/RendererBlockItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/RendererBlockItem.java @@ -1,9 +1,11 @@ package com.hollingsworth.arsnouveau.common.items; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.BlockRegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.world.level.block.Block; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import software.bernie.geckolib.animation.AnimatableManager; import java.util.function.Consumer; import java.util.function.Supplier; @@ -15,7 +17,7 @@ public RendererBlockItem(Block block, Properties props) { super(block, props); } - public RendererBlockItem(RegistryWrapper block, Properties props) { + public RendererBlockItem(BlockRegistryWrapper block, Properties props) { this(block.get(), props); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java index 3f85c23b9a..ee16f8347a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java @@ -31,7 +31,7 @@ import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java index b315907ed9..33cbbfc054 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java @@ -38,9 +38,9 @@ import net.minecraft.world.item.UseAnim; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java index e4e3a1f47d..965a3c57ea 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java @@ -22,8 +22,8 @@ import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; -import net.minecraftforge.common.ForgeHooks; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.neoforge.common.CommonHooks; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.core.animation.AnimatableManager; @@ -58,7 +58,7 @@ public ItemStack findAmmo(Player playerEntity, ItemStack shootable) { .and(i -> !(i.getItem() instanceof SpellArrow) || (i.getItem() instanceof SpellArrow && canPlayerCastSpell(shootable, playerEntity))); ItemStack itemstack = ProjectileWeaponItem.getHeldProjectile(playerEntity, predicate); if (!itemstack.isEmpty()) { - return ForgeHooks.getProjectile(playerEntity, shootable, itemstack); + return CommonHooks.getProjectile(playerEntity, shootable, itemstack); } else { predicate = projectileWeaponItem.getAllSupportedProjectiles().and(i -> !(i.getItem() instanceof SpellArrow) || @@ -68,11 +68,11 @@ public ItemStack findAmmo(Player playerEntity, ItemStack shootable) { for (int i = 0; i < playerEntity.getInventory().getContainerSize(); ++i) { ItemStack itemstack1 = playerEntity.inventory.getItem(i); if (predicate.test(itemstack1)) { - return ForgeHooks.getProjectile(playerEntity, shootable, itemstack1); + return CommonHooks.getProjectile(playerEntity, shootable, itemstack1); } } - return ForgeHooks.getProjectile(playerEntity, shootable, playerEntity.abilities.instabuild ? new ItemStack(Items.ARROW) : ItemStack.EMPTY); + return CommonHooks.getProjectile(playerEntity, shootable, playerEntity.abilities.instabuild ? new ItemStack(Items.ARROW) : ItemStack.EMPTY); } } } @@ -82,7 +82,7 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In ISpellCaster caster = getSpellCaster(playerIn.getItemInHand(handIn)); boolean hasAmmo = !findAmmo(playerIn, itemstack).isEmpty(); - InteractionResultHolder ret = net.minecraftforge.event.ForgeEventFactory.onArrowNock(itemstack, worldIn, playerIn, handIn, hasAmmo); + InteractionResultHolder ret = net.neoforged.neoforge.event.EventHooks.onArrowNock(itemstack, worldIn, playerIn, handIn, hasAmmo); if (ret != null) return ret; if (hasAmmo || (caster.getSpell().isValid() && new SpellResolver(new SpellContext(worldIn, caster.getSpell(), playerIn, new PlayerCaster(playerIn), itemstack)).withSilent(true).canCast(playerIn))) { @@ -116,7 +116,7 @@ public void releaseUsing(ItemStack bowStack, Level worldIn, LivingEntity entityL ItemStack arrowStack = findAmmo(playerentity, bowStack); int useTime = this.getUseDuration(bowStack) - timeLeft; - useTime = net.minecraftforge.event.ForgeEventFactory.onArrowLoose(bowStack, worldIn, playerentity, useTime, !arrowStack.isEmpty() || isInfinity); + useTime = net.neoforged.neoforge.event.EventHooks.onArrowLoose(bowStack, worldIn, playerentity, useTime, !arrowStack.isEmpty() || isInfinity); if (useTime < 0) return; boolean canFire = false; if (!arrowStack.isEmpty() || isInfinity) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java index 8c2ba84ba8..2563705abf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java @@ -33,7 +33,7 @@ import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import org.joml.Quaternionf; import org.joml.Vector3f; import software.bernie.geckolib.animatable.GeoItem; @@ -252,7 +252,7 @@ private AbstractArrow getArrow(Level pLevel, LivingEntity pLivingEntity, ItemSta } // was override of performShooting public void shootStoredProjectiles(Level pLevel, LivingEntity pShooter, InteractionHand pUsedHand, ItemStack pCrossbowStack, float pVelocity, float pInaccuracy) { - if (pShooter instanceof Player player && net.minecraftforge.event.ForgeEventFactory.onArrowLoose(pCrossbowStack, pShooter.level, player, 1, true) < 0) return; + if (pShooter instanceof Player player && net.neoforged.neoforge.event.EventHooks.onArrowLoose(pCrossbowStack, pShooter.level, player, 1, true) < 0) return; List list = getChargedProjectiles(pCrossbowStack); float[] afloat = getShotPitches(pShooter.getRandom()); boolean isSpell = pCrossbowStack.hasTag() && pCrossbowStack.getTag().getBoolean("isSpell"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShades.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShades.java index 4622aecddc..f791aa643d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShades.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShades.java @@ -14,8 +14,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; - +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import java.util.function.Consumer; public class StarbuncleShades extends AnimModItem implements ICosmeticItem { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java index 3cb635d102..56fa612b12 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java @@ -19,7 +19,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.core.animatable.GeoAnimatable; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/WixieHat.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/WixieHat.java index 180c520900..4890dea328 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/WixieHat.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/WixieHat.java @@ -19,8 +19,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; - +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import java.util.function.Consumer; public class WixieHat extends AnimModItem implements ICosmeticItem { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/JumpingRing.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/JumpingRing.java index 2515f926d0..887178b00b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/JumpingRing.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/JumpingRing.java @@ -10,7 +10,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeHooks; +import net.neoforged.neoforge.common.CommonHooks; import top.theillusivec4.curios.api.SlotContext; public class JumpingRing extends ArsNouveauCurio { @@ -36,7 +36,7 @@ public static void doJump(Player player){ player.hasImpulse = true; player.hurtMarked = true; player.fallDistance = 0; - ForgeHooks.onLivingJump(player); + CommonHooks.onLivingJump(player); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/SummoningFocus.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/SummoningFocus.java index a7427b0b48..629d5fd8c1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/SummoningFocus.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/SummoningFocus.java @@ -21,15 +21,14 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.HitResult; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.items.IItemHandlerModifiable; - +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.items.IItemHandlerModifiable; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class SummoningFocus extends ArsNouveauCurio implements ISpellModifierItem { public SummoningFocus() { super(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/AllowItemScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/AllowItemScroll.java index 1c0e3a4cc1..6ff8ab7ae2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/AllowItemScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/AllowItemScroll.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.common.items.ItemScroll; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; +import net.neoforged.neoforge.items.IItemHandler; public class AllowItemScroll extends ItemScroll { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/DenyItemScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/DenyItemScroll.java index 79672f1888..6721b9cfa0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/DenyItemScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/DenyItemScroll.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.common.items.ItemScroll; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; +import net.neoforged.neoforge.items.IItemHandler; public class DenyItemScroll extends ItemScroll { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/MimicItemScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/MimicItemScroll.java index 2a83638a9f..180836d645 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/MimicItemScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/MimicItemScroll.java @@ -6,7 +6,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraftforge.items.IItemHandler; +import net.neoforged.neoforge.items.IItemHandler; public class MimicItemScroll extends ItemScroll { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/light/DynamLightUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/light/DynamLightUtil.java index 28b5771968..274c2952fa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/light/DynamLightUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/light/DynamLightUtil.java @@ -7,7 +7,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.registries.ForgeRegistries; public class DynamLightUtil { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java b/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java index 571356385e..d2ac5c175e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java @@ -14,10 +14,10 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.LightLayer; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; - +import var; import java.util.*; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Function; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/PotionRecipeMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/PotionRecipeMixin.java index 917f26fdae..53f73b6841 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/PotionRecipeMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/PotionRecipeMixin.java @@ -9,7 +9,7 @@ @Mixin(PotionBrewing.class) public interface PotionRecipeMixin { - @Accessor("POTION_MIXES") + @Accessor("potionMixes") static List> mixList() { throw new AssertionError(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ClientChunkCacheMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ClientChunkCacheMixin.java index 50b3e8a7af..92ca85ee58 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ClientChunkCacheMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ClientChunkCacheMixin.java @@ -12,8 +12,8 @@ import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.level.ChunkEvent; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.level.ChunkEvent; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -71,7 +71,7 @@ public void onDrop(int x, int z, CallbackInfo ci) { LevelChunk chunk = cameraStorage.getChunk(i); if (chunk != null && chunk.getPos().x == x && chunk.getPos().z == z) { - MinecraftForge.EVENT_BUS.post(new ChunkEvent.Unload(chunk)); + NeoForge.EVENT_BUS.post(new ChunkEvent.Unload(chunk)); cameraStorage.replace(i, chunk, null); } } @@ -98,7 +98,7 @@ private void onReplace(int x, int z, FriendlyByteBuf buffer, CompoundTag chunkTa chunk.replaceWithPacketData(buffer, chunkTag, tagOutputConsumer); level.onChunkLoaded(chunkPos); - MinecraftForge.EVENT_BUS.post(new ChunkEvent.Load(chunk, false)); + NeoForge.EVENT_BUS.post(new ChunkEvent.Load(chunk, false)); callback.setReturnValue(chunk); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/LightEntityMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/LightEntityMixin.java index 0623f8c03f..7422a193ba 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/LightEntityMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/LightEntityMixin.java @@ -22,6 +22,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import var; @Mixin(Entity.class) public abstract class LightEntityMixin implements LambDynamicLight { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/AbstractPacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/AbstractPacket.java index 28164a0bb0..3b2aba3c4a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/AbstractPacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/AbstractPacket.java @@ -1,8 +1,7 @@ package com.hollingsworth.arsnouveau.common.network; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public abstract class AbstractPacket { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/ChangeBiomePacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/ChangeBiomePacket.java index 0c318134bd..3a9ac95511 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/ChangeBiomePacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/ChangeBiomePacket.java @@ -16,8 +16,7 @@ import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.chunk.PalettedContainer; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class ChangeBiomePacket { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/ClientToServerStoragePacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/ClientToServerStoragePacket.java index fd487683d7..802ee365ed 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/ClientToServerStoragePacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/ClientToServerStoragePacket.java @@ -4,9 +4,8 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.NetworkDirection; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkDirection; +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class ClientToServerStoragePacket { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/HighlightAreaPacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/HighlightAreaPacket.java index cfe022b00d..25ff09023f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/HighlightAreaPacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/HighlightAreaPacket.java @@ -3,8 +3,7 @@ import com.hollingsworth.arsnouveau.client.ClientInfo; import com.hollingsworth.arsnouveau.client.particle.ColorPos; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java index 33edf841e3..a794a820e1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java @@ -8,11 +8,10 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; -import net.minecraftforge.network.NetworkDirection; -import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.PacketDistributor; -import net.minecraftforge.network.simple.SimpleChannel; - +import net.neoforged.neoforge.network.NetworkDirection; +import net.neoforged.neoforge.network.NetworkRegistry; +import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.network.simple.SimpleChannel; import java.util.Optional; public class Networking { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/NotEnoughManaPacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/NotEnoughManaPacket.java index 7b0871b116..6cde192fd5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/NotEnoughManaPacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/NotEnoughManaPacket.java @@ -2,8 +2,7 @@ import com.hollingsworth.arsnouveau.client.ClientInfo; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class NotEnoughManaPacket{ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketANEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketANEffect.java index 81287dc086..5e442d5f55 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketANEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketANEffect.java @@ -9,8 +9,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketANEffect { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAddFadingLight.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAddFadingLight.java index 660a90ecf9..f6878d6888 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAddFadingLight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAddFadingLight.java @@ -8,8 +8,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketAddFadingLight { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAnimEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAnimEntity.java index bb7f0796cc..4951478d01 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAnimEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAnimEntity.java @@ -4,8 +4,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketAnimEntity { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientDelayEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientDelayEffect.java index 213121f213..f8e4013f11 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientDelayEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientDelayEffect.java @@ -16,8 +16,7 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import javax.annotation.Nullable; import java.util.function.Supplier; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java index d58fb83827..705769e9c6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java @@ -9,8 +9,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.PotionItem; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketConsumePotion { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketDismountCamera.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketDismountCamera.java index 05916da3d5..0bdd61355d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketDismountCamera.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketDismountCamera.java @@ -3,8 +3,7 @@ import com.hollingsworth.arsnouveau.common.entity.ScryerCamera; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; // https://github.com/Geforce132/SecurityCraft/blob/1.18.2/src/main/java/net/geforcemods/securitycraft/network/server/DismountCamera.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketDispelFamiliars.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketDispelFamiliars.java index 7cc323e956..67b0762d22 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketDispelFamiliars.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketDispelFamiliars.java @@ -8,8 +8,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketDispelFamiliars { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketGenericClientMessage.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketGenericClientMessage.java index 0f189b89c6..4e1a98713d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketGenericClientMessage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketGenericClientMessage.java @@ -3,8 +3,7 @@ import com.hollingsworth.arsnouveau.common.items.curios.JumpingRing; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketGenericClientMessage { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketGetPersistentData.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketGetPersistentData.java index 0341bfc407..a0716d5c5c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketGetPersistentData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketGetPersistentData.java @@ -3,8 +3,7 @@ import com.hollingsworth.arsnouveau.client.ClientInfo; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketGetPersistentData { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketHotkeyPressed.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketHotkeyPressed.java index fc7c0195fd..e300e17875 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketHotkeyPressed.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketHotkeyPressed.java @@ -6,8 +6,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketHotkeyPressed { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketJoinedServer.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketJoinedServer.java index a2a9b8f6d8..4a61e82ebc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketJoinedServer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketJoinedServer.java @@ -5,8 +5,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketJoinedServer { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketMountCamera.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketMountCamera.java index f1aae88370..fdf661bb96 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketMountCamera.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketMountCamera.java @@ -7,8 +7,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketMountCamera { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketNoSpamChatMessage.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketNoSpamChatMessage.java index d963801f00..4d948657a3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketNoSpamChatMessage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketNoSpamChatMessage.java @@ -10,8 +10,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MessageSignature; import net.minecraft.network.chat.Style; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.Random; import java.util.function.Supplier; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOneShotAnimation.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOneShotAnimation.java index 295372c0b2..689079e09c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOneShotAnimation.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOneShotAnimation.java @@ -5,8 +5,7 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketOneShotAnimation { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenGlyphCraft.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenGlyphCraft.java index f427faaddd..861ebcd6a4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenGlyphCraft.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenGlyphCraft.java @@ -3,8 +3,7 @@ import com.hollingsworth.arsnouveau.client.gui.book.GlyphUnlockMenu; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketOpenGlyphCraft { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenSpellBook.java index fd736e55db..1522e150b3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenSpellBook.java @@ -5,8 +5,7 @@ import com.hollingsworth.arsnouveau.setup.config.ServerConfig; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.InteractionHand; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketOpenSpellBook { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketQuickCast.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketQuickCast.java index 5e0f2f0d5e..e3ed2893dd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketQuickCast.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketQuickCast.java @@ -6,8 +6,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketQuickCast { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketReactiveSpell.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketReactiveSpell.java index 739dc3c216..7995c4524f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketReactiveSpell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketReactiveSpell.java @@ -4,8 +4,7 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketReactiveSpell { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java index 13f19f99d0..95f97d4029 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java @@ -6,8 +6,7 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketSetBookMode { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetCameraView.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetCameraView.java index ab89a51977..984ff9594d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetCameraView.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetCameraView.java @@ -7,8 +7,7 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; // https://github.com/Geforce132/SecurityCraft/blob/1.18.2/src/main/java/net/geforcemods/securitycraft/network/client/SetCameraView.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java index 15e1fd42f5..373bf15f35 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java @@ -7,8 +7,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.PotionItem; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketSetLauncher extends AbstractPacket{ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetScribeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetScribeRecipe.java index 3fb56cb474..19e9a6538b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetScribeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetScribeRecipe.java @@ -7,8 +7,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.crafting.Recipe; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketSetScribeRecipe { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java index 77465d1dae..e0d454dd74 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java @@ -8,9 +8,8 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.network.NetworkEvent; -import net.minecraftforge.network.PacketDistributor; - +import net.neoforged.neoforge.network.NetworkEvent; +import net.neoforged.neoforge.network.PacketDistributor; import java.util.function.Supplier; public class PacketSetSound { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonFamiliar.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonFamiliar.java index 3b9d767e67..02d058ff73 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonFamiliar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonFamiliar.java @@ -9,9 +9,8 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketSummonFamiliar { @@ -47,7 +46,7 @@ public void handle(Supplier ctx) { familiarEntity.getThisEntity().setPos(owner.getX(), owner.getY(), owner.getZ()); FamiliarSummonEvent summonEvent = new FamiliarSummonEvent(familiarEntity.getThisEntity(), owner); - MinecraftForge.EVENT_BUS.post(summonEvent); + NeoForge.EVENT_BUS.post(summonEvent); if (!summonEvent.isCanceled()) { owner.level.addFreshEntity(familiarEntity.getThisEntity()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonLily.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonLily.java index db19488961..963ceecf60 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonLily.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonLily.java @@ -3,8 +3,7 @@ import com.hollingsworth.arsnouveau.common.entity.Lily; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketSummonLily { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncLitEntities.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncLitEntities.java index 85b912f8ee..e2b85b62ad 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncLitEntities.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncLitEntities.java @@ -2,8 +2,7 @@ import com.hollingsworth.arsnouveau.common.light.LightManager; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java index a31724e6b3..bff29b89db 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java @@ -7,8 +7,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketSyncPlayerCap { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncTag.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncTag.java index 27b63847c5..5e75b8d344 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncTag.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncTag.java @@ -4,8 +4,7 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketSyncTag { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketTimedEvent.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketTimedEvent.java index 227602f603..f23aa98edd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketTimedEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketTimedEvent.java @@ -5,8 +5,7 @@ import com.hollingsworth.arsnouveau.common.event.timed.EruptionEvent; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.HashMap; import java.util.Map; import java.util.function.Function; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleFamiliar.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleFamiliar.java index 3e5796b64d..9d737fab6b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleFamiliar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleFamiliar.java @@ -9,9 +9,8 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketToggleFamiliar { @@ -48,7 +47,7 @@ public void handle(Supplier ctx) { familiarEntity.getThisEntity().setPos(owner.getX(), owner.getY(), owner.getZ()); FamiliarSummonEvent summonEvent = new FamiliarSummonEvent(familiarEntity.getThisEntity(), owner); - MinecraftForge.EVENT_BUS.post(summonEvent); + NeoForge.EVENT_BUS.post(summonEvent); if (!summonEvent.isCanceled()) { owner.level.addFreshEntity(familiarEntity.getThisEntity()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleLight.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleLight.java index a84c1719f0..05f4ce88c4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleLight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleLight.java @@ -2,8 +2,7 @@ import com.hollingsworth.arsnouveau.common.light.LightManager; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketToggleLight { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketTogglePathing.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketTogglePathing.java index c20cd8c4d3..785a7158e1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketTogglePathing.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketTogglePathing.java @@ -2,8 +2,7 @@ import com.hollingsworth.arsnouveau.common.entity.pathfinding.pathjobs.AbstractPathJob; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketTogglePathing { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUnsummonLily.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUnsummonLily.java index 90628ed7ec..78d1624cbd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUnsummonLily.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUnsummonLily.java @@ -5,8 +5,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.UUID; import java.util.function.Supplier; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateBookGUI.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateBookGUI.java index da063d1629..aa9fffaec9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateBookGUI.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateBookGUI.java @@ -4,8 +4,7 @@ import com.hollingsworth.arsnouveau.client.gui.book.GuiSpellBook; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketUpdateBookGUI { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java index ccc9a71aa1..22c2b6f4b5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java @@ -7,9 +7,8 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.network.NetworkEvent; -import net.minecraftforge.network.PacketDistributor; - +import net.neoforged.neoforge.network.NetworkEvent; +import net.neoforged.neoforge.network.PacketDistributor; import java.util.function.Supplier; public class PacketUpdateCaster { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateFlight.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateFlight.java index 2e4b6f3685..c2826271a6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateFlight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateFlight.java @@ -2,8 +2,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketUpdateFlight { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateMana.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateMana.java index cba6ca5d75..1f89da4c0a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateMana.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateMana.java @@ -4,8 +4,7 @@ import com.hollingsworth.arsnouveau.client.ClientInfo; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketUpdateMana { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColorAll.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColorAll.java index 18643e7408..7c0854e237 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColorAll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColorAll.java @@ -7,9 +7,8 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.network.NetworkEvent; -import net.minecraftforge.network.PacketDistributor; - +import net.neoforged.neoforge.network.NetworkEvent; +import net.neoforged.neoforge.network.PacketDistributor; import java.util.function.Supplier; public class PacketUpdateSpellColorAll extends PacketUpdateSpellColors { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColors.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColors.java index c4b0e5fb2d..d041a679d0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColors.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColors.java @@ -8,9 +8,8 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.network.NetworkEvent; -import net.minecraftforge.network.PacketDistributor; - +import net.neoforged.neoforge.network.NetworkEvent; +import net.neoforged.neoforge.network.PacketDistributor; import java.util.function.Supplier; public class PacketUpdateSpellColors { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java index 5c9c11ce1f..40eb7e8480 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java @@ -7,9 +7,8 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.network.NetworkEvent; -import net.minecraftforge.network.PacketDistributor; - +import net.neoforged.neoforge.network.NetworkEvent; +import net.neoforged.neoforge.network.PacketDistributor; import java.util.function.Supplier; public class PacketUpdateSpellSoundAll extends PacketSetSound { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketWarpPosition.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketWarpPosition.java index d2bcbbe6c0..54d9589a62 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketWarpPosition.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketWarpPosition.java @@ -4,8 +4,7 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.Entity; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class PacketWarpPosition { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PotionSyncPacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PotionSyncPacket.java index 22ad8e739d..53f071b42c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PotionSyncPacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PotionSyncPacket.java @@ -7,10 +7,9 @@ import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.LivingEntity; -import net.minecraftforge.network.NetworkDirection; -import net.minecraftforge.network.NetworkEvent; -import net.minecraftforge.registries.ForgeRegistries; - +import net.neoforged.neoforge.network.NetworkDirection; +import net.neoforged.neoforge.network.NetworkEvent; +import net.neoforged.neoforge.registries.ForgeRegistries; import java.util.function.Supplier; public class PotionSyncPacket { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/ServerToClientStoragePacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/ServerToClientStoragePacket.java index e97ff9269a..737ef5e23e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/ServerToClientStoragePacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/ServerToClientStoragePacket.java @@ -4,9 +4,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkDirection; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkDirection; +import net.neoforged.neoforge.network.NetworkEvent; import java.util.function.Supplier; public class ServerToClientStoragePacket { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/SyncPathMessage.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/SyncPathMessage.java index fcf33aace2..4f1e00c64e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/SyncPathMessage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/SyncPathMessage.java @@ -3,8 +3,7 @@ import com.hollingsworth.arsnouveau.client.renderer.world.PathfindingDebugRenderer; import com.hollingsworth.arsnouveau.common.entity.pathfinding.ModNode; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.HashSet; import java.util.Set; import java.util.function.Supplier; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/SyncPathReachedMessage.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/SyncPathReachedMessage.java index 19c3733b38..b95803ec12 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/SyncPathReachedMessage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/SyncPathReachedMessage.java @@ -4,8 +4,7 @@ import com.hollingsworth.arsnouveau.common.entity.pathfinding.ModNode; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - +import net.neoforged.neoforge.network.NetworkEvent; import java.util.HashSet; import java.util.Set; import java.util.function.Supplier; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/DepthsPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/DepthsPerk.java index 5ba24e3d1f..2ac4a672e8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/DepthsPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/DepthsPerk.java @@ -9,8 +9,7 @@ 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.ForgeMod; - +import net.neoforged.neoforge.common.NeoForgeMod; import java.util.UUID; public class DepthsPerk extends Perk { @@ -26,7 +25,7 @@ public DepthsPerk(ResourceLocation key) { public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { ImmutableMultimap.Builder modifiers = new ImmutableMultimap.Builder<>(); if(slotValue >= 3){ - modifiers.put(ForgeMod.SWIM_SPEED.get(), new AttributeModifier(PERK_UUID, "DepthsPerk", 2.0, AttributeModifier.Operation.ADDITION)); + modifiers.put(NeoForgeMod.SWIM_SPEED.get(), new AttributeModifier(PERK_UUID, "DepthsPerk", 2.0, AttributeModifier.Operation.ADDITION)); } return modifiers.build(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/StepHeightPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/StepHeightPerk.java index 8e89c124dc..695d9a6df2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/StepHeightPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/StepHeightPerk.java @@ -9,8 +9,7 @@ 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.ForgeMod; - +import net.neoforged.neoforge.common.NeoForgeMod; import java.util.UUID; public class StepHeightPerk extends Perk { @@ -26,7 +25,7 @@ public StepHeightPerk(ResourceLocation key) { @Override public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { ImmutableMultimap.Builder modifiers = new ImmutableMultimap.Builder<>(); - modifiers.put(ForgeMod.STEP_HEIGHT_ADDITION.get(), new AttributeModifier(PERK_STEP_UUID, "StepPerk", slotValue, AttributeModifier.Operation.ADDITION)); + modifiers.put(NeoForgeMod.STEP_HEIGHT_ADDITION.get(), new AttributeModifier(PERK_STEP_UUID, "StepPerk", slotValue, AttributeModifier.Operation.ADDITION)); return modifiers.build(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/BounceEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/BounceEffect.java index d150a4aa38..f0f894c979 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/BounceEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/BounceEffect.java @@ -10,12 +10,12 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.event.entity.living.LivingFallEvent; -import net.minecraftforge.event.entity.living.LivingHurtEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.entity.living.LivingFallEvent; +import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class BounceEffect extends MobEffect { public BounceEffect() { super(MobEffectCategory.BENEFICIAL, 2039587); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java index 66577add65..ec03c0aff5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java @@ -8,12 +8,12 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.event.entity.living.LivingHurtEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.TickEvent; +import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class GravityEffect extends MobEffect { public GravityEffect() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/ShockedEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/ShockedEffect.java index 1cd9721f0f..956d1e1d70 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/ShockedEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/ShockedEffect.java @@ -6,8 +6,8 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.energy.IEnergyStorage; +import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.energy.IEnergyStorage; public class ShockedEffect extends MobEffect { @@ -29,16 +29,16 @@ public boolean isDurationEffectTick(int duration, int amp) { public void applyEffectTick(LivingEntity entity, int amp) { int multiplier = 0; for (ItemStack i : entity.getArmorSlots()) { - IEnergyStorage energyStorage = i.getCapability(ForgeCapabilities.ENERGY).orElse(null); + IEnergyStorage energyStorage = i.getCapability(Capabilities.ENERGY).orElse(null); if (energyStorage != null) { multiplier++; } } - IEnergyStorage energyStorage = entity.getMainHandItem().getCapability(ForgeCapabilities.ENERGY).orElse(null); + IEnergyStorage energyStorage = entity.getMainHandItem().getCapability(Capabilities.ENERGY).orElse(null); if (energyStorage != null) multiplier++; - energyStorage = entity.getOffhandItem().getCapability(ForgeCapabilities.ENERGY).orElse(null); + energyStorage = entity.getOffhandItem().getCapability(Capabilities.ENERGY).orElse(null); if (energyStorage != null) multiplier++; if (multiplier > 0) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java index 7e22490174..32e6d8f533 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java @@ -10,7 +10,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraftforge.event.entity.living.MobSpawnEvent; +import net.neoforged.neoforge.event.entity.living.MobSpawnEvent; import org.jetbrains.annotations.Nullable; public class DenySpawnRitual extends RangeRitual { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAnimalSummoning.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAnimalSummoning.java index bacf342919..602c73300b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAnimalSummoning.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAnimalSummoning.java @@ -14,13 +14,12 @@ import net.minecraft.util.random.WeightedEntry; import net.minecraft.util.random.WeightedRandomList; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.MobSpawnSettings; -import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.Nullable; import java.util.Optional; @@ -30,20 +29,18 @@ public class RitualAnimalSummoning extends AbstractRitual { private final MobCategory category = MobCategory.CREATURE; private WeightedRandomList mobs; - private Optional recipe; + private Optional> recipe; - private Optional getRecipe() { - return getWorld().getRecipeManager().getAllRecipesFor(RecipeRegistry.SUMMON_RITUAL_TYPE.get()).stream().filter(r -> r.matches(getConsumedItems())).findFirst(); + private Optional> getRecipe() { + return getWorld().getRecipeManager().getAllRecipesFor(RecipeRegistry.SUMMON_RITUAL_TYPE.get()).stream().filter(r -> r.value().matches(getConsumedItems())).findFirst(); } private WeightedRandomList getMobs(Level world) { if (recipe.isPresent()) { - SummonRitualRecipe summonRitualRecipe = recipe.get(); - if (summonRitualRecipe.mobSource == SummonRitualRecipe.MobSource.MOB_LIST) { - return WeightedRandomList.create(summonRitualRecipe.mobs); - } + SummonRitualRecipe summonRitualRecipe = recipe.get().value(); + return summonRitualRecipe.mobs(); } - return WeightedRandomList.create(world.getBiome(getPos()).get().getMobSettings().getMobs(category).unwrap().stream().filter(mob -> !mob.type.is(EntityTags.ANIMAL_SUMMON_BLACKLIST)).collect(Collectors.toList())); + return WeightedRandomList.create(world.getBiome(getPos()).value().getMobSettings().getMobs(category).unwrap().stream().filter(mob -> !mob.type.is(EntityTags.ANIMAL_SUMMON_BLACKLIST)).collect(Collectors.toList())); } @Override @@ -79,18 +76,10 @@ protected void tick() { summon(mob, summonPos); incrementProgress(); } - if (entry instanceof SummonRitualRecipe.WeightedMobType weightedMobType) { - EntityType entityType = ForgeRegistries.ENTITY_TYPES.getValue(weightedMobType.mob()); - if (entityType == null) return; - Entity mob = entityType.create(world); - if (mob == null) return; - summon(mob, summonPos); - incrementProgress(); - } }); recipe.ifPresentOrElse(recipe -> { - if (getProgress() >= recipe.count) { + if (getProgress() >= recipe.value().count()) { setFinished(); } }, () -> { @@ -103,8 +92,8 @@ protected void tick() { public void summon(Entity mob, BlockPos pos) { mob.setPos(pos.getX(), pos.getY(), pos.getZ()); - mob.level.addFreshEntity(mob); - if (mob.level instanceof ServerLevel serverLevel) { + mob.level().addFreshEntity(mob); + if (mob.level() instanceof ServerLevel serverLevel) { for (ServerPlayer player : serverLevel.players()) { serverLevel.sendParticles(player, ParticleTypes.END_ROD, false, pos.getX(), pos.getY() + 0.1, pos.getZ(), 10, 0.1, 0.1, 0.1, 0.05); } @@ -122,7 +111,7 @@ public boolean canStart(@Nullable Player player) { @Override public boolean canConsumeItem(ItemStack stack) { - return getWorld().getRecipeManager().getAllRecipesFor(RecipeRegistry.SUMMON_RITUAL_TYPE.get()).stream().anyMatch(r -> r.catalyst.test(stack)); + return getWorld().getRecipeManager().getAllRecipesFor(RecipeRegistry.SUMMON_RITUAL_TYPE.get()).stream().anyMatch(r -> r.value().augment().test(stack)); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualFlight.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualFlight.java index ca6f902b01..ef26a92f26 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualFlight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualFlight.java @@ -9,7 +9,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.effect.MobEffect; -import net.minecraftforge.event.entity.living.LivingEvent; +import net.neoforged.neoforge.event.entity.living.LivingEvent; public class RitualFlight extends RangeEffectRitual { @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualHealing.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualHealing.java index da02ae32f2..e3ed746a9a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualHealing.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualHealing.java @@ -13,8 +13,7 @@ import net.minecraft.world.entity.monster.ZombieVillager; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.AABB; -import net.minecraftforge.common.util.FakePlayer; - +import net.neoforged.neoforge.common.util.FakePlayer; import java.util.List; import java.util.Optional; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualMobCapture.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualMobCapture.java index 029d3ccb15..1f30269ad3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualMobCapture.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualMobCapture.java @@ -24,7 +24,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.entity.PartEntity; +import net.neoforged.neoforge.entity.PartEntity; public class RitualMobCapture extends AbstractRitual { @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualPillagerRaid.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualPillagerRaid.java index b144ff1aaa..f4df372458 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualPillagerRaid.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualPillagerRaid.java @@ -13,8 +13,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.phys.AABB; -import net.minecraftforge.common.Tags; - +import net.neoforged.neoforge.common.Tags; import java.util.List; public class RitualPillagerRaid extends AbstractRitual { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java index e625c606dc..de9f2f9a27 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java @@ -25,7 +25,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.AABB; -import net.minecraftforge.network.PacketDistributor; +import net.neoforged.neoforge.network.PacketDistributor; import org.jetbrains.annotations.Nullable; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java index 17a1ae51a9..9b053d36ec 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java @@ -42,7 +42,7 @@ protected void tick() { WildenChimera chimera = new WildenChimera(getWorld()); summon(chimera, getPos().above()); for(BlockPos b : BlockPos.betweenClosed(getPos().east(5).north(5).above(), getPos().west(5).south(5).above(5))){ - if (!net.minecraftforge.event.ForgeEventFactory.getMobGriefingEvent(this.getWorld(), chimera)) { + if (!net.neoforged.neoforge.event.EventHooks.getMobGriefingEvent(this.getWorld(), chimera)) { continue; } if (SpellUtil.isCorrectHarvestLevel(4, this.getWorld().getBlockState(b))) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/casters/ReactiveCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/casters/ReactiveCaster.java index 8107065c96..090d79d241 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/casters/ReactiveCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/casters/ReactiveCaster.java @@ -12,7 +12,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraftforge.common.util.FakePlayer; +import net.neoforged.neoforge.common.util.FakePlayer; public class ReactiveCaster extends SpellCaster { public ReactiveCaster(ItemStack stack) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectAnimate.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectAnimate.java index 5bb865a3df..e59b9916c8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectAnimate.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectAnimate.java @@ -17,7 +17,7 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -67,7 +67,7 @@ private AnimBlockSummon animateBlock(HitResult rayTraceResult, Vec3 pos, Level w } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addGenericInt(builder, 60, "Base duration in seconds", "duration"); addExtendTimeConfig(builder, 60); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java index fdc1a5abb0..84151fa064 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java @@ -25,9 +25,9 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.eventbus.api.Event; +import net.neoforged.bus.api.Event; +import net.neoforged.neoforge.common.ModConfigSpec; +import net.neoforged.neoforge.event.EventHooks; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -80,7 +80,7 @@ public static void warpEntity(Entity entity, WarpScroll.WarpScrollData warpScrol if (entity == null) return; if (entity instanceof LivingEntity living){ - Event event = ForgeEventFactory.onEnderTeleport(living, warpScrollData.getPos().getX(), warpScrollData.getPos().getY(), warpScrollData.getPos().getZ()); + Event event = EventHooks.onEnderTeleport(living, warpScrollData.getPos().getX(), warpScrollData.getPos().getY(), warpScrollData.getPos().getZ()); if (event.isCanceled()) return; } ServerLevel dimension = PortalTile.getServerLevel(warpScrollData.getDimension(), (ServerLevel) entity.level); @@ -94,7 +94,7 @@ public static void warpEntity(Entity entity, BlockPos warpPos) { if (entity == null) return; Level world = entity.level; if (entity instanceof LivingEntity living){ - Event event = ForgeEventFactory.onEnderTeleport(living, warpPos.getX(), warpPos.getY(), warpPos.getZ()); + Event event = EventHooks.onEnderTeleport(living, warpPos.getX(), warpPos.getY(), warpPos.getZ()); if (event.isCanceled()) return; } ((ServerLevel) entity.level).sendParticles(ParticleTypes.PORTAL, entity.getX(), entity.getY() + 1, entity.getZ(), @@ -149,7 +149,7 @@ public static BlockPos getForward(Level world, BlockPos pos, Entity shooter, dou } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addGenericInt(builder, 8, "Base teleport distance", "distance"); addAmpConfig(builder, 3.0); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBounce.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBounce.java index a53190706b..2bf6d11578 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBounce.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBounce.java @@ -6,7 +6,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -27,7 +27,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addPotionConfig(builder, 30); addExtendTimeConfig(builder, 8); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java index c09adf5d2a..27cf50cfa2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java @@ -14,7 +14,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -71,7 +71,7 @@ public void makeSphere(BlockPos center, Level world, @NotNull LivingEntity shoot } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); PER_SPELL_LIMIT = builder.comment("The maximum number of times this glyph may appear in a single spell").defineInRange("per_spell_limit", 1, 1, 1); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectColdSnap.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectColdSnap.java index f63daa9204..0caca952f1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectColdSnap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectColdSnap.java @@ -24,7 +24,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.HashSet; @@ -146,7 +146,7 @@ public DamageSource buildDamageSource(Level world, LivingEntity shooter) { } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addDamageConfig(builder, 6.0); addAmpConfig(builder, 2.5); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java index 248bdabcb1..dbca2ebb7b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java @@ -22,7 +22,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.*; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -139,7 +139,7 @@ public static void crushItems(Level world, List itemEntities, int ma } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addDamageConfig(builder, 3.0); addAmpConfig(builder, 1.0); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java index e04a29eeed..10db4579f0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java @@ -21,9 +21,9 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.common.IForgeShearable; -import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.neoforged.neoforge.common.IShearable; +import net.neoforged.neoforge.common.ModConfigSpec; +import net.neoforged.neoforge.common.capabilities.Capabilities; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -40,13 +40,13 @@ private EffectCut() { @Override public boolean canDamage(LivingEntity shooter, SpellStats stats, SpellContext spellContext, SpellResolver resolver, @NotNull Entity entity) { - return IDamageEffect.super.canDamage(shooter, stats, spellContext, resolver, entity) && !(entity instanceof IForgeShearable); + return IDamageEffect.super.canDamage(shooter, stats, spellContext, resolver, entity) && !(entity instanceof IShearable); } @Override public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { Entity entity = rayTraceResult.getEntity(); - if (entity instanceof IForgeShearable shearable) { + if (entity instanceof IShearable shearable) { ItemStack shears = new ItemStack(Items.SHEARS); applyEnchantments(spellStats, shears); if (shearable.isShearable(shears, world, entity.blockPosition())) { @@ -72,7 +72,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world,@NotNull L private boolean dupeCheck(Level world, BlockPos pos){ BlockEntity be = world.getBlockEntity(pos); - return be != null && (world.getCapability(ForgeCapabilities.ITEM_HANDLER).isPresent() || be instanceof Container); + return be != null && (world.getCapability(Capabilities.ITEM_HANDLER).isPresent() || be instanceof Container); } public void doStrip(BlockPos p, BlockHitResult rayTraceResult, Level world,@NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver){ @@ -90,7 +90,7 @@ public void doStrip(BlockPos p, BlockHitResult rayTraceResult, Level world,@NotN public void doShear(BlockPos p, BlockHitResult rayTraceResult, Level world,@NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver){ ItemStack shears = new ItemStack(Items.SHEARS); applyEnchantments(spellStats, shears); - if (world.getBlockState(p).getBlock() instanceof IForgeShearable shearable && shearable.isShearable(shears, world, p)) { + if (world.getBlockState(p).getBlock() instanceof IShearable shearable && shearable.isShearable(shears, world, p)) { List items = shearable.onSheared(getPlayer(shooter, (ServerLevel) world), shears, world, p, spellStats.getBuffCount(AugmentFortune.INSTANCE)); items.forEach(i -> world.addFreshEntity(new ItemEntity(world, p.getX(), p.getY(), p.getZ(), i))); } @@ -104,7 +104,7 @@ public void doShear(BlockPos p, BlockHitResult rayTraceResult, Level world,@NotN } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addDamageConfig(builder, 1.0); addAmpConfig(builder, 1.0); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDelay.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDelay.java index 2b37788e86..0299efb775 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDelay.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDelay.java @@ -16,7 +16,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -59,7 +59,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addExtendTimeConfig(builder, 1); addGenericInt(builder, 20, "The base duration of the delay effect in ticks.", "base_duration"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDispel.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDispel.java index ee14efabc9..7fae1af970 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDispel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDispel.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.MinecraftForge; +import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -51,18 +51,18 @@ public void onResolveEntity(@NotNull EntityHitResult rayTraceResult, Level world //TODO dispel loot table? return; } - if (MinecraftForge.EVENT_BUS.post(new DispelEvent.Pre(rayTraceResult, world, shooter, spellStats, spellContext))) + if (NeoForge.EVENT_BUS.post(new DispelEvent.Pre(rayTraceResult, world, shooter, spellStats, spellContext))) return; if (entity instanceof IDispellable iDispellable) { iDispellable.onDispel(shooter); } - MinecraftForge.EVENT_BUS.post(new DispelEvent.Post(rayTraceResult, world, shooter, spellStats, spellContext)); + NeoForge.EVENT_BUS.post(new DispelEvent.Post(rayTraceResult, world, shooter, spellStats, spellContext)); } } @Override public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { - if (MinecraftForge.EVENT_BUS.post(new DispelEvent.Pre(rayTraceResult, world, shooter, spellStats, spellContext))) + if (NeoForge.EVENT_BUS.post(new DispelEvent.Pre(rayTraceResult, world, shooter, spellStats, spellContext))) return; if (world.getBlockState(rayTraceResult.getBlockPos()) instanceof IDispellable dispellable) { dispellable.onDispel(shooter); @@ -70,7 +70,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull if (world.getBlockEntity(rayTraceResult.getBlockPos()) instanceof IDispellable dispellable) { dispellable.onDispel(shooter); } - MinecraftForge.EVENT_BUS.post(new DispelEvent.Post(rayTraceResult, world, shooter, spellStats, spellContext)); + NeoForge.EVENT_BUS.post(new DispelEvent.Post(rayTraceResult, world, shooter, spellStats, spellContext)); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectEnderChest.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectEnderChest.java index 07baa4c2e1..e1564ba1d9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectEnderChest.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectEnderChest.java @@ -10,7 +10,7 @@ import net.minecraft.world.inventory.PlayerEnderChestContainer; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.util.FakePlayer; +import net.neoforged.neoforge.common.util.FakePlayer; import org.jetbrains.annotations.NotNull; import java.util.Set; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExchange.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExchange.java index 99eb5ccf1a..e2ab12f3c0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExchange.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExchange.java @@ -28,7 +28,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.event.ForgeEventFactory; +import net.neoforged.neoforge.event.EventHooks; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -45,9 +45,9 @@ private EffectExchange() { public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { Entity entity = rayTraceResult.getEntity(); Vec3 origLoc = shooter.position; - if (!ForgeEventFactory.onEnderTeleport(shooter, entity.getX(), entity.getY(), entity.getZ()).isCanceled()) + if (!EventHooks.onEnderTeleport(shooter, entity.getX(), entity.getY(), entity.getZ()).isCanceled()) shooter.teleportTo(entity.getX(), entity.getY(), entity.getZ()); - if (!(entity instanceof LivingEntity living) || !ForgeEventFactory.onEnderTeleport(living, origLoc.x(), origLoc.y(), origLoc.z()).isCanceled()) { + if (!(entity instanceof LivingEntity living) || !EventHooks.onEnderTeleport(living, origLoc.x(), origLoc.y(), origLoc.z()).isCanceled()) { entity.teleportTo(origLoc.x(), origLoc.y(), origLoc.z()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExplosion.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExplosion.java index 28c38602c0..9b17452551 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExplosion.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExplosion.java @@ -19,7 +19,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -50,7 +50,7 @@ public Explosion explode(Level world, @Nullable Entity e, @Nullable DamageSource ANExplosion explosion = new ANExplosion(world, e, source, context, x, y, z, radius, p_230546_11_, p_230546_12_, amp); explosion.baseDamage = DAMAGE.get(); explosion.ampDamageScalar = AMP_DAMAGE.get(); - if (net.minecraftforge.event.ForgeEventFactory.onExplosionStart(world, explosion)) return explosion; + if (net.neoforged.neoforge.event.EventHooks.onExplosionStart(world, explosion)) return explosion; explosion.explode(); explosion.finalizeExplosion(false); if (p_230546_12_ == Explosion.BlockInteraction.KEEP) { @@ -66,12 +66,12 @@ public Explosion explode(Level world, @Nullable Entity e, @Nullable DamageSource return explosion; } - public ForgeConfigSpec.DoubleValue BASE; - public ForgeConfigSpec.DoubleValue AOE_BONUS; - public ForgeConfigSpec.DoubleValue AMP_DAMAGE; + public ModConfigSpec.DoubleValue BASE; + public ModConfigSpec.DoubleValue AOE_BONUS; + public ModConfigSpec.DoubleValue AMP_DAMAGE; @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addAmpConfig(builder, 0.5); BASE = builder.comment("Explosion base intensity").defineInRange("base", 0.75, 0.0, 100); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFangs.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFangs.java index 7527e3a929..467da78d03 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFangs.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFangs.java @@ -17,7 +17,7 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -76,7 +76,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addDamageConfig(builder, 6.0); addAmpConfig(builder, 3.0); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFell.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFell.java index e0142ad0b2..e211ddbf03 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFell.java @@ -18,7 +18,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -56,10 +56,10 @@ public void onResolveBlock(BlockHitResult ray, Level world, @NotNull LivingEntit } } - public ForgeConfigSpec.IntValue AOE_BONUS; + public ModConfigSpec.IntValue AOE_BONUS; @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addGenericInt(builder, 50, "Base amount of harvested blocks", "base_harvest"); AOE_BONUS = builder.comment("Additional max blocks per AOE").defineInRange("aoe_bonus", 50, 0, Integer.MAX_VALUE); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFlare.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFlare.java index 566ba871f5..4f04a90378 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFlare.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFlare.java @@ -23,7 +23,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -126,7 +126,7 @@ protected void addDefaultAugmentLimits(Map defaults) } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addDamageConfig(builder, 7.0); addAmpConfig(builder, 3.0); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFreeze.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFreeze.java index 65b575eba2..7a86f3e316 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFreeze.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFreeze.java @@ -22,7 +22,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -103,7 +103,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addPotionConfig(builder, 10); addExtendTimeConfig(builder, 5); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGlide.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGlide.java index ededc63e57..31557790ba 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGlide.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGlide.java @@ -10,7 +10,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -31,7 +31,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addPotionConfig(builder, 180); addExtendTimeConfig(builder, 120); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGravity.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGravity.java index 16b8229be9..dbe2a03646 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGravity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGravity.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -62,7 +62,7 @@ public SpellTier defaultTier() { } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addPotionConfig(builder, 30); addExtendTimeConfig(builder, 8); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHarm.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHarm.java index cb045eaf6c..ff9deac960 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHarm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHarm.java @@ -10,7 +10,7 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -37,7 +37,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level level, @NotNul } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addDamageConfig(builder, 5.0); addAmpConfig(builder, 2.0); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHeal.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHeal.java index ae2f738835..f25ad343b9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHeal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHeal.java @@ -15,7 +15,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -60,7 +60,7 @@ public DamageSource buildDamageSource(Level world, LivingEntity shooter) { } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addGenericDouble(builder, 3.0, "Base heal amount", "base_heal"); addAmpConfig(builder, 3.0); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHex.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHex.java index 42f25c5976..ce0225c49b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHex.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHex.java @@ -9,7 +9,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -31,7 +31,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addPotionConfig(builder, 30); addExtendTimeConfig(builder, 8); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIgnite.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIgnite.java index 63a1591a45..6623cc19a0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIgnite.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIgnite.java @@ -15,7 +15,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -62,7 +62,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addExtendTimeConfig(builder, 2); addPotionConfig(builder, 3); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIntangible.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIntangible.java index fe94cbc902..e5953f5460 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIntangible.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIntangible.java @@ -15,7 +15,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -51,7 +51,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addGenericInt(builder, 3, "Base duration, in seconds", "base"); addExtendTimeConfig(builder, 1); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java index ccf5b085d4..ecaf55ba40 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java @@ -32,7 +32,7 @@ import net.minecraft.world.level.material.Fluids; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.util.FakePlayer; +import net.neoforged.neoforge.common.util.FakePlayer; import org.jetbrains.annotations.NotNull; import java.util.Set; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInvisibility.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInvisibility.java index a86b685514..41eff42712 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInvisibility.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInvisibility.java @@ -8,7 +8,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -29,7 +29,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addPotionConfig(builder, 30); addExtendTimeConfig(builder, 8); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectKnockback.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectKnockback.java index 4920d54c98..680cf68b4c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectKnockback.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectKnockback.java @@ -15,7 +15,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -68,7 +68,7 @@ public void knockback(Entity entity, double strength, double xRatio, double zRat } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addGenericDouble(builder, 1.5, "Base knockback value", "base_value"); addAmpConfig(builder, 1); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLaunch.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLaunch.java index b40b6e5472..b84d6502c6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLaunch.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLaunch.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -49,7 +49,7 @@ public void onResolveBlock(BlockHitResult result, Level world, @NotNull LivingEn } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addGenericDouble(builder, 0.8, "Base knockup amount", "knockup"); addAmpConfig(builder, 0.25); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLeap.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLeap.java index f36f81ef64..005c7f0c5e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLeap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLeap.java @@ -16,7 +16,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -65,10 +65,10 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull } } - ForgeConfigSpec.BooleanValue NERF; + ModConfigSpec.BooleanValue NERF; @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); NERF = builder.comment("If true, will not launch the caster if they are not on the ground.").define("force_ground", false); addGenericDouble(builder, 1.5, "Base knockup amount", "knock_up"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLight.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLight.java index afc5fbcc6b..65b648cf49 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLight.java @@ -26,7 +26,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -91,7 +91,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addPotionConfig(builder, 30); addExtendTimeConfig(builder, 8); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLightning.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLightning.java index f2230ddcf4..aeaf3047e1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLightning.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLightning.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -43,7 +43,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addDamageConfig(builder, 5.0); addAmpConfig(builder, 3.0); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLinger.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLinger.java index fe18117b6e..e2424f5254 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLinger.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLinger.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -66,7 +66,7 @@ public Set getCompatibleAugments() { } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); PER_SPELL_LIMIT = builder.comment("The maximum number of times this glyph may appear in a single spell").defineInRange("per_spell_limit", 1, 1, 1); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java index ef031dfff4..fbf8060b4c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java @@ -16,8 +16,8 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.player.EntityItemPickupEvent; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.entity.player.EntityItemPickupEvent; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -42,7 +42,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt InventoryManager manager = spellContext.getCaster().getInvManager().extractSlotMax(-1); for (ItemEntity i : entityList) { ItemStack stack = i.getItem(); - if (stack.isEmpty() || MinecraftForge.EVENT_BUS.post(new EntityItemPickupEvent(getPlayer(shooter, (ServerLevel) world), i))) + if (stack.isEmpty() || NeoForge.EVENT_BUS.post(new EntityItemPickupEvent(getPlayer(shooter, (ServerLevel) world), i))) continue; stack = manager.insertStack(stack); i.setItem(stack); @@ -51,7 +51,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt posVec.add(expansion, expansion, expansion), posVec.subtract(expansion, expansion, expansion))); for (ExperienceOrb i : orbList) { if (shooter instanceof Player player && isNotFakePlayer(player) && spellContext.castingTile == null) { - if (MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.entity.player.PlayerXpEvent.PickupXp(player, i))) + if (NeoForge.EVENT_BUS.post(new net.neoforged.neoforge.event.entity.player.PlayerXpEvent.PickupXp(player, i))) continue; player.giveExperiencePoints(i.value); i.remove(Entity.RemovalReason.DISCARDED); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java index ebbce191b7..7b2533984f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java @@ -22,10 +22,10 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.util.BlockSnapshot; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.event.level.BlockEvent; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.common.util.BlockSnapshot; +import net.neoforged.neoforge.common.util.FakePlayer; +import net.neoforged.neoforge.event.level.BlockEvent; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -47,7 +47,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull continue; pos1 = rayTraceResult.isInside() ? pos1 : pos1.relative(rayTraceResult.getDirection()); boolean notReplaceable = !world.getBlockState(pos1).canBeReplaced(); - if (notReplaceable || MinecraftForge.EVENT_BUS.post(new BlockEvent.EntityPlaceEvent(BlockSnapshot.create(world.dimension(), world, pos1), world.getBlockState(pos1), fakePlayer))) + if (notReplaceable || NeoForge.EVENT_BUS.post(new BlockEvent.EntityPlaceEvent(BlockSnapshot.create(world.dimension(), world, pos1), world.getBlockState(pos1), fakePlayer))) continue; place(new BlockHitResult(new Vec3(pos1.getX(), pos1.getY(), pos1.getZ()), rayTraceResult.getDirection(), pos1, false), world, shooter, spellStats, spellContext, resolver, fakePlayer); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPull.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPull.java index 646f4bbefa..cf8c0b8be4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPull.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPull.java @@ -15,7 +15,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -62,7 +62,7 @@ public void setMotion(Entity entity, BlockHitResult blockHitResult, SpellStats s } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addGenericDouble(builder, 1.0, "Base movement velocity", "base_value"); addAmpConfig(builder, 0.5); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java index dcba74db61..9f88a3ec07 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java @@ -17,11 +17,11 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.util.BlockSnapshot; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.event.level.BlockEvent; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.common.ModConfigSpec; +import net.neoforged.neoforge.common.util.BlockSnapshot; +import net.neoforged.neoforge.common.util.FakePlayer; +import net.neoforged.neoforge.event.level.BlockEvent; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -57,7 +57,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull if (!world.isInWorldBounds(pos1)) return; boolean notReplaceable = !world.getBlockState(pos1).canBeReplaced(); - if (notReplaceable || MinecraftForge.EVENT_BUS.post(new BlockEvent.EntityPlaceEvent(BlockSnapshot.create(world.dimension(), world, pos1), world.getBlockState(pos1), fakePlayer))) + if (notReplaceable || NeoForge.EVENT_BUS.post(new BlockEvent.EntityPlaceEvent(BlockSnapshot.create(world.dimension(), world, pos1), world.getBlockState(pos1), fakePlayer))) continue; BlockState state1 = BlockRegistry.TEMPORARY_BLOCK.get().defaultBlockState().setValue(TemporaryBlock.POWER, signalModifier); world.setBlockAndUpdate(pos1, state1); @@ -73,10 +73,10 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull } - public ForgeConfigSpec.IntValue BONUS_TIME; + public ModConfigSpec.IntValue BONUS_TIME; @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addGenericInt(builder, 5, "Base time in ticks", "base_duration"); BONUS_TIME = builder.comment("Extend time bonus, in ticks").defineInRange("extend_time", 10, 0, Integer.MAX_VALUE); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSenseMagic.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSenseMagic.java index 212d86b748..18848ed722 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSenseMagic.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSenseMagic.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -43,7 +43,7 @@ public String getBookDescription() { } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addPotionConfig(builder, 60); addExtendTimeConfig(builder, 15); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSlowfall.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSlowfall.java index 1e243ffd90..5ec280edd6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSlowfall.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSlowfall.java @@ -8,7 +8,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -28,7 +28,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addPotionConfig(builder, 30); addExtendTimeConfig(builder, 8); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSnare.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSnare.java index 85e0336ba9..f56897d536 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSnare.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSnare.java @@ -12,7 +12,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -42,7 +42,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addPotionConfig(builder, 8); addExtendTimeConfig(builder, 1); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonDecoy.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonDecoy.java index 4af6f17232..bb6596a7e1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonDecoy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonDecoy.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -36,7 +36,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addExtendTimeConfig(builder, 15); addGenericInt(builder, 30, "Base duration in seconds", "duration"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonSteed.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonSteed.java index e7bcacc5dc..a84ab7c043 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonSteed.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonSteed.java @@ -15,7 +15,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -53,7 +53,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addExtendTimeConfig(builder, 120); addGenericInt(builder, 300, "Base duration in seconds", "duration"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java index 18f23d61e8..e68f7debc0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -67,7 +67,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addGenericInt(builder, 15, "Base duration in seconds", "duration"); addExtendTimeConfig(builder, 10); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonVex.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonVex.java index 4c9393cd14..bc9a938172 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonVex.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonVex.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -49,7 +49,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addGenericInt(builder, 15, "Base duration in seconds", "duration"); addExtendTimeConfig(builder, 10); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonWolves.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonWolves.java index 969d9ae939..a4a2a74274 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonWolves.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonWolves.java @@ -9,7 +9,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -43,7 +43,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addGenericInt(builder, 60, "Base duration in seconds", "duration"); addExtendTimeConfig(builder, 60); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java index 721bd560a9..2749509157 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java @@ -14,9 +14,9 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; +import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.ItemHandlerHelper; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -59,7 +59,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull return; } BlockEntity tileEntity = world.getBlockEntity(rayTraceResult.getBlockPos()); - IItemHandler targetInv = tileEntity.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null); + IItemHandler targetInv = tileEntity.getCapability(Capabilities.ITEM_HANDLER).orElse(null); if (targetInv == null) { return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWall.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWall.java index cd19195362..dd422580df 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWall.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWall.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -80,7 +80,7 @@ protected void addDefaultInvalidCombos(Set defaults) { } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); PER_SPELL_LIMIT = builder.comment("The maximum number of times this glyph may appear in a single spell").defineInRange("per_spell_limit", 1, 1, 1); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWindshear.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWindshear.java index 0956e47d73..289c613dc0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWindshear.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWindshear.java @@ -18,7 +18,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -58,7 +58,7 @@ public DamageSource buildDamageSource(Level world, LivingEntity shooter) { } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addDamageConfig(builder, 5); addAmpConfig(builder, 2.5f); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWither.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWither.java index ccc6b3a8ce..e8f7817916 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWither.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWither.java @@ -8,7 +8,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -31,7 +31,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul } @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addPotionConfig(builder, 30); addExtendTimeConfig(builder, 8); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java index f4fad850ce..1d639a9a00 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java @@ -38,7 +38,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import org.jetbrains.annotations.NotNull; - +import var; import java.util.*; public class EffectWololo extends AbstractEffect { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodProjectile.java index 2a08c1a66e..95e423f800 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodProjectile.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -30,10 +30,10 @@ private MethodProjectile() { super(GlyphLib.MethodProjectileID, "Projectile"); } - public ForgeConfigSpec.IntValue PROJECTILE_TTL; + public ModConfigSpec.IntValue PROJECTILE_TTL; @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); PROJECTILE_TTL = builder.comment("Max lifespan of the projectile, in seconds.").defineInRange("max_lifespan",60, 0, Integer.MAX_VALUE); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/tomes/CasterTomeData.java b/src/main/java/com/hollingsworth/arsnouveau/common/tomes/CasterTomeData.java index b031694c78..c9ff29bd5c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/tomes/CasterTomeData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/tomes/CasterTomeData.java @@ -30,7 +30,7 @@ import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java index 83831b8df3..8f47d7378a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java @@ -1,14 +1,22 @@ package com.hollingsworth.arsnouveau.common.util; +import com.hollingsworth.arsnouveau.api.recipe.PotionIngredient; +import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.alchemy.Potions; -import net.minecraftforge.registries.ForgeRegistries; +import net.minecraft.world.item.crafting.Ingredient; +import net.neoforged.neoforge.common.crafting.DataComponentIngredient; public class PotionUtil { public static void addPotionToTag(Potion potionIn, CompoundTag tag) { - ResourceLocation resourcelocation = ForgeRegistries.POTIONS.getKey(potionIn); + ResourceLocation resourcelocation = BuiltInRegistries.POTION.getKey(potionIn); if (potionIn == Potions.EMPTY) { if (tag.contains("Potion")) { tag.remove("Potion"); @@ -18,4 +26,19 @@ public static void addPotionToTag(Potion potionIn, CompoundTag tag) { tag.putString("Potion", resourcelocation.toString()); } } + + public static ItemStack getPotion(Holder potion) { + ItemStack stack = new ItemStack(Items.POTION); + stack.set(DataComponents.POTION_CONTENTS, new PotionContents(potion)); + return stack; + } + + public static Ingredient getIngredient(Holder potion) { + ItemStack stack = getPotion(potion); + return PotionUtil.getIngredient(stack); + } + + public static Ingredient getIngredient(ItemStack input) { + return DataComponentIngredient.of(false, input); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/SpellPartConfigUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/SpellPartConfigUtil.java index 093e9c891a..890d8745bd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/SpellPartConfigUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/SpellPartConfigUtil.java @@ -3,8 +3,7 @@ import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.setup.config.ConfigUtil; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.common.ForgeConfigSpec; - +import net.neoforged.neoforge.common.ModConfigSpec; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -34,12 +33,12 @@ public class SpellPartConfigUtil { * limitations. */ public static class AugmentLimits { - private ForgeConfigSpec.ConfigValue> configValue; + private ModConfigSpec.ConfigValue> configValue; /** * Create a new AugmentLimits from the given ConfigValue */ - private AugmentLimits(ForgeConfigSpec.ConfigValue> configValue) { + private AugmentLimits(ModConfigSpec.ConfigValue> configValue) { this.configValue = configValue; } @@ -68,12 +67,12 @@ private Map parseAugmentLimits() { } public static class ComboLimits { - private final ForgeConfigSpec.ConfigValue> configValue; + private final ModConfigSpec.ConfigValue> configValue; /** * Create a new AugmentLimits from the given ConfigValue */ - public ComboLimits(ForgeConfigSpec.ConfigValue> configValue) { + public ComboLimits(ModConfigSpec.ConfigValue> configValue) { this.configValue = configValue; } @@ -97,19 +96,19 @@ public Set parseComboLimits() { /** - * Builds a "augment_limits" configuration item using the provided {@link ForgeConfigSpec.Builder} and returns an + * Builds a "augment_limits" configuration item using the provided {@link ModConfigSpec.Builder} and returns an * {@link AugmentLimits} instance to encapsulate it. */ - public static AugmentLimits buildAugmentLimitsConfig(ForgeConfigSpec.Builder builder, Map defaults) { - ForgeConfigSpec.ConfigValue> configValue = builder + public static AugmentLimits buildAugmentLimitsConfig(ModConfigSpec.Builder builder, Map defaults) { + ModConfigSpec.ConfigValue> configValue = builder .comment("Limits the number of times a given augment may be applied to a given effect", "Example entry: \"" + GlyphLib.AugmentAmplifyID + "=5\"") .defineList("augment_limits", writeAugmentConfig(defaults), SpellPartConfigUtil::validateAugmentLimits); return new AugmentLimits(configValue); } - public static ComboLimits buildInvalidCombosConfig(ForgeConfigSpec.Builder builder, Set defaults) { - ForgeConfigSpec.ConfigValue> configValue = builder + public static ComboLimits buildInvalidCombosConfig(ModConfigSpec.Builder builder, Set defaults) { + ModConfigSpec.ConfigValue> configValue = builder .comment("Prevents the given glyph from being used in the same spell as the given glyph", "Example entry: \"" + GlyphLib.EffectBurstID + "\"") .defineList("invalid_combos", writeComboConfig(defaults), (o) -> o instanceof String s && ResourceLocation.isValidResourceLocation(s)); @@ -126,11 +125,11 @@ private static List writeComboConfig(Set augmentLimits } /** - * Builds a "augment_limits" configuration item using the provided {@link ForgeConfigSpec.Builder} and returns an + * Builds a "augment_limits" configuration item using the provided {@link ModConfigSpec.Builder} and returns an * {@link AugmentLimits} instance to encapsulate it. */ - public static AugmentCosts buildAugmentCosts(ForgeConfigSpec.Builder builder, Map defaults) { - ForgeConfigSpec.ConfigValue> configValue = builder + public static AugmentCosts buildAugmentCosts(ModConfigSpec.Builder builder, Map defaults) { + ModConfigSpec.ConfigValue> configValue = builder .comment("How much an augment should cost when used on this effect or form. This overrides the default cost in the augment config.", "Example entry: \"" + GlyphLib.AugmentAmplifyID + "=50\"") .defineList("augment_cost_overrides", ConfigUtil.writeResConfig(defaults), SpellPartConfigUtil::validateAugmentLimits); @@ -164,12 +163,12 @@ private static boolean validateAugmentLimits(Object rawConfig) { */ public static class AugmentCosts { private Map costs = null; - private ForgeConfigSpec.ConfigValue> configValue; + private ModConfigSpec.ConfigValue> configValue; /** * Create a new AugmentLimits from the given ConfigValue */ - private AugmentCosts(ForgeConfigSpec.ConfigValue> configValue) { + private AugmentCosts(ModConfigSpec.ConfigValue> configValue) { this.configValue = configValue; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/BlockEntityTypeRegistryWrapper.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/BlockEntityTypeRegistryWrapper.java new file mode 100644 index 0000000000..967ff1cbd2 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/BlockEntityTypeRegistryWrapper.java @@ -0,0 +1,11 @@ +package com.hollingsworth.arsnouveau.common.util.registry; + +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.neoforged.neoforge.registries.DeferredHolder; + +public class BlockEntityTypeRegistryWrapper extends RegistryWrapper, BlockEntityType> { + public BlockEntityTypeRegistryWrapper(DeferredHolder, BlockEntityType> registryObject) { + super(registryObject); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/BlockRegistryWrapper.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/BlockRegistryWrapper.java new file mode 100644 index 0000000000..1db981666a --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/BlockRegistryWrapper.java @@ -0,0 +1,10 @@ +package com.hollingsworth.arsnouveau.common.util.registry; + +import net.minecraft.world.level.block.Block; +import net.neoforged.neoforge.registries.DeferredHolder; + +public class BlockRegistryWrapper extends RegistryWrapper { + public BlockRegistryWrapper(DeferredHolder registryObject) { + super(registryObject); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/ItemRegistryWrapper.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/ItemRegistryWrapper.java new file mode 100644 index 0000000000..41469b5c6d --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/ItemRegistryWrapper.java @@ -0,0 +1,11 @@ +package com.hollingsworth.arsnouveau.common.util.registry; + +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.neoforged.neoforge.registries.DeferredHolder; + +public class ItemRegistryWrapper extends RegistryWrapper { + public ItemRegistryWrapper(DeferredHolder registryObject) { + super(registryObject); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/RegistryWrapper.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/RegistryWrapper.java similarity index 62% rename from src/main/java/com/hollingsworth/arsnouveau/common/util/RegistryWrapper.java rename to src/main/java/com/hollingsworth/arsnouveau/common/util/registry/RegistryWrapper.java index eea920f000..d0b99261f1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/RegistryWrapper.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/RegistryWrapper.java @@ -1,18 +1,20 @@ -package com.hollingsworth.arsnouveau.common.util; +package com.hollingsworth.arsnouveau.common.util.registry; +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; import org.jetbrains.annotations.NotNull; import java.util.function.Supplier; -public class RegistryWrapper implements Supplier, ItemLike { - public RegistryObject registryObject; +public class RegistryWrapper implements Supplier, ItemLike { + public DeferredHolder registryObject; - public RegistryWrapper(RegistryObject registryObject) { + public RegistryWrapper(DeferredHolder registryObject) { this.registryObject = registryObject; } @@ -30,6 +32,14 @@ public Item asItem() { throw new IllegalStateException("RegistryWrapper is not an Item"); } + public Holder getHolder() { + return registryObject.getDelegate(); + } + + public ResourceLocation getResourceLocation() { + return registryObject.getId(); + } + public String getRegistryName() { return registryObject.getId().getPath(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/processors/WaterloggingFixProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/processors/WaterloggingFixProcessor.java index fc7cbad65f..baf12818dd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/processors/WaterloggingFixProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/processors/WaterloggingFixProcessor.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.world.processors; import com.hollingsworth.arsnouveau.setup.registry.StructureRegistry; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; import net.minecraft.server.level.WorldGenRegion; import net.minecraft.world.level.ChunkPos; @@ -15,7 +15,7 @@ public class WaterloggingFixProcessor extends StructureProcessor { - public static final Codec CODEC = Codec.unit(WaterloggingFixProcessor::new); + public static final MapCodec CODEC = MapCodec.unit(WaterloggingFixProcessor::new); public WaterloggingFixProcessor() { } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneSavedData.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneSavedData.java index c0a1bdbff5..420f17df69 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneSavedData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneSavedData.java @@ -6,16 +6,16 @@ import net.minecraft.nbt.ListTag; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.saveddata.SavedData; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; - +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.TickEvent; +import var; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class RedstoneSavedData extends SavedData { public final Map SIGNAL_MAP = new HashMap<>(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneUtil.java index 7228b336c3..5979ae1b0c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneUtil.java @@ -4,6 +4,7 @@ import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import var; public class RedstoneUtil { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/structure/WildenDen.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/structure/WildenDen.java index 64d603010a..258be1ddc1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/structure/WildenDen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/structure/WildenDen.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.setup.registry.StructureRegistry; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; @@ -25,12 +26,12 @@ import net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer; import net.minecraft.world.level.levelgen.structure.pools.JigsawPlacement; import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool; - +import var; import java.util.Optional; public class WildenDen extends Structure { - public static final Codec CODEC = RecordCodecBuilder.mapCodec(instance -> + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group(WildenDen.settingsCodec(instance), StructureTemplatePool.CODEC.fieldOf("start_pool").forGetter(structure -> structure.startPool), ResourceLocation.CODEC.optionalFieldOf("start_jigsaw_name").forGetter(structure -> structure.startJigsawName), @@ -38,7 +39,7 @@ public class WildenDen extends Structure { HeightProvider.CODEC.fieldOf("start_height").forGetter(structure -> structure.startHeight), Heightmap.Types.CODEC.optionalFieldOf("project_start_to_heightmap").forGetter(structure -> structure.projectStartToHeightmap), Codec.intRange(1, 128).fieldOf("max_distance_from_center").forGetter(structure -> structure.maxDistanceFromCenter) - ).apply(instance, WildenDen::new)).codec(); + ).apply(instance, WildenDen::new)); public final Holder startPool; public final Optional startJigsawName; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/structure/WildenGuardianDen.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/structure/WildenGuardianDen.java index 350358396a..5ce035872d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/structure/WildenGuardianDen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/structure/WildenGuardianDen.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.setup.registry.StructureRegistry; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; @@ -23,7 +24,7 @@ public class WildenGuardianDen extends WildenDen{ - public static final Codec CODEC = RecordCodecBuilder.mapCodec(instance -> + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group(WildenGuardianDen.settingsCodec(instance), StructureTemplatePool.CODEC.fieldOf("start_pool").forGetter(structure -> structure.startPool), ResourceLocation.CODEC.optionalFieldOf("start_jigsaw_name").forGetter(structure -> structure.startJigsawName), @@ -31,7 +32,7 @@ public class WildenGuardianDen extends WildenDen{ HeightProvider.CODEC.fieldOf("start_height").forGetter(structure -> structure.startHeight), Heightmap.Types.CODEC.optionalFieldOf("project_start_to_heightmap").forGetter(structure -> structure.projectStartToHeightmap), Codec.intRange(1, 128).fieldOf("max_distance_from_center").forGetter(structure -> structure.maxDistanceFromCenter) - ).apply(instance, WildenGuardianDen::new)).codec(); + ).apply(instance, WildenGuardianDen::new)); public WildenGuardianDen(StructureSettings config, Holder startPool, Optional startJigsawName, int size, HeightProvider startHeight, Optional projectStartToHeightmap, int maxDistanceFromCenter) { super(config, startPool, startJigsawName, size, startHeight, projectStartToHeightmap, maxDistanceFromCenter); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/AbstractSupplierBlockStateProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/AbstractSupplierBlockStateProvider.java index 187eba581f..b8574cf4f2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/AbstractSupplierBlockStateProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/AbstractSupplierBlockStateProvider.java @@ -10,8 +10,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProviderType; -import net.minecraftforge.registries.ForgeRegistries; - +import net.neoforged.neoforge.registries.ForgeRegistries; import java.util.function.Function; public abstract class AbstractSupplierBlockStateProvider extends BlockStateProvider { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTree.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTree.java index 93f838d1f9..296e5906f1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTree.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTree.java @@ -2,22 +2,14 @@ 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 org.jetbrains.annotations.Nullable; -public class MagicTree extends AbstractTreeGrower { +import java.util.Optional; - ResourceKey> configConfiguredFeature; - - public MagicTree(ResourceKey> configConfiguredFeature) { - this.configConfiguredFeature = configConfiguredFeature; - } - - - @Nullable - @Override - protected ResourceKey> getConfiguredFeature(RandomSource pRandom, boolean pHasFlowers) { - return configConfiguredFeature; +public class MagicTree { + public static TreeGrower getGrower(String name, ResourceKey> configConfiguredFeature) { + return new TreeGrower(name, Optional.of(configConfiguredFeature), Optional.empty(), Optional.empty()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTrunkPlacer.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTrunkPlacer.java index 5ae286bd40..464987b325 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTrunkPlacer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTrunkPlacer.java @@ -22,8 +22,7 @@ import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer; import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacer; import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType; -import net.minecraftforge.registries.ForgeRegistries; - +import net.neoforged.neoforge.registries.ForgeRegistries; import java.util.List; import java.util.function.BiConsumer; diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java index 36872c295f..1581f3e348 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java @@ -6,18 +6,20 @@ import com.hollingsworth.arsnouveau.setup.registry.*; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.InterModComms; import net.minecraftforge.registries.*; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.InterModComms; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.registries.ForgeRegistries; +import net.neoforged.neoforge.registries.IForgeRegistry; +import net.neoforged.neoforge.registries.RegisterEvent; +import net.neoforged.neoforge.registries.RegistryObject; import top.theillusivec4.curios.Curios; import top.theillusivec4.curios.api.SlotTypeMessage; import top.theillusivec4.curios.api.SlotTypePreset; -import java.util.Objects; - import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; public class ModSetup { @@ -31,9 +33,9 @@ public static void sendIntercoms() { InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.NECKLACE.getMessageBuilder().build()); } - public static final DeferredRegister> TRUNK_PLACER_TYPE_DEFERRED_REGISTER = DeferredRegister.createOptional(Registries.TRUNK_PLACER_TYPE, MODID); + public static final DeferredRegister> TRUNK_PLACER_TYPE_DEFERRED_REGISTER = DeferredRegister.create(Registries.TRUNK_PLACER_TYPE, MODID); - public static RegistryObject> MAGIC_TRUNK_PLACER = TRUNK_PLACER_TYPE_DEFERRED_REGISTER.register("magic_trunk_placer", () -> new TrunkPlacerType<>(MagicTrunkPlacer.CODEC)); + public static DeferredHolder, TrunkPlacerType> MAGIC_TRUNK_PLACER = TRUNK_PLACER_TYPE_DEFERRED_REGISTER.register("magic_trunk_placer", () -> new TrunkPlacerType<>(MagicTrunkPlacer.CODEC)); public static void registers(IEventBus modEventBus) { ItemsRegistry.ITEMS.register(modEventBus); @@ -63,14 +65,12 @@ public static void registers(IEventBus modEventBus) { } public static void registerEvents(RegisterEvent event) { - if (event.getRegistryKey().equals(ForgeRegistries.Keys.BLOCKS)) { - IForgeRegistry registry = Objects.requireNonNull(event.getForgeRegistry()); - BlockRegistry.onBlocksRegistry(registry); + if (event.getRegistryKey().equals(Registries.BLOCK.registryKey())) { + BlockRegistry.onBlocksRegistry(); } - if (event.getRegistryKey().equals(ForgeRegistries.Keys.ITEMS)) { - IForgeRegistry registry = Objects.requireNonNull(event.getForgeRegistry()); - BlockRegistry.onBlockItemsRegistry(registry); - ItemsRegistry.onItemRegistry(registry); + if (event.getRegistryKey().equals(Registries.BLOCK.registryKey())) { + BlockRegistry.onBlockItemsRegistry(); + ItemsRegistry.onItemRegistry(); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ANModConfig.java b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ANModConfig.java index e5ae87f8ef..2daa42dc00 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ANModConfig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ANModConfig.java @@ -1,14 +1,13 @@ package com.hollingsworth.arsnouveau.setup.config; import com.electronwill.nightconfig.core.file.CommentedFileConfig; -import net.minecraftforge.fml.ModContainer; -import net.minecraftforge.fml.config.ConfigFileTypeHandler; -import net.minecraftforge.fml.config.IConfigSpec; -import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.fml.loading.FMLPaths; - import java.nio.file.Path; import java.util.function.Function; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.config.ConfigFileTypeHandler; +import net.neoforged.fml.config.IConfigSpec; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.fml.loading.FMLPaths; public class ANModConfig extends ModConfig { private static final ANConfigFileTypeHandler AN_TOML = new ANConfigFileTypeHandler(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java b/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java index 9c922adb42..7c74191129 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java @@ -5,74 +5,74 @@ import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import com.hollingsworth.arsnouveau.common.lib.LibEntityNames; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.config.ModConfigEvent; - +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.event.config.ModConfigEvent; +import net.neoforged.neoforge.common.ModConfigSpec; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD, modid = ArsNouveau.MODID) +@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD, modid = ArsNouveau.MODID) public class Config { public static final String CATEGORY_GENERAL = "general"; public static final String CATEGORY_SPELLS = "spells"; public static final String DRYGMY_CATEGORY = "drygmy_production"; - public static ForgeConfigSpec COMMON_CONFIG; - public static ForgeConfigSpec CLIENT_CONFIG; + public static ModConfigSpec COMMON_CONFIG; + public static ModConfigSpec CLIENT_CONFIG; - public static ForgeConfigSpec.BooleanValue SPAWN_BOOK; - public static ForgeConfigSpec.BooleanValue INFORM_LIGHTS; + public static ModConfigSpec.BooleanValue SPAWN_BOOK; + public static ModConfigSpec.BooleanValue INFORM_LIGHTS; public static Integer TREE_SPAWN_RATE = 100; - public static ForgeConfigSpec.IntValue DRYGMY_MANA_COST; - public static ForgeConfigSpec.IntValue SYLPH_MANA_COST; - public static ForgeConfigSpec.IntValue WHIRLISPRIG_MAX_PROGRESS; - public static ForgeConfigSpec.IntValue DRYGMY_MAX_PROGRESS; - public static ForgeConfigSpec.IntValue DRYGMY_BASE_ITEM; - public static ForgeConfigSpec.IntValue DRYGMY_UNIQUE_BONUS; - public static ForgeConfigSpec.IntValue DRYGMY_QUANTITY_CAP; - public static ForgeConfigSpec.IntValue JUMP_RING_COST; - - public static ForgeConfigSpec.IntValue MELDER_OUTPUT; - public static ForgeConfigSpec.IntValue MELDER_INPUT_COST; - public static ForgeConfigSpec.IntValue MELDER_SOURCE_COST; - public static ForgeConfigSpec.IntValue ENCHANTED_FLASK_CAP; - public static ForgeConfigSpec.BooleanValue HUNTER_ATTACK_ANIMALS; - public static ForgeConfigSpec.BooleanValue STALKER_ATTACK_ANIMALS; - public static ForgeConfigSpec.BooleanValue GUARDIAN_ATTACK_ANIMALS; - public static ForgeConfigSpec.BooleanValue CHIMERA_DIVE_DESTRUCTIVE; - public static ForgeConfigSpec.ConfigValue> DIMENSION_BLACKLIST; - - public static ForgeConfigSpec.IntValue ARCHWOOD_FOREST_WEIGHT; - - public static ForgeConfigSpec.BooleanValue DYNAMIC_LIGHTS_ENABLED; - public static ForgeConfigSpec.BooleanValue SHOW_SUPPORTER_MESSAGE; - public static ForgeConfigSpec.IntValue TOUCH_LIGHT_LUMINANCE; - public static ForgeConfigSpec.IntValue TOUCH_LIGHT_DURATION; - - public static ForgeConfigSpec.BooleanValue SPAWN_TOMES; - public static ForgeConfigSpec.BooleanValue ALTERNATE_PORTAL_RENDER; - - public static ForgeConfigSpec.BooleanValue DISABLE_SKY_SHADER; - public static ForgeConfigSpec.BooleanValue DISABLE_TRANSLUCENT_PARTICLES; - public static ForgeConfigSpec.BooleanValue SHOW_RECIPE_BOOK; - public static ForgeConfigSpec.IntValue MAX_LOG_EVENTS; - public static ForgeConfigSpec.IntValue TOOLTIP_X_OFFSET; - public static ForgeConfigSpec.IntValue TOOLTIP_Y_OFFSET; - public static ForgeConfigSpec.IntValue MANABAR_X_OFFSET; - public static ForgeConfigSpec.IntValue MANABAR_Y_OFFSET; - public static ForgeConfigSpec.IntValue BOOKWYRM_LIMIT; - public static ForgeConfigSpec.BooleanValue GUI_TRANSPARENCY; - public static ForgeConfigSpec.BooleanValue GLYPH_TOOLTIPS; - - private static ForgeConfigSpec.ConfigValue> ENTITY_LIGHT_CONFIG; - private static ForgeConfigSpec.ConfigValue> ITEM_LIGHT_CONFIG; + public static ModConfigSpec.IntValue DRYGMY_MANA_COST; + public static ModConfigSpec.IntValue SYLPH_MANA_COST; + public static ModConfigSpec.IntValue WHIRLISPRIG_MAX_PROGRESS; + public static ModConfigSpec.IntValue DRYGMY_MAX_PROGRESS; + public static ModConfigSpec.IntValue DRYGMY_BASE_ITEM; + public static ModConfigSpec.IntValue DRYGMY_UNIQUE_BONUS; + public static ModConfigSpec.IntValue DRYGMY_QUANTITY_CAP; + public static ModConfigSpec.IntValue JUMP_RING_COST; + + public static ModConfigSpec.IntValue MELDER_OUTPUT; + public static ModConfigSpec.IntValue MELDER_INPUT_COST; + public static ModConfigSpec.IntValue MELDER_SOURCE_COST; + public static ModConfigSpec.IntValue ENCHANTED_FLASK_CAP; + public static ModConfigSpec.BooleanValue HUNTER_ATTACK_ANIMALS; + public static ModConfigSpec.BooleanValue STALKER_ATTACK_ANIMALS; + public static ModConfigSpec.BooleanValue GUARDIAN_ATTACK_ANIMALS; + public static ModConfigSpec.BooleanValue CHIMERA_DIVE_DESTRUCTIVE; + public static ModConfigSpec.ConfigValue> DIMENSION_BLACKLIST; + + public static ModConfigSpec.IntValue ARCHWOOD_FOREST_WEIGHT; + + public static ModConfigSpec.BooleanValue DYNAMIC_LIGHTS_ENABLED; + public static ModConfigSpec.BooleanValue SHOW_SUPPORTER_MESSAGE; + public static ModConfigSpec.IntValue TOUCH_LIGHT_LUMINANCE; + public static ModConfigSpec.IntValue TOUCH_LIGHT_DURATION; + + public static ModConfigSpec.BooleanValue SPAWN_TOMES; + public static ModConfigSpec.BooleanValue ALTERNATE_PORTAL_RENDER; + + public static ModConfigSpec.BooleanValue DISABLE_SKY_SHADER; + public static ModConfigSpec.BooleanValue DISABLE_TRANSLUCENT_PARTICLES; + public static ModConfigSpec.BooleanValue SHOW_RECIPE_BOOK; + public static ModConfigSpec.IntValue MAX_LOG_EVENTS; + public static ModConfigSpec.IntValue TOOLTIP_X_OFFSET; + public static ModConfigSpec.IntValue TOOLTIP_Y_OFFSET; + public static ModConfigSpec.IntValue MANABAR_X_OFFSET; + public static ModConfigSpec.IntValue MANABAR_Y_OFFSET; + public static ModConfigSpec.IntValue BOOKWYRM_LIMIT; + public static ModConfigSpec.BooleanValue GUI_TRANSPARENCY; + public static ModConfigSpec.BooleanValue GLYPH_TOOLTIPS; + + private static ModConfigSpec.ConfigValue> ENTITY_LIGHT_CONFIG; + private static ModConfigSpec.ConfigValue> ITEM_LIGHT_CONFIG; public static Map ENTITY_LIGHT_MAP = new HashMap<>(); public static Map ITEM_LIGHTMAP = new HashMap<>(); @@ -92,8 +92,8 @@ public static boolean isGlyphEnabled(AbstractSpellPart tag) { } static { - ForgeConfigSpec.Builder SERVER_BUILDER = new ForgeConfigSpec.Builder(); - ForgeConfigSpec.Builder CLIENT_BUILDER = new ForgeConfigSpec.Builder(); + ModConfigSpec.Builder SERVER_BUILDER = new ModConfigSpec.Builder(); + ModConfigSpec.Builder CLIENT_BUILDER = new ModConfigSpec.Builder(); CLIENT_BUILDER.comment("Lighting").push("lights"); SHOW_SUPPORTER_MESSAGE = CLIENT_BUILDER.comment("Show the supporter message. This is set to false after the first time.").define("showSupporterMessage", true); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ConfigUtil.java b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ConfigUtil.java index fb9e03a960..90424804c9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ConfigUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ConfigUtil.java @@ -1,8 +1,7 @@ package com.hollingsworth.arsnouveau.setup.config; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.common.ForgeConfigSpec; - +import net.neoforged.neoforge.common.ModConfigSpec; import java.util.List; import java.util.Map; import java.util.regex.Matcher; @@ -19,7 +18,7 @@ public class ConfigUtil { public static final Pattern STRING_INT_MAP = Pattern.compile("([^/=]+)=(\\p{Digit}+)"); /** Parse glyph_limits into a Map from augment glyph tags to limits. */ - public static Map parseMapConfig(ForgeConfigSpec.ConfigValue> configValue) { + public static Map parseMapConfig(ModConfigSpec.ConfigValue> configValue) { return configValue.get().stream() .map(STRING_INT_MAP::matcher) .filter(Matcher::matches) diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ServerConfig.java b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ServerConfig.java index fb49752d08..468811de0e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ServerConfig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ServerConfig.java @@ -1,31 +1,32 @@ package com.hollingsworth.arsnouveau.setup.config; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; public class ServerConfig { - public static ForgeConfigSpec SERVER_CONFIG; - public static ForgeConfigSpec.IntValue INIT_MAX_MANA; - public static ForgeConfigSpec.IntValue INIT_MANA_REGEN; - public static ForgeConfigSpec.IntValue GLYPH_MAX_BONUS; - public static ForgeConfigSpec.IntValue TIER_MAX_BONUS; - public static ForgeConfigSpec.IntValue TIER_REGEN_BONUS; - public static ForgeConfigSpec.IntValue MANA_BOOST_BONUS; - public static ForgeConfigSpec.IntValue MANA_REGEN_ENCHANT_BONUS; - public static ForgeConfigSpec.IntValue MANA_REGEN_POTION; - public static ForgeConfigSpec.IntValue REGEN_INTERVAL; - public static ForgeConfigSpec.DoubleValue GLYPH_REGEN_BONUS; - public static ForgeConfigSpec.BooleanValue ENFORCE_AUGMENT_CAP_ON_CAST; - public static ForgeConfigSpec.BooleanValue ENFORCE_GLYPH_LIMIT_ON_CAST; - public static ForgeConfigSpec.IntValue CODEX_COST_PER_GLYPH; - public static ForgeConfigSpec.BooleanValue ENABLE_WARP_PORTALS; - - public static ForgeConfigSpec.BooleanValue INFINITE_SPELLS; - public static ForgeConfigSpec.IntValue NOT_SO_INFINITE_SPELLS; + public static ModConfigSpec SERVER_CONFIG; + public static ModConfigSpec.IntValue INIT_MAX_MANA; + public static ModConfigSpec.IntValue INIT_MANA_REGEN; + public static ModConfigSpec.IntValue GLYPH_MAX_BONUS; + public static ModConfigSpec.IntValue TIER_MAX_BONUS; + public static ModConfigSpec.IntValue TIER_REGEN_BONUS; + public static ModConfigSpec.IntValue MANA_BOOST_BONUS; + public static ModConfigSpec.IntValue MANA_REGEN_ENCHANT_BONUS; + public static ModConfigSpec.IntValue MANA_REGEN_POTION; + public static ModConfigSpec.IntValue REGEN_INTERVAL; + public static ModConfigSpec.DoubleValue GLYPH_REGEN_BONUS; + public static ModConfigSpec.BooleanValue ENFORCE_AUGMENT_CAP_ON_CAST; + public static ModConfigSpec.BooleanValue ENFORCE_GLYPH_LIMIT_ON_CAST; + public static ModConfigSpec.IntValue CODEX_COST_PER_GLYPH; + public static ModConfigSpec.BooleanValue ENABLE_WARP_PORTALS; + + public static ModConfigSpec.BooleanValue INFINITE_SPELLS; + public static ModConfigSpec.IntValue NOT_SO_INFINITE_SPELLS; static { - ForgeConfigSpec.Builder SERVER_BUILDER = new ForgeConfigSpec.Builder(); + ModConfigSpec.Builder SERVER_BUILDER = new ModConfigSpec.Builder(); SERVER_BUILDER.comment("Mana").push("mana"); INIT_MANA_REGEN = SERVER_BUILDER.comment("Base mana regen in seconds").defineInRange("baseRegen", 5, 0, Integer.MAX_VALUE); INIT_MAX_MANA = SERVER_BUILDER.comment("Base max mana").defineInRange("baseMax", 100, 0, Integer.MAX_VALUE); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java index 119041dec3..a72d748ce1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java @@ -34,8 +34,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; -import net.minecraftforge.fml.loading.FMLEnvironment; - +import net.neoforged.fml.loading.FMLEnvironment; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BiomeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BiomeRegistry.java index 0855d63970..1f2c1d24a0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BiomeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BiomeRegistry.java @@ -3,7 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.core.registries.Registries; import net.minecraft.data.worldgen.BiomeDefaultFeatures; -import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.data.worldgen.placement.MiscOverworldPlacements; import net.minecraft.data.worldgen.placement.VegetationPlacements; import net.minecraft.resources.ResourceKey; @@ -22,7 +22,7 @@ public static ResourceKey register(String name) { return ResourceKey.create(Registries.BIOME, new ResourceLocation(ArsNouveau.MODID, name)); } - public static void bootstrap(BootstapContext context) { + public static void bootstrap(BootstrapContext context) { context.register(ARCHWOOD_FOREST, archwoodForest(context)); } @@ -40,7 +40,7 @@ public static void softDisks(BiomeGenerationSettings.Builder pBuilder) { pBuilder.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, MiscOverworldPlacements.DISK_CLAY); pBuilder.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, MiscOverworldPlacements.DISK_GRAVEL); } - public static Biome archwoodForest(BootstapContext context) { + public static Biome archwoodForest(BootstrapContext context) { MobSpawnSettings.Builder spawnBuilder = new MobSpawnSettings.Builder(); spawnBuilder.addSpawn(MobCategory.CREATURE, new MobSpawnSettings.SpawnerData(ModEntities.STARBUNCLE_TYPE.get(), 2, 3, 5)); spawnBuilder.addSpawn(MobCategory.CREATURE, new MobSpawnSettings.SpawnerData(ModEntities.ENTITY_DRYGMY.get(), 2, 1, 3)); @@ -86,7 +86,7 @@ public static Biome archwoodForest(BootstapContext context) { .foliageColorOverride(2210437) .fogColor(12638463) .ambientMoodSound(AmbientMoodSettings.LEGACY_CAVE_SETTINGS) - .backgroundMusic(Musics.createGameMusic(SoundRegistry.ARIA_BIBLIO.getHolder().get())).build()) + .backgroundMusic(Musics.createGameMusic(SoundRegistry.ARIA_BIBLIO)).build()) .build(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java index f7a0013398..cf28e35582 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java @@ -2,20 +2,21 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.renderer.tile.*; -import com.hollingsworth.arsnouveau.common.block.LightBlock; import com.hollingsworth.arsnouveau.common.block.*; +import com.hollingsworth.arsnouveau.common.block.LightBlock; import com.hollingsworth.arsnouveau.common.block.tile.*; import com.hollingsworth.arsnouveau.common.datagen.BlockTagProvider; import com.hollingsworth.arsnouveau.common.items.MobJarItem; import com.hollingsworth.arsnouveau.common.items.ModBlockItem; import com.hollingsworth.arsnouveau.common.items.RendererBlockItem; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.BlockEntityTypeRegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.BlockRegistryWrapper; import com.hollingsworth.arsnouveau.common.world.tree.MagicTree; import com.hollingsworth.arsnouveau.common.world.tree.SupplierBlockStateProvider; -import net.minecraft.ChatFormatting; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; @@ -25,6 +26,7 @@ import net.minecraft.world.item.ItemNameBlockItem; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; @@ -33,10 +35,8 @@ import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProviderType; import net.minecraft.world.level.material.MapColor; import net.minecraft.world.level.material.PushReaction; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.IForgeRegistry; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredRegister; +import top.theillusivec4.caelus.common.registry.RegistryObject; import java.util.HashMap; import java.util.Map; @@ -50,318 +50,319 @@ public class BlockRegistry { public static Block.Properties woodProp = BlockBehaviour.Properties.of().strength(2.0F, 3.0F).ignitedByLava().mapColor(MapColor.WOOD).sound(SoundType.WOOD); - public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, ArsNouveau.MODID); - public static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, ArsNouveau.MODID); - public static final DeferredRegister> BS_PROVIDERS = DeferredRegister.create(ForgeRegistries.BLOCK_STATE_PROVIDER_TYPES, ArsNouveau.MODID); + public static final DeferredRegister BLOCKS = DeferredRegister.create(BuiltInRegistries.BLOCK, ArsNouveau.MODID); + public static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create(BuiltInRegistries.BLOCK_ENTITY_TYPE, ArsNouveau.MODID); + public static final DeferredRegister> BS_PROVIDERS = DeferredRegister.create(BuiltInRegistries.BLOCKSTATE_PROVIDER_TYPE, ArsNouveau.MODID); public static final RegistryObject> stateProviderType = BS_PROVIDERS.register(LibBlockNames.STATE_PROVIDER, () -> new BlockStateProviderType<>(SupplierBlockStateProvider.CODEC)); public static BlockBehaviour.Properties LOG_PROP = BlockBehaviour.Properties.of().mapColor(MapColor.WOOD).strength(2.0F, 3.0F).ignitedByLava().sound(SoundType.WOOD); public static BlockBehaviour.Properties SAP_PROP = BlockBehaviour.Properties.of().noCollission().randomTicks().instabreak().sound(SoundType.GRASS).pushReaction(PushReaction.DESTROY); - public static RegistryWrapper MAGE_BLOCK = registerBlockAndItem(LibBlockNames.MAGE_BLOCK, MageBlock::new); - public static RegistryWrapper> MAGE_BLOCK_TILE = registerTile(LibBlockNames.MAGE_BLOCK, MageBlockTile::new, MAGE_BLOCK); - public static RegistryWrapper LIGHT_BLOCK = registerBlock(LibBlockNames.LIGHT_BLOCK, LightBlock::new); - public static RegistryWrapper> LIGHT_TILE = registerTile(LibBlockNames.LIGHT_BLOCK, LightTile::new, LIGHT_BLOCK); + public static BlockRegistryWrapper MAGE_BLOCK = registerBlockAndItem(LibBlockNames.MAGE_BLOCK, MageBlock::new); + public static BlockEntityTypeRegistryWrapper MAGE_BLOCK_TILE = registerTile(LibBlockNames.MAGE_BLOCK, MageBlockTile::new, MAGE_BLOCK); + public static BlockRegistryWrapper LIGHT_BLOCK = registerBlock(LibBlockNames.LIGHT_BLOCK, LightBlock::new); + public static BlockEntityTypeRegistryWrapper LIGHT_TILE = registerTile(LibBlockNames.LIGHT_BLOCK, LightTile::new, LIGHT_BLOCK); - public static RegistryWrapper T_LIGHT_BLOCK = registerBlock(LibBlockNames.T_LIGHT_BLOCK, TempLightBlock::new); - public static RegistryWrapper> T_LIGHT_TILE = registerTile(LibBlockNames.T_LIGHT_BLOCK, TempLightTile::new, T_LIGHT_BLOCK); - public static RegistryWrapper AGRONOMIC_SOURCELINK = registerBlockAndItem(LibBlockNames.AGRONOMIC_SOURCELINK, AgronomicSourcelinkBlock::new); - public static RegistryWrapper> AGRONOMIC_SOURCELINK_TILE = registerTile(LibBlockNames.AGRONOMIC_SOURCELINK, AgronomicSourcelinkTile::new, AGRONOMIC_SOURCELINK); + public static BlockRegistryWrapper T_LIGHT_BLOCK = registerBlock(LibBlockNames.T_LIGHT_BLOCK, TempLightBlock::new); + public static BlockEntityTypeRegistryWrapper T_LIGHT_TILE = registerTile(LibBlockNames.T_LIGHT_BLOCK, TempLightTile::new, T_LIGHT_BLOCK); + public static BlockRegistryWrapper AGRONOMIC_SOURCELINK = registerBlockAndItem(LibBlockNames.AGRONOMIC_SOURCELINK, AgronomicSourcelinkBlock::new); + public static BlockEntityTypeRegistryWrapper AGRONOMIC_SOURCELINK_TILE = registerTile(LibBlockNames.AGRONOMIC_SOURCELINK, AgronomicSourcelinkTile::new, AGRONOMIC_SOURCELINK); - public static RegistryWrapper ENCHANTING_APP_BLOCK = registerBlockAndItem(LibBlockNames.ENCHANTING_APPARATUS, EnchantingApparatusBlock::new, (reg) -> new RendererBlockItem(reg.get(), defaultItemProperties()) { + public static BlockRegistryWrapper ENCHANTING_APP_BLOCK = registerBlockAndItem(LibBlockNames.ENCHANTING_APPARATUS, EnchantingApparatusBlock::new, (reg) -> new RendererBlockItem(reg.get(), defaultItemProperties()) { @Override public Supplier getRenderer() { return GenericRenderer.getISTER("enchanting_apparatus"); } }); - public static RegistryWrapper> ENCHANTING_APP_TILE = registerTile(LibBlockNames.ENCHANTING_APPARATUS, EnchantingApparatusTile::new, ENCHANTING_APP_BLOCK); + public static BlockEntityTypeRegistryWrapper ENCHANTING_APP_TILE = registerTile(LibBlockNames.ENCHANTING_APPARATUS, EnchantingApparatusTile::new, ENCHANTING_APP_BLOCK); - public static RegistryWrapper SOURCE_JAR = registerBlockAndItem(LibBlockNames.SOURCE_JAR, SourceJar::new); - public static RegistryWrapper> SOURCE_JAR_TILE = registerTile(LibBlockNames.SOURCE_JAR, SourceJarTile::new, SOURCE_JAR); + public static BlockRegistryWrapper SOURCE_JAR = registerBlockAndItem(LibBlockNames.SOURCE_JAR, SourceJar::new); + public static BlockEntityTypeRegistryWrapper SOURCE_JAR_TILE = registerTile(LibBlockNames.SOURCE_JAR, SourceJarTile::new, SOURCE_JAR); - public static RegistryWrapper RELAY = registerBlockAndItem(LibBlockNames.RELAY, Relay::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { + public static BlockRegistryWrapper RELAY = registerBlockAndItem(LibBlockNames.RELAY, Relay::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { return GenericRenderer.getISTER("source_relay"); } }); - public static RegistryWrapper> ARCANE_RELAY_TILE = registerTile(LibBlockNames.RELAY, RelayTile::new, RELAY); - public static RegistryWrapper MAGE_BLOOM_CROP = registerBlockAndItem(LibBlockNames.MAGE_BLOOM, MageBloomCrop::new); - public static RegistryWrapper SCRIBES_BLOCK = registerBlockAndItem(LibBlockNames.SCRIBES_BLOCK, ScribesBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { + public static BlockEntityTypeRegistryWrapper ARCANE_RELAY_TILE = registerTile(LibBlockNames.RELAY, RelayTile::new, RELAY); + public static BlockRegistryWrapper MAGE_BLOOM_CROP = registerBlockAndItem(LibBlockNames.MAGE_BLOOM, MageBloomCrop::new); + public static BlockRegistryWrapper SCRIBES_BLOCK = registerBlockAndItem(LibBlockNames.SCRIBES_BLOCK, ScribesBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { return ScribesRenderer::getISTER; } }); - public static RegistryWrapper> SCRIBES_TABLE_TILE = registerTile(LibBlockNames.SCRIBES_BLOCK, ScribesTile::new, SCRIBES_BLOCK); - public static RegistryWrapper RUNE_BLOCK = registerBlockAndItem(LibBlockNames.RUNE, RuneBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { + public static BlockEntityTypeRegistryWrapper SCRIBES_TABLE_TILE = registerTile(LibBlockNames.SCRIBES_BLOCK, ScribesTile::new, SCRIBES_BLOCK); + public static BlockRegistryWrapper RUNE_BLOCK = registerBlockAndItem(LibBlockNames.RUNE, RuneBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { return RuneRenderer::getISTER; } }); - public static RegistryWrapper> RUNE_TILE = registerTile(LibBlockNames.RUNE, RuneTile::new, RUNE_BLOCK); - public static RegistryWrapper PORTAL_BLOCK = registerBlockAndItem(LibBlockNames.PORTAL, PortalBlock::new); - public static RegistryWrapper> PORTAL_TILE_TYPE = registerTile(LibBlockNames.PORTAL, PortalTile::new, PORTAL_BLOCK); + public static BlockEntityTypeRegistryWrapper RUNE_TILE = registerTile(LibBlockNames.RUNE, RuneTile::new, RUNE_BLOCK); + public static BlockRegistryWrapper PORTAL_BLOCK = registerBlockAndItem(LibBlockNames.PORTAL, PortalBlock::new); + public static BlockEntityTypeRegistryWrapper PORTAL_TILE_TYPE = registerTile(LibBlockNames.PORTAL, PortalTile::new, PORTAL_BLOCK); - public static RegistryWrapper IMBUEMENT_BLOCK = registerBlockAndItem(LibBlockNames.IMBUEMENT_CHAMBER, ImbuementBlock::new, (reg) -> new RendererBlockItem(BlockRegistry.IMBUEMENT_BLOCK, defaultItemProperties()) { + public static BlockRegistryWrapper IMBUEMENT_BLOCK = registerBlockAndItem(LibBlockNames.IMBUEMENT_CHAMBER, ImbuementBlock::new, (reg) -> new RendererBlockItem(BlockRegistry.IMBUEMENT_BLOCK, defaultItemProperties()) { @Override public Supplier getRenderer() { return GenericRenderer.getISTER("imbuement_chamber"); } }); - public static RegistryWrapper> IMBUEMENT_TILE = registerTile(LibBlockNames.IMBUEMENT_CHAMBER, ImbuementTile::new, IMBUEMENT_BLOCK); - public static RegistryWrapper RELAY_SPLITTER = registerBlockAndItem(LibBlockNames.RELAY_SPLITTER, RelaySplitter::new, (reg) -> new RendererBlockItem(BlockRegistry.RELAY_SPLITTER, defaultItemProperties()) { + public static BlockEntityTypeRegistryWrapper IMBUEMENT_TILE = registerTile(LibBlockNames.IMBUEMENT_CHAMBER, ImbuementTile::new, IMBUEMENT_BLOCK); + public static BlockRegistryWrapper RELAY_SPLITTER = registerBlockAndItem(LibBlockNames.RELAY_SPLITTER, RelaySplitter::new, (reg) -> new RendererBlockItem(BlockRegistry.RELAY_SPLITTER, defaultItemProperties()) { @Override public Supplier getRenderer() { return GenericRenderer.getISTER("source_splitter"); } }); - public static RegistryWrapper> RELAY_SPLITTER_TILE = registerTile(LibBlockNames.RELAY_SPLITTER, RelaySplitterTile::new, RELAY_SPLITTER); - public static RegistryWrapper ARCANE_CORE_BLOCK = registerBlockAndItem(LibBlockNames.ARCANE_CORE, ArcaneCore::new, (reg) -> new RendererBlockItem(BlockRegistry.ARCANE_CORE_BLOCK, defaultItemProperties()) { + public static BlockEntityTypeRegistryWrapper RELAY_SPLITTER_TILE = registerTile(LibBlockNames.RELAY_SPLITTER, RelaySplitterTile::new, RELAY_SPLITTER); + public static BlockRegistryWrapper ARCANE_CORE_BLOCK = registerBlockAndItem(LibBlockNames.ARCANE_CORE, ArcaneCore::new, (reg) -> new RendererBlockItem(BlockRegistry.ARCANE_CORE_BLOCK, defaultItemProperties()) { @Override public Supplier getRenderer() { return ArcaneCoreRenderer::getISTER; } }); - public static RegistryWrapper> ARCANE_CORE_TILE = registerTile(LibBlockNames.ARCANE_CORE, ArcaneCoreTile::new, ARCANE_CORE_BLOCK); - public static RegistryWrapper ENCHANTED_SPELL_TURRET = registerBlockAndItem(LibBlockNames.ENCHANTED_SPELL_TURRET, EnchantedSpellTurret::new, (reg) -> new RendererBlockItem(BlockRegistry.ENCHANTED_SPELL_TURRET, defaultItemProperties()) { + public static BlockEntityTypeRegistryWrapper ARCANE_CORE_TILE = registerTile(LibBlockNames.ARCANE_CORE, ArcaneCoreTile::new, ARCANE_CORE_BLOCK); + public static BlockRegistryWrapper ENCHANTED_SPELL_TURRET = registerBlockAndItem(LibBlockNames.ENCHANTED_SPELL_TURRET, EnchantedSpellTurret::new, (reg) -> new RendererBlockItem(BlockRegistry.ENCHANTED_SPELL_TURRET, defaultItemProperties()) { @Override public Supplier getRenderer() { return ReducerTurretRenderer::getISTER; } }); - public static RegistryWrapper> ENCHANTED_SPELL_TURRET_TYPE = registerTile(LibBlockNames.ENCHANTED_SPELL_TURRET, EnchantedTurretTile::new, ENCHANTED_SPELL_TURRET); - public static RegistryWrapper INTANGIBLE_AIR = registerBlock(LibBlockNames.INTANGIBLE_AIR, IntangibleAirBlock::new); - public static RegistryWrapper> INTANGIBLE_AIR_TYPE = registerTile(LibBlockNames.INTANGIBLE_AIR, IntangibleAirTile::new, INTANGIBLE_AIR); - public static RegistryWrapper VOLCANIC_BLOCK = registerBlockAndItem(LibBlockNames.VOLCANIC_SOURCELINK, VolcanicSourcelinkBlock::new); - public static RegistryWrapper> VOLCANIC_TILE = registerTile(LibBlockNames.VOLCANIC_SOURCELINK, VolcanicSourcelinkTile::new, VOLCANIC_BLOCK); - - public static RegistryWrapper SOURCEBERRY_BUSH = registerBlockAndItem(LibBlockNames.SOURCEBERRY_BUSH, () -> new SourceBerryBush(BlockBehaviour.Properties.of().randomTicks().noCollission().sound(SoundType.SWEET_BERRY_BUSH)), (reg) -> new BlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.SOURCE_BERRY_FOOD))); - public static RegistryWrapper WIXIE_CAULDRON = registerBlockAndItem(LibBlockNames.WIXIE_CAULDRON, WixieCauldron::new); - public static RegistryWrapper> WIXIE_CAULDRON_TYPE = registerTile(LibBlockNames.WIXIE_CAULDRON, WixieCauldronTile::new, WIXIE_CAULDRON); - public static RegistryWrapper CREATIVE_SOURCE_JAR = registerBlockAndItem(LibBlockNames.CREATIVE_SOURCE_JAR, CreativeSourceJar::new); - public static RegistryWrapper> CREATIVE_SOURCE_JAR_TILE = registerTile(LibBlockNames.CREATIVE_SOURCE_JAR, CreativeSourceJarTile::new, CREATIVE_SOURCE_JAR); - public static RegistryWrapper CASCADING_LOG = registerBlockAndItem(LibBlockNames.CASCADING_LOG, () -> new StrippableLog(LOG_PROP, BlockRegistry.STRIPPED_AWLOG_BLUE)); - public static RegistryWrapper CASCADING_LEAVE = registerBlockAndItem(LibBlockNames.CASCADING_LEAVES, () -> createLeavesBlock(MapColor.COLOR_BLUE)); - public static RegistryWrapper CASCADING_SAPLING = registerBlockAndItem(LibBlockNames.CASCADING_SAPLING, () -> new SaplingBlock(new MagicTree(WorldgenRegistry.CONFIGURED_CASCADING_TREE), SAP_PROP)); - public static RegistryWrapper CASCADING_WOOD = registerBlockAndItem(LibBlockNames.CASCADING_WOOD, () -> new StrippableLog(LOG_PROP, BlockRegistry.STRIPPED_AWWOOD_BLUE)); - public static RegistryWrapper BLAZING_LOG = registerBlockAndItem(LibBlockNames.BLAZING_LOG, () -> new StrippableLog(LOG_PROP, BlockRegistry.STRIPPED_AWLOG_RED)); - public static RegistryWrapper BLAZING_LEAVES = registerBlockAndItem(LibBlockNames.BLAZING_LEAVES, () -> createLeavesBlock(MapColor.COLOR_RED)); - - public static RegistryWrapper BLAZING_SAPLING = registerBlockAndItem(LibBlockNames.BLAZING_SAPLING, () -> new SaplingBlock(new MagicTree(WorldgenRegistry.CONFIGURED_BLAZING_TREE), SAP_PROP)); - public static RegistryWrapper BLAZING_WOOD = registerBlockAndItem(LibBlockNames.BLAZING_WOOD, () -> new StrippableLog(LOG_PROP, BlockRegistry.STRIPPED_AWWOOD_RED)); - public static RegistryWrapper VEXING_LOG = registerBlockAndItem(LibBlockNames.VEXING_LOG, () -> new StrippableLog(LOG_PROP, BlockRegistry.STRIPPED_AWLOG_PURPLE)); - public static RegistryWrapper VEXING_LEAVES = registerBlockAndItem(LibBlockNames.VEXING_LEAVES, () -> createLeavesBlock(MapColor.COLOR_PURPLE)); - public static RegistryWrapper VEXING_SAPLING = registerBlockAndItem(LibBlockNames.VEXING_SAPLING, () -> new SaplingBlock(new MagicTree(WorldgenRegistry.CONFIGURED_VEXING_TREE), SAP_PROP)); - public static RegistryWrapper VEXING_WOOD = registerBlockAndItem(LibBlockNames.VEXING_WOOD, () -> new StrippableLog(LOG_PROP, BlockRegistry.STRIPPED_AWWOOD_PURPLE)); - public static RegistryWrapper FLOURISHING_LOG = registerBlockAndItem(LibBlockNames.FLOURISHING_LOG, () -> new StrippableLog(LOG_PROP, BlockRegistry.STRIPPED_AWLOG_GREEN)); - public static RegistryWrapper FLOURISHING_LEAVES = registerBlockAndItem(LibBlockNames.FLOURISHING_LEAVES, () -> createLeavesBlock(MapColor.COLOR_GREEN)); - public static RegistryWrapper FLOURISHING_SAPLING = registerBlockAndItem(LibBlockNames.FLOURISHING_SAPLING, () -> new SaplingBlock(new MagicTree(WorldgenRegistry.CONFIGURED_FLOURISHING_TREE), SAP_PROP)); - public static RegistryWrapper FLOURISHING_WOOD = registerBlockAndItem(LibBlockNames.FLOURISHING_WOOD, () -> new StrippableLog(LOG_PROP, BlockRegistry.STRIPPED_AWWOOD_GREEN)); - public static RegistryWrapper ARCHWOOD_PLANK = registerBlockAndItem(LibBlockNames.ARCHWOOD_PLANK, () -> new ModBlock(LOG_PROP)); - public static RegistryWrapper ARCHWOOD_BUTTON = registerBlockAndItem(LibBlockNames.ARCHWOOD_BUTTON, () -> new ButtonBlock(BlockBehaviour.Properties.of().noCollission().strength(0.5F).sound(SoundType.WOOD), BlockSetType.OAK, 30, true)); - public static RegistryWrapper ARCHWOOD_STAIRS = registerBlockAndItem(LibBlockNames.ARCHWOOD_STAIRS, () -> new StairBlock(() -> ARCHWOOD_PLANK.defaultBlockState(), woodProp)); - public static RegistryWrapper ARCHWOOD_SLABS = registerBlockAndItem(LibBlockNames.ARCHWOOD_SLABS, () -> new SlabBlock(woodProp)); - public static RegistryWrapper ARCHWOOD_FENCE_GATE = registerBlockAndItem(LibBlockNames.ARCHWOOD_FENCE_GATE, () -> new FenceGateBlock(woodProp, WoodType.OAK)); - public static RegistryWrapper ARCHWOOD_TRAPDOOR = registerBlockAndItem(LibBlockNames.ARCHWOOD_TRAPDOOR, () -> new TrapDoorBlock(woodProp, BlockSetType.OAK)); - - public static RegistryWrapper ARCHWOOD_PPlate = registerBlockAndItem(LibBlockNames.ARCHWOOD_PRESSURE_PLATE, () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, woodProp, BlockSetType.OAK)); - public static RegistryWrapper ARCHWOOD_FENCE = registerBlockAndItem(LibBlockNames.ARCHWOOD_FENCE, () -> new FenceBlock(woodProp)); - public static RegistryWrapper ARCHWOOD_DOOR = registerBlockAndItem(LibBlockNames.ARCHWOOD_DOOR, () -> new DoorBlock(woodProp, BlockSetType.OAK)); - public static RegistryWrapper STRIPPED_AWLOG_BLUE = registerBlockAndItem(LibBlockNames.STRIPPED_AWLOG_BLUE, () -> new RotatedPillarBlock(LOG_PROP)); - public static RegistryWrapper STRIPPED_AWWOOD_BLUE = registerBlockAndItem(LibBlockNames.STRIPPED_AWWOOD_BLUE, () -> new RotatedPillarBlock(LOG_PROP)); - public static RegistryWrapper STRIPPED_AWLOG_GREEN = registerBlockAndItem(LibBlockNames.STRIPPED_AWLOG_GREEN, () -> new RotatedPillarBlock(LOG_PROP)); - public static RegistryWrapper STRIPPED_AWWOOD_GREEN = registerBlockAndItem(LibBlockNames.STRIPPED_AWWOOD_GREEN, () -> new RotatedPillarBlock(LOG_PROP)); - public static RegistryWrapper STRIPPED_AWLOG_RED = registerBlockAndItem(LibBlockNames.STRIPPED_AWLOG_RED, () -> new RotatedPillarBlock(LOG_PROP)); - public static RegistryWrapper STRIPPED_AWWOOD_RED = registerBlockAndItem(LibBlockNames.STRIPPED_AWWOOD_RED, () -> new RotatedPillarBlock(LOG_PROP)); - public static RegistryWrapper STRIPPED_AWLOG_PURPLE = registerBlockAndItem(LibBlockNames.STRIPPED_AWLOG_PURPLE, () -> new RotatedPillarBlock(LOG_PROP)); - public static RegistryWrapper STRIPPED_AWWOOD_PURPLE = registerBlockAndItem(LibBlockNames.STRIPPED_AWWOOD_PURPLE, () -> new RotatedPillarBlock(LOG_PROP)); - public static RegistryWrapper SOURCE_GEM_BLOCK = registerBlockAndItem(LibBlockNames.SOURCE_GEM_BLOCK, () -> new ModBlock(ModBlock.defaultProperties().noOcclusion().lightLevel(s -> 6))); - public static RegistryWrapper POTION_JAR = registerBlockAndItem(LibBlockNames.POTION_JAR_BLOCK, PotionJar::new); - public static RegistryWrapper> POTION_JAR_TYPE = registerTile(LibBlockNames.POTION_JAR_BLOCK, PotionJarTile::new, POTION_JAR); - public static RegistryWrapper POTION_MELDER = registerBlockAndItem(LibBlockNames.POTION_MELDER_BLOCK, PotionMelder::new); - public static RegistryWrapper> POTION_MELDER_TYPE = registerTile(LibBlockNames.POTION_MELDER_BLOCK, PotionMelderTile::new, POTION_MELDER); - public static RegistryWrapper GOLD_SCONCE_BLOCK = registerBlockAndItem(LibBlockNames.SCONCE, SconceBlock::new); - public static RegistryWrapper SOURCESTONE_SCONCE_BLOCK = registerBlockAndItem(LibBlockNames.SOURCESTONE_SCONCE, SconceBlock::new); - public static RegistryWrapper POLISHED_SCONCE_BLOCK = registerBlockAndItem(LibBlockNames.POLISHED_SCONCE, SconceBlock::new); - public static RegistryWrapper ARCHWOOD_SCONCE_BLOCK = registerBlockAndItem(LibBlockNames.ARCHWOOD_SCONCE, SconceBlock::new); - public static RegistryWrapper MAGIC_FIRE = registerBlockAndItem(LibBlockNames.MAGIC_FIRE, () -> new MagicFire(BlockBehaviour.Properties.of().mapColor(MapColor.FIRE).replaceable().noCollission().instabreak().lightLevel((p_152607_) -> { + public static BlockEntityTypeRegistryWrapper ENCHANTED_SPELL_TURRET_TYPE = registerTile(LibBlockNames.ENCHANTED_SPELL_TURRET, EnchantedTurretTile::new, ENCHANTED_SPELL_TURRET); + public static BlockRegistryWrapper INTANGIBLE_AIR = registerBlock(LibBlockNames.INTANGIBLE_AIR, IntangibleAirBlock::new); + public static BlockEntityTypeRegistryWrapper INTANGIBLE_AIR_TYPE = registerTile(LibBlockNames.INTANGIBLE_AIR, IntangibleAirTile::new, INTANGIBLE_AIR); + public static BlockRegistryWrapper VOLCANIC_BLOCK = registerBlockAndItem(LibBlockNames.VOLCANIC_SOURCELINK, VolcanicSourcelinkBlock::new); + public static BlockEntityTypeRegistryWrapper VOLCANIC_TILE = registerTile(LibBlockNames.VOLCANIC_SOURCELINK, VolcanicSourcelinkTile::new, VOLCANIC_BLOCK); + + public static BlockRegistryWrapper SOURCEBERRY_BUSH = registerBlockAndItem(LibBlockNames.SOURCEBERRY_BUSH, () -> new SourceBerryBush(BlockBehaviour.Properties.of().randomTicks().noCollission().sound(SoundType.SWEET_BERRY_BUSH)), (reg) -> new BlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.SOURCE_BERRY_FOOD))); + public static BlockRegistryWrapper WIXIE_CAULDRON = registerBlockAndItem(LibBlockNames.WIXIE_CAULDRON, WixieCauldron::new); + public static BlockEntityTypeRegistryWrapper WIXIE_CAULDRON_TYPE = registerTile(LibBlockNames.WIXIE_CAULDRON, WixieCauldronTile::new, WIXIE_CAULDRON); + public static BlockRegistryWrapper CREATIVE_SOURCE_JAR = registerBlockAndItem(LibBlockNames.CREATIVE_SOURCE_JAR, CreativeSourceJar::new); + public static BlockEntityTypeRegistryWrapper CREATIVE_SOURCE_JAR_TILE = registerTile(LibBlockNames.CREATIVE_SOURCE_JAR, CreativeSourceJarTile::new, CREATIVE_SOURCE_JAR); + public static BlockRegistryWrapper CASCADING_LOG = registerBlockAndItem(LibBlockNames.CASCADING_LOG, () -> new StrippableLog(LOG_PROP, BlockRegistry.STRIPPED_AWLOG_BLUE)); + public static BlockRegistryWrapper CASCADING_LEAVE = registerBlockAndItem(LibBlockNames.CASCADING_LEAVES, () -> createLeavesBlock(MapColor.COLOR_BLUE)); + public static BlockRegistryWrapper CASCADING_SAPLING = registerBlockAndItem(LibBlockNames.CASCADING_SAPLING, () -> new SaplingBlock(MagicTree.getGrower("cascading_tree", WorldgenRegistry.CONFIGURED_CASCADING_TREE), SAP_PROP)); + public static BlockRegistryWrapper CASCADING_WOOD = registerBlockAndItem(LibBlockNames.CASCADING_WOOD, () -> new StrippableLog(LOG_PROP, BlockRegistry.STRIPPED_AWWOOD_BLUE)); + public static BlockRegistryWrapper BLAZING_LOG = registerBlockAndItem(LibBlockNames.BLAZING_LOG, () -> new StrippableLog(LOG_PROP, BlockRegistry.STRIPPED_AWLOG_RED)); + public static BlockRegistryWrapper BLAZING_LEAVES = registerBlockAndItem(LibBlockNames.BLAZING_LEAVES, () -> createLeavesBlock(MapColor.COLOR_RED)); + + public static BlockRegistryWrapper BLAZING_SAPLING = registerBlockAndItem(LibBlockNames.BLAZING_SAPLING, () -> new SaplingBlock(MagicTree.getGrower("blazing_tree", WorldgenRegistry.CONFIGURED_BLAZING_TREE), SAP_PROP)); + public static BlockRegistryWrapper BLAZING_WOOD = registerBlockAndItem(LibBlockNames.BLAZING_WOOD, () -> new StrippableLog(LOG_PROP, BlockRegistry.STRIPPED_AWWOOD_RED)); + public static BlockRegistryWrapper VEXING_LOG = registerBlockAndItem(LibBlockNames.VEXING_LOG, () -> new StrippableLog(LOG_PROP, BlockRegistry.STRIPPED_AWLOG_PURPLE)); + public static BlockRegistryWrapper VEXING_LEAVES = registerBlockAndItem(LibBlockNames.VEXING_LEAVES, () -> createLeavesBlock(MapColor.COLOR_PURPLE)); + public static BlockRegistryWrapper VEXING_SAPLING = registerBlockAndItem(LibBlockNames.VEXING_SAPLING, () -> new SaplingBlock(MagicTree.getGrower("vexing_tree", WorldgenRegistry.CONFIGURED_VEXING_TREE), SAP_PROP)); + public static BlockRegistryWrapper VEXING_WOOD = registerBlockAndItem(LibBlockNames.VEXING_WOOD, () -> new StrippableLog(LOG_PROP, BlockRegistry.STRIPPED_AWWOOD_PURPLE)); + public static BlockRegistryWrapper FLOURISHING_LOG = registerBlockAndItem(LibBlockNames.FLOURISHING_LOG, () -> new StrippableLog(LOG_PROP, BlockRegistry.STRIPPED_AWLOG_GREEN)); + public static BlockRegistryWrapper FLOURISHING_LEAVES = registerBlockAndItem(LibBlockNames.FLOURISHING_LEAVES, () -> createLeavesBlock(MapColor.COLOR_GREEN)); + public static BlockRegistryWrapper FLOURISHING_SAPLING = registerBlockAndItem(LibBlockNames.FLOURISHING_SAPLING, () -> new SaplingBlock(MagicTree.getGrower("flourishing_tree", WorldgenRegistry.CONFIGURED_FLOURISHING_TREE), SAP_PROP)); + public static BlockRegistryWrapper FLOURISHING_WOOD = registerBlockAndItem(LibBlockNames.FLOURISHING_WOOD, () -> new StrippableLog(LOG_PROP, BlockRegistry.STRIPPED_AWWOOD_GREEN)); + public static BlockRegistryWrapper ARCHWOOD_PLANK = registerBlockAndItem(LibBlockNames.ARCHWOOD_PLANK, () -> new ModBlock(LOG_PROP)); + public static BlockRegistryWrapper ARCHWOOD_BUTTON = registerBlockAndItem(LibBlockNames.ARCHWOOD_BUTTON, () -> new ButtonBlock(BlockSetType.OAK, 30, BlockBehaviour.Properties.of().noCollission().strength(0.5F).sound(SoundType.WOOD))); + public static BlockRegistryWrapper ARCHWOOD_STAIRS = registerBlockAndItem(LibBlockNames.ARCHWOOD_STAIRS, () -> new StairBlock(ARCHWOOD_PLANK.defaultBlockState(), woodProp)); + public static BlockRegistryWrapper ARCHWOOD_SLABS = registerBlockAndItem(LibBlockNames.ARCHWOOD_SLABS, () -> new SlabBlock(woodProp)); + public static BlockRegistryWrapper ARCHWOOD_FENCE_GATE = registerBlockAndItem(LibBlockNames.ARCHWOOD_FENCE_GATE, () -> new FenceGateBlock(WoodType.OAK, woodProp)); + public static BlockRegistryWrapper ARCHWOOD_TRAPDOOR = registerBlockAndItem(LibBlockNames.ARCHWOOD_TRAPDOOR, () -> new TrapDoorBlock(BlockSetType.OAK, woodProp)); + + public static BlockRegistryWrapper ARCHWOOD_PPlate = registerBlockAndItem(LibBlockNames.ARCHWOOD_PRESSURE_PLATE, () -> new PressurePlateBlock(BlockSetType.OAK, woodProp)); + public static BlockRegistryWrapper ARCHWOOD_FENCE = registerBlockAndItem(LibBlockNames.ARCHWOOD_FENCE, () -> new FenceBlock(woodProp)); + public static BlockRegistryWrapper ARCHWOOD_DOOR = registerBlockAndItem(LibBlockNames.ARCHWOOD_DOOR, () -> new DoorBlock(BlockSetType.OAK, woodProp)); + public static BlockRegistryWrapper STRIPPED_AWLOG_BLUE = registerBlockAndItem(LibBlockNames.STRIPPED_AWLOG_BLUE, () -> new RotatedPillarBlock(LOG_PROP)); + public static BlockRegistryWrapper STRIPPED_AWWOOD_BLUE = registerBlockAndItem(LibBlockNames.STRIPPED_AWWOOD_BLUE, () -> new RotatedPillarBlock(LOG_PROP)); + public static BlockRegistryWrapper STRIPPED_AWLOG_GREEN = registerBlockAndItem(LibBlockNames.STRIPPED_AWLOG_GREEN, () -> new RotatedPillarBlock(LOG_PROP)); + public static BlockRegistryWrapper STRIPPED_AWWOOD_GREEN = registerBlockAndItem(LibBlockNames.STRIPPED_AWWOOD_GREEN, () -> new RotatedPillarBlock(LOG_PROP)); + public static BlockRegistryWrapper STRIPPED_AWLOG_RED = registerBlockAndItem(LibBlockNames.STRIPPED_AWLOG_RED, () -> new RotatedPillarBlock(LOG_PROP)); + public static BlockRegistryWrapper STRIPPED_AWWOOD_RED = registerBlockAndItem(LibBlockNames.STRIPPED_AWWOOD_RED, () -> new RotatedPillarBlock(LOG_PROP)); + public static BlockRegistryWrapper STRIPPED_AWLOG_PURPLE = registerBlockAndItem(LibBlockNames.STRIPPED_AWLOG_PURPLE, () -> new RotatedPillarBlock(LOG_PROP)); + public static BlockRegistryWrapper STRIPPED_AWWOOD_PURPLE = registerBlockAndItem(LibBlockNames.STRIPPED_AWWOOD_PURPLE, () -> new RotatedPillarBlock(LOG_PROP)); + public static BlockRegistryWrapper SOURCE_GEM_BLOCK = registerBlockAndItem(LibBlockNames.SOURCE_GEM_BLOCK, () -> new ModBlock(ModBlock.defaultProperties().noOcclusion().lightLevel(s -> 6))); + public static BlockRegistryWrapper POTION_JAR = registerBlockAndItem(LibBlockNames.POTION_JAR_BLOCK, PotionJar::new); + public static BlockEntityTypeRegistryWrapper POTION_JAR_TYPE = registerTile(LibBlockNames.POTION_JAR_BLOCK, PotionJarTile::new, POTION_JAR); + public static BlockRegistryWrapper POTION_MELDER = registerBlockAndItem(LibBlockNames.POTION_MELDER_BLOCK, PotionMelder::new); + public static BlockEntityTypeRegistryWrapper POTION_MELDER_TYPE = registerTile(LibBlockNames.POTION_MELDER_BLOCK, PotionMelderTile::new, POTION_MELDER); + public static BlockRegistryWrapper GOLD_SCONCE_BLOCK = registerBlockAndItem(LibBlockNames.SCONCE, SconceBlock::new); + public static BlockRegistryWrapper SOURCESTONE_SCONCE_BLOCK = registerBlockAndItem(LibBlockNames.SOURCESTONE_SCONCE, SconceBlock::new); + public static BlockRegistryWrapper POLISHED_SCONCE_BLOCK = registerBlockAndItem(LibBlockNames.POLISHED_SCONCE, SconceBlock::new); + public static BlockRegistryWrapper ARCHWOOD_SCONCE_BLOCK = registerBlockAndItem(LibBlockNames.ARCHWOOD_SCONCE, SconceBlock::new); + public static BlockRegistryWrapper MAGIC_FIRE = registerBlockAndItem(LibBlockNames.MAGIC_FIRE, () -> new MagicFire(BlockBehaviour.Properties.of().mapColor(MapColor.FIRE).replaceable().noCollission().instabreak().lightLevel((p_152607_) -> { return 15; }).sound(SoundType.WOOL).pushReaction(PushReaction.DESTROY), 1.0f)); - public static RegistryWrapper> SCONCE_TILE = new RegistryWrapper<>(BLOCK_ENTITIES.register(LibBlockNames.SCONCE, () -> BlockEntityType.Builder.of(SconceTile::new, GOLD_SCONCE_BLOCK.get(), SOURCESTONE_SCONCE_BLOCK.get(), POLISHED_SCONCE_BLOCK.get(), ARCHWOOD_SCONCE_BLOCK.get()).build(null))); - public static RegistryWrapper DRYGMY_BLOCK = registerBlockAndItem(LibBlockNames.DRYGMY_STONE, DrygmyStone::new); - public static RegistryWrapper> DRYGMY_TILE = registerTile(LibBlockNames.DRYGMY_STONE, DrygmyTile::new, DRYGMY_BLOCK); - public static RegistryWrapper ALCHEMICAL_BLOCK = registerBlockAndItem(LibBlockNames.ALCHEMICAL_SOURCELINK, AlchemicalSourcelinkBlock::new); - public static RegistryWrapper> ALCHEMICAL_TILE = registerTile(LibBlockNames.ALCHEMICAL_SOURCELINK, AlchemicalSourcelinkTile::new, ALCHEMICAL_BLOCK); - public static RegistryWrapper VITALIC_BLOCK = registerBlockAndItem(LibBlockNames.VITALIC_SOURCELINK, VitalicSourcelinkBlock::new); - public static RegistryWrapper> VITALIC_TILE = registerTile(LibBlockNames.VITALIC_SOURCELINK, VitalicSourcelinkTile::new, VITALIC_BLOCK); - public static RegistryWrapper MYCELIAL_BLOCK = registerBlockAndItem(LibBlockNames.MYCELIAL_SOURCELINK, MycelialSourcelinkBlock::new); - public static RegistryWrapper> MYCELIAL_TILE = registerTile(LibBlockNames.MYCELIAL_SOURCELINK, MycelialSourcelinkTile::new, MYCELIAL_BLOCK); - public static RegistryWrapper RELAY_DEPOSIT = registerBlockAndItem(LibBlockNames.RELAY_DEPOSIT, RelayDepositBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { + public static BlockEntityTypeRegistryWrapper SCONCE_TILE = new BlockEntityTypeRegistryWrapper<>(BLOCK_ENTITIES.register(LibBlockNames.SCONCE, () -> BlockEntityType.Builder.of(SconceTile::new, GOLD_SCONCE_BLOCK.get(), SOURCESTONE_SCONCE_BLOCK.get(), POLISHED_SCONCE_BLOCK.get(), ARCHWOOD_SCONCE_BLOCK.get()).build(null))); + public static BlockRegistryWrapper DRYGMY_BLOCK = registerBlockAndItem(LibBlockNames.DRYGMY_STONE, DrygmyStone::new); + public static BlockEntityTypeRegistryWrapper DRYGMY_TILE = registerTile(LibBlockNames.DRYGMY_STONE, DrygmyTile::new, DRYGMY_BLOCK); + public static BlockRegistryWrapper ALCHEMICAL_BLOCK = registerBlockAndItem(LibBlockNames.ALCHEMICAL_SOURCELINK, AlchemicalSourcelinkBlock::new); + public static BlockEntityTypeRegistryWrapper ALCHEMICAL_TILE = registerTile(LibBlockNames.ALCHEMICAL_SOURCELINK, AlchemicalSourcelinkTile::new, ALCHEMICAL_BLOCK); + public static BlockRegistryWrapper VITALIC_BLOCK = registerBlockAndItem(LibBlockNames.VITALIC_SOURCELINK, VitalicSourcelinkBlock::new); + public static BlockEntityTypeRegistryWrapper VITALIC_TILE = registerTile(LibBlockNames.VITALIC_SOURCELINK, VitalicSourcelinkTile::new, VITALIC_BLOCK); + public static BlockRegistryWrapper MYCELIAL_BLOCK = registerBlockAndItem(LibBlockNames.MYCELIAL_SOURCELINK, MycelialSourcelinkBlock::new); + public static BlockEntityTypeRegistryWrapper MYCELIAL_TILE = registerTile(LibBlockNames.MYCELIAL_SOURCELINK, MycelialSourcelinkTile::new, MYCELIAL_BLOCK); + public static BlockRegistryWrapper RELAY_DEPOSIT = registerBlockAndItem(LibBlockNames.RELAY_DEPOSIT, RelayDepositBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { return GenericRenderer.getISTER("source_deposit"); } }); - public static RegistryWrapper> RELAY_DEPOSIT_TILE = registerTile(LibBlockNames.RELAY_DEPOSIT, RelayDepositTile::new, RELAY_DEPOSIT); - public static RegistryWrapper RELAY_WARP = registerBlockAndItem(LibBlockNames.RELAY_WARP, RelayWarpBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { + public static BlockEntityTypeRegistryWrapper RELAY_DEPOSIT_TILE = registerTile(LibBlockNames.RELAY_DEPOSIT, RelayDepositTile::new, RELAY_DEPOSIT); + public static BlockRegistryWrapper RELAY_WARP = registerBlockAndItem(LibBlockNames.RELAY_WARP, RelayWarpBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { return GenericRenderer.getISTER("source_warp"); } }); - public static RegistryWrapper> RELAY_WARP_TILE = registerTile(LibBlockNames.RELAY_WARP, RelayWarpTile::new, RELAY_WARP); + public static BlockEntityTypeRegistryWrapper RELAY_WARP_TILE = registerTile(LibBlockNames.RELAY_WARP, RelayWarpTile::new, RELAY_WARP); - public static RegistryWrapper BASIC_SPELL_TURRET = registerBlockAndItem(LibBlockNames.BASIC_SPELL_TURRET, BasicSpellTurret::new, (reg) ->new RendererBlockItem(reg, defaultItemProperties()) { + public static BlockRegistryWrapper BASIC_SPELL_TURRET = registerBlockAndItem(LibBlockNames.BASIC_SPELL_TURRET, BasicSpellTurret::new, (reg) ->new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { return BasicTurretRenderer::getISTER; } }); - public static RegistryWrapper> BASIC_SPELL_TURRET_TILE = registerTile(LibBlockNames.BASIC_SPELL_TURRET, BasicSpellTurretTile::new, BASIC_SPELL_TURRET); - public static RegistryWrapper TIMER_SPELL_TURRET = registerBlockAndItem(LibBlockNames.TIMER_SPELL_TURRET, TimerSpellTurret::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { + public static BlockEntityTypeRegistryWrapper BASIC_SPELL_TURRET_TILE = registerTile(LibBlockNames.BASIC_SPELL_TURRET, BasicSpellTurretTile::new, BASIC_SPELL_TURRET); + public static BlockRegistryWrapper TIMER_SPELL_TURRET = registerBlockAndItem(LibBlockNames.TIMER_SPELL_TURRET, TimerSpellTurret::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { return TimerTurretRenderer::getISTER; } }); - public static RegistryWrapper> TIMER_SPELL_TURRET_TILE = registerTile(LibBlockNames.TIMER_SPELL_TURRET, TimerSpellTurretTile::new, TIMER_SPELL_TURRET); - public static RegistryWrapper ARCHWOOD_CHEST = registerBlockAndItem(LibBlockNames.ARCHWOOD_CHEST, ArchwoodChest::new, (reg) -> new ArchwoodChest.Item(reg.get(), defaultItemProperties())); - public static RegistryWrapper> ARCHWOOD_CHEST_TILE = registerTile(LibBlockNames.ARCHWOOD_CHEST, ArchwoodChestTile::new, ARCHWOOD_CHEST); - public static RegistryWrapper SPELL_PRISM = registerBlockAndItem(LibBlockNames.SPELL_PRISM, SpellPrismBlock::new); - public static RegistryWrapper WHIRLISPRIG_FLOWER = registerBlockAndItem(LibBlockNames.WHIRLISPRIG_BLOCK, WhirlisprigFlower::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { + public static BlockEntityTypeRegistryWrapper TIMER_SPELL_TURRET_TILE = registerTile(LibBlockNames.TIMER_SPELL_TURRET, TimerSpellTurretTile::new, TIMER_SPELL_TURRET); + public static BlockRegistryWrapper ARCHWOOD_CHEST = registerBlockAndItem(LibBlockNames.ARCHWOOD_CHEST, ArchwoodChest::new, (reg) -> new ArchwoodChest.Item(reg.get(), defaultItemProperties())); + public static BlockEntityTypeRegistryWrapper ARCHWOOD_CHEST_TILE = registerTile(LibBlockNames.ARCHWOOD_CHEST, ArchwoodChestTile::new, ARCHWOOD_CHEST); + public static BlockRegistryWrapper SPELL_PRISM = registerBlockAndItem(LibBlockNames.SPELL_PRISM, SpellPrismBlock::new); + public static BlockRegistryWrapper WHIRLISPRIG_FLOWER = registerBlockAndItem(LibBlockNames.WHIRLISPRIG_BLOCK, WhirlisprigFlower::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { return WhirlisprigFlowerRenderer::getISTER; } }); - public static RegistryWrapper> WHIRLISPRIG_TILE = registerTile(LibBlockNames.WHIRLISPRIG_BLOCK, WhirlisprigTile::new, WHIRLISPRIG_FLOWER); - public static RegistryWrapper RELAY_COLLECTOR = registerBlockAndItem(LibBlockNames.RELAY_COLLECTOR, RelayCollectorBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { + public static BlockEntityTypeRegistryWrapper WHIRLISPRIG_TILE = registerTile(LibBlockNames.WHIRLISPRIG_BLOCK, WhirlisprigTile::new, WHIRLISPRIG_FLOWER); + public static BlockRegistryWrapper RELAY_COLLECTOR = registerBlockAndItem(LibBlockNames.RELAY_COLLECTOR, RelayCollectorBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { return GenericRenderer.getISTER("source_collector"); } }); - public static RegistryWrapper> RELAY_COLLECTOR_TILE = registerTile(LibBlockNames.RELAY_COLLECTOR, RelayCollectorTile::new, RELAY_COLLECTOR); + public static BlockEntityTypeRegistryWrapper RELAY_COLLECTOR_TILE = registerTile(LibBlockNames.RELAY_COLLECTOR, RelayCollectorTile::new, RELAY_COLLECTOR); - public static RegistryWrapper RED_SBED = registerBlockAndItem(LibBlockNames.RED_SBED, SummonBed::new); - public static RegistryWrapper BLUE_SBED = registerBlockAndItem(LibBlockNames.BLUE_SBED, SummonBed::new); - public static RegistryWrapper GREEN_SBED = registerBlockAndItem(LibBlockNames.GREEN_SBED, SummonBed::new); - public static RegistryWrapper ORANGE_SBED = registerBlockAndItem(LibBlockNames.ORANGE_SBED, SummonBed::new); - public static RegistryWrapper YELLOW_SBED = registerBlockAndItem(LibBlockNames.YELLOW_SBED, SummonBed::new); - public static RegistryWrapper PURPLE_SBED = registerBlockAndItem(LibBlockNames.PURPLE_SBED, SummonBed::new); + public static BlockRegistryWrapper RED_SBED = registerBlockAndItem(LibBlockNames.RED_SBED, SummonBed::new); + public static BlockRegistryWrapper BLUE_SBED = registerBlockAndItem(LibBlockNames.BLUE_SBED, SummonBed::new); + public static BlockRegistryWrapper GREEN_SBED = registerBlockAndItem(LibBlockNames.GREEN_SBED, SummonBed::new); + public static BlockRegistryWrapper ORANGE_SBED = registerBlockAndItem(LibBlockNames.ORANGE_SBED, SummonBed::new); + public static BlockRegistryWrapper YELLOW_SBED = registerBlockAndItem(LibBlockNames.YELLOW_SBED, SummonBed::new); + public static BlockRegistryWrapper PURPLE_SBED = registerBlockAndItem(LibBlockNames.PURPLE_SBED, SummonBed::new); - public static RegistryWrapper SCRYERS_OCULUS = registerBlockAndItem(LibBlockNames.SCRYERS_OCULUS, ScryersOculus::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { + public static BlockRegistryWrapper SCRYERS_OCULUS = registerBlockAndItem(LibBlockNames.SCRYERS_OCULUS, ScryersOculus::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { return ScryerOculusRenderer::getISTER; } }.withTooltip(Component.translatable("ars_nouveau.tooltip.scryers_oculus").withStyle(Style.EMPTY.withColor(ChatFormatting.DARK_PURPLE)))); - public static RegistryWrapper> SCRYERS_OCULUS_TILE = registerTile(LibBlockNames.SCRYERS_OCULUS, ScryersOculusTile::new, SCRYERS_OCULUS); - public static RegistryWrapper SCRYERS_CRYSTAL = registerBlockAndItem(LibBlockNames.SCRYERS_CRYSTAL, ScryerCrystal::new); - public static RegistryWrapper> SCRYER_CRYSTAL_TILE = registerTile(LibBlockNames.SCRYERS_CRYSTAL, ScryerCrystalTile::new, SCRYERS_CRYSTAL); - public static RegistryWrapper MENDOSTEEN_POD = registerBlockAndItem(LibBlockNames.MENDOSTEEN_POD, () -> new ArchfruitPod(BlockTagProvider.FLOURISHING_LOGS), (reg) -> new ItemNameBlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.MENDOSTEEN_FOOD))); - public static RegistryWrapper BASTION_POD = registerBlockAndItem(LibBlockNames.BASTION_POD, () -> new ArchfruitPod(BlockTagProvider.VEXING_LOGS), (reg) -> new ItemNameBlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.BASTION_FOOD))); - public static RegistryWrapper FROSTAYA_POD = registerBlockAndItem(LibBlockNames.FROSTAYA_POD, () -> new ArchfruitPod(BlockTagProvider.CASCADING_LOGS), (reg) -> new ItemNameBlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.FROSTAYA_FOOD))); - public static RegistryWrapper BOMBEGRANTE_POD = registerBlockAndItem(LibBlockNames.BOMBEGRANATE_POD, () -> new ArchfruitPod(BlockTagProvider.BLAZING_LOGS), (reg) -> new ItemNameBlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.BLASTING_FOOD))); - public static RegistryWrapper POTION_DIFFUSER = registerBlockAndItem(LibBlockNames.POTION_DIFFUSER, PotionDiffuserBlock::new); - public static RegistryWrapper> POTION_DIFFUSER_TILE = registerTile(LibBlockNames.POTION_DIFFUSER, PotionDiffuserTile::new, POTION_DIFFUSER); - public static RegistryWrapper ALTERATION_TABLE = registerBlockAndItem(LibBlockNames.ALTERATION_TABLE, AlterationTable::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { + + public static BlockEntityTypeRegistryWrapper SCRYERS_OCULUS_TILE = registerTile(LibBlockNames.SCRYERS_OCULUS, ScryersOculusTile::new, SCRYERS_OCULUS); + public static BlockRegistryWrapper SCRYERS_CRYSTAL = registerBlockAndItem(LibBlockNames.SCRYERS_CRYSTAL, ScryerCrystal::new); + public static BlockEntityTypeRegistryWrapper SCRYER_CRYSTAL_TILE = registerTile(LibBlockNames.SCRYERS_CRYSTAL, ScryerCrystalTile::new, SCRYERS_CRYSTAL); + public static BlockRegistryWrapper MENDOSTEEN_POD = registerBlockAndItem(LibBlockNames.MENDOSTEEN_POD, () -> new ArchfruitPod(() -> FLOURISHING_LOG.get()), (reg) -> new ItemNameBlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.MENDOSTEEN_FOOD))); + public static BlockRegistryWrapper BASTION_POD = registerBlockAndItem(LibBlockNames.BASTION_POD, () -> new ArchfruitPod(() -> VEXING_LOG.get()), (reg) -> new ItemNameBlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.BASTION_FOOD))); + public static BlockRegistryWrapper FROSTAYA_POD = registerBlockAndItem(LibBlockNames.FROSTAYA_POD, () -> new ArchfruitPod(() -> CASCADING_LOG.get()), (reg) -> new ItemNameBlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.FROSTAYA_FOOD))); + public static BlockRegistryWrapper BOMBEGRANTE_POD = registerBlockAndItem(LibBlockNames.BOMBEGRANATE_POD, () -> new ArchfruitPod(() -> BLAZING_LOG.get()), (reg) -> new ItemNameBlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.BLASTING_FOOD))); + public static BlockRegistryWrapper POTION_DIFFUSER = registerBlockAndItem(LibBlockNames.POTION_DIFFUSER, PotionDiffuserBlock::new); + public static BlockEntityTypeRegistryWrapper POTION_DIFFUSER_TILE = registerTile(LibBlockNames.POTION_DIFFUSER, PotionDiffuserTile::new, POTION_DIFFUSER); + public static BlockRegistryWrapper ALTERATION_TABLE = registerBlockAndItem(LibBlockNames.ALTERATION_TABLE, AlterationTable::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { return AlterationTableRenderer::getISTER; } }); - public static RegistryWrapper> ARMOR_TILE = registerTile(LibBlockNames.ALTERATION_TABLE, AlterationTile::new, ALTERATION_TABLE); - public static RegistryWrapper MOB_JAR = registerBlockAndItem(LibBlockNames.MOB_JAR, MobJar::new, (reg) -> new MobJarItem(reg.get(), defaultItemProperties())); - public static RegistryWrapper> MOB_JAR_TILE = registerTile(LibBlockNames.MOB_JAR, MobJarTile::new, MOB_JAR); - public static RegistryWrapper VOID_PRISM = registerBlockAndItem(LibBlockNames.VOID_PRISM, VoidPrism::new); - public static RegistryWrapper REPOSITORY = registerBlockAndItem(LibBlockNames.REPOSITORY, RepositoryBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { + public static BlockEntityTypeRegistryWrapper ARMOR_TILE = registerTile(LibBlockNames.ALTERATION_TABLE, AlterationTile::new, ALTERATION_TABLE); + public static BlockRegistryWrapper MOB_JAR = registerBlockAndItem(LibBlockNames.MOB_JAR, MobJar::new, (reg) -> new MobJarItem(reg.get(), defaultItemProperties())); + public static BlockEntityTypeRegistryWrapper MOB_JAR_TILE = registerTile(LibBlockNames.MOB_JAR, MobJarTile::new, MOB_JAR); + public static BlockRegistryWrapper VOID_PRISM = registerBlockAndItem(LibBlockNames.VOID_PRISM, VoidPrism::new); + public static BlockRegistryWrapper REPOSITORY = registerBlockAndItem(LibBlockNames.REPOSITORY, RepositoryBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { return RepositoryRenderer::getISTER; } }); - public static RegistryWrapper> REPOSITORY_TILE = registerTile(LibBlockNames.REPOSITORY, RepositoryTile::new, REPOSITORY); - public static RegistryWrapper FALSE_WEAVE = registerBlockAndItem(LibBlockNames.FALSE_WEAVE, FalseWeave::new); - public static RegistryWrapper> FALSE_WEAVE_TILE = registerTile(LibBlockNames.FALSE_WEAVE, FalseWeaveTile::new, FALSE_WEAVE); - public static RegistryWrapper MIRROR_WEAVE = registerBlockAndItem(LibBlockNames.MIRROR_WEAVE, MirrorWeave::new); - public static RegistryWrapper> MIRROR_WEAVE_TILE = registerTile(LibBlockNames.MIRROR_WEAVE, MirrorWeaveTile::new, MIRROR_WEAVE); - public static RegistryWrapper GHOST_WEAVE = registerBlockAndItem(LibBlockNames.GHOST_WEAVE, GhostWeave::new); - public static RegistryWrapper> GHOST_WEAVE_TILE = registerTile(LibBlockNames.GHOST_WEAVE, GhostWeaveTile::new, GHOST_WEAVE); - public static RegistryWrapper MAGEBLOOM_BLOCK = registerBlockAndItem(LibBlockNames.MAGEBLOOM_BLOCK, () -> new ModBlock(BlockBehaviour.Properties.of().strength(0.1F).sound(SoundType.WOOL))); - public static final RegistryWrapper ROTATING_TURRET = registerBlockAndItem(LibBlockNames.ROTATING_SPELL_TURRET, RotatingSpellTurret::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { + public static BlockEntityTypeRegistryWrapper REPOSITORY_TILE = registerTile(LibBlockNames.REPOSITORY, RepositoryTile::new, REPOSITORY); + public static BlockRegistryWrapper FALSE_WEAVE = registerBlockAndItem(LibBlockNames.FALSE_WEAVE, FalseWeave::new); + public static BlockEntityTypeRegistryWrapper FALSE_WEAVE_TILE = registerTile(LibBlockNames.FALSE_WEAVE, FalseWeaveTile::new, FALSE_WEAVE); + public static BlockRegistryWrapper MIRROR_WEAVE = registerBlockAndItem(LibBlockNames.MIRROR_WEAVE, MirrorWeave::new); + public static BlockEntityTypeRegistryWrapper MIRROR_WEAVE_TILE = registerTile(LibBlockNames.MIRROR_WEAVE, MirrorWeaveTile::new, MIRROR_WEAVE); + public static BlockRegistryWrapper GHOST_WEAVE = registerBlockAndItem(LibBlockNames.GHOST_WEAVE, GhostWeave::new); + public static BlockEntityTypeRegistryWrapper GHOST_WEAVE_TILE = registerTile(LibBlockNames.GHOST_WEAVE, GhostWeaveTile::new, GHOST_WEAVE); + public static BlockRegistryWrapper MAGEBLOOM_BLOCK = registerBlockAndItem(LibBlockNames.MAGEBLOOM_BLOCK, () -> new ModBlock(BlockBehaviour.Properties.of().strength(0.1F).sound(SoundType.WOOL))); + public static final BlockRegistryWrapper ROTATING_TURRET = registerBlockAndItem(LibBlockNames.ROTATING_SPELL_TURRET, RotatingSpellTurret::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { return BasicTurretRenderer::getISTER; } }.withTooltip(Component.translatable("ars_nouveau.turret.tooltip"))); - public static final RegistryWrapper> ROTATING_TURRET_TILE = registerTile(LibBlockNames.ROTATING_SPELL_TURRET, RotatingTurretTile::new, ROTATING_TURRET); - public static final RegistryWrapper ARCANE_PLATFORM = registerBlockAndItem(LibBlockNames.MINI_PEDESTAL, ArcanePlatform::new, (reg) -> new ModBlockItem(reg.get(), defaultItemProperties()).withTooltip(Component.translatable("ars_nouveau.arcane_platform.tooltip"))); - public static final RegistryWrapper MAGELIGHT_TORCH = registerBlockAndItem(LibBlockNames.MAGELIGHT_TORCH, MagelightTorch::new); - public static final RegistryWrapper BRAZIER_RELAY = registerBlockAndItem(LibBlockNames.BRAZIER_RELAY, BrazierRelay::new); + public static final BlockEntityTypeRegistryWrapper ROTATING_TURRET_TILE = registerTile(LibBlockNames.ROTATING_SPELL_TURRET, RotatingTurretTile::new, ROTATING_TURRET); + public static final BlockRegistryWrapper ARCANE_PLATFORM = registerBlockAndItem(LibBlockNames.MINI_PEDESTAL, ArcanePlatform::new, (reg) -> new ModBlockItem(reg.get(), defaultItemProperties()).withTooltip(Component.translatable("ars_nouveau.arcane_platform.tooltip"))); + public static final BlockRegistryWrapper MAGELIGHT_TORCH = registerBlockAndItem(LibBlockNames.MAGELIGHT_TORCH, MagelightTorch::new); + public static final BlockRegistryWrapper BRAZIER_RELAY = registerBlockAndItem(LibBlockNames.BRAZIER_RELAY, BrazierRelay::new); - public static final RegistryWrapper CRAFTING_LECTERN = registerBlockAndItem(LibBlockNames.STORAGE_LECTERN, CraftingLecternBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { + public static final BlockRegistryWrapper CRAFTING_LECTERN = registerBlockAndItem(LibBlockNames.STORAGE_LECTERN, CraftingLecternBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { return LecternRenderer::getISTER; } }); - public static final RegistryWrapper ARCANE_PEDESTAL = registerBlockAndItem(LibBlockNames.ARCANE_PEDESTAL, ArcanePedestal::new); + public static final BlockRegistryWrapper ARCANE_PEDESTAL = registerBlockAndItem(LibBlockNames.ARCANE_PEDESTAL, ArcanePedestal::new); - public static final RegistryWrapper> ARCANE_PEDESTAL_TILE = new RegistryWrapper<>(BLOCK_ENTITIES.register(LibBlockNames.ARCANE_PEDESTAL, () -> BlockEntityType.Builder.of(ArcanePedestalTile::new, ARCANE_PEDESTAL.get(), ARCANE_PLATFORM.get()).build(null))); - public static final RegistryWrapper> MAGELIGHT_TORCH_TILE = registerTile(LibBlockNames.MAGELIGHT_TORCH, MagelightTorchTile::new, MAGELIGHT_TORCH); + public static final BlockEntityTypeRegistryWrapper ARCANE_PEDESTAL_TILE = new BlockEntityTypeRegistryWrapper<>(BLOCK_ENTITIES.register(LibBlockNames.ARCANE_PEDESTAL, () -> BlockEntityType.Builder.of(ArcanePedestalTile::new, ARCANE_PEDESTAL.get(), ARCANE_PLATFORM.get()).build(null))); + public static final BlockEntityTypeRegistryWrapper MAGELIGHT_TORCH_TILE = registerTile(LibBlockNames.MAGELIGHT_TORCH, MagelightTorchTile::new, MAGELIGHT_TORCH); - public static final RegistryWrapper RITUAL_BLOCK = registerBlockAndItem(LibBlockNames.RITUAL_BRAZIER, RitualBrazierBlock::new); - public static final RegistryWrapper SKY_WEAVE = registerBlockAndItem(LibBlockNames.SKY_WEAVE, () -> new SkyWeave(Block.Properties.of().strength(0.1F).sound(SoundType.WOOL).noOcclusion())); - public static final RegistryWrapper TEMPORARY_BLOCK = registerBlock(LibBlockNames.TEMPORARY_BLOCK, () -> new TemporaryBlock(BlockBehaviour.Properties.of().strength(1.5F, 6.0F).sound(SoundType.STONE))); - public static final RegistryWrapper ITEM_DETECTOR = registerBlockAndItem(LibBlockNames.ITEM_DETECTOR, ItemDetector::new); - public static RegistryWrapper SPELL_SENSOR = registerBlockAndItem(LibBlockNames.SPELL_SENSOR, SpellSensor::new); - public static RegistryWrapper REDSTONE_RELAY = registerBlockAndItem(LibBlockNames.REDSTONE_RELAY, RedstoneRelay::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { + public static final BlockRegistryWrapper RITUAL_BLOCK = registerBlockAndItem(LibBlockNames.RITUAL_BRAZIER, RitualBrazierBlock::new); + public static final BlockRegistryWrapper SKY_WEAVE = registerBlockAndItem(LibBlockNames.SKY_WEAVE, () -> new SkyWeave(Block.Properties.of().strength(0.1F).sound(SoundType.WOOL).noOcclusion())); + public static final BlockRegistryWrapper TEMPORARY_BLOCK = registerBlock(LibBlockNames.TEMPORARY_BLOCK, () -> new TemporaryBlock(BlockBehaviour.Properties.of().strength(1.5F, 6.0F).sound(SoundType.STONE))); + public static final BlockRegistryWrapper ITEM_DETECTOR = registerBlockAndItem(LibBlockNames.ITEM_DETECTOR, ItemDetector::new); + public static BlockRegistryWrapper SPELL_SENSOR = registerBlockAndItem(LibBlockNames.SPELL_SENSOR, SpellSensor::new); + public static BlockRegistryWrapper REDSTONE_RELAY = registerBlockAndItem(LibBlockNames.REDSTONE_RELAY, RedstoneRelay::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { return RedstoneRelayRenderer::getISTER; } }); - public static final RegistryWrapper SOURCEBERRY_SACK = registerBlockAndItem(LibBlockNames.SOURCEBERRY_SACK, () -> new ModBlock(BlockBehaviour.Properties.of().strength(0.1F).sound(SoundType.WOOL))); + public static final BlockRegistryWrapper SOURCEBERRY_SACK = registerBlockAndItem(LibBlockNames.SOURCEBERRY_SACK, () -> new ModBlock(BlockBehaviour.Properties.of().strength(0.1F).sound(SoundType.WOOL))); - public static final RegistryWrapper> RITUAL_TILE = registerTile(LibBlockNames.RITUAL_BRAZIER, RitualBrazierTile::new, RITUAL_BLOCK); - public static final RegistryWrapper> BRAZIER_RELAY_TILE = registerTile(LibBlockNames.BRAZIER_RELAY, BrazierRelayTile::new, BRAZIER_RELAY); - public static final RegistryWrapper> SKYWEAVE_TILE = registerTile(LibBlockNames.SKY_WEAVE, SkyBlockTile::new, SKY_WEAVE); - public static final RegistryWrapper> TEMPORARY_TILE = registerTile(LibBlockNames.TEMPORARY_BLOCK, TemporaryTile::new, TEMPORARY_BLOCK); - public static final RegistryWrapper> CRAFTING_LECTERN_TILE = registerTile(LibBlockNames.STORAGE_LECTERN, CraftingLecternTile::new, CRAFTING_LECTERN); - public static final RegistryWrapper> ITEM_DETECTOR_TILE = registerTile(LibBlockNames.ITEM_DETECTOR, ItemDetectorTile::new, ITEM_DETECTOR); - public static final RegistryWrapper> SPELL_SENSOR_TILE = registerTile(LibBlockNames.SPELL_SENSOR, SpellSensorTile::new, SPELL_SENSOR); - public static final RegistryWrapper> REDSTONE_RELAY_TILE = registerTile(LibBlockNames.REDSTONE_RELAY, RedstoneRelayTile::new, REDSTONE_RELAY); + public static final BlockEntityTypeRegistryWrapper RITUAL_TILE = registerTile(LibBlockNames.RITUAL_BRAZIER, RitualBrazierTile::new, RITUAL_BLOCK); + public static final BlockEntityTypeRegistryWrapper BRAZIER_RELAY_TILE = registerTile(LibBlockNames.BRAZIER_RELAY, BrazierRelayTile::new, BRAZIER_RELAY); + public static final BlockEntityTypeRegistryWrapper SKYWEAVE_TILE = registerTile(LibBlockNames.SKY_WEAVE, SkyBlockTile::new, SKY_WEAVE); + public static final BlockEntityTypeRegistryWrapper TEMPORARY_TILE = registerTile(LibBlockNames.TEMPORARY_BLOCK, TemporaryTile::new, TEMPORARY_BLOCK); + public static final BlockEntityTypeRegistryWrapper CRAFTING_LECTERN_TILE = registerTile(LibBlockNames.STORAGE_LECTERN, CraftingLecternTile::new, CRAFTING_LECTERN); + public static final BlockEntityTypeRegistryWrapper ITEM_DETECTOR_TILE = registerTile(LibBlockNames.ITEM_DETECTOR, ItemDetectorTile::new, ITEM_DETECTOR); + public static final BlockEntityTypeRegistryWrapper SPELL_SENSOR_TILE = registerTile(LibBlockNames.SPELL_SENSOR, SpellSensorTile::new, SPELL_SENSOR); + public static final BlockEntityTypeRegistryWrapper REDSTONE_RELAY_TILE = registerTile(LibBlockNames.REDSTONE_RELAY, RedstoneRelayTile::new, REDSTONE_RELAY); - public static void onBlocksRegistry(final IForgeRegistry registry) { + public static void onBlocksRegistry() { for (String s : LibBlockNames.DECORATIVE_SOURCESTONE) { if (LibBlockNames.DIRECTIONAL_SOURCESTONE.contains(s)) { - registry.register(s, new DirectionalModBlock()); + BLOCKS.register(s, () -> new DirectionalModBlock()); } else { - registry.register(s, new ModBlock()); + BLOCKS.register(s, () -> new ModBlock()); } } for(String s : LibBlockNames.DECORATIVE_SLABS){ - registry.register(s, new SlabBlock(BlockBehaviour.Properties.of().strength(1.5F, 6.0F).sound(SoundType.STONE))); + BLOCKS.register(s, () -> new SlabBlock(BlockBehaviour.Properties.of().strength(1.5F, 6.0F).sound(SoundType.STONE))); } for(String s : LibBlockNames.DECORATIVE_SOURCESTONE){ - registry.register(s + "_stairs", new StairBlock(() -> ForgeRegistries.BLOCKS.getValue(new ResourceLocation(ArsNouveau.MODID, s)).defaultBlockState(), BlockBehaviour.Properties.of().strength(1.5F, 6.0F).sound(SoundType.STONE))); + BLOCKS.register(s + "_stairs", () -> new StairBlock(BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s)).defaultBlockState(), BlockBehaviour.Properties.of().strength(1.5F, 6.0F).sound(SoundType.STONE))); } - registry.register(LibBlockNames.Pot(LibBlockNames.MAGE_BLOOM), createPottedBlock(() -> MAGE_BLOOM_CROP.get())); - registry.register(LibBlockNames.Pot(LibBlockNames.BLAZING_SAPLING), createPottedBlock(() -> BLAZING_SAPLING.get())); - registry.register(LibBlockNames.Pot(LibBlockNames.CASCADING_SAPLING), createPottedBlock(() -> CASCADING_SAPLING.get())); - registry.register(LibBlockNames.Pot(LibBlockNames.FLOURISHING_SAPLING), createPottedBlock(() -> FLOURISHING_SAPLING.get())); - registry.register(LibBlockNames.Pot(LibBlockNames.VEXING_SAPLING), createPottedBlock(() -> VEXING_SAPLING.get())); + BLOCKS.register(LibBlockNames.Pot(LibBlockNames.MAGE_BLOOM), () -> createPottedBlock(() -> MAGE_BLOOM_CROP.get())); + BLOCKS.register(LibBlockNames.Pot(LibBlockNames.BLAZING_SAPLING), () -> createPottedBlock(() -> BLAZING_SAPLING.get())); + BLOCKS.register(LibBlockNames.Pot(LibBlockNames.CASCADING_SAPLING), () -> createPottedBlock(() -> CASCADING_SAPLING.get())); + BLOCKS.register(LibBlockNames.Pot(LibBlockNames.FLOURISHING_SAPLING), () -> createPottedBlock(() -> FLOURISHING_SAPLING.get())); + BLOCKS.register(LibBlockNames.Pot(LibBlockNames.VEXING_SAPLING), () -> createPottedBlock(() -> VEXING_SAPLING.get())); } @@ -371,17 +372,17 @@ public static MagicLeaves createLeavesBlock(MapColor color) { } - public static void onBlockItemsRegistry(IForgeRegistry registry) { + public static void onBlockItemsRegistry() { for (String s : LibBlockNames.DECORATIVE_SOURCESTONE) { - ITEMS.register(s, () -> getDefaultBlockItem(ForgeRegistries.BLOCKS.getValue(new ResourceLocation(ArsNouveau.MODID, s)))); + ITEMS.register(s, () -> getDefaultBlockItem(BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s)))); } for (String s : LibBlockNames.DECORATIVE_STAIRS) { - ITEMS.register(s, () -> getDefaultBlockItem(ForgeRegistries.BLOCKS.getValue(new ResourceLocation(ArsNouveau.MODID, s)))); + ITEMS.register(s, () -> getDefaultBlockItem(BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s)))); } for (String s : LibBlockNames.DECORATIVE_SLABS) { - ITEMS.register(s, () -> getDefaultBlockItem(ForgeRegistries.BLOCKS.getValue(new ResourceLocation(ArsNouveau.MODID, s)))); + ITEMS.register(s, () -> getDefaultBlockItem(BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s)))); } } @@ -399,21 +400,21 @@ private static boolean isntSolid(BlockState state, BlockGetter reader, BlockPos public static Block getBlock(String s) { - return ForgeRegistries.BLOCKS.getValue(new ResourceLocation(ArsNouveau.MODID, s)); + return BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s)); } - public static RegistryWrapper registerBlock(String name, Supplier blockSupp) { - return new RegistryWrapper<>(BLOCKS.register(name, blockSupp)); + public static BlockRegistryWrapper registerBlock(String name, Supplier blockSupp) { + return new BlockRegistryWrapper<>(BLOCKS.register(name, blockSupp)); } - public static RegistryWrapper registerBlockAndItem(String name, Supplier blockSupp) { - RegistryWrapper blockReg = new RegistryWrapper<>(BLOCKS.register(name, blockSupp)); + public static BlockRegistryWrapper registerBlockAndItem(String name, Supplier blockSupp) { + BlockRegistryWrapper blockReg = new BlockRegistryWrapper<>(BLOCKS.register(name, blockSupp)); ITEMS.register(name, () -> getDefaultBlockItem(blockReg.get())); return blockReg; } - public static RegistryWrapper registerBlockAndItem(String name, Supplier blockSupp, Function, Item> blockItemFunc) { - RegistryWrapper blockReg = new RegistryWrapper<>(BLOCKS.register(name, blockSupp)); + public static BlockRegistryWrapper registerBlockAndItem(String name, Supplier blockSupp, Function, Item> blockItemFunc) { + BlockRegistryWrapper blockReg = new BlockRegistryWrapper<>(BLOCKS.register(name, blockSupp)); ITEMS.register(name, () -> blockItemFunc.apply(blockReg)); return blockReg; } @@ -422,11 +423,11 @@ public static RegistryWrapper registerBlockAndItem(String na public static FlowerPotBlock createPottedBlock(Supplier block) { FlowerPotBlock pot = new FlowerPotBlock(() -> (FlowerPotBlock)Blocks.FLOWER_POT, block, BlockBehaviour.Properties.of().instabreak().noOcclusion()); - flowerPots.put(() -> ForgeRegistries.BLOCKS.getKey(block.get()), pot); + flowerPots.put(() -> BuiltInRegistries.BLOCK.getKey(block.get()), pot); return pot; } - public static RegistryWrapper registerTile(String regName, BlockEntityType.BlockEntitySupplier tile, RegistryWrapper block){ - return new RegistryWrapper(BLOCK_ENTITIES.register(regName, () -> BlockEntityType.Builder.of(tile, block.get()).build(null))); + public static BlockEntityTypeRegistryWrapper registerTile(String regName, BlockEntityType.BlockEntitySupplier tile, BlockRegistryWrapper block){ + return new BlockEntityTypeRegistryWrapper<>(BLOCK_ENTITIES.register(regName, () -> BlockEntityType.Builder.of(tile, block.get()).build(null))); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java index afdc58178f..db198e7373 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java @@ -14,15 +14,15 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.CapabilityManager; -import net.minecraftforge.common.capabilities.CapabilityToken; -import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.event.AttachCapabilitiesEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.common.capabilities.Capability; +import net.neoforged.neoforge.common.capabilities.CapabilityManager; +import net.neoforged.neoforge.common.capabilities.CapabilityToken; +import net.neoforged.neoforge.common.capabilities.RegisterCapabilitiesEvent; +import net.neoforged.neoforge.common.util.LazyOptional; +import net.neoforged.neoforge.event.AttachCapabilitiesEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; public class CapabilityRegistry { @@ -63,7 +63,7 @@ public static LazyOptional getPlayerDataCap(final LivingEntity entit * Event handler for the {@link IManaCap} capability. */ @SuppressWarnings("unused") - @Mod.EventBusSubscriber(modid = ArsNouveau.MODID) + @EventBusSubscriber(modid = ArsNouveau.MODID) public static class EventHandler { /** diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CreativeTabRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CreativeTabRegistry.java index fd5c0a2425..2dc12b79f7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CreativeTabRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CreativeTabRegistry.java @@ -16,9 +16,8 @@ import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.CreativeModeTabs; import net.minecraft.world.item.Item; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.RegistryObject; - +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; import java.util.Comparator; import static com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry.ITEMS; @@ -31,11 +30,11 @@ public class CreativeTabRegistry { public static final DeferredRegister TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, ArsNouveau.MODID); - public static final RegistryObject BLOCKS = TABS.register("general", () -> CreativeModeTab.builder() + public static final DeferredHolder BLOCKS = TABS.register("general", () -> CreativeModeTab.builder() .title(Component.translatable("itemGroup.ars_nouveau")) .icon(() -> ItemsRegistry.CREATIVE_SPELLBOOK.get().getDefaultInstance()) .displayItems((params, output) -> { - for (RegistryObject entry : ITEMS.getEntries()) { + for (DeferredHolder entry : ITEMS.getEntries()) { if (!(entry.get() instanceof Glyph)) { output.accept(entry.get().getDefaultInstance()); } @@ -53,7 +52,7 @@ public class CreativeTabRegistry { }).withTabsBefore(CreativeModeTabs.SPAWN_EGGS) .build()); - public static final RegistryObject GLYPHS = TABS.register("glyphs", () -> CreativeModeTab.builder() + public static final DeferredHolder GLYPHS = TABS.register("glyphs", () -> CreativeModeTab.builder() .title(Component.translatable("itemGroup.ars_glyphs")) .icon(() -> MethodProjectile.INSTANCE.glyphItem.getDefaultInstance()) .displayItems((params, output) -> { diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataSerializers.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataSerializers.java index 054a54c93d..95e7568e4c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataSerializers.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataSerializers.java @@ -1,18 +1,25 @@ package com.hollingsworth.arsnouveau.setup.registry; import com.hollingsworth.arsnouveau.ArsNouveau; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.syncher.EntityDataSerializer; import net.minecraft.world.phys.Vec3; -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; +import net.neoforged.neoforge.registries.NeoForgeRegistries; public class DataSerializers { - public static final DeferredRegister> DS = DeferredRegister.create(ForgeRegistries.Keys.ENTITY_DATA_SERIALIZERS, ArsNouveau.MODID); - public static final RegistryObject> VEC = DS.register("vec3", () -> EntityDataSerializer.simple((buffer, vec) -> { - buffer.writeDouble(vec.x); - buffer.writeDouble(vec.y); - buffer.writeDouble(vec.z); - }, buffer -> new Vec3(buffer.readDouble(), buffer.readDouble(), buffer.readDouble()))); - + public static final DeferredRegister> DS = DeferredRegister.create(NeoForgeRegistries.ENTITY_DATA_SERIALIZERS, ArsNouveau.MODID); + public static final DeferredHolder, EntityDataSerializer> VEC = DS.register("vec3", + () -> EntityDataSerializer.forValueType( + StreamCodec.of( + (pBuffer, pValue) -> { + pBuffer.writeDouble(pValue.x); + pBuffer.writeDouble(pValue.y); + pBuffer.writeDouble(pValue.z); + }, + pBuffer -> new Vec3(pBuffer.readDouble(), pBuffer.readDouble(), pBuffer.readDouble()) + ) + ) + ); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/EnchantmentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/EnchantmentRegistry.java index 05c501f15d..f528b7c851 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/EnchantmentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/EnchantmentRegistry.java @@ -3,18 +3,18 @@ import com.hollingsworth.arsnouveau.common.enchantment.ManaBoost; import com.hollingsworth.arsnouveau.common.enchantment.ManaRegenEnchantment; import com.hollingsworth.arsnouveau.common.enchantment.ReactiveEnchantment; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.item.enchantment.Enchantment; -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; import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; public class EnchantmentRegistry { - public static final DeferredRegister ENCHANTMENTS = DeferredRegister.create(ForgeRegistries.ENCHANTMENTS, MODID); - public static RegistryObject MANA_REGEN_ENCHANTMENT = ENCHANTMENTS.register("mana_regen", ManaRegenEnchantment::new); - public static RegistryObject MANA_BOOST_ENCHANTMENT = ENCHANTMENTS.register("mana_boost", ManaBoost::new); - public static RegistryObject REACTIVE_ENCHANTMENT = ENCHANTMENTS.register("reactive", ReactiveEnchantment::new); + public static final DeferredRegister ENCHANTMENTS = DeferredRegister.create(BuiltInRegistries.ENCHANTMENT, MODID); + public static DeferredHolder MANA_REGEN_ENCHANTMENT = ENCHANTMENTS.register("mana_regen", ManaRegenEnchantment::new); + public static DeferredHolder MANA_BOOST_ENCHANTMENT = ENCHANTMENTS.register("mana_boost", ManaBoost::new); + public static DeferredHolder REACTIVE_ENCHANTMENT = ENCHANTMENTS.register("reactive", ReactiveEnchantment::new); } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java index 6a26aa5e9e..ef3c366201 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java @@ -21,19 +21,18 @@ import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentPierce; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentSplit; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.ItemRegistryWrapper; import com.hollingsworth.arsnouveau.setup.config.Config; import net.minecraft.ChatFormatting; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.*; -import net.minecraftforge.common.ForgeSpawnEggItem; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.IForgeRegistry; +import net.neoforged.neoforge.common.DeferredSpawnEggItem; +import net.neoforged.neoforge.registries.DeferredRegister; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -41,90 +40,89 @@ import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; - public class ItemsRegistry { public static PerkItem BLANK_THREAD; - public static FoodProperties SOURCE_BERRY_FOOD = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).effect(() -> new MobEffectInstance(ModPotions.MANA_REGEN_EFFECT.get(), 100), 1.0f).alwaysEat().build(); - public static FoodProperties SOURCE_PIE_FOOD = new FoodProperties.Builder().nutrition(9).saturationMod(0.9F).effect(() -> new MobEffectInstance(ModPotions.MANA_REGEN_EFFECT.get(), 60 * 20, 1), 1.0f).alwaysEat().build(); - public static FoodProperties SOURCE_ROLL_FOOD = new FoodProperties.Builder().nutrition(8).saturationMod(0.6F).effect(() -> new MobEffectInstance(ModPotions.MANA_REGEN_EFFECT.get(), 60 * 20), 1.0f).alwaysEat().build(); - public static FoodProperties MENDOSTEEN_FOOD = new FoodProperties.Builder().nutrition(4).saturationMod(0.6F).effect(() -> - new MobEffectInstance(ModPotions.RECOVERY_EFFECT.get(), 60 * 20), 1.0f).alwaysEat().build(); - public static FoodProperties BLASTING_FOOD = new FoodProperties.Builder().nutrition(4).saturationMod(0.6F) - .effect(() -> new MobEffectInstance(ModPotions.BLAST_EFFECT.get(), 10 * 20), 1.0f).alwaysEat().build(); - public static FoodProperties BASTION_FOOD = new FoodProperties.Builder().nutrition(4).saturationMod(0.6F) - .effect(() -> new MobEffectInstance(ModPotions.DEFENCE_EFFECT.get(), 60 * 20), 1.0f).alwaysEat().build(); - public static FoodProperties FROSTAYA_FOOD = new FoodProperties.Builder().nutrition(4).saturationMod(0.6F) - .effect(() -> new MobEffectInstance(ModPotions.FREEZING_EFFECT.get(), 30 * 20), 1.0f).alwaysEat().build(); + public static FoodProperties SOURCE_BERRY_FOOD = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).effect(() -> new MobEffectInstance(ModPotions.MANA_REGEN_EFFECT, 100), 1.0f).alwaysEdible().build(); + public static FoodProperties SOURCE_PIE_FOOD = new FoodProperties.Builder().nutrition(9).saturationModifier(0.9F).effect(() -> new MobEffectInstance(ModPotions.MANA_REGEN_EFFECT, 60 * 20, 1), 1.0f).alwaysEdible().build(); + public static FoodProperties SOURCE_ROLL_FOOD = new FoodProperties.Builder().nutrition(8).saturationModifier(0.6F).effect(() -> new MobEffectInstance(ModPotions.MANA_REGEN_EFFECT, 60 * 20), 1.0f).alwaysEdible().build(); + public static FoodProperties MENDOSTEEN_FOOD = new FoodProperties.Builder().nutrition(4).saturationModifier(0.6F).effect(() -> + new MobEffectInstance(ModPotions.RECOVERY_EFFECT, 60 * 20), 1.0f).alwaysEdible().build(); + public static FoodProperties BLASTING_FOOD = new FoodProperties.Builder().nutrition(4).saturationModifier(0.6F) + .effect(() -> new MobEffectInstance(ModPotions.BLAST_EFFECT, 10 * 20), 1.0f).alwaysEdible().build(); + public static FoodProperties BASTION_FOOD = new FoodProperties.Builder().nutrition(4).saturationModifier(0.6F) + .effect(() -> new MobEffectInstance(ModPotions.DEFENCE_EFFECT, 60 * 20), 1.0f).alwaysEdible().build(); + public static FoodProperties FROSTAYA_FOOD = new FoodProperties.Builder().nutrition(4).saturationModifier(0.6F) + .effect(() -> new MobEffectInstance(ModPotions.FREEZING_EFFECT, 30 * 20), 1.0f).alwaysEdible().build(); - public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID); - public static final RegistryWrapper RUNIC_CHALK = register(LibItemNames.RUNIC_CHALK, RunicChalk::new); + public static final DeferredRegister ITEMS = DeferredRegister.create(BuiltInRegistries.ITEM, MODID); + public static final ItemRegistryWrapper RUNIC_CHALK = register(LibItemNames.RUNIC_CHALK, RunicChalk::new); - public static final RegistryWrapper NOVICE_SPELLBOOK = register(LibItemNames.NOVICE_SPELL_BOOK, () -> new SpellBook(SpellTier.ONE)); - public static final RegistryWrapper APPRENTICE_SPELLBOOK = register(LibItemNames.APPRENTICE_SPELL_BOOK, () -> new SpellBook(SpellTier.TWO)); - public static final RegistryWrapper ARCHMAGE_SPELLBOOK = register(LibItemNames.ARCHMAGE_SPELL_BOOK, () -> new SpellBook(SpellTier.THREE)); - public static final RegistryWrapper CREATIVE_SPELLBOOK = register(LibItemNames.CREATIVE_SPELL_BOOK, () -> new SpellBook(SpellTier.CREATIVE)); - public static final RegistryWrapper BLANK_GLYPH = register(LibItemNames.BLANK_GLYPH); - public static final RegistryWrapper MAGE_BLOOM = register(LibItemNames.MAGE_BLOOM, () -> new ModItem().withTooltip(Component.translatable("ars_nouveau.tooltip.magebloom"))); - public static final RegistryWrapper MAGE_FIBER = register(LibItemNames.MAGE_FIBER); - public static final RegistryWrapper MUNDANE_BELT = register(LibItemNames.MUNDANE_BELT, () -> new ModItem().withTooltip(Component.translatable("ars_nouveau.tooltip.dull"))); - public static final RegistryWrapper JAR_OF_LIGHT = register(LibItemNames.JAR_OF_LIGHT, JarOfLight::new); - public static final RegistryWrapper BELT_OF_LEVITATION = register(LibItemNames.BELT_OF_LEVITATION, BeltOfLevitation::new); - public static final RegistryWrapper WORN_NOTEBOOK = register(LibItemNames.WORN_NOTEBOOK, WornNotebook::new); - public static final RegistryWrapper RING_OF_POTENTIAL = register(LibItemNames.RING_OF_POTENTIAL, () -> new ModItem().withTooltip(Component.translatable("ars_nouveau.tooltip.dull"))); - public static final RegistryWrapper RING_OF_LESSER_DISCOUNT = register(LibItemNames.RING_OF_LESSER_DISCOUNT, () -> new DiscountRing() { + public static final ItemRegistryWrapper NOVICE_SPELLBOOK = register(LibItemNames.NOVICE_SPELL_BOOK, () -> new SpellBook(SpellTier.ONE)); + public static final ItemRegistryWrapper APPRENTICE_SPELLBOOK = register(LibItemNames.APPRENTICE_SPELL_BOOK, () -> new SpellBook(SpellTier.TWO)); + public static final ItemRegistryWrapper ARCHMAGE_SPELLBOOK = register(LibItemNames.ARCHMAGE_SPELL_BOOK, () -> new SpellBook(SpellTier.THREE)); + public static final ItemRegistryWrapper CREATIVE_SPELLBOOK = register(LibItemNames.CREATIVE_SPELL_BOOK, () -> new SpellBook(SpellTier.CREATIVE)); + public static final ItemRegistryWrapper BLANK_GLYPH = register(LibItemNames.BLANK_GLYPH); + public static final ItemRegistryWrapper MAGE_BLOOM = register(LibItemNames.MAGE_BLOOM, () -> new ModItem().withTooltip(Component.translatable("ars_nouveau.tooltip.magebloom"))); + public static final ItemRegistryWrapper MAGE_FIBER = register(LibItemNames.MAGE_FIBER); + public static final ItemRegistryWrapper MUNDANE_BELT = register(LibItemNames.MUNDANE_BELT, () -> new ModItem().withTooltip(Component.translatable("ars_nouveau.tooltip.dull"))); + public static final ItemRegistryWrapper JAR_OF_LIGHT = register(LibItemNames.JAR_OF_LIGHT, JarOfLight::new); + public static final ItemRegistryWrapper BELT_OF_LEVITATION = register(LibItemNames.BELT_OF_LEVITATION, BeltOfLevitation::new); + public static final ItemRegistryWrapper WORN_NOTEBOOK = register(LibItemNames.WORN_NOTEBOOK, WornNotebook::new); + public static final ItemRegistryWrapper RING_OF_POTENTIAL = register(LibItemNames.RING_OF_POTENTIAL, () -> new ModItem().withTooltip(Component.translatable("ars_nouveau.tooltip.dull"))); + public static final ItemRegistryWrapper RING_OF_LESSER_DISCOUNT = register(LibItemNames.RING_OF_LESSER_DISCOUNT, () -> new DiscountRing() { @Override public int getManaDiscount() { return 10; } }); - public static final RegistryWrapper RING_OF_GREATER_DISCOUNT = register(LibItemNames.RING_OF_GREATER_DISCOUNT, () -> new DiscountRing() { + public static final ItemRegistryWrapper RING_OF_GREATER_DISCOUNT = register(LibItemNames.RING_OF_GREATER_DISCOUNT, () -> new DiscountRing() { @Override public int getManaDiscount() { return 20; } }); - public static final RegistryWrapper BELT_OF_UNSTABLE_GIFTS = register(LibItemNames.BELT_OF_UNSTABLE_GIFTS, BeltOfUnstableGifts::new); - public static final RegistryWrapper WARP_SCROLL = register(LibItemNames.WARP_SCROLL, WarpScroll::new); - public static final RegistryWrapper SPELL_PARCHMENT = register(LibItemNames.SPELL_PARCHMENT, SpellParchment::new); - public static final RegistryWrapper BOOKWYRM_CHARM = register(LibItemNames.BOOKWYRM_CHARM, BookwyrmCharm::new); - public static final RegistryWrapper DOMINION_ROD = register(LibItemNames.DOMINION_WAND, DominionWand::new); - public static final RegistryWrapper AMULET_OF_MANA_BOOST = register(LibItemNames.AMULET_OF_MANA_BOOST, () -> new AbstractManaCurio() { + public static final ItemRegistryWrapper BELT_OF_UNSTABLE_GIFTS = register(LibItemNames.BELT_OF_UNSTABLE_GIFTS, BeltOfUnstableGifts::new); + public static final ItemRegistryWrapper WARP_SCROLL = register(LibItemNames.WARP_SCROLL, WarpScroll::new); + public static final ItemRegistryWrapper SPELL_PARCHMENT = register(LibItemNames.SPELL_PARCHMENT, SpellParchment::new); + public static final ItemRegistryWrapper BOOKWYRM_CHARM = register(LibItemNames.BOOKWYRM_CHARM, BookwyrmCharm::new); + public static final ItemRegistryWrapper DOMINION_ROD = register(LibItemNames.DOMINION_WAND, DominionWand::new); + public static final ItemRegistryWrapper AMULET_OF_MANA_BOOST = register(LibItemNames.AMULET_OF_MANA_BOOST, () -> new AbstractManaCurio() { @Override public int getMaxManaBoost(ItemStack i) { return 50; } }); - public static final RegistryWrapper AMULET_OF_MANA_REGEN = register(LibItemNames.AMULET_OF_MANA_REGEN, () -> new AbstractManaCurio() { + public static final ItemRegistryWrapper AMULET_OF_MANA_REGEN = register(LibItemNames.AMULET_OF_MANA_REGEN, () -> new AbstractManaCurio() { @Override public int getManaRegenBonus(ItemStack i) { return 3; } }); - public static final RegistryWrapper DULL_TRINKET = register(LibItemNames.DULL_TRINKET, () -> new ModItem().withTooltip(Component.translatable("ars_nouveau.tooltip.dull"))); - public static final RegistryWrapper STARBUNCLE_CHARM = register(LibItemNames.STARBUNCLE_CHARM, StarbuncleCharm::new); - public static final RegistryWrapper debug = register("debug", Debug::new); - public static final RegistryWrapper STARBUNCLE_SHARD = register(LibItemNames.STARBUNCLE_SHARDS, StarbuncleShard::new); - public static final RegistryWrapper STARBUNCLE_SHADES = register(LibItemNames.STARBUNCLE_SHADES, StarbuncleShades::new); - public static final RegistryWrapper WHIRLISPRIG_CHARM = register(LibItemNames.WHIRLISPRIG_CHARM, WhirlisprigCharm::new); - public static final RegistryWrapper WHIRLISPRIG_SHARDS = register(LibItemNames.WHIRLISPRIG_SHARDS, () -> new ModItem().withTooltip(Component.translatable("tooltip.whirlisprig_shard"))); - public static final RegistryWrapper SOURCE_GEM = register(LibItemNames.SOURCE_GEM, () -> new ModItem().withTooltip(Component.translatable("tooltip.source_gem"))); - public static final RegistryWrapper ALLOW_ITEM_SCROLL = register(LibItemNames.ALLOW_ITEM_SCROLL, AllowItemScroll::new); - public static final RegistryWrapper DENY_ITEM_SCROLL = register(LibItemNames.DENY_ITEM_SCROLL, DenyItemScroll::new); - public static final RegistryWrapper MIMIC_ITEM_SCROLL = register(LibItemNames.MIMIC_ITEM_SCROLL, MimicItemScroll::new); - public static final RegistryWrapper BLANK_PARCHMENT = register(LibItemNames.BLANK_PARCHMENT, BlankParchmentItem::new); - public static final RegistryWrapper WAND = register(LibItemNames.WAND, Wand::new); - public static final RegistryWrapper VOID_JAR = register(LibItemNames.VOID_JAR, VoidJar::new); - public static final RegistryWrapper WIXIE_CHARM = register(LibItemNames.WIXIE_CHARM, WixieCharm::new); - public static final RegistryWrapper WIXIE_SHARD = register(LibItemNames.WIXIE_SHARD, () -> new ModItem().withTooltip(Component.translatable("tooltip.wixie_shard"))); - public static final RegistryWrapper SPELL_BOW = register(LibItemNames.SPELL_BOW, SpellBow::new); - public static final RegistryWrapper AMPLIFY_ARROW = register(LibItemNames.AMPLIFY_ARROW, () -> new SpellArrow(AugmentAmplify.INSTANCE, 2)); - public static final RegistryWrapper SPLIT_ARROW = register(LibItemNames.SPLIT_ARROW, () -> new FormSpellArrow(AugmentSplit.INSTANCE, 2)); - public static final RegistryWrapper PIERCE_ARROW = register(LibItemNames.PIERCE_ARROW, () -> new FormSpellArrow(AugmentPierce.INSTANCE, 2)); - public static final RegistryWrapper WILDEN_HORN = register(LibItemNames.WILDEN_HORN, () -> new ModItem().withTooltip(Component.translatable("tooltip.wilden_horn"))); - public static final RegistryWrapper WILDEN_SPIKE = register(LibItemNames.WILDEN_SPIKE, () -> new ModItem().withTooltip(Component.translatable("tooltip.wilden_spike"))); - public static final RegistryWrapper WILDEN_WING = register(LibItemNames.WILDEN_WING, () -> new ModItem().withTooltip(Component.translatable("tooltip.wilden_wing"))); - public static final RegistryWrapper POTION_FLASK = register(LibItemNames.POTION_FLASK, () -> { + public static final ItemRegistryWrapper DULL_TRINKET = register(LibItemNames.DULL_TRINKET, () -> new ModItem().withTooltip(Component.translatable("ars_nouveau.tooltip.dull"))); + public static final ItemRegistryWrapper STARBUNCLE_CHARM = register(LibItemNames.STARBUNCLE_CHARM, StarbuncleCharm::new); + public static final ItemRegistryWrapper debug = register("debug", Debug::new); + public static final ItemRegistryWrapper STARBUNCLE_SHARD = register(LibItemNames.STARBUNCLE_SHARDS, StarbuncleShard::new); + public static final ItemRegistryWrapper STARBUNCLE_SHADES = register(LibItemNames.STARBUNCLE_SHADES, StarbuncleShades::new); + public static final ItemRegistryWrapper WHIRLISPRIG_CHARM = register(LibItemNames.WHIRLISPRIG_CHARM, WhirlisprigCharm::new); + public static final ItemRegistryWrapper WHIRLISPRIG_SHARDS = register(LibItemNames.WHIRLISPRIG_SHARDS, () -> new ModItem().withTooltip(Component.translatable("tooltip.whirlisprig_shard"))); + public static final ItemRegistryWrapper SOURCE_GEM = register(LibItemNames.SOURCE_GEM, () -> new ModItem().withTooltip(Component.translatable("tooltip.source_gem"))); + public static final ItemRegistryWrapper ALLOW_ITEM_SCROLL = register(LibItemNames.ALLOW_ITEM_SCROLL, AllowItemScroll::new); + public static final ItemRegistryWrapper DENY_ITEM_SCROLL = register(LibItemNames.DENY_ITEM_SCROLL, DenyItemScroll::new); + public static final ItemRegistryWrapper MIMIC_ITEM_SCROLL = register(LibItemNames.MIMIC_ITEM_SCROLL, MimicItemScroll::new); + public static final ItemRegistryWrapper BLANK_PARCHMENT = register(LibItemNames.BLANK_PARCHMENT, BlankParchmentItem::new); + public static final ItemRegistryWrapper WAND = register(LibItemNames.WAND, Wand::new); + public static final ItemRegistryWrapper VOID_JAR = register(LibItemNames.VOID_JAR, VoidJar::new); + public static final ItemRegistryWrapper WIXIE_CHARM = register(LibItemNames.WIXIE_CHARM, WixieCharm::new); + public static final ItemRegistryWrapper WIXIE_SHARD = register(LibItemNames.WIXIE_SHARD, () -> new ModItem().withTooltip(Component.translatable("tooltip.wixie_shard"))); + public static final ItemRegistryWrapper SPELL_BOW = register(LibItemNames.SPELL_BOW, SpellBow::new); + public static final ItemRegistryWrapper AMPLIFY_ARROW = register(LibItemNames.AMPLIFY_ARROW, () -> new SpellArrow(AugmentAmplify.INSTANCE, 2)); + public static final ItemRegistryWrapper SPLIT_ARROW = register(LibItemNames.SPLIT_ARROW, () -> new FormSpellArrow(AugmentSplit.INSTANCE, 2)); + public static final ItemRegistryWrapper PIERCE_ARROW = register(LibItemNames.PIERCE_ARROW, () -> new FormSpellArrow(AugmentPierce.INSTANCE, 2)); + public static final ItemRegistryWrapper WILDEN_HORN = register(LibItemNames.WILDEN_HORN, () -> new ModItem().withTooltip(Component.translatable("tooltip.wilden_horn"))); + public static final ItemRegistryWrapper WILDEN_SPIKE = register(LibItemNames.WILDEN_SPIKE, () -> new ModItem().withTooltip(Component.translatable("tooltip.wilden_spike"))); + public static final ItemRegistryWrapper WILDEN_WING = register(LibItemNames.WILDEN_WING, () -> new ModItem().withTooltip(Component.translatable("tooltip.wilden_wing"))); + public static final ItemRegistryWrapper POTION_FLASK = register(LibItemNames.POTION_FLASK, () -> { PotionFlask flask = new PotionFlask() { @NotNull @Override @@ -135,7 +133,7 @@ public MobEffectInstance getEffectInstance(MobEffectInstance effectInstance) { flask.withTooltip(Component.translatable("tooltip.potion_flask")); return flask; }); - public static RegistryWrapper POTION_FLASK_AMPLIFY = register(LibItemNames.POTION_FLASK_AMPLIFY, () -> { + public static ItemRegistryWrapper POTION_FLASK_AMPLIFY = register(LibItemNames.POTION_FLASK_AMPLIFY, () -> { PotionFlask flask = new PotionFlask() { @Override public @NotNull MobEffectInstance getEffectInstance(MobEffectInstance effectInstance) { @@ -145,7 +143,7 @@ public MobEffectInstance getEffectInstance(MobEffectInstance effectInstance) { flask.withTooltip(Component.translatable("tooltip.potion_flask_amplify")); return flask; }); - public static RegistryWrapper POTION_FLASK_EXTEND_TIME = register(LibItemNames.POTION_FLASK_EXTEND_TIME, () -> { + public static ItemRegistryWrapper POTION_FLASK_EXTEND_TIME = register(LibItemNames.POTION_FLASK_EXTEND_TIME, () -> { PotionFlask flask = new PotionFlask() { @Override public @NotNull MobEffectInstance getEffectInstance(MobEffectInstance effectInstance) { @@ -155,7 +153,7 @@ public MobEffectInstance getEffectInstance(MobEffectInstance effectInstance) { flask.withTooltip(Component.translatable("tooltip.potion_flask_extend_time")); return flask; }); - public static RegistryWrapper EXPERIENCE_GEM = register(LibItemNames.EXP_GEM, () ->{ + public static ItemRegistryWrapper EXPERIENCE_GEM = register(LibItemNames.EXP_GEM, () ->{ ExperienceGem gem = new ExperienceGem() { @Override public int getValue() { @@ -165,7 +163,7 @@ public int getValue() { gem.withTooltip(Component.translatable("ars_nouveau.tooltip.exp_gem")); return gem; }); - public static RegistryWrapper GREATER_EXPERIENCE_GEM = register(LibItemNames.GREATER_EXP_GEM, () ->{ + public static ItemRegistryWrapper GREATER_EXPERIENCE_GEM = register(LibItemNames.GREATER_EXP_GEM, () ->{ ExperienceGem gem = new ExperienceGem() { @Override public int getValue() { @@ -175,96 +173,96 @@ public int getValue() { gem.withTooltip(Component.translatable("ars_nouveau.tooltip.exp_gem")); return gem; }); - public static final RegistryWrapper ENCHANTERS_SWORD = register(LibItemNames.ENCHANTERS_SWORD, () -> new EnchantersSword(Tiers.NETHERITE, 3, -2.4F)); - public static final RegistryWrapper ENCHANTERS_SHIELD = register(LibItemNames.ENCHANTERS_SHIELD, EnchantersShield::new); - public static final RegistryWrapper CASTER_TOME = register(LibItemNames.CASTER_TOME, CasterTome::new); - public static final RegistryWrapper DRYGMY_CHARM = register(LibItemNames.DRYGMY_CHARM, DrygmyCharm::new); - public static final RegistryWrapper DRYGMY_SHARD = register(LibItemNames.DRYGMY_SHARD, () -> new ModItem().withTooltip(Component.translatable("tooltip.ars_nouveau.drygmy_shard"))); - public static final RegistryWrapper WILDEN_TRIBUTE = register(LibItemNames.WILDEN_TRIBUTE, () -> new ModItem(defaultItemProperties().fireResistant()).withTooltip(Component.translatable("tooltip.ars_nouveau.wilden_tribute").withStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.BLUE))).withRarity(Rarity.EPIC)); - public static final RegistryWrapper SUMMONING_FOCUS = register(LibItemNames.SUMMON_FOCUS, SummoningFocus::new); - public static final RegistryWrapper SHAPERS_FOCUS = register(LibItemNames.SHAPERS_FOCUS, () -> new ShapersFocus(defaultItemProperties().stacksTo(1))); - public static final RegistryWrapper SOURCE_BERRY_PIE = register(LibItemNames.SOURCE_BERRY_PIE, () -> new ModItem(defaultItemProperties().food(SOURCE_PIE_FOOD)).withTooltip(Component.translatable("tooltip.ars_nouveau.source_food"))); - public static final RegistryWrapper SOURCE_BERRY_ROLL = register(LibItemNames.SOURCE_BERRY_ROLL, () -> new ModItem(defaultItemProperties().food(SOURCE_ROLL_FOOD)).withTooltip(Component.translatable("tooltip.ars_nouveau.source_food"))); - public static final RegistryWrapper ENCHANTERS_MIRROR = register(LibItemNames.ENCHANTERS_MIRROR, () -> new EnchantersMirror(defaultItemProperties().stacksTo(1))); - public static final RegistryWrapper SORCERER_BOOTS = register(LibItemNames.SORCERER_BOOTS, () -> AnimatedMagicArmor.light(ArmorItem.Type.BOOTS)); - public static final RegistryWrapper SORCERER_LEGGINGS = register(LibItemNames.SORCERER_LEGGINGS, () -> AnimatedMagicArmor.light(ArmorItem.Type.LEGGINGS)); - public static final RegistryWrapper SORCERER_ROBES = register(LibItemNames.SORCERER_ROBES, () -> AnimatedMagicArmor.light(ArmorItem.Type.CHESTPLATE)); - public static final RegistryWrapper SORCERER_HOOD = register(LibItemNames.SORCERER_HOOD, () -> AnimatedMagicArmor.light(ArmorItem.Type.HELMET)); - public static final RegistryWrapper ARCANIST_BOOTS = register(LibItemNames.ARCANIST_BOOTS, () -> AnimatedMagicArmor.medium(ArmorItem.Type.BOOTS)); - public static final RegistryWrapper ARCANIST_LEGGINGS = register(LibItemNames.ARCANIST_LEGGINGS, () -> AnimatedMagicArmor.medium(ArmorItem.Type.LEGGINGS)); - public static final RegistryWrapper ARCANIST_ROBES = register(LibItemNames.ARCANIST_ROBES, () -> AnimatedMagicArmor.medium(ArmorItem.Type.CHESTPLATE)); - public static final RegistryWrapper ARCANIST_HOOD = register(LibItemNames.ARCANIST_HOOD, () -> AnimatedMagicArmor.medium(ArmorItem.Type.HELMET)); - public static final RegistryWrapper BATTLEMAGE_BOOTS = register(LibItemNames.BATTLEMAGE_BOOTS, () -> AnimatedMagicArmor.heavy(ArmorItem.Type.BOOTS)); - public static final RegistryWrapper BATTLEMAGE_LEGGINGS = register(LibItemNames.BATTLEMAGE_LEGGINGS, () -> AnimatedMagicArmor.heavy(ArmorItem.Type.LEGGINGS)); - public static final RegistryWrapper BATTLEMAGE_ROBES = register(LibItemNames.BATTLEMAGE_ROBES, () -> AnimatedMagicArmor.heavy(ArmorItem.Type.CHESTPLATE)); - public static final RegistryWrapper BATTLEMAGE_HOOD = register(LibItemNames.BATTLEMAGE_HOOD, () -> AnimatedMagicArmor.heavy(ArmorItem.Type.HELMET)); - public static final RegistryWrapper DOWSING_ROD = register(LibItemNames.DOWSING_ROD, DowsingRod::new); - public static final RegistryWrapper ABJURATION_ESSENCE = register(LibItemNames.ABJURATION_ESSENCE, () -> new ModItem().withTooltip(Component.translatable("tooltip.ars_nouveau.essences"))); - public static final RegistryWrapper CONJURATION_ESSENCE = register(LibItemNames.CONJURATION_ESSENCE, () -> new ModItem().withTooltip(Component.translatable("tooltip.ars_nouveau.essences"))); - public static final RegistryWrapper AIR_ESSENCE = register(LibItemNames.AIR_ESSENCE, () -> new ModItem().withTooltip(Component.translatable("tooltip.ars_nouveau.essences"))); - public static final RegistryWrapper EARTH_ESSENCE = register(LibItemNames.EARTH_ESSENCE, EarthEssence::new); - public static final RegistryWrapper FIRE_ESSENCE = register(LibItemNames.FIRE_ESSENCE, FireEssence::new); - public static final RegistryWrapper MANIPULATION_ESSENCE = register(LibItemNames.MANIPULATION_ESSENCE, ManipulationEssence::new); - public static final RegistryWrapper WATER_ESSENCE = register(LibItemNames.WATER_ESSENCE, () -> new ModItem().withTooltip(Component.translatable("tooltip.ars_nouveau.essences"))); - public static final RegistryWrapper AMETHYST_GOLEM_CHARM = register(LibItemNames.AMETHYST_GOLEM_CHARM, AmethystGolemCharm::new); - public static final RegistryWrapper ANNOTATED_CODEX = register(LibItemNames.ANNOTATED_CODEX, AnnotatedCodex::new); - public static final RegistryWrapper SCRYER_SCROLL = register(LibItemNames.SCRYER_SCROLL, ScryerScroll::new); - public static final RegistryWrapper WIXIE_HAT = register(LibItemNames.WIXIE_HAT, () -> new WixieHat().withTooltip("tooltip.ars_nouveau.wixie_hat")); - public static final RegistryWrapper ALCHEMISTS_CROWN = register(LibItemNames.ALCHEMISTS_CROWN, () -> new AlchemistsCrown(defaultItemProperties().stacksTo(1))); - public static final RegistryWrapper SPLASH_LAUNCHER = register(LibItemNames.SPLASH_LAUNCHER, () -> new FlaskCannon.SplashLauncher(defaultItemProperties().stacksTo(1))); - public static final RegistryWrapper LINGERING_LAUNCHER = register(LibItemNames.LINGERING_LAUNCHER, () -> new FlaskCannon.LingeringLauncher(defaultItemProperties().stacksTo(1))); - public static final RegistryWrapper FIREL_DISC = register(LibItemNames.FIREL_DISC, () -> new RecordItem(9, () -> SoundRegistry.ARIA_BIBLIO.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 240)); - public static final RegistryWrapper SOUND_OF_GLASS = register(LibItemNames.SOUND_OF_GLASS, () -> new RecordItem(9, () -> SoundRegistry.SOUND_OF_GLASS.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 182)); - public static final RegistryWrapper WILD_HUNT = register(LibItemNames.FIREL_WILD_HUNT, () -> new RecordItem(9, () -> SoundRegistry.WILD_HUNT.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 121)); - public static final RegistryWrapper STARBY_GIFY = register(LibItemNames.STARBY_GIFT, () -> new Present(defaultItemProperties().rarity(Rarity.EPIC))); - public static final RegistryWrapper SPELL_CROSSBOW = register(LibItemNames.SPELL_CROSSBOW, () -> new SpellCrossbow(defaultItemProperties().stacksTo(1))); - public static final RegistryWrapper STABLE_WARP_SCROLL = register(LibItemNames.STABLE_WARP_SCROLL, () -> new StableWarpScroll(defaultItemProperties().stacksTo(1))); - public static final RegistryWrapper SCRY_CASTER = register(LibItemNames.SCRY_CASTER, () -> new ScryCaster(defaultItemProperties().stacksTo(1))); - public static final RegistryWrapper JUMP_RING = register(LibItemNames.JUMP_RING, JumpingRing::new); + public static final ItemRegistryWrapper ENCHANTERS_SWORD = register(LibItemNames.ENCHANTERS_SWORD, () -> new EnchantersSword(Tiers.NETHERITE, 3, -2.4F)); + public static final ItemRegistryWrapper ENCHANTERS_SHIELD = register(LibItemNames.ENCHANTERS_SHIELD, EnchantersShield::new); + public static final ItemRegistryWrapper CASTER_TOME = register(LibItemNames.CASTER_TOME, CasterTome::new); + public static final ItemRegistryWrapper DRYGMY_CHARM = register(LibItemNames.DRYGMY_CHARM, DrygmyCharm::new); + public static final ItemRegistryWrapper DRYGMY_SHARD = register(LibItemNames.DRYGMY_SHARD, () -> new ModItem().withTooltip(Component.translatable("tooltip.ars_nouveau.drygmy_shard"))); + public static final ItemRegistryWrapper WILDEN_TRIBUTE = register(LibItemNames.WILDEN_TRIBUTE, () -> new ModItem(defaultItemProperties().fireResistant()).withTooltip(Component.translatable("tooltip.ars_nouveau.wilden_tribute").withStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.BLUE))).withRarity(Rarity.EPIC)); + public static final ItemRegistryWrapper SUMMONING_FOCUS = register(LibItemNames.SUMMON_FOCUS, SummoningFocus::new); + public static final ItemRegistryWrapper SHAPERS_FOCUS = register(LibItemNames.SHAPERS_FOCUS, () -> new ShapersFocus(defaultItemProperties().stacksTo(1))); + public static final ItemRegistryWrapper SOURCE_BERRY_PIE = register(LibItemNames.SOURCE_BERRY_PIE, () -> new ModItem(defaultItemProperties().food(SOURCE_PIE_FOOD)).withTooltip(Component.translatable("tooltip.ars_nouveau.source_food"))); + public static final ItemRegistryWrapper SOURCE_BERRY_ROLL = register(LibItemNames.SOURCE_BERRY_ROLL, () -> new ModItem(defaultItemProperties().food(SOURCE_ROLL_FOOD)).withTooltip(Component.translatable("tooltip.ars_nouveau.source_food"))); + public static final ItemRegistryWrapper ENCHANTERS_MIRROR = register(LibItemNames.ENCHANTERS_MIRROR, () -> new EnchantersMirror(defaultItemProperties().stacksTo(1))); + public static final ItemRegistryWrapper SORCERER_BOOTS = register(LibItemNames.SORCERER_BOOTS, () -> AnimatedMagicArmor.light(ArmorItem.Type.BOOTS)); + public static final ItemRegistryWrapper SORCERER_LEGGINGS = register(LibItemNames.SORCERER_LEGGINGS, () -> AnimatedMagicArmor.light(ArmorItem.Type.LEGGINGS)); + public static final ItemRegistryWrapper SORCERER_ROBES = register(LibItemNames.SORCERER_ROBES, () -> AnimatedMagicArmor.light(ArmorItem.Type.CHESTPLATE)); + public static final ItemRegistryWrapper SORCERER_HOOD = register(LibItemNames.SORCERER_HOOD, () -> AnimatedMagicArmor.light(ArmorItem.Type.HELMET)); + public static final ItemRegistryWrapper ARCANIST_BOOTS = register(LibItemNames.ARCANIST_BOOTS, () -> AnimatedMagicArmor.medium(ArmorItem.Type.BOOTS)); + public static final ItemRegistryWrapper ARCANIST_LEGGINGS = register(LibItemNames.ARCANIST_LEGGINGS, () -> AnimatedMagicArmor.medium(ArmorItem.Type.LEGGINGS)); + public static final ItemRegistryWrapper ARCANIST_ROBES = register(LibItemNames.ARCANIST_ROBES, () -> AnimatedMagicArmor.medium(ArmorItem.Type.CHESTPLATE)); + public static final ItemRegistryWrapper ARCANIST_HOOD = register(LibItemNames.ARCANIST_HOOD, () -> AnimatedMagicArmor.medium(ArmorItem.Type.HELMET)); + public static final ItemRegistryWrapper BATTLEMAGE_BOOTS = register(LibItemNames.BATTLEMAGE_BOOTS, () -> AnimatedMagicArmor.heavy(ArmorItem.Type.BOOTS)); + public static final ItemRegistryWrapper BATTLEMAGE_LEGGINGS = register(LibItemNames.BATTLEMAGE_LEGGINGS, () -> AnimatedMagicArmor.heavy(ArmorItem.Type.LEGGINGS)); + public static final ItemRegistryWrapper BATTLEMAGE_ROBES = register(LibItemNames.BATTLEMAGE_ROBES, () -> AnimatedMagicArmor.heavy(ArmorItem.Type.CHESTPLATE)); + public static final ItemRegistryWrapper BATTLEMAGE_HOOD = register(LibItemNames.BATTLEMAGE_HOOD, () -> AnimatedMagicArmor.heavy(ArmorItem.Type.HELMET)); + public static final ItemRegistryWrapper DOWSING_ROD = register(LibItemNames.DOWSING_ROD, DowsingRod::new); + public static final ItemRegistryWrapper ABJURATION_ESSENCE = register(LibItemNames.ABJURATION_ESSENCE, () -> new ModItem().withTooltip(Component.translatable("tooltip.ars_nouveau.essences"))); + public static final ItemRegistryWrapper CONJURATION_ESSENCE = register(LibItemNames.CONJURATION_ESSENCE, () -> new ModItem().withTooltip(Component.translatable("tooltip.ars_nouveau.essences"))); + public static final ItemRegistryWrapper AIR_ESSENCE = register(LibItemNames.AIR_ESSENCE, () -> new ModItem().withTooltip(Component.translatable("tooltip.ars_nouveau.essences"))); + public static final ItemRegistryWrapper EARTH_ESSENCE = register(LibItemNames.EARTH_ESSENCE, EarthEssence::new); + public static final ItemRegistryWrapper FIRE_ESSENCE = register(LibItemNames.FIRE_ESSENCE, FireEssence::new); + public static final ItemRegistryWrapper MANIPULATION_ESSENCE = register(LibItemNames.MANIPULATION_ESSENCE, ManipulationEssence::new); + public static final ItemRegistryWrapper WATER_ESSENCE = register(LibItemNames.WATER_ESSENCE, () -> new ModItem().withTooltip(Component.translatable("tooltip.ars_nouveau.essences"))); + public static final ItemRegistryWrapper AMETHYST_GOLEM_CHARM = register(LibItemNames.AMETHYST_GOLEM_CHARM, AmethystGolemCharm::new); + public static final ItemRegistryWrapper ANNOTATED_CODEX = register(LibItemNames.ANNOTATED_CODEX, AnnotatedCodex::new); + public static final ItemRegistryWrapper SCRYER_SCROLL = register(LibItemNames.SCRYER_SCROLL, ScryerScroll::new); + public static final ItemRegistryWrapper WIXIE_HAT = register(LibItemNames.WIXIE_HAT, () -> new WixieHat().withTooltip("tooltip.ars_nouveau.wixie_hat")); + public static final ItemRegistryWrapper ALCHEMISTS_CROWN = register(LibItemNames.ALCHEMISTS_CROWN, () -> new AlchemistsCrown(defaultItemProperties().stacksTo(1))); + public static final ItemRegistryWrapper SPLASH_LAUNCHER = register(LibItemNames.SPLASH_LAUNCHER, () -> new FlaskCannon.SplashLauncher(defaultItemProperties().stacksTo(1))); + public static final ItemRegistryWrapper LINGERING_LAUNCHER = register(LibItemNames.LINGERING_LAUNCHER, () -> new FlaskCannon.LingeringLauncher(defaultItemProperties().stacksTo(1))); + public static final ItemRegistryWrapper FIREL_DISC = register(LibItemNames.FIREL_DISC, () -> new RecordItem(9, () -> SoundRegistry.ARIA_BIBLIO.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 240)); + public static final ItemRegistryWrapper SOUND_OF_GLASS = register(LibItemNames.SOUND_OF_GLASS, () -> new RecordItem(9, () -> SoundRegistry.SOUND_OF_GLASS.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 182)); + public static final ItemRegistryWrapper WILD_HUNT = register(LibItemNames.FIREL_WILD_HUNT, () -> new RecordItem(9, () -> SoundRegistry.WILD_HUNT.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 121)); + public static final ItemRegistryWrapper STARBY_GIFY = register(LibItemNames.STARBY_GIFT, () -> new Present(defaultItemProperties().rarity(Rarity.EPIC))); + public static final ItemRegistryWrapper SPELL_CROSSBOW = register(LibItemNames.SPELL_CROSSBOW, () -> new SpellCrossbow(defaultItemProperties().stacksTo(1))); + public static final ItemRegistryWrapper STABLE_WARP_SCROLL = register(LibItemNames.STABLE_WARP_SCROLL, () -> new StableWarpScroll(defaultItemProperties().stacksTo(1))); + public static final ItemRegistryWrapper SCRY_CASTER = register(LibItemNames.SCRY_CASTER, () -> new ScryCaster(defaultItemProperties().stacksTo(1))); + public static final ItemRegistryWrapper JUMP_RING = register(LibItemNames.JUMP_RING, JumpingRing::new); - public static RegistryWrapper register(String name, Supplier item) { - return new RegistryWrapper<>(ITEMS.register(name, item)); + public static ItemRegistryWrapper register(String name, Supplier item) { + return new ItemRegistryWrapper<>(ITEMS.register(name, item)); } - public static RegistryWrapper register(String name) { + public static ItemRegistryWrapper register(String name) { return register(name, ModItem::new); } - public static void onItemRegistry(IForgeRegistry registry) { + public static void onItemRegistry() { ArsNouveauAPI api = ArsNouveauAPI.getInstance(); for (Map.Entry> glyphEntry : GlyphRegistry.getGlyphItemMap().entrySet()) { Glyph glyph = glyphEntry.getValue().get(); - registry.register(glyphEntry.getKey(), glyph); + ITEMS.register(glyphEntry.getKey().getPath(), () -> glyph); glyph.spellPart.glyphItem = glyph; } for (AbstractRitual ritual : RitualRegistry.getRitualMap().values()) { RitualTablet tablet = new RitualTablet(ritual); - registry.register(ritual.getRegistryName(), tablet); + ITEMS.register(ritual.getRegistryName().getPath(), () -> tablet); RitualRegistry.getRitualItemMap().put(ritual.getRegistryName(), tablet); } for (AbstractFamiliarHolder holder : FamiliarRegistry.getFamiliarHolderMap().values()) { FamiliarScript script = new FamiliarScript(holder); FamiliarRegistry.getFamiliarScriptMap().put(holder.getRegistryName(), script); - registry.register(holder.getRegistryName(), script); + ITEMS.register(holder.getRegistryName().getPath(), () -> script); } for(IPerk perk : PerkRegistry.getPerkMap().values()) { PerkItem perkItem = new PerkItem(perk); PerkRegistry.getPerkItemMap().put(perk.getRegistryName(), perkItem); - registry.register(perk.getRegistryName(), perkItem); + ITEMS.register(perk.getRegistryName().getPath(), () -> perkItem); if(perk instanceof EmptyPerk){ BLANK_THREAD = perkItem; } } - ITEMS.register(LibItemNames.DRYGMY_SE, () -> new ForgeSpawnEggItem(ModEntities.ENTITY_DRYGMY, 10051392, 0xFFE633, defaultItemProperties())); - ITEMS.register(LibItemNames.STARBUNCLE_SE, () -> new ForgeSpawnEggItem(ModEntities.STARBUNCLE_TYPE, 0xFFB233, 0xFFE633, defaultItemProperties())); - ITEMS.register(LibItemNames.SYLPH_SE, () -> new ForgeSpawnEggItem(ModEntities.WHIRLISPRIG_TYPE, 0x77FF33, 0xFFFB00, defaultItemProperties())); - ITEMS.register(LibItemNames.WILDEN_HUNTER_SE, () -> new ForgeSpawnEggItem(ModEntities.WILDEN_HUNTER, 0xFDFDFD, 0xCAA97F, defaultItemProperties())); - ITEMS.register(LibItemNames.WILDEN_GUARDIAN_SE, () -> new ForgeSpawnEggItem(ModEntities.WILDEN_GUARDIAN, 0xFFFFFF, 0xFF9E00, defaultItemProperties())); - ITEMS.register(LibItemNames.WILDEN_STALKER_SE, () -> new ForgeSpawnEggItem(ModEntities.WILDEN_STALKER, 0x9B650C, 0xEF1818, defaultItemProperties())); + ITEMS.register(LibItemNames.DRYGMY_SE, () -> new DeferredSpawnEggItem(ModEntities.ENTITY_DRYGMY, 10051392, 0xFFE633, defaultItemProperties())); + ITEMS.register(LibItemNames.STARBUNCLE_SE, () -> new DeferredSpawnEggItem(ModEntities.STARBUNCLE_TYPE, 0xFFB233, 0xFFE633, defaultItemProperties())); + ITEMS.register(LibItemNames.SYLPH_SE, () -> new DeferredSpawnEggItem(ModEntities.WHIRLISPRIG_TYPE, 0x77FF33, 0xFFFB00, defaultItemProperties())); + ITEMS.register(LibItemNames.WILDEN_HUNTER_SE, () -> new DeferredSpawnEggItem(ModEntities.WILDEN_HUNTER, 0xFDFDFD, 0xCAA97F, defaultItemProperties())); + ITEMS.register(LibItemNames.WILDEN_GUARDIAN_SE, () -> new DeferredSpawnEggItem(ModEntities.WILDEN_GUARDIAN, 0xFFFFFF, 0xFF9E00, defaultItemProperties())); + ITEMS.register(LibItemNames.WILDEN_STALKER_SE, () -> new DeferredSpawnEggItem(ModEntities.WILDEN_STALKER, 0x9B650C, 0xEF1818, defaultItemProperties())); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/LootRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/LootRegistry.java index e79122750f..0462692d09 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/LootRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/LootRegistry.java @@ -2,17 +2,14 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.loot.DungeonLootEnhancerModifier; -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 LootRegistry { - public static final DeferredRegister> GLM = DeferredRegister.create(ForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, ArsNouveau.MODID); - - public static final RegistryObject> STRUCTURE_MODDED_LOOT_IMPORTER = GLM.register("dungeon_loot", DungeonLootEnhancerModifier.CODEC); - - + public static final DeferredRegister> GLM = DeferredRegister.create(NeoForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, ArsNouveau.MODID); + public static final DeferredHolder, MapCodec> STRUCTURE_MODDED_LOOT_IMPORTER = GLM.register("dungeon_loot", () -> DungeonLootEnhancerModifier.CODEC); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/MenuRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/MenuRegistry.java index 96f4e60c42..9f33d8279b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/MenuRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/MenuRegistry.java @@ -1,16 +1,16 @@ package com.hollingsworth.arsnouveau.setup.registry; import com.hollingsworth.arsnouveau.client.container.CraftingTerminalMenu; +import net.minecraft.core.registries.Registries; import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.inventory.MenuType; -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; import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; public class MenuRegistry { - public static final DeferredRegister> MENU_REG = DeferredRegister.create(ForgeRegistries.MENU_TYPES, MODID); + public static final DeferredRegister> MENU_REG = DeferredRegister.create(Registries.MENU, MODID); - public static final RegistryObject> STORAGE = MENU_REG.register("storage_lectern", () -> new MenuType<>(CraftingTerminalMenu::new, FeatureFlagSet.of())); + public static final DeferredHolder, MenuType> STORAGE = MENU_REG.register("storage_lectern", () -> new MenuType<>(CraftingTerminalMenu::new, FeatureFlagSet.of())); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java index 00fac9577c..dc836f2d52 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java @@ -12,6 +12,7 @@ import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; import com.hollingsworth.arsnouveau.setup.config.Config; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.tags.FluidTags; import net.minecraft.util.RandomSource; import net.minecraft.world.Difficulty; @@ -26,30 +27,30 @@ import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraftforge.event.entity.EntityAttributeCreationEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; +import net.neoforged.neoforge.event.entity.SpawnPlacementRegisterEvent; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; public class ModEntities { - public static final DeferredRegister> ENTITIES = DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, MODID); + public static final DeferredRegister> ENTITIES = DeferredRegister.create(BuiltInRegistries.ENTITY_TYPE, MODID); - static RegistryObject> registerEntity(String name, EntityType.Builder builder) { + static DeferredHolder, EntityType> registerEntity(String name, EntityType.Builder builder) { return ENTITIES.register(name, () -> builder.build(MODID + ":" + name)); } - public static final RegistryObject> SPELL_PROJ = registerEntity( + public static final DeferredHolder, EntityType> SPELL_PROJ = registerEntity( LibEntityNames.SPELL_PROJ, EntityType.Builder.of(EntityProjectileSpell::new, MobCategory.MISC) .sized(0.5f, 0.5f).noSave() .setTrackingRange(20).fireImmune() .setShouldReceiveVelocityUpdates(true)); - public static final RegistryObject> SPELL_PROJ_ARC = registerEntity( + public static final DeferredHolder, EntityType> SPELL_PROJ_ARC = registerEntity( LibEntityNames.SPELL_PROJ_ARC, EntityType.Builder.of((entityType, world) -> new EntityProjectileSpell(entityType, world) { @Override @@ -65,240 +66,241 @@ public boolean isNoGravity() { .sized(0.5f, 0.5f).noSave() .setTrackingRange(20).fireImmune() .setShouldReceiveVelocityUpdates(true)); - public static final RegistryObject> SPELL_PROJ_HOM = registerEntity( + public static final DeferredHolder, EntityType> SPELL_PROJ_HOM = registerEntity( LibEntityNames.SPELL_PROJ_HOM, EntityType.Builder.of(EntityHomingProjectileSpell::new, MobCategory.MISC) .sized(0.5f, 0.5f).noSave() .setTrackingRange(20).fireImmune() .setShouldReceiveVelocityUpdates(true)); - public static final RegistryObject> ALLY_VEX = registerEntity( + public static final DeferredHolder, EntityType> ALLY_VEX = registerEntity( LibEntityNames.ALLY_VEX, EntityType.Builder.of(EntityAllyVex::new, MobCategory.MISC) .sized(0.4F, 0.8F).fireImmune()); - public static final RegistryObject> ENTITY_EVOKER_FANGS_ENTITY_TYPE = registerEntity( + public static final DeferredHolder, EntityType> ENTITY_EVOKER_FANGS_ENTITY_TYPE = registerEntity( LibEntityNames.FANGS, EntityType.Builder.of(EntityEvokerFangs::new, MobCategory.MISC) .sized(0.5F, 0.8F) .setUpdateInterval(60)); - public static final RegistryObject> ENTITY_BOOKWYRM_TYPE = registerEntity(LibEntityNames.BOOKWYRM, EntityType.Builder.of(EntityBookwyrm::new, MobCategory.MISC) + public static final DeferredHolder, EntityType> ENTITY_BOOKWYRM_TYPE = registerEntity(LibEntityNames.BOOKWYRM, EntityType.Builder.of(EntityBookwyrm::new, MobCategory.MISC) .sized(0.4f, 0.6f).setTrackingRange(10) .setShouldReceiveVelocityUpdates(true)); - public static final RegistryObject> STARBUNCLE_TYPE = registerEntity(LibEntityNames.STARBUNCLE, EntityType.Builder.of(Starbuncle::new, MobCategory.CREATURE) + public static final DeferredHolder, EntityType> STARBUNCLE_TYPE = registerEntity(LibEntityNames.STARBUNCLE, EntityType.Builder.of(Starbuncle::new, MobCategory.CREATURE) .sized(0.6F, 0.63F).setTrackingRange(10) .setShouldReceiveVelocityUpdates(true)); - public static final RegistryObject> ENTITY_FOLLOW_PROJ = registerEntity( + public static final DeferredHolder, EntityType> ENTITY_FOLLOW_PROJ = registerEntity( LibEntityNames.FOLLOW_PROJ, EntityType.Builder.of(EntityFollowProjectile::new, MobCategory.MISC) .sized(0.5f, 0.5f).noSave().fireImmune() .setTrackingRange(10) - .setShouldReceiveVelocityUpdates(true).setCustomClientFactory(EntityFollowProjectile::new)); + .setShouldReceiveVelocityUpdates(true)); - public static final RegistryObject> WHIRLISPRIG_TYPE = registerEntity(LibEntityNames.WHIRLISPRIG, EntityType.Builder.of(Whirlisprig::new, MobCategory.CREATURE) + public static final DeferredHolder, EntityType> WHIRLISPRIG_TYPE = registerEntity(LibEntityNames.WHIRLISPRIG, EntityType.Builder.of(Whirlisprig::new, MobCategory.CREATURE) .sized(0.6F, 0.98F).setTrackingRange(10) .setShouldReceiveVelocityUpdates(true)); - public static final RegistryObject> ENTITY_WIXIE_TYPE = registerEntity(LibEntityNames.WIXIE, EntityType.Builder.of(EntityWixie::new, MobCategory.MISC) + public static final DeferredHolder, EntityType> ENTITY_WIXIE_TYPE = registerEntity(LibEntityNames.WIXIE, EntityType.Builder.of(EntityWixie::new, MobCategory.MISC) .sized(0.6F, 0.98F).setTrackingRange(10) .setShouldReceiveVelocityUpdates(true)); - public static final RegistryObject> ENTITY_FLYING_ITEM = registerEntity( + public static final DeferredHolder, EntityType> ENTITY_FLYING_ITEM = registerEntity( LibEntityNames.FLYING_ITEM, EntityType.Builder.of(EntityFlyingItem::new, MobCategory.MISC) .sized(0.5f, 0.5f).fireImmune() .setTrackingRange(10).setUpdateInterval(60) - .setShouldReceiveVelocityUpdates(true).setCustomClientFactory(EntityFlyingItem::new).noSave()); - public static final RegistryObject> ENTITY_RITUAL = registerEntity( + .setShouldReceiveVelocityUpdates(true).noSave()); + public static final DeferredHolder, EntityType> ENTITY_RITUAL = registerEntity( LibEntityNames.RITUAL_PROJ, EntityType.Builder.of(EntityRitualProjectile::new, MobCategory.MISC) .sized(0.5f, 0.5f) .setTrackingRange(10).setUpdateInterval(60) - .setShouldReceiveVelocityUpdates(true).setCustomClientFactory(EntityRitualProjectile::new)); + .setShouldReceiveVelocityUpdates(true)); - public static final RegistryObject> WILDEN_HUNTER = registerEntity( + public static final DeferredHolder, EntityType> WILDEN_HUNTER = registerEntity( LibEntityNames.WILDEN_HUNTER, EntityType.Builder.of(WildenHunter::new, MobCategory.MONSTER) .sized(1.2f, 1.2F) .setTrackingRange(10) .setShouldReceiveVelocityUpdates(true)); - public static final RegistryObject> ENTITY_SPELL_ARROW = registerEntity( + public static final DeferredHolder, EntityType> ENTITY_SPELL_ARROW = registerEntity( LibEntityNames.SPELL_ARROW, EntityType.Builder.of(EntitySpellArrow::new, MobCategory.MISC) - .clientTrackingRange(20).setShouldReceiveVelocityUpdates(true).setCustomClientFactory(EntitySpellArrow::new)); - public static final RegistryObject> CINDER = registerEntity( + .clientTrackingRange(20).setShouldReceiveVelocityUpdates(true)); + public static final DeferredHolder, EntityType> CINDER = registerEntity( LibEntityNames.CINDER, EntityType.Builder.of(Cinder::new, MobCategory.MISC) .sized(0.5f, 0.5f) .setShouldReceiveVelocityUpdates(true) .fireImmune() .setTrackingRange(256)); - public static final RegistryObject> SUMMON_WOLF = registerEntity( + public static final DeferredHolder, EntityType> SUMMON_WOLF = registerEntity( LibEntityNames.SUMMONED_WOLF, EntityType.Builder.of(SummonWolf::new, MobCategory.CREATURE).sized(0.6F, 0.85F).clientTrackingRange(10)); - public static final RegistryObject> WILDEN_STALKER = registerEntity( + public static final DeferredHolder, EntityType> WILDEN_STALKER = registerEntity( LibEntityNames.WILDEN_STALKER, EntityType.Builder.of(WildenStalker::new, MobCategory.MONSTER) .sized(0.95F, 1F) .setTrackingRange(10) .setShouldReceiveVelocityUpdates(true)); - public static final RegistryObject> SUMMON_HORSE = registerEntity( + public static final DeferredHolder, EntityType> SUMMON_HORSE = registerEntity( LibEntityNames.SUMMONED_HORSE, EntityType.Builder.of(SummonHorse::new, MobCategory.CREATURE).sized(1.3964844F, 1.6F).clientTrackingRange(10)); - public static final RegistryObject> SUMMON_SKELETON = registerEntity(LibEntityNames.SUMMONED_SKELETON, + public static final DeferredHolder, EntityType> SUMMON_SKELETON = registerEntity(LibEntityNames.SUMMONED_SKELETON, EntityType.Builder.of(SummonSkeleton::new, MobCategory.CREATURE).sized(1.0F, 1.8F).clientTrackingRange(10)); - public static final RegistryObject> WILDEN_GUARDIAN = registerEntity( + public static final DeferredHolder, EntityType> WILDEN_GUARDIAN = registerEntity( LibEntityNames.WILDEN_GUARDIAN, EntityType.Builder.of(WildenGuardian::new, MobCategory.MONSTER) .sized(1.15F, 1.15F) .setTrackingRange(10) .setShouldReceiveVelocityUpdates(true)); - public static final RegistryObject> WILDEN_BOSS = registerEntity( + public static final DeferredHolder, EntityType> WILDEN_BOSS = registerEntity( LibEntityNames.WILDEN_CHIMERA, EntityType.Builder.of(WildenChimera::new, MobCategory.MONSTER) .sized(2.5f, 2.25f) .setTrackingRange(10) .setShouldReceiveVelocityUpdates(true)); - public static final RegistryObject> LIGHTNING_ENTITY = registerEntity(LibEntityNames.AN_LIGHTNING, EntityType.Builder.of(LightningEntity::new, MobCategory.MISC) + public static final DeferredHolder, EntityType> LIGHTNING_ENTITY = registerEntity(LibEntityNames.AN_LIGHTNING, EntityType.Builder.of(LightningEntity::new, MobCategory.MISC) .sized(0.0F, 0.0F) .clientTrackingRange(16) .updateInterval(Integer.MAX_VALUE ).setShouldReceiveVelocityUpdates(true).setUpdateInterval(60)); - public static final RegistryObject> ENTITY_DUMMY = registerEntity( + public static final DeferredHolder, EntityType> ENTITY_DUMMY = registerEntity( LibEntityNames.DUMMY, EntityType.Builder.of(EntityDummy::new, MobCategory.MISC) .sized(1.0f, 2.0f) .setTrackingRange(10) .setShouldReceiveVelocityUpdates(true)); - public static final RegistryObject> ENTITY_DRYGMY = registerEntity( + public static final DeferredHolder, EntityType> ENTITY_DRYGMY = registerEntity( LibEntityNames.DRYGMY, EntityType.Builder.of(EntityDrygmy::new, MobCategory.CREATURE).sized(0.6F, 0.85F).clientTrackingRange(10)); - public static final RegistryObject> ORBIT_SPELL = registerEntity( + public static final DeferredHolder, EntityType> ORBIT_SPELL = registerEntity( LibEntityNames.ORBIT_PROJECTILE, EntityType.Builder.of(EntityOrbitProjectile::new, MobCategory.MISC).sized(0.5f, 0.5f).fireImmune() - .clientTrackingRange(20).setShouldReceiveVelocityUpdates(true).setCustomClientFactory(EntityOrbitProjectile::new)); - public static final RegistryObject> ENTITY_CHIMERA_SPIKE = registerEntity( + .clientTrackingRange(20).setShouldReceiveVelocityUpdates(true)); + public static final DeferredHolder, EntityType> ENTITY_CHIMERA_SPIKE = registerEntity( LibEntityNames.CHIMERA_SPIKE, EntityType.Builder.of(EntityChimeraProjectile::new, MobCategory.MISC) - .clientTrackingRange(20).updateInterval(20).setShouldReceiveVelocityUpdates(true).setCustomClientFactory(EntityChimeraProjectile::new)); - public static final RegistryObject> ENTITY_FAMILIAR_STARBUNCLE = registerEntity(LibEntityNames.FAMILIAR_STARBUNCLE, EntityType.Builder.of(FamiliarStarbuncle::new, MobCategory.CREATURE) + .clientTrackingRange(20).updateInterval(20).setShouldReceiveVelocityUpdates(true)); + public static final DeferredHolder, EntityType> ENTITY_FAMILIAR_STARBUNCLE = registerEntity(LibEntityNames.FAMILIAR_STARBUNCLE, EntityType.Builder.of(FamiliarStarbuncle::new, MobCategory.CREATURE) .sized(0.5f, 0.5f).setTrackingRange(10)); - public static final RegistryObject> ENTITY_FAMILIAR_WIXIE = registerEntity(LibEntityNames.FAMILIAR_WIXIE, EntityType.Builder.of(FamiliarWixie::new, MobCategory.CREATURE) + public static final DeferredHolder, EntityType> ENTITY_FAMILIAR_WIXIE = registerEntity(LibEntityNames.FAMILIAR_WIXIE, EntityType.Builder.of(FamiliarWixie::new, MobCategory.CREATURE) .sized(0.5f, 0.5f).setTrackingRange(10)); - public static final RegistryObject> ENTITY_FAMILIAR_BOOKWYRM = registerEntity(LibEntityNames.FAMILIAR_BOOKWYRM, EntityType.Builder.of(FamiliarBookwyrm::new, MobCategory.CREATURE) + public static final DeferredHolder, EntityType> ENTITY_FAMILIAR_BOOKWYRM = registerEntity(LibEntityNames.FAMILIAR_BOOKWYRM, EntityType.Builder.of(FamiliarBookwyrm::new, MobCategory.CREATURE) .sized(0.5f, 0.5f).setTrackingRange(10)); - public static final RegistryObject> ENTITY_FAMILIAR_DRYGMY = registerEntity(LibEntityNames.FAMILIAR_DRYGMY, EntityType.Builder.of(FamiliarDrygmy::new, MobCategory.CREATURE) + public static final DeferredHolder, EntityType> ENTITY_FAMILIAR_DRYGMY = registerEntity(LibEntityNames.FAMILIAR_DRYGMY, EntityType.Builder.of(FamiliarDrygmy::new, MobCategory.CREATURE) .sized(0.5f, 0.5f).setTrackingRange(10)); - public static final RegistryObject> ENTITY_FAMILIAR_SYLPH = registerEntity(LibEntityNames.FAMILIAR_WHIRLISPRIG, EntityType.Builder.of(FamiliarWhirlisprig::new, MobCategory.CREATURE) + public static final DeferredHolder, EntityType> ENTITY_FAMILIAR_SYLPH = registerEntity(LibEntityNames.FAMILIAR_WHIRLISPRIG, EntityType.Builder.of(FamiliarWhirlisprig::new, MobCategory.CREATURE) .sized(0.5f, 0.5f).setTrackingRange(10)); - public static final RegistryObject> FAMILIAR_AMETHYST_GOLEM = registerEntity(LibEntityNames.FAMILIAR_AMETHYST_GOLEM, EntityType.Builder.of(FamiliarAmethystGolem::new, MobCategory.CREATURE) + public static final DeferredHolder, EntityType> FAMILIAR_AMETHYST_GOLEM = registerEntity(LibEntityNames.FAMILIAR_AMETHYST_GOLEM, EntityType.Builder.of(FamiliarAmethystGolem::new, MobCategory.CREATURE) .sized(1.0f, 1.0f).setTrackingRange(10)); - public static final RegistryObject> LINGER_SPELL = registerEntity( + public static final DeferredHolder, EntityType> LINGER_SPELL = registerEntity( LibEntityNames.LINGER, EntityType.Builder.of(EntityLingeringSpell::new, MobCategory.MISC) .sized(0.5f, 0.5f) .setTrackingRange(20) .setShouldReceiveVelocityUpdates(true) .noSave() - .setCustomClientFactory(EntityLingeringSpell::new)); - public static final RegistryObject> WALL_SPELL = registerEntity( + ); + public static final DeferredHolder, EntityType> WALL_SPELL = registerEntity( LibEntityNames.WALL, EntityType.Builder.of(EntityWallSpell::new, MobCategory.MISC) .sized(0.5f, 0.5f) .setTrackingRange(20) .setShouldReceiveVelocityUpdates(true) .noSave() - .setCustomClientFactory(EntityWallSpell::new)); - public static final RegistryObject> ENTITY_CASCADING_WEALD = registerEntity(LibEntityNames.CASCADING_WEALD_WALKER, EntityType.Builder.of((type, world) -> { + ); + public static final DeferredHolder, EntityType> ENTITY_CASCADING_WEALD = registerEntity(LibEntityNames.CASCADING_WEALD_WALKER, EntityType.Builder.of((type, world) -> { WealdWalker walker = new WealdWalker(type, world); walker.spell = new Spell(MethodProjectile.INSTANCE, EffectFreeze.INSTANCE, EffectColdSnap.INSTANCE); walker.color = new ParticleColor(50, 50, 250); return walker; }, MobCategory.CREATURE) .sized(1.4F, 3F).setTrackingRange(10)); - public static final RegistryObject> ENTITY_FLOURISHING_WEALD = registerEntity(LibEntityNames.FLOURISHING_WEALD_WALKER, EntityType.Builder.of((type, world) -> { + public static final DeferredHolder, EntityType> ENTITY_FLOURISHING_WEALD = registerEntity(LibEntityNames.FLOURISHING_WEALD_WALKER, EntityType.Builder.of((type, world) -> { WealdWalker walker = new WealdWalker(type, world); walker.spell = new Spell(MethodProjectile.INSTANCE, EffectHarm.INSTANCE, AugmentAmplify.INSTANCE, AugmentAmplify.INSTANCE, EffectSnare.INSTANCE); walker.color = new ParticleColor(50, 250, 55); return walker; }, MobCategory.CREATURE) .sized(1.4F, 3F).setTrackingRange(10)); - public static final RegistryObject> ENTITY_BLAZING_WEALD = registerEntity(LibEntityNames.BLAZING_WEALD_WALKER, EntityType.Builder.of((type, world) -> { + public static final DeferredHolder, EntityType> ENTITY_BLAZING_WEALD = registerEntity(LibEntityNames.BLAZING_WEALD_WALKER, EntityType.Builder.of((type, world) -> { WealdWalker walker = new WealdWalker(type, world); walker.spell = new Spell(MethodProjectile.INSTANCE, EffectIgnite.INSTANCE, AugmentSensitive.INSTANCE, EffectFlare.INSTANCE); walker.color = new ParticleColor(250, 15, 15); return walker; }, MobCategory.CREATURE) .sized(1.4F, 3F).setTrackingRange(10)); - public static final RegistryObject> ENTITY_VEXING_WEALD = registerEntity(LibEntityNames.VEXING_WEALD_WALKER, EntityType.Builder.of((type, world) -> { + public static final DeferredHolder, EntityType> ENTITY_VEXING_WEALD = registerEntity(LibEntityNames.VEXING_WEALD_WALKER, EntityType.Builder.of((type, world) -> { WealdWalker walker = new WealdWalker(type, world); walker.spell = new Spell(MethodProjectile.INSTANCE, EffectHex.INSTANCE, EffectWither.INSTANCE, AugmentAmplify.INSTANCE, AugmentAmplify.INSTANCE); walker.color = new ParticleColor(250, 50, 250); return walker; }, MobCategory.CREATURE) .sized(1.4F, 3F).setTrackingRange(10)); - public static final RegistryObject> AMETHYST_GOLEM = registerEntity(LibEntityNames.AMETHYST_GOLEM, EntityType.Builder.of(AmethystGolem::new, MobCategory.CREATURE) + public static final DeferredHolder, EntityType> AMETHYST_GOLEM = registerEntity(LibEntityNames.AMETHYST_GOLEM, EntityType.Builder.of(AmethystGolem::new, MobCategory.CREATURE) .sized(1.0f, 1.0f).setTrackingRange(10)); - public static final RegistryObject> SCRYER_CAMERA = registerEntity(LibEntityNames.SCRYER_CAMERA, EntityType.Builder.of(ScryerCamera::new, MobCategory.MISC) + public static final DeferredHolder, EntityType> SCRYER_CAMERA = registerEntity(LibEntityNames.SCRYER_CAMERA, EntityType.Builder.of(ScryerCamera::new, MobCategory.MISC) .sized(1.0E-4F, 1.0E-4F).setTrackingRange(256).setUpdateInterval(20).setShouldReceiveVelocityUpdates(true)); - public static final RegistryObject> ENCHANTED_FALLING_BLOCK = registerEntity( + public static final DeferredHolder, EntityType> ENCHANTED_FALLING_BLOCK = registerEntity( "enchanted_falling_block", EntityType.Builder.of(EnchantedFallingBlock::new, MobCategory.MISC).sized(0.98F, 0.98F) .setShouldReceiveVelocityUpdates(true) .setTrackingRange(256)); - public static final RegistryObject> ICE_SHARD = registerEntity( + public static final DeferredHolder, EntityType> ICE_SHARD = registerEntity( "ice_shard", EntityType.Builder.of(IceShardEntity::new, MobCategory.MISC).sized(0.98F, 0.98F) .setShouldReceiveVelocityUpdates(true) .setTrackingRange(256)); - public static final RegistryObject> ENCHANTED_MAGE_BLOCK = registerEntity( + public static final DeferredHolder, EntityType> ENCHANTED_MAGE_BLOCK = registerEntity( "enchanted_mage_block", EntityType.Builder.of(EnchantedMageblock::new, MobCategory.MISC).sized(0.98F, 0.98F) .setShouldReceiveVelocityUpdates(true) .setTrackingRange(256)); - public static final RegistryObject> ENCHANTED_HEAD_BLOCK = registerEntity( + public static final DeferredHolder, EntityType> ENCHANTED_HEAD_BLOCK = registerEntity( "enchanted_head_block", EntityType.Builder.of(EnchantedSkull::new, MobCategory.MISC).sized(0.98F, 0.98F) .setShouldReceiveVelocityUpdates(true) .setTrackingRange(256)); - public static final RegistryObject> GIFT_STARBY = registerEntity(LibEntityNames.GIFT_STARBY, EntityType.Builder.of(GiftStarbuncle::new, MobCategory.CREATURE) + public static final DeferredHolder, EntityType> GIFT_STARBY = registerEntity(LibEntityNames.GIFT_STARBY, EntityType.Builder.of(GiftStarbuncle::new, MobCategory.CREATURE) .sized(0.6F, 0.63F).setTrackingRange(10) .setShouldReceiveVelocityUpdates(true)); - public static final RegistryObject> ANIMATED_BLOCK = registerEntity( + public static final DeferredHolder, EntityType> ANIMATED_BLOCK = registerEntity( "animated_block", EntityType.Builder.of(AnimBlockSummon::new, MobCategory.MISC) .sized(1.0f, 1.5f) .noSave() .setTrackingRange(10)); - public static final RegistryObject> ANIMATED_HEAD = registerEntity( + public static final DeferredHolder, EntityType> ANIMATED_HEAD = registerEntity( "animated_head", EntityType.Builder.of(AnimHeadSummon::new, MobCategory.MISC) .sized(1.0f, 1.5f) .noSave() .setTrackingRange(10)); - public static final RegistryObject> LILY = registerEntity( + public static final DeferredHolder, EntityType> LILY = registerEntity( LibEntityNames.LILY, EntityType.Builder.of(Lily::new, MobCategory.MISC) .sized(0.5F, 0.75F) .setTrackingRange(10)); - public static void registerPlacements() { - SpawnPlacements.register(STARBUNCLE_TYPE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn); - SpawnPlacements.register(GIFT_STARBY.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn); - SpawnPlacements.register(WHIRLISPRIG_TYPE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn); - SpawnPlacements.register(ENTITY_DRYGMY.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn); + @SubscribeEvent + public static void registerPlacements(SpawnPlacementRegisterEvent event) { + event.register(STARBUNCLE_TYPE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, SpawnPlacementRegisterEvent.Operation.AND); + event.register(GIFT_STARBY.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, SpawnPlacementRegisterEvent.Operation.AND); + event.register(WHIRLISPRIG_TYPE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, SpawnPlacementRegisterEvent.Operation.AND); + event.register(ENTITY_DRYGMY.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, SpawnPlacementRegisterEvent.Operation.AND); - SpawnPlacements.register(WILDEN_GUARDIAN.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::wildenSpawnRules); - SpawnPlacements.register(WILDEN_HUNTER.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::wildenSpawnRules); - SpawnPlacements.register(WILDEN_STALKER.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::wildenSpawnRules); + event.register(WILDEN_GUARDIAN.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::wildenSpawnRules, SpawnPlacementRegisterEvent.Operation.AND); + event.register(WILDEN_HUNTER.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::wildenSpawnRules, SpawnPlacementRegisterEvent.Operation.AND); + event.register(WILDEN_STALKER.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::wildenSpawnRules, SpawnPlacementRegisterEvent.Operation.AND); - SpawnPlacements.register(ENTITY_BLAZING_WEALD.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn); - SpawnPlacements.register(ENTITY_CASCADING_WEALD.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn); - SpawnPlacements.register(ENTITY_FLOURISHING_WEALD.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn); - SpawnPlacements.register(ENTITY_VEXING_WEALD.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn); + event.register(ENTITY_BLAZING_WEALD.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, SpawnPlacementRegisterEvent.Operation.AND); + event.register(ENTITY_CASCADING_WEALD.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, SpawnPlacementRegisterEvent.Operation.AND); + event.register(ENTITY_FLOURISHING_WEALD.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, SpawnPlacementRegisterEvent.Operation.AND); + event.register(ENTITY_VEXING_WEALD.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, SpawnPlacementRegisterEvent.Operation.AND); LightManager.init(); } @@ -318,7 +320,7 @@ public static boolean guardianSpawnRules(EntityType pDrowned, ServerLev return flag; } - @Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD) + @EventBusSubscriber(modid = MODID, bus = EventBusSubscriber.Bus.MOD) public static class RegistrationHandler { @SubscribeEvent diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java index 8102182bdc..0354fca438 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java @@ -4,20 +4,20 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.potions.*; import com.hollingsworth.arsnouveau.setup.config.ServerConfig; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectCategory; import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.AttributeMap; import net.minecraft.world.entity.ai.attributes.AttributeModifier; 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.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; - +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.event.brewing.RegisterBrewingRecipesEvent; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; import java.util.ArrayList; import java.util.UUID; @@ -26,104 +26,105 @@ public class ModPotions { - public static final DeferredRegister EFFECTS = DeferredRegister.create(ForgeRegistries.MOB_EFFECTS, MODID); - public static final DeferredRegister POTIONS = DeferredRegister.create(ForgeRegistries.POTIONS, MODID); + public static final DeferredRegister EFFECTS = DeferredRegister.create(BuiltInRegistries.MOB_EFFECT, MODID); + public static final DeferredRegister POTIONS = DeferredRegister.create(BuiltInRegistries.POTION, MODID); - public static final RegistryObject SHOCKED_EFFECT = EFFECTS.register(SHOCKED, ShockedEffect::new); + public static final DeferredHolder SHOCKED_EFFECT = EFFECTS.register(SHOCKED, ShockedEffect::new); //TODO Consider switching to vanilla builder method for adding attribute modifiers - public static final RegistryObject MANA_REGEN_EFFECT = EFFECTS.register(MANA_REGEN, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 8080895) { + public static final DeferredHolder MANA_REGEN_EFFECT = EFFECTS.register(MANA_REGEN, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 8080895) { @Override - public void addAttributeModifiers(LivingEntity pLivingEntity, AttributeMap pAttributeMap, int pAmplifier) { - AttributeModifier attributemodifier = new AttributeModifier(UUID.fromString("bb72a21d-3e49-4e8e-b81c-3bfa9cf746b0"), this::getDescriptionId, ServerConfig.MANA_REGEN_POTION.get() * (1 + pAmplifier), AttributeModifier.Operation.ADDITION); - this.getAttributeModifiers().put(PerkAttributes.MANA_REGEN_BONUS.get(), attributemodifier); - super.addAttributeModifiers(pLivingEntity, pAttributeMap, pAmplifier); + public void addAttributeModifiers(AttributeMap pAttributeMap, int pAmplifier) { + AttributeModifier attributemodifier = new AttributeModifier(UUID.fromString("bb72a21d-3e49-4e8e-b81c-3bfa9cf746b0"), this.getDescriptionId(), ServerConfig.MANA_REGEN_POTION.get() * (1 + pAmplifier), AttributeModifier.Operation.ADD_VALUE); + pAttributeMap.getInstance(PerkAttributes.MANA_REGEN_BONUS).addTransientModifier(attributemodifier); + super.addAttributeModifiers(pAttributeMap, pAmplifier); } - }); - public static final RegistryObject SUMMONING_SICKNESS_EFFECT = EFFECTS.register(SUMMONING_SICKNESS, () -> new PublicEffect(MobEffectCategory.HARMFUL, 2039587, new ArrayList<>())); + public static final DeferredHolder SUMMONING_SICKNESS_EFFECT = EFFECTS.register(SUMMONING_SICKNESS, () -> new PublicEffect(MobEffectCategory.HARMFUL, 2039587, new ArrayList<>())); - public static final RegistryObject HEX_EFFECT = EFFECTS.register(HEX, () -> new PublicEffect(MobEffectCategory.HARMFUL, 8080895) { + public static final DeferredHolder HEX_EFFECT = EFFECTS.register(HEX, () -> new PublicEffect(MobEffectCategory.HARMFUL, 8080895) { @Override - public void addAttributeModifiers(LivingEntity pLivingEntity, AttributeMap pAttributeMap, int pAmplifier) { - getAttributeModifiers().put(PerkAttributes.MANA_REGEN_BONUS.get(), new AttributeModifier(UUID.fromString("5636ef7d-0136-4205-aabc-fd7cf0d29d05"), this::getDescriptionId, -0.5, AttributeModifier.Operation.MULTIPLY_TOTAL)); - super.addAttributeModifiers(pLivingEntity, pAttributeMap, pAmplifier); + public void addAttributeModifiers(AttributeMap pAttributeMap, int pAmplifier) { + pAttributeMap.getInstance(PerkAttributes.MANA_REGEN_BONUS).addTransientModifier(new AttributeModifier(UUID.fromString("5636ef7d-0136-4205-aabc-fd7cf0d29d05"), this.getDescriptionId(), -0.5, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); + super.addAttributeModifiers(pAttributeMap, pAmplifier); } }); - public static final RegistryObject SCRYING_EFFECT = EFFECTS.register(SCRYING, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 2039587)); - public static final RegistryObject GLIDE_EFFECT = EFFECTS.register(GLIDE, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 8080895)); - public static final RegistryObject SNARE_EFFECT = EFFECTS.register(SNARE, SnareEffect::new); - public static final RegistryObject FLIGHT_EFFECT = EFFECTS.register(FLIGHT, FlightEffect::new); - public static final RegistryObject GRAVITY_EFFECT = EFFECTS.register(GRAVITY, GravityEffect::new); - public static final RegistryObject SPELL_DAMAGE_EFFECT = EFFECTS.register(SPELL_DAMAGE, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, new ParticleColor(30, 200, 200).getColor()) { + public static final DeferredHolder SCRYING_EFFECT = EFFECTS.register(SCRYING, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 2039587)); + public static final DeferredHolder GLIDE_EFFECT = EFFECTS.register(GLIDE, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 8080895)); + public static final DeferredHolder SNARE_EFFECT = EFFECTS.register(SNARE, SnareEffect::new); + public static final DeferredHolder FLIGHT_EFFECT = EFFECTS.register(FLIGHT, FlightEffect::new); + public static final DeferredHolder GRAVITY_EFFECT = EFFECTS.register(GRAVITY, GravityEffect::new); + public static final DeferredHolder SPELL_DAMAGE_EFFECT = EFFECTS.register(SPELL_DAMAGE, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, new ParticleColor(30, 200, 200).getColor()) { @Override - public void addAttributeModifiers(LivingEntity pLivingEntity, AttributeMap pAttributeMap, int pAmplifier) { - getAttributeModifiers().put(PerkAttributes.SPELL_DAMAGE_BONUS.get(), new AttributeModifier(UUID.fromString("7a8b8f12-077b-430c-8da7-fd21c95dceb3"), this::getDescriptionId, 1.5F * (1 + pAmplifier), AttributeModifier.Operation.ADDITION)); - super.addAttributeModifiers(pLivingEntity, pAttributeMap, pAmplifier); + public void addAttributeModifiers(AttributeMap pAttributeMap, int pAmplifier) { + pAttributeMap.getInstance(PerkAttributes.MANA_REGEN_BONUS).addTransientModifier(new AttributeModifier(UUID.fromString("7a8b8f12-077b-430c-8da7-fd21c95dceb3"), this.getDescriptionId(), 1.5F * (1 + pAmplifier), AttributeModifier.Operation.ADD_VALUE)); + super.addAttributeModifiers(pAttributeMap, pAmplifier); } }); - public static final RegistryObject IMMOLATE_EFFECT = EFFECTS.register(IMMOLATE, ImmolateEffect::new); - public static final RegistryObject BOUNCE_EFFECT = EFFECTS.register(BOUNCE, BounceEffect::new); - public static final RegistryObject MAGIC_FIND_EFFECT = EFFECTS.register(MAGIC_FIND, MagicFindEffect::new); - - public static final RegistryObject RECOVERY_EFFECT = EFFECTS.register(RECOVERY, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, new ParticleColor(0, 200, 40).getColor())); - public static final RegistryObject BLAST_EFFECT = EFFECTS.register(BLAST, BlastEffect::new); - public static final RegistryObject FREEZING_EFFECT = EFFECTS.register(FREEZING, FreezingEffect::new); - public static final RegistryObject DEFENCE_EFFECT = EFFECTS.register(DEFENCE, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, new ParticleColor(150, 0, 150).getColor())); - - public static final RegistryObject MANA_REGEN_POTION = POTIONS.register(potion(MANA_REGEN), () -> new Potion(new MobEffectInstance(MANA_REGEN_EFFECT.get(), 3600))); - public static final RegistryObject LONG_MANA_REGEN_POTION = POTIONS.register(longPotion(MANA_REGEN), () -> new Potion(new MobEffectInstance(MANA_REGEN_EFFECT.get(), 9600))); - public static final RegistryObject STRONG_MANA_REGEN_POTION = POTIONS.register(strongPotion(MANA_REGEN), () -> new Potion(new MobEffectInstance(MANA_REGEN_EFFECT.get(), 3600, 1))); - - public static final RegistryObject SPELL_DAMAGE_POTION = POTIONS.register(potion(SPELL_DAMAGE), () -> new Potion(new MobEffectInstance(SPELL_DAMAGE_EFFECT.get(), 3600))); - public static final RegistryObject SPELL_DAMAGE_POTION_LONG = POTIONS.register(longPotion(SPELL_DAMAGE), () -> new Potion(new MobEffectInstance(SPELL_DAMAGE_EFFECT.get(), 9600))); - public static final RegistryObject SPELL_DAMAGE_POTION_STRONG = POTIONS.register(strongPotion(SPELL_DAMAGE), () -> new Potion(new MobEffectInstance(SPELL_DAMAGE_EFFECT.get(), 3600, 1))); - - public static final RegistryObject RECOVERY_POTION = POTIONS.register(potion(RECOVERY), () -> new Potion(new MobEffectInstance(RECOVERY_EFFECT.get(), 3600))); - public static final RegistryObject LONG_RECOVERY_POTION = POTIONS.register(longPotion(RECOVERY), () -> new Potion(new MobEffectInstance(RECOVERY_EFFECT.get(), 9600))); - public static final RegistryObject STRONG_RECOVERY_POTION = POTIONS.register(strongPotion(RECOVERY), () -> new Potion(new MobEffectInstance(RECOVERY_EFFECT.get(), 3600, 1))); - - public static final RegistryObject BLAST_POTION = POTIONS.register(potion(BLAST), () -> new Potion(new MobEffectInstance(BLAST_EFFECT.get(), 200))); - public static final RegistryObject LONG_BLAST_POTION = POTIONS.register(longPotion(BLAST), () -> new Potion(new MobEffectInstance(BLAST_EFFECT.get(), 400))); - public static final RegistryObject STRONG_BLAST_POTION = POTIONS.register(strongPotion(BLAST), () -> new Potion(new MobEffectInstance(BLAST_EFFECT.get(), 140, 1))); - - public static final RegistryObject FREEZING_POTION = POTIONS.register(potion(FREEZING), () -> new Potion(new MobEffectInstance(FREEZING_EFFECT.get(), 1800))); - public static final RegistryObject LONG_FREEZING_POTION = POTIONS.register(longPotion(FREEZING), () -> new Potion(new MobEffectInstance(FREEZING_EFFECT.get(), 3600))); - public static final RegistryObject STRONG_FREEZING_POTION = POTIONS.register(strongPotion(FREEZING), () -> new Potion(new MobEffectInstance(FREEZING_EFFECT.get(), 1800, 1))); - - public static final RegistryObject DEFENCE_POTION = POTIONS.register(potion(DEFENCE), () -> new Potion(new MobEffectInstance(DEFENCE_EFFECT.get(), 3600))); - public static final RegistryObject LONG_DEFENCE_POTION = POTIONS.register(longPotion(DEFENCE), () -> new Potion(new MobEffectInstance(DEFENCE_EFFECT.get(), 9600))); - public static final RegistryObject STRONG_DEFENCE_POTION = POTIONS.register(strongPotion(DEFENCE), () -> new Potion(new MobEffectInstance(DEFENCE_EFFECT.get(), 3600, 1))); - - public static void addRecipes() { - PotionBrewing.addMix(Potions.WATER, ItemsRegistry.ABJURATION_ESSENCE.get(), Potions.AWKWARD); - PotionBrewing.addMix(Potions.AWKWARD, ItemsRegistry.MAGE_BLOOM.get(), ModPotions.SPELL_DAMAGE_POTION.get()); - - PotionBrewing.addMix(ModPotions.SPELL_DAMAGE_POTION.get(), Items.GLOWSTONE_DUST, ModPotions.SPELL_DAMAGE_POTION_STRONG.get()); - PotionBrewing.addMix(ModPotions.SPELL_DAMAGE_POTION.get(), Items.REDSTONE, ModPotions.SPELL_DAMAGE_POTION_LONG.get()); - - PotionBrewing.addMix(Potions.AWKWARD, BlockRegistry.SOURCEBERRY_BUSH.asItem(), ModPotions.MANA_REGEN_POTION.get()); - PotionBrewing.addMix(ModPotions.MANA_REGEN_POTION.get(), Items.GLOWSTONE_DUST, ModPotions.STRONG_MANA_REGEN_POTION.get()); - PotionBrewing.addMix(ModPotions.MANA_REGEN_POTION.get(), Items.REDSTONE, ModPotions.LONG_MANA_REGEN_POTION.get()); - - PotionBrewing.addMix(Potions.AWKWARD, BlockRegistry.MENDOSTEEN_POD.asItem(), ModPotions.RECOVERY_POTION.get()); - PotionBrewing.addMix(ModPotions.RECOVERY_POTION.get(), Items.GLOWSTONE_DUST, ModPotions.STRONG_RECOVERY_POTION.get()); - PotionBrewing.addMix(ModPotions.RECOVERY_POTION.get(), Items.REDSTONE, ModPotions.LONG_RECOVERY_POTION.get()); - - PotionBrewing.addMix(Potions.AWKWARD, BlockRegistry.BOMBEGRANTE_POD.asItem(), ModPotions.BLAST_POTION.get()); - PotionBrewing.addMix(ModPotions.BLAST_POTION.get(), Items.GLOWSTONE_DUST, ModPotions.STRONG_BLAST_POTION.get()); - PotionBrewing.addMix(ModPotions.BLAST_POTION.get(), Items.REDSTONE, ModPotions.LONG_BLAST_POTION.get()); - - PotionBrewing.addMix(Potions.AWKWARD, BlockRegistry.FROSTAYA_POD.asItem(), ModPotions.FREEZING_POTION.get()); - PotionBrewing.addMix(ModPotions.FREEZING_POTION.get(), Items.GLOWSTONE_DUST, ModPotions.STRONG_FREEZING_POTION.get()); - PotionBrewing.addMix(ModPotions.FREEZING_POTION.get(), Items.REDSTONE, ModPotions.LONG_FREEZING_POTION.get()); - - PotionBrewing.addMix(Potions.AWKWARD, BlockRegistry.BASTION_POD.asItem(), ModPotions.DEFENCE_POTION.get()); - PotionBrewing.addMix(ModPotions.DEFENCE_POTION.get(), Items.GLOWSTONE_DUST, ModPotions.STRONG_DEFENCE_POTION.get()); - PotionBrewing.addMix(ModPotions.DEFENCE_POTION.get(), Items.REDSTONE, ModPotions.LONG_DEFENCE_POTION.get()); - - PotionBrewing.addMix(Potions.WATER, ItemsRegistry.WILDEN_WING.get(), Potions.LEAPING); - PotionBrewing.addMix(Potions.WATER, ItemsRegistry.WILDEN_HORN.get(), Potions.STRENGTH); - PotionBrewing.addMix(Potions.WATER, ItemsRegistry.WILDEN_SPIKE.get(), Potions.LONG_WATER_BREATHING); + public static final DeferredHolder IMMOLATE_EFFECT = EFFECTS.register(IMMOLATE, ImmolateEffect::new); + public static final DeferredHolder BOUNCE_EFFECT = EFFECTS.register(BOUNCE, BounceEffect::new); + public static final DeferredHolder MAGIC_FIND_EFFECT = EFFECTS.register(MAGIC_FIND, MagicFindEffect::new); + + public static final DeferredHolder RECOVERY_EFFECT = EFFECTS.register(RECOVERY, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, new ParticleColor(0, 200, 40).getColor())); + public static final DeferredHolder BLAST_EFFECT = EFFECTS.register(BLAST, BlastEffect::new); + public static final DeferredHolder FREEZING_EFFECT = EFFECTS.register(FREEZING, FreezingEffect::new); + public static final DeferredHolder DEFENCE_EFFECT = EFFECTS.register(DEFENCE, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, new ParticleColor(150, 0, 150).getColor())); + + public static final DeferredHolder MANA_REGEN_POTION = POTIONS.register(potion(MANA_REGEN), () -> new Potion(new MobEffectInstance(MANA_REGEN_EFFECT, 3600))); + public static final DeferredHolder LONG_MANA_REGEN_POTION = POTIONS.register(longPotion(MANA_REGEN), () -> new Potion(new MobEffectInstance(MANA_REGEN_EFFECT, 9600))); + public static final DeferredHolder STRONG_MANA_REGEN_POTION = POTIONS.register(strongPotion(MANA_REGEN), () -> new Potion(new MobEffectInstance(MANA_REGEN_EFFECT, 3600, 1))); + + public static final DeferredHolder SPELL_DAMAGE_POTION = POTIONS.register(potion(SPELL_DAMAGE), () -> new Potion(new MobEffectInstance(SPELL_DAMAGE_EFFECT, 3600))); + public static final DeferredHolder SPELL_DAMAGE_POTION_LONG = POTIONS.register(longPotion(SPELL_DAMAGE), () -> new Potion(new MobEffectInstance(SPELL_DAMAGE_EFFECT, 9600))); + public static final DeferredHolder SPELL_DAMAGE_POTION_STRONG = POTIONS.register(strongPotion(SPELL_DAMAGE), () -> new Potion(new MobEffectInstance(SPELL_DAMAGE_EFFECT, 3600, 1))); + + public static final DeferredHolder RECOVERY_POTION = POTIONS.register(potion(RECOVERY), () -> new Potion(new MobEffectInstance(RECOVERY_EFFECT, 3600))); + public static final DeferredHolder LONG_RECOVERY_POTION = POTIONS.register(longPotion(RECOVERY), () -> new Potion(new MobEffectInstance(RECOVERY_EFFECT, 9600))); + public static final DeferredHolder STRONG_RECOVERY_POTION = POTIONS.register(strongPotion(RECOVERY), () -> new Potion(new MobEffectInstance(RECOVERY_EFFECT, 3600, 1))); + + public static final DeferredHolder BLAST_POTION = POTIONS.register(potion(BLAST), () -> new Potion(new MobEffectInstance(BLAST_EFFECT, 200))); + public static final DeferredHolder LONG_BLAST_POTION = POTIONS.register(longPotion(BLAST), () -> new Potion(new MobEffectInstance(BLAST_EFFECT, 400))); + public static final DeferredHolder STRONG_BLAST_POTION = POTIONS.register(strongPotion(BLAST), () -> new Potion(new MobEffectInstance(BLAST_EFFECT, 140, 1))); + + public static final DeferredHolder FREEZING_POTION = POTIONS.register(potion(FREEZING), () -> new Potion(new MobEffectInstance(FREEZING_EFFECT, 1800))); + public static final DeferredHolder LONG_FREEZING_POTION = POTIONS.register(longPotion(FREEZING), () -> new Potion(new MobEffectInstance(FREEZING_EFFECT, 3600))); + public static final DeferredHolder STRONG_FREEZING_POTION = POTIONS.register(strongPotion(FREEZING), () -> new Potion(new MobEffectInstance(FREEZING_EFFECT, 1800, 1))); + + public static final DeferredHolder DEFENCE_POTION = POTIONS.register(potion(DEFENCE), () -> new Potion(new MobEffectInstance(DEFENCE_EFFECT, 3600))); + public static final DeferredHolder LONG_DEFENCE_POTION = POTIONS.register(longPotion(DEFENCE), () -> new Potion(new MobEffectInstance(DEFENCE_EFFECT, 9600))); + public static final DeferredHolder STRONG_DEFENCE_POTION = POTIONS.register(strongPotion(DEFENCE), () -> new Potion(new MobEffectInstance(DEFENCE_EFFECT, 3600, 1))); + + @SubscribeEvent + private static void addRecipes(final RegisterBrewingRecipesEvent event) { + PotionBrewing.Builder builder = event.getBuilder(); + builder.addMix(Potions.WATER, ItemsRegistry.ABJURATION_ESSENCE.get(), Potions.AWKWARD); + builder.addMix(Potions.AWKWARD, ItemsRegistry.MAGE_BLOOM.get(), ModPotions.SPELL_DAMAGE_POTION); + + builder.addMix(ModPotions.SPELL_DAMAGE_POTION, Items.GLOWSTONE_DUST, ModPotions.SPELL_DAMAGE_POTION_STRONG); + builder.addMix(ModPotions.SPELL_DAMAGE_POTION, Items.REDSTONE, ModPotions.SPELL_DAMAGE_POTION_LONG); + + builder.addMix(Potions.AWKWARD, BlockRegistry.SOURCEBERRY_BUSH.asItem(), ModPotions.MANA_REGEN_POTION); + builder.addMix(ModPotions.MANA_REGEN_POTION, Items.GLOWSTONE_DUST, ModPotions.STRONG_MANA_REGEN_POTION); + builder.addMix(ModPotions.MANA_REGEN_POTION, Items.REDSTONE, ModPotions.LONG_MANA_REGEN_POTION); + + builder.addMix(Potions.AWKWARD, BlockRegistry.MENDOSTEEN_POD.asItem(), ModPotions.RECOVERY_POTION); + builder.addMix(ModPotions.RECOVERY_POTION, Items.GLOWSTONE_DUST, ModPotions.STRONG_RECOVERY_POTION); + builder.addMix(ModPotions.RECOVERY_POTION, Items.REDSTONE, ModPotions.LONG_RECOVERY_POTION); + + builder.addMix(Potions.AWKWARD, BlockRegistry.BOMBEGRANTE_POD.asItem(), ModPotions.BLAST_POTION); + builder.addMix(ModPotions.BLAST_POTION, Items.GLOWSTONE_DUST, ModPotions.STRONG_BLAST_POTION); + builder.addMix(ModPotions.BLAST_POTION, Items.REDSTONE, ModPotions.LONG_BLAST_POTION); + + builder.addMix(Potions.AWKWARD, BlockRegistry.FROSTAYA_POD.asItem(), ModPotions.FREEZING_POTION); + builder.addMix(ModPotions.FREEZING_POTION, Items.GLOWSTONE_DUST, ModPotions.STRONG_FREEZING_POTION); + builder.addMix(ModPotions.FREEZING_POTION, Items.REDSTONE, ModPotions.LONG_FREEZING_POTION); + + builder.addMix(Potions.AWKWARD, BlockRegistry.BASTION_POD.asItem(), ModPotions.DEFENCE_POTION); + builder.addMix(ModPotions.DEFENCE_POTION, Items.GLOWSTONE_DUST, ModPotions.STRONG_DEFENCE_POTION); + builder.addMix(ModPotions.DEFENCE_POTION, Items.REDSTONE, ModPotions.LONG_DEFENCE_POTION); + + builder.addMix(Potions.WATER, ItemsRegistry.WILDEN_WING.get(), Potions.LEAPING); + builder.addMix(Potions.WATER, ItemsRegistry.WILDEN_HORN.get(), Potions.STRENGTH); + builder.addMix(Potions.WATER, ItemsRegistry.WILDEN_SPIKE.get(), Potions.LONG_WATER_BREATHING); } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java index aac4b84deb..0133491ea1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java @@ -8,22 +8,22 @@ import com.hollingsworth.arsnouveau.api.recipe.SummonRitualRecipe; import com.hollingsworth.arsnouveau.common.crafting.recipes.*; import com.hollingsworth.arsnouveau.common.tomes.CasterTomeData; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; @SuppressWarnings("Convert2MethodRef") -@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD) public class RecipeRegistry { - public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(ForgeRegistries.Keys.RECIPE_SERIALIZERS, MODID); - public static final DeferredRegister> RECIPE_TYPES = DeferredRegister.create(ForgeRegistries.Keys.RECIPE_TYPES, MODID); + public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(BuiltInRegistries.RECIPE_SERIALIZER, MODID); + public static final DeferredRegister> RECIPE_TYPES = DeferredRegister.create(BuiltInRegistries.RECIPE_TYPE, MODID); public static final String ENCHANTING_APPARATUS_RECIPE_ID = "enchanting_apparatus"; public static final String ENCHANTMENT_RECIPE_ID = "enchantment"; @@ -40,59 +40,62 @@ public class RecipeRegistry { public static final String DISPEL_ENTITY_RECIPE_ID = "dispel_entity"; public static final String SCRY_RITUAL_RECIPE_ID = "scry_ritual"; - public static final RegistryObject> APPARATUS_TYPE = RECIPE_TYPES.register(ENCHANTING_APPARATUS_RECIPE_ID, () -> new ModRecipeType<>()); - public static final RegistryObject> APPARATUS_SERIALIZER = RECIPE_SERIALIZERS.register(ENCHANTING_APPARATUS_RECIPE_ID, () -> new EnchantingApparatusRecipe.Serializer()); + public static final DeferredHolder, ModRecipeType> APPARATUS_TYPE = RECIPE_TYPES.register(ENCHANTING_APPARATUS_RECIPE_ID, () -> new ModRecipeType<>()); + public static final DeferredHolder, EnchantingApparatusRecipe.Serializer> APPARATUS_SERIALIZER = RECIPE_SERIALIZERS.register(ENCHANTING_APPARATUS_RECIPE_ID, () -> new EnchantingApparatusRecipe.Serializer()); - public static final RegistryObject> ENCHANTMENT_TYPE = RECIPE_TYPES.register(ENCHANTMENT_RECIPE_ID, () -> new ModRecipeType<>()); - public static final RegistryObject> ENCHANTMENT_SERIALIZER = RECIPE_SERIALIZERS.register(ENCHANTMENT_RECIPE_ID, () -> new EnchantmentRecipe.Serializer()); + public static final DeferredHolder, ModRecipeType> ENCHANTMENT_TYPE = RECIPE_TYPES.register(ENCHANTMENT_RECIPE_ID, () -> new ModRecipeType<>()); + public static final DeferredHolder, EnchantmentRecipe.Serializer> ENCHANTMENT_SERIALIZER = RECIPE_SERIALIZERS.register(ENCHANTMENT_RECIPE_ID, () -> new EnchantmentRecipe.Serializer()); - public static final RegistryObject> CRUSH_TYPE = RECIPE_TYPES.register(CRUSH_RECIPE_ID, () -> new ModRecipeType<>()); - public static final RegistryObject> CRUSH_SERIALIZER = RECIPE_SERIALIZERS.register(CRUSH_RECIPE_ID, () -> new CrushRecipe.Serializer()); + public static final DeferredHolder, ModRecipeType> CRUSH_TYPE = RECIPE_TYPES.register(CRUSH_RECIPE_ID, () -> new ModRecipeType<>()); + public static final DeferredHolder, CrushRecipe.Serializer> CRUSH_SERIALIZER = RECIPE_SERIALIZERS.register(CRUSH_RECIPE_ID, () -> new CrushRecipe.Serializer()); - public static final RegistryObject> IMBUEMENT_TYPE = RECIPE_TYPES.register(IMBUEMENT_RECIPE_ID, () -> new ModRecipeType<>()); - public static final RegistryObject> IMBUEMENT_SERIALIZER = RECIPE_SERIALIZERS.register(IMBUEMENT_RECIPE_ID, () -> new ImbuementRecipe.Serializer()); + public static final DeferredHolder, ModRecipeType> IMBUEMENT_TYPE = RECIPE_TYPES.register(IMBUEMENT_RECIPE_ID, () -> new ModRecipeType<>()); + public static final DeferredHolder, ImbuementRecipe.Serializer> IMBUEMENT_SERIALIZER = RECIPE_SERIALIZERS.register(IMBUEMENT_RECIPE_ID, () -> new ImbuementRecipe.Serializer()); - public static final RegistryObject> BOOK_UPGRADE_TYPE = RECIPE_TYPES.register("book_upgrade", () -> new ModRecipeType<>()); - public static final RegistryObject> BOOK_UPGRADE_RECIPE = RECIPE_SERIALIZERS.register("book_upgrade", () -> new BookUpgradeRecipe.Serializer()); + public static final DeferredHolder, ModRecipeType> BOOK_UPGRADE_TYPE = RECIPE_TYPES.register("book_upgrade", () -> new ModRecipeType<>()); + public static final DeferredHolder, BookUpgradeRecipe.Serializer> BOOK_UPGRADE_RECIPE = RECIPE_SERIALIZERS.register("book_upgrade", () -> new BookUpgradeRecipe.Serializer()); - public static final RegistryObject> POTION_FLASK_TYPE = RECIPE_TYPES.register("potion_flask", () -> new ModRecipeType<>()); - public static final RegistryObject> POTION_FLASK_RECIPE = RECIPE_SERIALIZERS.register("potion_flask", () -> new PotionFlaskRecipe.Serializer()); + public static final DeferredHolder, ModRecipeType> POTION_FLASK_TYPE = RECIPE_TYPES.register("potion_flask", () -> new ModRecipeType<>()); + public static final DeferredHolder, PotionFlaskRecipe.Serializer> POTION_FLASK_RECIPE = RECIPE_SERIALIZERS.register("potion_flask", () -> new PotionFlaskRecipe.Serializer()); - public static final RegistryObject> DYE_TYPE = RECIPE_TYPES.register(DYE_RECIPE_ID, () -> new ModRecipeType<>()); - public static final RegistryObject> DYE_RECIPE = RECIPE_SERIALIZERS.register(DYE_RECIPE_ID, () -> new DyeRecipe.Serializer()); + public static final DeferredHolder, ModRecipeType> DYE_TYPE = RECIPE_TYPES.register(DYE_RECIPE_ID, () -> new ModRecipeType<>()); + public static final DeferredHolder, DyeRecipe.Serializer> DYE_RECIPE = RECIPE_SERIALIZERS.register(DYE_RECIPE_ID, () -> new DyeRecipe.Serializer()); - public static final RegistryObject> REACTIVE_TYPE = RECIPE_TYPES.register(REACTIVE_RECIPE_ID, () -> new ModRecipeType<>()); - public static final RegistryObject> REACTIVE_RECIPE = RECIPE_SERIALIZERS.register(REACTIVE_RECIPE_ID, () -> new ReactiveEnchantmentRecipe.Serializer()); + public static final DeferredHolder, ModRecipeType> REACTIVE_TYPE = RECIPE_TYPES.register(REACTIVE_RECIPE_ID, () -> new ModRecipeType<>()); + public static final DeferredHolder, ReactiveEnchantmentRecipe.Serializer> REACTIVE_RECIPE = RECIPE_SERIALIZERS.register(REACTIVE_RECIPE_ID, () -> new ReactiveEnchantmentRecipe.Serializer()); - public static final RegistryObject> SPELL_WRITE_TYPE = RECIPE_TYPES.register(SPELL_WRITE_RECIPE_ID, () -> new ModRecipeType<>()); - public static final RegistryObject> SPELL_WRITE_RECIPE = RECIPE_SERIALIZERS.register(SPELL_WRITE_RECIPE_ID, () -> new SpellWriteRecipe.Serializer()); + public static final DeferredHolder, ModRecipeType> SPELL_WRITE_TYPE = RECIPE_TYPES.register(SPELL_WRITE_RECIPE_ID, () -> new ModRecipeType<>()); + public static final DeferredHolder, SpellWriteRecipe.Serializer> SPELL_WRITE_RECIPE = RECIPE_SERIALIZERS.register(SPELL_WRITE_RECIPE_ID, () -> new SpellWriteRecipe.Serializer()); - public static final RegistryObject> GLYPH_TYPE = RECIPE_TYPES.register(GLYPH_RECIPE_ID, () -> new ModRecipeType<>()); - public static final RegistryObject> GLYPH_SERIALIZER = RECIPE_SERIALIZERS.register(GLYPH_RECIPE_ID, () -> new GlyphRecipe.Serializer()); + public static final DeferredHolder, ModRecipeType> GLYPH_TYPE = RECIPE_TYPES.register(GLYPH_RECIPE_ID, () -> new ModRecipeType<>()); + public static final DeferredHolder, GlyphRecipe.Serializer> GLYPH_SERIALIZER = RECIPE_SERIALIZERS.register(GLYPH_RECIPE_ID, () -> new GlyphRecipe.Serializer()); - public static final RegistryObject> ARMOR_UPGRADE_TYPE = RECIPE_TYPES.register(ARMOR_RECIPE_ID, () -> new ModRecipeType<>()); - public static final RegistryObject> ARMOR_SERIALIZER = RECIPE_SERIALIZERS.register(ARMOR_RECIPE_ID, () -> new ArmorUpgradeRecipe.Serializer()); + public static final DeferredHolder, ModRecipeType> ARMOR_UPGRADE_TYPE = RECIPE_TYPES.register(ARMOR_RECIPE_ID, () -> new ModRecipeType<>()); + public static final DeferredHolder, ArmorUpgradeRecipe.Serializer> ARMOR_SERIALIZER = RECIPE_SERIALIZERS.register(ARMOR_RECIPE_ID, () -> new ArmorUpgradeRecipe.Serializer()); - public static final RegistryObject> CASTER_TOME_TYPE = RECIPE_TYPES.register(TOME_DATAPACK, () -> new ModRecipeType<>()); - public static final RegistryObject> CASTER_TOME_SERIALIZER = RECIPE_SERIALIZERS.register(TOME_DATAPACK, () -> new CasterTomeData.Serializer()); + public static final DeferredHolder, ModRecipeType> CASTER_TOME_TYPE = RECIPE_TYPES.register(TOME_DATAPACK, () -> new ModRecipeType<>()); + public static final DeferredHolder, CasterTomeData.Serializer> CASTER_TOME_SERIALIZER = RECIPE_SERIALIZERS.register(TOME_DATAPACK, () -> new CasterTomeData.Serializer()); - public static final RegistryObject> SUMMON_RITUAL_TYPE = RECIPE_TYPES.register(SUMMON_RITUAL_DATAPACK, () -> new ModRecipeType<>()); - public static final RegistryObject> SUMMON_RITUAL_SERIALIZER = RECIPE_SERIALIZERS.register(SUMMON_RITUAL_DATAPACK, () -> new SummonRitualRecipe.Serializer()); - public static final RegistryObject> BUDDING_CONVERSION_TYPE = RECIPE_TYPES.register(BUDDING_CONVERSION_RECIPE_ID, () -> new ModRecipeType<>()); - public static final RegistryObject> BUDDING_CONVERSION_SERIALIZER = RECIPE_SERIALIZERS.register(BUDDING_CONVERSION_RECIPE_ID, () -> new BuddingConversionRecipe.Serializer()); - public static final RegistryObject> DISPEL_ENTITY_TYPE = RECIPE_TYPES.register(DISPEL_ENTITY_RECIPE_ID, () -> new ModRecipeType<>()); - public static final RegistryObject> DISPEL_ENTITY_SERIALIZER = RECIPE_SERIALIZERS.register(DISPEL_ENTITY_RECIPE_ID, () -> new DispelEntityRecipe.Serializer()); - public static final RegistryObject> SCRY_RITUAL_TYPE = RECIPE_TYPES.register(SCRY_RITUAL_RECIPE_ID, () -> new ModRecipeType<>()); - public static final RegistryObject> SCRY_RITUAL_SERIALIZER = RECIPE_SERIALIZERS.register(SCRY_RITUAL_RECIPE_ID, () -> new ScryRitualRecipe.Serializer()); - private static class ModRecipeType> implements RecipeType { + public static final DeferredHolder, ModRecipeType> SUMMON_RITUAL_TYPE = RECIPE_TYPES.register(SUMMON_RITUAL_DATAPACK, () -> new ModRecipeType<>()); + public static final DeferredHolder, SummonRitualRecipe.Serializer> SUMMON_RITUAL_SERIALIZER = RECIPE_SERIALIZERS.register(SUMMON_RITUAL_DATAPACK, () -> new SummonRitualRecipe.Serializer()); + + public static final DeferredHolder, ModRecipeType> BUDDING_CONVERSION_TYPE = RECIPE_TYPES.register(BUDDING_CONVERSION_RECIPE_ID, () -> new ModRecipeType<>()); + public static final DeferredHolder, BuddingConversionRecipe.Serializer> BUDDING_CONVERSION_SERIALIZER = RECIPE_SERIALIZERS.register(BUDDING_CONVERSION_RECIPE_ID, () -> new BuddingConversionRecipe.Serializer()); + public static final DeferredHolder, ModRecipeType> DISPEL_ENTITY_TYPE = RECIPE_TYPES.register(DISPEL_ENTITY_RECIPE_ID, () -> new ModRecipeType<>()); + public static final DeferredHolder, DispelEntityRecipe.Serializer> DISPEL_ENTITY_SERIALIZER = RECIPE_SERIALIZERS.register(DISPEL_ENTITY_RECIPE_ID, () -> new DispelEntityRecipe.Serializer()); + public static final DeferredHolder, ModRecipeType> SCRY_RITUAL_TYPE = RECIPE_TYPES.register(SCRY_RITUAL_RECIPE_ID, () -> new ModRecipeType<>()); + public static final DeferredHolder, ScryRitualRecipe.Serializer> SCRY_RITUAL_SERIALIZER = RECIPE_SERIALIZERS.register(SCRY_RITUAL_RECIPE_ID, () -> new ScryRitualRecipe.Serializer()); + + + public static class ModRecipeType> implements RecipeType { @Override public String toString() { - return ForgeRegistries.RECIPE_TYPES.getKey(this).toString(); + return BuiltInRegistries.RECIPE_TYPE.getKey(this).toString(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RegistryHelper.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RegistryHelper.java index 5b8e16ed64..12567cf9f7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RegistryHelper.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RegistryHelper.java @@ -1,33 +1,32 @@ package com.hollingsworth.arsnouveau.setup.registry; import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.Item; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.level.block.Block; -import net.minecraftforge.registries.ForgeRegistries; public class RegistryHelper { public static ResourceLocation getRegistryName(Item i) { - return ForgeRegistries.ITEMS.getKey(i); + return BuiltInRegistries.ITEM.getKey(i); } public static ResourceLocation getRegistryName(Block b) { - return ForgeRegistries.BLOCKS.getKey(b); + return BuiltInRegistries.BLOCK.getKey(b); } public static ResourceLocation getRegistryName(EntityType i) { - return ForgeRegistries.ENTITY_TYPES.getKey(i); + return BuiltInRegistries.ENTITY_TYPE.getKey(i); } public static ResourceLocation getRegistryName(Enchantment e) { - return ForgeRegistries.ENCHANTMENTS.getKey(e); + return BuiltInRegistries.ENCHANTMENT.getKey(e); } public static ResourceLocation getRegistryName(ParticleType type) { - return ForgeRegistries.PARTICLE_TYPES.getKey(type); + return BuiltInRegistries.PARTICLE_TYPE.getKey(type); } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java index 8a77249d15..6647ea2b44 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java @@ -2,16 +2,16 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.sound.SpellSound; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; -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; import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; public class SoundRegistry { - public static final DeferredRegister SOUND_REG = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, MODID); + public static final DeferredRegister SOUND_REG = DeferredRegister.create(BuiltInRegistries.SOUND_EVENT, MODID); public static final String DEFAULT_SOUND_LIB = "fire_family"; public static final String GAIA_SOUND_LIB = "gaia_family"; public static final String TEMPESTRY_SOUND_LIB = "tempestry_family"; @@ -21,17 +21,17 @@ public class SoundRegistry { public static final String EA_CHANNEL = "ea_channel"; public static final String EA_FINISH = "ea_finish"; - public static RegistryObject DEFAULT_FAMILY = SOUND_REG.register(DEFAULT_SOUND_LIB, () -> makeSound(DEFAULT_SOUND_LIB)); - public static RegistryObject EMPTY_SOUND_FAMILY = SOUND_REG.register(NO_SOUND_LIB, () -> makeSound(NO_SOUND_LIB)); - public static RegistryObject APPARATUS_CHANNEL = SOUND_REG.register(EA_CHANNEL, () -> makeSound(EA_CHANNEL)); - public static RegistryObject APPARATUS_FINISH = SOUND_REG.register(EA_FINISH, () -> makeSound(EA_FINISH)); - - public static RegistryObject GAIA_FAMILY = SOUND_REG.register(GAIA_SOUND_LIB, () -> makeSound(GAIA_SOUND_LIB)); - public static RegistryObject TEMPESTRY_FAMILY = SOUND_REG.register(TEMPESTRY_SOUND_LIB, () -> makeSound(TEMPESTRY_SOUND_LIB)); - public static RegistryObject FIRE_FAMILY = SOUND_REG.register(FIRE_SOUND_LIB, () -> makeSound(FIRE_SOUND_LIB)); - public static RegistryObject ARIA_BIBLIO = SOUND_REG.register("aria_biblio", () -> makeSound("aria_biblio")); - public static RegistryObject WILD_HUNT = SOUND_REG.register("firel_the_wild_hunt", () -> makeSound("firel_the_wild_hunt")); - public static RegistryObject SOUND_OF_GLASS = SOUND_REG.register("thistle_the_sound_of_glass", () -> makeSound("thistle_the_sound_of_glass")); + public static DeferredHolder DEFAULT_FAMILY = SOUND_REG.register(DEFAULT_SOUND_LIB, () -> makeSound(DEFAULT_SOUND_LIB)); + public static DeferredHolder EMPTY_SOUND_FAMILY = SOUND_REG.register(NO_SOUND_LIB, () -> makeSound(NO_SOUND_LIB)); + public static DeferredHolder APPARATUS_CHANNEL = SOUND_REG.register(EA_CHANNEL, () -> makeSound(EA_CHANNEL)); + public static DeferredHolder APPARATUS_FINISH = SOUND_REG.register(EA_FINISH, () -> makeSound(EA_FINISH)); + + public static DeferredHolder GAIA_FAMILY = SOUND_REG.register(GAIA_SOUND_LIB, () -> makeSound(GAIA_SOUND_LIB)); + public static DeferredHolder TEMPESTRY_FAMILY = SOUND_REG.register(TEMPESTRY_SOUND_LIB, () -> makeSound(TEMPESTRY_SOUND_LIB)); + public static DeferredHolder FIRE_FAMILY = SOUND_REG.register(FIRE_SOUND_LIB, () -> makeSound(FIRE_SOUND_LIB)); + public static DeferredHolder ARIA_BIBLIO = SOUND_REG.register("aria_biblio", () -> makeSound("aria_biblio")); + public static DeferredHolder WILD_HUNT = SOUND_REG.register("firel_the_wild_hunt", () -> makeSound("firel_the_wild_hunt")); + public static DeferredHolder SOUND_OF_GLASS = SOUND_REG.register("thistle_the_sound_of_glass", () -> makeSound("thistle_the_sound_of_glass")); public static SpellSound DEFAULT_SPELL_SOUND; diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/StructureRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/StructureRegistry.java index d8137aa805..cbf98e3431 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/StructureRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/StructureRegistry.java @@ -7,16 +7,15 @@ import net.minecraft.core.registries.Registries; import net.minecraft.world.level.levelgen.structure.StructureType; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; public class StructureRegistry { public static final DeferredRegister> STRUCTURES = DeferredRegister.create(Registries.STRUCTURE_TYPE, ArsNouveau.MODID); - public static final RegistryObject> WILDEN_DEN = STRUCTURES.register("wilden_den", () -> () -> WildenDen.CODEC); - public static final RegistryObject> WILDEN_GUARDIAN_DEN = STRUCTURES.register("wilden_guardian_den", () -> () -> WildenGuardianDen.CODEC); + public static final DeferredHolder, StructureType> WILDEN_DEN = STRUCTURES.register("wilden_den", () -> () -> WildenDen.CODEC); + public static final DeferredHolder, StructureType> WILDEN_GUARDIAN_DEN = STRUCTURES.register("wilden_guardian_den", () -> () -> WildenGuardianDen.CODEC); public static final DeferredRegister> STRUCTURE_PROCESSOR = DeferredRegister.create(Registries.STRUCTURE_PROCESSOR, ArsNouveau.MODID); - public static final RegistryObject> WATERLOGGING_FIX_PROCESSOR = STRUCTURE_PROCESSOR.register("waterlogging_fix", () -> () -> WaterloggingFixProcessor.CODEC); - + public static final DeferredHolder, StructureProcessorType> WATERLOGGING_FIX_PROCESSOR = STRUCTURE_PROCESSOR.register("waterlogging_fix", () -> () -> WaterloggingFixProcessor.CODEC); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/VillagerRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/VillagerRegistry.java index 5afa687f29..ff4f37b24f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/VillagerRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/VillagerRegistry.java @@ -2,25 +2,21 @@ import com.google.common.collect.ImmutableSet; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.entity.ai.village.poi.PoiType; import net.minecraft.world.entity.npc.VillagerProfession; -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; public class VillagerRegistry { static String ARS_TRADER = "shady_wizard"; + public static final DeferredRegister VILLAGERS = DeferredRegister.create(BuiltInRegistries.VILLAGER_PROFESSION, ArsNouveau.MODID); + public static final DeferredRegister POIs = DeferredRegister.create(BuiltInRegistries.POINT_OF_INTEREST_TYPE, ArsNouveau.MODID); - - public static final DeferredRegister VILLAGERS = DeferredRegister.create(ForgeRegistries.VILLAGER_PROFESSIONS, ArsNouveau.MODID); - - public static final DeferredRegister POIs = DeferredRegister.create(ForgeRegistries.POI_TYPES, ArsNouveau.MODID); - - public static final RegistryObject ARCANE_POI = POIs.register("arcane_poi", () -> new PoiType(ImmutableSet.copyOf(BlockRegistry.ARCANE_CORE_BLOCK.get().getStateDefinition().getPossibleStates()),1,1)); - public static final RegistryObject SHARDS_TRADER = VILLAGERS.register(ARS_TRADER, () -> new VillagerProfession(ARS_TRADER, (x) -> x.get() == ARCANE_POI.get(), (x) -> x.get() == ARCANE_POI.get(), ImmutableSet.of(), ImmutableSet.of(), SoundEvents.VILLAGER_WORK_CLERIC)); + public static final DeferredHolder ARCANE_POI = POIs.register("arcane_poi", () -> new PoiType(ImmutableSet.copyOf(BlockRegistry.ARCANE_CORE_BLOCK.get().getStateDefinition().getPossibleStates()),1,1)); + public static final DeferredHolder SHARDS_TRADER = VILLAGERS.register(ARS_TRADER, () -> new VillagerProfession(ARS_TRADER, (x) -> x.value() == ARCANE_POI.get(), (x) -> x.value() == ARCANE_POI.get(), ImmutableSet.of(), ImmutableSet.of(), SoundEvents.VILLAGER_WORK_CLERIC)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/WorldgenRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/WorldgenRegistry.java index c3fc6e55a0..7d8625a0b4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/WorldgenRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/WorldgenRegistry.java @@ -9,8 +9,9 @@ import com.hollingsworth.arsnouveau.setup.config.Config; import net.minecraft.core.HolderGetter; import net.minecraft.core.HolderSet; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; -import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.data.worldgen.features.FeatureUtils; import net.minecraft.data.worldgen.features.VegetationFeatures; import net.minecraft.data.worldgen.placement.PlacementUtils; @@ -32,18 +33,16 @@ import net.minecraft.world.level.levelgen.placement.InSquarePlacement; import net.minecraft.world.level.levelgen.placement.PlacedFeature; import net.minecraft.world.level.levelgen.placement.RarityFilter; -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; import java.util.List; import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; import static net.minecraft.data.worldgen.placement.VegetationPlacements.worldSurfaceSquaredWithCount; public class WorldgenRegistry { - public static final DeferredRegister> FEAT_REG = DeferredRegister.create(ForgeRegistries.FEATURES, MODID); - public static final RegistryObject> LIGHT_FEATURE = FEAT_REG.register("light_feature", () -> new LightFeature(BlockStateConfiguration.CODEC)); + public static final DeferredRegister> FEAT_REG = DeferredRegister.create(BuiltInRegistries.FEATURE, MODID); + public static final DeferredHolder, LightFeature> LIGHT_FEATURE = FEAT_REG.register("light_feature", () -> new LightFeature(BlockStateConfiguration.CODEC)); public static final ResourceKey> CONFIGURED_CASCADING_TREE = registerConfKey("cascading_tree"); @@ -88,7 +87,7 @@ public static ResourceKey registerPlacedKey(String name) { return ResourceKey.create(Registries.PLACED_FEATURE, new ResourceLocation(MODID, name)); } - public static void bootstrapConfiguredFeatures(BootstapContext> context) { + public static void bootstrapConfiguredFeatures(BootstrapContext> context) { HolderGetter placed = context.lookup(Registries.PLACED_FEATURE); context.register(CONFIGURED_CASCADING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.CASCADING_LEAVES, LibBlockNames.CASCADING_LOG, false, new ResourceLocation(ArsNouveau.MODID, LibBlockNames.FROSTAYA_POD)))); context.register(CONFIGURED_BLAZING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.BLAZING_LEAVES, LibBlockNames.BLAZING_LOG, false, new ResourceLocation(ArsNouveau.MODID, LibBlockNames.BOMBEGRANATE_POD)))); @@ -99,12 +98,12 @@ public static void bootstrapConfiguredFeatures(BootstapContext(Feature.TREE, buildTree(LibBlockNames.BLAZING_LEAVES, LibBlockNames.BLAZING_LOG, true, new ResourceLocation(ArsNouveau.MODID, LibBlockNames.BOMBEGRANATE_POD)))); context.register(NATURAL_CONFIGURED_VEXING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.VEXING_LEAVES, LibBlockNames.VEXING_LOG, true, new ResourceLocation(ArsNouveau.MODID, LibBlockNames.BASTION_POD)))); context.register(NATURAL_CONFIGURED_FLOURISHING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.FLOURISHING_LEAVES, LibBlockNames.FLOURISHING_LOG, true, new ResourceLocation(ArsNouveau.MODID, LibBlockNames.MENDOSTEEN_POD)))); - context.register(PATCH_BERRY_BUSH, new ConfiguredFeature<>(Feature.RANDOM_PATCH, FeatureUtils.simplePatchConfiguration(Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration(BlockStateProvider.simple(ForgeRegistries.BLOCKS.getValue(new ResourceLocation(ArsNouveau.MODID, LibBlockNames.SOURCEBERRY_BUSH)).defaultBlockState().setValue(SourceBerryBush.AGE, 3))), List.of(Blocks.GRASS_BLOCK)))); + context.register(PATCH_BERRY_BUSH, new ConfiguredFeature<>(Feature.RANDOM_PATCH, FeatureUtils.simplePatchConfiguration(Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration(BlockStateProvider.simple(BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, LibBlockNames.SOURCEBERRY_BUSH)).defaultBlockState().setValue(SourceBerryBush.AGE, 3))), List.of(Blocks.GRASS_BLOCK)))); context.register(MIXED_ARCHWOODS, new ConfiguredFeature<>(Feature.SIMPLE_RANDOM_SELECTOR, new SimpleRandomFeatureConfiguration(HolderSet.direct(placed.getOrThrow(PLACED_NATURAL_CASCADING_TREE), placed.getOrThrow(PLACED_NATURAL_BLAZING_TREE), placed.getOrThrow(PLACED_NATURAL_VEXING_TREE), placed.getOrThrow(PLACED_NATURAL_FLOURISHING_TREE))))); context.register(CONFIGURED_LIGHTS, new ConfiguredFeature<>(WorldgenRegistry.LIGHT_FEATURE.get(), new BlockStateConfiguration(BlockRegistry.LIGHT_BLOCK.get().defaultBlockState()))); } - public static void bootstrapPlacedFeatures(BootstapContext context) { + public static void bootstrapPlacedFeatures(BootstrapContext context) { HolderGetter> features = context.lookup(Registries.CONFIGURED_FEATURE); context.register(PLACED_BERRY_BUSH, new PlacedFeature(features.get(PATCH_BERRY_BUSH).get(), List.of(RarityFilter.onAverageOnceEvery(32), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome()))); context.register(PLACED_NATURAL_CASCADING_TREE, new PlacedFeature(features.get(NATURAL_CONFIGURED_CASCADING_TREE).get(), List.of(PlacementUtils.filteredByBlockSurvival(BlockRegistry.CASCADING_SAPLING.get())))); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/reward/Rewards.java b/src/main/java/com/hollingsworth/arsnouveau/setup/reward/Rewards.java index ae822a4ec4..5c82e713e1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/reward/Rewards.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/reward/Rewards.java @@ -5,8 +5,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import net.minecraft.world.item.DyeColor; -import net.minecraftforge.fml.loading.FMLEnvironment; - +import net.neoforged.fml.loading.FMLEnvironment; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 8a97ced2bb..fae1439433 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -66,6 +66,7 @@ public net.minecraft.client.gui.components.AbstractWidget f_93620_ # x public net.minecraft.client.gui.components.AbstractWidget f_93621_ # y public net.minecraft.world.item.ArmorItem f_265987_ # ARMOR_MODIFIER_UUID_PER_TYPE public net.minecraft.world.entity.Entity f_19793_ # maxUpStep +public net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProviderType # Geckolib ATs, do not delete public net.minecraft.client.model.geom.ModelPart$Cube diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/neoforge.mods.toml similarity index 98% rename from src/main/resources/META-INF/mods.toml rename to src/main/resources/META-INF/neoforge.mods.toml index 1f790b1a49..16baa57f52 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -32,7 +32,7 @@ Craft spells, create powerful baubles, and summon magical creatures! # A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. [[dependencies.ars_nouveau]] #optional # the modid of the dependency - modId="forge" #mandatory + modId="neoforge" #mandatory # Does this dependency have to exist - if not, ordering below must be specified mandatory=true #mandatory # The version range of the dependency From 6d9a631f5c9c20f4b5c245e075119a72056e05bb Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Fri, 21 Jun 2024 19:36:11 -0500 Subject: [PATCH 003/363] 1.21 init --- build.gradle | 38 +++---- gradle.properties | 8 +- .../hollingsworth/arsnouveau/ArsNouveau.java | 2 +- .../api/camera/ICameraMountable.java | 1 - .../api/client/CosmeticRenderUtil.java | 8 +- .../ArmorUpgradeRecipe.java | 2 +- .../EnchantingApparatusRecipe.java | 6 +- .../EnchantmentRecipe.java | 2 +- .../SpellWriteRecipe.java | 2 +- .../api/event/FadeLightTimedEvent.java | 1 - .../api/familiar/AbstractFamiliarHolder.java | 2 +- .../api/item/inv/FilterableItemHandler.java | 1 - .../api/item/inv/StorageItemHandler.java | 1 - .../arsnouveau/api/perk/PerkSlot.java | 6 +- .../arsnouveau/api/recipe/IRecipeWrapper.java | 2 - .../api/registry/CasterTomeRegistry.java | 2 +- .../api/scrying/CompoundScryer.java | 2 +- .../api/scrying/SingleBlockScryer.java | 2 +- .../arsnouveau/api/scrying/TagScryer.java | 2 +- .../api/spell/AbstractSpellPart.java | 2 +- .../arsnouveau/api/spell/SpellCaster.java | 2 +- .../arsnouveau/api/spell/SpellContext.java | 3 +- .../arsnouveau/api/spell/SpellTier.java | 8 +- .../api/spell/TurretSpellCaster.java | 2 +- .../arsnouveau/api/util/ManaUtil.java | 5 +- .../AbstractStorageTerminalScreen.java | 13 +-- .../container/CraftingTerminalScreen.java | 12 +- .../arsnouveau/client/gui/BookSlider.java | 4 +- .../arsnouveau/client/gui/GuiManaHUD.java | 14 +-- .../client/gui/PatchouliTooltipEvent.java | 2 +- .../arsnouveau/client/gui/SpellTooltip.java | 2 +- .../arsnouveau/client/gui/book/BaseBook.java | 2 +- .../client/gui/book/GlyphUnlockMenu.java | 22 ++-- .../client/gui/book/GuiColorScreen.java | 4 +- .../client/gui/book/GuiFamiliarScreen.java | 4 +- .../client/gui/book/GuiSettingsScreen.java | 10 +- .../client/gui/book/GuiSpellBook.java | 18 +-- .../client/gui/book/InfinityGuiSpellBook.java | 18 +-- .../client/gui/book/SoundScreen.java | 2 +- .../client/gui/buttons/CraftingButton.java | 2 +- .../client/gui/buttons/FamiliarButton.java | 2 +- .../client/gui/buttons/GlyphButton.java | 4 +- .../client/gui/buttons/GuiImageButton.java | 2 +- .../client/gui/buttons/GuiSpellSlot.java | 2 +- .../client/gui/buttons/ItemButton.java | 2 +- .../gui/buttons/StorageSettingsButton.java | 2 +- .../client/gui/buttons/StorageTabButton.java | 2 +- .../client/gui/buttons/UnlockGlyphButton.java | 6 +- .../client/jei/DyeRecipeCategory.java | 2 +- .../client/jei/JEIArsNouveauPlugin.java | 2 +- .../client/jei/MultiInputCategory.java | 2 +- .../client/particle/ParticleColor.java | 2 +- .../client/particle/RainbowParticleColor.java | 2 +- .../client/registry/ClientHandler.java | 30 ++--- .../client/registry/ModKeyBindings.java | 2 +- .../client/registry/ShaderRegistry.java | 6 +- .../client/renderer/ANGeoModel.java | 4 +- .../renderer/entity/AmethystGolemModel.java | 6 +- .../entity/AmethystGolemRenderer.java | 4 +- .../renderer/entity/AnimBlockRenderer.java | 18 +-- .../client/renderer/entity/BookwyrmModel.java | 12 +- .../renderer/entity/BookwyrmRenderer.java | 6 +- .../entity/ChimeraProjectileModel.java | 6 +- .../client/renderer/entity/DrygmyModel.java | 12 +- .../renderer/entity/GiftStarbyModel.java | 10 +- .../client/renderer/entity/LilyModel.java | 10 +- .../renderer/entity/RenderFlyingItem.java | 2 +- .../renderer/entity/StarbuncleModel.java | 8 +- .../renderer/entity/StarbuncleRenderer.java | 6 +- .../renderer/entity/WealdWalkerModel.java | 10 +- .../renderer/entity/WhirlisprigModel.java | 12 +- .../renderer/entity/WildenChimeraModel.java | 10 +- .../renderer/entity/WildenGuardianModel.java | 10 +- .../renderer/entity/WildenHunterModel.java | 10 +- .../renderer/entity/WildenStalkerModel.java | 10 +- .../client/renderer/entity/WixieModel.java | 12 +- .../entity/familiar/AnimSkullRenderer.java | 4 +- .../entity/familiar/FamiliarStarbyModel.java | 8 +- .../familiar/FamiliarWhirlisprigRenderer.java | 2 +- .../client/renderer/item/ArmorRenderer.java | 2 +- .../renderer/item/ScryCasterRenderer.java | 8 +- .../client/renderer/item/ShieldModel.java | 6 +- .../client/renderer/item/SpellBookModel.java | 10 +- .../renderer/item/SpellBookRenderer.java | 4 +- .../renderer/item/SpellBowRenderer.java | 4 +- .../renderer/item/SpellCrossbowRenderer.java | 4 +- .../client/renderer/item/SwordRenderer.java | 8 +- .../renderer/item/TransformAnimatedModel.java | 2 +- .../client/renderer/item/WandModel.java | 6 +- .../client/renderer/item/WandRenderer.java | 2 +- .../tile/AlterationTableRenderer.java | 4 +- .../renderer/tile/ArchwoodChestRenderer.java | 6 +- .../renderer/tile/BasicTurretRenderer.java | 4 +- .../tile/EnchantedFallingBlockRenderer.java | 2 +- .../tile/EnchantingApparatusRenderer.java | 6 +- .../client/renderer/tile/GenericModel.java | 12 +- .../renderer/tile/PotionMelderModel.java | 6 +- .../renderer/tile/RedstoneRelayRenderer.java | 2 +- .../client/renderer/tile/RepositoryModel.java | 8 +- .../renderer/tile/ScryerOculusRenderer.java | 2 +- .../client/renderer/tile/ScryersEyeModel.java | 8 +- .../client/waila/MobJarComponent.java | 2 +- .../common/armor/AnimatedMagicArmor.java | 6 +- .../common/block/ScryersOculus.java | 2 +- .../common/block/tile/AlterationTile.java | 4 +- .../common/block/tile/ArcaneCoreTile.java | 12 +- .../block/tile/BasicSpellTurretTile.java | 12 +- .../block/tile/CraftingLecternTile.java | 10 +- .../block/tile/EnchantedTurretTile.java | 10 +- .../block/tile/EnchantingApparatusTile.java | 13 ++- .../common/block/tile/ImbuementTile.java | 14 +-- .../common/block/tile/MirrorWeaveTile.java | 4 +- .../common/block/tile/PotionMelderTile.java | 14 +-- .../common/block/tile/RelayTile.java | 14 +-- .../common/block/tile/RepositoryTile.java | 6 +- .../common/block/tile/RitualBrazierTile.java | 4 +- .../common/block/tile/RuneTile.java | 4 +- .../common/block/tile/ScribesTile.java | 14 +-- .../common/block/tile/ScryersOculusTile.java | 4 +- .../common/block/tile/SourcelinkTile.java | 14 +-- .../common/block/tile/SpellSensorTile.java | 2 +- .../common/block/tile/StorageLecternTile.java | 2 +- .../block/tile/TimerSpellTurretTile.java | 10 +- .../block/tile/VolcanicSourcelinkTile.java | 2 +- .../common/block/tile/WhirlisprigTile.java | 20 ++-- .../capability/ANPlayerCapAttacher.java | 2 +- .../common/capability/FamiliarData.java | 2 +- .../common/capability/ManaCapAttacher.java | 2 +- .../common/command/SummonAnimHeadCommand.java | 2 +- .../common/compat/PatchouliHandler.java | 2 +- .../common/crafting/recipes/CrushRecipe.java | 4 +- .../crafting/recipes/ImbuementRecipe.java | 6 +- .../datagen/ApparatusRecipeBuilder.java | 2 +- .../datagen/ApparatusRecipeProvider.java | 2 +- .../common/datagen/AtlasProvider.java | 6 +- .../common/datagen/BiomeTagProvider.java | 8 +- .../common/datagen/BlockStatesDatagen.java | 14 +-- .../common/datagen/BlockTagProvider.java | 56 +++++----- .../datagen/BuddingConversionProvider.java | 2 +- .../common/datagen/CasterTomeProvider.java | 2 +- .../common/datagen/DefaultTableProvider.java | 4 +- .../common/datagen/DispelEntityProvider.java | 2 +- .../common/datagen/DyeRecipeDatagen.java | 2 +- .../common/datagen/ItemModelGenerator.java | 2 +- .../common/datagen/ItemTagProvider.java | 20 ++-- .../common/datagen/PatchouliProvider.java | 75 +++++++------ .../datagen/PlacedFeatureTagProvider.java | 4 +- .../common/datagen/RecipeDatagen.java | 104 +++++++++--------- .../common/datagen/ScryRitualProvider.java | 6 +- .../common/datagen/StructureTagProvider.java | 4 +- .../common/datagen/SummonRitualProvider.java | 2 +- .../common/datagen/WorldgenProvider.java | 2 +- .../datagen/advancement/ANAdvancements.java | 6 +- .../datagen/patchouli/ApparatusPage.java | 2 +- .../datagen/patchouli/ApparatusTextPage.java | 2 +- .../datagen/patchouli/EnchantingPage.java | 2 +- .../datagen/patchouli/MultiblockPage.java | 2 +- .../common/entity/AmethystGolem.java | 10 +- .../common/entity/AnimBlockSummon.java | 10 +- .../common/entity/EnchantedFallingBlock.java | 4 +- .../common/entity/EntityBookwyrm.java | 12 +- .../entity/EntityChimeraProjectile.java | 4 +- .../common/entity/EntityDrygmy.java | 14 +-- .../arsnouveau/common/entity/EntityWixie.java | 16 +-- .../common/entity/GiftStarbuncle.java | 12 +- .../arsnouveau/common/entity/Lily.java | 10 +- .../arsnouveau/common/entity/Starbuncle.java | 12 +- .../arsnouveau/common/entity/WealdWalker.java | 14 +-- .../arsnouveau/common/entity/Whirlisprig.java | 14 +-- .../common/entity/WildenChimera.java | 12 +- .../common/entity/WildenGuardian.java | 14 +-- .../common/entity/WildenHunter.java | 14 +-- .../common/entity/WildenStalker.java | 18 +-- .../familiar/FamiliarAmethystGolem.java | 8 +- .../entity/familiar/FamiliarBookwyrm.java | 8 +- .../entity/familiar/FamiliarDrygmy.java | 8 +- .../entity/familiar/FamiliarJabberwog.java | 6 +- .../entity/familiar/FamiliarStarbuncle.java | 8 +- .../entity/familiar/FamiliarWhirlisprig.java | 8 +- .../common/entity/familiar/FamiliarWixie.java | 8 +- .../entity/goal/carbuncle/StarbyBehavior.java | 2 +- .../goal/carbuncle/StarbyListBehavior.java | 2 +- .../goal/carbuncle/StarbyPotionBehavior.java | 2 +- .../carbuncle/StarbyTransportBehavior.java | 4 +- .../entity/goal/chimera/ChimeraRamGoal.java | 2 +- .../common/event/ManaCapEvents.java | 2 +- .../common/items/AlchemistsCrown.java | 4 +- .../arsnouveau/common/items/AnimModItem.java | 4 +- .../common/items/EnchantersMirror.java | 4 +- .../common/items/EnchantersShield.java | 4 +- .../common/items/EnchantersSword.java | 4 +- .../arsnouveau/common/items/FlaskCannon.java | 6 +- .../arsnouveau/common/items/MobJarItem.java | 4 +- .../arsnouveau/common/items/ScryCaster.java | 4 +- .../arsnouveau/common/items/SpellBook.java | 4 +- .../arsnouveau/common/items/SpellBow.java | 4 +- .../common/items/SpellCrossbow.java | 4 +- .../arsnouveau/common/items/Wand.java | 14 +-- .../arsnouveau/common/lib/EntityTags.java | 30 ++--- .../common/lib/PotionEffectTags.java | 8 +- .../arsnouveau/common/light/LightManager.java | 2 +- .../common/mixin/light/LightEntityMixin.java | 2 +- .../arsnouveau/common/network/Networking.java | 6 +- .../arsnouveau/common/perk/BondedPerk.java | 2 +- .../arsnouveau/common/perk/ChillingPerk.java | 2 +- .../arsnouveau/common/perk/DepthsPerk.java | 2 +- .../arsnouveau/common/perk/EmptyPerk.java | 2 +- .../arsnouveau/common/perk/FeatherPerk.java | 2 +- .../arsnouveau/common/perk/GlidingPerk.java | 2 +- .../arsnouveau/common/perk/IgnitePerk.java | 2 +- .../arsnouveau/common/perk/ImmolatePerk.java | 2 +- .../common/perk/JumpHeightPerk.java | 2 +- .../common/perk/KnockbackResistPerk.java | 2 +- .../arsnouveau/common/perk/LootingPerk.java | 2 +- .../common/perk/MagicCapacityPerk.java | 2 +- .../common/perk/MagicResistPerk.java | 2 +- .../common/perk/PotionDurationPerk.java | 2 +- .../arsnouveau/common/perk/RepairingPerk.java | 2 +- .../common/perk/SaturationPerk.java | 2 +- .../common/perk/SpellDamagePerk.java | 2 +- .../common/perk/StarbunclePerk.java | 2 +- .../common/perk/StepHeightPerk.java | 2 +- .../arsnouveau/common/perk/TotemPerk.java | 2 +- .../arsnouveau/common/perk/ToughnessPerk.java | 2 +- .../arsnouveau/common/perk/VampiricPerk.java | 2 +- .../common/ritual/ConjureDesertRitual.java | 2 +- .../common/ritual/ConjurePlainsRitual.java | 2 +- .../common/ritual/DenySpawnRitual.java | 2 +- .../common/ritual/FloweringRitual.java | 2 +- .../common/ritual/ForestationRitual.java | 2 +- .../common/ritual/RitualAnimalSummoning.java | 2 +- .../common/ritual/RitualAwakening.java | 2 +- .../common/ritual/RitualBinding.java | 2 +- .../arsnouveau/common/ritual/RitualBreed.java | 2 +- .../common/ritual/RitualCloudshaper.java | 2 +- .../arsnouveau/common/ritual/RitualDig.java | 2 +- .../common/ritual/RitualDisintegration.java | 2 +- .../common/ritual/RitualFlight.java | 2 +- .../common/ritual/RitualGravity.java | 2 +- .../common/ritual/RitualHarvest.java | 2 +- .../common/ritual/RitualHealing.java | 2 +- .../common/ritual/RitualMobCapture.java | 2 +- .../common/ritual/RitualMoonfall.java | 2 +- .../common/ritual/RitualOvergrowth.java | 2 +- .../common/ritual/RitualPillagerRaid.java | 2 +- .../common/ritual/RitualScrying.java | 2 +- .../common/ritual/RitualSunrise.java | 2 +- .../arsnouveau/common/ritual/RitualWarp.java | 2 +- .../common/ritual/RitualWildenSummoning.java | 2 +- .../common/spell/casters/ReactiveCaster.java | 2 +- .../common/spell/effect/EffectWololo.java | 2 +- .../common/spell/rewind/RewindAttachment.java | 2 +- .../arsnouveau/common/world/Terrablender.java | 2 +- .../world/saved_data/RedstoneSavedData.java | 2 +- .../common/world/saved_data/RedstoneUtil.java | 2 +- .../common/world/structure/WildenDen.java | 2 +- .../tree/SupplierBlockStateProvider.java | 2 +- .../arsnouveau/setup/config/Config.java | 2 +- .../setup/registry/BiomeRegistry.java | 2 +- .../setup/registry/BlockRegistry.java | 10 +- .../setup/registry/CapabilityRegistry.java | 9 +- .../setup/registry/DamageTypesRegistry.java | 10 +- .../setup/registry/SoundRegistry.java | 2 +- .../setup/registry/WorldgenRegistry.java | 20 ++-- .../resources/META-INF/neoforge.mods.toml | 7 +- 265 files changed, 842 insertions(+), 865 deletions(-) diff --git a/build.gradle b/build.gradle index 5c7d8a7056..d44eb5017c 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { id 'eclipse' id 'idea' id 'maven-publish' - id 'net.neoforged.gradle.userdev' version '7.0.124' + id 'net.neoforged.gradle.userdev' version '7.0.145' } version = mod_version @@ -22,15 +22,13 @@ base { java.toolchain.languageVersion = JavaLanguageVersion.of(21) java.withSourcesJar() -minecraft { - accessTransformers { - file rootProject.file('src/main/resources/META-INF/accesstransformer.cfg') - } -} +minecraft.accessTransformers.files( + file('src/main/resources/META-INF/accesstransformer.cfg') +) subsystems { parchment { - minecraftVersion = project.minecraft_version + minecraftVersion = "1.20.6" mappingsVersion = project.parchment_version } } @@ -85,19 +83,19 @@ tasks.named('jarJar') {} dependencies { implementation "net.neoforged:neoforge:${neo_version}" - jarJar(group: 'software.bernie.geckolib', name: "geckolib-neoforge-${minecraft_version}", version: "[4.5,)") { - jarJar.pin(it, "${geckolib_version}") - } - implementation "software.bernie.geckolib:geckolib-neoforge-${minecraft_version}:${geckolib_version}" - - implementation "vazkii.patchouli:Patchouli:1.20.4-${patchouli_version}" - implementation "top.theillusivec4.caelus:neoforge:${caelus_version}+${minecraft_version}" - - compileOnly "top.theillusivec4.curios:curios-neoforge:${curios_version}+${minecraft_version}:api" - localRuntime "top.theillusivec4.curios:curios-neoforge:${curios_version}+${minecraft_version}" - - compileOnly "mezz.jei:jei-1.20.4-neoforge-api:${jei_version}" - localRuntime "mezz.jei:jei-1.20.4-neoforge:${jei_version}" +// jarJar(group: 'software.bernie.geckolib', name: "geckolib-neoforge-${minecraft_version}", version: "[4.5,)") { +// jarJar.pin(it, "${geckolib_version}") +// } + implementation "software.bernie.geckolib:geckolib-neoforge-1.21:${geckolib_version}" +// +// implementation "vazkii.patchouli:Patchouli:1.20.4-${patchouli_version}" +// implementation "top.theillusivec4.caelus:neoforge:${caelus_version}+${minecraft_version}" +// +// compileOnly "top.theillusivec4.curios:curios-neoforge:${curios_version}+${minecraft_version}:api" +// localRuntime "top.theillusivec4.curios:curios-neoforge:${curios_version}+${minecraft_version}" +// +// compileOnly "mezz.jei:jei-1.20.4-neoforge-api:${jei_version}" +// localRuntime "mezz.jei:jei-1.20.4-neoforge:${jei_version}" } tasks.withType(ProcessResources).configureEach { diff --git a/gradle.properties b/gradle.properties index 9a81e2de9c..5cd72fe1b6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,23 +7,23 @@ org.gradle.debug=false neogradle.subsystems.parchment.minecraftVersion=1.20.6 neogradle.subsystems.parchment.mappingsVersion=2024.05.01 -minecraft_version=1.20.6 +minecraft_version=1.21.0 parchment_version=2024.05.01 minecraft_version_range=[1.20.6,1.21) -neo_version=20.6.62-beta +neo_version=21.0.21-beta neo_version_range=[20.6,) loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=4.11.0 +mod_version=5.0.0 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! jei_version=17.3.0.52 curios_version=8.0.0-beta -geckolib_version=4.5.1 +geckolib_version=4.5.5 patchouli_version=85-NEOFORGE caelus_version=6.0.0 diff --git a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java index 6507590b46..6707193960 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java +++ b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java @@ -167,6 +167,6 @@ public static void onServerStopped(final ServerStoppingEvent event) { } public static ResourceLocation prefix(String str) { - return new ResourceLocation(MODID, str); + return ResourceLocation.fromNamespaceAndPath(MODID, str); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java b/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java index 900475485a..91b91991da 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java @@ -11,7 +11,6 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.common.world.ForcedChunkManager; import net.neoforged.neoforge.network.PacketDistributor; public interface ICameraMountable { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/client/CosmeticRenderUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/client/CosmeticRenderUtil.java index aa430bd076..e3c4178a1b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/client/CosmeticRenderUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/client/CosmeticRenderUtil.java @@ -10,7 +10,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.util.RenderUtils; +import software.bernie.geckolib.util.RenderUtil; public class CosmeticRenderUtil { @@ -21,9 +21,9 @@ public static void renderCosmetic(GeoBon //checks should have already been made, but pattern variables ftw matrix.pushPose(); - RenderUtils.translateToPivotPoint(matrix, bone); - RenderUtils.rotateMatrixAroundBone(matrix, bone); - RenderUtils.translateMatrixToBone(matrix, bone); + RenderUtil.translateToPivotPoint(matrix, bone); + RenderUtil.rotateMatrixAroundBone(matrix, bone); + RenderUtil.translateMatrixToBone(matrix, bone); Vec3 translations = cosmetic.getTranslations(entity); Vec3 scaling = cosmetic.getScaling(entity); matrix.translate(translations.x, translations.y, translations.z); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/ArmorUpgradeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/ArmorUpgradeRecipe.java index f9738dcb3b..ac968225f2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/ArmorUpgradeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/ArmorUpgradeRecipe.java @@ -28,7 +28,7 @@ public class ArmorUpgradeRecipe extends EnchantingApparatusRecipe implements ITe public int tier; // 0 indexed public ArmorUpgradeRecipe(List pedestalItems, int cost, int tier) { - this(new ResourceLocation(ArsNouveau.MODID, "upgrade_" + tier), pedestalItems, cost, tier); + this(ArsNouveau.prefix( "upgrade_" + tier), pedestalItems, cost, tier); } public ArmorUpgradeRecipe(ResourceLocation id, List pedestalItems, int cost, int tier) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantingApparatusRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantingApparatusRecipe.java index 0124266cbd..a06e94bbc8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantingApparatusRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantingApparatusRecipe.java @@ -44,7 +44,7 @@ public EnchantingApparatusRecipe(ItemStack result, Ingredient reagent, List pedestalItems, Ingredient reagent, ItemStack result) { @@ -65,7 +65,7 @@ public EnchantingApparatusRecipe() { result = ItemStack.EMPTY; pedestalItems = new ArrayList<>(); sourceCost = 0; - this.id = new ResourceLocation(ArsNouveau.MODID, "empty"); + this.id = ArsNouveau.prefix( "empty"); } public boolean excludeJei(){ @@ -198,7 +198,7 @@ public RecipeSerializer getSerializer() { @Override public RecipeType getType() { - return ForgeRegistries.RECIPE_TYPES.getValue(new ResourceLocation(ArsNouveau.MODID, RecipeRegistry.ENCHANTING_APPARATUS_RECIPE_ID)); + return ForgeRegistries.RECIPE_TYPES.getValue(ArsNouveau.prefix( RecipeRegistry.ENCHANTING_APPARATUS_RECIPE_ID)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java index 2daaacef75..488f8822da 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java @@ -40,7 +40,7 @@ public EnchantmentRecipe(List pedestalItems, Enchantment enchantment this.enchantment = enchantment; this.enchantLevel = level; this.sourceCost = manaCost; - this.id = new ResourceLocation(ArsNouveau.MODID, getRegistryName(enchantment).getPath() + "_" + level); + this.id = ArsNouveau.prefix( getRegistryName(enchantment).getPath() + "_" + level); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/SpellWriteRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/SpellWriteRecipe.java index 13fcf4ccaa..ac0ec807d1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/SpellWriteRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/SpellWriteRecipe.java @@ -40,7 +40,7 @@ public SpellWriteRecipe(ResourceLocation id, List pedestalItems, int public SpellWriteRecipe(List pedestalItems) { this.pedestalItems = pedestalItems; - this.id = new ResourceLocation(ArsNouveau.MODID, "spell_write"); + this.id = ArsNouveau.prefix( "spell_write"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/FadeLightTimedEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/FadeLightTimedEvent.java index 56f2d37c81..0bfafd3adc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/FadeLightTimedEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/FadeLightTimedEvent.java @@ -12,7 +12,6 @@ import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import var; public class FadeLightTimedEvent implements ITimedEvent, LambDynamicLight { protected int lambdynlights$luminance = 0; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/familiar/AbstractFamiliarHolder.java b/src/main/java/com/hollingsworth/arsnouveau/api/familiar/AbstractFamiliarHolder.java index 650f93d39c..15ca416a4e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/familiar/AbstractFamiliarHolder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/familiar/AbstractFamiliarHolder.java @@ -17,7 +17,7 @@ public abstract class AbstractFamiliarHolder { private ResourceLocation id; public AbstractFamiliarHolder(String id, Predicate isConversionEntity) { - this(new ResourceLocation(ArsNouveau.MODID, id), isConversionEntity); + this(ArsNouveau.prefix( id), isConversionEntity); } public AbstractFamiliarHolder(ResourceLocation id, Predicate isConversionEntity) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/FilterableItemHandler.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/FilterableItemHandler.java index 6b19de0ac1..bf3bf8e2eb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/FilterableItemHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/FilterableItemHandler.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.api.item.inv; -import InteractResult; import com.hollingsworth.arsnouveau.common.items.ItemScroll; import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/StorageItemHandler.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/StorageItemHandler.java index ac46a9c87d..b977d4c59d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/StorageItemHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/StorageItemHandler.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.api.item.inv; -import InteractResult; import com.hollingsworth.arsnouveau.common.items.ItemScroll; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.items.IItemHandler; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkSlot.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkSlot.java index 92c2d81ef8..3e8016c391 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkSlot.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkSlot.java @@ -8,9 +8,9 @@ public class PerkSlot { public static ConcurrentHashMap PERK_SLOTS = new ConcurrentHashMap<>(); - public static final PerkSlot ONE = new PerkSlot(new ResourceLocation(ArsNouveau.MODID, "one"), 1); - public static final PerkSlot TWO = new PerkSlot(new ResourceLocation(ArsNouveau.MODID, "two"), 2); - public static final PerkSlot THREE = new PerkSlot(new ResourceLocation(ArsNouveau.MODID, "three"), 3); + public static final PerkSlot ONE = new PerkSlot(ArsNouveau.prefix( "one"), 1); + public static final PerkSlot TWO = new PerkSlot(ArsNouveau.prefix( "two"), 2); + public static final PerkSlot THREE = new PerkSlot(ArsNouveau.prefix( "three"), 3); public final ResourceLocation id; public final int value; // oneIndexed diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/IRecipeWrapper.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/IRecipeWrapper.java index 5aa3f1b2cf..ed4fdb97fd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/IRecipeWrapper.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/IRecipeWrapper.java @@ -4,9 +4,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import record; import javax.annotation.Nullable; -import InstructionsForRecipe; import java.util.List; import java.util.Map; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java index fca7653fbd..8b0a5a3d06 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java @@ -5,7 +5,7 @@ import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.level.Level; -import var; + import java.util.ArrayList; import java.util.Collections; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/CompoundScryer.java b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/CompoundScryer.java index be04a11c6d..80c3b33989 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/CompoundScryer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/CompoundScryer.java @@ -52,6 +52,6 @@ public CompoundTag toTag(CompoundTag tag) { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, "compound_scryer"); + return ArsNouveau.prefix( "compound_scryer"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java index b1ea8af760..379e56f149 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java @@ -42,6 +42,6 @@ public CompoundTag toTag(CompoundTag tag) { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, "single_block"); + return ArsNouveau.prefix( "single_block"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java index 766e926e18..4a0af2ef98 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java @@ -48,6 +48,6 @@ public CompoundTag toTag(CompoundTag tag) { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, "tag_scryer"); + return ArsNouveau.prefix( "tag_scryer"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java index 58bd195972..7dd3c5d009 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java @@ -48,7 +48,7 @@ public ResourceLocation getRegistryName() { public SpellPartConfigUtil.ComboLimits invalidCombinations = new SpellPartConfigUtil.ComboLimits(null); public AbstractSpellPart(String registryName, String name) { - this(new ResourceLocation(ArsNouveau.MODID, registryName), name); + this(ArsNouveau.prefix( registryName), name); } public AbstractSpellPart(ResourceLocation registryName, String name) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java index 02e92b05fd..91092d0586 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java @@ -216,6 +216,6 @@ public void serializeOnTag(CompoundTag tag) { @Override public ResourceLocation getTagID() { - return new ResourceLocation(ArsNouveau.MODID, "caster"); + return ArsNouveau.prefix( "caster"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java index 01a51ba849..0c3e6d5067 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.api.spell; -import CancelReason; import com.hollingsworth.arsnouveau.api.ANFakePlayer; import com.hollingsworth.arsnouveau.api.event.DelayedSpellEvent; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.IWrappedCaster; @@ -61,7 +60,7 @@ public SpellContext(Level level,@NotNull Spell spell, @Nullable LivingEntity cas } public static SpellContext fromEntity(@NotNull Spell spell, @NotNull LivingEntity caster, ItemStack castingTool){ - return new SpellContext(caster.level, spell, caster, LivingCaster.from(caster), castingTool); + return new SpellContext(caster.level(), spell, caster, LivingCaster.from(caster), castingTool); } public SpellContext withWrappedCaster(IWrappedCaster caster){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellTier.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellTier.java index 322b56cf06..202e6583e9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellTier.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellTier.java @@ -8,10 +8,10 @@ public class SpellTier { public static final ConcurrentHashMap SPELL_TIER_MAP = new ConcurrentHashMap<>(); - public static SpellTier ONE = createTier(new ResourceLocation(ArsNouveau.MODID, "one"), 1); - public static SpellTier TWO = createTier(new ResourceLocation(ArsNouveau.MODID, "two"), 2); - public static SpellTier THREE = createTier(new ResourceLocation(ArsNouveau.MODID, "three"), 3); - public static SpellTier CREATIVE = createTier(new ResourceLocation(ArsNouveau.MODID, "creative"), 99); + public static SpellTier ONE = createTier(ArsNouveau.prefix( "one"), 1); + public static SpellTier TWO = createTier(ArsNouveau.prefix( "two"), 2); + public static SpellTier THREE = createTier(ArsNouveau.prefix( "three"), 3); + public static SpellTier CREATIVE = createTier(ArsNouveau.prefix( "creative"), 99); public int value; public ResourceLocation id; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/TurretSpellCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/TurretSpellCaster.java index 3fe0f3d55c..822c4d9c0d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/TurretSpellCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/TurretSpellCaster.java @@ -17,6 +17,6 @@ public TurretSpellCaster(CompoundTag itemTag) { @Override public ResourceLocation getTagID() { - return new ResourceLocation(ArsNouveau.MODID, "turret_caster"); + return ArsNouveau.prefix( "turret_caster"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java index 9bdd1eafaf..74139934da 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.api.util; -import Mana; + import com.hollingsworth.arsnouveau.api.event.ManaRegenCalcEvent; import com.hollingsworth.arsnouveau.api.event.MaxManaCalcEvent; import com.hollingsworth.arsnouveau.api.mana.IManaCap; @@ -14,8 +14,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.common.NeoForge; -import record; -import var; + import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java index ae9acaca57..14b665deb6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java @@ -27,7 +27,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import org.lwjgl.glfw.GLFW; -import var; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; @@ -66,8 +65,8 @@ public List load(StoredItemStack key) { private String searchLast = ""; protected boolean loadedSearch = false; private StoredItemStack.IStoredItemStackComparator comparator = new StoredItemStack.ComparatorAmount(false); - protected static final ResourceLocation scrollBall = new ResourceLocation(ArsNouveau.MODID, "textures/gui/scroll_ball.png"); - protected static final ResourceLocation tabImages = new ResourceLocation(ArsNouveau.MODID, "textures/gui/bookwyrm_storage_tabs.png"); + protected static final ResourceLocation scrollBall = ArsNouveau.prefix( "textures/gui/scroll_ball.png"); + protected static final ResourceLocation tabImages = ArsNouveau.prefix( "textures/gui/bookwyrm_storage_tabs.png"); protected StateButton buttonSortingType; protected StateButton buttonDirection; protected StateButton buttonSearchType; @@ -154,20 +153,20 @@ protected void init() { searchLast = ""; addRenderableWidget(searchField); - buttonSortingType = addRenderableWidget(new StorageSettingsButton(leftPos - 17, topPos + 14, 22, 12, 44, 13, 0, new ResourceLocation(ArsNouveau.MODID, "textures/gui/sort_type.png"), b -> { + buttonSortingType = addRenderableWidget(new StorageSettingsButton(leftPos - 17, topPos + 14, 22, 12, 44, 13, 0, ArsNouveau.prefix( "textures/gui/sort_type.png"), b -> { comparator = StoredItemStack.SortingTypes.VALUES[(comparator.type() + 1) % StoredItemStack.SortingTypes.VALUES.length].create(comparator.isReversed()); buttonSortingType.state = comparator.type(); sendUpdate(); refreshItemList = true; })); - buttonDirection = addRenderableWidget(new StorageSettingsButton(leftPos - 17, topPos + 29, 22, 12, 44, 13, 0, new ResourceLocation(ArsNouveau.MODID, "textures/gui/sort_order.png"), b -> { + buttonDirection = addRenderableWidget(new StorageSettingsButton(leftPos - 17, topPos + 29, 22, 12, 44, 13, 0, ArsNouveau.prefix( "textures/gui/sort_order.png"), b -> { comparator.setReversed(!comparator.isReversed()); buttonDirection.state = comparator.isReversed() ? 1 : 0; sendUpdate(); refreshItemList = true; })); - buttonSearchType = addRenderableWidget(new StorageSettingsButton(leftPos - 17, topPos + 44, 22, 12, 44, 13, 0, new ResourceLocation(ArsNouveau.MODID, "textures/gui/search_sync.png"), b -> { + buttonSearchType = addRenderableWidget(new StorageSettingsButton(leftPos - 17, topPos + 44, 22, 12, 44, 13, 0, ArsNouveau.prefix( "textures/gui/search_sync.png"), b -> { searchType = searchType == 0 ? 1 : 0; buttonSearchType.state = searchType; sendUpdate(); @@ -517,7 +516,7 @@ public boolean mouseScrolled(double p_mouseScrolled_1_, double p_mouseScrolled_3 @Override protected void renderBg(GuiGraphics graphics, float partialTicks, int mouseX, int mouseY) { graphics.blit(getGui(), this.leftPos, this.topPos, 0, 0, this.imageWidth, this.imageHeight); - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/search_paper.png"), this.leftPos + 102, this.topPos + 3, 0, 0, 72, 15, 72, 15); + graphics.blit(ArsNouveau.prefix( "textures/gui/search_paper.png"), this.leftPos + 102, this.topPos + 3, 0, 0, 72, 15, 72, 15); } protected void onUpdateSearch(String text) {} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java index 84ecb61cb1..25cf2fa1e6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java @@ -18,14 +18,14 @@ import org.lwjgl.glfw.GLFW; public class CraftingTerminalScreen extends AbstractStorageTerminalScreen implements RecipeUpdateListener { - private static final ResourceLocation gui = new ResourceLocation(ArsNouveau.MODID, "textures/gui/crafting_terminal.png"); - private static final ResourceLocation gui_expanded = new ResourceLocation(ArsNouveau.MODID, "textures/gui/crafting_terminal_expanded.png"); + private static final ResourceLocation gui = ArsNouveau.prefix( "textures/gui/crafting_terminal.png"); + private static final ResourceLocation gui_expanded = ArsNouveau.prefix( "textures/gui/crafting_terminal_expanded.png"); private final RecipeBookComponent recipeBookGui; private boolean widthTooNarrow; - private static final ResourceLocation RECIPE_BUTTON_TEXTURE = new ResourceLocation(ArsNouveau.MODID, "textures/gui/recipe_book.png"); - private static final ResourceLocation CLEAR_CRAFT_TEXTURE = new ResourceLocation(ArsNouveau.MODID, "textures/gui/craft_clear.png"); - private static final ResourceLocation EXPAND_TEXTURE = new ResourceLocation(ArsNouveau.MODID, "textures/gui/expand_inventory.png"); - private static final ResourceLocation COLLAPSE_TEXTURE = new ResourceLocation(ArsNouveau.MODID, "textures/gui/collapse_inventory.png"); + private static final ResourceLocation RECIPE_BUTTON_TEXTURE = ArsNouveau.prefix( "textures/gui/recipe_book.png"); + private static final ResourceLocation CLEAR_CRAFT_TEXTURE = ArsNouveau.prefix( "textures/gui/craft_clear.png"); + private static final ResourceLocation EXPAND_TEXTURE = ArsNouveau.prefix( "textures/gui/expand_inventory.png"); + private static final ResourceLocation COLLAPSE_TEXTURE = ArsNouveau.prefix( "textures/gui/collapse_inventory.png"); private EditBox recipeBookSearch; private GhostRecipe ghostRecipe; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/BookSlider.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/BookSlider.java index fab5bd2a72..496f16b31f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/BookSlider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/BookSlider.java @@ -41,9 +41,9 @@ public void renderWidget(GuiGraphics guiGraphics, int pMouseX, int pMouseY, floa RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); RenderSystem.enableDepthTest(); - guiGraphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/sound_bar.png"), this.x, this.y, 0, 0, 100, 20, this.width, this.height); + guiGraphics.blit(ArsNouveau.prefix( "textures/gui/sound_bar.png"), this.x, this.y, 0, 0, 100, 20, this.width, this.height); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - guiGraphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/sound_bar_knob.png"), this.x + (int) (this.value * (double) (this.width - 8)), this.y, 0, 0, 8, 20, 8, 20); + guiGraphics.blit(ArsNouveau.prefix( "textures/gui/sound_bar_knob.png"), this.x + (int) (this.value * (double) (this.width - 8)), this.y, 0, 0, 8, 20, 8, 20); int j = 10526880; guiGraphics.drawString(font, this.getMessage(), this.x + this.width / 4, this.y + (this.height - 32) / 2, j | Mth.ceil(this.alpha * 255.0F) << 24, false); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java index ee767e16f9..e3749b7ac4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java @@ -52,10 +52,10 @@ public static void renderOverlay(ExtendedGui gui, GuiGraphics guiGraphics, float int yOffset = minecraft.getWindow().getGuiScaledHeight() - 5 + Config.MANABAR_Y_OFFSET.get(); - guiGraphics.blit( new ResourceLocation(ArsNouveau.MODID, "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 18, 0, 0, 108, 18, 256, 256); + guiGraphics.blit( ArsNouveau.prefix( "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 18, 0, 0, 108, 18, 256, 256); int manaOffset = (int) (((ClientInfo.ticksInGame + pt) / 3 % (33))) * 6; - guiGraphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/manabar_gui_mana.png"), offsetLeft + 9, yOffset - 9, 0, manaOffset, manaLength, 6, 256, 256); + guiGraphics.blit(ArsNouveau.prefix( "textures/gui/manabar_gui_mana.png"), offsetLeft + 9, yOffset - 9, 0, manaOffset, manaLength, 6, 256, 256); renderReserveOverlay(ms, offsetLeft, yOffset, manaOffset, maxMana); renderRedOverlay(ms, offsetLeft, yOffset, manaOffset, maxMana); @@ -70,7 +70,7 @@ public static void renderOverlay(ExtendedGui gui, GuiGraphics guiGraphics, float // guiGraphics.drawString(minecraft.font, String.valueOf((int)(ClientInfo.reservedOverlayMana * maxMana)), offset + 69, yOffset - 20, 0xFFFFFF); } - guiGraphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 17, 0, 18, 108, 20, 256, 256); + guiGraphics.blit(ArsNouveau.prefix( "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 17, 0, 18, 108, 20, 256, 256); } public static void renderRedOverlay(PoseStack ms, int offsetLeft, int yOffset, int manaOffset, int maxMana) { @@ -78,8 +78,8 @@ public static void renderRedOverlay(PoseStack ms, int offsetLeft, int yOffset, i return; int redManaLength = (int) (98F * Mth.clamp(0F,ClientInfo.redOverlayMana / maxMana , 1F)); - RenderSystem.setShaderTexture(0, new ResourceLocation(ArsNouveau.MODID, "textures/gui/manabar_gui_grayscale.png")); - RenderUtils.colorBlit(ms, offsetLeft + 8, yOffset - 10, 0, manaOffset, redManaLength, 8, 256, 256, Color.RED.scaleAlpha(ClientInfo.redOverlayTicks/35f)); + RenderSystem.setShaderTexture(0, ArsNouveau.prefix( "textures/gui/manabar_gui_grayscale.png")); + RenderUtil.colorBlit(ms, offsetLeft + 8, yOffset - 10, 0, manaOffset, redManaLength, 8, 256, 256, Color.RED.scaleAlpha(ClientInfo.redOverlayTicks/35f)); } @@ -93,8 +93,8 @@ public static void renderReserveOverlay(PoseStack ms, int offsetLeft, int yOffse int reserveManaLength = (int) (96F * ClientInfo.reservedOverlayMana); //invert offsets so it aligns with the right side of the bar int offset = 96 - reserveManaLength; - RenderSystem.setShaderTexture(0, new ResourceLocation(ArsNouveau.MODID, "textures/gui/manabar_gui_mana.png")); - RenderUtils.colorBlit(ms, offsetLeft + 10 + offset, yOffset - 10, 0, stillBar ? 0 : manaOffset, reserveManaLength, 8, 256, 256, BLACK); + RenderSystem.setShaderTexture(0, ArsNouveau.prefix( "textures/gui/manabar_gui_mana.png")); + RenderUtil.colorBlit(ms, offsetLeft + 10 + offset, yOffset - 10, 0, stillBar ? 0 : manaOffset, reserveManaLength, 8, 256, 256, BLACK); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/PatchouliTooltipEvent.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/PatchouliTooltipEvent.java index 069a1dda6d..c88bdae044 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/PatchouliTooltipEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/PatchouliTooltipEvent.java @@ -19,7 +19,7 @@ public static void onTooltip(PoseStack ms, ItemStack stack, int mouseX, int mous // ItemStack stackAt = mc.player.getInventory().getItem(i); // if (!stackAt.isEmpty()) { // Book book = ItemStackUtil.getBookFromStack(stackAt); -// if (book != null && book.id.equals(new ResourceLocation(ArsNouveau.MODID, "worn_notebook"))) { +// if (book != null && book.id.equals(ArsNouveau.prefix( "worn_notebook"))) { // return; // } // if(stackAt.getItem() instanceof SpellBook){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java index 207529e78d..e80e73c506 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java @@ -52,7 +52,7 @@ public void renderImage(Font pFont, int pX, int pY, GuiGraphics pGuiGraphics) { List recipe = spellCaster.getSpell().recipe; for (int i = 0, recipeSize = recipe.size(); i < recipeSize; i++) { AbstractSpellPart part = recipe.get(i); - RenderUtils.drawSpellPart(part, pGuiGraphics, pX + i * 16, pY + (showName ? 10 : 0), 16, false); + RenderUtil.drawSpellPart(part, pGuiGraphics, pX + i * 16, pY + (showName ? 10 : 0), 16, false); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java index b84f488296..ad8e23a75d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java @@ -18,7 +18,7 @@ public class BaseBook extends ModdedScreen { public final int FULL_WIDTH = 290; public final int FULL_HEIGHT = 194; - public static ResourceLocation background = new ResourceLocation(ArsNouveau.MODID, "textures/gui/spell_book_template.png"); + public static ResourceLocation background = ArsNouveau.prefix( "textures/gui/spell_book_template.png"); public int bookLeft; public int bookTop; public int bookRight; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java index 1f4eed3625..53e4410e13 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java @@ -103,7 +103,7 @@ public void init() { searchBar.setSuggestion(Component.translatable("ars_nouveau.spell_book_gui.search").getString()); searchBar.setResponder((val) -> this.onSearchChanged(val)); addRenderableWidget(searchBar); - addRenderableWidget(new GuiImageButton(bookRight - 71, bookBottom - 13, 50, 12, new ResourceLocation(ArsNouveau.MODID, "textures/gui/create_icon.png"), this::onSelectClick)); + addRenderableWidget(new GuiImageButton(bookRight - 71, bookBottom - 13, 50, 12, ArsNouveau.prefix( "textures/gui/create_icon.png"), this::onSelectClick)); this.nextButton = addRenderableWidget(new PageButton(bookRight - 20, bookBottom - 10, true, this::onPageIncrease, true)); this.previousButton = addRenderableWidget(new PageButton(bookLeft - 5, bookBottom - 10, false, this::onPageDec, true)); updateNextPageButtons(); @@ -119,16 +119,16 @@ public void init() { itemButtons.add(cell); } - all = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 22, 0, 0, 23, 20, 23, 20, new ResourceLocation(ArsNouveau.MODID, "textures/gui/filter_tab_all.png"), - new ResourceLocation(ArsNouveau.MODID, "textures/gui/filter_tab_all_selected.png"), (b) -> this.setFilter(Filter.ALL, (SelectableButton) b, Component.translatable("ars_nouveau.all_glyphs").getString())).withTooltip(Component.translatable("ars_nouveau.all_glyphs")); + all = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 22, 0, 0, 23, 20, 23, 20, ArsNouveau.prefix( "textures/gui/filter_tab_all.png"), + ArsNouveau.prefix( "textures/gui/filter_tab_all_selected.png"), (b) -> this.setFilter(Filter.ALL, (SelectableButton) b, Component.translatable("ars_nouveau.all_glyphs").getString())).withTooltip(Component.translatable("ars_nouveau.all_glyphs")); all.isSelected = true; - tier1 = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 46, 0, 0, 23, 20, 23, 20, new ResourceLocation(ArsNouveau.MODID, "textures/gui/filter_tab_tier1.png"), - new ResourceLocation(ArsNouveau.MODID, "textures/gui/filter_tab_tier1_selected.png"), (b) -> this.setFilter(Filter.TIER1, (SelectableButton) b, Component.translatable("ars_nouveau.tier", 1).getString())).withTooltip(Component.translatable("ars_nouveau.tier", 1)); + tier1 = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 46, 0, 0, 23, 20, 23, 20, ArsNouveau.prefix( "textures/gui/filter_tab_tier1.png"), + ArsNouveau.prefix( "textures/gui/filter_tab_tier1_selected.png"), (b) -> this.setFilter(Filter.TIER1, (SelectableButton) b, Component.translatable("ars_nouveau.tier", 1).getString())).withTooltip(Component.translatable("ars_nouveau.tier", 1)); - tier2 = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 70, 0, 0, 23, 20, 23, 20, new ResourceLocation(ArsNouveau.MODID, "textures/gui/filter_tab_tier2.png"), - new ResourceLocation(ArsNouveau.MODID, "textures/gui/filter_tab_tier2_selected.png"), (b) -> this.setFilter(Filter.TIER2, (SelectableButton) b, Component.translatable("ars_nouveau.tier", 2).getString())).withTooltip(Component.translatable("ars_nouveau.tier", 2)); - tier3 = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 94, 0, 0, 23, 20, 23, 20, new ResourceLocation(ArsNouveau.MODID, "textures/gui/filter_tab_tier3.png"), - new ResourceLocation(ArsNouveau.MODID, "textures/gui/filter_tab_tier3_selected.png"), (b) -> this.setFilter(Filter.TIER3, (SelectableButton) b, Component.translatable("ars_nouveau.tier", 3).getString())).withTooltip(Component.translatable("ars_nouveau.tier", 3)); + tier2 = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 70, 0, 0, 23, 20, 23, 20, ArsNouveau.prefix( "textures/gui/filter_tab_tier2.png"), + ArsNouveau.prefix( "textures/gui/filter_tab_tier2_selected.png"), (b) -> this.setFilter(Filter.TIER2, (SelectableButton) b, Component.translatable("ars_nouveau.tier", 2).getString())).withTooltip(Component.translatable("ars_nouveau.tier", 2)); + tier3 = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 94, 0, 0, 23, 20, 23, 20, ArsNouveau.prefix( "textures/gui/filter_tab_tier3.png"), + ArsNouveau.prefix( "textures/gui/filter_tab_tier3_selected.png"), (b) -> this.setFilter(Filter.TIER3, (SelectableButton) b, Component.translatable("ars_nouveau.tier", 3).getString())).withTooltip(Component.translatable("ars_nouveau.tier", 3)); filterButtons.add(all); filterButtons.add(tier2); filterButtons.add(tier1); @@ -337,9 +337,9 @@ public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, graphics.drawString(font, orderingTitle, tier1Row > 7 ? 154 : 20, 5 + 18 * (tier1Row + (tier1Row == 1 ? 0 : 1)), -8355712, false); - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/create_paper.png"), 216, 179, 0, 0, 56, 15, 56, 15); + graphics.blit(ArsNouveau.prefix( "textures/gui/create_paper.png"), 216, 179, 0, 0, 56, 15, 56, 15); - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/search_paper.png"), 203, 0, 0, 0, 72, 15, 72, 15); + graphics.blit(ArsNouveau.prefix( "textures/gui/search_paper.png"), 203, 0, 0, 0, 72, 15, 72, 15); graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.select"), 233, 183, -8355712, false); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiColorScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiColorScreen.java index 86cf8f135d..93af651588 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiColorScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiColorScreen.java @@ -16,7 +16,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; -import var; + import java.util.ArrayList; import java.util.List; @@ -144,7 +144,7 @@ public void onSaveAllClick(Button button) { @Override public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { super.drawBackgroundElements(graphics, mouseX, mouseY, partialTicks); - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/slider_gilding.png"), 22, 47, 0, 0, 112, 104, 112, 104); + graphics.blit(ArsNouveau.prefix( "textures/gui/slider_gilding.png"), 22, 47, 0, 0, 112, 104, 112, 104); int color = -8355712; graphics.drawString(font, Component.translatable("ars_nouveau.color_gui.title").getString(), 51, 24, color, false); graphics.drawString(font, Component.translatable("ars_nouveau.color_gui.presets").getString(), 159, 24, color, false); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiFamiliarScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiFamiliarScreen.java index fd896f14b1..d24e4155aa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiFamiliarScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiFamiliarScreen.java @@ -52,8 +52,8 @@ public void init() { @Override public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { super.drawBackgroundElements(graphics, mouseX, mouseY, partialTicks); - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/create_paper.png"), 216, 179, 0, 0, 56, 15, 56, 15); - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/create_paper.png"), 156, 179, 0, 0, 56, 15, 56, 15); + graphics.blit(ArsNouveau.prefix( "textures/gui/create_paper.png"), 216, 179, 0, 0, 56, 15, 56, 15); + graphics.blit(ArsNouveau.prefix( "textures/gui/create_paper.png"), 156, 179, 0, 0, 56, 15, 56, 15); graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.familiar").getString(), 20, 24, -8355712, false); graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.close"), 232, 183, -8355712, false); graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.dispel"), 172, 183, -8355712, false); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSettingsScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSettingsScreen.java index c38d40b89d..cb98c5ae9f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSettingsScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSettingsScreen.java @@ -32,8 +32,8 @@ public void init() { addRenderableWidget(new GuiImageButton(bookRight - 71, bookBottom - 13, 0, 0, 41, 12, 41, 12, "textures/gui/clear_icon.png", (e) -> { Minecraft.getInstance().setScreen(parent); })); - SelectableButton dynamicButton = new SelectableButton(bookLeft + 20, bookTop + 34, 0, 0, 16, 16, 16, 16, new ResourceLocation(ArsNouveau.MODID, "textures/gui/settings_dynamic_light_off.png"), - new ResourceLocation(ArsNouveau.MODID, "textures/gui/settings_dynamic_light_on.png"), (b) -> { + SelectableButton dynamicButton = new SelectableButton(bookLeft + 20, bookTop + 34, 0, 0, 16, 16, 16, 16, ArsNouveau.prefix( "textures/gui/settings_dynamic_light_off.png"), + ArsNouveau.prefix( "textures/gui/settings_dynamic_light_on.png"), (b) -> { SelectableButton button = (SelectableButton) b; button.isSelected = !button.isSelected; LightManager.toggleLightsAndConfig(!Config.DYNAMIC_LIGHTS_ENABLED.get()); @@ -44,13 +44,13 @@ public void init() { addRenderableWidget(dynamicButton); if(ClientInfo.isSupporter) { - GuiImageButton lilyButton = new GuiImageButton(bookLeft + 40, bookTop + 34, 0, 0, 16, 16, 16, 16, new ResourceLocation(ArsNouveau.MODID, "textures/gui/settings_summon_lily.png"), (b) -> { + GuiImageButton lilyButton = new GuiImageButton(bookLeft + 40, bookTop + 34, 0, 0, 16, 16, 16, 16, ArsNouveau.prefix( "textures/gui/settings_summon_lily.png"), (b) -> { Networking.sendToServer(new PacketSummonLily()); }); lilyButton.withTooltip(Component.translatable("ars_nouveau.settings.summon_lily")); - GuiImageButton unsummonLily = new GuiImageButton(bookLeft + 60, bookTop + 34, 0, 0, 16, 16, 16, 16, new ResourceLocation(ArsNouveau.MODID, "textures/gui/settings_unsummon_lily.png"), (b) -> { + GuiImageButton unsummonLily = new GuiImageButton(bookLeft + 60, bookTop + 34, 0, 0, 16, 16, 16, 16, ArsNouveau.prefix( "textures/gui/settings_unsummon_lily.png"), (b) -> { Networking.sendToServer(new PacketUnsummonLily()); }); @@ -64,7 +64,7 @@ public void init() { @Override public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { super.drawBackgroundElements(graphics, mouseX, mouseY, partialTicks); - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/create_paper.png"), 216, 179, 0, 0, 56, 15, 56, 15); + graphics.blit(ArsNouveau.prefix( "textures/gui/create_paper.png"), 216, 179, 0, 0, 56, 15, 56, 15); graphics.drawString(font, Component.translatable("ars_nouveau.settings.title").getString(), 51, 24, -8355712, false); graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.close"), 238, 183, -8355712, false); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index e50823ea65..67524c555f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -515,10 +515,10 @@ public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, if (augmentTextRow >= 1) { graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.augment").getString(), augmentTextRow > 6 ? 154 : 20, 5 + 18 * (augmentTextRow + 1), -8355712, false); } - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/spell_name_paper.png"), 16, 179, 0, 0, 109, 15, 109, 15); - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/search_paper.png"), 203, 0, 0, 0, 72, 15, 72, 15); - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/clear_paper.png"), 161, 179, 0, 0, 47, 15, 47, 15); - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/create_paper.png"), 216, 179, 0, 0, 56, 15, 56, 15); + graphics.blit(ArsNouveau.prefix( "textures/gui/spell_name_paper.png"), 16, 179, 0, 0, 109, 15, 109, 15); + graphics.blit(ArsNouveau.prefix( "textures/gui/search_paper.png"), 203, 0, 0, 0, 72, 15, 72, 15); + graphics.blit(ArsNouveau.prefix( "textures/gui/clear_paper.png"), 161, 179, 0, 0, 47, 15, 47, 15); + graphics.blit(ArsNouveau.prefix( "textures/gui/create_paper.png"), 216, 179, 0, 0, 56, 15, 56, 15); if (validationErrors.isEmpty()) { graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.create"), 233, 183, -8355712, false); } else { @@ -545,17 +545,17 @@ public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, poseStack.pushPose(); poseStack.scale(1.2F, 1.2F, 1.2F); poseStack.translate(-25, -30, 0); - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 18, 0, 0, 108, 18, 256, 256); + graphics.blit(ArsNouveau.prefix( "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 18, 0, 0, 108, 18, 256, 256); int manaOffset = (int) (((ClientInfo.ticksInGame + partialTicks) / 3 % (33))) * 6; // default length is 96 // rainbow effect for perfect match is currently disabled by the >= if (manaLength >= 0) { - graphics.blit( new ResourceLocation(ArsNouveau.MODID, "textures/gui/manabar_gui_mana.png"), offsetLeft + 9, yOffset - 9, 0, manaOffset, manaLength, 6, 256, 256); + graphics.blit( ArsNouveau.prefix( "textures/gui/manabar_gui_mana.png"), offsetLeft + 9, yOffset - 9, 0, manaOffset, manaLength, 6, 256, 256); } else { //color rainbow if mana cost = max mana, red if mana cost > max mana - RenderSystem.setShaderTexture(0, new ResourceLocation(ArsNouveau.MODID, "textures/gui/manabar_gui_grayscale.png")); - RenderUtils.colorBlit(graphics.pose(), offsetLeft + 8, yOffset - 10, 0, manaOffset, 100, 8, 256, 256, manaLength < 0 ? Color.RED : Color.rainbowColor(ClientInfo.ticksInGame)); + RenderSystem.setShaderTexture(0, ArsNouveau.prefix( "textures/gui/manabar_gui_grayscale.png")); + RenderUtil.colorBlit(graphics.pose(), offsetLeft + 8, yOffset - 10, 0, manaOffset, 100, 8, 256, 256, manaLength < 0 ? Color.RED : Color.rainbowColor(ClientInfo.ticksInGame)); } if (ArsNouveauAPI.ENABLE_DEBUG_NUMBERS && minecraft != null) { String text = currentCostCache + " / " + maxManaCache; @@ -565,7 +565,7 @@ public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, graphics.drawString(minecraft.font, text, offset + 55, yOffset - 10, 0xFFFFFF, false); } - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 17, 0, 18, 108, 20, 256, 256); + graphics.blit(ArsNouveau.prefix( "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 17, 0, 18, 108, 20, 256, 256); poseStack.popPose(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java index 0819930594..a3f8dc789a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java @@ -589,10 +589,10 @@ public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, if (augmentTextRow >= 1) { graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.augment").getString(), augmentTextRow > 6 ? 154 : 20, 5 + 18 * (augmentTextRow + 1), -8355712, false); } - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/spell_name_paper.png"), 16, 179, 0, 0, 109, 15, 109, 15); - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/search_paper.png"), 203, 0, 0, 0, 72, 15, 72, 15); - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/clear_paper.png"), 161, 179, 0, 0, 47, 15, 47, 15); - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/create_paper.png"), 216, 179, 0, 0, 56, 15, 56, 15); + graphics.blit(ArsNouveau.prefix( "textures/gui/spell_name_paper.png"), 16, 179, 0, 0, 109, 15, 109, 15); + graphics.blit(ArsNouveau.prefix( "textures/gui/search_paper.png"), 203, 0, 0, 0, 72, 15, 72, 15); + graphics.blit(ArsNouveau.prefix( "textures/gui/clear_paper.png"), 161, 179, 0, 0, 47, 15, 47, 15); + graphics.blit(ArsNouveau.prefix( "textures/gui/create_paper.png"), 216, 179, 0, 0, 56, 15, 56, 15); if (validationErrors.isEmpty()) { graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.create"), 233, 183, -8355712, false); } else { @@ -619,17 +619,17 @@ public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, poseStack.pushPose(); poseStack.scale(1.2F, 1.2F, 1.2F); poseStack.translate(-25, -30, 0); - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 18, 0, 0, 108, 18, 256, 256); + graphics.blit(ArsNouveau.prefix( "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 18, 0, 0, 108, 18, 256, 256); int manaOffset = (int) (((ClientInfo.ticksInGame + partialTicks) / 3 % (33))) * 6; // default length is 96 // rainbow effect for perfect match is currently disabled by the >= if (manaLength >= 0) { - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/manabar_gui_mana.png"), offsetLeft + 9, yOffset - 9, 0, manaOffset, manaLength, 6, 256, 256); + graphics.blit(ArsNouveau.prefix( "textures/gui/manabar_gui_mana.png"), offsetLeft + 9, yOffset - 9, 0, manaOffset, manaLength, 6, 256, 256); } else { //color rainbow if mana cost = max mana, red if mana cost > max mana - RenderSystem.setShaderTexture(0, new ResourceLocation(ArsNouveau.MODID, "textures/gui/manabar_gui_grayscale.png")); - RenderUtils.colorBlit(graphics.pose(), offsetLeft + 8, yOffset - 10, 0, manaOffset, 100, 8, 256, 256, manaLength < 0 ? Color.RED : Color.rainbowColor(ClientInfo.ticksInGame)); + RenderSystem.setShaderTexture(0, ArsNouveau.prefix( "textures/gui/manabar_gui_grayscale.png")); + RenderUtil.colorBlit(graphics.pose(), offsetLeft + 8, yOffset - 10, 0, manaOffset, 100, 8, 256, 256, manaLength < 0 ? Color.RED : Color.rainbowColor(ClientInfo.ticksInGame)); } if (ArsNouveauAPI.ENABLE_DEBUG_NUMBERS && minecraft != null) { String text = currentCostCache + " / " + maxManaCache; @@ -639,7 +639,7 @@ public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, graphics.drawString(minecraft.font, text, offset + 55, yOffset - 10, 0xFFFFFF, false); } - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 17, 0, 18, 108, 20, 256, 256); + graphics.blit(ArsNouveau.prefix( "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 17, 0, 18, 108, 20, 256, 256); poseStack.popPose(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java index 4413b96c7b..2ebf6c09d9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java @@ -128,7 +128,7 @@ public void onSaveAllClick(Button button) { @Override public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { super.drawBackgroundElements(graphics, mouseX, mouseY, partialTicks); - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/sound_slider_gilding.png"), 22, 47, 0, 0, 112, 104, 112, 104); + graphics.blit(ArsNouveau.prefix( "textures/gui/sound_slider_gilding.png"), 22, 47, 0, 0, 112, 104, 112, 104); int color = -8355712; graphics.drawString(font, Component.translatable("ars_nouveau.sounds.title").getString(), 51, 24, color, false); graphics.drawString(font, Component.translatable("ars_nouveau.color_gui.save").getString(), 37, 160, color, false); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java index 9d177274f0..d6f841f2cf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java @@ -46,7 +46,7 @@ public void render(GuiGraphics graphics, int parX, int parY, float partialTicks) RenderSystem.setShaderColor(1.0F, 0.7F, 0.7F, 1.0F); } if (this.abstractSpellPart != null) { - RenderUtils.drawSpellPart(this.abstractSpellPart, graphics, x + 3, y + 2, 16, !validationErrors.isEmpty(), 0); + RenderUtil.drawSpellPart(this.abstractSpellPart, graphics, x + 3, y + 2, 16, !validationErrors.isEmpty(), 0); } } super.render(graphics, parX, parY, partialTicks); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/FamiliarButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/FamiliarButton.java index 3a471ba237..29d0b7af0a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/FamiliarButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/FamiliarButton.java @@ -25,7 +25,7 @@ public FamiliarButton(int x, int y, AbstractFamiliarHolder familiar, OnPress onP @Override public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { if (visible) { - RenderUtils.drawItemAsIcon(familiarHolder.getOutputItem(), graphics, x, y, 16, false); + RenderUtil.drawItemAsIcon(familiarHolder.getOutputItem(), graphics, x, y, 16, false); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GlyphButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GlyphButton.java index d50cfc8502..6d9260ae7a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GlyphButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GlyphButton.java @@ -16,7 +16,7 @@ import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModList; import net.neoforged.neoforgespi.language.IModInfo; -import var; + import java.util.LinkedList; import java.util.List; @@ -37,7 +37,7 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTi if(!visible){ return; } - RenderUtils.drawSpellPart(this.abstractSpellPart, graphics, x, y, 16, !validationErrors.isEmpty(), 0); + RenderUtil.drawSpellPart(this.abstractSpellPart, graphics, x, y, 16, !validationErrors.isEmpty(), 0); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiImageButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiImageButton.java index 67015f6251..e727a22c47 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiImageButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiImageButton.java @@ -22,7 +22,7 @@ public GuiImageButton(int x, int y, int w, int h, ResourceLocation image, Button } public GuiImageButton(int x, int y, int u, int v, int w, int h, int image_width, int image_height, String resource_image, Button.OnPress onPress) { - this(x, y, u, v, w, h, image_width, image_height, new ResourceLocation(ArsNouveau.MODID, resource_image), onPress); + this(x, y, u, v, w, h, image_width, image_height, ArsNouveau.prefix( resource_image), onPress); } public GuiImageButton(int x, int y, int u, int v, int w, int h, int image_width, int image_height, ResourceLocation image, Button.OnPress onPress) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiSpellSlot.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiSpellSlot.java index e124db53c0..9f86540a82 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiSpellSlot.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiSpellSlot.java @@ -27,7 +27,7 @@ public GuiSpellSlot(int x, int y, int slotNum, String spellName, OnPress onPress @Override public void render(GuiGraphics graphics, int parX, int parY, float partialTicks) { if (visible) { - image = this.isSelected ? new ResourceLocation(ArsNouveau.MODID, "textures/gui/spell_tab_selected.png") : new ResourceLocation(ArsNouveau.MODID, "textures/gui/spell_tab.png"); + image = this.isSelected ? ArsNouveau.prefix( "textures/gui/spell_tab_selected.png") : ArsNouveau.prefix( "textures/gui/spell_tab.png"); super.render(graphics, parX, parY, partialTicks); graphics.drawCenteredString(Minecraft.getInstance().font, String.valueOf(this.slotNum + 1), x + 8, y + 3, 16777215); // White } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ItemButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ItemButton.java index 58609cead3..cbc369ac4e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ItemButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ItemButton.java @@ -33,7 +33,7 @@ public void render(GuiGraphics graphics, int parX, int parY, float partialTicks) List components = new ArrayList<>(ClientHooks.gatherTooltipComponents(ItemStack.EMPTY, Screen.getTooltipFromItem(Minecraft.getInstance(), stack), parX, width, height, font)); parent.renderTooltipInternal(graphics, components, parX, parY); } - RenderUtils.drawItemAsIcon(stack, graphics, x + 3, y + 2, 16, false); + RenderUtil.drawItemAsIcon(stack, graphics, x + 3, y + 2, 16, false); } } super.render(graphics, parX, parY, partialTicks); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/StorageSettingsButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/StorageSettingsButton.java index a0980ce391..39f04ef0dd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/StorageSettingsButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/StorageSettingsButton.java @@ -12,7 +12,7 @@ public StorageSettingsButton(int x, int y, int width, int height, int imageWidth @Override public void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float pt) { if(this.visible){ - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/storage_tab1.png"), x, y, 0, 0, 22, 13, 22, 13); + graphics.blit(ArsNouveau.prefix( "textures/gui/storage_tab1.png"), x, y, 0, 0, 22, 13, 22, 13); } super.renderWidget(graphics, mouseX, mouseY, pt); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/StorageTabButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/StorageTabButton.java index 7e62ea1ae0..afe4d00c67 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/StorageTabButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/StorageTabButton.java @@ -21,7 +21,7 @@ public StorageTabButton(int x, int y, int width, int height, int imageWidth, int @Override public void renderWidget(GuiGraphics p_281670_, int mouseX, int mouseY, float pt) { if(this.visible){ - p_281670_.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/storage_tab2" + (isSelected ? "_selected" : "") + ".png"), x , y, 0, 0, 18, 13, 18, 13); + p_281670_.blit(ArsNouveau.prefix( "textures/gui/storage_tab2" + (isSelected ? "_selected" : "") + ".png"), x , y, 0, 0, 18, 13, 18, 13); } super.renderWidget(p_281670_, mouseX, mouseY, pt); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java index f3683caf0f..bdb3b9c872 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java @@ -17,7 +17,7 @@ import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModList; import net.neoforged.neoforgespi.language.IModInfo; -import var; + import java.util.List; @OnlyIn(Dist.CLIENT) @@ -42,9 +42,9 @@ public UnlockGlyphButton(int x, int y, boolean isCraftingSlot, AbstractSpellPart public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { if (visible) { if (this.spellPart != null) { - RenderUtils.drawSpellPart(this.spellPart, graphics, x, y, width, !playerKnows, 0); + RenderUtil.drawSpellPart(this.spellPart, graphics, x, y, width, !playerKnows, 0); if (selected) - graphics.blit(new ResourceLocation(ArsNouveau.MODID, "textures/gui/glyph_selected.png"), x, y, 0, 0, 16, 16, 16, 16); + graphics.blit(ArsNouveau.prefix( "textures/gui/glyph_selected.png"), x, y, 0, 0, 16, 16, 16, 16); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/DyeRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/DyeRecipeCategory.java index ce0d2a4103..1b4b159671 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/DyeRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/DyeRecipeCategory.java @@ -12,7 +12,7 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.DyeItem; import net.minecraft.world.item.ItemStack; -import var; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIArsNouveauPlugin.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIArsNouveauPlugin.java index 07ed19486e..6b3c637628 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIArsNouveauPlugin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIArsNouveauPlugin.java @@ -38,7 +38,7 @@ public class JEIArsNouveauPlugin implements IModPlugin { @Override public ResourceLocation getPluginUid() { - return new ResourceLocation(ArsNouveau.MODID, "main"); + return ArsNouveau.prefix( "main"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/MultiInputCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/MultiInputCategory.java index e7f3ce5db0..910fe532d9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/MultiInputCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/MultiInputCategory.java @@ -9,7 +9,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.phys.Vec2; -import record; + import javax.annotation.Nullable; import java.util.List; import java.util.function.Function; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java index 0e9c63e6e6..5910e7df4e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java @@ -12,7 +12,7 @@ * Modified class of ElementType: https://github.com/Sirttas/ElementalCraft/blob/b91ca42b3d139904d9754d882a595406bad1bd18/src/main/java/sirttas/elementalcraft/ElementType.java */ public class ParticleColor implements IParticleColor, Cloneable { - public static final ResourceLocation ID = new ResourceLocation(ArsNouveau.MODID, "constant"); + public static final ResourceLocation ID = ArsNouveau.prefix( "constant"); public static final ParticleColor DEFAULT = new ParticleColor(255, 25, 180); public static final ParticleColor WHITE = new ParticleColor(255, 255, 255); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/RainbowParticleColor.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/RainbowParticleColor.java index 64e9e43ab6..e634ace488 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/RainbowParticleColor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/RainbowParticleColor.java @@ -8,7 +8,7 @@ public class RainbowParticleColor extends ParticleColor{ - public static final ResourceLocation ID = new ResourceLocation(ArsNouveau.MODID, "rainbow"); + public static final ResourceLocation ID = ArsNouveau.prefix( "rainbow"); public final int tickOffset; public int transitionSpeed; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index 2e1af634a5..592f0b7363 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -97,14 +97,14 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerBlockEntityRenderer(BlockRegistry.REDSTONE_RELAY_TILE.get(), RedstoneRelayRenderer::new); event.registerEntityRenderer(ModEntities.SPELL_PROJ.get(), - renderManager -> new RenderSpell(renderManager, new ResourceLocation(ArsNouveau.MODID, "textures/entity/spell_proj.png"))); + renderManager -> new RenderSpell(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.SPELL_PROJ_ARC.get(), - renderManager -> new RenderSpell(renderManager, new ResourceLocation(ArsNouveau.MODID, "textures/entity/spell_proj.png"))); + renderManager -> new RenderSpell(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.SPELL_PROJ_HOM.get(), - renderManager -> new RenderSpell(renderManager, new ResourceLocation(ArsNouveau.MODID, "textures/entity/spell_proj.png"))); + renderManager -> new RenderSpell(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.ENTITY_FOLLOW_PROJ.get(), - renderManager -> new RenderBlank(renderManager, new ResourceLocation(ArsNouveau.MODID, "textures/entity/spell_proj.png"))); + renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.SUMMON_SKELETON.get(), RenderSummonSkeleton::new); event.registerEntityRenderer(ModEntities.ENTITY_EVOKER_FANGS_ENTITY_TYPE.get(), EvokerFangsRenderer::new); @@ -123,12 +123,12 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer RenderFlyingItem::new); event.registerEntityRenderer(ModEntities.ENTITY_RITUAL.get(), - renderManager -> new RenderBlank(renderManager, new ResourceLocation(ArsNouveau.MODID, "textures/entity/spell_proj.png"))); + renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.ENTITY_SPELL_ARROW.get(), TippableArrowRenderer::new); event.registerEntityRenderer(ModEntities.ENTITY_WIXIE_TYPE.get(), (t) -> new TextureVariantRenderer<>(t, new WixieModel<>())); event.registerEntityRenderer(ModEntities.ENTITY_DUMMY.get(), DummyRenderer::new); event.registerEntityRenderer(ModEntities.ENTITY_DRYGMY.get(), (t) -> new TextureVariantRenderer<>(t, new DrygmyModel<>())); - event.registerEntityRenderer(ModEntities.ORBIT_SPELL.get(), renderManager -> new RenderBlank(renderManager, new ResourceLocation(ArsNouveau.MODID, "textures/entity/spell_proj.png"))); + event.registerEntityRenderer(ModEntities.ORBIT_SPELL.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.WILDEN_BOSS.get(), WildenChimeraRenderer::new); event.registerEntityRenderer(ModEntities.ENTITY_CHIMERA_SPIKE.get(), ChimeraProjectileRenderer::new); event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_STARBUNCLE.get(), (t) -> new GenericFamiliarRenderer<>(t, new FamiliarStarbyModel<>())); @@ -139,14 +139,14 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerEntityRenderer(ModEntities.FAMILIAR_AMETHYST_GOLEM.get(), (t) -> new GenericFamiliarRenderer<>(t, new AmethystGolemModel<>())); event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_BOOKWYRM.get(), FamiliarBookwyrmRenderer::new); event.registerEntityRenderer(ModEntities.LINGER_SPELL.get(), - renderManager -> new RenderBlank(renderManager, new ResourceLocation(ArsNouveau.MODID, "textures/entity/spell_proj.png"))); + renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.ENTITY_CASCADING_WEALD.get(), (v) -> new WealdWalkerRenderer<>(v, "cascading_weald")); event.registerEntityRenderer(ModEntities.ENTITY_BLAZING_WEALD.get(), (v) -> new WealdWalkerRenderer<>(v, "blazing_weald")); event.registerEntityRenderer(ModEntities.ENTITY_FLOURISHING_WEALD.get(), (v) -> new WealdWalkerRenderer<>(v, "flourishing_weald")); event.registerEntityRenderer(ModEntities.ENTITY_VEXING_WEALD.get(), (v) -> new WealdWalkerRenderer<>(v, "vexing_weald")); event.registerEntityRenderer(ModEntities.AMETHYST_GOLEM.get(), AmethystGolemRenderer::new); - event.registerEntityRenderer(ModEntities.SCRYER_CAMERA.get(), renderManager -> new RenderBlank(renderManager, new ResourceLocation(ArsNouveau.MODID, "textures/entity/spell_proj.png"))); + event.registerEntityRenderer(ModEntities.SCRYER_CAMERA.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.ENCHANTED_FALLING_BLOCK.get(), EnchantedFallingBlockRenderer::new); event.registerEntityRenderer(ModEntities.ICE_SHARD.get(), EnchantedFallingBlockRenderer::new); event.registerEntityRenderer(ModEntities.ENCHANTED_MAGE_BLOCK.get(), MageBlockRenderer::new); @@ -156,11 +156,11 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerEntityRenderer(ModEntities.ANIMATED_HEAD.get(), AnimSkullRenderer::new); event.registerEntityRenderer(ModEntities.CINDER.get(), CinderRenderer::new); event.registerEntityRenderer(ModEntities.WALL_SPELL.get(), - renderManager -> new RenderBlank(renderManager, new ResourceLocation(ArsNouveau.MODID, "textures/entity/spell_proj.png"))); + renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.LILY.get(), LilyRenderer::new); } - public static NamedGuiOverlay cameraOverlay = new NamedGuiOverlay(new ResourceLocation(ArsNouveau.MODID, "scry_camera"), (gui, pose, partialTick, width, height) -> { + public static NamedGuiOverlay cameraOverlay = new NamedGuiOverlay(ArsNouveau.prefix( "scry_camera"), (gui, pose, partialTick, width, height) -> { Minecraft mc = Minecraft.getInstance(); Level level = mc.level; BlockPos pos = mc.cameraEntity.blockPosition(); @@ -193,10 +193,10 @@ public static void registerOverlays(final RegisterGuiOverlaysEvent event) { public static void init(final FMLClientSetupEvent evt) { evt.enqueueWork(() -> { - ItemProperties.register(ItemsRegistry.ENCHANTERS_SHIELD.get(), new ResourceLocation(ArsNouveau.MODID, "blocking"), (item, resourceLocation, livingEntity, arg4) -> { + ItemProperties.register(ItemsRegistry.ENCHANTERS_SHIELD.get(), ArsNouveau.prefix( "blocking"), (item, resourceLocation, livingEntity, arg4) -> { return livingEntity != null && livingEntity.isUsingItem() && livingEntity.getUseItem() == item ? 1.0F : 0.0F; }); - ItemProperties.register(ItemsRegistry.DOWSING_ROD.get(), new ResourceLocation(ArsNouveau.MODID, "uses"), new ClampedItemPropertyFunction() { + ItemProperties.register(ItemsRegistry.DOWSING_ROD.get(), ArsNouveau.prefix( "uses"), new ClampedItemPropertyFunction() { @Override public float unclampedCall(ItemStack pStack, @Nullable ClientLevel pLevel, @Nullable LivingEntity pEntity, int pSeed) { return switch (pStack.getDamageValue()) { @@ -207,11 +207,11 @@ public float unclampedCall(ItemStack pStack, @Nullable ClientLevel pLevel, @Null }; } }); - ItemProperties.register(BlockRegistry.POTION_JAR.asItem(), new ResourceLocation(ArsNouveau.MODID, "amount"), (stack, level, entity, seed) -> { + ItemProperties.register(BlockRegistry.POTION_JAR.asItem(), ArsNouveau.prefix( "amount"), (stack, level, entity, seed) -> { CompoundTag tag = stack.getTag(); return tag != null ? (tag.getCompound("BlockEntityTag").getInt("currentFill") / 10000.0F) : 0.0F; }); - ItemProperties.register(BlockRegistry.SOURCE_JAR.asItem(), new ResourceLocation(ArsNouveau.MODID, "source"), (stack, level, entity, seed) -> { + ItemProperties.register(BlockRegistry.SOURCE_JAR.asItem(), ArsNouveau.prefix( "source"), (stack, level, entity, seed) -> { CompoundTag tag = stack.getTag(); return tag != null ? (tag.getCompound("BlockEntityTag").getInt("source") / 10000.0F) : 0.0F; }); @@ -248,7 +248,7 @@ public static void initItemColors(final RegisterColorHandlersEvent.Item event) { event.register((stack, color) -> color > 0 ? -1 : new ParticleColor(200, 0, 200).getColor(), - ForgeRegistries.ITEMS.getValue(new ResourceLocation(ArsNouveau.MODID, LibBlockNames.POTION_MELDER_BLOCK))); + ForgeRegistries.ITEMS.getValue(ArsNouveau.prefix( LibBlockNames.POTION_MELDER_BLOCK))); event.register((stack, color) -> color > 0 ? -1 : colorFromArmor(stack), diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModKeyBindings.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModKeyBindings.java index 91725e2093..c0f0fea3ef 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModKeyBindings.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModKeyBindings.java @@ -7,7 +7,7 @@ import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; import org.lwjgl.glfw.GLFW; -import record; + @EventBusSubscriber(modid = ArsNouveau.MODID, value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ShaderRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ShaderRegistry.java index fcedd07839..403c5a437d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ShaderRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ShaderRegistry.java @@ -76,9 +76,9 @@ public static RenderType blamed(ResourceLocation location, boolean outline) { @SubscribeEvent public static void shaderRegistry(RegisterShadersEvent event) throws IOException { - event.registerShader(new ShaderInstance(event.getResourceProvider(), new ResourceLocation(ArsNouveau.MODID, "sky"), DefaultVertexFormat.POSITION), s -> ClientInfo.skyShader = s); - event.registerShader(new ShaderInstance(event.getResourceProvider(), new ResourceLocation(ArsNouveau.MODID, "rainbow_entity"), DefaultVertexFormat.NEW_ENTITY), s -> ClientInfo.rainbowShader = s); - event.registerShader(new ShaderInstance(event.getResourceProvider(), new ResourceLocation(ArsNouveau.MODID, "blamed_entity"), DefaultVertexFormat.NEW_ENTITY), s -> ClientInfo.blameShader = s); + event.registerShader(new ShaderInstance(event.getResourceProvider(), ArsNouveau.prefix( "sky"), DefaultVertexFormat.POSITION), s -> ClientInfo.skyShader = s); + event.registerShader(new ShaderInstance(event.getResourceProvider(), ArsNouveau.prefix( "rainbow_entity"), DefaultVertexFormat.NEW_ENTITY), s -> ClientInfo.rainbowShader = s); + event.registerShader(new ShaderInstance(event.getResourceProvider(), ArsNouveau.prefix( "blamed_entity"), DefaultVertexFormat.NEW_ENTITY), s -> ClientInfo.blameShader = s); } private static TriFunction memoize(final TriFunction pMemoBiFunction) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/ANGeoModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/ANGeoModel.java index 4befb6e1d6..56adc55e32 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/ANGeoModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/ANGeoModel.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.core.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.GeoAnimatable; import software.bernie.geckolib.model.GeoModel; public class ANGeoModel extends GeoModel { @@ -16,7 +16,7 @@ public ANGeoModel(ResourceLocation modelLocation, ResourceLocation textLoc, Reso } public ANGeoModel(String modelLoc, String textLoc, String animationLoc) { - this(new ResourceLocation(ArsNouveau.MODID, modelLoc), new ResourceLocation(ArsNouveau.MODID,textLoc), new ResourceLocation(ArsNouveau.MODID, animationLoc)); + this(ArsNouveau.prefix( modelLoc), ArsNouveau.prefix(textLoc), ArsNouveau.prefix( animationLoc)); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AmethystGolemModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AmethystGolemModel.java index 2cea8f0ba7..60147623f5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AmethystGolemModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AmethystGolemModel.java @@ -8,9 +8,9 @@ public class AmethystGolemModel extends GeoModel { - private static final ResourceLocation WILD_TEXTURE = new ResourceLocation(ArsNouveau.MODID, "textures/entity/amethyst_golem.png"); - public static final ResourceLocation NORMAL_MODEL = new ResourceLocation(ArsNouveau.MODID, "geo/amethyst_golem.geo.json"); - public static final ResourceLocation ANIMATIONS = new ResourceLocation(ArsNouveau.MODID, "animations/amethyst_golem_animations.json"); + private static final ResourceLocation WILD_TEXTURE = ArsNouveau.prefix( "textures/entity/amethyst_golem.png"); + public static final ResourceLocation NORMAL_MODEL = ArsNouveau.prefix( "geo/amethyst_golem.geo.json"); + public static final ResourceLocation ANIMATIONS = ArsNouveau.prefix( "animations/amethyst_golem_animations.json"); @Override public ResourceLocation getModelResource(T drygmy) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AmethystGolemRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AmethystGolemRenderer.java index 5d2ec108b2..f16d3542b4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AmethystGolemRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AmethystGolemRenderer.java @@ -14,7 +14,7 @@ import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.renderer.GeoEntityRenderer; -import software.bernie.geckolib.util.RenderUtils; +import software.bernie.geckolib.util.RenderUtil; public class AmethystGolemRenderer extends GeoEntityRenderer { @@ -43,7 +43,7 @@ public void preRender(PoseStack poseStack, AmethystGolem animatable, BakedGeoMod public void renderRecursively(PoseStack stack, AmethystGolem animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { if (bone.getName().equals("item")) { stack.pushPose(); - RenderUtils.translateToPivotPoint(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); stack.translate(0, -0.10, 0); ItemStack itemstack = golem.getHeldStack(); Minecraft.getInstance().getItemRenderer().renderStatic(itemstack, ItemDisplayContext.GROUND, packedLight, OverlayTexture.NO_OVERLAY, stack, this.buffer, animatable.level, (int) golem.getOnPos().asLong()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java index 7c34613008..2442e78cae 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java @@ -20,20 +20,20 @@ import net.neoforged.neoforge.client.model.data.ModelData; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.Color; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.object.Color; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.renderer.GeoEntityRenderer; -import software.bernie.geckolib.util.RenderUtils; -import var; +import software.bernie.geckolib.util.RenderUtil; + public class AnimBlockRenderer extends GeoEntityRenderer { - protected static final ResourceLocation TEXTURE = new ResourceLocation(ArsNouveau.MODID, "textures/entity/anim_block.png"); - public static final ResourceLocation BASE_MODEL = new ResourceLocation(ArsNouveau.MODID, "geo/animated_block.geo.json"); - public static final ResourceLocation ANIMATIONS = new ResourceLocation(ArsNouveau.MODID, "animations/animated_block_animations.json"); + protected static final ResourceLocation TEXTURE = ArsNouveau.prefix( "textures/entity/anim_block.png"); + public static final ResourceLocation BASE_MODEL = ArsNouveau.prefix( "geo/animated_block.geo.json"); + public static final ResourceLocation ANIMATIONS = ArsNouveau.prefix( "animations/animated_block_animations.json"); private final BlockRenderDispatcher dispatcher; protected MultiBufferSource bufferSource; @@ -93,7 +93,7 @@ public void renderRecursively(PoseStack poseStack, BOBBY animatable, GeoBone bon if (blockstate != level.getBlockState(animBlock.blockPosition()) && blockstate.getRenderShape() != RenderShape.INVISIBLE) { poseStack.pushPose(); BlockPos blockpos = animBlock.blockPosition().above(); - RenderUtils.translateToPivotPoint(poseStack, bone); + RenderUtil.translateToPivotPoint(poseStack, bone); poseStack.translate(-0.5D, -0.5, -0.5D); var model = this.dispatcher.getBlockModel(blockstate); for (var renderType : model.getRenderTypes(blockstate, RandomSource.create(blockstate.getSeed(animBlock.blockPosition())), ModelData.EMPTY)) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmModel.java index 6d1a685e12..8d6e988b0c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmModel.java @@ -4,9 +4,9 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.core.animatable.GeoAnimatable; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -14,9 +14,9 @@ public class BookwyrmModel extends GeoModel { - private static final ResourceLocation WILD_TEXTURE = new ResourceLocation(ArsNouveau.MODID, "textures/entity/book_wyrm_blue.png"); - public static final ResourceLocation NORMAL_MODEL = new ResourceLocation(ArsNouveau.MODID, "geo/book_wyrm.geo.json"); - public static final ResourceLocation ANIMATIONS = new ResourceLocation(ArsNouveau.MODID, "animations/book_wyrm_animation.json"); + private static final ResourceLocation WILD_TEXTURE = ArsNouveau.prefix( "textures/entity/book_wyrm_blue.png"); + public static final ResourceLocation NORMAL_MODEL = ArsNouveau.prefix( "geo/book_wyrm.geo.json"); + public static final ResourceLocation ANIMATIONS = ArsNouveau.prefix( "animations/book_wyrm_animation.json"); @Override public void setCustomAnimations(T entity, long uniqueID, @Nullable AnimationState customPredicate) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmRenderer.java index 6d7e3bbef5..870471bdcb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmRenderer.java @@ -13,12 +13,12 @@ import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.util.RenderUtils; +import software.bernie.geckolib.util.RenderUtil; public class BookwyrmRenderer extends TextureVariantRenderer { - public static ResourceLocation BLUE = new ResourceLocation(ArsNouveau.MODID, "textures/entity/book_wyrm_blue.png"); + public static ResourceLocation BLUE = ArsNouveau.prefix( "textures/entity/book_wyrm_blue.png"); public BookwyrmRenderer(EntityRendererProvider.Context manager) { super(manager, new BookwyrmModel<>()); @@ -29,7 +29,7 @@ public BookwyrmRenderer(EntityRendererProvider.Context manager) { public void renderRecursively(PoseStack stack, EntityBookwyrm animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferIn, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { if (bone.getName().equals("item")) { stack.pushPose(); - RenderUtils.translateToPivotPoint(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); stack.translate(0, -0.10, 0); stack.scale(0.75f, 0.75f, 0.75f); ItemStack itemstack = animatable.getHeldStack(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/ChimeraProjectileModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/ChimeraProjectileModel.java index d1b5bb85c7..e177237b78 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/ChimeraProjectileModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/ChimeraProjectileModel.java @@ -7,11 +7,11 @@ public class ChimeraProjectileModel extends GeoModel { - private static final ResourceLocation TEXTURE = new ResourceLocation(ArsNouveau.MODID, "textures/entity/spike.png"); + private static final ResourceLocation TEXTURE = ArsNouveau.prefix( "textures/entity/spike.png"); - public static final ResourceLocation NORMAL_MODEL = new ResourceLocation(ArsNouveau.MODID, "geo/spike.geo.json"); + public static final ResourceLocation NORMAL_MODEL = ArsNouveau.prefix( "geo/spike.geo.json"); - public static final ResourceLocation ANIMATIONS = new ResourceLocation(ArsNouveau.MODID, "animations/spike_animations.json"); + public static final ResourceLocation ANIMATIONS = ArsNouveau.prefix( "animations/spike_animations.json"); @Override public ResourceLocation getModelResource(EntityChimeraProjectile object) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/DrygmyModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/DrygmyModel.java index 7349b1f8a5..76941a5ca4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/DrygmyModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/DrygmyModel.java @@ -4,9 +4,9 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.core.animatable.GeoAnimatable; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -14,9 +14,9 @@ public class DrygmyModel extends GeoModel { - private static final ResourceLocation WILD_TEXTURE = new ResourceLocation(ArsNouveau.MODID, "textures/entity/drygmy.png"); - public static final ResourceLocation NORMAL_MODEL = new ResourceLocation(ArsNouveau.MODID, "geo/drygmy.geo.json"); - public static final ResourceLocation ANIMATIONS = new ResourceLocation(ArsNouveau.MODID, "animations/drygmy_animations.json"); + private static final ResourceLocation WILD_TEXTURE = ArsNouveau.prefix( "textures/entity/drygmy.png"); + public static final ResourceLocation NORMAL_MODEL = ArsNouveau.prefix( "geo/drygmy.geo.json"); + public static final ResourceLocation ANIMATIONS = ArsNouveau.prefix( "animations/drygmy_animations.json"); @Override public void setCustomAnimations(T entity, long uniqueID, @Nullable AnimationState customPredicate) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GiftStarbyModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GiftStarbyModel.java index 2dbf5be082..3f7ce1d0f7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GiftStarbyModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GiftStarbyModel.java @@ -4,17 +4,17 @@ import com.hollingsworth.arsnouveau.common.entity.GiftStarbuncle; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; import javax.annotation.Nullable; public class GiftStarbyModel extends GeoModel { - private static final ResourceLocation WILD_TEXTURE = new ResourceLocation(ArsNouveau.MODID, "textures/entity/gift_starby.png"); - public static final ResourceLocation NORMAL_MODEL = new ResourceLocation(ArsNouveau.MODID, "geo/gift_starby.geo.json"); - public static final ResourceLocation ANIMATIONS = new ResourceLocation(ArsNouveau.MODID, "animations/starbuncle_animations.json"); + private static final ResourceLocation WILD_TEXTURE = ArsNouveau.prefix( "textures/entity/gift_starby.png"); + public static final ResourceLocation NORMAL_MODEL = ArsNouveau.prefix( "geo/gift_starby.geo.json"); + public static final ResourceLocation ANIMATIONS = ArsNouveau.prefix( "animations/starbuncle_animations.json"); @Override public void setCustomAnimations(GiftStarbuncle entity, long uniqueID, @Nullable AnimationState customPredicate) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyModel.java index 65926a433e..9b511c8597 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyModel.java @@ -4,8 +4,8 @@ import com.hollingsworth.arsnouveau.common.entity.Lily; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -24,16 +24,16 @@ public void setCustomAnimations(Lily entity, long uniqueID, @Nullable AnimationS @Override public ResourceLocation getModelResource(Lily whirlisprig) { - return new ResourceLocation(ArsNouveau.MODID, "geo/lily.geo.json"); + return ArsNouveau.prefix( "geo/lily.geo.json"); } @Override public ResourceLocation getTextureResource(Lily whirlisprig) { - return new ResourceLocation(ArsNouveau.MODID, "textures/entity/lily.png"); + return ArsNouveau.prefix( "textures/entity/lily.png"); } @Override public ResourceLocation getAnimationResource(Lily whirlisprig) { - return new ResourceLocation(ArsNouveau.MODID, "animations/lily_animations.json"); + return ArsNouveau.prefix( "animations/lily_animations.json"); } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/RenderFlyingItem.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/RenderFlyingItem.java index b09269de32..95c3833127 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/RenderFlyingItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/RenderFlyingItem.java @@ -28,6 +28,6 @@ public void render(EntityFlyingItem entityIn, float entityYaw, float partialTick @Override public ResourceLocation getTextureLocation(EntityFlyingItem entity) { - return new ResourceLocation(ArsNouveau.MODID, "textures/entity/spell_proj.png"); + return ArsNouveau.prefix( "textures/entity/spell_proj.png"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java index fda03fbce8..8c02489586 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java @@ -4,8 +4,8 @@ import com.hollingsworth.arsnouveau.common.entity.Starbuncle; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -30,7 +30,7 @@ public void setCustomAnimations(Starbuncle entity, long uniqueID, @Nullable Anim @Override public ResourceLocation getModelResource(Starbuncle carbuncle) { - return new ResourceLocation(ArsNouveau.MODID, "geo/starbuncle.geo.json"); + return ArsNouveau.prefix( "geo/starbuncle.geo.json"); } @Override @@ -40,6 +40,6 @@ public ResourceLocation getTextureResource(Starbuncle carbuncle) { @Override public ResourceLocation getAnimationResource(Starbuncle carbuncle) { - return new ResourceLocation(ArsNouveau.MODID, "animations/starbuncle_animations.json"); + return ArsNouveau.prefix( "animations/starbuncle_animations.json"); } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleRenderer.java index 0e9ea2d657..8998aec7f5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleRenderer.java @@ -20,7 +20,7 @@ import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.renderer.GeoEntityRenderer; -import software.bernie.geckolib.util.RenderUtils; +import software.bernie.geckolib.util.RenderUtil; public class StarbuncleRenderer extends GeoEntityRenderer { public static MultiBufferSource.BufferSource cosmeticBuffer = MultiBufferSource.immediate(new BufferBuilder(256)); @@ -40,7 +40,7 @@ public void renderRecursively(PoseStack stack, Starbuncle animatable, GeoBone bo super.renderRecursively(stack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); if (bone.getName().equals("item")) { stack.pushPose(); - RenderUtils.translateToPivotPoint(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); stack.translate(0, -0.10, 0); stack.scale(0.75f, 0.75f, 0.75f); ItemStack itemstack = animatable.getHeldStack(); @@ -69,7 +69,7 @@ public RenderType getRenderType(Starbuncle animatable, ResourceLocation textureL if(animatable.getName().getString().equals("Splonk")) { return ShaderRegistry.blamed(textureLocation, true); }else if(animatable.getName().getString().equals("Bailey")){ - return ShaderRegistry.rainbowEntity(textureLocation, new ResourceLocation(ArsNouveau.MODID, "textures/entity/starbuncle_mask.png"),true); + return ShaderRegistry.rainbowEntity(textureLocation, ArsNouveau.prefix( "textures/entity/starbuncle_mask.png"),true); } return RenderType.entityCutoutNoCull(textureLocation); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WealdWalkerModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WealdWalkerModel.java index 275f811a60..2e734a591b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WealdWalkerModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WealdWalkerModel.java @@ -5,8 +5,8 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -38,16 +38,16 @@ public void setCustomAnimations(W entity, long uniqueID, @Nullable AnimationStat @Override public ResourceLocation getModelResource(WealdWalker walker) { - return walker.isBaby() ? new ResourceLocation(ArsNouveau.MODID, "geo/" + type + "_waddler.geo.json") : new ResourceLocation(ArsNouveau.MODID, "geo/" + type + "_walker.geo.json"); + return walker.isBaby() ? ArsNouveau.prefix( "geo/" + type + "_waddler.geo.json") : ArsNouveau.prefix( "geo/" + type + "_walker.geo.json"); } @Override public ResourceLocation getTextureResource(WealdWalker walker) { - return walker.isBaby() ? new ResourceLocation(ArsNouveau.MODID, "textures/entity/" + type + "_waddler.png") : new ResourceLocation(ArsNouveau.MODID, "textures/entity/" + type + "_walker.png"); + return walker.isBaby() ? ArsNouveau.prefix( "textures/entity/" + type + "_waddler.png") : ArsNouveau.prefix( "textures/entity/" + type + "_walker.png"); } @Override public ResourceLocation getAnimationResource(WealdWalker walker) { - return walker.isBaby() ? new ResourceLocation(ArsNouveau.MODID, "animations/weald_waddler_animations.json") : new ResourceLocation(ArsNouveau.MODID, "animations/weald_walker_animations.json"); + return walker.isBaby() ? ArsNouveau.prefix( "animations/weald_waddler_animations.json") : ArsNouveau.prefix( "animations/weald_walker_animations.json"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WhirlisprigModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WhirlisprigModel.java index 07f4eb3f34..6a50a587b2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WhirlisprigModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WhirlisprigModel.java @@ -4,9 +4,9 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.core.animatable.GeoAnimatable; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -25,16 +25,16 @@ public void setCustomAnimations(T entity, long uniqueID, @Nullable AnimationStat @Override public ResourceLocation getModelResource(T whirlisprig) { - return new ResourceLocation(ArsNouveau.MODID, "geo/whirlisprig.geo.json"); + return ArsNouveau.prefix( "geo/whirlisprig.geo.json"); } @Override public ResourceLocation getTextureResource(T whirlisprig) { - return new ResourceLocation(ArsNouveau.MODID, "textures/entity/whirlisprig.png"); + return ArsNouveau.prefix( "textures/entity/whirlisprig.png"); } @Override public ResourceLocation getAnimationResource(T whirlisprig) { - return new ResourceLocation(ArsNouveau.MODID, "animations/whirlisprig_animations.json"); + return ArsNouveau.prefix( "animations/whirlisprig_animations.json"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenChimeraModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenChimeraModel.java index 038d687b7d..af6545b19a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenChimeraModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenChimeraModel.java @@ -4,8 +4,8 @@ import com.hollingsworth.arsnouveau.common.entity.WildenChimera; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -13,9 +13,9 @@ public class WildenChimeraModel extends GeoModel { - private static final ResourceLocation TEXTURE = new ResourceLocation(ArsNouveau.MODID, "textures/entity/wilden_chimera.png"); - public static final ResourceLocation NORMAL_MODEL = new ResourceLocation(ArsNouveau.MODID, "geo/wilden_chimera.geo.json"); - public static final ResourceLocation ANIMATIONS = new ResourceLocation(ArsNouveau.MODID, "animations/wilden_chimera_animations.json"); + private static final ResourceLocation TEXTURE = ArsNouveau.prefix( "textures/entity/wilden_chimera.png"); + public static final ResourceLocation NORMAL_MODEL = ArsNouveau.prefix( "geo/wilden_chimera.geo.json"); + public static final ResourceLocation ANIMATIONS = ArsNouveau.prefix( "animations/wilden_chimera_animations.json"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenGuardianModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenGuardianModel.java index e7385a595f..5633c87396 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenGuardianModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenGuardianModel.java @@ -4,16 +4,16 @@ import com.hollingsworth.arsnouveau.common.entity.WildenGuardian; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; public class WildenGuardianModel extends GeoModel { - public static final ResourceLocation WARDER_NEUTRAL = new ResourceLocation(ArsNouveau.MODID, "geo/wilden_guardian.geo.json"); - public static final ResourceLocation TEXT = new ResourceLocation(ArsNouveau.MODID, "textures/entity/wilden_guardian.png"); - public static final ResourceLocation ANIM = new ResourceLocation(ArsNouveau.MODID, "animations/wilden_defender_animations.json"); + public static final ResourceLocation WARDER_NEUTRAL = ArsNouveau.prefix( "geo/wilden_guardian.geo.json"); + public static final ResourceLocation TEXT = ArsNouveau.prefix( "textures/entity/wilden_guardian.png"); + public static final ResourceLocation ANIM = ArsNouveau.prefix( "animations/wilden_defender_animations.json"); @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenHunterModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenHunterModel.java index ef2390352f..1db358aca1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenHunterModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenHunterModel.java @@ -4,8 +4,8 @@ import com.hollingsworth.arsnouveau.common.entity.WildenHunter; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -22,16 +22,16 @@ public void setCustomAnimations(WildenHunter entity, long uniqueID, AnimationSta @Override public ResourceLocation getModelResource(WildenHunter hunter) { - return new ResourceLocation(ArsNouveau.MODID, "geo/wilden_hunter.geo.json"); + return ArsNouveau.prefix( "geo/wilden_hunter.geo.json"); } @Override public ResourceLocation getTextureResource(WildenHunter hunter) { - return new ResourceLocation(ArsNouveau.MODID, "textures/entity/wilden_hunter.png"); + return ArsNouveau.prefix( "textures/entity/wilden_hunter.png"); } @Override public ResourceLocation getAnimationResource(WildenHunter hunter) { - return new ResourceLocation(ArsNouveau.MODID, "animations/wilden_hunter_animations.json"); + return ArsNouveau.prefix( "animations/wilden_hunter_animations.json"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenStalkerModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenStalkerModel.java index d29401286c..275bfe349b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenStalkerModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenStalkerModel.java @@ -4,8 +4,8 @@ import com.hollingsworth.arsnouveau.common.entity.WildenStalker; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -30,17 +30,17 @@ public void setCustomAnimations(WildenStalker entity, long uniqueID, @Nullable A @Override public ResourceLocation getModelResource(WildenStalker wildenStalker) { - return new ResourceLocation(ArsNouveau.MODID, "geo/wilden_stalker.geo.json"); + return ArsNouveau.prefix( "geo/wilden_stalker.geo.json"); } @Override public ResourceLocation getTextureResource(WildenStalker wildenStalker) { - return new ResourceLocation(ArsNouveau.MODID, "textures/entity/wilden_stalker.png"); + return ArsNouveau.prefix( "textures/entity/wilden_stalker.png"); } @Override public ResourceLocation getAnimationResource(WildenStalker wildenStalker) { - return new ResourceLocation(ArsNouveau.MODID, "animations/wilden_stalker_animations.json"); + return ArsNouveau.prefix( "animations/wilden_stalker_animations.json"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WixieModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WixieModel.java index 39f478c34e..0f59089bf0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WixieModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WixieModel.java @@ -4,9 +4,9 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.core.animatable.GeoAnimatable; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -14,7 +14,7 @@ public class WixieModel extends GeoModel { - private static final ResourceLocation WILD_TEXTURE = new ResourceLocation(ArsNouveau.MODID, "textures/entity/wixie.png"); + private static final ResourceLocation WILD_TEXTURE = ArsNouveau.prefix( "textures/entity/wixie.png"); @Override public void setCustomAnimations(T entity, long uniqueID, @Nullable AnimationState customPredicate) { @@ -27,7 +27,7 @@ public void setCustomAnimations(T entity, long uniqueID, @Nullable AnimationStat @Override public ResourceLocation getModelResource(T entityWixie) { - return new ResourceLocation(ArsNouveau.MODID, "geo/wixie.geo.json"); + return ArsNouveau.prefix( "geo/wixie.geo.json"); } @Override @@ -37,6 +37,6 @@ public ResourceLocation getTextureResource(T entityWixie) { @Override public ResourceLocation getAnimationResource(T entityWixie) { - return new ResourceLocation(ArsNouveau.MODID, "animations/wixie_animations.json"); + return ArsNouveau.prefix( "animations/wixie_animations.json"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/AnimSkullRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/AnimSkullRenderer.java index deddc19848..a040d9b7f1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/AnimSkullRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/AnimSkullRenderer.java @@ -10,7 +10,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRendererProvider; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.util.RenderUtils; +import software.bernie.geckolib.util.RenderUtil; public class AnimSkullRenderer extends AnimBlockRenderer { @@ -25,7 +25,7 @@ public void renderRecursively(PoseStack poseStack, AnimHeadSummon animatable, Ge AnimHeadSummon animBlock = animatable; if (animBlock == null) return; poseStack.pushPose(); - RenderUtils.translateToPivotPoint(poseStack, bone); + RenderUtil.translateToPivotPoint(poseStack, bone); poseStack.mulPose(Axis.YP.rotationDegrees(180)); poseStack.translate(0,0.2,0); poseStack.scale(1.4F, 1.4F, 1.4F); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarStarbyModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarStarbyModel.java index 4aed881c14..e9bf5b17dc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarStarbyModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarStarbyModel.java @@ -4,8 +4,8 @@ import com.hollingsworth.arsnouveau.common.entity.familiar.FamiliarStarbuncle; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -24,7 +24,7 @@ public void setCustomAnimations(T entity, long uniqueID, @Nullable AnimationStat @Override public ResourceLocation getModelResource(FamiliarStarbuncle carbuncle) { - return new ResourceLocation(ArsNouveau.MODID, "geo/starbuncle.geo.json"); + return ArsNouveau.prefix( "geo/starbuncle.geo.json"); } @Override @@ -34,7 +34,7 @@ public ResourceLocation getTextureResource(FamiliarStarbuncle carbuncle) { @Override public ResourceLocation getAnimationResource(FamiliarStarbuncle carbuncle) { - return new ResourceLocation(ArsNouveau.MODID, "animations/starbuncle_animations.json"); + return ArsNouveau.prefix( "animations/starbuncle_animations.json"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java index d7064f36a7..82080be314 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java @@ -11,7 +11,7 @@ import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; +import software.bernie.geckolib.animatable.model.CoreGeoBone; import java.util.Random; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ArmorRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ArmorRenderer.java index 7dbc7839d9..5a519ec685 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ArmorRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ArmorRenderer.java @@ -44,7 +44,7 @@ public void actuallyRender(PoseStack poseStack, AnimatedMagicArmor animatable, B @Override public ResourceLocation getTextureLocation(AnimatedMagicArmor instance) { if(model instanceof GenericModel genericModel){ - return new ResourceLocation(ArsNouveau.MODID, "textures/" + genericModel.textPathRoot + "/" + genericModel.name + "_" + instance.getColor(getCurrentStack()) + ".png"); + return ArsNouveau.prefix( "textures/" + genericModel.textPathRoot + "/" + genericModel.name + "_" + instance.getColor(getCurrentStack()) + ".png"); } return super.getTextureLocation(instance); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java index 68fbbc9471..7c34d1f0af 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java @@ -10,7 +10,7 @@ import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.core.object.Color; +import software.bernie.geckolib.object.Color; import software.bernie.geckolib.model.GeoModel; public class ScryCasterRenderer extends FixedGeoItemRenderer{ @@ -18,17 +18,17 @@ public ScryCasterRenderer() { super(new GeoModel() { @Override public ResourceLocation getModelResource(ScryCaster wand) { - return new ResourceLocation(ArsNouveau.MODID, "geo/enchanters_eye.geo.json"); + return ArsNouveau.prefix( "geo/enchanters_eye.geo.json"); } @Override public ResourceLocation getTextureResource(ScryCaster wand) { - return new ResourceLocation(ArsNouveau.MODID, "textures/item/enchanters_eye.png"); + return ArsNouveau.prefix( "textures/item/enchanters_eye.png"); } @Override public ResourceLocation getAnimationResource(ScryCaster wand) { - return new ResourceLocation(ArsNouveau.MODID, "animations/enchanters_eye.json"); + return ArsNouveau.prefix( "animations/enchanters_eye.json"); } }); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ShieldModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ShieldModel.java index 465c21b6c6..c4f6cc5713 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ShieldModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ShieldModel.java @@ -9,16 +9,16 @@ public class ShieldModel extends GeoModel { @Override public ResourceLocation getModelResource(EnchantersShield wand) { - return new ResourceLocation(ArsNouveau.MODID, "geo/shield.geo.json"); + return ArsNouveau.prefix( "geo/shield.geo.json"); } @Override public ResourceLocation getTextureResource(EnchantersShield wand) { - return new ResourceLocation(ArsNouveau.MODID, "textures/item/enchanters_shield.png"); + return ArsNouveau.prefix( "textures/item/enchanters_shield.png"); } @Override public ResourceLocation getAnimationResource(EnchantersShield wand) { - return new ResourceLocation(ArsNouveau.MODID, "animations/shield.json"); + return ArsNouveau.prefix( "animations/shield.json"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookModel.java index 0272809622..d29233688d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookModel.java @@ -6,11 +6,11 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemDisplayContext; import org.jetbrains.annotations.Nullable; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animation.AnimationState; public class SpellBookModel extends TransformAnimatedModel { - public static final ResourceLocation OPEN = new ResourceLocation(ArsNouveau.MODID, "geo/spellbook_open.geo.json"); - public static final ResourceLocation CLOSED = new ResourceLocation(ArsNouveau.MODID, "geo/spellbook_closed.geo.json"); + public static final ResourceLocation OPEN = ArsNouveau.prefix( "geo/spellbook_open.geo.json"); + public static final ResourceLocation CLOSED = ArsNouveau.prefix( "geo/spellbook_closed.geo.json"); public ResourceLocation modelLoc; @@ -41,12 +41,12 @@ public ResourceLocation getModelResource(SpellBook object, @Nullable ItemDisplay @Override public ResourceLocation getTextureResource(SpellBook object) { - return new ResourceLocation(ArsNouveau.MODID, "textures/item/spellbook_purple.png"); + return ArsNouveau.prefix( "textures/item/spellbook_purple.png"); } @Override public ResourceLocation getAnimationResource(SpellBook animatable) { - return new ResourceLocation(ArsNouveau.MODID, "animations/empty.json"); + return ArsNouveau.prefix( "animations/empty.json"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java index 93b9cb27f2..0897ce32e6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java @@ -14,7 +14,7 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemDisplayContext; import software.bernie.geckolib.cache.object.BakedGeoModel; -import software.bernie.geckolib.core.object.Color; +import software.bernie.geckolib.object.Color; import software.bernie.geckolib.model.GeoModel; import javax.annotation.Nullable; @@ -101,7 +101,7 @@ public void defaultRenderGui(PoseStack poseStack, SpellBook animatable, MultiBuf public ResourceLocation getTextureLocation(SpellBook o) { String base = "textures/item/spellbook_"; String color = !currentItemStack.hasTag() || !currentItemStack.getTag().contains("color") ? "purple" : DyeColor.byId(currentItemStack.getOrCreateTag().getInt("color")).getName(); - return new ResourceLocation(ArsNouveau.MODID, base + color + ".png"); + return ArsNouveau.prefix( base + color + ".png"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java index 7690d9ac7d..46789e61d3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java @@ -19,8 +19,8 @@ import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.core.object.Color; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.object.Color; public class SpellBowRenderer extends FixedGeoItemRenderer { public SpellBowRenderer() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java index a524b62789..926e193e66 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java @@ -19,8 +19,8 @@ import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.core.object.Color; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.object.Color; public class SpellCrossbowRenderer extends FixedGeoItemRenderer { public SpellCrossbowRenderer() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java index 82c2f476e6..d066d56732 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java @@ -9,7 +9,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.core.object.Color; +import software.bernie.geckolib.object.Color; import software.bernie.geckolib.model.GeoModel; public class SwordRenderer extends FixedGeoItemRenderer { @@ -17,17 +17,17 @@ public SwordRenderer() { super(new GeoModel() { @Override public ResourceLocation getModelResource(EnchantersSword wand) { - return new ResourceLocation(ArsNouveau.MODID, "geo/sword.geo.json"); + return ArsNouveau.prefix( "geo/sword.geo.json"); } @Override public ResourceLocation getTextureResource(EnchantersSword wand) { - return new ResourceLocation(ArsNouveau.MODID, "textures/item/enchanters_sword.png"); + return ArsNouveau.prefix( "textures/item/enchanters_sword.png"); } @Override public ResourceLocation getAnimationResource(EnchantersSword wand) { - return new ResourceLocation(ArsNouveau.MODID, "animations/sword.json"); + return ArsNouveau.prefix( "animations/sword.json"); } }); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/TransformAnimatedModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/TransformAnimatedModel.java index 8862c06368..09bcee1b30 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/TransformAnimatedModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/TransformAnimatedModel.java @@ -2,7 +2,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemDisplayContext; -import software.bernie.geckolib.core.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.GeoAnimatable; import software.bernie.geckolib.model.GeoModel; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandModel.java index 3adb96972c..0622defa99 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandModel.java @@ -9,16 +9,16 @@ public class WandModel extends GeoModel { @Override public ResourceLocation getModelResource(Wand wand) { - return new ResourceLocation(ArsNouveau.MODID, "geo/wand.geo.json"); + return ArsNouveau.prefix( "geo/wand.geo.json"); } @Override public ResourceLocation getTextureResource(Wand wand) { - return new ResourceLocation(ArsNouveau.MODID, "textures/item/wand.png"); + return ArsNouveau.prefix( "textures/item/wand.png"); } @Override public ResourceLocation getAnimationResource(Wand wand) { - return new ResourceLocation(ArsNouveau.MODID, "animations/wand_animation.json"); + return ArsNouveau.prefix( "animations/wand_animation.json"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java index dffd6e48ca..e0324eb481 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java @@ -8,7 +8,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.core.object.Color; +import software.bernie.geckolib.object.Color; public class WandRenderer extends FixedGeoItemRenderer { public WandRenderer() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java index 8b64cff07e..9e35946d75 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java @@ -38,7 +38,7 @@ import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.renderer.GeoBlockRenderer; -import software.bernie.geckolib.util.RenderUtils; +import software.bernie.geckolib.util.RenderUtil; import javax.annotation.Nullable; import java.util.List; @@ -109,7 +109,7 @@ public void renderPerks(AlterationTile tile, PoseStack matrixStack, float ticks, matrixStack.mulPose(Axis.XP.rotation(-bone.getRotX())); } GeoBone locBone = model.getBone("top_" + (i + 1)).get(); - RenderUtils.translateToPivotPoint(matrixStack, locBone); + RenderUtil.translateToPivotPoint(matrixStack, locBone); matrixStack.scale(0.18f, 0.18f, 0.18f); Minecraft.getInstance().getItemRenderer().renderStatic(perkStack, ItemDisplayContext.FIXED, packedLightIn, packedOverlayIn, matrixStack, iRenderTypeBuffer, tile.getLevel(), (int) tile.getBlockPos().asLong()); matrixStack.popPose(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ArchwoodChestRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ArchwoodChestRenderer.java index 57b8480ca9..c298a9f094 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ArchwoodChestRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ArchwoodChestRenderer.java @@ -105,12 +105,12 @@ protected Material getMaterial(T tileEntity, ChestType chestType) { String type = "archwood"; switch (chestType) { case LEFT: - return new Material(Sheets.CHEST_SHEET, new ResourceLocation(ArsNouveau.MODID, "model/chest/" + type + "/left")); + return new Material(Sheets.CHEST_SHEET, ArsNouveau.prefix( "model/chest/" + type + "/left")); case RIGHT: - return new Material(Sheets.CHEST_SHEET, new ResourceLocation(ArsNouveau.MODID, "model/chest/" + type + "/right")); + return new Material(Sheets.CHEST_SHEET, ArsNouveau.prefix( "model/chest/" + type + "/right")); case SINGLE: default: - return new Material(Sheets.CHEST_SHEET,new ResourceLocation(ArsNouveau.MODID, "model/chest/" + type + "/" + type)); + return new Material(Sheets.CHEST_SHEET,ArsNouveau.prefix( "model/chest/" + type + "/" + type)); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/BasicTurretRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/BasicTurretRenderer.java index a7bae88e2c..3ec3d8399b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/BasicTurretRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/BasicTurretRenderer.java @@ -13,8 +13,8 @@ import net.minecraft.util.Mth; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.core.animatable.GeoAnimatable; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import java.util.Optional; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantedFallingBlockRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantedFallingBlockRenderer.java index 538a620d31..135228b1d2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantedFallingBlockRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantedFallingBlockRenderer.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; -import var; + public class EnchantedFallingBlockRenderer extends EntityRenderer { private final BlockRenderDispatcher dispatcher; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantingApparatusRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantingApparatusRenderer.java index 38080db518..624ca28f04 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantingApparatusRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantingApparatusRenderer.java @@ -11,8 +11,8 @@ import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import software.bernie.geckolib.cache.object.BakedGeoModel; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; -import software.bernie.geckolib.util.RenderUtils; +import software.bernie.geckolib.animatable.model.CoreGeoBone; +import software.bernie.geckolib.util.RenderUtil; public class EnchantingApparatusRenderer extends ArsGeoBlockRenderer { @@ -33,7 +33,7 @@ public void renderFinal(PoseStack stack, EnchantingApparatusTile tile, BakedGeoM tile.renderEntity = new ItemEntity(tile.getLevel(), x, y, z, tile.getStack()); } stack.pushPose(); - RenderUtils.translateMatrixToBone(stack, frame); + RenderUtil.translateMatrixToBone(stack, frame); stack.translate(0.5, +0.5, 0.5); stack.scale(0.75f, 0.75f, 0.75f); ItemStack itemstack = tile.renderEntity.getItem(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericModel.java index b886c0a268..8533a851c2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericModel.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.core.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.GeoAnimatable; import software.bernie.geckolib.model.GeoModel; @@ -16,20 +16,20 @@ public class GenericModel extends GeoModel { public String name; public GenericModel(String name) { - this.modelLocation = new ResourceLocation(ArsNouveau.MODID, "geo/" + name + ".geo.json"); - this.textLoc = new ResourceLocation(ArsNouveau.MODID, "textures/" + textPathRoot + "/" + name + ".png"); - this.animationLoc = new ResourceLocation(ArsNouveau.MODID, "animations/" + name + "_animations.json"); + this.modelLocation = ArsNouveau.prefix( "geo/" + name + ".geo.json"); + this.textLoc = ArsNouveau.prefix( "textures/" + textPathRoot + "/" + name + ".png"); + this.animationLoc = ArsNouveau.prefix( "animations/" + name + "_animations.json"); this.name = name; } public GenericModel(String name, String textPath) { this(name); this.textPathRoot = textPath; - this.textLoc = new ResourceLocation(ArsNouveau.MODID, "textures/" + textPathRoot + "/" + name + ".png"); + this.textLoc = ArsNouveau.prefix( "textures/" + textPathRoot + "/" + name + ".png"); } public GenericModel withEmptyAnim(){ - this.animationLoc = new ResourceLocation(ArsNouveau.MODID, "animations/empty.json"); + this.animationLoc = ArsNouveau.prefix( "animations/empty.json"); return this; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PotionMelderModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PotionMelderModel.java index 82de4ed6b5..b6819b4016 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PotionMelderModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PotionMelderModel.java @@ -7,9 +7,9 @@ public class PotionMelderModel extends GeoModel { - public static final ResourceLocation model = new ResourceLocation(ArsNouveau.MODID, "geo/potion_melder.geo.json"); - public static final ResourceLocation texture = new ResourceLocation(ArsNouveau.MODID, "textures/block/potion_stirrer.png"); - public static final ResourceLocation anim = new ResourceLocation(ArsNouveau.MODID, "animations/potion_melder_animation.json"); + public static final ResourceLocation model = ArsNouveau.prefix( "geo/potion_melder.geo.json"); + public static final ResourceLocation texture = ArsNouveau.prefix( "textures/block/potion_stirrer.png"); + public static final ResourceLocation anim = ArsNouveau.prefix( "animations/potion_melder_animation.json"); @Override public ResourceLocation getModelResource(PotionMelderTile volcanicTile) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RedstoneRelayRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RedstoneRelayRenderer.java index a557c561e4..1096121a13 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RedstoneRelayRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RedstoneRelayRenderer.java @@ -11,7 +11,7 @@ import net.minecraft.world.level.block.RedStoneWireBlock; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.core.object.Color; +import software.bernie.geckolib.object.Color; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RepositoryModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RepositoryModel.java index f3bf2e408c..c6b21b10ad 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RepositoryModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RepositoryModel.java @@ -3,14 +3,14 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.block.tile.RepositoryTile; import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; public class RepositoryModel extends GeoModel { - public static final ResourceLocation TEXTURE = new ResourceLocation(ArsNouveau.MODID, "textures/block/repository.png"); - public static final ResourceLocation MODEL = new ResourceLocation(ArsNouveau.MODID, "geo/repository.geo.json"); - public static final ResourceLocation ANIMATION = new ResourceLocation(ArsNouveau.MODID, "animations/empty.geo.json"); + public static final ResourceLocation TEXTURE = ArsNouveau.prefix( "textures/block/repository.png"); + public static final ResourceLocation MODEL = ArsNouveau.prefix( "geo/repository.geo.json"); + public static final ResourceLocation ANIMATION = ArsNouveau.prefix( "animations/empty.geo.json"); public RepositoryModel(){ } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScryerOculusRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScryerOculusRenderer.java index d0f403ba90..9fe937cb19 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScryerOculusRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScryerOculusRenderer.java @@ -10,7 +10,7 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.util.Mth; import software.bernie.geckolib.cache.object.BakedGeoModel; -import software.bernie.geckolib.core.animatable.model.CoreGeoBone; +import software.bernie.geckolib.animatable.model.CoreGeoBone; public class ScryerOculusRenderer extends ArsGeoBlockRenderer { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScryersEyeModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScryersEyeModel.java index 1fd3504676..e5c0215efb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScryersEyeModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScryersEyeModel.java @@ -6,10 +6,10 @@ import software.bernie.geckolib.model.GeoModel; public class ScryersEyeModel extends GeoModel { - public static ResourceLocation SQUINTING = new ResourceLocation(ArsNouveau.MODID, "textures/block/scryers_eye_squinting.png"); - public static ResourceLocation IDLE = new ResourceLocation(ArsNouveau.MODID, "textures/block/scryers_eye_idle.png"); - public static final ResourceLocation anim = new ResourceLocation(ArsNouveau.MODID, "animations/scryers_eye_animations.json"); - public static final ResourceLocation model = new ResourceLocation(ArsNouveau.MODID, "geo/scryers_eye.geo.json"); + public static ResourceLocation SQUINTING = ArsNouveau.prefix( "textures/block/scryers_eye_squinting.png"); + public static ResourceLocation IDLE = ArsNouveau.prefix( "textures/block/scryers_eye_idle.png"); + public static final ResourceLocation anim = ArsNouveau.prefix( "animations/scryers_eye_animations.json"); + public static final ResourceLocation model = ArsNouveau.prefix( "geo/scryers_eye.geo.json"); @Override public ResourceLocation getModelResource(ScryersOculusTile object) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/waila/MobJarComponent.java b/src/main/java/com/hollingsworth/arsnouveau/client/waila/MobJarComponent.java index 0383607e8e..40e79dfbad 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/waila/MobJarComponent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/waila/MobJarComponent.java @@ -29,6 +29,6 @@ public void appendTooltip(ITooltip tooltip, BlockAccessor blockAccessor, IPlugin @Override public ResourceLocation getUid() { - return new ResourceLocation(ArsNouveau.MODID, "mob_jar"); + return ArsNouveau.prefix( "mob_jar"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java index 759b3629e0..4782325093 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java @@ -31,8 +31,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoItem; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.renderer.GeoArmorRenderer; import software.bernie.geckolib.util.GeckoLibUtil; @@ -165,7 +165,7 @@ public GeoModel getArmorModel() { @Override public @Nullable String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String type) { GenericModel genericModel = (GenericModel) model; - return new ResourceLocation(ArsNouveau.MODID, "textures/" + genericModel.textPathRoot + "/" + genericModel.name + "_" + this.getColor(stack) + ".png").toString(); + return ArsNouveau.prefix( "textures/" + genericModel.textPathRoot + "/" + genericModel.name + "_" + this.getColor(stack) + ".png").toString(); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java index a1deb292ca..9b2151a7fd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java @@ -80,7 +80,7 @@ public void openMenu(Level pLevel, BlockPos pPos, Player pPlayer) { return; } Networking.INSTANCE.sendToServer(new PacketMountCamera(data.pos)); - }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtils.drawItemAsIcon(slotData.getDefaultInstance(), posestack, positionx, posy, size, transparent), 3))); + }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtil.drawItemAsIcon(slotData.getDefaultInstance(), posestack, positionx, posy, size, transparent), 3))); } @Nullable diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java index 31118327b2..c74642f8a0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java @@ -24,8 +24,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ArcaneCoreTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ArcaneCoreTile.java index 4d5ab1e858..29c282537f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ArcaneCoreTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ArcaneCoreTile.java @@ -4,12 +4,12 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java index 3568c21883..4fb50157ae 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java @@ -13,12 +13,12 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java index 6c7ed2fe18..1e02e7fb6c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java @@ -24,11 +24,11 @@ import net.neoforged.neoforge.items.ItemHandlerHelper; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.*; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantedTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantedTurretTile.java index f4b8b82177..cdf932743f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantedTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantedTurretTile.java @@ -3,11 +3,11 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.state.BlockState; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; public class EnchantedTurretTile extends BasicSpellTurretTile { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java index 04ac6a0526..ad24670c39 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java @@ -27,11 +27,11 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -140,7 +140,8 @@ public List getPedestalItems() { public IEnchantingRecipe getRecipe(ItemStack stack, @Nullable Player playerEntity) { List pedestalItems = getPedestalItems(); - return ArsNouveauAPI.getInstance().getEnchantingApparatusRecipes(level).stream().filter(r -> r.isMatch(pedestalItems, stack, this, playerEntity)).findFirst().orElse(null); + var holder = ArsNouveauAPI.getInstance().getEnchantingApparatusRecipes(level).stream().filter(r -> r.value().isMatch(pedestalItems, stack, this, playerEntity)).findFirst().orElse(null); + return holder != null ? holder.value() : null; } public boolean attemptCraft(ItemStack catalyst, @Nullable Player playerEntity) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java index e7b8f88954..4ce4d4302a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java @@ -33,14 +33,14 @@ import net.neoforged.neoforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; -import var; + import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MirrorWeaveTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MirrorWeaveTile.java index fb13d4f002..1dd62417dc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MirrorWeaveTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MirrorWeaveTile.java @@ -21,8 +21,8 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; public class MirrorWeaveTile extends ModdedTile implements GeoBlockEntity, ILightable { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java index 0bf208624f..d9875d62e6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java @@ -29,13 +29,13 @@ import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.GeoAnimatable; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.ArrayList; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java index d049785c71..ea9721054d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java @@ -21,13 +21,13 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.GeoAnimatable; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RepositoryTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RepositoryTile.java index 2c89fd7f7e..c879d7d959 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RepositoryTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RepositoryTile.java @@ -21,10 +21,10 @@ import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; -import var; + import javax.annotation.Nullable; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java index c6e48473e6..051bae6518 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java @@ -44,8 +44,8 @@ import net.neoforged.api.distmarker.OnlyIn; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java index d6208f5e1c..84e6fdaf6e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java @@ -27,8 +27,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java index 79fb3aea60..24234deab8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java @@ -37,13 +37,13 @@ import net.neoforged.neoforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.GeoAnimatable; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScryersOculusTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScryersOculusTile.java index 5e4f5646c1..199bd1286b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScryersOculusTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScryersOculusTile.java @@ -9,8 +9,8 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.Random; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java index af04705ab9..eb3b4bdaab 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java @@ -15,13 +15,13 @@ import net.minecraft.world.level.block.state.BlockState; import net.neoforged.bus.api.Event; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.GeoAnimatable; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java index 613fcbd2d6..4c2f148fd1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java @@ -28,7 +28,7 @@ import net.minecraft.world.level.block.state.properties.SculkSensorPhase; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import var; + import java.util.List; import java.util.Objects; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java index ecbe804829..e0029cea00 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java @@ -46,7 +46,7 @@ import net.neoforged.neoforge.common.util.LazyOptional; import net.neoforged.neoforge.items.IItemHandler; import org.jetbrains.annotations.Nullable; -import record; + import java.util.*; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TimerSpellTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TimerSpellTurretTile.java index 1e84986b1d..64318253c4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TimerSpellTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TimerSpellTurretTile.java @@ -13,11 +13,11 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java index 74d0bbd424..9c7b24b000 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java @@ -16,7 +16,7 @@ import net.minecraft.world.phys.AABB; import net.neoforged.neoforge.common.CommonHooks; import net.neoforged.neoforge.common.Tags; -import software.bernie.geckolib.core.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.GeoAnimatable; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java index a9c3ca83f4..f9962dd713 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java @@ -26,13 +26,13 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoBlockEntity; -import software.bernie.geckolib.core.animatable.GeoAnimatable; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.ArrayList; @@ -44,9 +44,9 @@ public class WhirlisprigTile extends SummoningTile implements GeoBlockEntity { - public static TagKey KINDA_LIKES = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "whirlisprig/kinda_likes")); - public static TagKey GREATLY_LIKES = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "whirlisprig/greatly_likes")); - public static TagKey DENIED_DROP = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "whirlisprig/denied_drop")); + public static TagKey KINDA_LIKES = BlockTags.create(ArsNouveau.prefix( "whirlisprig/kinda_likes")); + public static TagKey GREATLY_LIKES = BlockTags.create(ArsNouveau.prefix( "whirlisprig/greatly_likes")); + public static TagKey DENIED_DROP = ItemTags.create(ArsNouveau.prefix( "whirlisprig/denied_drop")); public List ignoreItems = new ArrayList<>(); public int ticksToNextEval; public int moodScore; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerCapAttacher.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerCapAttacher.java index 3848f1ae89..9e22ca00a1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerCapAttacher.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerCapAttacher.java @@ -17,7 +17,7 @@ public class ANPlayerCapAttacher { private static class ANPlayerCapProvider implements ICapabilityProvider, INBTSerializable { - public static final ResourceLocation IDENTIFIER = new ResourceLocation(ArsNouveau.MODID, "player_data"); + public static final ResourceLocation IDENTIFIER = ArsNouveau.prefix( "player_data"); private final IPlayerCap backend = new ANPlayerDataCap(); private final LazyOptional optionalData = LazyOptional.of(() -> backend); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/FamiliarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/FamiliarData.java index 07d7930286..1dab5bfcf0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/capability/FamiliarData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/capability/FamiliarData.java @@ -24,7 +24,7 @@ public FamiliarData(ResourceLocation entityID) { public FamiliarData(CompoundTag tag) { this.entityTag = tag.contains(ENTITY_TAG) ? tag.getCompound(ENTITY_TAG) : new CompoundTag(); this.familiarHolder = FamiliarRegistry.getFamiliarHolderMap().getOrDefault(new ResourceLocation(tag.getString(FAMILIAR_ID)), - FamiliarRegistry.getFamiliarHolderMap().get(new ResourceLocation(ArsNouveau.MODID, LibEntityNames.FAMILIAR_WIXIE))); + FamiliarRegistry.getFamiliarHolderMap().get(ArsNouveau.prefix( LibEntityNames.FAMILIAR_WIXIE))); } public CompoundTag toTag() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCapAttacher.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCapAttacher.java index 6226902f7b..6113267e35 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCapAttacher.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCapAttacher.java @@ -18,7 +18,7 @@ public class ManaCapAttacher { private static class ManaCapProvider implements ICapabilityProvider, INBTSerializable { - public static final ResourceLocation IDENTIFIER = new ResourceLocation(ArsNouveau.MODID, "mana"); + public static final ResourceLocation IDENTIFIER = ArsNouveau.prefix( "mana"); private final IManaCap backend = new ManaCap(null); private final LazyOptional optionalData = LazyOptional.of(() -> backend); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/command/SummonAnimHeadCommand.java b/src/main/java/com/hollingsworth/arsnouveau/common/command/SummonAnimHeadCommand.java index 253a084112..753b9f7b74 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/command/SummonAnimHeadCommand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/command/SummonAnimHeadCommand.java @@ -36,7 +36,7 @@ public static void register(CommandDispatcher dispatcher) { private static int summonSkull(CommandSourceStack source, String player_name, int duration, CompoundTag compoundTag, boolean dropSkull) { try { - compoundTag.putString("id",new ResourceLocation(ArsNouveau.MODID, "animated_head").toString()); + compoundTag.putString("id",ArsNouveau.prefix( "animated_head").toString()); Entity entity = EntityType.loadEntityRecursive(compoundTag, source.getLevel(), (p_138828_) -> { p_138828_.moveTo(source.getPosition().x, source.getPosition().y, source.getPosition().z, p_138828_.getYRot(), p_138828_.getXRot()); return p_138828_; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java index e5c4886f0f..252de06698 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java @@ -12,7 +12,7 @@ public class PatchouliHandler { public static void openBookGUI(ServerPlayer player) { - PatchouliAPI.get().openBookGUI(player, new ResourceLocation(ArsNouveau.MODID, "worn_notebook")); + PatchouliAPI.get().openBookGUI(player, ArsNouveau.prefix( "worn_notebook")); } public static void openBookClient(){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java index 58e743c067..b67093beba 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java @@ -46,11 +46,11 @@ public CrushRecipe(ResourceLocation id, Ingredient input, List outp } public CrushRecipe(String id, Ingredient input, List outputs) { - this(new ResourceLocation(ArsNouveau.MODID, "crush_" + id), input, outputs, false); + this(ArsNouveau.prefix( "crush_" + id), input, outputs, false); } public CrushRecipe(String id, Ingredient input, List outputs, boolean skipBlockPlace) { - this(new ResourceLocation(ArsNouveau.MODID, "crush_" + id), input, outputs, skipBlockPlace); + this(ArsNouveau.prefix( "crush_" + id), input, outputs, skipBlockPlace); } public CrushRecipe(String id, Ingredient input) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java index 9850e5548c..2a51e16b93 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java @@ -53,11 +53,11 @@ public ImbuementRecipe(ResourceLocation resourceLocation, Ingredient input, Item } public ImbuementRecipe(String id, Ingredient ingredient, ItemStack output, int source, List pedestalItems) { - this(new ResourceLocation(ArsNouveau.MODID, RecipeRegistry.IMBUEMENT_RECIPE_ID + "_" + id), ingredient, output, source, pedestalItems); + this(ArsNouveau.prefix( RecipeRegistry.IMBUEMENT_RECIPE_ID + "_" + id), ingredient, output, source, pedestalItems); } public ImbuementRecipe(String id, Ingredient ingredient, ItemStack output, int source) { - this(new ResourceLocation(ArsNouveau.MODID, RecipeRegistry.IMBUEMENT_RECIPE_ID + "_" + id), ingredient, output, source, new ArrayList<>()); + this(ArsNouveau.prefix( RecipeRegistry.IMBUEMENT_RECIPE_ID + "_" + id), ingredient, output, source, new ArrayList<>()); } public ImbuementRecipe withPedestalItem(Ingredient i) { @@ -115,7 +115,7 @@ public RecipeSerializer getSerializer() { @Override public RecipeType getType() { - return BuiltInRegistries.RECIPE_TYPE.get(new ResourceLocation(ArsNouveau.MODID, RecipeRegistry.IMBUEMENT_RECIPE_ID)); + return BuiltInRegistries.RECIPE_TYPE.get(ArsNouveau.prefix( RecipeRegistry.IMBUEMENT_RECIPE_ID)); } public JsonElement asRecipe() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java index 8c219d41d1..f80506b502 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java @@ -110,7 +110,7 @@ public ApparatusRecipeBuilder withId(ResourceLocation id) { public EnchantingApparatusRecipe build() { if (recipe.id.getPath().equals("empty")) - recipe.id = new ResourceLocation(ArsNouveau.MODID, getRegistryName(recipe.result.getItem()).getPath()); + recipe.id = ArsNouveau.prefix( getRegistryName(recipe.result.getItem()).getPath()); if(recipe.result.isEmpty()){ throw new IllegalStateException("Enchanting Apparatus Recipe has no result"); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java index 3ed759d050..53b371bb2a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java @@ -1066,7 +1066,7 @@ public void addEntries() { .withPedestalItem(ItemsRegistry.WARP_SCROLL) .keepNbtOfReagent(true) .withSourceCost(1000) - .withId(new ResourceLocation(ArsNouveau.MODID, "warp_scroll_copy")) + .withId(ArsNouveau.prefix( "warp_scroll_copy")) .build()); addRecipe(builder().withResult(BlockRegistry.SPELL_SENSOR).withReagent(Blocks.SCULK_SENSOR).build()); addRecipe(builder().withReagent(ItemsRegistry.RING_OF_POTENTIAL).withResult(ItemsRegistry.JUMP_RING) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AtlasProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AtlasProvider.java index 74e77967e1..2c487b1261 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AtlasProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AtlasProvider.java @@ -39,9 +39,9 @@ protected void addSources() { private static EnumMap chestMaterial(String type) { EnumMap map = new EnumMap<>(ChestType.class); - map.put(ChestType.SINGLE, new Material(Sheets.CHEST_SHEET, new ResourceLocation(ArsNouveau.MODID, "model/chest/" + type + "/" + type))); - map.put(ChestType.LEFT, new Material(Sheets.CHEST_SHEET, new ResourceLocation(ArsNouveau.MODID, "model/chest/" + type + "/left"))); - map.put(ChestType.RIGHT, new Material(Sheets.CHEST_SHEET, new ResourceLocation(ArsNouveau.MODID, "model/chest/" + type + "/right"))); + map.put(ChestType.SINGLE, new Material(Sheets.CHEST_SHEET, ArsNouveau.prefix( "model/chest/" + type + "/" + type))); + map.put(ChestType.LEFT, new Material(Sheets.CHEST_SHEET, ArsNouveau.prefix( "model/chest/" + type + "/left"))); + map.put(ChestType.RIGHT, new Material(Sheets.CHEST_SHEET, ArsNouveau.prefix( "model/chest/" + type + "/right"))); return map; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BiomeTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BiomeTagProvider.java index b0e23b04b8..bc154d65fe 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BiomeTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BiomeTagProvider.java @@ -19,14 +19,14 @@ import static net.minecraft.tags.BiomeTags.*; public class BiomeTagProvider extends BiomeTagsProvider { - public static TagKey SUMMON_SPAWN_TAG = TagKey.create(Registries.BIOME, new ResourceLocation(ArsNouveau.MODID, "summon_spawn")); + public static TagKey SUMMON_SPAWN_TAG = TagKey.create(Registries.BIOME, ArsNouveau.prefix( "summon_spawn")); //for common, cluster archwood - public static TagKey ARCHWOOD_BIOME_TAG = TagKey.create(Registries.BIOME, new ResourceLocation(ArsNouveau.MODID, "archwood_biome")); + public static TagKey ARCHWOOD_BIOME_TAG = TagKey.create(Registries.BIOME, ArsNouveau.prefix( "archwood_biome")); - public static TagKey NO_MOB_SPAWN = TagKey.create(Registries.BIOME, new ResourceLocation(ArsNouveau.MODID, "no_mob_spawn")); + public static TagKey NO_MOB_SPAWN = TagKey.create(Registries.BIOME, ArsNouveau.prefix( "no_mob_spawn")); - public static TagKey BERRY_SPAWN = TagKey.create(Registries.BIOME, new ResourceLocation(ArsNouveau.MODID, "berry_spawn")); + public static TagKey BERRY_SPAWN = TagKey.create(Registries.BIOME, ArsNouveau.prefix( "berry_spawn")); public BiomeTagProvider(PackOutput pOutput, CompletableFuture pProvider, @Nullable ExistingFileHelper existingFileHelper) { super(pOutput, pProvider, ArsNouveau.MODID, existingFileHelper); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java index 59e1481bc1..9ab057aded 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java @@ -45,7 +45,7 @@ protected void registerStatesAndModels() { registerNormalCube(BlockRegistry.VOID_PRISM.get(), LibBlockNames.VOID_PRISM); for (String s : LibBlockNames.DECORATIVE_SOURCESTONE) { - registerNormalCube(ForgeRegistries.BLOCKS.getValue(new ResourceLocation(ArsNouveau.MODID, s)), s); + registerNormalCube(ForgeRegistries.BLOCKS.getValue(ArsNouveau.prefix( s)), s); } registerNormalCube(BlockRegistry.MAGEBLOOM_BLOCK.get(), LibBlockNames.MAGEBLOOM_BLOCK); registerNormalCube(BlockRegistry.FALSE_WEAVE.get(), LibBlockNames.FALSE_WEAVE); @@ -53,12 +53,12 @@ protected void registerStatesAndModels() { registerNormalCube(BlockRegistry.MIRROR_WEAVE.get(), LibBlockNames.MIRROR_WEAVE); for(String s : LibBlockNames.DECORATIVE_SOURCESTONE){ - ResourceLocation tex = new ResourceLocation(ArsNouveau.MODID, "block/" + s); - Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(ArsNouveau.MODID, s + "_stairs")); + ResourceLocation tex = ArsNouveau.prefix( "block/" + s); + Block block = ForgeRegistries.BLOCKS.getValue(ArsNouveau.prefix( s + "_stairs")); stairsBlock((StairBlock) block, tex); - Block slab = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(ArsNouveau.MODID, s + "_slab")); - slabBlock((SlabBlock) slab, new ResourceLocation(ArsNouveau.MODID, s), tex); + Block slab = ForgeRegistries.BLOCKS.getValue(ArsNouveau.prefix( s + "_slab")); + slabBlock((SlabBlock) slab, ArsNouveau.prefix( s), tex); } } @@ -79,7 +79,7 @@ private void registerDoor(DoorBlock door, String reg) { //will it work? idk public void signBlock(Block sign, String reg) { - ModelFile signModel = models().withExistingParent(reg, new ResourceLocation("block/air")).texture("particle", new ResourceLocation(ArsNouveau.MODID, "block/" + reg)); + ModelFile signModel = models().withExistingParent(reg, new ResourceLocation("block/air")).texture("particle", ArsNouveau.prefix( "block/" + reg)); getVariantBuilder(sign).forAllStates(s -> ConfiguredModel.builder().modelFile(signModel).build()); } @@ -101,7 +101,7 @@ public void buildNormalCube(String registryName) { } public ResourceLocation getBlockLoc(String registryName) { - return new ResourceLocation(ArsNouveau.MODID, "block" + "/" + registryName); + return ArsNouveau.prefix( "block" + "/" + registryName); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java index 339207cb99..9566a7eb02 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java @@ -19,30 +19,30 @@ public class BlockTagProvider extends IntrinsicHolderTagsProvider { - public static TagKey IGNORE_TILE = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "ignore_tile")); - public static TagKey SUMMON_BED = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "summon_bed")); - public static TagKey SUMMON_SLEEPABLE = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "summon_sleepable")); - public static TagKey DECORATIVE_AN = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "an_decorative")); - public static TagKey MAGIC_SAPLINGS = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "magic_saplings")); - public static TagKey MAGIC_PLANTS = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "magic_plants")); - public static TagKey HARVEST_FOLIAGE = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "harvest/foliage")); - public static TagKey HARVEST_STEMS = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "harvest/stems")); - public static TagKey BREAK_BLACKLIST = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "break_blacklist")); - public static TagKey GRAVITY_BLACKLIST = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "gravity_blacklist")); - public static TagKey NO_BREAK_DROP = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "no_break_drop")); - public static TagKey FELLABLE = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "harvest/fellable")); - public static TagKey BUDDING_BLOCKS = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "golem/budding")); - public static TagKey CLUSTER_BLOCKS = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "golem/cluster")); - public static TagKey BREAK_WITH_PICKAXE = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "break_with_pickaxe")); - public static TagKey AUTOPULL_DISABLED = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "storage/autopull_disabled")); + public static TagKey IGNORE_TILE = BlockTags.create(ArsNouveau.prefix( "ignore_tile")); + public static TagKey SUMMON_BED = BlockTags.create(ArsNouveau.prefix( "summon_bed")); + public static TagKey SUMMON_SLEEPABLE = BlockTags.create(ArsNouveau.prefix( "summon_sleepable")); + public static TagKey DECORATIVE_AN = BlockTags.create(ArsNouveau.prefix( "an_decorative")); + public static TagKey MAGIC_SAPLINGS = BlockTags.create(ArsNouveau.prefix( "magic_saplings")); + public static TagKey MAGIC_PLANTS = BlockTags.create(ArsNouveau.prefix( "magic_plants")); + public static TagKey HARVEST_FOLIAGE = BlockTags.create(ArsNouveau.prefix( "harvest/foliage")); + public static TagKey HARVEST_STEMS = BlockTags.create(ArsNouveau.prefix( "harvest/stems")); + public static TagKey BREAK_BLACKLIST = BlockTags.create(ArsNouveau.prefix( "break_blacklist")); + public static TagKey GRAVITY_BLACKLIST = BlockTags.create(ArsNouveau.prefix( "gravity_blacklist")); + public static TagKey NO_BREAK_DROP = BlockTags.create(ArsNouveau.prefix( "no_break_drop")); + public static TagKey FELLABLE = BlockTags.create(ArsNouveau.prefix( "harvest/fellable")); + public static TagKey BUDDING_BLOCKS = BlockTags.create(ArsNouveau.prefix( "golem/budding")); + public static TagKey CLUSTER_BLOCKS = BlockTags.create(ArsNouveau.prefix( "golem/cluster")); + public static TagKey BREAK_WITH_PICKAXE = BlockTags.create(ArsNouveau.prefix( "break_with_pickaxe")); + public static TagKey AUTOPULL_DISABLED = BlockTags.create(ArsNouveau.prefix( "storage/autopull_disabled")); public static TagKey RELOCATION_NOT_SUPPORTED = BlockTags.create(new ResourceLocation("c", "relocation_not_supported")); - public static TagKey OCCLUDES_SPELL_SENSOR = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "occludes_spell_sensor")); - public static TagKey INTERACT_BLACKLIST = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "interact_blacklist")); - public static TagKey CASCADING_LOGS = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "cascading_logs")); - public static TagKey FLOURISHING_LOGS = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "flourishing_logs")); - public static TagKey VEXING_LOGS = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "vexing_logs")); - public static TagKey BLAZING_LOGS = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "blazing_logs")); - public static TagKey DOWSING_ROD = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "dowsing_rod")); + public static TagKey OCCLUDES_SPELL_SENSOR = BlockTags.create(ArsNouveau.prefix( "occludes_spell_sensor")); + public static TagKey INTERACT_BLACKLIST = BlockTags.create(ArsNouveau.prefix( "interact_blacklist")); + public static TagKey CASCADING_LOGS = BlockTags.create(ArsNouveau.prefix( "cascading_logs")); + public static TagKey FLOURISHING_LOGS = BlockTags.create(ArsNouveau.prefix( "flourishing_logs")); + public static TagKey VEXING_LOGS = BlockTags.create(ArsNouveau.prefix( "vexing_logs")); + public static TagKey BLAZING_LOGS = BlockTags.create(ArsNouveau.prefix( "blazing_logs")); + public static TagKey DOWSING_ROD = BlockTags.create(ArsNouveau.prefix( "dowsing_rod")); public static TagKey BUSHES = BlockTags.create(new ResourceLocation("forge", "bushes")); public BlockTagProvider(PackOutput output, CompletableFuture future, ExistingFileHelper helper) { @@ -140,9 +140,9 @@ protected void addTags(HolderLookup.Provider pProvider) { this.tag(Tags.Blocks.CHESTS).add(BlockRegistry.ARCHWOOD_CHEST.get()); this.tag(Tags.Blocks.CHESTS_WOODEN).add(BlockRegistry.ARCHWOOD_CHEST.get()); for (String s : LibBlockNames.DECORATIVE_SOURCESTONE) { - Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s)); - Block stair = BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s + "_stairs")); - Block slab = BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s + "_slab")); + Block block = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s)); + Block stair = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s + "_stairs")); + Block slab = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s + "_slab")); this.tag(DECORATIVE_AN).add(block, stair, slab); this.tag(BlockTags.MINEABLE_WITH_PICKAXE).add(block, stair, slab); this.tag(BlockTags.STAIRS).add(stair); @@ -173,8 +173,8 @@ protected void addTags(HolderLookup.Provider pProvider) { this.tag(FELLABLE).add(Blocks.MUSHROOM_STEM).addTags(BlockTags.LOGS, HARVEST_FOLIAGE, HARVEST_STEMS); - TagKey WHIRLISPRIG_KINDA_LIKES = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "whirlisprig/kinda_likes")); - TagKey WHIRLISPRIG_GREATLY_LIKES = BlockTags.create(new ResourceLocation(ArsNouveau.MODID, "whirlisprig/greatly_likes")); + TagKey WHIRLISPRIG_KINDA_LIKES = BlockTags.create(ArsNouveau.prefix( "whirlisprig/kinda_likes")); + TagKey WHIRLISPRIG_GREATLY_LIKES = BlockTags.create(ArsNouveau.prefix( "whirlisprig/greatly_likes")); this.tag(WHIRLISPRIG_GREATLY_LIKES).add(Blocks.MUSHROOM_STEM, Blocks.BROWN_MUSHROOM_BLOCK, Blocks.RED_MUSHROOM_BLOCK, diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java index 0bcd2530ac..51f29127a7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java @@ -34,7 +34,7 @@ public void collectJsons(CachedOutput pOutput) { } protected void addEntries() { - recipes.add(new BuddingConversionRecipe(new ResourceLocation(ArsNouveau.MODID, "budding_amethyst"), Blocks.AMETHYST_BLOCK, Blocks.BUDDING_AMETHYST)); + recipes.add(new BuddingConversionRecipe(ArsNouveau.prefix( "budding_amethyst"), Blocks.AMETHYST_BLOCK, Blocks.BUDDING_AMETHYST)); } protected static Path getRecipePath(Path path, String id) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java index 5eb2e184a6..e2f613bf28 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java @@ -261,7 +261,7 @@ protected Path getRecipePath(Path pathIn, String str) { } public CasterTomeData buildTome(String id, String name, Spell spell, String flavorText) { - return new CasterTomeData(new ResourceLocation(ArsNouveau.MODID, id + "_tome"), + return new CasterTomeData(ArsNouveau.prefix( id + "_tome"), name, spell.serializeRecipe(), ItemsRegistry.CASTER_TOME.registryObject.getId(), diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java index ef0280be1e..a1988420a5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java @@ -160,9 +160,9 @@ protected void generate() { registerDropSelf(BlockRegistry.POTION_DIFFUSER); for (String s : LibBlockNames.DECORATIVE_SOURCESTONE) { registerDropSelf(BlockRegistry.getBlock(s)); - Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s + "_stairs")); + Block block = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s + "_stairs")); registerDropSelf(block); - Block slab = BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s + "_slab")); + Block slab = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s + "_slab")); registerDropSelf(slab); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java index c99e3d990c..a125c85024 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java @@ -38,7 +38,7 @@ public void collectJsons(CachedOutput pOutput) { } protected void addEntries() { - recipes.add(new DispelEntityRecipe(new ResourceLocation(ArsNouveau.MODID, "blaze_powder"), EntityType.BLAZE, EntityType.BLAZE.getDefaultLootTable(), new LootItemCondition[]{ + recipes.add(new DispelEntityRecipe(ArsNouveau.prefix( "blaze_powder"), EntityType.BLAZE, EntityType.BLAZE.getDefaultLootTable(), new LootItemCondition[]{ LootItemEntityPropertyCondition.hasProperties(LootContext.EntityTarget.THIS, EntityPredicate.Builder.entity().flags(EntityFlagsPredicate.Builder.flags().setOnFire(true).build())).build() })); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DyeRecipeDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DyeRecipeDatagen.java index fd66360fbf..28f03f558b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DyeRecipeDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DyeRecipeDatagen.java @@ -6,7 +6,7 @@ import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; import net.minecraft.world.level.ItemLike; -import record; + import java.nio.file.Path; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java index df74f7cf58..f38bfaacf5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java @@ -158,7 +158,7 @@ private ResourceLocation registryName(final Block item) { } private ResourceLocation itemTexture(String item) { - return new ResourceLocation(ArsNouveau.MODID, "item" + "/" + item); + return ArsNouveau.prefix( "item" + "/" + item); } private ResourceLocation itemTexture(final Item item) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java index 94271377a0..afdd52122c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java @@ -17,20 +17,20 @@ import java.util.concurrent.CompletableFuture; public class ItemTagProvider extends IntrinsicHolderTagsProvider { - public static TagKey SUMMON_BED_ITEMS = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "summon_bed")); + public static TagKey SUMMON_BED_ITEMS = ItemTags.create(ArsNouveau.prefix( "summon_bed")); public static TagKey SOURCE_GEM_TAG = ItemTags.create(new ResourceLocation("forge:gems/source")); public static TagKey SOURCE_GEM_BLOCK_TAG = ItemTags.create(new ResourceLocation("forge:storage_blocks/source")); public static TagKey ARCHWOOD_LOG_TAG = ItemTags.create(new ResourceLocation("forge:logs/archwood")); - public static TagKey MAGIC_FOOD = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "magic_food")); - public static TagKey WILDEN_DROP_TAG = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "wilden_drop")); - public static TagKey SHARD_TAG = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "golem/shard")); + public static TagKey MAGIC_FOOD = ItemTags.create(ArsNouveau.prefix( "magic_food")); + public static TagKey WILDEN_DROP_TAG = ItemTags.create(ArsNouveau.prefix( "wilden_drop")); + public static TagKey SHARD_TAG = ItemTags.create(ArsNouveau.prefix( "golem/shard")); public static TagKey BERRY_TAG = ItemTags.create(new ResourceLocation("c", "fruits/berry")); - public static final TagKey SUMMON_SHARDS_TAG = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "magic_shards")); - public static TagKey JAR_ITEM_BLACKLIST = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "interact_jar_blacklist")); - public static TagKey RITUAL_LOOT_BLACKLIST = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "ritual_loot_blacklist")); - public static TagKey RITUAL_TRADE_BLACKLIST = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "ritual_trade_blacklist")); + public static final TagKey SUMMON_SHARDS_TAG = ItemTags.create(ArsNouveau.prefix( "magic_shards")); + public static TagKey JAR_ITEM_BLACKLIST = ItemTags.create(ArsNouveau.prefix( "interact_jar_blacklist")); + public static TagKey RITUAL_LOOT_BLACKLIST = ItemTags.create(ArsNouveau.prefix( "ritual_loot_blacklist")); + public static TagKey RITUAL_TRADE_BLACKLIST = ItemTags.create(ArsNouveau.prefix( "ritual_trade_blacklist")); public static TagKey STORAGE_BLOCKS_QUARTZ = ItemTags.create(new ResourceLocation("storage_blocks/quartz")); - public static TagKey SHADY_WIZARD_FRUITS = ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "shady_wizard_fruits")); + public static TagKey SHADY_WIZARD_FRUITS = ItemTags.create(ArsNouveau.prefix( "shady_wizard_fruits")); public ItemTagProvider(PackOutput output, CompletableFuture future, ExistingFileHelper helper) { @@ -51,7 +51,7 @@ protected void addTags(HolderLookup.Provider pProvider) { this.tag(MAGIC_FOOD) .add(ItemsRegistry.SOURCE_BERRY_PIE.get(), ItemsRegistry.SOURCE_BERRY_ROLL.get()); - this.tag(ItemTags.create(new ResourceLocation(ArsNouveau.MODID, "whirlisprig/denied_drop"))) + this.tag(ItemTags.create(ArsNouveau.prefix( "whirlisprig/denied_drop"))) .add(Items.DIRT).addTag(Tags.Items.SEEDS); this.tag(Tags.Items.FENCES).add(BlockRegistry.ARCHWOOD_FENCE.asItem()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java index 1b7f8dff7f..953678af72 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java @@ -23,6 +23,7 @@ import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.Items; @@ -30,10 +31,9 @@ import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; -import net.neoforged.neoforge.registries.RegistryObject; import org.apache.commons.io.FilenameUtils; -import record; -import var; + + import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; @@ -41,26 +41,25 @@ import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; -import PatchouliPage; // public class PatchouliProvider extends SimpleDataProvider{ - public static ResourceLocation AUTOMATION = new ResourceLocation(ArsNouveau.MODID, "automation"); - public static ResourceLocation ENCHANTMENTS = new ResourceLocation(ArsNouveau.MODID, "enchantments"); - public static ResourceLocation EQUIPMENT = new ResourceLocation(ArsNouveau.MODID, "equipment"); - public static ResourceLocation FAMILIARS = new ResourceLocation(ArsNouveau.MODID, "familiars"); - public static ResourceLocation GETTING_STARTED = new ResourceLocation(ArsNouveau.MODID, "getting_started"); - public static ResourceLocation MOD_NEWS = new ResourceLocation(ArsNouveau.MODID, "mod_news"); - - public static ResourceLocation MACHINES = new ResourceLocation(ArsNouveau.MODID, "machines"); - public static ResourceLocation RESOURCES = new ResourceLocation(ArsNouveau.MODID, "resources"); - public static ResourceLocation RITUALS = new ResourceLocation(ArsNouveau.MODID, "rituals"); - public static ResourceLocation SOURCE = new ResourceLocation(ArsNouveau.MODID, "source"); - public static ResourceLocation GLYPHS_1 = new ResourceLocation(ArsNouveau.MODID, "glyphs_1"); - public static ResourceLocation GLYPHS_2 = new ResourceLocation(ArsNouveau.MODID, "glyphs_2"); - public static ResourceLocation GLYPHS_3 = new ResourceLocation(ArsNouveau.MODID, "glyphs_3"); - public static ResourceLocation ARMOR = new ResourceLocation(ArsNouveau.MODID, "armor"); + public static ResourceLocation AUTOMATION = ArsNouveau.prefix( "automation"); + public static ResourceLocation ENCHANTMENTS = ArsNouveau.prefix( "enchantments"); + public static ResourceLocation EQUIPMENT = ArsNouveau.prefix( "equipment"); + public static ResourceLocation FAMILIARS = ArsNouveau.prefix( "familiars"); + public static ResourceLocation GETTING_STARTED = ArsNouveau.prefix( "getting_started"); + public static ResourceLocation MOD_NEWS = ArsNouveau.prefix( "mod_news"); + + public static ResourceLocation MACHINES = ArsNouveau.prefix( "machines"); + public static ResourceLocation RESOURCES = ArsNouveau.prefix( "resources"); + public static ResourceLocation RITUALS = ArsNouveau.prefix( "rituals"); + public static ResourceLocation SOURCE = ArsNouveau.prefix( "source"); + public static ResourceLocation GLYPHS_1 = ArsNouveau.prefix( "glyphs_1"); + public static ResourceLocation GLYPHS_2 = ArsNouveau.prefix( "glyphs_2"); + public static ResourceLocation GLYPHS_3 = ArsNouveau.prefix( "glyphs_3"); + public static ResourceLocation ARMOR = ArsNouveau.prefix( "armor"); public List pages = new ArrayList<>(); @@ -284,7 +283,7 @@ public void addEntries() { .withPage(new CraftingPage(ItemsRegistry.SOURCE_BERRY_PIE).withRecipe2(ItemsRegistry.SOURCE_BERRY_ROLL)), getPath(RESOURCES, "sourceberry")); addPage(new PatchouliBuilder(RESOURCES, "weald_walker") - .withIcon(RitualRegistry.getRitualItemMap().get(new ResourceLocation(ArsNouveau.MODID, RitualLib.AWAKENING))) + .withIcon(RitualRegistry.getRitualItemMap().get(ArsNouveau.prefix( RitualLib.AWAKENING))) .withLocalizedText() .withPage(new EntityPage(getRegistryName(ModEntities.ENTITY_BLAZING_WEALD.get()).toString()).withText(getLangPath("weald_walker", 2))) .withPage(new EntityPage(getRegistryName(ModEntities.ENTITY_CASCADING_WEALD.get()).toString()).withText(getLangPath("weald_walker", 3))) @@ -433,14 +432,14 @@ public void addEntries() { .withIcon(BlockRegistry.RITUAL_BLOCK) .withLocalizedText() .withLocalizedText() - .withPage(new CraftingPage(RitualRegistry.getRitualItemMap().get(new ResourceLocation(ArsNouveau.MODID, RitualLib.SUNRISE)))) + .withPage(new CraftingPage(RitualRegistry.getRitualItemMap().get(ArsNouveau.prefix( RitualLib.SUNRISE)))) .withPage(new RelationsPage().withEntry(MACHINES, "ritual_brazier")), getPath(RITUALS, "performing_rituals")); addPage(new PatchouliBuilder(FAMILIARS, "summoning_familiars") .withSortNum(-1) - .withIcon(RitualRegistry.getRitualItemMap().get(new ResourceLocation(ArsNouveau.MODID, RitualLib.BINDING))) + .withIcon(RitualRegistry.getRitualItemMap().get(ArsNouveau.prefix( RitualLib.BINDING))) .withLocalizedText() .withLocalizedText() - .withPage(new CraftingPage(RitualRegistry.getRitualItemMap().get(new ResourceLocation(ArsNouveau.MODID, RitualLib.BINDING)))) + .withPage(new CraftingPage(RitualRegistry.getRitualItemMap().get(ArsNouveau.prefix( RitualLib.BINDING)))) .withPage(new RelationsPage().withEntry(MACHINES, "ritual_brazier").withEntry(RITUALS, "ritual_binding")), getPath(FAMILIARS, "summoning_familiars")); addPage(new PatchouliBuilder(MOD_NEWS, "mod_news") @@ -502,9 +501,9 @@ public void addEntries() { .withLocalizedText() .withPage(new CraftingPage(ItemsRegistry.MAGE_FIBER)) .withPage(new TextPage("ars_nouveau.page.threads").withTitle("ars_nouveau.threads")) - .withPage(new ImagePage().withEntry(new ResourceLocation(ArsNouveau.MODID, "textures/gui/entries/sorcerer_diagram.png")) - .withEntry(new ResourceLocation(ArsNouveau.MODID, "textures/gui/entries/arcanist_thread_diagram.png")) - .withEntry(new ResourceLocation(ArsNouveau.MODID, "textures/gui/entries/battlemage_diagram.png")) + .withPage(new ImagePage().withEntry(ArsNouveau.prefix( "textures/gui/entries/sorcerer_diagram.png")) + .withEntry(ArsNouveau.prefix( "textures/gui/entries/arcanist_thread_diagram.png")) + .withEntry(ArsNouveau.prefix( "textures/gui/entries/battlemage_diagram.png")) .withBorder().withTitle("ars_nouveau.thread_layout") .withText("ars_nouveau.page.layout_desc")) .withPage(new ApparatusPage(ItemsRegistry.SORCERER_HOOD)) @@ -770,26 +769,26 @@ public void addPerkPage(IPerk perk){ this.pages.add(new PatchouliPage(builder, this.output.resolve("assets/" + perk.getRegistryName().getNamespace() + "/patchouli_books/worn_notebook/en_us/entries/armor/" + perk.getRegistryName().getPath() + ".json"))); } - List enchants = Arrays.asList( + List> enchants = Arrays.asList( Enchantments.AQUA_AFFINITY, Enchantments.BANE_OF_ARTHROPODS, Enchantments.BLAST_PROTECTION, Enchantments.DEPTH_STRIDER, - Enchantments.BLOCK_EFFICIENCY, - Enchantments.FALL_PROTECTION, + Enchantments.EFFICIENCY, + Enchantments.FEATHER_FALLING, Enchantments.FIRE_ASPECT, Enchantments.FIRE_PROTECTION, - Enchantments.FLAMING_ARROWS, - Enchantments.BLOCK_FORTUNE, - Enchantments.INFINITY_ARROWS, + Enchantments.FLAME, + Enchantments.FORTUNE, + Enchantments.INFINITY, Enchantments.KNOCKBACK, - Enchantments.MOB_LOOTING, + Enchantments.LOOTING, Enchantments.MULTISHOT, Enchantments.PIERCING, - Enchantments.POWER_ARROWS, + Enchantments.POWER, Enchantments.PROJECTILE_PROTECTION, - Enchantments.ALL_DAMAGE_PROTECTION, - Enchantments.PUNCH_ARROWS, + Enchantments.PROTECTION, + Enchantments.PUNCH, Enchantments.QUICK_CHARGE, Enchantments.RESPIRATION, Enchantments.SHARPNESS, @@ -798,8 +797,8 @@ public void addPerkPage(IPerk perk){ Enchantments.SWEEPING_EDGE, Enchantments.THORNS, Enchantments.UNBREAKING, - EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.get(), - EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.get() + EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.getKey(), + EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.getKey() ); @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PlacedFeatureTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PlacedFeatureTagProvider.java index 1e710eb094..35a061c196 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PlacedFeatureTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PlacedFeatureTagProvider.java @@ -15,8 +15,8 @@ import java.util.concurrent.CompletableFuture; public class PlacedFeatureTagProvider extends TagsProvider { - public static TagKey ARCHWOOD_TREES = TagKey.create(Registries.PLACED_FEATURE, new ResourceLocation(ArsNouveau.MODID, "archwood_trees")); - public static TagKey SOURCE_BERRIES = TagKey.create(Registries.PLACED_FEATURE, new ResourceLocation(ArsNouveau.MODID, "source_berries")); + public static TagKey ARCHWOOD_TREES = TagKey.create(Registries.PLACED_FEATURE, ArsNouveau.prefix( "archwood_trees")); + public static TagKey SOURCE_BERRIES = TagKey.create(Registries.PLACED_FEATURE, ArsNouveau.prefix( "source_berries")); public PlacedFeatureTagProvider(PackOutput pOutput, CompletableFuture pProvider, @Nullable ExistingFileHelper existingFileHelper) { super(pOutput, Registries.PLACED_FEATURE, pProvider, ArsNouveau.MODID, existingFileHelper); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java index 4c2f187161..7e9f44d855 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java @@ -168,10 +168,10 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { ShapedRecipeBuilder.shaped(RecipeCategory.MISC, BlockRegistry.SOURCE_GEM_BLOCK, 1) .pattern("xx") .pattern("xx").define('x', SOURCE_GEM).unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)).save(consumer); - shapelessBuilder(ItemsRegistry.SOURCE_GEM, 4).requires(BlockRegistry.SOURCE_GEM_BLOCK, 1).save(consumer, new ResourceLocation(ArsNouveau.MODID, "source_gem_block_2")); - shapelessBuilder(Items.LEATHER, 1).requires(ItemsRegistry.WILDEN_WING).save(consumer, new ResourceLocation(ArsNouveau.MODID, "wing_to_leather")); - shapelessBuilder(Items.BONE_MEAL, 3).requires(ItemsRegistry.WILDEN_HORN).save(consumer, new ResourceLocation(ArsNouveau.MODID, "horn_to_bonemeal")); - shapelessBuilder(Items.ORANGE_DYE, 5).requires(ItemsRegistry.WILDEN_SPIKE).save(consumer, new ResourceLocation(ArsNouveau.MODID, "spike_to_dye")); + shapelessBuilder(ItemsRegistry.SOURCE_GEM, 4).requires(BlockRegistry.SOURCE_GEM_BLOCK, 1).save(consumer, ArsNouveau.prefix( "source_gem_block_2")); + shapelessBuilder(Items.LEATHER, 1).requires(ItemsRegistry.WILDEN_WING).save(consumer, ArsNouveau.prefix( "wing_to_leather")); + shapelessBuilder(Items.BONE_MEAL, 3).requires(ItemsRegistry.WILDEN_HORN).save(consumer, ArsNouveau.prefix( "horn_to_bonemeal")); + shapelessBuilder(Items.ORANGE_DYE, 5).requires(ItemsRegistry.WILDEN_SPIKE).save(consumer, ArsNouveau.prefix( "spike_to_dye")); ShapedRecipeBuilder.shaped(RecipeCategory.MISC, Items.ARROW, 32) .unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) .pattern(" x ") @@ -180,14 +180,14 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .define('x', ItemsRegistry.WILDEN_SPIKE) .define('y', Items.STICK) .define('z', Items.FEATHER) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "spike_to_arrow")); + .save(consumer, ArsNouveau.prefix( "spike_to_arrow")); shapelessBuilder(BlockRegistry.POTION_JAR) .requires(BlockRegistry.SOURCE_JAR) .requires(ItemsRegistry.ABJURATION_ESSENCE) .save(consumer); - shapelessBuilder(BlockRegistry.POTION_JAR).requires(BlockRegistry.POTION_JAR).save(consumer, new ResourceLocation(ArsNouveau.MODID,"potion_jar_empty")); + shapelessBuilder(BlockRegistry.POTION_JAR).requires(BlockRegistry.POTION_JAR).save(consumer, ArsNouveau.prefix("potion_jar_empty")); shapelessBuilder(BlockRegistry.RITUAL_BLOCK) .requires(BlockRegistry.ARCANE_PEDESTAL.get()) @@ -212,7 +212,7 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .requires(BlockRegistry.SOURCESTONE_SCONCE_BLOCK) .save(consumer); - shapelessBuilder(BlockRegistry.SOURCESTONE_SCONCE_BLOCK).requires(BlockRegistry.POLISHED_SCONCE_BLOCK).save(consumer, new ResourceLocation(ArsNouveau.MODID, "polished_source_sconce")); + shapelessBuilder(BlockRegistry.SOURCESTONE_SCONCE_BLOCK).requires(BlockRegistry.POLISHED_SCONCE_BLOCK).save(consumer, ArsNouveau.prefix( "polished_source_sconce")); shapelessBuilder(getRitualItem(RitualLib.MOONFALL)) .requires(BlockRegistry.CASCADING_LOG) @@ -224,7 +224,7 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { shapelessBuilder(getRitualItem(RitualLib.MOONFALL)) .requires(BlockRegistry.CASCADING_LOG) .requires(ItemsRegistry.WILDEN_WING) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "moonfall_2")); + .save(consumer, ArsNouveau.prefix( "moonfall_2")); shapelessBuilder(getRitualItem(RitualLib.SUNRISE)) .requires(BlockRegistry.BLAZING_LOG) @@ -235,7 +235,7 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { shapelessBuilder(getRitualItem(RitualLib.SUNRISE)) .requires(BlockRegistry.BLAZING_LOG) .requires(Items.SUNFLOWER) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "sunrise_2")); + .save(consumer, ArsNouveau.prefix( "sunrise_2")); shapelessBuilder(getRitualItem(RitualLib.DIG)) .requires(BlockRegistry.FLOURISHING_LOG) @@ -259,7 +259,7 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .requires(BlockRegistry.VEXING_LOG) .requires(ItemsRegistry.WILDEN_HORN) .requires(Items.EMERALD) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "challenge_2")); + .save(consumer, ArsNouveau.prefix( "challenge_2")); shapelessBuilder(getRitualItem(RitualLib.OVERGROWTH)) .requires(BlockRegistry.FLOURISHING_LOG) @@ -300,11 +300,11 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { shapelessBuilder(ItemsRegistry.ALLOW_ITEM_SCROLL) .requires(ItemsRegistry.ALLOW_ITEM_SCROLL) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "clear_allow")); + .save(consumer, ArsNouveau.prefix( "clear_allow")); shapelessBuilder(ItemsRegistry.DENY_ITEM_SCROLL) .requires(ItemsRegistry.DENY_ITEM_SCROLL) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "clear_deny")); + .save(consumer, ArsNouveau.prefix( "clear_deny")); shapelessBuilder(getRitualItem(RitualLib.SCRYING)) .requires(BlockRegistry.VEXING_LOG) @@ -337,7 +337,7 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .requires(Items.IRON_SWORD, 1) .requires(Items.BOW, 1) .requires(Items.LAPIS_BLOCK) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "wilden_summon_alt")); + .save(consumer, ArsNouveau.prefix( "wilden_summon_alt")); shapelessBuilder(getRitualItem(RitualLib.ANIMAL_SUMMON)) .requires(BlockRegistry.VEXING_LOG) @@ -438,7 +438,7 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .define('n', Ingredient.of(ItemTagProvider.STORAGE_BLOCKS_QUARTZ)) .save(consumer); - shapelessBuilder(Items.CHEST).requires(BlockRegistry.ARCHWOOD_CHEST).save(consumer, new ResourceLocation(ArsNouveau.MODID, "archwood_to_chest")); + shapelessBuilder(Items.CHEST).requires(BlockRegistry.ARCHWOOD_CHEST).save(consumer, ArsNouveau.prefix( "archwood_to_chest")); shapelessBuilder(getRitualItem(RitualLib.AWAKENING)) .requires(BlockRegistry.FLOURISHING_LOG) @@ -449,11 +449,11 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .requires(SOURCE_GEM, 4) .save(consumer); - shapelessBuilder(Items.PINK_DYE, 2).requires(ItemsRegistry.MAGE_BLOOM, 2).save(consumer, new ResourceLocation(ArsNouveau.MODID, "magebloom_to_pink")); - shapelessBuilder(Items.PURPLE_DYE).requires(BlockRegistry.SOURCEBERRY_BUSH).save(consumer, new ResourceLocation(ArsNouveau.MODID, "sourceberry_to_purple")); + shapelessBuilder(Items.PINK_DYE, 2).requires(ItemsRegistry.MAGE_BLOOM, 2).save(consumer, ArsNouveau.prefix( "magebloom_to_pink")); + shapelessBuilder(Items.PURPLE_DYE).requires(BlockRegistry.SOURCEBERRY_BUSH).save(consumer, ArsNouveau.prefix( "sourceberry_to_purple")); - shapelessBuilder(Items.WATER_BUCKET).requires(ItemsRegistry.WATER_ESSENCE).requires(Items.BUCKET).save(consumer, new ResourceLocation(ArsNouveau.MODID, "water_essence_to_bucket")); - shapelessBuilder(Items.FIRE_CHARGE, 3).requires(ItemsRegistry.FIRE_ESSENCE).requires(Items.GUNPOWDER).requires(Items.COAL).save(consumer, new ResourceLocation(ArsNouveau.MODID, "fire_essence_to_charge")); + shapelessBuilder(Items.WATER_BUCKET).requires(ItemsRegistry.WATER_ESSENCE).requires(Items.BUCKET).save(consumer, ArsNouveau.prefix( "water_essence_to_bucket")); + shapelessBuilder(Items.FIRE_CHARGE, 3).requires(ItemsRegistry.FIRE_ESSENCE).requires(Items.GUNPOWDER).requires(Items.COAL).save(consumer, ArsNouveau.prefix( "fire_essence_to_charge")); ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ItemsRegistry.DOWSING_ROD).unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) @@ -464,30 +464,30 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .save(consumer); shapelessBuilder(ItemsRegistry.ANNOTATED_CODEX).requires(ItemsRegistry.BLANK_PARCHMENT).requires(Items.LEATHER).save(consumer); - shapelessBuilder(Items.POWDER_SNOW_BUCKET).requires(ItemsRegistry.AIR_ESSENCE).requires(Items.BUCKET).requires(Items.SNOW_BLOCK).save(consumer, new ResourceLocation(ArsNouveau.MODID, "air_essence_to_snow_bucket")); + shapelessBuilder(Items.POWDER_SNOW_BUCKET).requires(ItemsRegistry.AIR_ESSENCE).requires(Items.BUCKET).requires(Items.SNOW_BLOCK).save(consumer, ArsNouveau.prefix( "air_essence_to_snow_bucket")); shapedBuilder(Items.SOUL_SAND, 8) .pattern("xxx") .pattern("xyx") .pattern("xxx") .define('x', Tags.Items.SANDS) .define('y', ItemsRegistry.CONJURATION_ESSENCE) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "conjuration_essence_to_soul_sand")); + .save(consumer, ArsNouveau.prefix( "conjuration_essence_to_soul_sand")); shapedBuilder(Items.END_STONE, 8) .pattern("xxx") .pattern("xyx") .pattern("xxx") .define('x', Tags.Items.STONES) .define('y', ItemsRegistry.CONJURATION_ESSENCE) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "conjuration_essence_to_end_stone")); + .save(consumer, ArsNouveau.prefix( "conjuration_essence_to_end_stone")); - shapelessBuilder(Items.OBSIDIAN).requires(Items.LAVA_BUCKET).requires(ItemsRegistry.WATER_ESSENCE).save(consumer, new ResourceLocation(ArsNouveau.MODID, "water_essence_to_obsidian")); + shapelessBuilder(Items.OBSIDIAN).requires(Items.LAVA_BUCKET).requires(ItemsRegistry.WATER_ESSENCE).save(consumer, ArsNouveau.prefix( "water_essence_to_obsidian")); shapedBuilder(Items.MAGMA_BLOCK, 8) .pattern("xxx") .pattern("xyx") .pattern("xxx") .define('x', Tags.Items.STONES) .define('y', ItemsRegistry.FIRE_ESSENCE) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "fire_essence_to_magma_block")); + .save(consumer, ArsNouveau.prefix( "fire_essence_to_magma_block")); shapedBuilder(Items.GRANITE, 8) .pattern("xxx") @@ -495,21 +495,21 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .pattern("xxx") .define('x', Items.DIORITE) .define('y', ItemsRegistry.MANIPULATION_ESSENCE) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "manipulation_essence_to_granite")); + .save(consumer, ArsNouveau.prefix( "manipulation_essence_to_granite")); shapedBuilder(Items.ANDESITE, 8) .pattern("xxx") .pattern("xyx") .pattern("xxx") .define('x', Items.GRANITE) .define('y', ItemsRegistry.MANIPULATION_ESSENCE) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "manipulation_essence_to_andesite")); + .save(consumer, ArsNouveau.prefix( "manipulation_essence_to_andesite")); shapedBuilder(Items.DIORITE, 8) .pattern("xxx") .pattern("xyx") .pattern("xxx") .define('x', Items.ANDESITE) .define('y', ItemsRegistry.MANIPULATION_ESSENCE) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "manipulation_essence_to_diorite")); + .save(consumer, ArsNouveau.prefix( "manipulation_essence_to_diorite")); shapedBuilder(Items.MYCELIUM, 8) .pattern("xxx") @@ -517,7 +517,7 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .pattern("xxx") .define('x', Items.GRASS_BLOCK) .define('y', ItemsRegistry.MANIPULATION_ESSENCE) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "manipulation_essence_to_mycelium")); + .save(consumer, ArsNouveau.prefix( "manipulation_essence_to_mycelium")); shapedBuilder(Items.MOSS_BLOCK, 8) .pattern("xxx") @@ -525,7 +525,7 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .pattern("xxx") .define('x', Items.MYCELIUM) .define('y', ItemsRegistry.MANIPULATION_ESSENCE) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "manipulation_essence_to_moss_block")); + .save(consumer, ArsNouveau.prefix( "manipulation_essence_to_moss_block")); shapedBuilder(Items.GRASS_BLOCK, 8) .pattern("xxx") @@ -533,7 +533,7 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .pattern("xxx") .define('x', Items.MOSS_BLOCK) .define('y', ItemsRegistry.MANIPULATION_ESSENCE) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "manipulation_essence_to_grass_block")); + .save(consumer, ArsNouveau.prefix( "manipulation_essence_to_grass_block")); shapedBuilder(Items.TUFF, 8) .pattern("xxx") @@ -541,7 +541,7 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .pattern("xxx") .define('x', Items.DEEPSLATE) .define('y', ItemsRegistry.MANIPULATION_ESSENCE) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "manipulation_essence_to_tuff")); + .save(consumer, ArsNouveau.prefix( "manipulation_essence_to_tuff")); shapedBuilder(Items.CALCITE, 8) .pattern("xxx") @@ -549,7 +549,7 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .pattern("xxx") .define('x', Items.TUFF) .define('y', ItemsRegistry.MANIPULATION_ESSENCE) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "manipulation_essence_to_calcite")); + .save(consumer, ArsNouveau.prefix( "manipulation_essence_to_calcite")); shapedBuilder(Items.DEEPSLATE, 8) .pattern("xxx") @@ -557,23 +557,23 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .pattern("xxx") .define('x', Items.CALCITE) .define('y', ItemsRegistry.MANIPULATION_ESSENCE) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, "manipulation_essence_to_deepslate")); + .save(consumer, ArsNouveau.prefix( "manipulation_essence_to_deepslate")); shapelessBuilder(BlockRegistry.CASCADING_SAPLING) .requires(ItemsRegistry.MANIPULATION_ESSENCE) - .requires(BlockRegistry.BLAZING_SAPLING).save(consumer, new ResourceLocation(ArsNouveau.MODID, "manipulation_essence_to_cascading_sapling")); + .requires(BlockRegistry.BLAZING_SAPLING).save(consumer, ArsNouveau.prefix( "manipulation_essence_to_cascading_sapling")); shapelessBuilder(BlockRegistry.FLOURISHING_SAPLING) .requires(ItemsRegistry.MANIPULATION_ESSENCE) - .requires(BlockRegistry.CASCADING_SAPLING).save(consumer, new ResourceLocation(ArsNouveau.MODID, "manipulation_essence_to_flourishing_sapling")); + .requires(BlockRegistry.CASCADING_SAPLING).save(consumer, ArsNouveau.prefix( "manipulation_essence_to_flourishing_sapling")); shapelessBuilder(BlockRegistry.VEXING_SAPLING) .requires(ItemsRegistry.MANIPULATION_ESSENCE) - .requires(BlockRegistry.FLOURISHING_SAPLING).save(consumer, new ResourceLocation(ArsNouveau.MODID, "manipulation_essence_to_vexing_sapling")); + .requires(BlockRegistry.FLOURISHING_SAPLING).save(consumer, ArsNouveau.prefix( "manipulation_essence_to_vexing_sapling")); shapelessBuilder(BlockRegistry.BLAZING_SAPLING) .requires(ItemsRegistry.MANIPULATION_ESSENCE) - .requires(BlockRegistry.VEXING_SAPLING).save(consumer, new ResourceLocation(ArsNouveau.MODID, "manipulation_essence_to_blazin_sapling")); + .requires(BlockRegistry.VEXING_SAPLING).save(consumer, ArsNouveau.prefix( "manipulation_essence_to_blazin_sapling")); shapedBuilder(BlockRegistry.ORANGE_SBED) .pattern("xxx") @@ -605,8 +605,8 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .requires(Items.ENDER_EYE) .requires(RecipeDatagen.SOURCE_GEM).save(consumer); - shapelessBuilder(ItemsRegistry.BLANK_PARCHMENT).requires(ItemsRegistry.SCRYER_SCROLL).save(consumer, new ResourceLocation(ArsNouveau.MODID, "scry_to_blank_parchment")); - shapelessBuilder(ItemsRegistry.BLANK_PARCHMENT).requires(ItemsRegistry.SPELL_PARCHMENT).save(consumer, new ResourceLocation(ArsNouveau.MODID, "wipe_spell_parchment")); + shapelessBuilder(ItemsRegistry.BLANK_PARCHMENT).requires(ItemsRegistry.SCRYER_SCROLL).save(consumer, ArsNouveau.prefix( "scry_to_blank_parchment")); + shapelessBuilder(ItemsRegistry.BLANK_PARCHMENT).requires(ItemsRegistry.SPELL_PARCHMENT).save(consumer, ArsNouveau.prefix( "wipe_spell_parchment")); shapedBuilder(ItemsRegistry.STARBUNCLE_SHADES) .pattern("xyx") .define('x', Items.TINTED_GLASS) @@ -617,17 +617,17 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { if(s.equals(LibBlockNames.SOURCESTONE)) continue; makeStonecutter(consumer, BlockRegistry.getBlock(LibBlockNames.SOURCESTONE), BlockRegistry.getBlock(s), LibBlockNames.SOURCESTONE); - shapelessBuilder(SOURCESTONE).requires(BlockRegistry.getBlock(s)).save(consumer, new ResourceLocation(ArsNouveau.MODID, s + "_to_sourcestone")); + shapelessBuilder(SOURCESTONE).requires(BlockRegistry.getBlock(s)).save(consumer, ArsNouveau.prefix( s + "_to_sourcestone")); - Block stair = BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s + "_stairs")); - Block slab = BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s + "_slab")); + Block stair = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s + "_stairs")); + Block slab = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s + "_slab")); SingleItemRecipeBuilder.stonecutting(Ingredient.of(BlockRegistry.getBlock(s)), RecipeCategory.BUILDING_BLOCKS, stair) .unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, s + "_stonecutter_stair")); + .save(consumer, ArsNouveau.prefix( s + "_stonecutter_stair")); SingleItemRecipeBuilder.stonecutting(Ingredient.of(BlockRegistry.getBlock(s)),RecipeCategory.BUILDING_BLOCKS, slab, 2) .unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) - .save(consumer, new ResourceLocation(ArsNouveau.MODID, s + "_stone_cutterslab")); + .save(consumer, ArsNouveau.prefix( s + "_stone_cutterslab")); shapedWoodenStairs(consumer, stair, BlockRegistry.getBlock(s), s + "_stairs"); shapedWoodenSlab(consumer, slab, BlockRegistry.getBlock(s), s + "_slab"); @@ -671,7 +671,7 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .pattern("xx ") .define('x', ItemsRegistry.MAGE_FIBER).save(consumer); - shapelessBuilder(ItemsRegistry.MAGE_FIBER, 4).requires(BlockRegistry.MAGEBLOOM_BLOCK).save(consumer, new ResourceLocation(ArsNouveau.MODID,"magebloom_block_to_magebloom")); + shapelessBuilder(ItemsRegistry.MAGE_FIBER, 4).requires(BlockRegistry.MAGEBLOOM_BLOCK).save(consumer, ArsNouveau.prefix("magebloom_block_to_magebloom")); shapedBuilder(BlockRegistry.FALSE_WEAVE, 8) .pattern("xxx") @@ -699,7 +699,7 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .pattern(" x ").define('x', Tags.Items.NUGGETS_GOLD).define('y', SOURCE_GEM).save(consumer); shapelessBuilder(BlockRegistry.ARCANE_PLATFORM).requires(BlockRegistry.ARCANE_PEDESTAL).save(consumer); - shapelessBuilder(BlockRegistry.ARCANE_PEDESTAL).requires(BlockRegistry.ARCANE_PLATFORM).save(consumer, new ResourceLocation(ArsNouveau.MODID, "platform_to_pedestal")); + shapelessBuilder(BlockRegistry.ARCANE_PEDESTAL).requires(BlockRegistry.ARCANE_PLATFORM).save(consumer, ArsNouveau.prefix( "platform_to_pedestal")); shapedBuilder(BlockRegistry.SKY_WEAVE, 8) .pattern("xxx") @@ -717,8 +717,8 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { shapelessBuilder(getRitualItem(RitualLib.SANCTUARY)).requires(BlockRegistry.CASCADING_LOG).requires(ItemsRegistry.WATER_ESSENCE).requires(Items.SEA_LANTERN).save(consumer); shapelessBuilder(BlockRegistry.ROTATING_TURRET).requires(BlockRegistry.BASIC_SPELL_TURRET).save(consumer); - shapelessBuilder(BlockRegistry.BASIC_SPELL_TURRET).requires(BlockRegistry.ROTATING_TURRET).save(consumer, new ResourceLocation(ArsNouveau.MODID, "rotating_turret_to_basic_spell_turret")); - shapelessBuilder(ItemsRegistry.STARBUNCLE_SHARD).requires(ItemsRegistry.STARBUNCLE_SHARD).save(consumer, new ResourceLocation(ArsNouveau.MODID, "wipe_starby_shard")); + shapelessBuilder(BlockRegistry.BASIC_SPELL_TURRET).requires(BlockRegistry.ROTATING_TURRET).save(consumer, ArsNouveau.prefix( "rotating_turret_to_basic_spell_turret")); + shapelessBuilder(ItemsRegistry.STARBUNCLE_SHARD).requires(ItemsRegistry.STARBUNCLE_SHARD).save(consumer, ArsNouveau.prefix( "wipe_starby_shard")); shapedBuilder(BlockRegistry.REDSTONE_RELAY) .pattern("gxg") .pattern("gMg") @@ -728,12 +728,12 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .define('x', Tags.Items.DUSTS_REDSTONE) .save(consumer); shapelessBuilder(BlockRegistry.SOURCEBERRY_SACK).requires(BlockRegistry.SOURCEBERRY_BUSH, 9).save(consumer); - shapelessBuilder(BlockRegistry.SOURCEBERRY_BUSH, 9).requires(BlockRegistry.SOURCEBERRY_SACK).save(consumer, new ResourceLocation(ArsNouveau.MODID, "sourceberry_sack_to_bush")); + shapelessBuilder(BlockRegistry.SOURCEBERRY_BUSH, 9).requires(BlockRegistry.SOURCEBERRY_SACK).save(consumer, ArsNouveau.prefix( "sourceberry_sack_to_bush")); } } public static RitualTablet getRitualItem(String name) { - return RitualRegistry.getRitualItemMap().get(new ResourceLocation(ArsNouveau.MODID, name)); + return RitualRegistry.getRitualItemMap().get(ArsNouveau.prefix( name)); } public ShapedRecipeBuilder shapedBuilder(ItemLike item) { @@ -770,7 +770,7 @@ public static void shapedWoodenStairs(RecipeOutput recipeConsumer, ItemLike stai .pattern("# ") .pattern("## ") .pattern("###").unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) - .save(recipeConsumer, new ResourceLocation(ArsNouveau.MODID, name)); + .save(recipeConsumer, ArsNouveau.prefix( name)); } @@ -819,7 +819,7 @@ private static void shapedWoodenSlab(RecipeOutput recipeConsumer, ItemLike slab, private static void shapedWoodenSlab(RecipeOutput recipeConsumer, ItemLike slab, ItemLike input, String name) { ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, slab, 6).define('#', input).pattern("###").group("wooden_slab") .unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) - .save(recipeConsumer, new ResourceLocation(ArsNouveau.MODID, name)); + .save(recipeConsumer, ArsNouveau.prefix( name)); } public ShapelessRecipeBuilder shapelessBuilder(ItemLike result) { @@ -833,7 +833,7 @@ public ShapelessRecipeBuilder shapelessBuilder(ItemLike result, int resultCount) private static int STONECUTTER_COUNTER = 0; public static void makeStonecutter(RecipeOutput consumer, ItemLike input, ItemLike output, String reg) { - SingleItemRecipeBuilder.stonecutting(Ingredient.of(input), RecipeCategory.DECORATIONS, output).unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)).save(consumer, new ResourceLocation(ArsNouveau.MODID, reg + "_" + STONECUTTER_COUNTER)); + SingleItemRecipeBuilder.stonecutting(Ingredient.of(input), RecipeCategory.DECORATIONS, output).unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)).save(consumer, ArsNouveau.prefix( reg + "_" + STONECUTTER_COUNTER)); STONECUTTER_COUNTER++; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java index a3ad1f76ff..6ac73e9e25 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java @@ -40,12 +40,12 @@ protected void addEntries() { for (String ore : defaultOres) { addForgeOreRecipe(ore); } - recipes.add(new ScryRitualRecipe(new ResourceLocation(ArsNouveau.MODID, "amethyst_gems"), forgeItemTag("gems/amethyst"), forgeBlockTag("storage_blocks/amethyst"))); - recipes.add(new ScryRitualRecipe(new ResourceLocation(ArsNouveau.MODID, "amethyst_blocks"), forgeItemTag("storage_blocks/amethyst"), forgeBlockTag("storage_blocks/amethyst"))); + recipes.add(new ScryRitualRecipe(ArsNouveau.prefix( "amethyst_gems"), forgeItemTag("gems/amethyst"), forgeBlockTag("storage_blocks/amethyst"))); + recipes.add(new ScryRitualRecipe(ArsNouveau.prefix( "amethyst_blocks"), forgeItemTag("storage_blocks/amethyst"), forgeBlockTag("storage_blocks/amethyst"))); } private void addForgeOreRecipe(String ore) { - recipes.add(new ScryRitualRecipe(new ResourceLocation(ArsNouveau.MODID, ore + "_ores"), forgeItemTag("ores/" + ore), forgeBlockTag("ores/" + ore))); + recipes.add(new ScryRitualRecipe(ArsNouveau.prefix( ore + "_ores"), forgeItemTag("ores/" + ore), forgeBlockTag("ores/" + ore))); } private TagKey forgeBlockTag(String path) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/StructureTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/StructureTagProvider.java index 7cbaa06860..8166ed5d0b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/StructureTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/StructureTagProvider.java @@ -16,7 +16,7 @@ public class StructureTagProvider extends TagsProvider { - public static TagKey WILDEN_DEN = TagKey.create(Registries.STRUCTURE, new ResourceLocation(ArsNouveau.MODID, "wilden_den")); + public static TagKey WILDEN_DEN = TagKey.create(Registries.STRUCTURE, ArsNouveau.prefix( "wilden_den")); public static final ResourceKey HUNTER_DEN = register("hunter_wilden_den"); public static final ResourceKey STALKER_DEN = register("stalker_wilden_den"); @@ -32,6 +32,6 @@ protected void addTags(HolderLookup.Provider pProvider) { } public static ResourceKey register(String name) { - return ResourceKey.create(Registries.STRUCTURE, new ResourceLocation(ArsNouveau.MODID, name)); + return ResourceKey.create(Registries.STRUCTURE, ArsNouveau.prefix( name)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java index ac763329b9..15270acb50 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java @@ -34,7 +34,7 @@ public void collectJsons(CachedOutput pOutput) { protected void addEntries() { ArrayList bats = new ArrayList<>(); bats.add(new SummonRitualRecipe.WeightedMobType(EntityType.getKey(EntityType.BAT))); - recipes.add(new SummonRitualRecipe(new ResourceLocation(ArsNouveau.MODID, "bats"), Ingredient.of(Items.AMETHYST_SHARD), SummonRitualRecipe.MobSource.MOB_LIST, 5, bats)); + recipes.add(new SummonRitualRecipe(ArsNouveau.prefix( "bats"), Ingredient.of(Items.AMETHYST_SHARD), SummonRitualRecipe.MobSource.MOB_LIST, 5, bats)); } protected static Path getRecipePath(Path path, String id) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java index 9ea6e55052..28a261b356 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java @@ -68,7 +68,7 @@ public static void bootstrap(BootstrapContext context) { @NotNull private static ResourceLocation prefix(String path) { - return new ResourceLocation(ArsNouveau.MODID, path); + return ArsNouveau.prefix( path); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancements.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancements.java index f9575e86c6..29376ae2f8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancements.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancements.java @@ -29,7 +29,7 @@ public void generate(HolderLookup.Provider registries, Consumer itemLike) { @Override public ResourceLocation getType() { - return new ResourceLocation(ArsNouveau.MODID, "apparatus_recipe"); + return ArsNouveau.prefix( "apparatus_recipe"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusTextPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusTextPage.java index 2846da6c86..0a04ce2090 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusTextPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusTextPage.java @@ -21,6 +21,6 @@ public ApparatusTextPage(RegistryObject itemLike) { @Override public ResourceLocation getType() { - return new ResourceLocation(ArsNouveau.MODID, "no_output_apparatus_recipe"); + return ArsNouveau.prefix( "no_output_apparatus_recipe"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/EnchantingPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/EnchantingPage.java index 84d657991a..c9dcedca57 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/EnchantingPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/EnchantingPage.java @@ -11,6 +11,6 @@ public EnchantingPage(String recipe) { @Override public ResourceLocation getType() { - return new ResourceLocation(ArsNouveau.MODID, "enchanting_recipe"); + return ArsNouveau.prefix( "enchanting_recipe"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/MultiblockPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/MultiblockPage.java index f9234634bd..d1b244e8bc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/MultiblockPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/MultiblockPage.java @@ -3,7 +3,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import net.minecraft.resources.ResourceLocation; -import record; + import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java index 3695658400..4aab291eb7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java @@ -46,11 +46,11 @@ import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.ArrayList; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimBlockSummon.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimBlockSummon.java index fa75b6db70..2dcd101428 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimBlockSummon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimBlockSummon.java @@ -36,11 +36,11 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.Optional; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java index 03104b2670..edb6232d16 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java @@ -52,8 +52,8 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java index f21acf8a5b..0bac05d6d0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java @@ -45,11 +45,11 @@ import net.neoforged.neoforge.common.Tags; import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -330,7 +330,7 @@ public ResourceLocation getTexture(EntityBookwyrm entity) { String color = getColor(entity).toLowerCase(); if (color.isEmpty()) color = "blue"; - return new ResourceLocation(ArsNouveau.MODID, "textures/entity/book_wyrm_" + color + ".png"); + return ArsNouveau.prefix( "textures/entity/book_wyrm_" + color + ".png"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java index 3dd35ec999..28854ec487 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java @@ -17,8 +17,8 @@ import net.neoforged.neoforge.network.NetworkHooks; import net.neoforged.neoforge.network.PlayMessages; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.Collection; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java index 72b30fc8a3..a4166f2a8f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java @@ -51,12 +51,12 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.common.Tags; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -358,7 +358,7 @@ public ResourceLocation getTexture(EntityDrygmy entity) { String color = getColor(entity).toLowerCase(); if (color.isEmpty()) color = "brown"; - return new ResourceLocation(ArsNouveau.MODID, "textures/entity/drygmy_" + color + ".png"); + return ArsNouveau.prefix( "textures/entity/drygmy_" + color + ".png"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java index 2e97e25ee8..79edcc8d4c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java @@ -39,13 +39,13 @@ import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.Tags; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.GeoAnimatable; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -236,7 +236,7 @@ public ResourceLocation getTexture(EntityWixie entity) { String color = getColor(entity).toLowerCase(); if (color.isEmpty()) color = "blue"; - return new ResourceLocation(ArsNouveau.MODID, "textures/entity/wixie_" + color + ".png"); + return ArsNouveau.prefix( "textures/entity/wixie_" + color + ".png"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/GiftStarbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/GiftStarbuncle.java index 9f431dc2cb..029a246dad 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/GiftStarbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/GiftStarbuncle.java @@ -29,12 +29,12 @@ import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.Tags; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class GiftStarbuncle extends PathfinderMob implements GeoEntity { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Lily.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Lily.java index 04c928a74c..2ec338a3d9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Lily.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Lily.java @@ -30,11 +30,11 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.UUID; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 259dc631e6..2a703702f7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -75,11 +75,11 @@ import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.registries.ForgeRegistries; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -694,7 +694,7 @@ public ResourceLocation getTexture(Starbuncle entity) { String color = getColor(entity); if (color.isEmpty()) color = DyeColor.ORANGE.getName(); - return new ResourceLocation(ArsNouveau.MODID, "textures/entity/starbuncle_" + color.toLowerCase() + ".png"); + return ArsNouveau.prefix( "textures/entity/starbuncle_" + color.toLowerCase() + ".png"); } @org.jetbrains.annotations.Nullable diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WealdWalker.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WealdWalker.java index d34a53272a..74e8373576 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WealdWalker.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WealdWalker.java @@ -40,12 +40,12 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -249,7 +249,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar data) { data.add(attackController); } - private PlayState attackController(software.bernie.geckolib.core.animation.AnimationState AnimationState) { + private PlayState attackController(software.bernie.geckolib.animation.AnimationState AnimationState) { return PlayState.CONTINUE; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java index 91db20dc2d..bd7f85f5f2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java @@ -57,12 +57,12 @@ import net.neoforged.neoforge.common.Tags; import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -448,6 +448,6 @@ public boolean onDispel(@Nullable LivingEntity caster) { @Override public ResourceLocation getTexture(Whirlisprig entity) { - return new ResourceLocation(ArsNouveau.MODID, "textures/entity/whirlisprig_" + (getColor(entity).isEmpty() ? "summer" : getColor(entity)) + ".png"); + return ArsNouveau.prefix( "textures/entity/whirlisprig_" + (getColor(entity).isEmpty() ? "summer" : getColor(entity)) + ".png"); } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java index f647409a8b..fce452bb34 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java @@ -64,13 +64,13 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.fluids.FluidType; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; -import var; + import java.util.ArrayList; public class WildenChimera extends Monster implements GeoEntity { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenGuardian.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenGuardian.java index a899b2ccd1..5d754b6507 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenGuardian.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenGuardian.java @@ -28,13 +28,13 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.GeoAnimatable; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class WildenGuardian extends Monster implements GeoEntity { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenHunter.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenHunter.java index 27327f1caa..edb67ca433 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenHunter.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenHunter.java @@ -22,13 +22,13 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.GeoAnimatable; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenStalker.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenStalker.java index 45dbf60b89..1418032d2f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenStalker.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenStalker.java @@ -25,14 +25,14 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.GeoAnimatable; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; -import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.animation.AnimationState; public class WildenStalker extends Monster implements GeoEntity { int leapCooldown; @@ -120,7 +120,7 @@ protected float getSoundVolume() { return 0.4F; } - private PlayState flyPredicate(software.bernie.geckolib.core.animation.AnimationState event) { + private PlayState flyPredicate(software.bernie.geckolib.animation.AnimationState event) { if(isFlying()) { event.getController().setAnimation(RawAnimation.begin().thenPlay("fly")); return PlayState.CONTINUE; @@ -128,7 +128,7 @@ private PlayState flyPredicate(software.bernie.geckolib.core.animation.Animation return PlayState.STOP; } - private PlayState groundPredicate(software.bernie.geckolib.core.animation.AnimationState e) { + private PlayState groundPredicate(software.bernie.geckolib.animation.AnimationState e) { if(isFlying()){ return PlayState.STOP; }else if(e.isMoving()){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java index 0ddd386878..87bfcee706 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java @@ -12,9 +12,9 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.Tags; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import java.util.HashMap; import java.util.Map; @@ -53,7 +53,7 @@ public EntityType getType() { public static final Map Variants = new HashMap<>(); static { - Variants.put("default", new ResourceLocation(ArsNouveau.MODID, "textures/entity/amethyst_golem.png")); + Variants.put("default", ArsNouveau.prefix( "textures/entity/amethyst_golem.png")); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java index 6d230b8ac0..4ec362ff63 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java @@ -19,9 +19,9 @@ import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.event.entity.player.EntityItemPickupEvent; import net.neoforged.neoforge.items.wrapper.PlayerMainInvWrapper; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import java.util.ArrayList; import java.util.Arrays; @@ -99,6 +99,6 @@ public ResourceLocation getTexture(FamiliarEntity entity) { String color = getColor().toLowerCase(); if (color.isEmpty()) color = "blue"; - return new ResourceLocation(ArsNouveau.MODID, "textures/entity/book_wyrm_" + color + ".png"); + return ArsNouveau.prefix( "textures/entity/book_wyrm_" + color + ".png"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java index 79540f0e33..158d557c3e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java @@ -16,9 +16,9 @@ import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.event.entity.living.LootingLevelEvent; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import java.util.Arrays; @@ -78,6 +78,6 @@ public EntityType getType() { public ResourceLocation getTexture(FamiliarEntity entity) { String color = getColor().toLowerCase(); if (color.isEmpty()) color = "brown"; - return new ResourceLocation(ArsNouveau.MODID, "textures/entity/drygmy_" + color + ".png"); + return ArsNouveau.prefix( "textures/entity/drygmy_" + color + ".png"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarJabberwog.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarJabberwog.java index 146a0d57dc..26c5510a35 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarJabberwog.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarJabberwog.java @@ -4,9 +4,9 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.PathfinderMob; import net.minecraft.world.level.Level; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; public class FamiliarJabberwog extends FlyingFamiliarEntity { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java index 3b2e6dda18..075b6637e1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java @@ -20,9 +20,9 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.Tags; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import java.util.Arrays; @@ -81,7 +81,7 @@ public ResourceLocation getTexture(FamiliarEntity entity) { String color = getColor(); if (color.isEmpty()) color = DyeColor.ORANGE.getName(); - return new ResourceLocation(ArsNouveau.MODID, "textures/entity/starbuncle_" + color.toLowerCase() + ".png"); + return ArsNouveau.prefix( "textures/entity/starbuncle_" + color.toLowerCase() + ".png"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java index 0cc2c80827..292e2d1617 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java @@ -19,9 +19,9 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.event.entity.living.LivingEntityUseItemEvent; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; public class FamiliarWhirlisprig extends FlyingFamiliarEntity implements ISpellCastListener { @@ -97,6 +97,6 @@ public EntityType getType() { @Override public ResourceLocation getTexture(FamiliarEntity entity) { - return new ResourceLocation(ArsNouveau.MODID, "textures/entity/whirlisprig_" + (getColor().isEmpty() ? "summer" : getColor().toLowerCase()) + ".png"); + return ArsNouveau.prefix( "textures/entity/whirlisprig_" + (getColor().isEmpty() ? "summer" : getColor().toLowerCase()) + ".png"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java index 67c29e0668..f9e27fd2bb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java @@ -34,9 +34,9 @@ import net.neoforged.neoforge.common.brewing.BrewingRecipe; import net.neoforged.neoforge.event.entity.living.MobEffectEvent; import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import java.util.ArrayList; import java.util.Arrays; @@ -137,7 +137,7 @@ public ResourceLocation getTexture(FamiliarEntity entity) { String color = getColor().toLowerCase(); if (color.isEmpty()) color = "blue"; - return new ResourceLocation(ArsNouveau.MODID, "textures/entity/wixie_" + color + ".png"); + return ArsNouveau.prefix( "textures/entity/wixie_" + color + ".png"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyBehavior.java index 235ee57855..c1dba57653 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyBehavior.java @@ -73,7 +73,7 @@ public void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @Nullable Di @Override protected ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, "starby"); + return ArsNouveau.prefix( "starby"); } public void syncTag() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyListBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyListBehavior.java index 04009c77da..521b7cb918 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyListBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyListBehavior.java @@ -139,6 +139,6 @@ public CompoundTag toTag(CompoundTag tag) { @Override protected ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, "starby_list"); + return ArsNouveau.prefix( "starby_list"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java index 827a69ca90..f91010c9c7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java @@ -20,7 +20,7 @@ import java.util.List; public class StarbyPotionBehavior extends StarbyListBehavior { - public static final ResourceLocation POTION_ID = new ResourceLocation(ArsNouveau.MODID, "starby_potion"); + public static final ResourceLocation POTION_ID = ArsNouveau.prefix( "starby_potion"); private @Nullable PotionData heldPotion = null; private int amount; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java index 5c26551611..054971e47d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java @@ -31,7 +31,7 @@ import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.ItemHandlerHelper; import org.jetbrains.annotations.Nullable; -import var; + import java.util.List; import java.util.concurrent.TimeUnit; @@ -40,7 +40,7 @@ public class StarbyTransportBehavior extends StarbyListBehavior { .expireAfterAccess(20, TimeUnit.SECONDS) .build(); - public static final ResourceLocation TRANSPORT_ID = new ResourceLocation(ArsNouveau.MODID, "starby_transport"); + public static final ResourceLocation TRANSPORT_ID = ArsNouveau.prefix( "starby_transport"); public ItemStack itemScroll; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraRamGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraRamGoal.java index 5a3764a806..9599022190 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraRamGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraRamGoal.java @@ -11,7 +11,7 @@ import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.level.pathfinder.Path; import net.minecraft.world.phys.AABB; -import var; + import java.util.EnumSet; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java index dcc7951c26..89e137d28a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java @@ -14,7 +14,7 @@ import net.neoforged.neoforge.event.TickEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.network.PacketDistributor; -import var; + @EventBusSubscriber(modid = ArsNouveau.MODID) public class ManaCapEvents { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java index 92a463988a..2185fa2f1e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java @@ -21,7 +21,7 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import org.jetbrains.annotations.Nullable; -import record; + import java.util.ArrayList; import java.util.List; @@ -61,7 +61,7 @@ public void onRadialKeyPressed(ItemStack stack, Player player) { } Minecraft.getInstance().setScreen(new GuiRadialMenu<>(new RadialMenu<>((int index) -> { Networking.INSTANCE.sendToServer(new PacketConsumePotion(slots.get(index).primarySlotIcon().slot)); - }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtils.drawItemAsIcon(slotData.stack, posestack, positionx, posy, size, transparent), 3))); + }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtil.drawItemAsIcon(slotData.stack, posestack, positionx, posy, size, transparent), 3))); } public record SlotData(int slot, ItemStack stack){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AnimModItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AnimModItem.java index dce4bda113..7c22a983b8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AnimModItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AnimModItem.java @@ -1,8 +1,8 @@ package com.hollingsworth.arsnouveau.common.items; import software.bernie.geckolib.animatable.GeoItem; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java index 5910e0541b..2ba400e56e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java @@ -19,8 +19,8 @@ import net.minecraft.world.phys.HitResult; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import software.bernie.geckolib.animatable.GeoItem; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersShield.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersShield.java index 278192a37f..6b06bde979 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersShield.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersShield.java @@ -13,8 +13,8 @@ import net.minecraft.world.level.Level; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import software.bernie.geckolib.animatable.GeoItem; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.function.Consumer; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java index 5740b9f084..4cd49a5805 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java @@ -25,8 +25,8 @@ import net.minecraft.world.phys.EntityHitResult; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import software.bernie.geckolib.animatable.GeoItem; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java index dfbc2b1491..98f635b347 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java @@ -34,8 +34,8 @@ import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import software.bernie.geckolib.animatable.GeoItem; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.ArrayList; @@ -145,7 +145,7 @@ public void onRadialKeyPressed(ItemStack stack, Player player) { } Minecraft.getInstance().setScreen(new GuiRadialMenu<>(new RadialMenu<>((int index) -> { Networking.INSTANCE.sendToServer(new PacketSetLauncher(slots.get(index).primarySlotIcon().getSlot())); - }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtils.drawItemAsIcon(slotData.getStack(), posestack, positionx, posy, size, transparent), 3))); + }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtil.drawItemAsIcon(slotData.getStack(), posestack, positionx, posy, size, transparent), 3))); } public AnimatableInstanceCache factory = GeckoLibUtil.createInstanceCache(this); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java index 695096b951..577e1972bb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java @@ -17,8 +17,8 @@ import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoItem; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java index ee16f8347a..df9e373735 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java @@ -34,8 +34,8 @@ import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoItem; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java index 33cbbfc054..caab8864cf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java @@ -43,8 +43,8 @@ import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoItem; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java index 965a3c57ea..9bffd2391a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java @@ -25,8 +25,8 @@ import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import net.neoforged.neoforge.common.CommonHooks; import software.bernie.geckolib.animatable.GeoItem; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java index 2563705abf..248537ac9d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java @@ -37,8 +37,8 @@ import org.joml.Quaternionf; import org.joml.Vector3f; import software.bernie.geckolib.animatable.GeoItem; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java index 56fa612b12..db53d5a004 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java @@ -21,13 +21,13 @@ import net.minecraft.world.level.Level; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import software.bernie.geckolib.animatable.GeoItem; -import software.bernie.geckolib.core.animatable.GeoAnimatable; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/EntityTags.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/EntityTags.java index 18c703bb1d..b5cec7f8f9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/EntityTags.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/EntityTags.java @@ -7,20 +7,20 @@ import net.minecraft.world.entity.EntityType; public class EntityTags { - public static final TagKey> DRYGMY_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(ArsNouveau.MODID, "drygmy_blacklist")); - public static final TagKey> DISINTEGRATION_WHITELIST = TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(ArsNouveau.MODID, "disintegration_whitelist")); - public static final TagKey> DISINTEGRATION_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(ArsNouveau.MODID, "disintegration_blacklist")); - public static final TagKey> HOSTILE_MOBS = TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(ArsNouveau.MODID, "an_hostile")); + public static final TagKey> DRYGMY_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "drygmy_blacklist")); + public static final TagKey> DISINTEGRATION_WHITELIST = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "disintegration_whitelist")); + public static final TagKey> DISINTEGRATION_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "disintegration_blacklist")); + public static final TagKey> HOSTILE_MOBS = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "an_hostile")); - public static final TagKey> MAGIC_FIND = TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(ArsNouveau.MODID, "magic_find")); - public static final TagKey> SPELL_CAN_HIT = TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(ArsNouveau.MODID, "spell_can_hit")); - public static final TagKey> JAR_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(ArsNouveau.MODID, "jar_blacklist")); - public static final TagKey> INTERACT_JAR_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(ArsNouveau.MODID, "interact_jar_blacklist")); - public static final TagKey> JAR_WHITELIST = TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(ArsNouveau.MODID, "jar_whitelist")); - public static final TagKey> FAMILIAR = TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(ArsNouveau.MODID, "familiar")); - public static final TagKey> LINGERING_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(ArsNouveau.MODID, "lingering_blacklist")); - public static final TagKey> BERRY_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(ArsNouveau.MODID, "berry_blacklist")); - public static final TagKey> JAR_RELEASE_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(ArsNouveau.MODID, "jar_release_blacklist")); - public static final TagKey> ANIMAL_SUMMON_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(ArsNouveau.MODID, "animal_summon_blacklist")); - public static final TagKey> REWIND_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(ArsNouveau.MODID, "rewind_blacklist")); + public static final TagKey> MAGIC_FIND = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "magic_find")); + public static final TagKey> SPELL_CAN_HIT = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "spell_can_hit")); + public static final TagKey> JAR_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "jar_blacklist")); + public static final TagKey> INTERACT_JAR_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "interact_jar_blacklist")); + public static final TagKey> JAR_WHITELIST = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "jar_whitelist")); + public static final TagKey> FAMILIAR = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "familiar")); + public static final TagKey> LINGERING_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "lingering_blacklist")); + public static final TagKey> BERRY_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "berry_blacklist")); + public static final TagKey> JAR_RELEASE_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "jar_release_blacklist")); + public static final TagKey> ANIMAL_SUMMON_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "animal_summon_blacklist")); + public static final TagKey> REWIND_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "rewind_blacklist")); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/PotionEffectTags.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/PotionEffectTags.java index 006a9c672b..dcc145b6df 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/PotionEffectTags.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/PotionEffectTags.java @@ -16,10 +16,10 @@ public class PotionEffectTags { private static final HashMap, ArrayList> potionEffects = new HashMap<>(); - public static final TagKey UNSTABLE_GIFTS = TagKey.create(Registries.MOB_EFFECT, new ResourceLocation(ArsNouveau.MODID, "unstable_gifts")); - public static final TagKey DISPEL_DENY = TagKey.create(Registries.MOB_EFFECT, new ResourceLocation(ArsNouveau.MODID, "deny_dispel")); - public static final TagKey DISPEL_ALLOW = TagKey.create(Registries.MOB_EFFECT, new ResourceLocation(ArsNouveau.MODID, "allow_dispel")); - public static final TagKey TO_SYNC = TagKey.create(Registries.MOB_EFFECT, new ResourceLocation(ArsNouveau.MODID, "to_sync")); + public static final TagKey UNSTABLE_GIFTS = TagKey.create(Registries.MOB_EFFECT, ArsNouveau.prefix( "unstable_gifts")); + public static final TagKey DISPEL_DENY = TagKey.create(Registries.MOB_EFFECT, ArsNouveau.prefix( "deny_dispel")); + public static final TagKey DISPEL_ALLOW = TagKey.create(Registries.MOB_EFFECT, ArsNouveau.prefix( "allow_dispel")); + public static final TagKey TO_SYNC = TagKey.create(Registries.MOB_EFFECT, ArsNouveau.prefix( "to_sync")); public static ArrayList getEffects(Level level, TagKey tag) { return potionEffects.computeIfAbsent(tag, (_key) -> { Optional> effects = level.registryAccess().registryOrThrow(Registries.MOB_EFFECT).getTag(tag); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java b/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java index d2ac5c175e..55a52eb567 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java @@ -17,7 +17,7 @@ import net.neoforged.neoforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import var; + import java.util.*; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Function; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/LightEntityMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/LightEntityMixin.java index 7422a193ba..b0ebbe6190 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/LightEntityMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/LightEntityMixin.java @@ -22,7 +22,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import var; + @Mixin(Entity.class) public abstract class LightEntityMixin implements LambDynamicLight { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java index a794a820e1..8c934f4be1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java @@ -8,10 +8,8 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.network.NetworkDirection; -import net.neoforged.neoforge.network.NetworkRegistry; + import net.neoforged.neoforge.network.PacketDistributor; -import net.neoforged.neoforge.network.simple.SimpleChannel; import java.util.Optional; public class Networking { @@ -24,7 +22,7 @@ public static int nextID() { } public static void registerMessages() { - INSTANCE = NetworkRegistry.newSimpleChannel(new ResourceLocation(ArsNouveau.MODID, "network"), () -> "1.0", s -> true, s -> true); + INSTANCE = NetworkRegistry.newSimpleChannel(ArsNouveau.prefix( "network"), () -> "1.0", s -> true, s -> true); INSTANCE.registerMessage(nextID(), PacketOpenSpellBook.class, diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/BondedPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/BondedPerk.java index 0c5666bb3c..97b9545718 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/BondedPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/BondedPerk.java @@ -6,7 +6,7 @@ public class BondedPerk extends Perk { - public static BondedPerk INSTANCE = new BondedPerk(new ResourceLocation(ArsNouveau.MODID, "thread_bonded")); + public static BondedPerk INSTANCE = new BondedPerk(ArsNouveau.prefix( "thread_bonded")); public BondedPerk(ResourceLocation key) { super(key); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ChillingPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ChillingPerk.java index 1ed3ab07bd..b3588f0683 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ChillingPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ChillingPerk.java @@ -15,7 +15,7 @@ import org.jetbrains.annotations.NotNull; public class ChillingPerk extends Perk implements IEffectResolvePerk { - public static ChillingPerk INSTANCE = new ChillingPerk(new ResourceLocation(ArsNouveau.MODID, "thread_chilling")); + public static ChillingPerk INSTANCE = new ChillingPerk(ArsNouveau.prefix( "thread_chilling")); public ChillingPerk(ResourceLocation key) { super(key); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/DepthsPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/DepthsPerk.java index 2ac4a672e8..5e34afe87c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/DepthsPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/DepthsPerk.java @@ -14,7 +14,7 @@ public class DepthsPerk extends Perk { - public static DepthsPerk INSTANCE = new DepthsPerk(new ResourceLocation(ArsNouveau.MODID, "thread_depths")); + public static DepthsPerk INSTANCE = new DepthsPerk(ArsNouveau.prefix( "thread_depths")); public static final UUID PERK_UUID = UUID.fromString("ce320c42-9d63-4b83-9e69-ef144790d667"); public DepthsPerk(ResourceLocation key) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/EmptyPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/EmptyPerk.java index ceb0c355e8..8236513b24 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/EmptyPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/EmptyPerk.java @@ -6,7 +6,7 @@ import net.minecraft.resources.ResourceLocation; public class EmptyPerk extends Perk { - public static ResourceLocation registryName = new ResourceLocation(ArsNouveau.MODID, "blank_thread"); + public static ResourceLocation registryName = ArsNouveau.prefix( "blank_thread"); public static EmptyPerk INSTANCE = new EmptyPerk(registryName); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/FeatherPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/FeatherPerk.java index bc98642c2c..8c1ca2c7b6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/FeatherPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/FeatherPerk.java @@ -14,7 +14,7 @@ public class FeatherPerk extends Perk { - public static final FeatherPerk INSTANCE = new FeatherPerk(new ResourceLocation(ArsNouveau.MODID, "thread_feather")); + public static final FeatherPerk INSTANCE = new FeatherPerk(ArsNouveau.prefix( "thread_feather")); public static final UUID PERK_UUID = UUID.fromString("3923ee66-756d-4b1d-b216-bb9338b0315b"); public FeatherPerk(ResourceLocation key) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/GlidingPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/GlidingPerk.java index a9c169f691..f1f7873b3a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/GlidingPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/GlidingPerk.java @@ -9,7 +9,7 @@ public class GlidingPerk extends Perk { - public static final GlidingPerk INSTANCE = new GlidingPerk(new ResourceLocation(ArsNouveau.MODID, "thread_gliding")); + public static final GlidingPerk INSTANCE = new GlidingPerk(ArsNouveau.prefix( "thread_gliding")); public static final UUID PERK_UUID = UUID.fromString("556fd264-22f2-4454-85b1-19070179f09a"); public GlidingPerk(ResourceLocation key) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/IgnitePerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/IgnitePerk.java index cfcdc2d41e..e035055747 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/IgnitePerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/IgnitePerk.java @@ -13,7 +13,7 @@ import org.jetbrains.annotations.NotNull; public class IgnitePerk extends Perk implements IEffectResolvePerk { - public static IgnitePerk INSTANCE = new IgnitePerk(new ResourceLocation(ArsNouveau.MODID, "thread_kindling")); + public static IgnitePerk INSTANCE = new IgnitePerk(ArsNouveau.prefix( "thread_kindling")); public IgnitePerk(ResourceLocation key) { super(key); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ImmolatePerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ImmolatePerk.java index 30f41fc444..757b51ac78 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ImmolatePerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ImmolatePerk.java @@ -13,7 +13,7 @@ import net.minecraft.world.entity.LivingEntity; public class ImmolatePerk extends Perk implements IEffectResolvePerk { - public static final ImmolatePerk INSTANCE = new ImmolatePerk(new ResourceLocation(ArsNouveau.MODID, "thread_immolation")); + public static final ImmolatePerk INSTANCE = new ImmolatePerk(ArsNouveau.prefix( "thread_immolation")); public ImmolatePerk(ResourceLocation key) { super(key); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/JumpHeightPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/JumpHeightPerk.java index eeaf2242b5..8d5d8d6e48 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/JumpHeightPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/JumpHeightPerk.java @@ -8,7 +8,7 @@ public class JumpHeightPerk extends Perk { - public static final JumpHeightPerk INSTANCE = new JumpHeightPerk(new ResourceLocation(ArsNouveau.MODID, "thread_heights")); + public static final JumpHeightPerk INSTANCE = new JumpHeightPerk(ArsNouveau.prefix( "thread_heights")); public static final UUID PERK_UUID = UUID.fromString("e5f68a8c-589f-4dde-978d-b4c507a4485b"); public JumpHeightPerk(ResourceLocation key) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/KnockbackResistPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/KnockbackResistPerk.java index d1bf6417a6..33cb1788ad 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/KnockbackResistPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/KnockbackResistPerk.java @@ -14,7 +14,7 @@ public class KnockbackResistPerk extends Perk { - public static final KnockbackResistPerk INSTANCE = new KnockbackResistPerk(new ResourceLocation(ArsNouveau.MODID, "thread_amethyst_golem")); + public static final KnockbackResistPerk INSTANCE = new KnockbackResistPerk(ArsNouveau.prefix( "thread_amethyst_golem")); public static final UUID PERK_UUID = UUID.fromString("b1d84c5d-4c84-4626-b275-94698b08aae1"); public KnockbackResistPerk(ResourceLocation key) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/LootingPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/LootingPerk.java index 630c13de09..9d55b06e30 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/LootingPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/LootingPerk.java @@ -8,7 +8,7 @@ public class LootingPerk extends Perk { - public static final LootingPerk INSTANCE = new LootingPerk(new ResourceLocation(ArsNouveau.MODID, "thread_drygmy")); + public static final LootingPerk INSTANCE = new LootingPerk(ArsNouveau.prefix( "thread_drygmy")); public static final UUID PERK_UUID = UUID.fromString("ff9459e5-ec2c-44c8-ac3b-19c78c76b4bb"); public LootingPerk(ResourceLocation key) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicCapacityPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicCapacityPerk.java index 88117dfa8a..f9fb7edb49 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicCapacityPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicCapacityPerk.java @@ -14,7 +14,7 @@ public class MagicCapacityPerk extends Perk { - public static final MagicCapacityPerk INSTANCE = new MagicCapacityPerk(new ResourceLocation(ArsNouveau.MODID, "thread_magic_capacity")); + public static final MagicCapacityPerk INSTANCE = new MagicCapacityPerk(ArsNouveau.prefix( "thread_magic_capacity")); public static final UUID PERK_UUID = UUID.fromString("42ebba5f-7843-4da9-9ad4-e9ca37120602"); public MagicCapacityPerk(ResourceLocation key) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicResistPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicResistPerk.java index 0e871a5d24..69b040cdd8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicResistPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicResistPerk.java @@ -14,7 +14,7 @@ public class MagicResistPerk extends Perk { - public static final MagicResistPerk INSTANCE = new MagicResistPerk(new ResourceLocation(ArsNouveau.MODID, "thread_warding")); + public static final MagicResistPerk INSTANCE = new MagicResistPerk(ArsNouveau.prefix( "thread_warding")); public static final UUID PERK_UUID = UUID.fromString("fc967b66-a432-44e1-93ec-e8ed583b47b3"); public MagicResistPerk(ResourceLocation key) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/PotionDurationPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/PotionDurationPerk.java index 6f9774b374..564593bdc5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/PotionDurationPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/PotionDurationPerk.java @@ -14,7 +14,7 @@ public class PotionDurationPerk extends Perk { - public static final PotionDurationPerk INSTANCE = new PotionDurationPerk(new ResourceLocation(ArsNouveau.MODID, "thread_wixie")); + public static final PotionDurationPerk INSTANCE = new PotionDurationPerk(ArsNouveau.prefix( "thread_wixie")); public static final UUID PERK_UUID = UUID.fromString("f4c0926e-82a7-44d6-bd6b-a0321a65de2f"); public PotionDurationPerk(ResourceLocation key) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/RepairingPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/RepairingPerk.java index 27185a47c7..97e21731ae 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/RepairingPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/RepairingPerk.java @@ -12,7 +12,7 @@ public class RepairingPerk extends Perk { - public static final RepairingPerk INSTANCE = new RepairingPerk(new ResourceLocation(ArsNouveau.MODID, "thread_repairing")); + public static final RepairingPerk INSTANCE = new RepairingPerk(ArsNouveau.prefix( "thread_repairing")); public static final UUID PERK_UUID = UUID.fromString("e2a7e5bc-ab34-4ea2-b3b6-ef23d352fa47"); public RepairingPerk(ResourceLocation key) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/SaturationPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/SaturationPerk.java index 2a92d22235..11300539b5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/SaturationPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/SaturationPerk.java @@ -14,7 +14,7 @@ public class SaturationPerk extends Perk { - public static final SaturationPerk INSTANCE = new SaturationPerk(new ResourceLocation(ArsNouveau.MODID, "thread_whirlisprig")); + public static final SaturationPerk INSTANCE = new SaturationPerk(ArsNouveau.prefix( "thread_whirlisprig")); public static final UUID PERK_UUID = UUID.fromString("fe329876-34b0-4349-a60a-6215ca44bd4e"); public SaturationPerk(ResourceLocation key) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/SpellDamagePerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/SpellDamagePerk.java index 6eef8d3534..15283a36bb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/SpellDamagePerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/SpellDamagePerk.java @@ -14,7 +14,7 @@ public class SpellDamagePerk extends Perk { - public static final SpellDamagePerk INSTANCE = new SpellDamagePerk(new ResourceLocation(ArsNouveau.MODID, "thread_spellpower")); + public static final SpellDamagePerk INSTANCE = new SpellDamagePerk(ArsNouveau.prefix( "thread_spellpower")); public static final UUID PERK_UUID = UUID.fromString("8b96679e-29e2-4a53-9f44-85024d78c366"); public SpellDamagePerk(ResourceLocation key) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/StarbunclePerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/StarbunclePerk.java index 9b1138ef75..736c350e1a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/StarbunclePerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/StarbunclePerk.java @@ -15,7 +15,7 @@ public class StarbunclePerk extends Perk { - public static final StarbunclePerk INSTANCE = new StarbunclePerk(new ResourceLocation(ArsNouveau.MODID, "thread_starbuncle")); + public static final StarbunclePerk INSTANCE = new StarbunclePerk(ArsNouveau.prefix( "thread_starbuncle")); public static final UUID PERK_SPEED_UUID = UUID.fromString("46937d0b-123c-4786-95b5-748afd50f398"); protected StarbunclePerk(ResourceLocation key) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/StepHeightPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/StepHeightPerk.java index 695d9a6df2..9c94250aec 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/StepHeightPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/StepHeightPerk.java @@ -14,7 +14,7 @@ public class StepHeightPerk extends Perk { - public static final StepHeightPerk INSTANCE = new StepHeightPerk(new ResourceLocation(ArsNouveau.MODID, "thread_high_step")); + public static final StepHeightPerk INSTANCE = new StepHeightPerk(ArsNouveau.prefix( "thread_high_step")); public static final UUID PERK_STEP_UUID = UUID.fromString("46937d0b-123c-4786-95b5-748afd50f398"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/TotemPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/TotemPerk.java index 83b9d2ae91..f8584579da 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/TotemPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/TotemPerk.java @@ -9,7 +9,7 @@ import net.minecraft.resources.ResourceLocation; public class TotemPerk extends Perk { - public static TotemPerk INSTANCE = new TotemPerk(new ResourceLocation(ArsNouveau.MODID, "thread_undying")); + public static TotemPerk INSTANCE = new TotemPerk(ArsNouveau.prefix( "thread_undying")); public TotemPerk(ResourceLocation key) { super(key); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ToughnessPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ToughnessPerk.java index cb64f2cc84..be9c8b70a1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ToughnessPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ToughnessPerk.java @@ -14,7 +14,7 @@ public class ToughnessPerk extends Perk { - public static final ToughnessPerk INSTANCE = new ToughnessPerk(new ResourceLocation(ArsNouveau.MODID, "thread_toughness")); + public static final ToughnessPerk INSTANCE = new ToughnessPerk(ArsNouveau.prefix( "thread_toughness")); public static final UUID PERK_UUID = UUID.fromString("a628398e-20e1-493c-b81f-d1e58d7d0d69"); public ToughnessPerk(ResourceLocation key) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/VampiricPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/VampiricPerk.java index bfbe91a248..cfb7b950c0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/VampiricPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/VampiricPerk.java @@ -17,7 +17,7 @@ import org.jetbrains.annotations.NotNull; public class VampiricPerk extends Perk implements IEffectResolvePerk { - public static VampiricPerk INSTANCE = new VampiricPerk(new ResourceLocation(ArsNouveau.MODID, "thread_life_drain")); + public static VampiricPerk INSTANCE = new VampiricPerk(ArsNouveau.prefix( "thread_life_drain")); public VampiricPerk(ResourceLocation key) { super(key); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ConjureDesertRitual.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ConjureDesertRitual.java index e792fc1e51..caf1968c90 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ConjureDesertRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ConjureDesertRitual.java @@ -62,7 +62,7 @@ public boolean canConsumeItem(ItemStack stack) { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.DESERT); + return ArsNouveau.prefix( RitualLib.DESERT); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ConjurePlainsRitual.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ConjurePlainsRitual.java index c228d79cd6..a9184a0502 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ConjurePlainsRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ConjurePlainsRitual.java @@ -44,7 +44,7 @@ public boolean canConsumeItem(ItemStack stack) { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.PLAINS); + return ArsNouveau.prefix( RitualLib.PLAINS); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java index 32e6d8f533..634218f0fd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java @@ -65,7 +65,7 @@ public int getSourceCost() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.SANCTUARY); + return ArsNouveau.prefix( RitualLib.SANCTUARY); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/FloweringRitual.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/FloweringRitual.java index 6958dbcfa0..bea547b471 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/FloweringRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/FloweringRitual.java @@ -48,7 +48,7 @@ public boolean canConsumeItem(ItemStack stack) { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.FLOWERING); + return ArsNouveau.prefix( RitualLib.FLOWERING); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ForestationRitual.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ForestationRitual.java index 6348208d2b..35ef765903 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ForestationRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ForestationRitual.java @@ -45,7 +45,7 @@ public void addFeatures(List features) { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.FORESTATION); + return ArsNouveau.prefix( RitualLib.FORESTATION); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAnimalSummoning.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAnimalSummoning.java index 602c73300b..c5f43e148c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAnimalSummoning.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAnimalSummoning.java @@ -126,6 +126,6 @@ public String getLangDescription() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.ANIMAL_SUMMON); + return ArsNouveau.prefix( RitualLib.ANIMAL_SUMMON); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAwakening.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAwakening.java index f34213b421..a9fcdac536 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAwakening.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAwakening.java @@ -149,6 +149,6 @@ public String getLangDescription() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.AWAKENING); + return ArsNouveau.prefix( RitualLib.AWAKENING); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualBinding.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualBinding.java index 85c24a02f0..50970b469d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualBinding.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualBinding.java @@ -70,6 +70,6 @@ public String getLangDescription() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.BINDING); + return ArsNouveau.prefix( RitualLib.BINDING); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualBreed.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualBreed.java index 6d9f4b4b28..93ff6f2227 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualBreed.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualBreed.java @@ -56,6 +56,6 @@ public int getSourceCost() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.FERTILITY); + return ArsNouveau.prefix( RitualLib.FERTILITY); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualCloudshaper.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualCloudshaper.java index 34d012cc44..c67e724a55 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualCloudshaper.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualCloudshaper.java @@ -80,6 +80,6 @@ public ParticleColor getCenterColor() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.CLOUDSHAPER); + return ArsNouveau.prefix( RitualLib.CLOUDSHAPER); } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualDig.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualDig.java index c62e33d731..60317f6857 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualDig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualDig.java @@ -89,6 +89,6 @@ public String getLangName() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.DIG); + return ArsNouveau.prefix( RitualLib.DIG); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualDisintegration.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualDisintegration.java index 796afe8aa2..5972b1c508 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualDisintegration.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualDisintegration.java @@ -96,6 +96,6 @@ public ParticleColor getCenterColor() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.DISINTEGRATION); + return ArsNouveau.prefix( RitualLib.DISINTEGRATION); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualFlight.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualFlight.java index ef26a92f26..a1700c73af 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualFlight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualFlight.java @@ -34,7 +34,7 @@ public int getSourceCost() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.FLIGHT); + return ArsNouveau.prefix( RitualLib.FLIGHT); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualGravity.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualGravity.java index 01234b4d39..37c652dadb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualGravity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualGravity.java @@ -33,7 +33,7 @@ public int getSourceCost() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.GRAVITY); + return ArsNouveau.prefix( RitualLib.GRAVITY); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualHarvest.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualHarvest.java index 7bfe3b1523..182a50b1a4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualHarvest.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualHarvest.java @@ -136,7 +136,7 @@ public String getLangName() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.HARVEST); + return ArsNouveau.prefix( RitualLib.HARVEST); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualHealing.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualHealing.java index e3ed746a9a..4f2d5513f1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualHealing.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualHealing.java @@ -53,7 +53,7 @@ protected void tick() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.RESTORATION); + return ArsNouveau.prefix( RitualLib.RESTORATION); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualMobCapture.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualMobCapture.java index 1f30269ad3..647e677eb4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualMobCapture.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualMobCapture.java @@ -110,6 +110,6 @@ public String getLangName() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.CONTAINMENT); + return ArsNouveau.prefix( RitualLib.CONTAINMENT); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualMoonfall.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualMoonfall.java index 4ff4215a06..b5e8e1642b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualMoonfall.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualMoonfall.java @@ -53,7 +53,7 @@ public String getLangDescription() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.MOONFALL); + return ArsNouveau.prefix( RitualLib.MOONFALL); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualOvergrowth.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualOvergrowth.java index 404026ace6..3c663136c0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualOvergrowth.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualOvergrowth.java @@ -94,7 +94,7 @@ public String getLangDescription() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.OVERGROWTH); + return ArsNouveau.prefix( RitualLib.OVERGROWTH); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualPillagerRaid.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualPillagerRaid.java index f4df372458..b538e71f92 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualPillagerRaid.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualPillagerRaid.java @@ -65,6 +65,6 @@ public String getLangDescription() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.CHALLENGE); + return ArsNouveau.prefix( RitualLib.CHALLENGE); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java index de9f2f9a27..f569194fd3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java @@ -62,7 +62,7 @@ protected void tick() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.SCRYING); + return ArsNouveau.prefix( RitualLib.SCRYING); } public static void grantScrying(ServerPlayer playerEntity, int ticks, IScryer scryer) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualSunrise.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualSunrise.java index ab33f725b2..67b21dc902 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualSunrise.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualSunrise.java @@ -61,7 +61,7 @@ public ParticleColor getCenterColor() { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.SUNRISE); + return ArsNouveau.prefix( RitualLib.SUNRISE); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWarp.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWarp.java index 8cf310305d..b6439ee109 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWarp.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWarp.java @@ -79,6 +79,6 @@ public boolean canStart(@Nullable Player player) { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.WARP); + return ArsNouveau.prefix( RitualLib.WARP); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java index 9b053d36ec..f963508c34 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java @@ -81,6 +81,6 @@ public boolean canConsumeItem(ItemStack stack) { @Override public ResourceLocation getRegistryName() { - return new ResourceLocation(ArsNouveau.MODID, RitualLib.WILDEN_SUMMON); + return ArsNouveau.prefix( RitualLib.WILDEN_SUMMON); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/casters/ReactiveCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/casters/ReactiveCaster.java index 090d79d241..20d360de04 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/casters/ReactiveCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/casters/ReactiveCaster.java @@ -33,6 +33,6 @@ public SpellResolver getSpellResolver(SpellContext context, Level worldIn, Livin @Override public ResourceLocation getTagID() { - return new ResourceLocation(ArsNouveau.MODID, "reactive_caster"); + return ArsNouveau.prefix( "reactive_caster"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java index 1d639a9a00..f4fad850ce 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java @@ -38,7 +38,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import org.jetbrains.annotations.NotNull; -import var; + import java.util.*; public class EffectWololo extends AbstractEffect { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/rewind/RewindAttachment.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/rewind/RewindAttachment.java index 89db3adbe4..c8130f5cb8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/rewind/RewindAttachment.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/rewind/RewindAttachment.java @@ -9,7 +9,7 @@ import java.util.*; public class RewindAttachment implements IContextAttachment { - public static final ResourceLocation ID = new ResourceLocation(ArsNouveau.MODID, "rewind"); + public static final ResourceLocation ID = ArsNouveau.prefix( "rewind"); private final Map> rewindEvents = new HashMap<>(); private long lockedTime = 0; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/Terrablender.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/Terrablender.java index d4485767ea..6206e0ceb2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/Terrablender.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/Terrablender.java @@ -10,7 +10,7 @@ public class Terrablender { public static void registerBiomes() { - Regions.register(new ArchwoodRegion(new ResourceLocation(ArsNouveau.MODID, "overworld"), Config.ARCHWOOD_FOREST_WEIGHT.get())); + Regions.register(new ArchwoodRegion(ArsNouveau.prefix( "overworld"), Config.ARCHWOOD_FOREST_WEIGHT.get())); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneSavedData.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneSavedData.java index 420f17df69..5624745927 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneSavedData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneSavedData.java @@ -9,7 +9,7 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.event.TickEvent; -import var; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneUtil.java index 5979ae1b0c..bb7fa8a871 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneUtil.java @@ -4,7 +4,7 @@ import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import var; + public class RedstoneUtil { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/structure/WildenDen.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/structure/WildenDen.java index 258be1ddc1..a0f9b4fad7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/structure/WildenDen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/structure/WildenDen.java @@ -26,7 +26,7 @@ import net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer; import net.minecraft.world.level.levelgen.structure.pools.JigsawPlacement; import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool; -import var; + import java.util.Optional; public class WildenDen extends Structure { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/SupplierBlockStateProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/SupplierBlockStateProvider.java index 8744700f6d..9e05bd707b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/SupplierBlockStateProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/SupplierBlockStateProvider.java @@ -9,7 +9,7 @@ public class SupplierBlockStateProvider extends AbstractSupplierBlockStateProvider { public SupplierBlockStateProvider(String path) { - this(new ResourceLocation(ArsNouveau.MODID, path)); + this(ArsNouveau.prefix( path)); } public SupplierBlockStateProvider(ResourceLocation path) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java b/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java index 7c74191129..b2e080cf19 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java @@ -227,6 +227,6 @@ public static Map getDefaultItemLight(){ } public static String an(String s){ - return new ResourceLocation(ArsNouveau.MODID, s).toString(); + return ArsNouveau.prefix( s).toString(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BiomeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BiomeRegistry.java index 1f2c1d24a0..6fb62388fd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BiomeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BiomeRegistry.java @@ -19,7 +19,7 @@ public class BiomeRegistry { public static final ResourceKey ARCHWOOD_FOREST = register("archwood_forest"); public static ResourceKey register(String name) { - return ResourceKey.create(Registries.BIOME, new ResourceLocation(ArsNouveau.MODID, name)); + return ResourceKey.create(Registries.BIOME, ArsNouveau.prefix( name)); } public static void bootstrap(BootstrapContext context) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java index cf28e35582..5849872195 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java @@ -356,7 +356,7 @@ public static void onBlocksRegistry() { BLOCKS.register(s, () -> new SlabBlock(BlockBehaviour.Properties.of().strength(1.5F, 6.0F).sound(SoundType.STONE))); } for(String s : LibBlockNames.DECORATIVE_SOURCESTONE){ - BLOCKS.register(s + "_stairs", () -> new StairBlock(BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s)).defaultBlockState(), BlockBehaviour.Properties.of().strength(1.5F, 6.0F).sound(SoundType.STONE))); + BLOCKS.register(s + "_stairs", () -> new StairBlock(BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s)).defaultBlockState(), BlockBehaviour.Properties.of().strength(1.5F, 6.0F).sound(SoundType.STONE))); } BLOCKS.register(LibBlockNames.Pot(LibBlockNames.MAGE_BLOOM), () -> createPottedBlock(() -> MAGE_BLOOM_CROP.get())); BLOCKS.register(LibBlockNames.Pot(LibBlockNames.BLAZING_SAPLING), () -> createPottedBlock(() -> BLAZING_SAPLING.get())); @@ -374,15 +374,15 @@ public static MagicLeaves createLeavesBlock(MapColor color) { public static void onBlockItemsRegistry() { for (String s : LibBlockNames.DECORATIVE_SOURCESTONE) { - ITEMS.register(s, () -> getDefaultBlockItem(BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s)))); + ITEMS.register(s, () -> getDefaultBlockItem(BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s)))); } for (String s : LibBlockNames.DECORATIVE_STAIRS) { - ITEMS.register(s, () -> getDefaultBlockItem(BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s)))); + ITEMS.register(s, () -> getDefaultBlockItem(BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s)))); } for (String s : LibBlockNames.DECORATIVE_SLABS) { - ITEMS.register(s, () -> getDefaultBlockItem(BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s)))); + ITEMS.register(s, () -> getDefaultBlockItem(BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s)))); } } @@ -400,7 +400,7 @@ private static boolean isntSolid(BlockState state, BlockGetter reader, BlockPos public static Block getBlock(String s) { - return BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, s)); + return BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s)); } public static BlockRegistryWrapper registerBlock(String name, Supplier blockSupp) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java index db198e7373..c171f5a0da 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java @@ -15,13 +15,8 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; -import net.neoforged.neoforge.common.capabilities.Capability; -import net.neoforged.neoforge.common.capabilities.CapabilityManager; -import net.neoforged.neoforge.common.capabilities.CapabilityToken; -import net.neoforged.neoforge.common.capabilities.RegisterCapabilitiesEvent; -import net.neoforged.neoforge.common.util.LazyOptional; -import net.neoforged.neoforge.event.AttachCapabilitiesEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; public class CapabilityRegistry { diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DamageTypesRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DamageTypesRegistry.java index 541d24905f..790d40b8ca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DamageTypesRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DamageTypesRegistry.java @@ -9,11 +9,11 @@ public class DamageTypesRegistry { - public static final ResourceKey GENERIC_SPELL_DAMAGE = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(ArsNouveau.MODID, "spell")); - public static final ResourceKey WINDSHEAR = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(ArsNouveau.MODID, "windshear")); - public static final ResourceKey COLD_SNAP = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(ArsNouveau.MODID, "frost")); - public static final ResourceKey FLARE = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(ArsNouveau.MODID, "flare")); - public static final ResourceKey CRUSH = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(ArsNouveau.MODID, "crush")); + public static final ResourceKey GENERIC_SPELL_DAMAGE = ResourceKey.create(Registries.DAMAGE_TYPE, ArsNouveau.prefix( "spell")); + public static final ResourceKey WINDSHEAR = ResourceKey.create(Registries.DAMAGE_TYPE, ArsNouveau.prefix( "windshear")); + public static final ResourceKey COLD_SNAP = ResourceKey.create(Registries.DAMAGE_TYPE, ArsNouveau.prefix( "frost")); + public static final ResourceKey FLARE = ResourceKey.create(Registries.DAMAGE_TYPE, ArsNouveau.prefix( "flare")); + public static final ResourceKey CRUSH = ResourceKey.create(Registries.DAMAGE_TYPE, ArsNouveau.prefix( "crush")); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java index 6647ea2b44..10debb7d27 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java @@ -41,7 +41,7 @@ public class SoundRegistry { public static SpellSound FIRE_SPELL_SOUND; static SoundEvent makeSound(String name) { - return SoundEvent.createVariableRangeEvent(new ResourceLocation(ArsNouveau.MODID, name)); + return SoundEvent.createVariableRangeEvent(ArsNouveau.prefix( name)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/WorldgenRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/WorldgenRegistry.java index 7d8625a0b4..64859f6dd3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/WorldgenRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/WorldgenRegistry.java @@ -89,16 +89,16 @@ public static ResourceKey registerPlacedKey(String name) { public static void bootstrapConfiguredFeatures(BootstrapContext> context) { HolderGetter placed = context.lookup(Registries.PLACED_FEATURE); - context.register(CONFIGURED_CASCADING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.CASCADING_LEAVES, LibBlockNames.CASCADING_LOG, false, new ResourceLocation(ArsNouveau.MODID, LibBlockNames.FROSTAYA_POD)))); - context.register(CONFIGURED_BLAZING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.BLAZING_LEAVES, LibBlockNames.BLAZING_LOG, false, new ResourceLocation(ArsNouveau.MODID, LibBlockNames.BOMBEGRANATE_POD)))); - context.register(CONFIGURED_VEXING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.VEXING_LEAVES, LibBlockNames.VEXING_LOG, false, new ResourceLocation(ArsNouveau.MODID, LibBlockNames.BASTION_POD)))); - context.register(CONFIGURED_FLOURISHING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.FLOURISHING_LEAVES, LibBlockNames.FLOURISHING_LOG, false, new ResourceLocation(ArsNouveau.MODID, LibBlockNames.MENDOSTEEN_POD)))); - - context.register(NATURAL_CONFIGURED_CASCADING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.CASCADING_LEAVES, LibBlockNames.CASCADING_LOG, true, new ResourceLocation(ArsNouveau.MODID, LibBlockNames.FROSTAYA_POD)))); - context.register(NATURAL_CONFIGURED_BLAZING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.BLAZING_LEAVES, LibBlockNames.BLAZING_LOG, true, new ResourceLocation(ArsNouveau.MODID, LibBlockNames.BOMBEGRANATE_POD)))); - context.register(NATURAL_CONFIGURED_VEXING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.VEXING_LEAVES, LibBlockNames.VEXING_LOG, true, new ResourceLocation(ArsNouveau.MODID, LibBlockNames.BASTION_POD)))); - context.register(NATURAL_CONFIGURED_FLOURISHING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.FLOURISHING_LEAVES, LibBlockNames.FLOURISHING_LOG, true, new ResourceLocation(ArsNouveau.MODID, LibBlockNames.MENDOSTEEN_POD)))); - context.register(PATCH_BERRY_BUSH, new ConfiguredFeature<>(Feature.RANDOM_PATCH, FeatureUtils.simplePatchConfiguration(Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration(BlockStateProvider.simple(BuiltInRegistries.BLOCK.get(new ResourceLocation(ArsNouveau.MODID, LibBlockNames.SOURCEBERRY_BUSH)).defaultBlockState().setValue(SourceBerryBush.AGE, 3))), List.of(Blocks.GRASS_BLOCK)))); + context.register(CONFIGURED_CASCADING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.CASCADING_LEAVES, LibBlockNames.CASCADING_LOG, false, ArsNouveau.prefix( LibBlockNames.FROSTAYA_POD)))); + context.register(CONFIGURED_BLAZING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.BLAZING_LEAVES, LibBlockNames.BLAZING_LOG, false, ArsNouveau.prefix( LibBlockNames.BOMBEGRANATE_POD)))); + context.register(CONFIGURED_VEXING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.VEXING_LEAVES, LibBlockNames.VEXING_LOG, false, ArsNouveau.prefix( LibBlockNames.BASTION_POD)))); + context.register(CONFIGURED_FLOURISHING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.FLOURISHING_LEAVES, LibBlockNames.FLOURISHING_LOG, false, ArsNouveau.prefix( LibBlockNames.MENDOSTEEN_POD)))); + + context.register(NATURAL_CONFIGURED_CASCADING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.CASCADING_LEAVES, LibBlockNames.CASCADING_LOG, true, ArsNouveau.prefix( LibBlockNames.FROSTAYA_POD)))); + context.register(NATURAL_CONFIGURED_BLAZING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.BLAZING_LEAVES, LibBlockNames.BLAZING_LOG, true, ArsNouveau.prefix( LibBlockNames.BOMBEGRANATE_POD)))); + context.register(NATURAL_CONFIGURED_VEXING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.VEXING_LEAVES, LibBlockNames.VEXING_LOG, true, ArsNouveau.prefix( LibBlockNames.BASTION_POD)))); + context.register(NATURAL_CONFIGURED_FLOURISHING_TREE,new ConfiguredFeature<>(Feature.TREE, buildTree(LibBlockNames.FLOURISHING_LEAVES, LibBlockNames.FLOURISHING_LOG, true, ArsNouveau.prefix( LibBlockNames.MENDOSTEEN_POD)))); + context.register(PATCH_BERRY_BUSH, new ConfiguredFeature<>(Feature.RANDOM_PATCH, FeatureUtils.simplePatchConfiguration(Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration(BlockStateProvider.simple(BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( LibBlockNames.SOURCEBERRY_BUSH)).defaultBlockState().setValue(SourceBerryBush.AGE, 3))), List.of(Blocks.GRASS_BLOCK)))); context.register(MIXED_ARCHWOODS, new ConfiguredFeature<>(Feature.SIMPLE_RANDOM_SELECTOR, new SimpleRandomFeatureConfiguration(HolderSet.direct(placed.getOrThrow(PLACED_NATURAL_CASCADING_TREE), placed.getOrThrow(PLACED_NATURAL_BLAZING_TREE), placed.getOrThrow(PLACED_NATURAL_VEXING_TREE), placed.getOrThrow(PLACED_NATURAL_FLOURISHING_TREE))))); context.register(CONFIGURED_LIGHTS, new ConfiguredFeature<>(WorldgenRegistry.LIGHT_FEATURE.get(), new BlockStateConfiguration(BlockRegistry.LIGHT_BLOCK.get().defaultBlockState()))); } diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml index 16baa57f52..54763fdaad 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -1,15 +1,10 @@ -# This is an example mods.toml file. It contains the data relating to the loading mods. -# There are several mandatory fields (#mandatory), and many more that are optional (#optional). -# The overall format is standard TOML format, v0.5.0. -# Note that there are a couple of TOML lists in this file. -# Find more information on toml format here: https://github.com/toml-lang/toml -# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml modLoader="javafml" #mandatory # A version range to match for said mod loader - for regular FML @Mod it will be the forge version loaderVersion="[40,)" #mandatory (28 is current forge version) # A URL to refer people to when problems occur with this mod issueTrackerURL="https://github.com/baileyholl/Ars-Nouveau" #optional license="GNU GENERAL PUBLIC LICENSE" + # A list of mods - how many allowed here is determined by the individual mod loader [[mods]] #mandatory # The modid of the mod From 2680350d7fa8e8cdf73b38ef33f8ce2886bb431a Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Fri, 21 Jun 2024 20:09:13 -0500 Subject: [PATCH 004/363] fix ATs --- build.gradle | 8 +- .../EnchantingApparatusRecipe.java | 2 +- .../EnchantmentRecipe.java | 2 +- .../arsnouveau/api/potion/PotionData.java | 2 +- .../api/scrying/SingleBlockScryer.java | 2 +- .../arsnouveau/api/scrying/TagScryer.java | 2 +- .../client/container/TerminalSyncManager.java | 2 +- .../client/registry/ClientHandler.java | 2 +- .../client/registry/ModParticles.java | 2 +- .../common/block/tile/PotionJarTile.java | 2 +- .../common/block/tile/SingleItemTile.java | 4 +- .../common/compat/PatchouliHandler.java | 2 +- .../common/crafting/recipes/CrushRecipe.java | 2 +- .../crafting/recipes/ImbuementRecipe.java | 2 +- .../common/datagen/BlockStatesDatagen.java | 2 +- .../common/datagen/WorldgenProvider.java | 2 +- .../arsnouveau/common/entity/Starbuncle.java | 2 +- .../arsnouveau/common/event/EventHandler.java | 2 +- .../common/light/DynamLightUtil.java | 2 +- .../arsnouveau/common/light/LightManager.java | 2 +- .../common/network/PotionSyncPacket.java | 2 +- .../common/potions/BounceEffect.java | 7 +- .../common/tomes/CasterTomeData.java | 2 +- .../AbstractSupplierBlockStateProvider.java | 2 +- .../common/world/tree/MagicTrunkPlacer.java | 2 +- .../arsnouveau/setup/ModSetup.java | 2 +- .../resources/META-INF/accesstransformer.cfg | 111 +++++++++--------- 27 files changed, 87 insertions(+), 89 deletions(-) diff --git a/build.gradle b/build.gradle index d44eb5017c..06dac86975 100644 --- a/build.gradle +++ b/build.gradle @@ -22,10 +22,6 @@ base { java.toolchain.languageVersion = JavaLanguageVersion.of(21) java.withSourcesJar() -minecraft.accessTransformers.files( - file('src/main/resources/META-INF/accesstransformer.cfg') -) - subsystems { parchment { minecraftVersion = "1.20.6" @@ -57,6 +53,10 @@ configurations { runtimeClasspath.extendsFrom localRuntime } +minecraft.accessTransformers.files( + file('src/main/resources/META-INF/accesstransformer.cfg') +) + repositories { mavenLocal() maven { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantingApparatusRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantingApparatusRecipe.java index a06e94bbc8..2fc19389da 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantingApparatusRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantingApparatusRecipe.java @@ -19,7 +19,7 @@ import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.ShapedRecipe; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.registries.ForgeRegistries; + import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java index 488f8822da..6cd31d5a15 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java @@ -20,7 +20,7 @@ import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.neoforged.neoforge.registries.ForgeRegistries; + import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionData.java b/src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionData.java index 6b411b7e9a..0a62849c22 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionData.java @@ -13,7 +13,7 @@ import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.PotionUtils; import net.minecraft.world.item.alchemy.Potions; -import net.neoforged.neoforge.registries.ForgeRegistries; + import java.util.*; import java.util.stream.Collectors; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java index 379e56f149..afb3c3fa8b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java @@ -8,7 +8,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.registries.ForgeRegistries; + public class SingleBlockScryer implements IScryer { public static SingleBlockScryer INSTANCE = new SingleBlockScryer(null); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java index 4a0af2ef98..ccc2ecbb0e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java @@ -9,7 +9,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.registries.ForgeRegistries; + public class TagScryer implements IScryer { public static final TagScryer INSTANCE = new TagScryer(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java index d568331087..61fcef31c9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java @@ -18,7 +18,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.registries.ForgeRegistries; + import java.util.*; import java.util.function.Consumer; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index 592f0b7363..5941579859 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -51,7 +51,7 @@ import net.neoforged.neoforge.client.event.RegisterGuiOverlaysEvent; import net.neoforged.neoforge.client.gui.overlay.NamedGuiOverlay; import net.neoforged.neoforge.client.gui.overlay.VanillaGuiOverlay; -import net.neoforged.neoforge.registries.ForgeRegistries; + import org.jetbrains.annotations.Nullable; import static com.hollingsworth.arsnouveau.client.events.ClientEvents.localize; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java index d0a42e1f6b..b660f8c8aa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java @@ -8,7 +8,7 @@ import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.client.event.RegisterParticleProvidersEvent; import net.neoforged.neoforge.registries.DeferredRegister; -import net.neoforged.neoforge.registries.ForgeRegistries; + import net.neoforged.neoforge.registries.RegistryObject; import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java index dbc5eae0d0..5a22c0adb7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java @@ -14,7 +14,7 @@ import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.registries.ForgeRegistries; + import org.jetbrains.annotations.NotNull; import java.util.ArrayList; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java index f37881e928..5ca2764076 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java @@ -10,9 +10,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.common.capabilities.Capabilities; -import net.neoforged.neoforge.common.capabilities.Capability; -import net.neoforged.neoforge.common.util.LazyOptional; + import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java index 252de06698..51c2886eb1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java @@ -5,7 +5,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; -import net.neoforged.neoforge.registries.ForgeRegistries; + import vazkii.patchouli.api.PatchouliAPI; import vazkii.patchouli.client.book.gui.GuiBookEntry; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java index b67093beba..5a319c05fe 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java @@ -17,7 +17,7 @@ import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.registries.ForgeRegistries; + import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java index 2a51e16b93..20b7aafb20 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java @@ -25,7 +25,7 @@ import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.registries.ForgeRegistries; + import net.neoforged.neoforge.registries.NeoForgeRegistries; import net.neoforged.neoforge.registries.RegistryObject; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java index 9ab057aded..b898e05ea2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java @@ -15,7 +15,7 @@ import net.neoforged.neoforge.client.model.generators.ConfiguredModel; import net.neoforged.neoforge.client.model.generators.ModelFile; import net.neoforged.neoforge.common.data.ExistingFileHelper; -import net.neoforged.neoforge.registries.ForgeRegistries; + public class BlockStatesDatagen extends BlockStateProvider { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java index 28a261b356..27a7d778d7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java @@ -22,7 +22,7 @@ import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; import net.neoforged.neoforge.common.world.BiomeModifier; import net.neoforged.neoforge.common.world.BiomeModifiers; -import net.neoforged.neoforge.registries.ForgeRegistries; + import org.jetbrains.annotations.NotNull; import java.util.Set; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 2a703702f7..016563f236 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -73,7 +73,7 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.common.Tags; -import net.neoforged.neoforge.registries.ForgeRegistries; + import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index a0e0934d38..aa0e7c7549 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -91,7 +91,7 @@ import net.neoforged.neoforge.event.level.SaplingGrowTreeEvent; import net.neoforged.neoforge.event.village.VillagerTradesEvent; import net.neoforged.neoforge.items.ItemHandlerHelper; -import net.neoforged.neoforge.registries.ForgeRegistries; + import java.util.*; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/light/DynamLightUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/light/DynamLightUtil.java index 274c2952fa..7edc54290f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/light/DynamLightUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/light/DynamLightUtil.java @@ -7,7 +7,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; -import net.neoforged.neoforge.registries.ForgeRegistries; + public class DynamLightUtil { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java b/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java index 55a52eb567..2817033740 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java @@ -14,7 +14,7 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.LightLayer; -import net.neoforged.neoforge.registries.ForgeRegistries; + import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PotionSyncPacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PotionSyncPacket.java index 53f071b42c..4371540eab 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PotionSyncPacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PotionSyncPacket.java @@ -9,7 +9,7 @@ import net.minecraft.world.entity.LivingEntity; import net.neoforged.neoforge.network.NetworkDirection; import net.neoforged.neoforge.network.NetworkEvent; -import net.neoforged.neoforge.registries.ForgeRegistries; + import java.util.function.Supplier; public class PotionSyncPacket { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/BounceEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/BounceEffect.java index f0f894c979..dfe6ee8773 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/BounceEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/BounceEffect.java @@ -11,6 +11,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.event.entity.living.LivingFallEvent; import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; @@ -25,7 +26,7 @@ public BounceEffect() { @SubscribeEvent public static void onFall(LivingFallEvent event) { LivingEntity entity = event.getEntity(); - if (entity == null || !entity.hasEffect(ModPotions.BOUNCE_EFFECT.get())) { + if (entity == null || !entity.hasEffect(ModPotions.BOUNCE_EFFECT)) { return; } boolean isPlayer = entity instanceof Player; @@ -40,7 +41,7 @@ public static void onFall(LivingFallEvent event) { event.setDamageMultiplier(0); entity.fallDistance = 0.0F; if (!isPlayer || isClient) { - double f = 0.95d - .1 * entity.getEffect(ModPotions.BOUNCE_EFFECT.get()).getAmplifier(); + double f = 0.95d - .1 * entity.getEffect(ModPotions.BOUNCE_EFFECT).getAmplifier(); // only slow down half as much when bouncing entity.setDeltaMovement(entity.getDeltaMovement().x / f, entity.getDeltaMovement().y * (-0.9), entity.getDeltaMovement().z / f); entity.hurtMarked = true; @@ -59,7 +60,7 @@ public static void onFall(LivingFallEvent event) { @SubscribeEvent public static void onFlyWallDamage(LivingHurtEvent event) { LivingEntity entity = event.getEntity(); - if (entity == null || !entity.hasEffect(ModPotions.BOUNCE_EFFECT.get())) { + if (entity == null || !entity.hasEffect(ModPotions.BOUNCE_EFFECT)) { return; } boolean isPlayer = entity instanceof Player; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/tomes/CasterTomeData.java b/src/main/java/com/hollingsworth/arsnouveau/common/tomes/CasterTomeData.java index c9ff29bd5c..a1300af7e9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/tomes/CasterTomeData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/tomes/CasterTomeData.java @@ -30,7 +30,7 @@ import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.registries.ForgeRegistries; + import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/AbstractSupplierBlockStateProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/AbstractSupplierBlockStateProvider.java index b8574cf4f2..ee05d2bbf8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/AbstractSupplierBlockStateProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/AbstractSupplierBlockStateProvider.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProviderType; -import net.neoforged.neoforge.registries.ForgeRegistries; + import java.util.function.Function; public abstract class AbstractSupplierBlockStateProvider extends BlockStateProvider { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTrunkPlacer.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTrunkPlacer.java index 464987b325..2f3c65a470 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTrunkPlacer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTrunkPlacer.java @@ -22,7 +22,7 @@ import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer; import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacer; import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType; -import net.neoforged.neoforge.registries.ForgeRegistries; + import java.util.List; import java.util.function.BiConsumer; diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java index 1581f3e348..87cc8a58cd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java @@ -12,7 +12,7 @@ import net.neoforged.fml.InterModComms; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import net.neoforged.neoforge.registries.ForgeRegistries; + import net.neoforged.neoforge.registries.IForgeRegistry; import net.neoforged.neoforge.registries.RegisterEvent; import net.neoforged.neoforge.registries.RegistryObject; diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index fae1439433..75affa5641 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1,80 +1,79 @@ public-f net.minecraft.world.entity.ai.goal.GoalSelector f_25345_ -public net.minecraft.world.entity.Entity f_19825_ # positionVec +public net.minecraft.world.entity.Entity position public net.minecraft.client.gui.components.EditBox * -public net.minecraft.world.entity.projectile.AbstractArrow f_36699_ # knockbackStrength +public net.minecraft.world.entity.projectile.AbstractArrow knockbackStrength # knockbackStrength public net.minecraft.world.item.alchemy.PotionBrewing m_43513_(Lnet/minecraft/world/item/alchemy/Potion;Lnet/minecraft/world/item/Item;Lnet/minecraft/world/item/alchemy/Potion;)V # addMix public net.minecraft.world.level.Explosion * -public-f net.minecraft.world.entity.raid.Raid f_37686_ # numGroups +public-f net.minecraft.world.entity.raid.Raid numGroups # numGroups public net.minecraft.world.entity.monster.ZombieVillager m_34383_(Ljava/util/UUID;I)V # startConverting public net.minecraft.client.gui.components.ChatComponent m_93787_(Lnet/minecraft/network/chat/Component;I)V # addMessage -public net.minecraft.world.entity.Mob f_21364_ #xpReward -public net.minecraft.world.effect.MobEffectInstance f_19503_ #duration -public net.minecraft.world.food.FoodData f_38697_ #saturationLevel -public net.minecraft.world.entity.Mob f_21342_ # moveControl -public net.minecraft.world.entity.player.Player f_36093_ # inventory -public net.minecraft.world.entity.player.Player f_36077_ # abilities -protected net.minecraft.world.item.ArmorItem f_40380_ # ARMOR_MODIFIER_UUID_PER_SLOTpublic net.minecraft.world.entity.Entity f_19825_ # positionVec -public net.minecraft.world.entity.Entity f_19858_ # xRot -public net.minecraft.world.entity.Entity f_19857_ # yRot -public net.minecraft.world.entity.item.ItemEntity f_31985_ # age -public net.minecraft.world.item.context.UseOnContext f_43705_ # hitResult -public net.minecraft.world.level.block.AbstractCandleBlock m_151918_(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Z)V # setLit -public-f net.minecraft.world.entity.Entity m_142467_(Lnet/minecraft/world/entity/Entity$RemovalReason;)V # setRemoved -public net.minecraft.server.level.ServerPlayer f_8926_ # camera +public net.minecraft.world.entity.Mob xpReward #xpReward +public net.minecraft.world.effect.MobEffectInstance duration #duration +public net.minecraft.world.food.FoodData saturationLevel #saturationLevel +public net.minecraft.world.entity.Mob moveControl # moveControl +public net.minecraft.world.entity.player.Player inventory # inventory +public net.minecraft.world.entity.player.Player abilities # abilities +protected net.minecraft.world.item.ArmorItem f_40380_ # ARMOR_MODIFIER_UUID_PER_SLOT +public net.minecraft.world.entity.Entity xRot # xRot +public net.minecraft.world.entity.Entity yRot # yRot +public net.minecraft.world.entity.item.ItemEntity age # age +public net.minecraft.world.item.context.UseOnContext hitResult # hitResult +public net.minecraft.world.level.block.AbstractCandleBlock setLit(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Z)V # setLit +public-f net.minecraft.world.entity.Entity setRemoved(Lnet/minecraft/world/entity/Entity$RemovalReason;)V # setRemoved +public net.minecraft.server.level.ServerPlayer camera # camera public net.minecraft.client.multiplayer.ClientChunkCache$Storage -public net.minecraft.client.player.LocalPlayer f_108598_ # yRotLast -public net.minecraft.client.player.LocalPlayer f_108599_ # xRotLast +public net.minecraft.client.player.LocalPlayer yRotLast # yRotLast +public net.minecraft.client.player.LocalPlayer xRotLast # xRotLast public net.minecraft.server.level.ChunkMap$TrackedEntity public-f net.minecraft.client.multiplayer.ClientChunkCache$Storage -public net.minecraft.client.multiplayer.ClientChunkCache$Storage f_104469_ # viewCenterX -public net.minecraft.client.multiplayer.ClientChunkCache$Storage f_104470_ # viewCenterZ +public net.minecraft.client.multiplayer.ClientChunkCache$Storage viewCenterX # viewCenterX +public net.minecraft.client.multiplayer.ClientChunkCache$Storage viewCenterZ # viewCenterZ public net.minecraft.client.multiplayer.ClientChunkCache$Storage *() # wildcard for all methods public net.minecraft.world.entity.item.FallingBlockEntity (Lnet/minecraft/world/level/Level;DDDLnet/minecraft/world/level/block/state/BlockState;)V # FallingBlockEntity public net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType (Lcom/mojang/serialization/Codec;)V # TrunkPlacerType -public net.minecraft.world.entity.Entity f_19816_ # eyeHeight -public net.minecraft.world.entity.npc.Villager m_35528_()V # increaseMerchantCareer -public net.minecraft.world.entity.npc.Villager f_35374_ # increaseProfessionLevelOnUpdate -public net.minecraft.world.entity.npc.Villager f_35373_ # updateMerchantTimer -public net.minecraft.world.entity.animal.Sheep f_29802_ # eatAnimationTick -public net.minecraft.client.multiplayer.ClientPacketListener f_104897_ # serverChunkRadius -public net.minecraft.world.level.biome.BiomeManager f_47863_ # biomeZoomSeed -public net.minecraft.world.entity.animal.MushroomCow f_28909_ # effect -public net.minecraft.world.entity.animal.MushroomCow f_28910_ # effectDuration -public net.minecraft.world.item.CrossbowItem f_40847_ # startSoundPlayed -public net.minecraft.world.item.CrossbowItem f_40848_ # midLoadSoundPlayed -public net.minecraft.world.item.CrossbowItem m_40853_(ILnet/minecraft/world/item/ItemStack;)F # getPowerForTime -public net.minecraft.world.item.CrossbowItem m_220023_(Lnet/minecraft/util/RandomSource;)[F # getShotPitches -public net.minecraft.world.item.CrossbowItem m_220025_(ZLnet/minecraft/util/RandomSource;)F # getRandomShotPitch +public net.minecraft.world.entity.Entity eyeHeight # eyeHeight +public net.minecraft.world.entity.npc.Villager increaseMerchantCareer()V # increaseMerchantCareer +public net.minecraft.world.entity.npc.Villager increaseProfessionLevelOnUpdate # increaseProfessionLevelOnUpdate +public net.minecraft.world.entity.npc.Villager updateMerchantTimer # updateMerchantTimer +public net.minecraft.world.entity.animal.Sheep eatAnimationTick # eatAnimationTick +public net.minecraft.client.multiplayer.ClientPacketListener serverChunkRadius # serverChunkRadius +public net.minecraft.world.level.biome.BiomeManager biomeZoomSeed # biomeZoomSeed + +public net.minecraft.world.item.CrossbowItem startSoundPlayed # startSoundPlayed +public net.minecraft.world.item.CrossbowItem midLoadSoundPlayed # midLoadSoundPlayed +public net.minecraft.world.item.CrossbowItem getPowerForTime(ILnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/LivingEntity;)F # getPowerForTime +public net.minecraft.world.item.CrossbowItem getShotPitch(Lnet/minecraft/util/RandomSource;I)F # getShotPitch +public net.minecraft.world.item.CrossbowItem getRandomShotPitch(ZLnet/minecraft/util/RandomSource;)F # getRandomShotPitch public net.minecraft.world.entity.npc.VillagerTrades$EmeraldForItems public net.minecraft.world.entity.npc.VillagerTrades$ItemsForEmeralds -public net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate f_74482_ # palettes -public net.minecraft.client.renderer.LevelRenderer m_109703_(Lnet/minecraft/client/renderer/LightTexture;FDDD)V # renderSnowAndRain +public net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate palettes # palettes +public net.minecraft.client.renderer.LevelRenderer renderSnowAndRain(Lnet/minecraft/client/renderer/LightTexture;FDDD)V # renderSnowAndRain public-f net.minecraft.client.gui.screens.recipebook.RecipeBookComponent f_100285_ public net.minecraft.client.gui.screens.recipebook.RecipeBookComponent f_100281_ public net.minecraft.client.gui.screens.recipebook.RecipeBookComponent f_100269_ -public net.minecraft.world.level.block.state.BlockBehaviour f_60439_ # properties -public net.minecraft.world.level.block.state.BlockBehaviour$Properties f_60884_ # hasCollision +public net.minecraft.world.level.block.state.BlockBehaviour properties # properties +public net.minecraft.world.level.block.state.BlockBehaviour$Properties hasCollision # hasCollision public-f net.minecraft.recipebook.ServerPlaceRecipe f_135426_ -public net.minecraft.world.entity.animal.allay.Allay f_238541_ # spinningAnimationTicks -public net.minecraft.world.entity.animal.allay.Allay f_238552_ # spinningAnimationTicks0 -public net.minecraft.world.entity.animal.allay.Allay f_218304_ # holdingItemAnimationTicks -public net.minecraft.world.entity.animal.allay.Allay f_218305_ # holdingItemAnimationTicks0 -public net.minecraft.world.entity.animal.allay.Allay f_238687_ # dancingAnimationTicks -public net.minecraft.world.entity.Entity f_19853_ # level -public net.minecraft.client.gui.components.AbstractWidget f_93620_ # x -public net.minecraft.client.gui.components.AbstractWidget f_93621_ # y +public net.minecraft.world.entity.animal.allay.Allay spinningAnimationTicks # spinningAnimationTicks +public net.minecraft.world.entity.animal.allay.Allay spinningAnimationTicks0 # spinningAnimationTicks0 +public net.minecraft.world.entity.animal.allay.Allay holdingItemAnimationTicks # holdingItemAnimationTicks +public net.minecraft.world.entity.animal.allay.Allay holdingItemAnimationTicks0 # holdingItemAnimationTicks0 +public net.minecraft.world.entity.animal.allay.Allay dancingAnimationTicks # dancingAnimationTicks +public net.minecraft.world.entity.Entity level # level +public net.minecraft.client.gui.components.AbstractWidget x # x +public net.minecraft.client.gui.components.AbstractWidget y # y public net.minecraft.world.item.ArmorItem f_265987_ # ARMOR_MODIFIER_UUID_PER_TYPE -public net.minecraft.world.entity.Entity f_19793_ # maxUpStep +public net.minecraft.world.entity.Entity maxUpStep # maxUpStep public net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProviderType # Geckolib ATs, do not delete public net.minecraft.client.model.geom.ModelPart$Cube -public net.minecraft.client.model.geom.ModelPart f_104212_ # cubes -public net.minecraft.world.entity.Entity m_7939_()Lnet/minecraft/world/phys/Vec3; # getLeashOffset -public net.minecraft.client.model.AgeableListModel f_102007_ # scaleHead -public net.minecraft.client.model.AgeableListModel f_170338_ # babyYHeadOffset -public net.minecraft.client.model.AgeableListModel f_170339_ # babyZHeadOffset -public net.minecraft.client.model.AgeableListModel f_102010_ # babyHeadScale -public net.minecraft.client.model.AgeableListModel f_102011_ # babyBodyScale -public net.minecraft.client.model.AgeableListModel f_102012_ # bodyYOffset \ No newline at end of file +public net.minecraft.client.model.geom.ModelPart cubes # cubes +public net.minecraft.world.entity.Entity getLeashOffset()Lnet/minecraft/world/phys/Vec3; # getLeashOffset +public net.minecraft.client.model.AgeableListModel scaleHead # scaleHead +public net.minecraft.client.model.AgeableListModel babyYHeadOffset # babyYHeadOffset +public net.minecraft.client.model.AgeableListModel babyZHeadOffset # babyZHeadOffset +public net.minecraft.client.model.AgeableListModel babyHeadScale # babyHeadScale +public net.minecraft.client.model.AgeableListModel babyBodyScale # babyBodyScale +public net.minecraft.client.model.AgeableListModel bodyYOffset # bodyYOffset \ No newline at end of file From 163512d7db9e0348c26d5fcc215864e7f87c0385 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Fri, 21 Jun 2024 20:31:24 -0500 Subject: [PATCH 005/363] capabilities --- .../common/capability/ANPlayerDataCap.java | 10 +- .../arsnouveau/common/capability/ManaCap.java | 12 +-- .../setup/registry/CapabilityRegistry.java | 96 ++++++++++--------- 3 files changed, 63 insertions(+), 55 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerDataCap.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerDataCap.java index 03fbfa507c..ac1deb37b7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerDataCap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerDataCap.java @@ -3,8 +3,10 @@ import com.hollingsworth.arsnouveau.api.familiar.AbstractFamiliarHolder; import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.UnknownNullability; import javax.annotation.Nullable; import java.util.Collection; @@ -85,7 +87,7 @@ public boolean removeFamiliar(AbstractFamiliarHolder holderID) { } @Override - public CompoundTag serializeNBT() { + public @UnknownNullability CompoundTag serializeNBT(HolderLookup.Provider provider) { CompoundTag tag = new CompoundTag(); CompoundTag glyphsTag = new CompoundTag(); @@ -110,13 +112,13 @@ public CompoundTag serializeNBT() { } @Override - public void deserializeNBT(CompoundTag nbt) { + public void deserializeNBT(HolderLookup.Provider provider, CompoundTag nbt) { glyphs = new HashSet<>(); familiars = new HashSet<>(); CompoundTag glyphsTag = nbt.getCompound("glyphs"); for (int i = 0; i < glyphsTag.getInt("size"); i++) { - ResourceLocation id = new ResourceLocation(glyphsTag.getString("glyph" + i)); + ResourceLocation id = ResourceLocation.parse(glyphsTag.getString("glyph" + i)); AbstractSpellPart part = GlyphRegistry.getSpellPart(id); if (part != null) glyphs.add(part); @@ -127,7 +129,7 @@ public void deserializeNBT(CompoundTag nbt) { familiars.add(new FamiliarData(familiarsTag.getCompound("familiar" + i))); } if(nbt.contains("lastSummonedFamiliar")){ - lastSummonedFamiliar = new ResourceLocation(nbt.getString("lastSummonedFamiliar")); + lastSummonedFamiliar = ResourceLocation.parse(nbt.getString("lastSummonedFamiliar")); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCap.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCap.java index 38bd97ba06..6c5ce81181 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCap.java @@ -1,15 +1,15 @@ package com.hollingsworth.arsnouveau.common.capability; import com.hollingsworth.arsnouveau.api.mana.IManaCap; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.LivingEntity; +import org.jetbrains.annotations.UnknownNullability; import javax.annotation.Nullable; public class ManaCap implements IManaCap { - private final LivingEntity livingEntity; - private double mana; private int maxMana; @@ -19,9 +19,7 @@ public class ManaCap implements IManaCap { private int bookTier; - public ManaCap(@Nullable final LivingEntity entity) { - this.livingEntity = entity; - } + public ManaCap() {} @Override public double getCurrentMana() { @@ -85,7 +83,7 @@ public void setBookTier(int bookTier) { } @Override - public CompoundTag serializeNBT() { + public @UnknownNullability CompoundTag serializeNBT(HolderLookup.Provider provider) { CompoundTag tag = new CompoundTag(); tag.putDouble("current", getCurrentMana()); tag.putInt("max", getMaxMana()); @@ -95,7 +93,7 @@ public CompoundTag serializeNBT() { } @Override - public void deserializeNBT(CompoundTag tag) { + public void deserializeNBT(HolderLookup.Provider provider, CompoundTag tag) { setMaxMana(tag.getInt("max")); setMana(tag.getDouble("current")); setBookTier(tag.getInt("book_tier")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java index c171f5a0da..5315105eb8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java @@ -2,33 +2,26 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.mana.IManaCap; -import com.hollingsworth.arsnouveau.common.capability.ANPlayerCapAttacher; -import com.hollingsworth.arsnouveau.common.capability.ANPlayerDataCap; -import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; -import com.hollingsworth.arsnouveau.common.capability.ManaCapAttacher; +import com.hollingsworth.arsnouveau.common.capability.*; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketSyncPlayerCap; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.capabilities.EntityCapability; import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; public class CapabilityRegistry { - public static final Capability MANA_CAPABILITY = CapabilityManager.get(new CapabilityToken<>() { - }); - public static final Capability PLAYER_DATA_CAP = CapabilityManager.get(new CapabilityToken<>() { - }); - - - public static final Direction DEFAULT_FACING = null; - + public static final EntityCapability MANA_CAPABILITY = EntityCapability.createVoid(ArsNouveau.prefix("mana"), IManaCap.class); + public static final EntityCapability PLAYER_DATA_CAP = EntityCapability.createVoid(ArsNouveau.prefix("player_data"), IPlayerCap.class); /** * Get the {@link IManaCap} from the specified entity. @@ -39,7 +32,7 @@ public class CapabilityRegistry { public static LazyOptional getMana(final LivingEntity entity) { if (entity == null) return LazyOptional.empty(); - return entity.getCapability(MANA_CAPABILITY); + return LazyOptional.of(entity.getCapability(MANA_CAPABILITY)); } /** @@ -51,7 +44,30 @@ public static LazyOptional getMana(final LivingEntity entity) { public static LazyOptional getPlayerDataCap(final LivingEntity entity) { if (entity == null) return LazyOptional.empty(); - return entity.getCapability(PLAYER_DATA_CAP); + return LazyOptional.of(entity.getCapability(PLAYER_DATA_CAP)); + } + + /** + * todo: DELETE + * @deprecated + */ + public static class LazyOptional { + private T val; + private LazyOptional(T value) { + this.val = value; + } + + public static LazyOptional of(T value) { + return new LazyOptional<>(value); + } + + public T orElse(T value) { + return val == null ? value : val; + } + + public static LazyOptional empty() { + return null; + } } /** @@ -61,23 +77,10 @@ public static LazyOptional getPlayerDataCap(final LivingEntity entit @EventBusSubscriber(modid = ArsNouveau.MODID) public static class EventHandler { - /** - * Attach the {@link IManaCap} capability to all living entities. - * - * @param event The event - */ - @SubscribeEvent - public static void attachCapabilities(final AttachCapabilitiesEvent event) { - if (event.getObject() instanceof Player) { - ManaCapAttacher.attach(event); - ANPlayerCapAttacher.attach(event); - } - } - @SubscribeEvent public static void registerCapabilities(final RegisterCapabilitiesEvent event) { - event.register(IManaCap.class); - event.register(IPlayerCap.class); + event.registerEntity(MANA_CAPABILITY, EntityType.PLAYER, (player, ctx) -> new ManaCap()); + event.registerEntity(PLAYER_DATA_CAP, EntityType.PLAYER, (player, ctx) -> new ANPlayerDataCap()); } /** @@ -88,21 +91,26 @@ public static void registerCapabilities(final RegisterCapabilitiesEvent event) { @SubscribeEvent public static void playerClone(PlayerEvent.Clone event) { Player oldPlayer = event.getOriginal(); - oldPlayer.revive(); - getMana(oldPlayer).ifPresent(oldMaxMana -> getMana(event.getEntity()).ifPresent(newMaxMana -> { - newMaxMana.setMaxMana(oldMaxMana.getMaxMana()); - newMaxMana.setMana(oldMaxMana.getCurrentMana()); - newMaxMana.setBookTier(oldMaxMana.getBookTier()); - newMaxMana.setGlyphBonus(oldMaxMana.getGlyphBonus()); - })); - - getPlayerDataCap(oldPlayer).ifPresent(oldPlayerCap -> { - IPlayerCap playerDataCap = getPlayerDataCap(event.getEntity()).orElse(new ANPlayerDataCap()); - CompoundTag tag = oldPlayerCap.serializeNBT(); - playerDataCap.deserializeNBT(tag); +// oldPlayer.revive(); + var oldMana = getMana(oldPlayer).orElse(null); + var newMana = getMana(event.getEntity()).orElse(null); + if (oldMana != null && newMana != null) { + newMana.setMaxMana(oldMana.getMaxMana()); + newMana.setMana(oldMana.getCurrentMana()); + newMana.setBookTier(oldMana.getBookTier()); + newMana.setGlyphBonus(oldMana.getGlyphBonus()); + } + + var oldPlayerCap = getPlayerDataCap(oldPlayer).orElse(null); + var newPlayerCap = getPlayerDataCap(event.getEntity()).orElse(new ANPlayerDataCap()); + if (oldPlayerCap != null) { + CompoundTag tag = oldPlayerCap.serializeNBT(event.getOriginal().level.registryAccess()); + newPlayerCap.deserializeNBT(event.getOriginal().level.registryAccess(), tag); syncPlayerCap(event.getEntity()); - }); - event.getOriginal().invalidateCaps(); + } + + +// event.getOriginal().invalidateCaps(); } @@ -137,7 +145,7 @@ public static void onPlayerDimChangedEvent(PlayerEvent.PlayerChangedDimensionEve public static void syncPlayerCap(Player player) { IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(player).orElse(new ANPlayerDataCap()); - CompoundTag tag = cap.serializeNBT(); + CompoundTag tag = cap.serializeNBT(player.level.registryAccess()); if(player instanceof ServerPlayer serverPlayer){ Networking.sendToPlayerClient(new PacketSyncPlayerCap(tag), serverPlayer); } From aa5f3741403deb7a5b541dd72c35274c2576d962 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Fri, 21 Jun 2024 21:42:56 -0500 Subject: [PATCH 006/363] 3300 errors to go --- .../api/item/inv/InventoryManager.java | 2 +- .../arsnouveau/api/perk/PerkInstance.java | 4 +- .../client/container/StorageTerminalMenu.java | 2 +- .../renderer/entity/AnimBlockRenderer.java | 2 +- .../renderer/item/ScryCasterRenderer.java | 2 +- .../renderer/item/SpellBookRenderer.java | 2 +- .../renderer/item/SpellBowRenderer.java | 2 +- .../renderer/item/SpellCrossbowRenderer.java | 2 +- .../client/renderer/item/SwordRenderer.java | 2 +- .../client/renderer/item/WandRenderer.java | 2 +- .../renderer/tile/RedstoneRelayRenderer.java | 2 +- .../arsnouveau/common/block/WardBlock.java | 64 ------------------- .../block/tile/EnchantingApparatusTile.java | 2 +- .../common/block/tile/ImbuementTile.java | 16 ----- .../common/block/tile/ItemDetectorTile.java | 8 +-- .../common/block/tile/ScribesTile.java | 22 +------ .../common/block/tile/SingleItemTile.java | 24 ------- .../common/camera/CameraController.java | 6 +- .../common/camera/CameraEvents.java | 1 + .../common/camera/ClientCameraEvents.java | 4 +- .../capability/ANPlayerCapAttacher.java | 50 --------------- .../common/capability/FamiliarData.java | 2 +- .../common/entity/ColoredProjectile.java | 11 ++-- .../common/entity/EntityOrbitProjectile.java | 16 ++--- .../common/entity/EntityProjectileSpell.java | 7 +- .../carbuncle/StarbyTransportBehavior.java | 2 +- .../common/spell/effect/EffectSmelt.java | 18 +++--- .../spell/effect/EffectSummonUndead.java | 4 +- .../setup/registry/CapabilityRegistry.java | 14 +++- .../setup/registry/WorldgenRegistry.java | 6 +- 30 files changed, 64 insertions(+), 237 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/block/WardBlock.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerCapAttacher.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/InventoryManager.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/InventoryManager.java index 4efb5697ad..aa9f75d770 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/InventoryManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/InventoryManager.java @@ -180,7 +180,7 @@ public MultiExtractedReference extractAllFromHandler(FilterableItemHandler filte IItemHandler itemHandler = filterableItemHandler.getHandler(); for (int i = 0; i < itemHandler.getSlots(); i++) { ItemStack stack = itemHandler.extractItem(i, remaining, true); - if (!ItemStack.isSameItem(stack, desiredStack) || !ItemStack.isSameItemSameTags(stack, desiredStack)) { + if (!ItemStack.isSameItem(stack, desiredStack) || !ItemStack.isSameItemSameComponents(stack, desiredStack)) { continue; } int toExtract = Math.min(stack.getCount(), remaining); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkInstance.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkInstance.java index 459bf451a1..f335546b0d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkInstance.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkInstance.java @@ -13,9 +13,9 @@ public class PerkInstance { private IPerk perk; public PerkInstance(CompoundTag tag){ - ResourceLocation perkId = new ResourceLocation(tag.getString("perkId")); + ResourceLocation perkId = ResourceLocation.tryParse(tag.getString("perkId")); perk = PerkRegistry.getPerkMap().getOrDefault(perkId, StarbunclePerk.INSTANCE); - slot = PerkSlot.PERK_SLOTS.getOrDefault(new ResourceLocation(tag.getString("slotId")), PerkSlot.ONE); + slot = PerkSlot.PERK_SLOTS.getOrDefault(ResourceLocation.tryParse(tag.getString("slotId")), PerkSlot.ONE); } public PerkInstance(PerkSlot slot, IPerk perk){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java index 1cba7539ff..1a59b33859 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java @@ -299,7 +299,7 @@ public void onInteract(StoredItemStack clicked, SlotAction act, boolean pullOne) } } else { if (!stack.isEmpty()) { - if (ItemStack.isSameItemSameTags(stack, clicked.getStack()) && stack.getCount() + 1 <= stack.getMaxStackSize()) { + if (ItemStack.isSameItemSameComponents(stack, clicked.getStack()) && stack.getCount() + 1 <= stack.getMaxStackSize()) { StoredItemStack pulled = te.pullStack(clicked, 1, selectedTab); if (pulled != null) { stack.grow(1); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java index 2442e78cae..54ae3371ed 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java @@ -22,7 +22,7 @@ import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.animatable.model.CoreGeoBone; import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.object.Color; +import software.bernie.geckolib.util.Color; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.renderer.GeoEntityRenderer; import software.bernie.geckolib.util.RenderUtil; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java index 7c34d1f0af..3fb6217536 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java @@ -10,7 +10,7 @@ import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.object.Color; +import software.bernie.geckolib.util.Color; import software.bernie.geckolib.model.GeoModel; public class ScryCasterRenderer extends FixedGeoItemRenderer{ diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java index 0897ce32e6..c4b1c66fe9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java @@ -14,7 +14,7 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemDisplayContext; import software.bernie.geckolib.cache.object.BakedGeoModel; -import software.bernie.geckolib.object.Color; +import software.bernie.geckolib.util.Color; import software.bernie.geckolib.model.GeoModel; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java index 46789e61d3..dfb676ce42 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java @@ -20,7 +20,7 @@ import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.animatable.model.CoreGeoBone; -import software.bernie.geckolib.object.Color; +import software.bernie.geckolib.util.Color; public class SpellBowRenderer extends FixedGeoItemRenderer { public SpellBowRenderer() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java index 926e193e66..e4cee65e61 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java @@ -20,7 +20,7 @@ import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.animatable.model.CoreGeoBone; -import software.bernie.geckolib.object.Color; +import software.bernie.geckolib.util.Color; public class SpellCrossbowRenderer extends FixedGeoItemRenderer { public SpellCrossbowRenderer() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java index d066d56732..65e0404331 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java @@ -9,7 +9,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.object.Color; +import software.bernie.geckolib.util.Color; import software.bernie.geckolib.model.GeoModel; public class SwordRenderer extends FixedGeoItemRenderer { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java index e0324eb481..8216f94c01 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java @@ -8,7 +8,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.object.Color; +import software.bernie.geckolib.util.Color; public class WandRenderer extends FixedGeoItemRenderer { public WandRenderer() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RedstoneRelayRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RedstoneRelayRenderer.java index 1096121a13..af2d0ea4d7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RedstoneRelayRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RedstoneRelayRenderer.java @@ -11,7 +11,7 @@ import net.minecraft.world.level.block.RedStoneWireBlock; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.object.Color; +import software.bernie.geckolib.util.Color; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/WardBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/WardBlock.java deleted file mode 100644 index 2471c028a6..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/WardBlock.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.hollingsworth.arsnouveau.common.block; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Mob; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.HorizontalDirectionalBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.DirectionProperty; -import net.minecraft.world.level.pathfinder.BlockPathTypes; -import net.minecraft.world.phys.Vec3; - -import javax.annotation.Nullable; - -public class WardBlock extends ModBlock { - - public WardBlock() { - super(defaultProperties().lightLevel((bs) -> 7)); - // this.setDefaultState(this.stateContainer.getBaseState().with(FACING, Direction.NORTH)); - } - - public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; - - @Override - public void entityInside(BlockState state, Level worldIn, BlockPos pos, Entity entityIn) { - super.entityInside(state, worldIn, pos, entityIn); - } - - @Nullable - @Override - public BlockPathTypes getBlockPathType(BlockState state, BlockGetter world, BlockPos pos, @Nullable Mob entity) { - return BlockPathTypes.LAVA; - } - - @Override - public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity entity, ItemStack stack) { - if (entity != null) { - world.setBlock(pos, state.setValue(BlockStateProperties.FACING, getFacingFromEntity(pos, entity)), 2); - } - } - - @Override - public boolean collisionExtendsVertically(BlockState state, BlockGetter world, BlockPos pos, Entity collidingEntity) { - return collidingEntity instanceof Mob; - } - - - public static Direction getFacingFromEntity(BlockPos clickedBlock, LivingEntity entity) { - Vec3 vec = entity.position(); - return Direction.getNearest((float) (vec.x - clickedBlock.getX()), (float) (vec.y - clickedBlock.getY()), (float) (vec.z - clickedBlock.getZ())); - } - - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(BlockStateProperties.FACING); - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java index ad24670c39..4df780b729 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java @@ -44,7 +44,7 @@ public class EnchantingApparatusTile extends SingleItemTile implements Container public static final int craftingLength = 210; public EnchantingApparatusTile(BlockPos pos, BlockState state) { - super(BlockRegistry.ENCHANTING_APP_TILE, pos, state); + super(BlockRegistry.ENCHANTING_APP_TILE.get(), pos, state); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java index 4ce4d4302a..e801752278 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java @@ -47,7 +47,6 @@ public class ImbuementTile extends AbstractSourceMachine implements Container, ITickable, GeoBlockEntity, ITooltipProvider, IPedestalMachine { - private final LazyOptional itemHandler = LazyOptional.of(() -> new InvWrapper(this)); public ItemStack stack = ItemStack.EMPTY; public ItemEntity entity; public boolean draining; @@ -254,21 +253,6 @@ public void clearContent() { updateBlock(); } - @NotNull - @Override - public LazyOptional getCapability(@NotNull Capability cap, final @Nullable Direction side) { - if (cap == Capabilities.ITEM_HANDLER) { - return itemHandler.cast(); - } - return super.getCapability(cap, side); - } - - @Override - public void invalidateCaps() { - itemHandler.invalidate(); - super.invalidateCaps(); - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar data) { data.add(new AnimationController<>(this, "controller", 1, this::idlePredicate)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java index 053baf5acd..3dba8efbaf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java @@ -19,7 +19,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.wrapper.CombinedInvWrapper; import org.jetbrains.annotations.Nullable; @@ -52,7 +52,7 @@ public void tick() { if(tile == null){ return; } - IItemHandler handler = tile.getCapability(Capabilities.ITEM_HANDLER).orElse(null); + IItemHandler handler = level.getCapability(Capabilities.ItemHandler.BLOCK, connectedPos, null); if(handler == null){ return; } @@ -83,7 +83,7 @@ public int getCountForStack(ItemStack stack){ return stack.getCount(); } } - if (!ItemStack.isSameItemSameTags(stack, filterStack)) { + if (!ItemStack.isSameItemSameComponents(stack, filterStack)) { return 0; } return (filterStack.isEmpty() && stack.isEmpty()) ? 1 : stack.getCount(); @@ -118,7 +118,7 @@ public void setFilterStack(ItemStack stack){ @Override public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable LivingEntity storedEntity, Player playerEntity) { if(storedPos != null){ - if(level.getBlockEntity(storedPos) == null || !level.getBlockEntity(storedPos).getCapability(Capabilities.ITEM_HANDLER).isPresent()){ + if(level.getBlockEntity(storedPos) == null || level.getCapability(Capabilities.ItemHandler.BLOCK, connectedPos, null) == null){ return; } if(BlockUtil.distanceFrom(storedPos, worldPosition) > 30){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java index 24234deab8..863302e2b8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java @@ -31,11 +31,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.common.capabilities.Capability; -import net.neoforged.neoforge.common.util.LazyOptional; import net.neoforged.neoforge.items.IItemHandler; -import net.neoforged.neoforge.items.wrapper.InvWrapper; -import org.jetbrains.annotations.NotNull; + import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.GeoAnimatable; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -50,10 +47,8 @@ import java.util.ArrayList; import java.util.List; -import static net.neoforged.neoforge.common.capabilities.Capabilities.ITEM_HANDLER; public class ScribesTile extends ModdedTile implements GeoBlockEntity, ITickable, Container, ITooltipProvider, IAnimationListener, IWandable { - private final LazyOptional itemHandler = LazyOptional.of(() -> new InvWrapper(this)); private ItemStack stack = ItemStack.EMPTY; boolean synced; public List consumedStacks = new ArrayList<>(); @@ -383,21 +378,6 @@ public void clearContent() { updateBlock(); } - @NotNull - @Override - public LazyOptional getCapability(@NotNull Capability cap, final @Nullable Direction side) { - if (cap == ITEM_HANDLER) { - return itemHandler.cast(); - } - return super.getCapability(cap, side); - } - - @Override - public void invalidateCaps() { - itemHandler.invalidate(); - super.invalidateCaps(); - } - @Override public void getTooltip(List tooltip) { if (!isMasterTile()) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java index 5ca2764076..8c3c668ade 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java @@ -11,14 +11,8 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.items.IItemHandler; -import net.neoforged.neoforge.items.wrapper.InvWrapper; -import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nullable; public class SingleItemTile extends ModdedTile implements Container{ - private final LazyOptional itemHandler = LazyOptional.of(() -> new InvWrapper(this)); protected ItemStack stack = ItemStack.EMPTY; public ItemEntity renderEntity; @@ -26,9 +20,6 @@ public SingleItemTile(BlockEntityType tileEntityTypeIn, BlockPos pos, BlockSt super(tileEntityTypeIn, pos, state); } - public SingleItemTile(RegistryWrapper> tileEntityTypeIn, BlockPos pos, BlockState state) { - this(tileEntityTypeIn.get(), pos, state); - } @Override public int getContainerSize() { @@ -97,21 +88,6 @@ public void setStack(ItemStack otherStack){ updateBlock(); } - @NotNull - @Override - public LazyOptional getCapability(@NotNull Capability cap, final @Nullable Direction side) { - if (cap == Capabilities.ITEM_HANDLER) { - return itemHandler.cast(); - } - return super.getCapability(cap, side); - } - - @Override - public void invalidateCaps() { - itemHandler.invalidate(); - super.invalidateCaps(); - } - @Override public void load(CompoundTag compound) { super.load(compound); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java index f8d64855f9..847667a289 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java @@ -16,8 +16,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; -import net.neoforged.neoforge.event.TickEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.ClientTickEvent; @EventBusSubscriber(modid = ArsNouveau.MODID, value = Dist.CLIENT) public class CameraController { @@ -30,7 +30,7 @@ public class CameraController { private static boolean wasRightPressed; @SubscribeEvent - public static void onClientTick(TickEvent.ClientTickEvent event) { + public static void onClientTick(ClientTickEvent event) { Entity cameraEntity = Minecraft.getInstance().cameraEntity; if (cameraEntity instanceof ScryerCamera cam) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraEvents.java index 373174c804..e95513fc84 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraEvents.java @@ -8,6 +8,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/camera/ClientCameraEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/camera/ClientCameraEvents.java index a692893dad..76e83de720 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/camera/ClientCameraEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/camera/ClientCameraEvents.java @@ -5,11 +5,11 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.client.event.InputEvent; -import net.neoforged.neoforge.client.event.RenderGuiOverlayEvent; import net.neoforged.neoforge.client.event.RenderHandEvent; -import net.neoforged.neoforge.client.gui.overlay.VanillaGuiOverlay; + @EventBusSubscriber(modid = ArsNouveau.MODID, value = Dist.CLIENT) public class ClientCameraEvents { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerCapAttacher.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerCapAttacher.java deleted file mode 100644 index 9e22ca00a1..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerCapAttacher.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.hollingsworth.arsnouveau.common.capability; - -import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.Entity; -import net.neoforged.neoforge.common.capabilities.Capability; -import net.neoforged.neoforge.common.capabilities.ICapabilityProvider; -import net.neoforged.neoforge.common.util.INBTSerializable; -import net.neoforged.neoforge.common.util.LazyOptional; -import net.neoforged.neoforge.event.AttachCapabilitiesEvent; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class ANPlayerCapAttacher { - private static class ANPlayerCapProvider implements ICapabilityProvider, INBTSerializable { - - public static final ResourceLocation IDENTIFIER = ArsNouveau.prefix( "player_data"); - - private final IPlayerCap backend = new ANPlayerDataCap(); - private final LazyOptional optionalData = LazyOptional.of(() -> backend); - - @NotNull - @Override - public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { - return CapabilityRegistry.PLAYER_DATA_CAP.orEmpty(cap, this.optionalData); - } - - void invalidate() { - this.optionalData.invalidate(); - } - - @Override - public CompoundTag serializeNBT() { - return this.backend.serializeNBT(); - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - this.backend.deserializeNBT(nbt); - } - } - - public static void attach(final AttachCapabilitiesEvent event) { - final ANPlayerCapProvider provider = new ANPlayerCapProvider(); - event.addCapability(ANPlayerCapProvider.IDENTIFIER, provider); - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/FamiliarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/FamiliarData.java index 1dab5bfcf0..a8907895bb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/capability/FamiliarData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/capability/FamiliarData.java @@ -23,7 +23,7 @@ public FamiliarData(ResourceLocation entityID) { public FamiliarData(CompoundTag tag) { this.entityTag = tag.contains(ENTITY_TAG) ? tag.getCompound(ENTITY_TAG) : new CompoundTag(); - this.familiarHolder = FamiliarRegistry.getFamiliarHolderMap().getOrDefault(new ResourceLocation(tag.getString(FAMILIAR_ID)), + this.familiarHolder = FamiliarRegistry.getFamiliarHolderMap().getOrDefault(ResourceLocation.tryParse(tag.getString(FAMILIAR_ID)), FamiliarRegistry.getFamiliarHolderMap().get(ArsNouveau.prefix( LibEntityNames.FAMILIAR_WIXIE))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/ColoredProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/ColoredProjectile.java index dc5d7a3731..218571974b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/ColoredProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/ColoredProjectile.java @@ -79,14 +79,13 @@ public void addAdditionalSaveData(CompoundTag compound) { } @Override - protected void defineSynchedData() { - this.entityData.define(RED, 255); - this.entityData.define(GREEN, 25); - this.entityData.define(BLUE, 180); - this.entityData.define(PARTICLE_TAG, new ParticleColor(255, 25, 180).serialize()); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + pBuilder.define(RED, 255); + pBuilder.define(GREEN, 25); + pBuilder.define(BLUE, 180); + pBuilder.define(PARTICLE_TAG, new ParticleColor(255, 25, 180).serialize()); } - @Nullable protected EntityHitResult findHitEntity(Vec3 pStartVec, Vec3 pEndVec) { return ProjectileUtil.getEntityHitResult(this.level, this, pStartVec, pEndVec, this.getBoundingBox().expandTowards(this.getDeltaMovement()).inflate(1.0D), this::canHitEntity); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityOrbitProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityOrbitProjectile.java index 19196912aa..672a4663ed 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityOrbitProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityOrbitProjectile.java @@ -20,8 +20,6 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.network.NetworkHooks; -import net.neoforged.neoforge.network.PlayMessages; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -186,13 +184,13 @@ protected void onHit(@NotNull HitResult result) { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(OFFSET, 0); - this.entityData.define(ACCELERATES, 0); - this.entityData.define(AOE, 0f); - this.entityData.define(TOTAL, 0); - this.entityData.define(LAST_POS, Vec3.ZERO); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(OFFSET, 0); + pBuilder.define(ACCELERATES, 0); + pBuilder.define(AOE, 0f); + pBuilder.define(TOTAL, 0); + pBuilder.define(LAST_POS, Vec3.ZERO); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java index 8c37b06eda..b2715b08eb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java @@ -38,8 +38,6 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.entity.IEntityAdditionalSpawnData; -import net.neoforged.neoforge.network.NetworkHooks; import javax.annotation.Nullable; import java.util.HashSet; import java.util.Set; @@ -130,9 +128,8 @@ public HitResult getHitResult() { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(OWNER_ID, -1); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + pBuilder.define(OWNER_ID, -1); } /** diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java index 054971e47d..e51cf765c1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java @@ -101,7 +101,7 @@ public void pickUpItem(ItemEntity itemEntity) { if (itemEntity.getItem().getCount() >= itemEntity.getItem().getMaxStackSize()) break; int maxTake = starbuncleWithRoom.getHeldStack().getMaxStackSize() - starbuncleWithRoom.getHeldStack().getCount(); - if (ItemStack.isSameItemSameTags(i.getItem(), starbuncleWithRoom.getHeldStack())) { + if (ItemStack.isSameItemSameComponents(i.getItem(), starbuncleWithRoom.getHeldStack())) { int toTake = Math.min(i.getItem().getCount(), maxTake); i.getItem().shrink(toTake); starbuncleWithRoom.getHeldStack().grow(toTake); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java index 5ddc27c48c..25f61f1c01 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java @@ -13,9 +13,7 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.AbstractCookingRecipe; -import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.world.item.crafting.SmeltingRecipe; +import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; @@ -66,9 +64,9 @@ public void smeltBlock(Level world, BlockPos pos, LivingEntity shooter, BlockHit if (!canBlockBeHarvested(spellStats, world, pos)) return; BlockState state = world.getBlockState(pos); if (!BlockUtil.destroyRespectsClaim(getPlayer(shooter, (ServerLevel) world), world, pos)) return; - Optional optional = world.getRecipeManager().getRecipeFor(RecipeType.SMELTING, new SimpleContainer(new ItemStack(state.getBlock().asItem(), 1)), world); + Optional> optional = world.getRecipeManager().getRecipeFor(RecipeType.SMELTING, new SingleRecipeInput(new ItemStack(state.getBlock().asItem(), 1)), world); if (optional.isPresent()) { - ItemStack itemstack = optional.get().getResultItem(world.registryAccess()); + ItemStack itemstack = optional.get().value().getResultItem(world.registryAccess()); if (!itemstack.isEmpty()) { if (itemstack.getItem() instanceof BlockItem) { world.setBlockAndUpdate(pos, ((BlockItem) itemstack.getItem()).getBlock().defaultBlockState()); @@ -87,18 +85,18 @@ public void smeltItems(Level world, List itemEntities, int maxItemSm int numSmelted = 0; for (ItemEntity itemEntity : itemEntities) { if (numSmelted > maxItemSmelt) break; - Optional optional; + Optional optional; if (spellStats.hasBuff(AugmentDampen.INSTANCE)) { - optional = world.getRecipeManager().getRecipeFor(SMOKING, new SimpleContainer(itemEntity.getItem()), world); + optional = world.getRecipeManager().getRecipeFor(SMOKING, new SingleRecipeInput(itemEntity.getItem()), world); } else if (spellStats.hasBuff(AugmentAmplify.INSTANCE)) { - optional = world.getRecipeManager().getRecipeFor(RecipeType.BLASTING, new SimpleContainer(itemEntity.getItem()), world); + optional = world.getRecipeManager().getRecipeFor(RecipeType.BLASTING, new SingleRecipeInput(itemEntity.getItem()), world); } else { - optional = world.getRecipeManager().getRecipeFor(RecipeType.SMELTING, new SimpleContainer(itemEntity.getItem()), world); + optional = world.getRecipeManager().getRecipeFor(RecipeType.SMELTING, new SingleRecipeInput(itemEntity.getItem()), world); } if (optional.isPresent()) { - ItemStack result = optional.get().getResultItem(world.registryAccess()).copy(); + ItemStack result = ((RecipeHolder)(optional.get())).value().getResultItem(world.registryAccess()).copy(); if (result.isEmpty()) continue; while (numSmelted < maxItemSmelt && !itemEntity.getItem().isEmpty()) { itemEntity.getItem().shrink(1); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java index e68f7debc0..551271894d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java @@ -46,7 +46,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt if ((spellStats.hasBuff(AugmentPierce.INSTANCE))) { weapon = Items.BOW.getDefaultInstance(); if (spellStats.getAmpMultiplier() > 0) - weapon.enchant(Enchantments.POWER_ARROWS, Math.max(4, (int) spellStats.getAmpMultiplier()) - 1); + weapon.enchant(Enchantments.POWER, Math.max(4, (int) spellStats.getAmpMultiplier()) - 1); } else { if (spellStats.getAmpMultiplier() >= 3) { weapon = Items.NETHERITE_AXE.getDefaultInstance(); @@ -63,7 +63,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt undeadentity.setLimitedLife(ticks); summonLivingEntity(rayTraceResult, world, shooter, spellStats, spellContext, resolver, undeadentity); } - shooter.addEffect(new MobEffectInstance(ModPotions.SUMMONING_SICKNESS_EFFECT.get(), ticks)); + shooter.addEffect(new MobEffectInstance(ModPotions.SUMMONING_SICKNESS_EFFECT, ticks)); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java index 5315105eb8..0867879730 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java @@ -7,6 +7,7 @@ import com.hollingsworth.arsnouveau.common.network.PacketSyncPlayerCap; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; @@ -14,9 +15,15 @@ import net.minecraft.world.entity.player.Player; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.capabilities.BlockCapability; +import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.capabilities.EntityCapability; import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.wrapper.InvWrapper; + +import java.util.List; public class CapabilityRegistry { @@ -70,9 +77,6 @@ public static LazyOptional empty() { } } - /** - * Event handler for the {@link IManaCap} capability. - */ @SuppressWarnings("unused") @EventBusSubscriber(modid = ArsNouveau.MODID) public static class EventHandler { @@ -81,6 +85,10 @@ public static class EventHandler { public static void registerCapabilities(final RegisterCapabilitiesEvent event) { event.registerEntity(MANA_CAPABILITY, EntityType.PLAYER, (player, ctx) -> new ManaCap()); event.registerEntity(PLAYER_DATA_CAP, EntityType.PLAYER, (player, ctx) -> new ANPlayerDataCap()); + var containers = List.of(BlockRegistry.ENCHANTING_APP_TILE, BlockRegistry.IMBUEMENT_TILE, BlockRegistry.SCRIBES_TABLE_TILE); + for(var container : containers){ + event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, container.get(), (c, side) -> new InvWrapper(c)); + } } /** diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/WorldgenRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/WorldgenRegistry.java index 64859f6dd3..a887976c22 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/WorldgenRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/WorldgenRegistry.java @@ -76,15 +76,15 @@ public class WorldgenRegistry { public static final ResourceKey PLACED_LIGHTS = registerPlacedKey("placed_lights"); public static ResourceKey> registerFeatureKey(String name) { - return ResourceKey.create(Registries.FEATURE, new ResourceLocation(MODID, name)); + return ResourceKey.create(Registries.FEATURE, ArsNouveau.prefix(name)); } public static ResourceKey> registerConfKey(String name) { - return ResourceKey.create(Registries.CONFIGURED_FEATURE, new ResourceLocation(MODID, name)); + return ResourceKey.create(Registries.CONFIGURED_FEATURE, ArsNouveau.prefix(name)); } public static ResourceKey registerPlacedKey(String name) { - return ResourceKey.create(Registries.PLACED_FEATURE, new ResourceLocation(MODID, name)); + return ResourceKey.create(Registries.PLACED_FEATURE, ArsNouveau.prefix(name)); } public static void bootstrapConfiguredFeatures(BootstrapContext> context) { From c2bec4265759107932edd94dd6953912574856c5 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 22 Jun 2024 10:16:24 -0500 Subject: [PATCH 007/363] BE data --- build.gradle | 9 +++-- gradle.properties | 2 +- .../arsnouveau/api/event/DispelEvent.java | 6 ++-- .../api/event/EffectResolveEvent.java | 11 ++---- .../api/event/FamiliarSummonEvent.java | 8 ++--- .../arsnouveau/api/event/SpellCastEvent.java | 5 ++- .../api/event/SpellDamageEvent.java | 18 ++-------- .../api/event/SpellProjectileHitEvent.java | 7 ++-- .../api/event/SpellResolveEvent.java | 11 ++---- .../api/item/inv/CombinedHandlerInv.java | 1 - .../api/ritual/DispenserRitualBehavior.java | 8 ++--- .../api/source/AbstractSourceMachine.java | 14 +++----- .../arsnouveau/api/util/BlockUtil.java | 2 +- .../arsnouveau/api/util/SourceUtil.java | 3 +- .../common/block/AlterationTable.java | 24 +++++++------ .../common/block/ArcanePedestal.java | 14 ++++---- .../common/block/BasicSpellTurret.java | 35 ++++++++++--------- .../arsnouveau/common/block/BrazierRelay.java | 2 +- .../common/block/CraftingLecternBlock.java | 17 ++++----- .../arsnouveau/common/block/DrygmyStone.java | 2 +- .../block/EnchantingApparatusBlock.java | 16 +++++---- .../common/block/ImbuementBlock.java | 15 ++++---- .../common/block/IntangibleAirBlock.java | 4 ++- .../arsnouveau/common/block/ItemDetector.java | 12 +++---- .../common/block/MageBloomCrop.java | 7 ++-- .../common/block/MagelightTorch.java | 8 +++-- .../arsnouveau/common/block/MobJar.java | 16 ++++----- .../arsnouveau/common/block/PortalBlock.java | 10 +++--- .../arsnouveau/common/block/PotionJar.java | 20 +++++------ .../arsnouveau/common/block/PotionMelder.java | 2 +- .../common/block/RedstoneRelay.java | 2 +- .../arsnouveau/common/block/Relay.java | 2 +- .../common/block/RitualBrazierBlock.java | 2 +- .../arsnouveau/common/block/ScribesBlock.java | 2 +- .../common/block/ScryersOculus.java | 2 +- .../arsnouveau/common/block/SourceJar.java | 2 +- .../block/tile/AgronomicSourcelinkTile.java | 8 ++--- .../block/tile/AlchemicalSourcelinkTile.java | 4 +-- .../common/block/tile/AlterationTile.java | 9 ++--- .../common/block/tile/ArcanePedestalTile.java | 9 ++--- .../block/tile/BasicSpellTurretTile.java | 18 ++++------ .../common/block/tile/BrazierRelayTile.java | 9 ++--- .../block/tile/CraftingLecternTile.java | 9 ++--- .../block/tile/CreativeSourceJarTile.java | 2 +- .../common/block/tile/DrygmyTile.java | 11 +++--- .../block/tile/EnchantedTurretTile.java | 2 +- .../block/tile/EnchantingApparatusTile.java | 9 ++--- .../common/block/tile/GhostWeaveTile.java | 11 +++--- .../common/block/tile/ImbuementTile.java | 10 +++--- .../common/block/tile/IntangibleAirTile.java | 14 ++++---- .../common/block/tile/ItemDetectorTile.java | 9 ++--- .../common/block/tile/LightTile.java | 11 +++--- .../common/block/tile/MageBlockTile.java | 5 +-- .../common/block/tile/MagelightTorchTile.java | 11 +++--- .../common/block/tile/MirrorWeaveTile.java | 9 ++--- .../common/block/tile/MobJarTile.java | 9 ++--- .../common/block/tile/ModdedTile.java | 5 --- .../block/tile/MycelialSourcelinkTile.java | 2 +- .../common/block/tile/PortalTile.java | 8 +++-- .../common/block/tile/PotionDiffuserTile.java | 9 ++--- .../common/block/tile/PotionJarTile.java | 17 ++++----- .../common/block/tile/PotionMelderTile.java | 8 +++-- .../common/block/tile/RedstoneRelayTile.java | 4 +-- .../common/block/tile/RelayCollectorTile.java | 2 +- .../common/block/tile/RelayDepositTile.java | 2 +- .../common/block/tile/RelaySplitterTile.java | 11 +++--- .../common/block/tile/RelayTile.java | 15 ++++---- .../common/block/tile/RepositoryTile.java | 28 ++++++++------- .../common/block/tile/RitualBrazierTile.java | 10 +++--- .../common/block/tile/RotatingTurretTile.java | 9 ++--- .../common/block/tile/RuneTile.java | 4 ++- .../common/block/tile/SconceTile.java | 13 +++---- .../common/block/tile/ScribesTile.java | 12 ++++--- .../common/block/tile/SingleItemTile.java | 9 ++--- .../common/block/tile/SkyBlockTile.java | 9 ++--- .../common/block/tile/SourceJarTile.java | 6 +--- .../common/block/tile/SourcelinkTile.java | 13 +++---- .../common/block/tile/SpellSensorTile.java | 9 ++--- .../common/block/tile/StorageLecternTile.java | 8 +++-- .../common/block/tile/SummoningTile.java | 13 +++---- .../common/block/tile/TempLightTile.java | 9 ++--- .../common/block/tile/TemporaryTile.java | 9 ++--- .../block/tile/TimerSpellTurretTile.java | 12 ++++--- .../block/tile/VitalicSourcelinkTile.java | 4 +-- .../block/tile/VolcanicSourcelinkTile.java | 8 ++--- .../common/block/tile/WhirlisprigTile.java | 12 ++++--- .../common/block/tile/WixieCauldronTile.java | 9 ++--- .../datagen/ApparatusRecipeProvider.java | 2 +- .../common/entity/AmethystGolem.java | 14 ++++---- .../common/entity/AnimBlockSummon.java | 20 +++++------ .../common/entity/AnimHeadSummon.java | 8 +---- .../common/entity/EnchantedFallingBlock.java | 23 ++++-------- .../common/entity/EnchantedSkull.java | 7 +--- .../common/entity/EntityAllyVex.java | 25 +++++++------ .../common/entity/EntityBookwyrm.java | 11 +++--- .../entity/EntityChimeraProjectile.java | 10 +----- .../common/entity/EntityDrygmy.java | 18 +++++----- .../arsnouveau/common/entity/EntityDummy.java | 8 ++--- .../common/entity/EntityFlyingItem.java | 30 +++++----------- .../common/entity/EntityProjectileSpell.java | 9 ++--- .../common/potions/GravityEffect.java | 11 +++--- .../common/spell/effect/EffectCut.java | 4 +-- .../resources/META-INF/accesstransformer.cfg | 2 +- 103 files changed, 477 insertions(+), 514 deletions(-) diff --git a/build.gradle b/build.gradle index 06dac86975..5a845a3fd4 100644 --- a/build.gradle +++ b/build.gradle @@ -74,6 +74,10 @@ repositories { name = "Jared's maven" url = "https://maven.blamejared.com/" } + maven { + name = 'Forge' + url = "https://maven.minecraftforge.net" + } } jarJar.enable() @@ -94,8 +98,9 @@ dependencies { // compileOnly "top.theillusivec4.curios:curios-neoforge:${curios_version}+${minecraft_version}:api" // localRuntime "top.theillusivec4.curios:curios-neoforge:${curios_version}+${minecraft_version}" // -// compileOnly "mezz.jei:jei-1.20.4-neoforge-api:${jei_version}" -// localRuntime "mezz.jei:jei-1.20.4-neoforge:${jei_version}" + compileOnly "mezz.jei:jei-1.21-neoforge-api:${jei_version}" + localRuntime "mezz.jei:jei-1.21-neoforge:${jei_version}" + implementation 'com.github.glitchfiend:TerraBlender-neoforge:1.21-4.0.0.0' } tasks.withType(ProcessResources).configureEach { diff --git a/gradle.properties b/gradle.properties index 5cd72fe1b6..d2b20a01a2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! -jei_version=17.3.0.52 +jei_version=19.0.0.9 curios_version=8.0.0-beta geckolib_version=4.5.5 patchouli_version=85-NEOFORGE diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/DispelEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/DispelEvent.java index e6079a905e..e2657f3e16 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/DispelEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/DispelEvent.java @@ -5,8 +5,9 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; -import net.neoforged.bus.api.Cancelable; import net.neoforged.bus.api.Event; +import net.neoforged.bus.api.ICancellableEvent; + import javax.annotation.Nullable; /** @@ -28,8 +29,7 @@ public DispelEvent(HitResult rayTraceResult, Level world, @Nullable LivingEntity this.context = spellContext; } - @Cancelable - public static class Pre extends DispelEvent { + public static class Pre extends DispelEvent implements ICancellableEvent { public Pre(HitResult rayTraceResult, Level world, @Nullable LivingEntity shooter, SpellStats augments, SpellContext spellContext) { super(rayTraceResult, world, shooter, augments, spellContext); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/EffectResolveEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/EffectResolveEvent.java index 1033f6e4df..622f5b0d22 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/EffectResolveEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/EffectResolveEvent.java @@ -5,6 +5,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; import net.neoforged.bus.api.Event; +import net.neoforged.bus.api.ICancellableEvent; import org.jetbrains.annotations.NotNull; public class EffectResolveEvent extends Event { @@ -32,15 +33,11 @@ private EffectResolveEvent(Level world, @NotNull LivingEntity shooter, HitResult * Fired before a glyph is resolved and after SpellStats are calculated. * Use this to modify the spell or stats before resolving. Can be cancelled to stop resolving. */ - public static class Pre extends EffectResolveEvent { + public static class Pre extends EffectResolveEvent implements ICancellableEvent { public Pre(Level world, @NotNull LivingEntity shooter, HitResult result, Spell spell, SpellContext spellContext, AbstractEffect resolveEffect, SpellStats spellStats, SpellResolver spellResolver) { super(world, shooter, result, spell, spellContext, resolveEffect, spellStats, spellResolver); } - @Override - public boolean isCancelable() { - return true; - } } /** @@ -52,9 +49,5 @@ public Post(Level world, @NotNull LivingEntity shooter, HitResult result, Spell super(world, shooter, result, spell, spellContext, resolveEffect, spellStats, spellResolver); } - @Override - public boolean isCancelable() { - return false; - } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/FamiliarSummonEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/FamiliarSummonEvent.java index 7b37b37fac..2ccf6a560f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/FamiliarSummonEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/FamiliarSummonEvent.java @@ -1,18 +1,14 @@ package com.hollingsworth.arsnouveau.api.event; import net.minecraft.world.entity.Entity; +import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.neoforge.event.entity.EntityEvent; -public class FamiliarSummonEvent extends EntityEvent { +public class FamiliarSummonEvent extends EntityEvent implements ICancellableEvent { public Entity owner; public FamiliarSummonEvent(Entity entity, Entity owner) { super(entity); this.owner = owner; } - - @Override - public boolean isCancelable() { - return true; - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellCastEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellCastEvent.java index 8894f35da5..1435a2ddfa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellCastEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellCastEvent.java @@ -3,11 +3,10 @@ import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.api.spell.SpellContext; import net.minecraft.world.level.Level; -import net.neoforged.bus.api.Cancelable; +import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.neoforge.event.entity.living.LivingEvent; -@Cancelable -public class SpellCastEvent extends LivingEvent { +public class SpellCastEvent extends LivingEvent implements ICancellableEvent { public Spell spell; public SpellContext context; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellDamageEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellDamageEvent.java index 52577e5041..5738e3c08c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellDamageEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellDamageEvent.java @@ -5,6 +5,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.neoforged.bus.api.Event; +import net.neoforged.bus.api.ICancellableEvent; import org.jetbrains.annotations.NotNull; public class SpellDamageEvent extends Event { @@ -23,23 +24,15 @@ private SpellDamageEvent(DamageSource source, @NotNull LivingEntity shooter, Ent this.context = context; } - @Override - public boolean isCancelable() { - return true; - } - /** * Apply effects to the target before the spell damage resolves. */ - public static class Pre extends SpellDamageEvent { + public static class Pre extends SpellDamageEvent implements ICancellableEvent { public Pre(DamageSource source, LivingEntity shooter, Entity entity, float totalDamage, SpellContext context) { super(source, shooter, entity, totalDamage, context); } - @Override - public boolean isCancelable() { - return true; - } + } public static class Post extends SpellDamageEvent{ @@ -47,11 +40,6 @@ public static class Post extends SpellDamageEvent{ public Post(DamageSource source, LivingEntity shooter, Entity entity, float totalDamage, SpellContext context) { super(source, shooter, entity, totalDamage, context); } - - @Override - public boolean isCancelable() { - return false; - } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellProjectileHitEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellProjectileHitEvent.java index 9710018d42..1ccd059d21 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellProjectileHitEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellProjectileHitEvent.java @@ -2,13 +2,14 @@ import com.hollingsworth.arsnouveau.common.entity.EntityProjectileSpell; import net.minecraft.world.phys.HitResult; +import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.neoforge.event.entity.EntityEvent; /** * Event fired when a spell projectile hits something. * Provided for addons, not used in the base mod */ -public class SpellProjectileHitEvent extends EntityEvent { +public class SpellProjectileHitEvent extends EntityEvent implements ICancellableEvent { public HitResult hit; public EntityProjectileSpell projectile; @@ -26,8 +27,4 @@ public HitResult getHitResult(){ return hit; } - @Override - public boolean isCancelable() { - return true; - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellResolveEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellResolveEvent.java index 880b2644ef..102b752cdc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellResolveEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/SpellResolveEvent.java @@ -7,6 +7,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; import net.neoforged.bus.api.Event; +import net.neoforged.bus.api.ICancellableEvent; import org.jetbrains.annotations.NotNull; public class SpellResolveEvent extends Event { @@ -29,15 +30,11 @@ private SpellResolveEvent(Level world, @NotNull LivingEntity shooter, HitResult /** * Fired before a spell is resolved. Can be cancelled to stop resolving. */ - public static class Pre extends SpellResolveEvent { + public static class Pre extends SpellResolveEvent implements ICancellableEvent { public Pre(Level world, @NotNull LivingEntity shooter, HitResult result, Spell spell, SpellContext spellContext, SpellResolver resolver) { super(world, shooter, result, spell, spellContext, resolver); } - @Override - public boolean isCancelable() { - return true; - } } /** @@ -49,9 +46,5 @@ public Post(Level world, @NotNull LivingEntity shooter, HitResult result, Spell super(world, shooter, result, spell, spellContext, resolver); } - @Override - public boolean isCancelable() { - return false; - } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/CombinedHandlerInv.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/CombinedHandlerInv.java index 8ab220e9b8..443631aee2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/CombinedHandlerInv.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/CombinedHandlerInv.java @@ -2,7 +2,6 @@ import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.items.IItemHandler; -import net.neoforged.neoforge.items.wrapper.EmptyHandler; import org.jetbrains.annotations.NotNull; public class CombinedHandlerInv implements IItemHandler { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/DispenserRitualBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/DispenserRitualBehavior.java index 984de7fcb2..1fd6a7804d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/DispenserRitualBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/DispenserRitualBehavior.java @@ -3,7 +3,8 @@ import com.hollingsworth.arsnouveau.common.block.tile.RitualBrazierTile; import com.hollingsworth.arsnouveau.common.items.RitualTablet; import net.minecraft.core.BlockPos; -import net.minecraft.core.BlockSource; + +import net.minecraft.core.dispenser.BlockSource; import net.minecraft.core.dispenser.DispenseItemBehavior; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.DispenserBlock; @@ -12,9 +13,9 @@ public class DispenserRitualBehavior implements DispenseItemBehavior { @Override public ItemStack dispense(BlockSource pSource, ItemStack pStack) { - BlockPos blockpos = pSource.getPos().relative(pSource.getBlockState().getValue(DispenserBlock.FACING)); + BlockPos blockpos = pSource.pos().relative(pSource.state().getValue(DispenserBlock.FACING)); - if (pStack.getItem() instanceof RitualTablet tablet && pSource.getLevel().getBlockEntity(blockpos) instanceof RitualBrazierTile brazier){ + if (pStack.getItem() instanceof RitualTablet tablet && pSource.level().getBlockEntity(blockpos) instanceof RitualBrazierTile brazier){ if (brazier.canTakeAnotherRitual()){ brazier.setRitual(tablet.ritual.getRegistryName()); pStack.shrink(1); @@ -23,5 +24,4 @@ public ItemStack dispense(BlockSource pSource, ItemStack pStack) { return pStack; } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java b/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java index ea59459c76..e2f0fd2731 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java @@ -3,8 +3,8 @@ import com.hollingsworth.arsnouveau.api.util.IWololoable; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.block.tile.ModdedTile; -import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -22,21 +22,17 @@ public AbstractSourceMachine(BlockEntityType manaTile, BlockPos pos, BlockSta super(manaTile, pos, state); } - public AbstractSourceMachine(RegistryWrapper< ? extends BlockEntityType> manaTile, BlockPos pos, BlockState state) { - this(manaTile.get(), pos, state); - } - @Override - public void load(CompoundTag tag) { + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.loadAdditional(tag, pRegistries); source = tag.getInt(SOURCE_TAG); maxSource = tag.getInt(MAX_SOURCE_TAG); color = ParticleColor.fromInt(tag.getInt(COLOR_TAG)); - super.load(tag); } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.putInt(SOURCE_TAG, getSource()); tag.putInt(MAX_SOURCE_TAG, getMaxSource()); tag.putInt(COLOR_TAG, getColor().getColor()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java index 0f8ca062d3..6dd5c1574e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java @@ -23,12 +23,12 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.UsernameCache; -import net.neoforged.neoforge.common.capabilities.Capabilities; import net.neoforged.neoforge.common.util.FakePlayer; import net.neoforged.neoforge.common.util.FakePlayerFactory; import net.neoforged.neoforge.event.level.BlockEvent; import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.ItemHandlerHelper; + import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java index 7a3c2d4250..194ff58e57 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java @@ -8,7 +8,8 @@ import com.hollingsworth.arsnouveau.common.entity.EntityFollowProjectile; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; + import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/AlterationTable.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/AlterationTable.java index ea4eecb870..f60c98c1b5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/AlterationTable.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/AlterationTable.java @@ -11,6 +11,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -38,9 +39,9 @@ public AlterationTable() { } @Override - public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { + protected ItemInteractionResult useItemOn(ItemStack pStack, BlockState state, Level world, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { if (world.isClientSide || handIn != InteractionHand.MAIN_HAND || !(world.getBlockEntity(pos) instanceof AlterationTile tile)) - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; ItemStack stack = player.getMainHandItem(); // Attempt to put armor and remove perks if(tile.isMasterTile()){ @@ -48,31 +49,31 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player if (holder instanceof StackPerkHolder) { if(tile.armorStack.isEmpty()){ tile.setArmorStack(stack, player); - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } }else if(stack.isEmpty() && !tile.armorStack.isEmpty()){ tile.removeArmorStack(player); - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } }else if(state.getValue(PART) == ThreePartBlock.OTHER){ - this.use(world.getBlockState(pos.below()), world, pos.below(), player, handIn, hit); + this.useItemOn(pStack, world.getBlockState(pos.below()), world, pos.below(), player, handIn, hit); }else{ tile = tile.getLogicTile(); if(tile == null) - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; if(stack.isEmpty()){ tile.removePerk(player); - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } // Attempt to change perks if(!(stack.getItem() instanceof PerkItem)){ PortUtil.sendMessage(player, Component.translatable("ars_nouveau.perk.not_perk")); - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } tile.addPerkStack(stack, player); } - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } @Nullable @@ -82,11 +83,12 @@ public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { } @Override - public void playerWillDestroy(Level worldIn, BlockPos pos, BlockState state, Player player) { + public BlockState playerWillDestroy(Level worldIn, BlockPos pos, BlockState state, Player player) { super.playerWillDestroy(worldIn, pos, state, player); if (worldIn.getBlockEntity(pos) instanceof AlterationTile tile) { tile.dropItems(); } + return state; } public static VoxelShape SOUTH_OTHER = Shapes.or(Block.box(3.40D, 0D, 1.0D, 7.333333D, 1D, 17.0D), @@ -197,7 +199,7 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { } @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + protected boolean isPathfindable(BlockState pState, PathComputationType pPathComputationType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ArcanePedestal.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ArcanePedestal.java index def06f20b0..7476c86078 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ArcanePedestal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ArcanePedestal.java @@ -5,6 +5,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -40,11 +41,10 @@ public ArcanePedestal() { registerDefaultState(defaultBlockState().setValue(BlockStateProperties.WATERLOGGED, false)); } - @Override - public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { + public ItemInteractionResult useItemOn(ItemStack pStack,BlockState state, Level world, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { if (handIn != InteractionHand.MAIN_HAND) - return InteractionResult.PASS; + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; if (!world.isClientSide && world.getBlockEntity(pos) instanceof ArcanePedestalTile tile) { if (tile.getStack() != null && player.getItemInHand(handIn).isEmpty()) { ItemEntity item = new ItemEntity(world, player.getX(), player.getY(), player.getZ(), tile.getStack()); @@ -59,15 +59,16 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player } world.sendBlockUpdated(pos, state, state, 2); } - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } @Override - public void playerWillDestroy(Level worldIn, BlockPos pos, BlockState state, Player player) { + public BlockState playerWillDestroy(Level worldIn, BlockPos pos, BlockState state, Player player) { super.playerWillDestroy(worldIn, pos, state, player); if (worldIn.getBlockEntity(pos) instanceof ArcanePedestalTile tile && tile.getStack() != null) { worldIn.addFreshEntity(new ItemEntity(worldIn, pos.getX(), pos.getY(), pos.getZ(), tile.getStack())); } + return state; } @Override @@ -155,8 +156,9 @@ public void neighborChanged(BlockState pState, Level pLevel, BlockPos pPos, Bloc ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get() ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + protected boolean isPathfindable(BlockState pState, PathComputationType pPathComputationType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java index a4518a253b..09882ad2ba 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java @@ -13,13 +13,17 @@ import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; import com.hollingsworth.arsnouveau.common.util.PortUtil; -import net.minecraft.core.*; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Position; +import net.minecraft.core.dispenser.BlockSource; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; 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.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -116,7 +120,7 @@ public void shootSpell(ServerLevel world, BlockPos pos) { if (manaCost > 0 && SourceUtil.takeSourceWithParticles(pos, world, 10, manaCost) == null) return; Networking.sendToNearby(world, pos, new PacketOneShotAnimation(pos)); - Position iposition = getDispensePosition(new BlockSourceImpl(world, pos)); + Position iposition = getDispensePosition(world.getBlockState(pos), pos); Direction direction = world.getBlockState(pos).getValue(FACING); FakePlayer fakePlayer = ANFakePlayer.getPlayer(world); fakePlayer.setPos(pos.getX(), pos.getY(), pos.getZ()); @@ -143,12 +147,12 @@ public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block /** * Get the position where the dispenser at the given Coordinates should dispense to. */ - public static Position getDispensePosition(BlockSource coords) { - Direction direction = coords.getBlockState().getValue(FACING); - double d0 = coords.x() + 0.5D * (double) direction.getStepX(); - double d1 = coords.y() + 0.5D * (double) direction.getStepY(); - double d2 = coords.z() + 0.5D * (double) direction.getStepZ(); - return new PositionImpl(d0, d1, d2); + public static Position getDispensePosition(BlockState state, BlockPos pos) { + Direction direction = state.getValue(FACING); + double d0 = pos.getX() + 0.5D * (double) direction.getStepX(); + double d1 = pos.getY() + 0.5D * (double) direction.getStepY(); + double d2 = pos.getZ() + 0.5D * (double) direction.getStepZ(); + return new Vec3(d0, d1, d2); } @Override @@ -177,22 +181,22 @@ public BlockState updateShape(BlockState stateIn, Direction side, BlockState fac } @Override - public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { + protected ItemInteractionResult useItemOn(ItemStack pStack, BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult pHitResult) { if (handIn != InteractionHand.MAIN_HAND) { - return InteractionResult.PASS; + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } if (worldIn.isClientSide) - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; ItemStack stack = player.getItemInHand(handIn); Spell spell = CasterUtil.getCaster(stack).getSpell(); if (!spell.isEmpty()) { if(spell.getCastMethod() == null){ PortUtil.sendMessage(player, Component.translatable("ars_nouveau.alert.turret_needs_form")); - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } if (!(TURRET_BEHAVIOR_MAP.containsKey(spell.getCastMethod()))) { PortUtil.sendMessage(player, Component.translatable("ars_nouveau.alert.turret_type")); - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } if (worldIn.getBlockEntity(pos) instanceof BasicSpellTurretTile tile) { tile.spellCaster.copyFromCaster(CasterUtil.getCaster(stack)); @@ -202,7 +206,7 @@ public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Play worldIn.sendBlockUpdated(pos, state, state, 2); } } - return super.use(state, worldIn, pos, player, handIn, hit); + return super.useItemOn(pStack, state, worldIn, pos, player, handIn, pHitResult); } @Override @@ -231,9 +235,8 @@ public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, //kept is as simple as possible for compat. with other turrets, needed for waterlogged. Does not keep track of turret direction static final VoxelShape shape = Block.box(4.6, 4.6, 4.6, 11.6, 11.6, 11.6); - @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + protected boolean isPathfindable(BlockState pState, PathComputationType pPathComputationType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/BrazierRelay.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/BrazierRelay.java index 3315a134be..ecf94f1f69 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/BrazierRelay.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/BrazierRelay.java @@ -50,7 +50,7 @@ public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, } @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + public boolean isPathfindable(BlockState pState, PathComputationType pType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/CraftingLecternBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/CraftingLecternBlock.java index 17d0d16fe5..ae66e49166 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/CraftingLecternBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/CraftingLecternBlock.java @@ -9,7 +9,9 @@ import net.minecraft.world.Containers; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.BlockPlaceContext; @@ -35,11 +37,6 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { return new CraftingLecternTile(pos, state); } - @Override - public void appendHoverText(ItemStack stack, BlockGetter worldIn, List tooltip, - TooltipFlag flagIn) { - } - @Override public PushReaction getPistonPushReaction(BlockState p_149656_1_) { return PushReaction.BLOCK; @@ -51,16 +48,16 @@ public BlockState getStateForPlacement(BlockPlaceContext pContext) { } @Override - public InteractionResult use(BlockState state, Level world, BlockPos pos, - Player player, InteractionHand hand, BlockHitResult rtr) { + public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level world, BlockPos pos, + Player player, InteractionHand hand, BlockHitResult rtr) { ItemStack heldStack = player.getItemInHand(hand); if(world.isClientSide){ - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } if (heldStack.getItem() instanceof DominionWand || hand != InteractionHand.MAIN_HAND || heldStack.getItem() instanceof BookwyrmCharm) { - return InteractionResult.PASS; + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } BlockEntity blockEntity_1 = world.getBlockEntity(pos); @@ -69,7 +66,7 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, player.displayClientMessage(Component.translatable("ars_nouveau.invalid_lectern"), true); } } - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } @SuppressWarnings("deprecation") diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/DrygmyStone.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/DrygmyStone.java index 6644821a5d..33f9c087f5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/DrygmyStone.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/DrygmyStone.java @@ -117,7 +117,7 @@ public void neighborChanged(BlockState pState, Level pLevel, BlockPos pPos, Bloc } @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + public boolean isPathfindable(BlockState pState, PathComputationType pType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/EnchantingApparatusBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/EnchantingApparatusBlock.java index 748f9ac56c..8c0f186038 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/EnchantingApparatusBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/EnchantingApparatusBlock.java @@ -12,6 +12,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -45,17 +46,17 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { } @Override - public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { + public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level world, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { if (world.isClientSide || handIn != InteractionHand.MAIN_HAND || !(world.getBlockEntity(pos) instanceof EnchantingApparatusTile tile)) - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; if (tile.isCrafting) - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; if (!(world.getBlockState(pos.below()).getBlock() instanceof ArcaneCore)) { PortUtil.sendMessage(player, Component.translatable("alert.core")); - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } if (tile.getStack() == null || tile.getStack().isEmpty()) { IEnchantingRecipe recipe = tile.getRecipe(player.getMainHandItem(), player); @@ -85,7 +86,7 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player } world.sendBlockUpdated(pos, state, state, 2); - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } @Override @@ -94,11 +95,12 @@ public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, } @Override - public void playerWillDestroy(Level worldIn, BlockPos pos, BlockState state, Player player) { + public BlockState playerWillDestroy(Level worldIn, BlockPos pos, BlockState state, Player player) { super.playerWillDestroy(worldIn, pos, state, player); if (worldIn.getBlockEntity(pos) instanceof EnchantingApparatusTile tile && tile.getStack() != null) { worldIn.addFreshEntity(new ItemEntity(worldIn, pos.getX(), pos.getY(), pos.getZ(), tile.getStack())); } + return state; } @Override @@ -107,7 +109,7 @@ public RenderShape getRenderShape(BlockState p_149645_1_) { } @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + public boolean isPathfindable(BlockState pState, PathComputationType pType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ImbuementBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ImbuementBlock.java index 2e90d25902..9f48510643 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ImbuementBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ImbuementBlock.java @@ -12,10 +12,12 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -41,11 +43,11 @@ public RenderShape getRenderShape(BlockState p_149645_1_) { @Override - public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { + public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { if (!(worldIn.getBlockEntity(pos) instanceof ImbuementTile tile)) - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; if (worldIn.isClientSide || handIn != InteractionHand.MAIN_HAND) - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; if (tile.stack.isEmpty() && !player.getItemInHand(handIn).isEmpty()) { @@ -83,16 +85,17 @@ public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Play tile.draining = false; tile.updateBlock(); } - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } @Override - public void playerWillDestroy(Level worldIn, BlockPos pos, BlockState state, Player player) { + public BlockState playerWillDestroy(Level worldIn, BlockPos pos, BlockState state, Player player) { super.playerWillDestroy(worldIn, pos, state, player); if (!(worldIn.getBlockEntity(pos) instanceof ImbuementTile)) - return; + return state; ItemStack stack = ((ImbuementTile) worldIn.getBlockEntity(pos)).stack; worldIn.addFreshEntity(new ItemEntity(worldIn, pos.getX(), pos.getY(), pos.getZ(), stack.copy())); ((ImbuementTile) worldIn.getBlockEntity(pos)).stack = ItemStack.EMPTY; + return state; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/IntangibleAirBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/IntangibleAirBlock.java index 7a258e881a..23e1a51fa0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/IntangibleAirBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/IntangibleAirBlock.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.common.block.tile.IntangibleAirTile; import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; @@ -16,6 +17,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; public class IntangibleAirBlock extends TickableModBlock implements LiquidBlockContainer { @@ -42,7 +44,7 @@ protected boolean isAir(BlockState state) { } @Override - public boolean canPlaceLiquid(BlockGetter worldIn, BlockPos pos, BlockState state, Fluid fluidIn) { + public boolean canPlaceLiquid(@Nullable Player pPlayer, BlockGetter pLevel, BlockPos pPos, BlockState pState, Fluid pFluid) { return false; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ItemDetector.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ItemDetector.java index 74a77ffec8..650e89d458 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ItemDetector.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ItemDetector.java @@ -6,6 +6,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; @@ -40,21 +41,20 @@ public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { } @Override - public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { - ItemStack stack = player.getItemInHand(handIn); + public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { if (handIn == InteractionHand.MAIN_HAND) { if(worldIn.isClientSide){ - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } if ((stack.getItem() instanceof DominionWand) || !(worldIn.getBlockEntity(pos) instanceof ItemDetectorTile itemDetector)) - return super.use(state, worldIn, pos, player, handIn, hit); + return super.useItemOn(stack, state, worldIn, pos, player, handIn, hit); if (stack.isEmpty()) { itemDetector.addCount(player.isShiftKeyDown() ? 8 : 1); }else if(!stack.isEmpty()){ itemDetector.setFilterStack(stack.copy()); } } - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } @Override @@ -77,7 +77,7 @@ public int getSignal(BlockState pBlockState, BlockGetter pBlockAccess, BlockPos } @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + public boolean isPathfindable(BlockState pState, PathComputationType pType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/MageBloomCrop.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/MageBloomCrop.java index b198c6a0cf..ea16875b83 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/MageBloomCrop.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/MageBloomCrop.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; 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.BlockGetter; @@ -38,9 +39,9 @@ protected ItemLike getBaseSeedId() { return BlockRegistry.MAGE_BLOOM_CROP; } - @Override - public void appendHoverText(ItemStack stack, @Nullable BlockGetter worldIn, List tooltip, TooltipFlag flagIn) { - tooltip.add(Component.translatable("tooltip.magebloom")); + public void appendHoverText(ItemStack pStack, Item.TooltipContext pContext, List pTootipComponents, TooltipFlag pTooltipFlag) { + super.appendHoverText(pStack, pContext, pTootipComponents, pTooltipFlag); + pTootipComponents.add(Component.translatable("tooltip.magebloom")); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/MagelightTorch.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/MagelightTorch.java index 2b4132360d..7c236fc9c5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/MagelightTorch.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/MagelightTorch.java @@ -5,7 +5,9 @@ import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -31,15 +33,15 @@ public MagelightTorch(){ } @Override - public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + public ItemInteractionResult useItemOn(ItemStack stack, BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { if(pLevel.isClientSide){ - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } BlockEntity tile = pLevel.getBlockEntity(pPos); if(tile instanceof MagelightTorchTile torchTile){ torchTile.setHorizontalFire(!torchTile.isHorizontalFire()); } - return super.use(pState, pLevel, pPos, pPlayer, pHand, pHit); + return super.useItemOn(stack, pState, pLevel, pPos, pPlayer, pHand, pHit); } @Nullable diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/MobJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/MobJar.java index e841aa8c1a..9f45ca5022 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/MobJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/MobJar.java @@ -10,6 +10,7 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.PlayerRideable; @@ -59,33 +60,32 @@ public MobJar() { } @Override - public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + public ItemInteractionResult useItemOn(ItemStack stack, BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { MobJarTile tile = (MobJarTile) pLevel.getBlockEntity(pPos); if (tile == null) { - return InteractionResult.PASS; + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } if (!pLevel.isClientSide) { ItemStack held = pPlayer.getItemInHand(pHand); if (held.is(ItemTagProvider.JAR_ITEM_BLACKLIST)) { - return InteractionResult.PASS; + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } } if (tile.getEntity() == null && !pLevel.isClientSide) { - ItemStack stack = pPlayer.getItemInHand(pHand); if (stack.getItem() instanceof SpawnEggItem spawnEggItem) { EntityType type = spawnEggItem.getType(null); Entity entity = type.create(pLevel); if (entity != null) { tile.setEntityData(entity); stack.shrink(1); - return InteractionResult.CONSUME; + return ItemInteractionResult.CONSUME; } } else if (!stack.isEmpty() && !(stack.getItem() instanceof MobJarItem)) { ItemEntity entity = new ItemEntity(EntityType.ITEM, pLevel); entity.setItem(stack.copy()); tile.setEntityData(entity); stack.setCount(0); - return InteractionResult.CONSUME; + return ItemInteractionResult.CONSUME; } } if (tile.getEntity() != null @@ -102,7 +102,7 @@ public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Pla behavior.use(pState, pLevel, pPos, pPlayer, pHand, pHit, tile); }); tile.updateBlock(); - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } @Override @@ -211,7 +211,7 @@ public int getSignal(BlockState pBlockState, BlockGetter pBlockAccess, BlockPos } @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + public boolean isPathfindable(BlockState pState, PathComputationType pType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java index 770645876f..cbeaaeeaf5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java @@ -12,9 +12,11 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; @@ -91,17 +93,17 @@ public void setType(Level pLevel, BlockPos pPos,boolean alternate){ } @Override - public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + public ItemInteractionResult useItemOn(ItemStack stack, BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { if(pLevel.isClientSide || pHand != InteractionHand.MAIN_HAND) - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; if(pPlayer.getItemInHand(pHand).getItem() instanceof DominionWand){ if(pLevel.getBlockEntity(pPos) instanceof PortalTile){ boolean nextVal = !pLevel.getBlockState(pPos).getValue(ALTERNATE); setType(pLevel, pPos, nextVal); - return InteractionResult.CONSUME; + return ItemInteractionResult.CONSUME; } } - return super.use(pState, pLevel, pPos, pPlayer, pHand, pHit); + return super.useItemOn(stack, pState, pLevel, pPos, pPlayer, pHand, pHit); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java index b71709438b..1f7fed2ef3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java @@ -11,12 +11,13 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; 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.TooltipFlag; import net.minecraft.world.item.alchemy.Potion; -import net.minecraft.world.item.alchemy.PotionUtils; import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; @@ -70,14 +71,13 @@ public int getAnalogOutputSignal(BlockState blockState, Level worldIn, BlockPos } @Override - public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { + public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { if (worldIn.isClientSide) - return super.use(state, worldIn, pos, player, handIn, hit); + return super.useItemOn(stack, state, worldIn, pos, player, handIn, hit); PotionJarTile tile = (PotionJarTile) worldIn.getBlockEntity(pos); if (tile == null) - return super.use(state, worldIn, pos, player, handIn, hit); - ItemStack stack = player.getItemInHand(handIn); + return super.useItemOn(stack, state, worldIn, pos, player, handIn, hit); Potion potion = PotionUtils.getPotion(stack); if (stack.getItem() == Items.POTION && potion != Potions.EMPTY) { @@ -88,7 +88,7 @@ public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Play player.addItem(new ItemStack(Items.GLASS_BOTTLE)); } } - return super.use(state, worldIn, pos, player, handIn, hit); + return super.useItemOn(stack, state, worldIn, pos, player, handIn, hit); }else if (stack.getItem() == Items.GLASS_BOTTLE && tile.getAmount() >= 100) { ItemStack potionStack = new ItemStack(Items.POTION); PotionUtils.setPotion(potionStack, tile.getData().getPotion()); @@ -106,7 +106,7 @@ public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Play tile.remove(10); } } - return super.use(state, worldIn, pos, player, handIn, hit); + return super.useItemOn(stack, state, worldIn, pos, player, handIn, hit); } @Override @@ -126,8 +126,8 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { } @Override - public void appendHoverText(ItemStack stack, @Nullable BlockGetter worldIn, List tooltip, TooltipFlag flagIn) { - super.appendHoverText(stack, worldIn, tooltip, flagIn); + public void appendHoverText(ItemStack stack, Item.TooltipContext pContext, List tooltip, TooltipFlag pTooltipFlag) { + super.appendHoverText(stack, pContext, pTootipComponents, pTooltipFlag); if (stack.getTag() == null) return; int fill = stack.getTag().getCompound("BlockEntityTag").getInt("currentFill"); @@ -181,7 +181,7 @@ public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + public boolean isPathfindable(BlockState pState, PathComputationType pType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionMelder.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionMelder.java index e2d83f08d7..e553e0462c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionMelder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionMelder.java @@ -78,7 +78,7 @@ public void neighborChanged(BlockState state, Level world, BlockPos pos, Block b } @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + public boolean isPathfindable(BlockState pState, PathComputationType pType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RedstoneRelay.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RedstoneRelay.java index 192d82fbe6..229bb4e775 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RedstoneRelay.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RedstoneRelay.java @@ -119,7 +119,7 @@ public BlockState mirror(BlockState state, Mirror mirrorIn) { } @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + public boolean isPathfindable(BlockState pState, PathComputationType pType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/Relay.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/Relay.java index 9640b93969..8944fa8c03 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/Relay.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/Relay.java @@ -87,7 +87,7 @@ public BlockState updateShape(BlockState stateIn, Direction side, BlockState fac } @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + public boolean isPathfindable(BlockState pState, PathComputationType pType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RitualBrazierBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RitualBrazierBlock.java index 470541ee12..acd7ab4e14 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RitualBrazierBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RitualBrazierBlock.java @@ -123,7 +123,7 @@ public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, } @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + public boolean isPathfindable(BlockState pState, PathComputationType pType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScribesBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScribesBlock.java index cfc1c6ba3b..af19c8e764 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScribesBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScribesBlock.java @@ -138,7 +138,7 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { } @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + public boolean isPathfindable(BlockState pState, PathComputationType pType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java index 9b2151a7fd..8a5819e9d3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java @@ -90,7 +90,7 @@ public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { } @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + public boolean isPathfindable(BlockState pState, PathComputationType pType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceJar.java index 26fd403b18..0a82e4c560 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceJar.java @@ -131,7 +131,7 @@ public void appendHoverText(ItemStack stack, @Nullable BlockGetter worldIn, List } @Override - public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + public boolean isPathfindable(BlockState pState, PathComputationType pType) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AgronomicSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AgronomicSourcelinkTile.java index 8632f0deef..2f3c9e26d8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AgronomicSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AgronomicSourcelinkTile.java @@ -8,15 +8,15 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; -import net.neoforged.neoforge.event.level.BlockEvent; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.level.SaplingGrowTreeEvent; +import net.neoforged.neoforge.event.level.block.CropGrowEvent; @EventBusSubscriber(modid = ArsNouveau.MODID) public class AgronomicSourcelinkTile extends SourcelinkTile { public AgronomicSourcelinkTile(BlockPos pos, BlockState state) { - super(BlockRegistry.AGRONOMIC_SOURCELINK_TILE, pos, state); + super(BlockRegistry.AGRONOMIC_SOURCELINK_TILE.get(), pos, state); } @Override @@ -25,7 +25,7 @@ public int getMaxSource() { } @SubscribeEvent - public static void cropGrow(BlockEvent.CropGrowEvent.Post event) { + public static void cropGrow(CropGrowEvent.Post event) { int mana = 20; if (event.getLevel().getBlockState(event.getPos()).is(BlockTagProvider.MAGIC_PLANTS)) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlchemicalSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlchemicalSourcelinkTile.java index 60d8670e40..261249db9e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlchemicalSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlchemicalSourcelinkTile.java @@ -15,7 +15,7 @@ public class AlchemicalSourcelinkTile extends SourcelinkTile { public AlchemicalSourcelinkTile(BlockPos pos, BlockState state) { - super(BlockRegistry.ALCHEMICAL_TILE, pos, state); + super(BlockRegistry.ALCHEMICAL_TILE.get(), pos, state); } @Override @@ -40,7 +40,7 @@ public void tick() { source += (e.getDuration() / 50); source += e.getAmplifier() * 250; source += 150; - effectTypes.add(e.getEffect()); + effectTypes.add(e.getEffect().value()); } if (effectTypes.size() > 1) { source *= Math.pow(2.1, effectTypes.size()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java index c74642f8a0..9f33120863 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java @@ -12,6 +12,7 @@ import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.item.ItemEntity; @@ -154,8 +155,8 @@ public void dropItems(){ } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); CompoundTag armorTag = new CompoundTag(); armorStack.save(armorTag); tag.put("armorStack", armorTag); @@ -171,8 +172,8 @@ public void saveAdditional(CompoundTag tag) { } @Override - public void load(CompoundTag compound) { - super.load(compound); + protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.loadAdditional(compound, pRegistries); this.armorStack = ItemStack.of(compound.getCompound("armorStack")); int count = compound.getInt("numPerks"); perkList = new ArrayList<>(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ArcanePedestalTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ArcanePedestalTile.java index f33d73e91f..04193a448f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ArcanePedestalTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ArcanePedestalTile.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.Container; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -26,14 +27,14 @@ public int getContainerSize() { } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.putBoolean("hasSignal", hasSignal); } @Override - public void load(CompoundTag compound) { - super.load(compound); + protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.loadAdditional(compound, pRegistries); this.hasSignal = compound.getBoolean("hasSignal"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java index 4fb50157ae..c90fa11ae8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java @@ -8,6 +8,7 @@ import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -32,11 +33,6 @@ public BasicSpellTurretTile(BlockEntityType p_i48289_1_, BlockPos pos, BlockS super(p_i48289_1_, pos, state); } - - public BasicSpellTurretTile(RegistryWrapper> p_i48289_1_, BlockPos pos, BlockState state) { - super(p_i48289_1_.get(), pos, state); - } - public BasicSpellTurretTile(BlockPos pos, BlockState state) { super(BlockRegistry.BASIC_SPELL_TURRET_TILE, pos, state); } @@ -46,15 +42,15 @@ public int getManaCost() { } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); - spellCaster.serializeOnTag(tag); + protected void saveAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { + super.saveAdditional(pTag, pRegistries); + spellCaster.serializeOnTag(pTag); } @Override - public void load(CompoundTag tag) { - this.spellCaster = new TurretSpellCaster(tag); - super.load(tag); + protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { + super.loadAdditional(pTag, pRegistries); + this.spellCaster = new TurretSpellCaster(pTag); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BrazierRelayTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BrazierRelayTile.java index 47f8f976e0..988b70df73 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BrazierRelayTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BrazierRelayTile.java @@ -7,6 +7,7 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -97,8 +98,8 @@ public void onWanded(Player playerEntity) { @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.putInt("ticksToLightOff", ticksToLightOff); if (this.brazierPos != null) { tag.putLong("brazierPos", this.brazierPos.asLong()); @@ -106,8 +107,8 @@ public void saveAdditional(CompoundTag tag) { } @Override - public void load(CompoundTag tag) { - super.load(tag); + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.loadAdditional(tag, pRegistries); this.ticksToLightOff = tag.getInt("ticksToLightOff"); if (tag.contains("brazierPos")) { this.brazierPos = BlockPos.of(tag.getLong("brazierPos")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java index 1e02e7fb6c..12e382f56a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.client.container.StoredItemStack; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -68,8 +69,8 @@ public AbstractContainerMenu createMenu(int id, Inventory plInv, Player arg2) { } @Override - public void saveAdditional(CompoundTag compound) { - super.saveAdditional(compound); + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); ListTag listnbt = new ListTag(); @@ -88,8 +89,8 @@ public void saveAdditional(CompoundTag compound) { private boolean reading; @Override - public void load(CompoundTag compound) { - super.load(compound); + protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.loadAdditional(compound, pRegistries); reading = true; ListTag listnbt = compound.getList("CraftingTable", 10); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CreativeSourceJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CreativeSourceJarTile.java index 8551476d78..6704af6997 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CreativeSourceJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CreativeSourceJarTile.java @@ -7,7 +7,7 @@ public class CreativeSourceJarTile extends SourceJarTile { public CreativeSourceJarTile(BlockPos pos, BlockState state) { - super(BlockRegistry.CREATIVE_SOURCE_JAR_TILE, pos, state); + super(BlockRegistry.CREATIVE_SOURCE_JAR_TILE.get(), pos, state); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java index c437a232b9..b2422b1576 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java @@ -14,6 +14,7 @@ import com.hollingsworth.arsnouveau.setup.config.Config; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -48,7 +49,7 @@ public class DrygmyTile extends SummoningTile implements ITooltipProvider { private List nearbyEntities; public DrygmyTile(BlockPos pos, BlockState state) { - super(BlockRegistry.DRYGMY_TILE, pos, state); + super(BlockRegistry.DRYGMY_TILE.get(), pos, state); } @Override @@ -208,16 +209,16 @@ public void generateItems() { @Override - public void load(CompoundTag compound) { + protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.loadAdditional(compound, pRegistries); this.progress = compound.getInt("progress"); this.bonus = compound.getInt("bonus"); this.needsMana = compound.getBoolean("needsMana"); - super.load(compound); } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.putInt("progress", progress); tag.putInt("bonus", bonus); tag.putBoolean("needsMana", needsMana); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantedTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantedTurretTile.java index cdf932743f..9d23503a78 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantedTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantedTurretTile.java @@ -13,7 +13,7 @@ public class EnchantedTurretTile extends BasicSpellTurretTile { public EnchantedTurretTile(BlockPos pos, BlockState state) { - super(BlockRegistry.ENCHANTED_SPELL_TURRET_TYPE, pos, state); + super(BlockRegistry.ENCHANTED_SPELL_TURRET_TYPE.get(), pos, state); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java index 4df780b729..1da3aea12a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java @@ -16,6 +16,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.SoundRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundSource; @@ -178,15 +179,15 @@ public boolean craftingPossible(ItemStack stack, Player playerEntity) { } @Override - public void load(CompoundTag compound) { + protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.loadAdditional(compound, pRegistries); isCrafting = compound.getBoolean("is_crafting"); counter = compound.getInt("counter"); - super.load(compound); } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.putBoolean("is_crafting", isCrafting); tag.putInt("counter", counter); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/GhostWeaveTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/GhostWeaveTile.java index f5a7f8f9f9..10f321d323 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/GhostWeaveTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/GhostWeaveTile.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.state.BlockState; @@ -41,15 +42,15 @@ public boolean isInvisible(){ } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.putBoolean("invisible", invisible); } @Override - public void load(CompoundTag pTag) { - super.load(pTag); - invisible = pTag.getBoolean("invisible"); + protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.loadAdditional(compound, pRegistries); + invisible = compound.getBoolean("invisible"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java index e801752278..47fab83e2c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java @@ -16,6 +16,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.Container; @@ -57,7 +58,7 @@ public class ImbuementTile extends AbstractSourceMachine implements Container, I int craftTicks; public ImbuementTile(BlockPos pos, BlockState state) { - super(BlockRegistry.IMBUEMENT_TILE, pos, state); + super(BlockRegistry.IMBUEMENT_TILE.get(), pos, state); } @Override @@ -164,7 +165,8 @@ public void tick() { } @Override - public void load(CompoundTag tag) { + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.loadAdditional(tag, pRegistries); stack = ItemStack.of((CompoundTag) tag.get("itemStack")); draining = tag.getBoolean("draining"); this.hasRecipe = tag.getBoolean("hasRecipe"); @@ -173,8 +175,8 @@ public void load(CompoundTag tag) { } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); if (stack != null) { CompoundTag reagentTag = new CompoundTag(); stack.save(reagentTag); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/IntangibleAirTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/IntangibleAirTile.java index d12e8b8306..e97aae5ff8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/IntangibleAirTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/IntangibleAirTile.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; @@ -29,15 +30,16 @@ public void tick() { } @Override - public void load(CompoundTag nbt) { - stateID = nbt.getInt("state_id"); - duration = nbt.getInt("duration"); - maxLength = nbt.getInt("max_length"); - super.load(nbt); + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.loadAdditional(tag, pRegistries); + stateID = tag.getInt("state_id"); + duration = tag.getInt("duration"); + maxLength = tag.getInt("max_length"); } @Override - public void saveAdditional(CompoundTag tag) { + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.putInt("state_id", stateID); tag.putInt("duration", duration); tag.putInt("max_length", maxLength); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java index 3dba8efbaf..640900fa27 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java @@ -11,6 +11,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.LivingEntity; @@ -148,8 +149,8 @@ public List getWandHighlight(List list) { } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); if(connectedPos != null){ tag.putLong("connectedPos", connectedPos.asLong()); } @@ -162,8 +163,8 @@ public void saveAdditional(CompoundTag tag) { } @Override - public void load(CompoundTag pTag) { - super.load(pTag); + protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { + super.loadAdditional(pTag, pRegistries); if(pTag.contains("connectedPos")){ connectedPos = BlockPos.of(pTag.getLong("connectedPos")); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/LightTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/LightTile.java index 0380fc4bdb..21cad69c61 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/LightTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/LightTile.java @@ -8,6 +8,7 @@ import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.RandomSource; import net.minecraft.world.level.Level; @@ -40,14 +41,14 @@ public void tick(Level level, BlockState state, BlockPos pos) { } @Override - public void load(CompoundTag nbt) { - super.load(nbt); - this.color = ParticleColorRegistry.from(nbt.getCompound("color")); + protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.loadAdditional(compound, pRegistries); + this.color = ParticleColorRegistry.from(compound.getCompound("color")); } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.put("color", color.serialize()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MageBlockTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MageBlockTile.java index cf2f0dd809..c0d55384ec 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MageBlockTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MageBlockTile.java @@ -7,6 +7,7 @@ import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.IntTag; import net.minecraft.world.entity.LivingEntity; @@ -40,8 +41,8 @@ public void tick() { } @Override - public void load(CompoundTag compound) { - super.load(compound); + protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.loadAdditional(compound, pRegistries); this.age = compound.getInt("age"); this.color = ParticleColorRegistry.from(compound.getCompound("lightColor")); this.isPermanent = compound.getBoolean("permanent"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MagelightTorchTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MagelightTorchTile.java index 87987ebdde..b7adc975f3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MagelightTorchTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MagelightTorchTile.java @@ -9,6 +9,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; @@ -91,14 +92,14 @@ public boolean isHorizontalFire() { } @Override - public void saveAdditional(CompoundTag compound) { - super.saveAdditional(compound); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); compound.putBoolean("horizontalFire", horizontalFire); } @Override - public void load(CompoundTag nbt) { - super.load(nbt); - horizontalFire = nbt.getBoolean("horizontalFire"); + protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.loadAdditional(compound, pRegistries); + horizontalFire = compound.getBoolean("horizontalFire"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MirrorWeaveTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MirrorWeaveTile.java index 1dd62417dc..b4617ede39 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MirrorWeaveTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MirrorWeaveTile.java @@ -9,6 +9,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderGetter; +import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; @@ -53,14 +54,14 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.put("mimic_state", NbtUtils.writeBlockState(mimicState)); } @Override - public void load(CompoundTag pTag) { - super.load(pTag); + protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { + super.loadAdditional(pTag, pRegistries); if(pTag.contains("mimic_state")) { HolderGetter holdergetter = this.level != null ? this.level.holderLookup(Registries.BLOCK) : BuiltInRegistries.BLOCK.asLookup(); mimicState = NbtUtils.readBlockState(holdergetter, pTag.getCompound("mimic_state")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java index 0b4286f663..fe18fc247a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java @@ -9,6 +9,7 @@ import com.hollingsworth.arsnouveau.common.lib.EntityTags; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.Connection; import net.minecraft.network.chat.Component; @@ -153,8 +154,8 @@ public void setExtraDataTag(CompoundTag tag){ } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); // Check both conditions because the entity may have never been loaded on the server side. if(entityTag != null || cachedEntity != null){ @@ -172,8 +173,8 @@ public void saveAdditional(CompoundTag tag) { } @Override - public void load(CompoundTag pTag) { - super.load(pTag); + protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { + super.loadAdditional(pTag, pRegistries); if(pTag.contains("entityTag")){ this.entityTag = pTag.getCompound("entityTag"); this.cachedEntity = null; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ModdedTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ModdedTile.java index 84d949ce7d..b5eb8c31ce 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ModdedTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ModdedTile.java @@ -29,11 +29,6 @@ public ClientboundBlockEntityDataPacket getUpdatePacket() { return ClientboundBlockEntityDataPacket.create(this); } - @Override - protected void saveAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { - super.saveAdditional(pTag, pRegistries); - } - @Override public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, HolderLookup.Provider lookupProvider) { super.onDataPacket(net, pkt, lookupProvider); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MycelialSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MycelialSourcelinkTile.java index b0a8ba1b64..89e737e41b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MycelialSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MycelialSourcelinkTile.java @@ -25,7 +25,7 @@ public MycelialSourcelinkTile(BlockEntityType tileEntityTypeIn, BlockPos pos, } public MycelialSourcelinkTile(BlockPos pos, BlockState state) { - super(BlockRegistry.MYCELIAL_TILE, pos, state); + super(BlockRegistry.MYCELIAL_TILE.get(), pos, state); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java index 8b9a7ba67d..f8bfd6d374 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java @@ -9,6 +9,7 @@ import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketWarpPosition; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; @@ -73,8 +74,8 @@ public void setFromScroll(WarpScroll.WarpScrollData scrollData){ @Override - public void load(CompoundTag compound) { - super.load(compound); + protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.loadAdditional(compound, pRegistries); this.dimID = compound.getString("dim"); this.warpPos = NBTUtil.getBlockPos(compound, "warp"); this.rotationVec = new Vec2(compound.getFloat("xRot"), compound.getFloat("yRot")); @@ -83,7 +84,8 @@ public void load(CompoundTag compound) { } @Override - public void saveAdditional(CompoundTag compound) { + public void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); if (this.warpPos != null) { NBTUtil.storeBlockPos(compound, "warp", this.warpPos); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java index 061c9f2ed7..a47220b837 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java @@ -12,6 +12,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -88,8 +89,8 @@ public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable Liv } @Override - public void load(CompoundTag pTag) { - super.load(pTag); + protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { + super.loadAdditional(pTag, pRegistries); boundPos = NBTUtil.getNullablePos(pTag, "boundPos"); @@ -101,8 +102,8 @@ public void load(CompoundTag pTag) { } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); if(boundPos != null){ NBTUtil.storeBlockPos(tag, "boundPos", boundPos); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java index 5a22c0adb7..3b26fe7f85 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java @@ -6,15 +6,16 @@ import com.hollingsworth.arsnouveau.common.block.SourceJar; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.alchemy.Potion; -import net.minecraft.world.item.alchemy.PotionUtils; import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.registries.NeoForgeRegistries; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -61,8 +62,8 @@ else if (this.getAmount() != 0) { } @Override - public void handleUpdateTag(CompoundTag tag) { - super.handleUpdateTag(tag); + public void handleUpdateTag(CompoundTag tag, HolderLookup.Provider lookupProvider) { + super.handleUpdateTag(tag, lookupProvider); level.sendBlockUpdated(worldPosition, level.getBlockState(worldPosition), level.getBlockState(worldPosition), 8); } @@ -110,8 +111,8 @@ public void getTooltip(List tooltip) { } @Override - public void load(CompoundTag tag) { - super.load(tag); + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.loadAdditional(pTag, pRegistries); if(tag.contains("potionData")) this.data = PotionData.fromTag(tag.getCompound("potionData")); this.isLocked = tag.getBoolean("locked"); @@ -119,15 +120,15 @@ public void load(CompoundTag tag) { } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.put("potionData", this.data.toTag()); tag.putBoolean("locked", this.isLocked); tag.putInt("currentFill", this.currentFill); // Include a sorted list of potion names so quests can check the jar's contents Set potionSet = this.data.getIncludedPotions(); - List potionNames = new ArrayList<>(potionSet.stream().map(potion -> ForgeRegistries.POTIONS.getKey(potion).toString()).toList()); + List potionNames = new ArrayList<>(potionSet.stream().map(potion -> NeoForgeRegistries.POTIONS.getKey(potion).toString()).toList()); potionNames.sort(String::compareTo); tag.putString("potionNames", String.join(",", potionNames)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java index d9875d62e6..7c61f9ab00 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java @@ -17,6 +17,7 @@ import com.hollingsworth.arsnouveau.setup.config.Config; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -237,8 +238,8 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public void load(CompoundTag nbt) { - super.load(nbt); + public void loadAdditional(CompoundTag nbt, HolderLookup.Provider pRegistries) { + super.loadAdditional(nbt, pRegistries); fromJars = new ArrayList<>(); this.timeMixing = nbt.getInt("mixing"); this.isMixing = nbt.getBoolean("isMixing"); @@ -258,7 +259,8 @@ public void load(CompoundTag nbt) { } @Override - public void saveAdditional(CompoundTag compound) { + public void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.saveAdditional(compound, pRegistries); compound.putInt("mixing", timeMixing); compound.putBoolean("isMixing", isMixing); compound.putBoolean("hasMana", hasSource); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RedstoneRelayTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RedstoneRelayTile.java index cb3cd3ff91..fcd3bf16f2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RedstoneRelayTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RedstoneRelayTile.java @@ -206,8 +206,8 @@ public void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); ListTag listTag = new ListTag(); for(BlockPos pos : poweredFrom){ CompoundTag posTag = new CompoundTag(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayCollectorTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayCollectorTile.java index 2e2664a213..469c463879 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayCollectorTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayCollectorTile.java @@ -12,7 +12,7 @@ public class RelayCollectorTile extends RelayTile { public RelayCollectorTile(BlockPos pos, BlockState state) { - super(BlockRegistry.RELAY_COLLECTOR_TILE, pos, state); + super(BlockRegistry.RELAY_COLLECTOR_TILE.get(), pos, state); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayDepositTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayDepositTile.java index 8a392554cc..273fac51d2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayDepositTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayDepositTile.java @@ -12,7 +12,7 @@ public class RelayDepositTile extends RelayTile { public RelayDepositTile(BlockPos pos, BlockState state) { - super(BlockRegistry.RELAY_DEPOSIT_TILE, pos, state); + super(BlockRegistry.RELAY_DEPOSIT_TILE.get(), pos, state); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelaySplitterTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelaySplitterTile.java index f869a5fb04..8e12ffe0a8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelaySplitterTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelaySplitterTile.java @@ -8,6 +8,7 @@ import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -22,7 +23,7 @@ public class RelaySplitterTile extends RelayTile implements IMultiSourceTargetPr ArrayList fromList = new ArrayList<>(); public RelaySplitterTile(BlockPos pos, BlockState state) { - super(BlockRegistry.RELAY_SPLITTER_TILE, pos, state); + super(BlockRegistry.RELAY_SPLITTER_TILE.get(), pos, state); } public RelaySplitterTile(BlockEntityType type, BlockPos pos, BlockState state) { @@ -132,8 +133,8 @@ public int getMaxSource() { } @Override - public void load(CompoundTag tag) { - super.load(tag); + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.loadAdditional(tag, pRegistries); fromList = new ArrayList<>(); toList = new ArrayList<>(); int counter = 0; @@ -156,8 +157,8 @@ public void load(CompoundTag tag) { } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); int counter = 0; for (BlockPos p : this.fromList) { NBTUtil.storeBlockPos(tag, "from_" + counter, p); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java index ea9721054d..c62eeb2b4b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java @@ -14,6 +14,7 @@ import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.LivingEntity; @@ -36,17 +37,13 @@ public class RelayTile extends AbstractSourceMachine implements ITooltipProvider, IWandable, GeoBlockEntity, ITickable { public RelayTile(BlockPos pos, BlockState state) { - super(BlockRegistry.ARCANE_RELAY_TILE, pos, state); + super(BlockRegistry.ARCANE_RELAY_TILE.get(), pos, state); } public RelayTile(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); } - public RelayTile(RegistryWrapper> type, BlockPos pos, BlockState state) { - super(type.get(), pos, state); - } - public BlockPos getToPos() { return toPos; } @@ -192,8 +189,8 @@ public void tick() { String FROM = "from"; @Override - public void load(CompoundTag tag) { - super.load(tag); + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.loadAdditional(tag, pRegistries); this.toPos = null; this.fromPos = null; @@ -207,8 +204,8 @@ public void load(CompoundTag tag) { } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); if (toPos != null) { NBTUtil.storeBlockPos(tag, TO, toPos.immutable()); } else { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RepositoryTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RepositoryTile.java index c879d7d959..b78883daa5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RepositoryTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RepositoryTile.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.Connection; @@ -135,30 +136,31 @@ public int getContainerSize() { return 54; } - - protected void saveAdditional(CompoundTag pTag) { - super.saveAdditional(pTag); + @Override + protected void saveAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { + super.saveAdditional(pTag, pRegistries); if (!this.trySaveLootTable(pTag)) { - ContainerHelper.saveAllItems(pTag, this.items); + ContainerHelper.saveAllItems(pTag, this.items, pRegistries); } pTag.putInt("fillLevel", fillLevel); pTag.putInt("configuration", configuration); } - public void load(CompoundTag pTag) { - super.load(pTag); + @Override + protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { + super.loadAdditional(pTag, pRegistries); this.items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); if (!this.tryLoadLootTable(pTag)) { - ContainerHelper.loadAllItems(pTag, this.items); + ContainerHelper.loadAllItems(pTag, this.items, pRegistries); } fillLevel = pTag.getInt("fillLevel"); configuration = pTag.getInt("configuration"); } @Override - public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt) { - super.onDataPacket(net, pkt); - handleUpdateTag(pkt.getTag() == null ? new CompoundTag() : pkt.getTag()); + public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, HolderLookup.Provider lookupProvider) { + super.onDataPacket(net, pkt, lookupProvider); + handleUpdateTag(pkt.getTag() == null ? new CompoundTag() : pkt.getTag(), lookupProvider); } public boolean updateBlock() { @@ -172,10 +174,10 @@ public boolean updateBlock() { } @Override - public CompoundTag getUpdateTag() { + public CompoundTag getUpdateTag(HolderLookup.Provider pRegistries) { CompoundTag tag = new CompoundTag(); - this.saveAdditional(tag); - return tag; + this.saveAdditional(tag, pRegistries); + return super.getUpdateTag(pRegistries); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java index 051bae6518..22ba3fbbb4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java @@ -25,6 +25,7 @@ import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -215,11 +216,11 @@ public void startRitual(@Nullable Player player) { } @Override - public void load(CompoundTag tag) { - super.load(tag); + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.loadAdditional(tag, pRegistries); String ritualIDString = tag.getString("ritualID"); if (!ritualIDString.isEmpty()) { - ResourceLocation ritualID = new ResourceLocation(ritualIDString); + ResourceLocation ritualID = ResourceLocation.tryParse(ritualIDString); ritual = RitualRegistry.getRitual(ritualID); if (ritual != null) { ritual.tile = this; @@ -238,7 +239,8 @@ public void load(CompoundTag tag) { } @Override - public void saveAdditional(CompoundTag tag) { + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); if (ritual != null) { tag.putString("ritualID", ritual.getRegistryName().toString()); ritual.write(tag); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RotatingTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RotatingTurretTile.java index d89572cd01..cbc4c85f40 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RotatingTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RotatingTurretTile.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; @@ -131,8 +132,8 @@ public void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @Nullable Li } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.putFloat("rotationY", rotationY); tag.putFloat("rotationX", rotationX); tag.putFloat("neededRotationY", neededRotationY); @@ -140,8 +141,8 @@ public void saveAdditional(CompoundTag tag) { } @Override - public void load(CompoundTag tag) { - super.load(tag); + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.loadAdditional(tag, pRegistries); rotationX = tag.getFloat("rotationX"); rotationY = tag.getFloat("rotationY"); neededRotationX = tag.getFloat("neededRotationX"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java index 84e6fdaf6e..a9e4f1c890 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java @@ -18,6 +18,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; @@ -100,7 +101,8 @@ public void saveAdditional(CompoundTag tag) { } @Override - public void load(CompoundTag tag) { + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.loadAdditional(tag, pRegistries); this.spell = Spell.fromTag(tag.getCompound("spell")); this.isCharged = tag.getBoolean("charged"); this.disabled = tag.getBoolean("redstone"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SconceTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SconceTile.java index 9505e52abf..a4de48b7ce 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SconceTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SconceTile.java @@ -16,6 +16,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; @@ -40,15 +41,15 @@ public SconceTile(BlockEntityType type, BlockPos pos, BlockState state) { @Override - public void load(CompoundTag nbt) { - super.load(nbt); - this.color = ParticleColorRegistry.from(nbt.getCompound("color")); - lit = nbt.getBoolean("lit"); + public void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { + super.loadAdditional(pTag, bpRegistries); + this.color = ParticleColorRegistry.from(pTag.getCompound("color")); + lit = pTag.getBoolean("lit"); } @Override - public void saveAdditional(CompoundTag compound) { - super.saveAdditional(compound); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); compound.put("color", color.serialize()); compound.putBoolean("lit", lit); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java index 863302e2b8..6ab349bc08 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java @@ -17,6 +17,7 @@ import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -73,7 +74,7 @@ public void tick() { if (craftingTicks > 0) craftingTicks--; - if (recipeID != null && recipeID.equals(new ResourceLocation(""))) { + if (recipeID != null && recipeID.equals(ResourceLocation.withDefaultNamespace(""))) { recipe = null; // Used on client to remove recipe since for some forsaken reason world is missing during load. } @@ -114,7 +115,7 @@ public void tick() { if (!level.isClientSide && crafting && craftingTicks == 0 && recipe != null) { level.addFreshEntity(new ItemEntity(level, getX() + 0.5, getY() + 1.1, getZ() + 0.5, recipe.output.copy())); recipe = null; - recipeID = new ResourceLocation(""); + recipeID = ResourceLocation.withDefaultNamespace(""); crafting = false; consumedStacks = new ArrayList<>(); updateBlock(); @@ -266,8 +267,8 @@ public void onWanded(Player playerEntity) { } @Override - public void load(CompoundTag compound) { - super.load(compound); + protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.loadAdditional(compound, pRegistries); stack = ItemStack.of((CompoundTag) compound.get("itemStack")); if (compound.contains("recipe")) { recipeID = new ResourceLocation(compound.getString("recipe")); @@ -281,7 +282,8 @@ public void load(CompoundTag compound) { } @Override - public void saveAdditional(CompoundTag compound) { + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); if (stack != null) { CompoundTag reagentTag = new CompoundTag(); stack.save(reagentTag); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java index 8c3c668ade..0026de71da 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.Container; import net.minecraft.world.entity.item.ItemEntity; @@ -89,14 +90,14 @@ public void setStack(ItemStack otherStack){ } @Override - public void load(CompoundTag compound) { - super.load(compound); + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.loadAdditional(tag, pRegistries); stack = ItemStack.of((CompoundTag) compound.get("itemStack")); } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); if (stack != null) { CompoundTag stackTag = new CompoundTag(); stack.save(stackTag); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SkyBlockTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SkyBlockTile.java index b90c0f49f2..b3ae24d3e4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SkyBlockTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SkyBlockTile.java @@ -8,6 +8,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.block.state.BlockState; @@ -65,15 +66,15 @@ public void setShowFacade(boolean showFacade){ } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.putBoolean("showFacade", showFacade); tag.putInt("previousLight", previousLight); } @Override - public void load(CompoundTag pTag) { - super.load(pTag); + protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { + super.loadAdditional(pTag, pRegistries); showFacade = pTag.getBoolean("showFacade"); previousLight = pTag.getInt("previousLight"); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java index acd3c43f3d..87d5be761e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java @@ -16,17 +16,13 @@ public class SourceJarTile extends AbstractSourceMachine implements ITooltipProvider, ITickable { public SourceJarTile(BlockPos pos, BlockState state) { - super(BlockRegistry.SOURCE_JAR_TILE, pos, state); + super(BlockRegistry.SOURCE_JAR_TILE.get(), pos, state); } public SourceJarTile(BlockEntityType tileTileEntityType, BlockPos pos, BlockState state) { super(tileTileEntityType, pos, state); } - public SourceJarTile(RegistryWrapper> type, BlockPos pos, BlockState state) { - super(type.get(), pos, state); - } - @Override public int getMaxSource() { return 10000; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java index eb3b4bdaab..1fc6412d5b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java @@ -9,6 +9,7 @@ import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -38,10 +39,6 @@ public SourcelinkTile(BlockEntityType sourceLinkTile, BlockPos pos, BlockStat super(sourceLinkTile, pos, state); } - public SourcelinkTile(RegistryWrapper> sourceLinkTile, BlockPos pos, BlockState state) { - super(sourceLinkTile.get(), pos, state); - } - @Override public int getTransferRate() { return 1000; @@ -109,15 +106,15 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public void load(CompoundTag tag) { - super.load(tag); + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.loadAdditional(tag, pRegistries); progress = tag.getInt("progress"); isDisabled = tag.getBoolean("disabled"); } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.putInt("progress", progress); tag.putBoolean("disabled", isDisabled); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java index 4c2f148fd1..ddd9a61cc5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java @@ -15,6 +15,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; @@ -148,8 +149,8 @@ public void tick() { } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.putInt("outputDuration", outputDuration); tag.putInt("outputStrength", outputStrength); tag.putBoolean("isOnResolve", isOnResolve); @@ -157,8 +158,8 @@ public void saveAdditional(CompoundTag tag) { } @Override - public void load(CompoundTag pTag) { - super.load(pTag); + public void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { + super.loadAdditional(pTag, pRegistries); this.outputDuration = pTag.getInt("outputDuration"); this.outputStrength = pTag.getInt("outputStrength"); this.isOnResolve = pTag.getBoolean("isOnResolve"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java index e0029cea00..b79fc91e8b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java @@ -20,6 +20,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtUtils; @@ -507,7 +508,8 @@ public int getMaxConnectedInventories() { } @Override - public void saveAdditional(CompoundTag compound) { + public void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.saveAdditional(compound, pRegistries); compound.put("sortSettings", sortSettings.toTag()); ListTag list = new ListTag(); for (BlockPos pos : connectedInventories) { @@ -529,7 +531,8 @@ public void saveAdditional(CompoundTag compound) { } @Override - public void load(CompoundTag compound) { + protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.loadAdditional(compound, pRegistries); if (compound.contains("sortSettings")) { sortSettings = SortSettings.fromTag(compound.getCompound("sortSettings")); } @@ -550,7 +553,6 @@ public void load(CompoundTag compound) { } } updateItems = true; - super.load(compound); } public String getLastSearch() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SummoningTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SummoningTile.java index f91b3db3c3..48fe113a9a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SummoningTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SummoningTile.java @@ -1,8 +1,8 @@ package com.hollingsworth.arsnouveau.common.block.tile; import com.hollingsworth.arsnouveau.common.block.ITickable; -import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -19,10 +19,6 @@ public SummoningTile(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); } - public SummoningTile(RegistryWrapper> type, BlockPos pos, BlockState state) { - this(type.get(), pos, state); - } - @Override public void tick() { if (level.isClientSide) @@ -38,14 +34,15 @@ public void convertedEffect() { } @Override - public void load(CompoundTag compound) { - super.load(compound); + protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.loadAdditional(compound, pRegistries); this.converted = compound.getBoolean("converted"); this.isOff = compound.getBoolean("off"); } @Override - public void saveAdditional(CompoundTag tag) { + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.putBoolean("converted", converted); tag.putBoolean("off", isOff); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TempLightTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TempLightTile.java index 35db6f466f..a8f2f082d9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TempLightTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TempLightTile.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.IntTag; import net.minecraft.world.level.block.state.BlockState; @@ -16,15 +17,15 @@ public TempLightTile(BlockPos pos, BlockState state) { } @Override - public void load(CompoundTag nbt) { - super.load(nbt); + public void loadAdditional(CompoundTag nbt, HolderLookup.Provider pRegistries) { + super.loadAdditional(nbt, pRegistries); this.age = nbt.getInt("age"); this.lengthModifier = nbt.getDouble("modifier"); } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.putDouble("modifier", lengthModifier); tag.put("age", IntTag.valueOf(age)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TemporaryTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TemporaryTile.java index 19a2e6a7d9..2271540db4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TemporaryTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TemporaryTile.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -39,15 +40,15 @@ public void tick() { } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.putLong("gameTime", gameTime); tag.putInt("tickDuration", tickDuration); } @Override - public void load(CompoundTag pTag) { - super.load(pTag); + protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { + super.loadAdditional(pTag, pRegistries); tickDuration = pTag.getInt("tickDuration"); if (pTag.contains("gameTime")) { gameTime = pTag.getLong("gameTime"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TimerSpellTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TimerSpellTurretTile.java index 64318253c4..2dd244f11a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TimerSpellTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TimerSpellTurretTile.java @@ -7,6 +7,7 @@ import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; @@ -33,7 +34,7 @@ public TimerSpellTurretTile(BlockEntityType p_i48289_1_, BlockPos pos, BlockS } public TimerSpellTurretTile(BlockPos pos, BlockState state) { - super(BlockRegistry.TIMER_SPELL_TURRET_TILE, pos, state); + super(BlockRegistry.TIMER_SPELL_TURRET_TILE.get(), pos, state); } @Override @@ -94,9 +95,10 @@ public void getTooltip(List tooltip) { tooltip.add(Component.translatable("ars_nouveau.locked")); } + @Override - public void load(CompoundTag tag) { - super.load(tag); + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.loadAdditional(tag, pRegistries); this.isLocked = tag.getBoolean("locked"); this.ticksPerSignal = tag.getInt("time"); this.isOff = tag.getBoolean("off"); @@ -104,8 +106,8 @@ public void load(CompoundTag tag) { } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.putBoolean("locked", isLocked); tag.putInt("time", ticksPerSignal); tag.putBoolean("off", isOff); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VitalicSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VitalicSourcelinkTile.java index c4f2a8425e..031fb64c92 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VitalicSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VitalicSourcelinkTile.java @@ -13,7 +13,7 @@ import net.minecraft.world.phys.AABB; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModList; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.living.BabyEntitySpawnEvent; import net.neoforged.neoforge.event.entity.living.LivingDeathEvent; @@ -27,7 +27,7 @@ public VitalicSourcelinkTile(BlockEntityType tileEntityTypeIn, BlockPos pos, private static final String TAG_POISONED = "quark:poison_potato_applied"; public VitalicSourcelinkTile(BlockPos pos, BlockState state) { - super(BlockRegistry.VITALIC_TILE, pos, state); + super(BlockRegistry.VITALIC_TILE.get(), pos, state); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java index 9c7b24b000..e7d04f3bd4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java @@ -10,11 +10,11 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; -import net.neoforged.neoforge.common.CommonHooks; import net.neoforged.neoforge.common.Tags; import software.bernie.geckolib.animatable.GeoAnimatable; @@ -24,7 +24,7 @@ public class VolcanicSourcelinkTile extends SourcelinkTile implements GeoAnimatable { public VolcanicSourcelinkTile(BlockPos pos, BlockState state) { - super(BlockRegistry.VOLCANIC_TILE, pos, state); + super(BlockRegistry.VOLCANIC_TILE.get(), pos, state); } @Override @@ -74,7 +74,7 @@ public boolean canConsumeEntireItem(ItemStack i){ public int getSourceValue(ItemStack i) { int source = 0; int progress = 0; - int burnTime = CommonHooks.getBurnTime(i, null); + int burnTime = i.getBurnTime(RecipeType.SMELTING); if (burnTime > 0) { source = burnTime / 12; progress = 1; @@ -113,7 +113,7 @@ public void doRandomAction() { return; } - stonePos = getTagInArea(Tags.Blocks.STONE, 1); + stonePos = getTagInArea(Tags.Blocks.STONES, 1); if (stonePos != null && progress >= 150) { level.setBlockAndUpdate(stonePos, Blocks.MAGMA_BLOCK.defaultBlockState()); progress -= 150; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java index f9962dd713..0de10827be 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java @@ -13,6 +13,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.config.Config; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; @@ -54,8 +55,9 @@ public class WhirlisprigTile extends SummoningTile implements GeoBlockEntity { public int progress; public Map genTable = new HashMap<>(); public Map scoreMap = new HashMap<>(); + public WhirlisprigTile(BlockPos pPos, BlockState pState) { - super(BlockRegistry.WHIRLISPRIG_TILE, pPos, pState); + super(BlockRegistry.WHIRLISPRIG_TILE.get(), pPos, pState); } @Override @@ -221,8 +223,8 @@ public void convertedEffect() { } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.putInt("moodScore", moodScore); tag.putInt("diversityScore", diversityScore); tag.putInt("progress", progress); @@ -232,8 +234,8 @@ public void saveAdditional(CompoundTag tag) { } @Override - public void load(CompoundTag compound) { - super.load(compound); + protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.loadAdditional(compound, pRegistries); moodScore = compound.getInt("moodScore"); diversityScore = compound.getInt("diversityScore"); progress = compound.getInt("progress"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java index 990757c229..9b38cfd8cc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java @@ -15,6 +15,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.network.chat.Component; @@ -336,8 +337,8 @@ private Map getInventoryCount() { } @Override - public void load(CompoundTag compound) { - super.load(compound); + protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.loadAdditional(compound, pRegistries); setStack = ItemStack.EMPTY; stackBeingCrafted = ItemStack.EMPTY; if (compound.contains("crafting")) { @@ -365,8 +366,8 @@ public void load(CompoundTag compound) { } @Override - public void saveAdditional(CompoundTag compound) { - super.saveAdditional(compound); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); if (setStack != null) { CompoundTag itemTag = new CompoundTag(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java index 53b371bb2a..b509224aea 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java @@ -63,7 +63,7 @@ public void addEntries() { .withReagent(Items.GLASS_BOTTLE) .withPedestalItem(4, Items.GLOWSTONE) .withPedestalItem(2, Items.REDSTONE_LAMP) - .withPedestalItem(2, Ingredient.of(Tags.Items.GLASS)) + .withPedestalItem(2, Ingredient.of(Tags.Items.GLASS_BLOCKS)) .build()); addRecipe(builder() diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java index 4aab291eb7..e0fcccb0de 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java @@ -329,12 +329,12 @@ public void setHome(BlockPos home) { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(HOME, Optional.empty()); - this.entityData.define(IMBUEING, false); - this.entityData.define(IMBUE_POS, BlockPos.ZERO); - this.entityData.define(STOMPING, false); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(HOME, Optional.empty()); + pBuilder.define(IMBUEING, false); + pBuilder.define(IMBUE_POS, BlockPos.ZERO); + pBuilder.define(STOMPING, false); } @Override @@ -343,7 +343,7 @@ public boolean removeWhenFarAway(double p_213397_1_) { } @Override - public int getExperienceReward() { + protected int getBaseExperienceReward() { return 0; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimBlockSummon.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimBlockSummon.java index 2dcd101428..a926ca1798 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimBlockSummon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimBlockSummon.java @@ -169,14 +169,15 @@ public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(OWNER_UUID, Optional.of(Util.NIL_UUID)); - this.entityData.define(COLOR, ParticleColor.defaultParticleColor().getColor()); - this.entityData.define(AGE, 0); - this.entityData.define(CAN_WALK, false); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(OWNER_UUID, Optional.of(Util.NIL_UUID)); + pBuilder.define(COLOR, ParticleColor.defaultParticleColor().getColor()); + pBuilder.define(AGE, 0); + pBuilder.define(CAN_WALK, false); } + @Override public void die(DamageSource cause) { super.die(cause); @@ -206,7 +207,7 @@ public boolean isFood(ItemStack stack) { } @Override - public int getExperienceReward() { + protected int getBaseExperienceReward() { return 0; } @@ -258,11 +259,6 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { return factory; } - @Override - public Packet getAddEntityPacket() { - return new ClientboundAddEntityPacket(this, Block.getId(this.getBlockState())); - } - public BlockState getBlockState() { return blockState != null ? blockState : BlockRegistry.MAGE_BLOCK.get().defaultBlockState(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimHeadSummon.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimHeadSummon.java index dd0e88166d..5517775cf9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimHeadSummon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimHeadSummon.java @@ -17,7 +17,7 @@ import net.neoforged.neoforge.entity.IEntityAdditionalSpawnData; import net.neoforged.neoforge.network.NetworkHooks; -public class AnimHeadSummon extends AnimBlockSummon implements IEntityAdditionalSpawnData { +public class AnimHeadSummon extends AnimBlockSummon { public CompoundTag head_data = new CompoundTag(); @@ -50,12 +50,6 @@ public void returnToFallingBlock(BlockState blockState) { level.addFreshEntity(fallingBlock); } - - @Override - public Packet getAddEntityPacket() { - return NetworkHooks.getEntitySpawningPacket(this); - } - @Override public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java index edb6232d16..e68a6b8403 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java @@ -129,11 +129,11 @@ public static boolean canFall(Level level, BlockPos pos, Entity owner, SpellStat EnchantedFallingBlock fallingblockentity; if (level.getBlockEntity(pos) instanceof MageBlockTile tile) { fallingblockentity = new EnchantedMageblock(level, pos.getX() + 0.5D, pos.getY(), pos.getZ() + 0.5D, blockState.hasProperty(BlockStateProperties.WATERLOGGED) ? blockState.setValue(BlockStateProperties.WATERLOGGED, Boolean.FALSE) : blockState); - fallingblockentity.blockData = tile.saveWithoutMetadata(); + fallingblockentity.blockData = tile.saveWithoutMetadata(level.registryAccess()); fallingblockentity.setColor(tile.color); } else if (level.getBlockEntity(pos) instanceof SkullBlockEntity tile) { fallingblockentity = new EnchantedSkull(level, pos.getX() + 0.5D, pos.getY(), pos.getZ() + 0.5D, blockState.hasProperty(BlockStateProperties.WATERLOGGED) ? blockState.setValue(BlockStateProperties.WATERLOGGED, Boolean.FALSE) : blockState); - fallingblockentity.blockData = tile.saveWithoutMetadata(); + fallingblockentity.blockData = tile.saveWithoutMetadata(level.registryAccess()); } else { fallingblockentity = new EnchantedFallingBlock(level, pos.getX() + 0.5D, pos.getY(), pos.getZ() + 0.5D, blockState.hasProperty(BlockStateProperties.WATERLOGGED) ? blockState.setValue(BlockStateProperties.WATERLOGGED, Boolean.FALSE) : blockState); } @@ -338,7 +338,7 @@ protected void onHitEntity(EntityHitResult pResult) { boolean isEnderman = entity.getType() == EntityType.ENDERMAN; int k = entity.getRemainingFireTicks(); if (this.isOnFire() && !isEnderman) { - entity.setSecondsOnFire(5); + entity.igniteForTicks(5); } if (entity.hurt(damagesource, (float) i)) { @@ -386,10 +386,6 @@ public boolean onlyOpCanSetNbt() { return true; } - public Packet getAddEntityPacket() { - return new ClientboundAddEntityPacket(this, Block.getId(this.getBlockState())); - } - public void recreateFromPacket(ClientboundAddEntityPacket pPacket) { super.recreateFromPacket(pPacket); this.blockState = Block.stateById(pPacket.getData()); @@ -455,12 +451,6 @@ public void addAdditionalSaveData(CompoundTag pCompound) { } } - @Override - public void load(CompoundTag compound) { - super.load(compound); - } - - /** * (abstract) Protected helper method to read subclass entity data from NBT. */ @@ -515,9 +505,10 @@ protected Entity.MovementEmission getMovementEmission() { return Entity.MovementEmission.NONE; } - public void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(DATA_START_POS, BlockPos.ZERO); + @Override + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(DATA_START_POS, BlockPos.ZERO); } /** diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java index c8d736f12d..a17fd44fa2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java @@ -17,7 +17,7 @@ import net.neoforged.neoforge.network.NetworkHooks; import org.jetbrains.annotations.Nullable; -public class EnchantedSkull extends EnchantedFallingBlock implements IEntityAdditionalSpawnData { +public class EnchantedSkull extends EnchantedFallingBlock { public EnchantedSkull(EntityType p_31950_, Level p_31951_) { super(p_31950_, p_31951_); } @@ -35,11 +35,6 @@ public EntityType getType() { return ModEntities.ENCHANTED_HEAD_BLOCK.get(); } - @Override - public Packet getAddEntityPacket() { - return NetworkHooks.getEntitySpawningPacket(this); - } - @Nullable @Override public ItemEntity spawnAtLocation(ItemStack pStack) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityAllyVex.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityAllyVex.java index b41614a22f..d53cbdb590 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityAllyVex.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityAllyVex.java @@ -6,6 +6,7 @@ import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.players.OldUsersConverter; import net.minecraft.sounds.SoundEvents; import net.minecraft.util.Mth; @@ -27,7 +28,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.phys.Vec3; -import net.minecraft.world.scores.Team; +import net.minecraft.world.scores.PlayerTeam; import javax.annotation.Nullable; import java.util.EnumSet; @@ -60,10 +61,11 @@ public EntityType getType() { } @Nullable - public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType pSpawnType, @org.jetbrains.annotations.Nullable SpawnGroupData pSpawnGroupData) { this.populateDefaultEquipmentSlots(worldIn.getRandom(), difficultyIn); - this.populateDefaultEquipmentEnchantments(getRandom(), difficultyIn); - return super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); + this.populateDefaultEquipmentEnchantments(worldIn, getRandom(), difficultyIn); + return super.finalizeSpawn(worldIn, difficultyIn, pSpawnType, pSpawnGroupData); } /** @@ -187,9 +189,8 @@ public void tick() { } } - @Override - public int getExperienceReward() { + protected int getBaseExperienceReward() { return 0; } @@ -233,7 +234,8 @@ public LivingEntity getOwnerFromID() { } } - public Team getTeam() { + @Override + public PlayerTeam getTeam() { if (this.getOwnerAlt() != null) { LivingEntity livingentity = this.getOwnerAlt(); if (livingentity != null) { @@ -253,11 +255,14 @@ public boolean isAlliedTo(Entity pEntity) { return super.isAlliedTo(pEntity); } - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(OWNER_UNIQUE_ID, Optional.empty()); + + @Override + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(OWNER_UNIQUE_ID, Optional.empty()); } + @Override public void addAdditionalSaveData(CompoundTag compound) { super.addAdditionalSaveData(compound); if (this.boundOrigin != null) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java index 0bac05d6d0..1e37c40d29 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java @@ -312,15 +312,16 @@ public void die(DamageSource source) { } public static AttributeSupplier.Builder attributes() { - return Mob.createMobAttributes().add(Attributes.FLYING_SPEED, Attributes.FLYING_SPEED.getDefaultValue()) + return Mob.createMobAttributes().add(Attributes.FLYING_SPEED, Attributes.FLYING_SPEED.value().getDefaultValue()) .add(Attributes.MAX_HEALTH, 6.0D) .add(Attributes.MOVEMENT_SPEED, 0.3D); } - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(HELD_ITEM, ItemStack.EMPTY); - this.entityData.define(COLOR, "blue"); + @Override + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(HELD_ITEM, ItemStack.EMPTY); + pBuilder.define(COLOR, "blue"); } public static String[] COLORS = {"purple", "green", "blue", "black", "red", "white"}; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java index 28854ec487..89fc128185 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java @@ -26,14 +26,6 @@ public class EntityChimeraProjectile extends AbstractArrow implements GeoEntity { int groundMax; - public EntityChimeraProjectile(double p_i48547_2_, double p_i48547_4_, double p_i48547_6_, Level p_i48547_8_) { - super(ModEntities.ENTITY_CHIMERA_SPIKE.get(), p_i48547_2_, p_i48547_4_, p_i48547_6_, p_i48547_8_); - } - - public EntityChimeraProjectile(LivingEntity p_i48548_2_, Level p_i48548_3_) { - super(ModEntities.ENTITY_CHIMERA_SPIKE.get(), p_i48548_2_, p_i48548_3_); - } - public EntityChimeraProjectile(Level world) { super(ModEntities.ENTITY_CHIMERA_SPIKE.get(), world); } @@ -78,7 +70,7 @@ protected void onHitEntity(EntityHitResult rayTraceResult) { boolean isEnderman = entity.getType() == EntityType.ENDERMAN; int k = entity.getRemainingFireTicks(); if (this.isOnFire() && !isEnderman) { - entity.setSecondsOnFire(5); + entity.igniteForSeconds(5); } if (entity.hurt(damagesource, damage)) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java index a4166f2a8f..64c4ddbe00 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java @@ -81,7 +81,7 @@ public class EntityDrygmy extends PathfinderMob implements GeoEntity, ITooltipPr public static String[] COLORS = {"brown", "cyan", "orange"}; @Override - public int getExperienceReward() { + protected int getBaseExperienceReward() { return 0; } @@ -208,14 +208,14 @@ public List getGoals() { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(CHANNELING, false); - this.entityData.define(TAMED, false); - this.entityData.define(HOLDING_ESSENCE, false); - this.entityData.define(CHANNELING_ENTITY, -1); - this.entityData.define(BEING_TAMED, false); - this.entityData.define(COLOR, "brown"); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(CHANNELING, false); + pBuilder.define(TAMED, false); + pBuilder.define(HOLDING_ESSENCE, false); + pBuilder.define(CHANNELING_ENTITY, -1); + pBuilder.define(BEING_TAMED, false); + pBuilder.define(COLOR, "brown"); } public boolean holdingEssence() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDummy.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDummy.java index 337bf00976..726a097e67 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDummy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDummy.java @@ -62,9 +62,9 @@ protected void registerGoals() { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(OWNER_UUID, Optional.of(Util.NIL_UUID)); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(OWNER_UUID, Optional.of(Util.NIL_UUID)); } @Override @@ -123,7 +123,7 @@ public void setItemSlot(EquipmentSlot p_184201_1_, ItemStack p_184201_2_) { public ResourceLocation getSkinTextureLocation() { PlayerInfo networkplayerinfo = this.getPlayerInfo(); - return networkplayerinfo == null ? DefaultPlayerSkin.getDefaultSkin(getOwnerUUID()) : networkplayerinfo.getSkinLocation(); + return networkplayerinfo == null ? DefaultPlayerSkin.getDefaultTexture() : networkplayerinfo.getSkin().texture(); } @Nullable diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java index 32193a0546..e1b3e9b7e2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java @@ -13,8 +13,6 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; @@ -22,8 +20,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.network.NetworkHooks; -import net.neoforged.neoforge.network.PlayMessages; public class EntityFlyingItem extends ColoredProjectile { public static final EntityDataAccessor to = SynchedEntityData.defineId(EntityFlyingItem.class, DataSerializers.VEC.get()); @@ -218,28 +214,18 @@ public ItemStack getStack() { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(HELD_ITEM, ItemStack.EMPTY); - this.entityData.define(OFFSET, 0.0f); - this.entityData.define(DIDOFFSET, false); - this.entityData.define(to, new Vec3(0, 0, 0)); - this.entityData.define(from, new Vec3(0, 0, 0)); - this.entityData.define(SPAWN_TOUCH, true); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(HELD_ITEM, ItemStack.EMPTY); + pBuilder.define(OFFSET, 0.0f); + pBuilder.define(DIDOFFSET, false); + pBuilder.define(to, new Vec3(0, 0, 0)); + pBuilder.define(from, new Vec3(0, 0, 0)); + pBuilder.define(SPAWN_TOUCH, true); } - @Override public EntityType getType() { return ModEntities.ENTITY_FLYING_ITEM.get(); } - - @Override - public Packet getAddEntityPacket() { - return NetworkHooks.getEntitySpawningPacket(this); - } - - public EntityFlyingItem(PlayMessages.SpawnEntity packet, Level world) { - super(ModEntities.ENTITY_FLYING_ITEM.get(), world); - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java index b2715b08eb..acfa25c33f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java @@ -42,7 +42,7 @@ import java.util.HashSet; import java.util.Set; -public class EntityProjectileSpell extends ColoredProjectile implements IEntityAdditionalSpawnData { +public class EntityProjectileSpell extends ColoredProjectile { public int age; public SpellResolver spellResolver; @@ -330,7 +330,7 @@ protected void onHit(HitResult result) { } if (state.is(BlockTags.PORTALS)) { - state.getBlock().entityInside(state, level, blockraytraceresult.getBlockPos(), this); + state.entityInside(level, blockraytraceresult.getBlockPos(), this); return; } @@ -362,11 +362,6 @@ protected boolean canHitEntity(Entity entity) { return super.canHitEntity(entity) || entity.getType().is(EntityTags.SPELL_CAN_HIT); } - @Override - public Packet getAddEntityPacket() { - return NetworkHooks.getEntitySpawningPacket(this); - } - public void writeSpawnData(FriendlyByteBuf buffer) { buffer.writeBoolean(isNoGravity); buffer.writeInt(numSensitive); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java index ec03c0aff5..3decaeff6a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java @@ -9,9 +9,10 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.TickEvent; import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; +import net.neoforged.neoforge.event.tick.PlayerTickEvent; @EventBusSubscriber(modid = ArsNouveau.MODID) public class GravityEffect extends MobEffect { @@ -49,15 +50,15 @@ public void applyEffectTick(LivingEntity livingEntity, int p_76394_2_) { // Disable flight here because items tick after our potions @SubscribeEvent - public static void entityTick(TickEvent.PlayerTickEvent e) { - if (e.phase == TickEvent.Phase.END && e.player.hasEffect(ModPotions.GRAVITY_EFFECT.get()) && !e.player.onGround() && !e.player.isCreative()) { - e.player.abilities.flying = false; + public static void entityTick(PlayerTickEvent.Post e) { + if ( e.getEntity().hasEffect(ModPotions.GRAVITY_EFFECT) && !e.getEntity().onGround() && !e.getEntity().isCreative()) { + e.getEntity().abilities.flying = false; } } @SubscribeEvent public static void entityHurt(LivingHurtEvent e) { - if (e.getSource().is(DamageTypes.FALL) && e.getEntity().hasEffect(ModPotions.GRAVITY_EFFECT.get())) { + if (e.getSource().is(DamageTypes.FALL) && e.getEntity().hasEffect(ModPotions.GRAVITY_EFFECT)) { e.setAmount(e.getAmount() * 2.0f); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java index 10db4579f0..3fa2797a34 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java @@ -83,7 +83,7 @@ public void doStrip(BlockPos p, BlockHitResult rayTraceResult, Level world,@NotN // TODO Replace with AN shears if (dupeCheck(world, p)) return; entity.setPos(p.getX(), p.getY(), p.getZ()); - world.getBlockState(p).use(world, entity, InteractionHand.MAIN_HAND, rayTraceResult); + world.getBlockState(p).useItemOn(axe, world, entity, InteractionHand.MAIN_HAND, rayTraceResult); axe.useOn(new UseOnContext(entity, InteractionHand.MAIN_HAND, rayTraceResult)); } @@ -99,7 +99,7 @@ public void doShear(BlockPos p, BlockHitResult rayTraceResult, Level world,@NotN // TODO Replace with AN shears if (dupeCheck(world, p)) return; entity.setPos(p.getX(), p.getY(), p.getZ()); - world.getBlockState(p).use(world, entity, InteractionHand.MAIN_HAND, rayTraceResult); + world.getBlockState(p).useItemOn(shears, world, entity, InteractionHand.MAIN_HAND, rayTraceResult); shears.useOn(new UseOnContext(entity, InteractionHand.MAIN_HAND, rayTraceResult)); } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 75affa5641..4e29c4d2d3 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1,4 +1,4 @@ -public-f net.minecraft.world.entity.ai.goal.GoalSelector f_25345_ +public-f net.minecraft.world.entity.ai.goal.GoalSelector availableGoals public net.minecraft.world.entity.Entity position public net.minecraft.client.gui.components.EditBox * public net.minecraft.world.entity.projectile.AbstractArrow knockbackStrength # knockbackStrength From 148fa254061b7aa1eb8865afdeef95d9ed7b10fd Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 22 Jun 2024 11:53:09 -0500 Subject: [PATCH 008/363] block use, geo bone --- .../EnchantmentRecipe.java | 3 +- .../renderer/entity/AnimBlockRenderer.java | 4 +- .../client/renderer/entity/BookwyrmModel.java | 4 +- .../client/renderer/entity/DrygmyModel.java | 4 +- .../renderer/entity/GiftStarbyModel.java | 4 +- .../client/renderer/entity/LilyModel.java | 4 +- .../renderer/entity/StarbuncleModel.java | 4 +- .../renderer/entity/WealdWalkerModel.java | 8 +-- .../renderer/entity/WhirlisprigModel.java | 5 +- .../renderer/entity/WildenChimeraModel.java | 4 +- .../renderer/entity/WildenGuardianModel.java | 4 +- .../renderer/entity/WildenHunterModel.java | 4 +- .../renderer/entity/WildenStalkerModel.java | 4 +- .../client/renderer/entity/WixieModel.java | 4 +- .../entity/familiar/FamiliarStarbyModel.java | 4 +- .../familiar/FamiliarWhirlisprigRenderer.java | 6 +- .../renderer/item/SpellBowRenderer.java | 7 +- .../renderer/item/SpellCrossbowRenderer.java | 8 +-- .../tile/EnchantingApparatusRenderer.java | 4 +- .../renderer/tile/ScryerOculusRenderer.java | 4 +- .../common/armor/AnimatedMagicArmor.java | 5 +- .../arsnouveau/common/block/MirrorWeave.java | 12 ++-- .../common/block/RepositoryBlock.java | 12 ++-- .../common/block/RitualBrazierBlock.java | 7 +- .../common/block/RotatingSpellTurret.java | 10 +-- .../arsnouveau/common/block/RuneBlock.java | 14 ++-- .../arsnouveau/common/block/ScribesBlock.java | 17 ++--- .../common/block/ScryerCrystal.java | 11 +-- .../common/block/ScryersOculus.java | 5 +- .../common/block/SourceBerryBush.java | 9 +-- .../arsnouveau/common/block/SpellSensor.java | 9 +-- .../common/block/TemporaryBlock.java | 7 +- .../common/block/TimerSpellTurret.java | 10 +-- .../common/block/WixieCauldron.java | 13 ++-- .../common/block/tile/SingleItemTile.java | 4 +- .../common/enchantment/ManaBoost.java | 32 ++++----- .../enchantment/ManaRegenEnchantment.java | 33 ++++----- .../enchantment/ReactiveEnchantment.java | 72 +++++++++---------- .../common/entity/AnimHeadSummon.java | 2 - .../common/entity/EnchantedSkull.java | 2 - .../common/entity/EntitySpellArrow.java | 20 ++---- .../pathfinding/pathjobs/AbstractPathJob.java | 9 +-- .../common/util/SpellPartConfigUtil.java | 4 +- .../setup/registry/BlockRegistry.java | 4 +- .../setup/registry/EnchantmentRegistry.java | 3 +- .../setup/registry/ItemsRegistry.java | 7 +- .../arsnouveau/setup/registry/ModPotions.java | 15 ++-- .../setup/registry/RegistryHelper.java | 2 +- 48 files changed, 215 insertions(+), 228 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java index 6cd31d5a15..6eafcbadab 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java @@ -20,6 +20,7 @@ import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.ItemEnchantments; import javax.annotation.Nullable; import java.util.ArrayList; @@ -95,7 +96,7 @@ public boolean doesReagentMatch(ItemStack stack) { @Override public ItemStack assemble(EnchantingApparatusTile inv, RegistryAccess p_267165_) { ItemStack stack = inv.getStack().getItem() == Items.BOOK ? new ItemStack(Items.ENCHANTED_BOOK) : inv.getStack().copy(); - Map enchantments = EnchantmentHelper.getEnchantments(stack); + ItemEnchantments enchantments = EnchantmentHelper.getEnchantmentsForCrafting(stack); enchantments.put(enchantment, enchantLevel); EnchantmentHelper.setEnchantments(enchantments, stack); return stack; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java index 54ae3371ed..69dd7805b6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java @@ -20,7 +20,7 @@ import net.neoforged.neoforge.client.model.data.ModelData; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.util.Color; import software.bernie.geckolib.model.GeoModel; @@ -58,7 +58,7 @@ public ResourceLocation getAnimationResource(BOBBY animatable) { @Override public void setCustomAnimations(BOBBY animatable, long instanceId, AnimationState customPredicate) { super.setCustomAnimations(animatable, instanceId, customPredicate); - CoreGeoBone head = this.getAnimationProcessor().getBone("block"); + GeoBone head = this.getAnimationProcessor().getBone("block"); head.setHidden(!(animatable.getBlockState().getBlock() instanceof MageBlock)); } }); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmModel.java index 8d6e988b0c..914a46b7e2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmModel.java @@ -5,7 +5,7 @@ import net.minecraft.world.entity.LivingEntity; import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.animatable.GeoAnimatable; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -22,7 +22,7 @@ public class BookwyrmModel extends GeoMo public void setCustomAnimations(T entity, long uniqueID, @Nullable AnimationState customPredicate) { super.setCustomAnimations(entity, uniqueID, customPredicate); - CoreGeoBone head = this.getAnimationProcessor().getBone("head"); + GeoBone head = this.getAnimationProcessor().getBone("head"); EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); head.setRotX(extraData.headPitch() * 0.010453292F); head.setRotY(extraData.netHeadYaw() * 0.015453292F); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/DrygmyModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/DrygmyModel.java index 76941a5ca4..86a6dffe32 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/DrygmyModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/DrygmyModel.java @@ -5,7 +5,7 @@ import net.minecraft.world.entity.LivingEntity; import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.animatable.GeoAnimatable; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -21,7 +21,7 @@ public class DrygmyModel extends GeoMode @Override public void setCustomAnimations(T entity, long uniqueID, @Nullable AnimationState customPredicate) { super.setCustomAnimations(entity, uniqueID, customPredicate); - CoreGeoBone head = this.getAnimationProcessor().getBone("head"); + GeoBone head = this.getAnimationProcessor().getBone("head"); EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); head.setRotX(extraData.headPitch() * 0.017453292F); head.setRotY(extraData.netHeadYaw() * 0.017453292F); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GiftStarbyModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GiftStarbyModel.java index 3f7ce1d0f7..8b9c1dcb91 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GiftStarbyModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GiftStarbyModel.java @@ -4,7 +4,7 @@ import com.hollingsworth.arsnouveau.common.entity.GiftStarbuncle; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -24,7 +24,7 @@ public void setCustomAnimations(GiftStarbuncle entity, long uniqueID, @Nullable if (customPredicate == null) return; - CoreGeoBone head = this.getAnimationProcessor().getBone("head"); + GeoBone head = this.getAnimationProcessor().getBone("head"); EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); head.setRotX(extraData.headPitch() * 0.017453292F); head.setRotY(extraData.netHeadYaw() * 0.017453292F); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyModel.java index 9b511c8597..63a3915284 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyModel.java @@ -4,7 +4,7 @@ import com.hollingsworth.arsnouveau.common.entity.Lily; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -16,7 +16,7 @@ public class LilyModel extends GeoModel { @Override public void setCustomAnimations(Lily entity, long uniqueID, @Nullable AnimationState customPredicate) { super.setCustomAnimations(entity, uniqueID, customPredicate); - CoreGeoBone head = this.getAnimationProcessor().getBone("head"); + GeoBone head = this.getAnimationProcessor().getBone("head"); EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); head.setRotX(extraData.headPitch() * 0.017453292F); head.setRotY(extraData.netHeadYaw() * 0.017453292F); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java index 8c02489586..15e9366e07 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java @@ -4,7 +4,7 @@ import com.hollingsworth.arsnouveau.common.entity.Starbuncle; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -22,7 +22,7 @@ public void setCustomAnimations(Starbuncle entity, long uniqueID, @Nullable Anim return; this.getBone("basket").get().setHidden(!entity.isTamed()); - CoreGeoBone head = this.getAnimationProcessor().getBone("head"); + GeoBone head = this.getAnimationProcessor().getBone("head"); EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); head.setRotX(extraData.headPitch() * 0.017453292F); head.setRotY(extraData.netHeadYaw() * 0.017453292F); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WealdWalkerModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WealdWalkerModel.java index 2e734a591b..8305ff1abf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WealdWalkerModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WealdWalkerModel.java @@ -5,7 +5,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -24,13 +24,13 @@ public WealdWalkerModel(String type) { public void setCustomAnimations(W entity, long uniqueID, @Nullable AnimationState customPredicate) { super.setCustomAnimations(entity, uniqueID, customPredicate); - CoreGeoBone head = this.getAnimationProcessor().getBone("head"); + GeoBone head = this.getAnimationProcessor().getBone("head"); EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); head.setRotX(extraData.headPitch() * 0.010453292F); head.setRotY(extraData.netHeadYaw() * 0.015453292F); if (entity.getEntityData().get(WealdWalker.CASTING)) { - CoreGeoBone frontLeftLeg = this.getAnimationProcessor().getBone("leg_right"); - CoreGeoBone frontRightLeg = this.getAnimationProcessor().getBone("leg_left"); + GeoBone frontLeftLeg = this.getAnimationProcessor().getBone("leg_right"); + GeoBone frontRightLeg = this.getAnimationProcessor().getBone("leg_left"); frontLeftLeg.setRotX(Mth.cos(entity.walkAnimation.position() * 0.6662F) * 1.4F * entity.walkAnimation.speed()); frontRightLeg.setRotX(Mth.cos(entity.walkAnimation.position() * 0.6662F + (float) Math.PI) * 1.4F * entity.walkAnimation.speed()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WhirlisprigModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WhirlisprigModel.java index 6a50a587b2..b4aabb512e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WhirlisprigModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WhirlisprigModel.java @@ -3,9 +3,10 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; +import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.animatable.GeoAnimatable; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -17,7 +18,7 @@ public class WhirlisprigModel extends Ge @Override public void setCustomAnimations(T entity, long uniqueID, @Nullable AnimationState customPredicate) { super.setCustomAnimations(entity, uniqueID, customPredicate); - CoreGeoBone head = this.getAnimationProcessor().getBone("head"); + GeoBone head = this.getAnimationProcessor().getBone("head"); EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); head.setRotX(extraData.headPitch() * 0.010453292F); head.setRotY(extraData.netHeadYaw() * 0.015453292F); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenChimeraModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenChimeraModel.java index af6545b19a..569f1e7c06 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenChimeraModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenChimeraModel.java @@ -4,7 +4,7 @@ import com.hollingsworth.arsnouveau.common.entity.WildenChimera; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -23,7 +23,7 @@ public class WildenChimeraModel extends GeoModel { public void setCustomAnimations(WildenChimera entity, long uniqueID, @Nullable AnimationState customPredicate) { super.setCustomAnimations(entity, uniqueID, customPredicate); - CoreGeoBone head = this.getAnimationProcessor().getBone("head"); + GeoBone head = this.getAnimationProcessor().getBone("head"); EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); if(!entity.isFlying()){ head.setRotY(extraData.netHeadYaw() * 0.012453292F); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenGuardianModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenGuardianModel.java index 5633c87396..c5a8fa6d17 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenGuardianModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenGuardianModel.java @@ -4,7 +4,7 @@ import com.hollingsworth.arsnouveau.common.entity.WildenGuardian; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -19,7 +19,7 @@ public class WildenGuardianModel extends GeoModel { @Override public void setCustomAnimations(WildenGuardian entity, long uniqueID, AnimationState customPredicate) { super.setCustomAnimations(entity, uniqueID, customPredicate); - CoreGeoBone head = this.getAnimationProcessor().getBone("head"); + GeoBone head = this.getAnimationProcessor().getBone("head"); EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); head.setRotX(extraData.headPitch() * 0.017453292F); head.setRotY(extraData.netHeadYaw() * 0.017453292F); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenHunterModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenHunterModel.java index 1db358aca1..22ff9c769f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenHunterModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenHunterModel.java @@ -4,7 +4,7 @@ import com.hollingsworth.arsnouveau.common.entity.WildenHunter; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -14,7 +14,7 @@ public class WildenHunterModel extends GeoModel { @Override public void setCustomAnimations(WildenHunter entity, long uniqueID, AnimationState customPredicate) { super.setCustomAnimations(entity, uniqueID, customPredicate); - CoreGeoBone head = this.getAnimationProcessor().getBone("head"); + GeoBone head = this.getAnimationProcessor().getBone("head"); EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); head.setRotX(extraData.headPitch() * 0.017453292F); head.setRotY(extraData.netHeadYaw() * 0.017453292F); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenStalkerModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenStalkerModel.java index 275bfe349b..c547c27137 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenStalkerModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenStalkerModel.java @@ -4,7 +4,7 @@ import com.hollingsworth.arsnouveau.common.entity.WildenStalker; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -16,7 +16,7 @@ public class WildenStalkerModel extends GeoModel { @Override public void setCustomAnimations(WildenStalker entity, long uniqueID, @Nullable AnimationState customPredicate) { super.setCustomAnimations(entity, uniqueID, customPredicate); - CoreGeoBone head = this.getAnimationProcessor().getBone("head"); + GeoBone head = this.getAnimationProcessor().getBone("head"); EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); head.setRotX(extraData.headPitch() * 0.017453292F); head.setRotY(extraData.netHeadYaw() * 0.017453292F); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WixieModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WixieModel.java index 0f59089bf0..b512374f27 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WixieModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WixieModel.java @@ -5,7 +5,7 @@ import net.minecraft.world.entity.LivingEntity; import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.animatable.GeoAnimatable; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -19,7 +19,7 @@ public class WixieModel extends GeoModel @Override public void setCustomAnimations(T entity, long uniqueID, @Nullable AnimationState customPredicate) { super.setCustomAnimations(entity, uniqueID, customPredicate); - CoreGeoBone head = this.getAnimationProcessor().getBone("head"); + GeoBone head = this.getAnimationProcessor().getBone("head"); EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); head.setRotX(extraData.headPitch() * 0.010453292F); head.setRotY(extraData.netHeadYaw() * 0.015453292F); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarStarbyModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarStarbyModel.java index e9bf5b17dc..46c8f4ce55 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarStarbyModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarStarbyModel.java @@ -3,8 +3,8 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.entity.familiar.FamiliarStarbuncle; import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.animatable.model.CoreGeoBone; import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -16,7 +16,7 @@ public class FamiliarStarbyModel extends GeoModel< @Override public void setCustomAnimations(T entity, long uniqueID, @Nullable AnimationState customPredicate) { super.setCustomAnimations(entity, uniqueID, customPredicate); - CoreGeoBone head = this.getAnimationProcessor().getBone("head"); + GeoBone head = this.getAnimationProcessor().getBone("head"); EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); head.setRotX(extraData.headPitch() * 0.017453292F); head.setRotY(extraData.netHeadYaw() * 0.017453292F); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java index 82080be314..b7ecafb265 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java @@ -11,7 +11,7 @@ import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + import java.util.Random; @@ -31,8 +31,8 @@ public void render(T entityIn, float entityYaw, float partialTicks, PoseStack ma Random rand = ParticleUtil.r; Vec3 particlePos = entityIn.position(); - CoreGeoBone sylph = getGeoModel().getBone("sylph").get(); - CoreGeoBone propellers = getGeoModel().getBone("propellers").get(); + GeoBone sylph = getGeoModel().getBone("sylph").get(); + GeoBone propellers = getGeoModel().getBone("propellers").get(); float offsetY = sylph.getPosY() / 9f; float roteAngle = propellers.getRotY() / 4; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java index dfb676ce42..5454ac2914 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java @@ -19,7 +19,6 @@ import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.animatable.model.CoreGeoBone; import software.bernie.geckolib.util.Color; public class SpellBowRenderer extends FixedGeoItemRenderer { @@ -84,9 +83,9 @@ public void renderByItem(ItemStack itemStack, ItemDisplayContext transformType, @Override public void renderFinal(PoseStack poseStack, SpellBow animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTicks, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - CoreGeoBone top = model.getBone("bow_top").get(); - CoreGeoBone gem = model.getBone("gem").get(); - CoreGeoBone bottom = model.getBone("bow_bot").get(); + GeoBone top = model.getBone("bow_top").get(); + GeoBone gem = model.getBone("gem").get(); + GeoBone bottom = model.getBone("bow_bot").get(); double ticks = animatable.getTick(animatable); float outerAngle = (float) (((ticks + partialTicks) / 10.0f) % 360); top.setRotZ((float) Math.toRadians(-10.0)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java index e4cee65e61..0e351cdc51 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java @@ -19,7 +19,7 @@ import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + import software.bernie.geckolib.util.Color; public class SpellCrossbowRenderer extends FixedGeoItemRenderer { @@ -39,9 +39,9 @@ public void renderRecursively(PoseStack poseStack, SpellCrossbow animatable, Geo @Override public void renderFinal(PoseStack poseStack, SpellCrossbow animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTicks, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - CoreGeoBone right = model.getBone("bow_right").get(); - CoreGeoBone gem = model.getBone("gem").get(); - CoreGeoBone left = model.getBone("bow_left").get(); + GeoBone right = model.getBone("bow_right").get(); + GeoBone gem = model.getBone("gem").get(); + GeoBone left = model.getBone("bow_left").get(); double ticks = animatable.getTick(animatable); float outerAngle = (float) (((ticks + partialTicks) / 10.0f) % 360); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantingApparatusRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantingApparatusRenderer.java index 624ca28f04..4715e4d301 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantingApparatusRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantingApparatusRenderer.java @@ -11,7 +11,7 @@ import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import software.bernie.geckolib.cache.object.BakedGeoModel; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + import software.bernie.geckolib.util.RenderUtil; @@ -24,7 +24,7 @@ public EnchantingApparatusRenderer(BlockEntityRendererProvider.Context p_i226006 @Override public void renderFinal(PoseStack stack, EnchantingApparatusTile tile, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { super.renderFinal(stack, tile, model, bufferSource, buffer, partialTick, packedLight, packedOverlay, red, green, blue, alpha); - CoreGeoBone frame = model.getBone("frame_all").orElse(null); + GeoBone frame = model.getBone("frame_all").orElse(null); if (frame != null && tile.getStack() != null) { double x = tile.getBlockPos().getX(); double y = tile.getBlockPos().getY(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScryerOculusRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScryerOculusRenderer.java index 9fe937cb19..6b41efce4e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScryerOculusRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScryerOculusRenderer.java @@ -10,7 +10,7 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.util.Mth; import software.bernie.geckolib.cache.object.BakedGeoModel; -import software.bernie.geckolib.animatable.model.CoreGeoBone; + public class ScryerOculusRenderer extends ArsGeoBlockRenderer { @@ -22,7 +22,7 @@ public ScryerOculusRenderer(BlockEntityRendererProvider.Context rendererDispatch @Override public void actuallyRender(PoseStack poseStack, ScryersOculusTile pBlockEntity, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - CoreGeoBone eye = this.getGeoModel().getBone("eye").orElse(null); + GeoBone eye = this.getGeoModel().getBone("eye").orElse(null); if (eye == null) return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java index 4782325093..086bf4e80f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java @@ -15,6 +15,7 @@ import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.ChatFormatting; import net.minecraft.client.model.HumanoidModel; +import net.minecraft.core.Holder; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; @@ -44,12 +45,12 @@ public class AnimatedMagicArmor extends ArmorItem implements IManaEquipment, IDyeable, GeoItem, IVariantColorProvider { public GeoModel model; - public AnimatedMagicArmor(ArmorMaterial materialIn, ArmorItem.Type slot, Properties builder, GeoModel model) { + public AnimatedMagicArmor(Holder materialIn, ArmorItem.Type slot, Properties builder, GeoModel model) { super(materialIn, slot, builder); this.model = model; } - public AnimatedMagicArmor(ArmorMaterial materialIn, ArmorItem.Type slot, GeoModel model) { + public AnimatedMagicArmor(Holder materialIn, ArmorItem.Type slot, GeoModel model) { this(materialIn, slot, ItemsRegistry.defaultItemProperties().stacksTo(1), model); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/MirrorWeave.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/MirrorWeave.java index 793f69e1f2..aa954cf896 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/MirrorWeave.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/MirrorWeave.java @@ -7,6 +7,7 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; @@ -40,25 +41,24 @@ public MirrorWeave(){ } @Override - public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + public ItemInteractionResult useItemOn(ItemStack stack, BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { if (pLevel.isClientSide || pHand != InteractionHand.MAIN_HAND) { - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } MirrorWeaveTile tile = (MirrorWeaveTile) pLevel.getBlockEntity(pPos); if(tile != null){ - ItemStack stack = pPlayer.getItemInHand(pHand); if(stack.getItem() instanceof BlockItem blockItem && !(blockItem.getBlock() instanceof EntityBlock)){ if(tile.mimicState.is(blockItem.getBlock())){ - return super.use(pState, pLevel, pPos, pPlayer, pHand, pHit); + return super.useItemOn(stack, pState, pLevel, pPos, pPlayer, pHand, pHit); } tile.nextState = blockItem.getBlock().getStateForPlacement(new BlockPlaceContext(pLevel, pPlayer, pHand, stack, pHit)); this.setMimicState(pLevel, pPos, !pPlayer.isShiftKeyDown()); - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } } - return super.use(pState, pLevel, pPos, pPlayer, pHand, pHit); + return super.useItemOn(stack,pState, pLevel, pPos, pPlayer, pHand, pHit); } public void setMimicState(Level level, BlockPos pos, boolean updateNeighbors) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RepositoryBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RepositoryBlock.java index 0bc9ecb28b..de56a40404 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RepositoryBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RepositoryBlock.java @@ -3,10 +3,7 @@ import com.hollingsworth.arsnouveau.common.block.tile.RepositoryTile; import net.minecraft.core.BlockPos; import net.minecraft.stats.Stats; -import net.minecraft.world.Container; -import net.minecraft.world.Containers; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; +import net.minecraft.world.*; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.monster.piglin.PiglinAi; import net.minecraft.world.entity.player.Player; @@ -39,9 +36,10 @@ public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, @javax.a } } - public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + @Override + public ItemInteractionResult useItemOn(ItemStack stack, BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { if (pLevel.isClientSide) { - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } else { BlockEntity blockentity = pLevel.getBlockEntity(pPos); if (blockentity instanceof RepositoryTile tile) { @@ -50,7 +48,7 @@ public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Pla PiglinAi.angerNearbyPiglins(pPlayer, true); } - return InteractionResult.CONSUME; + return ItemInteractionResult.CONSUME; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RitualBrazierBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RitualBrazierBlock.java index acd7ab4e14..65f084e6e4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RitualBrazierBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RitualBrazierBlock.java @@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -65,9 +66,9 @@ public RitualBrazierBlock() { public static final Property LIT = BooleanProperty.create("lit"); @Override - public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { + public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { if (!(worldIn.getBlockEntity(pos) instanceof RitualBrazierTile tile) || handIn != InteractionHand.MAIN_HAND) - return super.use(state, worldIn, pos, player, handIn, hit); + return super.useItemOn(stack, state, worldIn, pos, player, handIn, hit); ItemStack heldStack = player.getMainHandItem(); if (heldStack.isEmpty() && tile.ritual != null && !tile.isRitualDone()) { tile.startRitual(player); @@ -75,7 +76,7 @@ public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Play if(!heldStack.isEmpty()){ tile.tryBurnStack(heldStack); } - return super.use(state, worldIn, pos, player, handIn, hit); + return super.useItemOn(stack, state, worldIn, pos, player, handIn, hit); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java index 84c7646b06..e844457b96 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java @@ -11,12 +11,14 @@ import com.hollingsworth.arsnouveau.common.network.PacketOneShotAnimation; import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; -import net.minecraft.core.*; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Position; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -39,14 +41,14 @@ public class RotatingSpellTurret extends BasicSpellTurret { public static HashMap ROT_TURRET_BEHAVIOR_MAP = new HashMap<>(); @Override - public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { + public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { if (player.getItemInHand(handIn).getItem() instanceof WarpScroll) { BlockPos aimPos = WarpScroll.WarpScrollData.get(player.getItemInHand(handIn)).getPos(); if (player.level().getBlockEntity(pos) instanceof RotatingTurretTile tile) { tile.aim(aimPos, player); } } - return super.use(state, worldIn, pos, player, handIn, hit); + return super.useItemOn(stack, state, worldIn, pos, player, handIn, hit); } //Direction Adjustments diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RuneBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RuneBlock.java index 9e10f273cc..9ed1a3cb48 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RuneBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RuneBlock.java @@ -17,6 +17,7 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntitySelector; import net.minecraft.world.entity.LivingEntity; @@ -70,8 +71,7 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { } @Override - public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { - ItemStack stack = player.getItemInHand(handIn); + public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { if (worldIn.getBlockEntity(pos) instanceof RuneTile runeTile) { @@ -79,23 +79,23 @@ public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Play if (runeTile.isTemporary) { runeTile.isTemporary = false; PortUtil.sendMessage(player, Component.translatable("ars_nouveau.rune.setperm")); - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } } if (!(stack.getItem() instanceof SpellParchment) || worldIn.isClientSide) - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; Spell spell = CasterUtil.getCaster(stack).getSpell(); if (spell.isEmpty()) - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; if (!(spell.recipe.get(0) instanceof MethodTouch)) { PortUtil.sendMessage(player, Component.translatable("ars_nouveau.rune.touch")); - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } runeTile.setSpell(spell); PortUtil.sendMessage(player, Component.translatable("ars_nouveau.spell_set")); } - return super.use(state, worldIn, pos, player, handIn, hit); + return super.useItemOn(stack, state, worldIn, pos, player, handIn, hit); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScribesBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScribesBlock.java index af19c8e764..b9b98392fd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScribesBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScribesBlock.java @@ -12,6 +12,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -37,27 +38,27 @@ public ScribesBlock() { @Override - public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { + public ItemInteractionResult useItemOn(ItemStack heldStack,BlockState state, Level world, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { if (world.isClientSide || handIn != InteractionHand.MAIN_HAND || !(world.getBlockEntity(pos) instanceof ScribesTile tile)) { - return InteractionResult.PASS; + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } if (player.getItemInHand(handIn).getItem() instanceof SpellBook && !player.isShiftKeyDown()) { Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new PacketOpenGlyphCraft(pos)); - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } if (state.getValue(ScribesBlock.PART) != ThreePartBlock.HEAD) { BlockEntity tileEntity = world.getBlockEntity(pos.relative(ScribesBlock.getConnectedDirection(state))); tile = tileEntity instanceof ScribesTile ? (ScribesTile) tileEntity : null; if (tile == null) - return InteractionResult.PASS; + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } if (!player.isShiftKeyDown()) { if (tile.consumeStack(player.getItemInHand(handIn))) { - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } if (!tile.getStack().isEmpty() && player.getItemInHand(handIn).isEmpty()) { @@ -79,10 +80,10 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player if (player.isShiftKeyDown()) { ItemStack stack = tile.getStack(); if(player.getItemInHand(handIn).getItem() instanceof DominionWand){ - return InteractionResult.PASS; + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } if (stack == null || stack.isEmpty()) - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; if (stack.getItem() instanceof IScribeable scribeable) { scribeable.onScribe(world, pos, player, handIn, stack); @@ -91,7 +92,7 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player } } - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryerCrystal.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryerCrystal.java index 6b4be8c12a..4ba01e3f9e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryerCrystal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryerCrystal.java @@ -1,10 +1,13 @@ package com.hollingsworth.arsnouveau.common.block; import com.hollingsworth.arsnouveau.common.block.tile.ScryerCrystalTile; -import net.minecraft.core.*; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Position; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; @@ -96,11 +99,11 @@ public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { } @Override - public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + public ItemInteractionResult useItemOn(ItemStack stack, BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { if (pLevel.getBlockEntity(pPos) instanceof ScryerCrystalTile scryerCrystalTile && pPlayer.getItemInHand(pHand).isEmpty() & pHand == InteractionHand.MAIN_HAND) { scryerCrystalTile.mountCamera(pLevel, pPos, pPlayer); } - return super.use(pState, pLevel, pPos, pPlayer, pHand, pHit); + return super.useItemOn(stack, pState, pLevel, pPos, pPlayer, pHand, pHit); } public BlockState rotate(BlockState state, Rotation rot) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java index 8a5819e9d3..6ad283c0f6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java @@ -16,6 +16,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -50,11 +51,11 @@ public RenderShape getRenderShape(BlockState pState) { } @Override - public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + public ItemInteractionResult useItemOn(ItemStack stack, BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { if (pHand == InteractionHand.MAIN_HAND && pLevel.isClientSide) { openMenu(pLevel, pPos, pPlayer); } - return super.use(pState, pLevel, pPos, pPlayer, pHand, pHit); + return super.useItemOn(stack, pState, pLevel, pPos, pPlayer, pHand, pHit); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java index 059703f7bd..08e04f6659 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java @@ -10,6 +10,7 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; @@ -91,20 +92,20 @@ public void entityInside(BlockState state, Level worldIn, BlockPos pos, Entity e } @Override - public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { + public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { int i = state.getValue(AGE); boolean flag = i == 3; if (!flag && player.getItemInHand(handIn).is(Items.BONE_MEAL)) { - return InteractionResult.PASS; + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } else if (i > 1) { int j = 1 + worldIn.random.nextInt(2); popResource(worldIn, pos, new ItemStack(BlockRegistry.SOURCEBERRY_BUSH, j + (flag ? 1 : 0))); worldIn.playSound(null, pos, SoundEvents.SWEET_BERRY_BUSH_PICK_BERRIES, SoundSource.BLOCKS, 1.0F, 0.8F + worldIn.random.nextFloat() * 0.4F); BlockState blockstate = state.setValue(AGE, 1); worldIn.setBlock(pos, blockstate, 3); - return InteractionResult.sidedSuccess(worldIn.isClientSide); + return ItemInteractionResult.sidedSuccess(worldIn.isClientSide); } else { - return super.use(state, worldIn, pos, player, handIn, hit); + return super.useItemOn(stack, state, worldIn, pos, player, handIn, hit); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/SpellSensor.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/SpellSensor.java index c91a43208d..17ba6ec10c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/SpellSensor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/SpellSensor.java @@ -9,6 +9,7 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; @@ -47,9 +48,9 @@ public int getSignal(BlockState pBlockState, BlockGetter pBlockAccess, BlockPos } @Override - public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + public ItemInteractionResult useItemOn(ItemStack stack, BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { if(pLevel.isClientSide){ - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } ItemStack heldStack = pPlayer.getItemInHand(pHand); if(heldStack.getItem() instanceof SpellParchment){ @@ -57,10 +58,10 @@ public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Pla sensorTile.parchment = heldStack.copy(); sensorTile.updateBlock(); pPlayer.sendSystemMessage(Component.translatable("ars_nouveau.sensor.set_spell")); - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } } - return super.use(pState, pLevel, pPos, pPlayer, pHand, pHit); + return super.useItemOn(stack, pState, pLevel, pPos, pPlayer, pHand, pHit); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/TemporaryBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/TemporaryBlock.java index df2aa7f5ad..fe124d69d3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/TemporaryBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/TemporaryBlock.java @@ -6,8 +6,9 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -33,8 +34,8 @@ public TemporaryBlock(BlockBehaviour.Properties properties) { @Override - public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { - return InteractionResult.SUCCESS; + public ItemInteractionResult useItemOn(ItemStack stack, BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + return ItemInteractionResult.SUCCESS; } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/TimerSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/TimerSpellTurret.java index a946f333c1..fb0d41dba5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/TimerSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/TimerSpellTurret.java @@ -5,6 +5,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; @@ -30,18 +31,17 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { @Override - public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { - ItemStack stack = player.getItemInHand(handIn); + public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { if (handIn == InteractionHand.MAIN_HAND) { if ((stack.getItem() instanceof ICasterTool) || worldIn.isClientSide) - return super.use(state, worldIn, pos, player, handIn, hit); + return super.useItemOn(stack,state, worldIn, pos, player, handIn, hit); if (worldIn.getBlockEntity(pos) instanceof TimerSpellTurretTile timerSpellTurretTile) { if (timerSpellTurretTile.isLocked) - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; timerSpellTurretTile.addTime(20 * (player.isShiftKeyDown() ? 10 : 1)); } } - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/WixieCauldron.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/WixieCauldron.java index 1de11db164..3ea57746b8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/WixieCauldron.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/WixieCauldron.java @@ -8,7 +8,9 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -29,9 +31,10 @@ public WixieCauldron() { } @Override - public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { - if (worldIn.isClientSide || handIn != InteractionHand.MAIN_HAND || !(worldIn.getBlockEntity(pos) instanceof WixieCauldronTile) || player.getMainHandItem().getItem() == ItemsRegistry.DOMINION_ROD.get()) - return InteractionResult.PASS; + public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { + if (worldIn.isClientSide || handIn != InteractionHand.MAIN_HAND || !(worldIn.getBlockEntity(pos) instanceof WixieCauldronTile) || player.getMainHandItem().getItem() == ItemsRegistry.DOMINION_ROD.get()){ + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; + } if (player.getMainHandItem().getItem() != ItemsRegistry.WIXIE_CHARM.get() && !player.getMainHandItem().isEmpty() @@ -43,9 +46,9 @@ public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Play cauldronTile.setSetStack(player.getMainHandItem().copy()); PortUtil.sendMessage(player, Component.translatable("ars_nouveau.wixie.recipe_set")); } - return InteractionResult.CONSUME; + return ItemInteractionResult.CONSUME; } - return InteractionResult.PASS; + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java index 0026de71da..fceb4b9daf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java @@ -90,8 +90,8 @@ public void setStack(ItemStack otherStack){ } @Override - protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { - super.loadAdditional(tag, pRegistries); + protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.loadAdditional(compound, pRegistries); stack = ItemStack.of((CompoundTag) compound.get("itemStack")); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ManaBoost.java b/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ManaBoost.java index 1e3e577d2c..479de57008 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ManaBoost.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ManaBoost.java @@ -1,22 +1,18 @@ package com.hollingsworth.arsnouveau.common.enchantment; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentCategory; - -public class ManaBoost extends Enchantment { - public ManaBoost() { - super(Rarity.UNCOMMON, EnchantmentCategory.ARMOR, new EquipmentSlot[]{EquipmentSlot.CHEST, EquipmentSlot.FEET, EquipmentSlot.HEAD, EquipmentSlot.LEGS}); - } - - @Override - public int getMinCost(int enchantmentLevel) { - return 1 + 11 * (enchantmentLevel - 1); - } - - @Override - public int getMaxLevel() { - return 3; - } +public class ManaBoost { +// public ManaBoost() { +// super(Rarity.UNCOMMON, EnchantmentCategory.ARMOR, new EquipmentSlot[]{EquipmentSlot.CHEST, EquipmentSlot.FEET, EquipmentSlot.HEAD, EquipmentSlot.LEGS}); +// } +// +// @Override +// public int getMinCost(int enchantmentLevel) { +// return 1 + 11 * (enchantmentLevel - 1); +// } +// +// @Override +// public int getMaxLevel() { +// return 3; +// } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ManaRegenEnchantment.java b/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ManaRegenEnchantment.java index 7bdef127b4..edd175ebdc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ManaRegenEnchantment.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ManaRegenEnchantment.java @@ -1,24 +1,21 @@ package com.hollingsworth.arsnouveau.common.enchantment; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentCategory; -public class ManaRegenEnchantment extends Enchantment { +public class ManaRegenEnchantment { - public ManaRegenEnchantment() { - super(Rarity.UNCOMMON, EnchantmentCategory.ARMOR, new EquipmentSlot[]{EquipmentSlot.CHEST, EquipmentSlot.FEET, EquipmentSlot.HEAD, EquipmentSlot.LEGS}); - } - - @Override - public int getMinCost(int enchantmentLevel) { - return 1 + 11 * (enchantmentLevel - 1); - } - - - @Override - public int getMaxLevel() { - return 3; - } +// public ManaRegenEnchantment() { +// super(Rarity.UNCOMMON, EnchantmentCategory.ARMOR, new EquipmentSlot[]{EquipmentSlot.CHEST, EquipmentSlot.FEET, EquipmentSlot.HEAD, EquipmentSlot.LEGS}); +// } +// +// @Override +// public int getMinCost(int enchantmentLevel) { +// return 1 + 11 * (enchantmentLevel - 1); +// } +// +// +// @Override +// public int getMaxLevel() { +// return 3; +// } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ReactiveEnchantment.java b/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ReactiveEnchantment.java index 6385cfef4a..eb1939ee30 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ReactiveEnchantment.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ReactiveEnchantment.java @@ -1,42 +1,38 @@ package com.hollingsworth.arsnouveau.common.enchantment; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentCategory; -public class ReactiveEnchantment extends Enchantment { - public ReactiveEnchantment() { - super(Rarity.VERY_RARE, EnchantmentCategory.WEARABLE, new EquipmentSlot[]{EquipmentSlot.CHEST, EquipmentSlot.FEET, EquipmentSlot.HEAD, EquipmentSlot.LEGS}); - } - - @Override - public int getMinCost(int enchantmentLevel) { - return 0; - } - - @Override - public int getMaxCost(int enchantmentLevel) { - return 0; - } - - @Override - public int getMaxLevel() { - return 3; - } - - @Override - public boolean canEnchant(ItemStack stack) { - return true; - } - - @Override - public boolean canApplyAtEnchantingTable(ItemStack stack) { - return false; - } - - @Override - public boolean isAllowedOnBooks() { - return false; - } +public class ReactiveEnchantment { +// public ReactiveEnchantment() { +// super(Rarity.VERY_RARE, EnchantmentCategory.WEARABLE, new EquipmentSlot[]{EquipmentSlot.CHEST, EquipmentSlot.FEET, EquipmentSlot.HEAD, EquipmentSlot.LEGS}); +// } +// +// @Override +// public int getMinCost(int enchantmentLevel) { +// return 0; +// } +// +// @Override +// public int getMaxCost(int enchantmentLevel) { +// return 0; +// } +// +// @Override +// public int getMaxLevel() { +// return 3; +// } +// +// @Override +// public boolean canEnchant(ItemStack stack) { +// return true; +// } +// +// @Override +// public boolean canApplyAtEnchantingTable(ItemStack stack) { +// return false; +// } +// +// @Override +// public boolean isAllowedOnBooks() { +// return false; +// } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimHeadSummon.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimHeadSummon.java index 5517775cf9..1b409d02bc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimHeadSummon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimHeadSummon.java @@ -14,8 +14,6 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.entity.IEntityAdditionalSpawnData; -import net.neoforged.neoforge.network.NetworkHooks; public class AnimHeadSummon extends AnimBlockSummon { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java index a17fd44fa2..6fac8d3463 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java @@ -13,8 +13,6 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.entity.IEntityAdditionalSpawnData; -import net.neoforged.neoforge.network.NetworkHooks; import org.jetbrains.annotations.Nullable; public class EnchantedSkull extends EnchantedFallingBlock { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java index a2f69e88ff..a54b2ce1cd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java @@ -27,8 +27,6 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.network.NetworkHooks; -import net.neoforged.neoforge.network.PlayMessages; public class EntitySpellArrow extends Arrow { public SpellResolver spellResolver; @@ -266,11 +264,11 @@ protected void onHitEntity(EntityHitResult p_213868_1_) { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(RED, 0); - this.entityData.define(GREEN, 0); - this.entityData.define(BLUE, 0); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(RED, 0); + pBuilder.define(GREEN, 0); + pBuilder.define(BLUE, 0); } @Override @@ -307,12 +305,4 @@ public EntityType getType() { return ModEntities.ENTITY_SPELL_ARROW.get(); } - @Override - public Packet getAddEntityPacket() { - return NetworkHooks.getEntitySpawningPacket(this); - } - - public EntitySpellArrow(PlayMessages.SpawnEntity packet, Level world) { - super(ModEntities.ENTITY_SPELL_ARROW.get(), world); - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/pathjobs/AbstractPathJob.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/pathjobs/AbstractPathJob.java index 72e16abad5..7b0f0b3783 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/pathjobs/AbstractPathJob.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/pathjobs/AbstractPathJob.java @@ -20,9 +20,9 @@ import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.level.pathfinder.BlockPathTypes; import net.minecraft.world.level.pathfinder.Node; import net.minecraft.world.level.pathfinder.Path; +import net.minecraft.world.level.pathfinder.PathType; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.NotNull; @@ -1208,10 +1208,11 @@ protected boolean isPassable(final BlockState block, final BlockPos pos, final M } if (shape.isEmpty() || shape.max(Direction.Axis.Y) <= 0.1 && !isLiquid((block)) && (block.getBlock() != Blocks.SNOW || block.getValue(SnowLayerBlock.LAYERS) == 1)) { - final BlockPathTypes pathType = block.getBlockPathType(world, pos, (Mob) entity.get()); - if (pathType == null || pathType.getDanger() == null) { + final PathType pathType = block.getBlockPathType(world, pos, (Mob) entity.get()); + //TODO: Check readd danger check? +// if (pathType == null || pathType.getDanger() == null) { return true; - } +// } } return false; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/SpellPartConfigUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/SpellPartConfigUtil.java index 890d8745bd..8b81f3eff0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/SpellPartConfigUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/SpellPartConfigUtil.java @@ -60,7 +60,7 @@ private Map parseAugmentLimits() { .map(AUGMENT_LIMITS_PATTERN::matcher) .filter(Matcher::matches) .collect(Collectors.toMap( - m -> new ResourceLocation(m.group(1)), + m -> ResourceLocation.tryParse(m.group(1)), m -> Integer.valueOf(m.group(2)) )); } @@ -189,7 +189,7 @@ private Map parseAugmentCosts() { .map(AUGMENT_LIMITS_PATTERN::matcher) .filter(Matcher::matches) .collect(Collectors.toMap( - m -> new ResourceLocation(m.group(1)), + m -> ResourceLocation.tryParse(m.group(1)), m -> Integer.valueOf(m.group(2)) )); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java index 5849872195..5f7af5fd4c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java @@ -2,10 +2,9 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.renderer.tile.*; -import com.hollingsworth.arsnouveau.common.block.*; import com.hollingsworth.arsnouveau.common.block.LightBlock; +import com.hollingsworth.arsnouveau.common.block.*; import com.hollingsworth.arsnouveau.common.block.tile.*; -import com.hollingsworth.arsnouveau.common.datagen.BlockTagProvider; import com.hollingsworth.arsnouveau.common.items.MobJarItem; import com.hollingsworth.arsnouveau.common.items.ModBlockItem; import com.hollingsworth.arsnouveau.common.items.RendererBlockItem; @@ -14,6 +13,7 @@ import com.hollingsworth.arsnouveau.common.util.registry.BlockRegistryWrapper; import com.hollingsworth.arsnouveau.common.world.tree.MagicTree; import com.hollingsworth.arsnouveau.common.world.tree.SupplierBlockStateProvider; +import net.minecraft.ChatFormatting; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.BlockPos; import net.minecraft.core.registries.BuiltInRegistries; diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/EnchantmentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/EnchantmentRegistry.java index f528b7c851..94134f1b18 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/EnchantmentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/EnchantmentRegistry.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.common.enchantment.ManaBoost; import com.hollingsworth.arsnouveau.common.enchantment.ManaRegenEnchantment; import com.hollingsworth.arsnouveau.common.enchantment.ReactiveEnchantment; +import net.minecraft.core.component.DataComponentType; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.item.enchantment.Enchantment; import net.neoforged.neoforge.registries.DeferredHolder; @@ -12,7 +13,7 @@ public class EnchantmentRegistry { - public static final DeferredRegister ENCHANTMENTS = DeferredRegister.create(BuiltInRegistries.ENCHANTMENT, MODID); + public static final DeferredRegister> ENCHANTMENTS = DeferredRegister.create(BuiltInRegistries.ENCHANTMENT_EFFECT_COMPONENT_TYPE, MODID); public static DeferredHolder MANA_REGEN_ENCHANTMENT = ENCHANTMENTS.register("mana_regen", ManaRegenEnchantment::new); public static DeferredHolder MANA_BOOST_ENCHANTMENT = ENCHANTMENTS.register("mana_boost", ManaBoost::new); public static DeferredHolder REACTIVE_ENCHANTMENT = ENCHANTMENTS.register("reactive", ReactiveEnchantment::new); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java index ef3c366201..ecea0566ed 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java @@ -211,9 +211,10 @@ public int getValue() { public static final ItemRegistryWrapper ALCHEMISTS_CROWN = register(LibItemNames.ALCHEMISTS_CROWN, () -> new AlchemistsCrown(defaultItemProperties().stacksTo(1))); public static final ItemRegistryWrapper SPLASH_LAUNCHER = register(LibItemNames.SPLASH_LAUNCHER, () -> new FlaskCannon.SplashLauncher(defaultItemProperties().stacksTo(1))); public static final ItemRegistryWrapper LINGERING_LAUNCHER = register(LibItemNames.LINGERING_LAUNCHER, () -> new FlaskCannon.LingeringLauncher(defaultItemProperties().stacksTo(1))); - public static final ItemRegistryWrapper FIREL_DISC = register(LibItemNames.FIREL_DISC, () -> new RecordItem(9, () -> SoundRegistry.ARIA_BIBLIO.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 240)); - public static final ItemRegistryWrapper SOUND_OF_GLASS = register(LibItemNames.SOUND_OF_GLASS, () -> new RecordItem(9, () -> SoundRegistry.SOUND_OF_GLASS.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 182)); - public static final ItemRegistryWrapper WILD_HUNT = register(LibItemNames.FIREL_WILD_HUNT, () -> new RecordItem(9, () -> SoundRegistry.WILD_HUNT.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 121)); + // TODO: restore discs +// public static final ItemRegistryWrapper FIREL_DISC = register(LibItemNames.FIREL_DISC, () -> new RecordItem(9, () -> SoundRegistry.ARIA_BIBLIO.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 240)); +// public static final ItemRegistryWrapper SOUND_OF_GLASS = register(LibItemNames.SOUND_OF_GLASS, () -> new RecordItem(9, () -> SoundRegistry.SOUND_OF_GLASS.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 182)); +// public static final ItemRegistryWrapper WILD_HUNT = register(LibItemNames.FIREL_WILD_HUNT, () -> new RecordItem(9, () -> SoundRegistry.WILD_HUNT.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 121)); public static final ItemRegistryWrapper STARBY_GIFY = register(LibItemNames.STARBY_GIFT, () -> new Present(defaultItemProperties().rarity(Rarity.EPIC))); public static final ItemRegistryWrapper SPELL_CROSSBOW = register(LibItemNames.SPELL_CROSSBOW, () -> new SpellCrossbow(defaultItemProperties().stacksTo(1))); public static final ItemRegistryWrapper STABLE_WARP_SCROLL = register(LibItemNames.STABLE_WARP_SCROLL, () -> new StableWarpScroll(defaultItemProperties().stacksTo(1))); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java index 0354fca438..a784128e81 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.setup.registry; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.potions.*; @@ -18,8 +19,8 @@ import net.neoforged.neoforge.event.brewing.RegisterBrewingRecipesEvent; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; + import java.util.ArrayList; -import java.util.UUID; import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; import static com.hollingsworth.arsnouveau.common.lib.LibPotions.*; @@ -35,7 +36,7 @@ public class ModPotions { public static final DeferredHolder MANA_REGEN_EFFECT = EFFECTS.register(MANA_REGEN, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 8080895) { @Override public void addAttributeModifiers(AttributeMap pAttributeMap, int pAmplifier) { - AttributeModifier attributemodifier = new AttributeModifier(UUID.fromString("bb72a21d-3e49-4e8e-b81c-3bfa9cf746b0"), this.getDescriptionId(), ServerConfig.MANA_REGEN_POTION.get() * (1 + pAmplifier), AttributeModifier.Operation.ADD_VALUE); + AttributeModifier attributemodifier = new AttributeModifier(ArsNouveau.prefix("mana_regen_bonus"), ServerConfig.MANA_REGEN_POTION.get() * (1 + pAmplifier), AttributeModifier.Operation.ADD_VALUE); pAttributeMap.getInstance(PerkAttributes.MANA_REGEN_BONUS).addTransientModifier(attributemodifier); super.addAttributeModifiers(pAttributeMap, pAmplifier); } @@ -45,7 +46,7 @@ public void addAttributeModifiers(AttributeMap pAttributeMap, int pAmplifier) { public static final DeferredHolder HEX_EFFECT = EFFECTS.register(HEX, () -> new PublicEffect(MobEffectCategory.HARMFUL, 8080895) { @Override public void addAttributeModifiers(AttributeMap pAttributeMap, int pAmplifier) { - pAttributeMap.getInstance(PerkAttributes.MANA_REGEN_BONUS).addTransientModifier(new AttributeModifier(UUID.fromString("5636ef7d-0136-4205-aabc-fd7cf0d29d05"), this.getDescriptionId(), -0.5, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); + pAttributeMap.getInstance(PerkAttributes.MANA_REGEN_BONUS).addTransientModifier(new AttributeModifier(ArsNouveau.prefix("hex_regen_penalty"), -0.5, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); super.addAttributeModifiers(pAttributeMap, pAmplifier); } }); @@ -54,13 +55,7 @@ public void addAttributeModifiers(AttributeMap pAttributeMap, int pAmplifier) { public static final DeferredHolder SNARE_EFFECT = EFFECTS.register(SNARE, SnareEffect::new); public static final DeferredHolder FLIGHT_EFFECT = EFFECTS.register(FLIGHT, FlightEffect::new); public static final DeferredHolder GRAVITY_EFFECT = EFFECTS.register(GRAVITY, GravityEffect::new); - public static final DeferredHolder SPELL_DAMAGE_EFFECT = EFFECTS.register(SPELL_DAMAGE, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, new ParticleColor(30, 200, 200).getColor()) { - @Override - public void addAttributeModifiers(AttributeMap pAttributeMap, int pAmplifier) { - pAttributeMap.getInstance(PerkAttributes.MANA_REGEN_BONUS).addTransientModifier(new AttributeModifier(UUID.fromString("7a8b8f12-077b-430c-8da7-fd21c95dceb3"), this.getDescriptionId(), 1.5F * (1 + pAmplifier), AttributeModifier.Operation.ADD_VALUE)); - super.addAttributeModifiers(pAttributeMap, pAmplifier); - } - }); + public static final DeferredHolder SPELL_DAMAGE_EFFECT = EFFECTS.register(SPELL_DAMAGE, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, new ParticleColor(30, 200, 200).getColor())); public static final DeferredHolder IMMOLATE_EFFECT = EFFECTS.register(IMMOLATE, ImmolateEffect::new); public static final DeferredHolder BOUNCE_EFFECT = EFFECTS.register(BOUNCE, BounceEffect::new); public static final DeferredHolder MAGIC_FIND_EFFECT = EFFECTS.register(MAGIC_FIND, MagicFindEffect::new); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RegistryHelper.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RegistryHelper.java index 12567cf9f7..3bce86f364 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RegistryHelper.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RegistryHelper.java @@ -23,7 +23,7 @@ public static ResourceLocation getRegistryName(EntityType i) { } public static ResourceLocation getRegistryName(Enchantment e) { - return BuiltInRegistries.ENCHANTMENT.getKey(e); + return BuiltInRegistries.ENCHANTMENT_EFFECT_COMPONENT_TYPE.getKey(e); } public static ResourceLocation getRegistryName(ParticleType type) { From 26a2ab3a9c24af1b405bda1dffe7a0551ef51dd2 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 22 Jun 2024 15:09:02 -0500 Subject: [PATCH 009/363] resloc, some potions, rest of the owl --- .../hollingsworth/arsnouveau/ArsNouveau.java | 1 - .../EnchantmentRecipe.java | 4 +- .../arsnouveau/api/item/ArsNouveauCurio.java | 13 +- .../arsnouveau/api/item/ICasterTool.java | 2 +- .../api/particle/ParticleColorRegistry.java | 2 +- .../arsnouveau/api/perk/StackPerkHolder.java | 2 +- .../arsnouveau/api/potion/PotionData.java | 48 ++++--- .../api/recipe/DispelEntityRecipe.java | 20 ++- .../api/recipe/PotionCraftingManager.java | 12 +- .../api/registry/BehaviorRegistry.java | 2 +- .../api/scrying/CompoundScryer.java | 2 +- .../api/scrying/SingleBlockScryer.java | 2 +- .../arsnouveau/api/scrying/TagScryer.java | 2 +- .../arsnouveau/api/sound/SpellSound.java | 4 +- .../arsnouveau/api/source/SourceManager.java | 11 +- .../arsnouveau/api/spell/CancelReason.java | 7 +- .../arsnouveau/api/spell/Spell.java | 2 +- .../arsnouveau/api/spell/SpellStats.java | 9 +- .../spell/wrapped_caster/LivingCaster.java | 7 +- .../arsnouveau/api/util/ANExplosion.java | 27 ++-- .../arsnouveau/api/util/BlockUtil.java | 9 +- .../arsnouveau/api/util/CuriosUtil.java | 10 +- .../arsnouveau/api/util/InvUtil.java | 11 +- .../arsnouveau/api/util/ManaUtil.java | 23 +-- .../client/container/StorageTerminalMenu.java | 7 +- .../client/events/ClientEvents.java | 5 +- .../client/events/ClientPlayerEvent.java | 2 +- .../client/gui/GlyphRecipeTooltip.java | 2 +- .../arsnouveau/client/jei/JEIConstants.java | 8 +- .../client/keybindings/KeyHandler.java | 42 +++--- .../client/patchouli/ApparatusProcessor.java | 90 ++++++------ .../patchouli/EnchantmentProcessor.java | 94 ++++++------- .../client/patchouli/GlyphProcessor.java | 132 +++++++++--------- .../client/patchouli/ImbuementProcessor.java | 88 ++++++------ .../patchouli/NoOutputApparatusProcessor.java | 90 ++++++------ .../component/RotatingItemListComponent.java | 132 +++++++++--------- .../RotatingItemListComponentBase.java | 114 +++++++-------- .../client/registry/ClientHandler.java | 14 +- .../client/registry/ModParticles.java | 2 +- .../client/renderer/entity/RenderSpell.java | 3 +- .../renderer/item/FlaskCannonRenderer.java | 2 +- .../tile/AlterationTableRenderer.java | 2 +- .../client/renderer/tile/GenericRenderer.java | 1 - .../common/block/tile/DrygmyTile.java | 9 +- .../common/block/tile/ImbuementTile.java | 54 ++++--- .../common/block/tile/PortalTile.java | 2 +- .../common/block/tile/PotionJarTile.java | 11 +- .../common/block/tile/PotionMelderTile.java | 2 +- .../common/block/tile/ScribesTile.java | 2 +- .../common/block/tile/StorageLecternTile.java | 84 ++++------- .../common/block/tile/WixieCauldronTile.java | 29 ++-- .../common/capability/ManaCapAttacher.java | 51 ------- .../common/crafting/recipes/CrushRecipe.java | 2 +- .../common/crafting/recipes/GlyphRecipe.java | 10 +- .../crafting/recipes/ImbuementRecipe.java | 132 +++++++----------- .../datagen/ApparatusRecipeBuilder.java | 2 +- .../common/datagen/BlockStatesDatagen.java | 12 +- .../common/datagen/BlockTagProvider.java | 6 +- .../common/datagen/DamageTypesProvider.java | 2 +- .../common/datagen/EntityTagProvider.java | 2 +- .../datagen/ImbuementRecipeProvider.java | 21 ++- .../common/datagen/ItemModelGenerator.java | 6 +- .../common/datagen/ItemTagProvider.java | 12 +- .../arsnouveau/common/datagen/ModDatagen.java | 5 +- .../common/datagen/ScryRitualProvider.java | 2 +- .../advancement/ANAdvancementBuilder.java | 4 +- .../datagen/patchouli/ApparatusPage.java | 2 +- .../datagen/patchouli/ApparatusTextPage.java | 2 +- .../datagen/patchouli/CraftingPage.java | 4 +- .../common/datagen/patchouli/EntityPage.java | 2 +- .../datagen/patchouli/GlyphScribePage.java | 2 +- .../common/datagen/patchouli/ImagePage.java | 2 +- .../datagen/patchouli/ImbuementPage.java | 2 +- .../common/datagen/patchouli/LinkPage.java | 2 +- .../datagen/patchouli/MultiblockPage.java | 2 +- .../datagen/patchouli/PatchouliBuilder.java | 2 +- .../datagen/patchouli/RelationsPage.java | 2 +- .../datagen/patchouli/SpotlightPage.java | 2 +- .../common/datagen/patchouli/TextPage.java | 2 +- .../common/entity/EntityBookwyrm.java | 2 +- .../arsnouveau/common/entity/EntityWixie.java | 2 +- .../common/entity/LightningEntity.java | 10 +- .../arsnouveau/common/entity/Starbuncle.java | 4 +- .../arsnouveau/common/entity/SummonHorse.java | 2 +- .../common/entity/SummonSkeleton.java | 2 +- .../arsnouveau/common/entity/SummonWolf.java | 2 +- .../arsnouveau/common/entity/WealdWalker.java | 2 +- .../arsnouveau/common/entity/Whirlisprig.java | 2 +- .../common/entity/WildenHunter.java | 2 +- .../common/entity/WildenStalker.java | 2 +- .../entity/familiar/FamiliarEntity.java | 2 +- .../common/entity/familiar/FamiliarWixie.java | 2 +- .../amethyst_golem/DepositAmethystGoal.java | 2 - .../amethyst_golem/PickupAmethystGoal.java | 2 +- .../carbuncle/StarbyTransportBehavior.java | 2 +- .../entity/goal/wixie/FindNextItemGoal.java | 2 +- .../arsnouveau/common/event/EventHandler.java | 106 ++++++-------- .../arsnouveau/common/event/LightEvents.java | 2 +- .../common/event/ManaCapEvents.java | 2 +- .../arsnouveau/common/event/ScryEvents.java | 4 +- .../arsnouveau/common/items/CasterTome.java | 2 +- .../arsnouveau/common/items/FlaskCannon.java | 2 +- .../common/items/StableWarpScroll.java | 2 +- .../common/items/curios/SummoningFocus.java | 5 +- .../common/potions/GravityEffect.java | 2 +- .../common/potions/ShockedEffect.java | 6 +- .../common/ritual/DenySpawnRitual.java | 4 +- .../common/spell/effect/EffectCut.java | 14 +- .../common/spell/effect/EffectExplosion.java | 7 +- .../common/spell/effect/EffectToss.java | 4 +- .../world/saved_data/RedstoneSavedData.java | 2 +- .../AbstractSupplierBlockStateProvider.java | 4 - .../common/world/tree/MagicTrunkPlacer.java | 2 +- .../arsnouveau/setup/ModSetup.java | 15 +- .../arsnouveau/setup/config/Config.java | 4 +- .../setup/registry/CapabilityRegistry.java | 5 + 116 files changed, 840 insertions(+), 950 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCapAttacher.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java index 6707193960..80b5d56e0c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java +++ b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java @@ -33,7 +33,6 @@ import net.minecraft.world.level.block.FlowerPotBlock; import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.DistExecutor; import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModList; import net.neoforged.fml.ModLoadingContext; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java index 6eafcbadab..944ff1a3db 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java @@ -134,7 +134,7 @@ public static class Serializer implements RecipeSerializer { @Override public EnchantmentRecipe fromJson(ResourceLocation recipeId, JsonObject json) { - Enchantment enchantment = ForgeRegistries.ENCHANTMENTS.getValue(new ResourceLocation(GsonHelper.getAsString(json, "enchantment"))); + Enchantment enchantment = ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryParse(GsonHelper.getAsString(json, "enchantment"))); int level = GsonHelper.getAsInt(json, "level", 1); int manaCost = GsonHelper.getAsInt(json, "sourceCost", 0); JsonArray pedestalItems = GsonHelper.getAsJsonArray(json, "pedestalItems"); @@ -170,7 +170,7 @@ public EnchantmentRecipe fromNetwork(ResourceLocation recipeId, FriendlyByteBuf break; } } - return new EnchantmentRecipe(stacks, ForgeRegistries.ENCHANTMENTS.getValue(new ResourceLocation(enchantID)), level, manaCost); + return new EnchantmentRecipe(stacks, ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryParse(enchantID)), level, manaCost); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/ArsNouveauCurio.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/ArsNouveauCurio.java index 5eac1f782e..9d31ea9102 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/ArsNouveauCurio.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/ArsNouveauCurio.java @@ -2,10 +2,9 @@ import com.hollingsworth.arsnouveau.common.items.ModItem; import net.minecraft.world.item.ItemStack; -import top.theillusivec4.curios.api.SlotContext; -import top.theillusivec4.curios.api.type.capability.ICurioItem; -public abstract class ArsNouveauCurio extends ModItem implements ICurioItem { +//TODO: restore curios +public abstract class ArsNouveauCurio extends ModItem { public ArsNouveauCurio() { this(new Properties().stacksTo(1)); @@ -16,8 +15,8 @@ public ArsNouveauCurio(Properties properties) { super(properties); } - @Override - public boolean canEquipFromUse(SlotContext slotContext, ItemStack stack) { - return true; - } +// @Override +// public boolean canEquipFromUse(SlotContext slotContext, ItemStack stack) { +// return true; +// } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java index 20749ff854..02047377c3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java @@ -122,7 +122,7 @@ default void getInformation(ItemStack stack, @Nullable Level worldIn, List customEffects = new ArrayList<>(); - private Set includedPotions = new HashSet<>(); + private Set includedPotions = new HashSet<>(); - public PotionData(Potion potion, List customEffects, Set includedPotions) { + public PotionData(PotionContents potion, List customEffects, Set includedPotions) { this.potion = potion; this.includedPotions = includedPotions; setCustomEffects(customEffects); } public PotionData(){ - this(Potions.EMPTY, new ArrayList<>(), new HashSet<>()); + this(PotionContents.EMPTY, new ArrayList<>(), new HashSet<>()); } public PotionData(ItemStack stack){ if(stack.getItem() instanceof IPotionProvider provider){ PotionData data = provider.getPotionData(stack).clone(); - this.potion = data.getPotion(); + this.potion = data.potion; this.customEffects = data.getCustomEffects(); }else{ - this.potion = PotionUtils.getPotion(stack); + this.potion = stack.get(DataComponents.POTION_CONTENTS); customEffects = new ArrayList<>(); - setCustomEffects(PotionUtils.getCustomEffects(stack)); + setCustomEffects(potion.customEffects()); } } - public PotionData(Potion potion){ + public PotionData(PotionContents potion){ this(potion, new ArrayList<>(), new HashSet<>(Collections.singletonList(potion))); } @@ -71,7 +72,7 @@ public static PotionData fromTag(CompoundTag tag){ instance.setPotion(PotionUtils.getPotion(tag)); instance.getCustomEffects().addAll(PotionUtils.getCustomEffects(tag)); ListTag potionTagList = tag.getList("includedPotions", 8); - Set potions = instance.includedPotions; + Set potions = instance.includedPotions; for(int i = 0; i < potionTagList.size(); i++){ potions.add(Potion.byName(potionTagList.getString(i))); } @@ -101,14 +102,14 @@ public CompoundTag toTag(){ public List fullEffects(){ List thisEffects = new ArrayList<>(getCustomEffects()); - thisEffects.addAll(getPotion().getEffects()); + thisEffects.addAll(getPotion().getAllEffects()); return thisEffects; } public void applyEffects(Entity source, Entity inDirectSource, LivingEntity target){ for (MobEffectInstance effectinstance : fullEffects()) { - if (effectinstance.getEffect().isInstantenous()) { - effectinstance.getEffect().applyInstantenousEffect(source, inDirectSource, target, effectinstance.getAmplifier(), 1.0D); + if (effectinstance.getEffect().value().isInstantenous()) { + effectinstance.getEffect().value().applyInstantenousEffect(source, inDirectSource, target, effectinstance.getAmplifier(), 1.0D); } else { target.addEffect(new MobEffectInstance(effectinstance), source); } @@ -125,7 +126,7 @@ public boolean areSameEffects(List effects){ } public boolean isEmpty(){ - return getPotion() == Potions.EMPTY || getPotion() == Potions.WATER || getPotion() == Potions.MUNDANE || fullEffects().isEmpty(); + return getPotion() == PotionContents.EMPTY || getPotion().is( Potions.WATER) || getPotion().is(Potions.MUNDANE) || fullEffects().isEmpty(); } public boolean areSameEffects(PotionData other){ @@ -139,18 +140,19 @@ public PotionData mergeEffects(PotionData other){ set.addAll(this.fullEffects()); set.addAll(other.fullEffects()); - Set potions = new HashSet<>(); + Set potions = new HashSet<>(); potions.addAll(this.getIncludedPotions()); potions.addAll(other.getIncludedPotions()); return new PotionData(getPotion(), new ArrayList<>(set), potions); } + // TODO: fix ticksPerSecond? public void appendHoverText(List tooltip) { - if(getPotion() == Potions.EMPTY) + if(getPotion() == PotionContents.EMPTY) return; ItemStack potionStack = asPotionStack(); tooltip.add(potionStack.getHoverName()); - PotionUtils.addPotionTooltip(potionStack, tooltip, 1.0F); + PotionContents.addPotionTooltip(getPotion().getAllEffects(), tooltip::add, 1.0F, 20.0f); } @Override @@ -171,11 +173,11 @@ public PotionData clone() { } } - public Potion getPotion() { + public PotionContents getPotion() { return potion; } - public void setPotion(Potion potion) { + public void setPotion(PotionContents potion) { this.potion = potion; } @@ -184,16 +186,16 @@ public List getCustomEffects() { } public void setCustomEffects(List customEffects) { - this.customEffects = customEffects.stream().filter(e -> !potion.getEffects().contains(e)).collect(Collectors.toList()); + this.customEffects = customEffects.stream().filter(e -> !potion.getAllEffects().contains(e)).collect(Collectors.toList()); } - public Set getIncludedPotions() { + public Set getIncludedPotions() { includedPotions.add(getPotion()); - includedPotions.removeIf(potion -> potion == Potions.EMPTY); + includedPotions.removeIf(potion -> potion == PotionContents.EMPTY); return includedPotions; } - public void setIncludedPotions(Set includedPotions) { + public void setIncludedPotions(Set includedPotions) { this.includedPotions = includedPotions; } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/DispelEntityRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/DispelEntityRecipe.java index d219bdc3f5..84860e3719 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/DispelEntityRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/DispelEntityRecipe.java @@ -6,8 +6,10 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.JsonOps; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.HolderLookup; import net.minecraft.core.RegistryAccess; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; @@ -27,7 +29,7 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; -import net.minecraftforge.common.loot.IGlobalLootModifier; +import net.neoforged.neoforge.common.loot.IGlobalLootModifier; import org.jetbrains.annotations.Nullable; import java.util.Arrays; @@ -39,6 +41,11 @@ public boolean matches(Container container, Level level) { return false; } + @Override + public ItemStack assemble(Container p_345149_, HolderLookup.Provider p_346030_) { + return null; + } + public boolean matches(LivingEntity killer, Entity victim) { if (!victim.getType().equals(this.entity)) return false; @@ -56,8 +63,8 @@ private LootParams getLootParams(LivingEntity killer, Entity victim) { .withParameter(LootContextParams.ORIGIN, victim.position()) .withParameter(LootContextParams.THIS_ENTITY, victim) .withParameter(LootContextParams.DAMAGE_SOURCE, killer.damageSources().mobAttack(killer)) - .withOptionalParameter(LootContextParams.KILLER_ENTITY, killer) - .withOptionalParameter(LootContextParams.DIRECT_KILLER_ENTITY, killer); + .withOptionalParameter(LootContextParams.ATTACKING_ENTITY, killer) + .withOptionalParameter(LootContextParams.DIRECT_ATTACKING_ENTITY, killer); if (killer instanceof ServerPlayer serverPlayer) { params = params.withOptionalParameter(LootContextParams.LAST_DAMAGE_PLAYER, serverPlayer) .withLuck(serverPlayer.getLuck()); @@ -70,7 +77,7 @@ public List result(LivingEntity killer, Entity victim) { LootParams params = getLootParams(killer, victim); - LootTable lootTable = killer.level().getServer().getLootData().getLootTable(lootTable()); + LootTable lootTable = killer.level().registryAccess().registryOrThrow(Registries.LOOT_TABLE).get(lootTable()); return lootTable.getRandomItems(params); } @@ -85,6 +92,11 @@ public boolean canCraftInDimensions(int i, int i1) { return false; } + @Override + public ItemStack getResultItem(HolderLookup.Provider pRegistries) { + return null; + } + @Override public ItemStack getResultItem(RegistryAccess registryAccess) { return ItemStack.EMPTY; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java index 34592b15a4..4ca064aaae 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java @@ -10,7 +10,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.alchemy.Potion; -import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; @@ -19,21 +19,21 @@ public class PotionCraftingManager extends CraftingManager { private boolean hasObtainedPotion; - private Potion potionNeeded; - public Potion potionOut; + private PotionContents potionNeeded; + public PotionContents potionOut; public PotionCraftingManager(){ super(); } - public PotionCraftingManager(Potion potionNeeded, List itemsNeeded, Potion potionOut) { + public PotionCraftingManager(PotionContents potionNeeded, List itemsNeeded, PotionContents potionOut) { super(ItemStack.EMPTY, itemsNeeded); this.potionNeeded = potionNeeded; this.potionOut = potionOut; neededItems = itemsNeeded; remainingItems = itemsNeeded; outputStack = ItemStack.EMPTY; - hasObtainedPotion = potionNeeded == Potions.EMPTY || potionNeeded == Potions.WATER; + hasObtainedPotion = potionNeeded == PotionContents.EMPTY || potionNeeded.is(Potions.WATER); } @Override @@ -45,7 +45,7 @@ public boolean needsPotion(){ return !(hasObtainedPotion); } - public Potion getPotionNeeded(){ + public PotionContents getPotionNeeded(){ return potionNeeded; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/BehaviorRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/BehaviorRegistry.java index 5b05f1c0ee..443f1ac8f2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/BehaviorRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/BehaviorRegistry.java @@ -19,7 +19,7 @@ public static void register(ResourceLocation name, CreateFromTag creator){ } public static ChangeableBehavior create(Entity entity, CompoundTag tag){ - CreateFromTag create = REGISTRY.get(new ResourceLocation(tag.getString("id"))); + CreateFromTag create = REGISTRY.get(ResourceLocation.tryParse(tag.getString("id"))); return create == null ? null : create.create(entity, tag); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/CompoundScryer.java b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/CompoundScryer.java index 80c3b33989..9e35d42f95 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/CompoundScryer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/CompoundScryer.java @@ -33,7 +33,7 @@ public IScryer fromTag(CompoundTag tag) { for (int i = 0; i < count; i++) { CompoundTag scryerTag = tag.getCompound("scryer_" + i); String id = scryerTag.getString("id"); - IScryer scryer = ArsNouveauAPI.getInstance().getScryer(new ResourceLocation(id)); + IScryer scryer = ArsNouveauAPI.getInstance().getScryer(ResourceLocation.tryParse(id)); if (scryer != null) { compoundScryer.scryerList.add(scryer.fromTag(scryerTag)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java index afb3c3fa8b..6da5c5779e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java @@ -29,7 +29,7 @@ public boolean shouldRevealBlock(BlockState state, BlockPos p, Player player) { @Override public IScryer fromTag(CompoundTag tag) { SingleBlockScryer scryer = new SingleBlockScryer(null); - scryer.block = tag.contains("block") ? ForgeRegistries.BLOCKS.getValue(new ResourceLocation(tag.getString("block"))) : null; + scryer.block = tag.contains("block") ? ForgeRegistries.BLOCKS.getValue(ResourceLocation.tryParse(tag.getString("block"))) : null; return scryer; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java index ccc2ecbb0e..fd318465f6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java @@ -33,7 +33,7 @@ public boolean shouldRevealBlock(BlockState state, BlockPos p, Player player) { public IScryer fromTag(CompoundTag tag) { TagScryer scryer = new TagScryer(); if (tag.contains("blockTag")) { - scryer.blockTag = ForgeRegistries.BLOCKS.tags().getTag(new TagKey<>(Registries.BLOCK, new ResourceLocation(tag.getString("blockTag")))).getKey(); + scryer.blockTag = ForgeRegistries.BLOCKS.tags().getTag(new TagKey<>(Registries.BLOCK, ResourceLocation.tryParse(tag.getString("blockTag")))).getKey(); } return scryer; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java b/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java index c17a3c85fb..c2472d6394 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java @@ -61,12 +61,12 @@ public CompoundTag serialize() { if (!tag.contains("id")) return null; - ResourceLocation id = new ResourceLocation(tag.getString("id")); + ResourceLocation id = ResourceLocation.tryParse(tag.getString("id")); return SpellSoundRegistry.getSpellSoundsRegistry().get(id); } public ResourceLocation getTexturePath() { - return new ResourceLocation(this.id.getNamespace(), "textures/sounds/" + this.id.getPath() + ".png"); + return ResourceLocation.fromNamespaceAndPath(this.id.getNamespace(), "textures/sounds/" + this.id.getPath() + ".png"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/source/SourceManager.java b/src/main/java/com/hollingsworth/arsnouveau/api/source/SourceManager.java index 34666de7fd..cec1db4d16 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/source/SourceManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/source/SourceManager.java @@ -4,8 +4,9 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; -import net.neoforged.neoforge.event.TickEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +import net.neoforged.neoforge.event.tick.LevelTickEvent; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -95,11 +96,11 @@ private SourceManager() {} @SubscribeEvent - public static void serverTick(TickEvent.LevelTickEvent e) { + public static void serverTick(LevelTickEvent.Post e) { - if (e.level.isClientSide || e.phase != TickEvent.Phase.END) + if (e.getLevel().isClientSide) return; - INSTANCE.tick(e.level); + INSTANCE.tick(e.getLevel()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/CancelReason.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/CancelReason.java index cdf1a5f389..aa188b2cdf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/CancelReason.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/CancelReason.java @@ -1,16 +1,17 @@ package com.hollingsworth.arsnouveau.api.spell; +import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.resources.ResourceLocation; public record CancelReason(ResourceLocation id) { - public static CancelReason FILTER_FAILED = new CancelReason(new ResourceLocation("ars_nouveau", "filter_failed")); + public static CancelReason FILTER_FAILED = new CancelReason(ArsNouveau.prefix("filter_failed")); /** * When a spell is canceled because it will now resolve differently. Used for cases like Orbit or Delay. */ - public static CancelReason NEW_CONTEXT = new CancelReason(new ResourceLocation("ars_nouveau", "new_context")); + public static CancelReason NEW_CONTEXT = new CancelReason(ArsNouveau.prefix("new_context")); /** * If the spell was terminated and should not be continued. Used for magic cancellation or when an entirely new context will be substituted. */ - public static CancelReason TERMINATED = new CancelReason(new ResourceLocation("ars_nouveau", "terminated")); + public static CancelReason TERMINATED = new CancelReason(ArsNouveau.prefix("terminated")); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java index 0764d0d68f..7ed78969cf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java @@ -150,7 +150,7 @@ public static Spell fromTag(@Nullable CompoundTag tag) { CompoundTag recipeTag = tag.getCompound("recipe"); int size = recipeTag.getInt("size"); for (int i = 0; i < size; i++) { - ResourceLocation registryName = new ResourceLocation(recipeTag.getString("part" + i)); + ResourceLocation registryName = ResourceLocation.tryParse(recipeTag.getString("part" + i)); AbstractSpellPart part = GlyphRegistry.getSpellpartMap().get(registryName); if (part != null) spell.recipe.add(part); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellStats.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellStats.java index 3b8b2aae9b..755f0d2152 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellStats.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellStats.java @@ -181,12 +181,13 @@ public Builder setAugments(List augments) { public Builder addItemsFromEntity(@Nullable LivingEntity entity) { if (entity == null) return this; - CuriosUtil.getAllWornItems(entity).ifPresent(e -> { - for (int i = 0; i < e.getSlots(); i++) { - ItemStack item = e.getStackInSlot(i); + var handler = CuriosUtil.getAllWornItems(entity); + if(handler != null){ + for (int i = 0; i < handler.getSlots(); i++) { + ItemStack item = handler.getStackInSlot(i); spellStats.modifierItems.add(item); } - }); + } for (ItemStack i : entity.getAllSlots()) { spellStats.modifierItems.add(i); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/LivingCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/LivingCaster.java index add6e70b3e..dd871a34d2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/LivingCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/LivingCaster.java @@ -6,7 +6,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.common.util.FakePlayer; import org.jetbrains.annotations.NotNull; @@ -35,7 +35,10 @@ public SpellContext.CasterType getCasterType() { @Override public @NotNull List getInventory() { List filterableItemHandlers = new ArrayList<>(); - livingEntity.getCapability(Capabilities.ITEM_HANDLER).ifPresent(cap -> filterableItemHandlers.add(new FilterableItemHandler(cap))); + var cap = livingEntity.getCapability(Capabilities.ItemHandler.ENTITY); + if(cap != null){ + filterableItemHandlers.add(new FilterableItemHandler(cap)); + } return filterableItemHandlers; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/ANExplosion.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/ANExplosion.java index f3525415c6..c540ab5095 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/ANExplosion.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/ANExplosion.java @@ -3,13 +3,15 @@ import com.google.common.collect.Sets; import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundEvents; import net.minecraft.util.Mth; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.item.PrimedTnt; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.enchantment.ProtectionEnchantment; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.ExplosionDamageCalculator; import net.minecraft.world.level.Level; @@ -28,21 +30,12 @@ public class ANExplosion extends Explosion { public double baseDamage; public double ampDamageScalar; - public ANExplosion(Level p_i45752_1_, @Nullable Entity p_i45752_2_, double p_i45752_3_, double p_i45752_5_, double p_i45752_7_, float p_i45752_9_, List p_i45752_10_) { - super(p_i45752_1_, p_i45752_2_, p_i45752_3_, p_i45752_5_, p_i45752_7_, p_i45752_9_, p_i45752_10_); - } - - public ANExplosion(Level p_i50006_1_, @Nullable Entity p_i50006_2_, double p_i50006_3_, double p_i50006_5_, double p_i50006_7_, float p_i50006_9_, boolean p_i50006_10_, BlockInteraction p_i50006_11_, List p_i50006_12_) { - super(p_i50006_1_, p_i50006_2_, p_i50006_3_, p_i50006_5_, p_i50006_7_, p_i50006_9_, p_i50006_10_, p_i50006_11_, p_i50006_12_); - } - - public ANExplosion(Level p_i50007_1_, @Nullable Entity p_i50007_2_, double p_i50007_3_, double p_i50007_5_, double p_i50007_7_, float p_i50007_9_, boolean p_i50007_10_, BlockInteraction p_i50007_11_) { - super(p_i50007_1_, p_i50007_2_, p_i50007_3_, p_i50007_5_, p_i50007_7_, p_i50007_9_, p_i50007_10_, p_i50007_11_); - } public ANExplosion(Level p_i231610_1_, @Nullable Entity p_i231610_2_, @Nullable DamageSource p_i231610_3_, @Nullable ExplosionDamageCalculator p_i231610_4_, double p_i231610_5_, double p_i231610_7_, double p_i231610_9_, float p_i231610_11_, boolean p_i231610_12_, BlockInteraction p_i231610_13_, double numAmps) { - super(p_i231610_1_, p_i231610_2_, p_i231610_3_, p_i231610_4_, p_i231610_5_, p_i231610_7_, p_i231610_9_, p_i231610_11_, p_i231610_12_, p_i231610_13_); + super(p_i231610_1_, p_i231610_2_, p_i231610_3_, p_i231610_4_, p_i231610_5_, p_i231610_7_, p_i231610_9_, p_i231610_11_, p_i231610_12_, p_i231610_13_, ParticleTypes.EXPLOSION, + ParticleTypes.EXPLOSION_EMITTER, + SoundEvents.GENERIC_EXPLODE); amps = numAmps; } @@ -102,7 +95,7 @@ public void explode() { Vec3 vector3d = new Vec3(this.x, this.y, this.z); for (Entity entity : list) { - if (!entity.ignoreExplosion()) { + if (!entity.ignoreExplosion(this)) { double d12 = Mth.sqrt((float) entity.distanceToSqr(vector3d)) / f2; if (d12 <= 1.0D) { double d5 = entity.getX() - this.x; @@ -116,10 +109,10 @@ public void explode() { double d14 = getSeenPercent(vector3d, entity); double d10 = (1.0D - d12) * d14; float damage = (float) Math.min(Math.max(0.0f, (float) ((int) ((d10 * d10 + d10) / 2.0D * 7.0D * (double) f2 + 1.0D))), baseDamage + this.amps * ampDamageScalar); - entity.hurt(this.getDamageSource(), damage); + entity.hurt(this.damageSource, damage); double d11 = d10; - if (entity instanceof LivingEntity) { - d11 = ProtectionEnchantment.getExplosionKnockbackAfterDampener((LivingEntity) entity, d10); + if (entity instanceof LivingEntity livingEntity) { + d11 = d10 * (1.0 - livingEntity.getAttributeValue(Attributes.EXPLOSION_KNOCKBACK_RESISTANCE)); } entity.setDeltaMovement(entity.getDeltaMovement().add(d5 * d11, d7 * d11, d9 * d11)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java index 6dd5c1574e..d0e4888dc2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java @@ -21,6 +21,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.UsernameCache; import net.neoforged.neoforge.common.util.FakePlayer; @@ -151,10 +152,10 @@ public static List getAdjacentInventories(Level world, BlockPos po if (world == null || pos == null) return new ArrayList<>(); ArrayList iInventories = new ArrayList<>(); for (Direction d : Direction.values()) { - BlockEntity tileEntity = world.getBlockEntity(pos.relative(d)); - if (tileEntity == null) - continue; - tileEntity.getCapability(Capabilities.ITEM_HANDLER).ifPresent(iInventories::add); + var cap = world.getCapability(Capabilities.ItemHandler.BLOCK, pos, null); + if(cap != null){ + iInventories.add(cap); + } } return iInventories; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/CuriosUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/CuriosUtil.java index ae5543a31d..942407e3d3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/CuriosUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/CuriosUtil.java @@ -3,22 +3,22 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.common.util.LazyOptional; + import net.neoforged.neoforge.items.IItemHandlerModifiable; import org.jetbrains.annotations.NotNull; -import top.theillusivec4.curios.api.CuriosApi; import javax.annotation.Nullable; public class CuriosUtil { - public static LazyOptional getAllWornItems(@NotNull LivingEntity living) { - return CuriosApi.getCuriosHelper().getEquippedCurios(living); + // TODO: restore curios support + public static @Nullable IItemHandlerModifiable getAllWornItems(@NotNull LivingEntity living) { + return null;// CuriosApi.getCuriosHelper().getEquippedCurios(living); } public static boolean hasItem(@Nullable LivingEntity entity, ItemStack stack) { if (entity == null) return false; - IItemHandlerModifiable items = CuriosUtil.getAllWornItems(entity).orElse(null); + IItemHandlerModifiable items = CuriosUtil.getAllWornItems(entity); if (items != null) { for (int i = 0; i < items.getSlots(); i++) { if (ItemStack.isSameItem(stack, items.getStackInSlot(i))) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java index 198e78a0f9..0bf7b61e89 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java @@ -10,10 +10,9 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.AABB; -import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.wrapper.PlayerMainInvWrapper; -import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.ArrayList; @@ -28,7 +27,7 @@ public static List adjacentInventories(Level level, Block if (adjacentInvTile == null || adjacentInvTile.isRemoved()) continue; - IItemHandler handler = adjacentInvTile.getCapability(Capabilities.ITEM_HANDLER).orElse(null); + IItemHandler handler = level.getCapability(Capabilities.ItemHandler.BLOCK, pos, d); if(handler == null) continue; inventories.add(new FilterableItemHandler(handler, filtersOnTile(adjacentInvTile))); @@ -36,10 +35,6 @@ public static List adjacentInventories(Level level, Block return inventories; } - public static FilterableItemHandler getFilteredHandler(@NotNull BlockEntity tile){ - return new FilterableItemHandler(tile.getCapability(Capabilities.ITEM_HANDLER).orElse(null), filtersOnTile(tile)); - } - public static List> filtersOnTile(@Nullable BlockEntity thisTile){ if(thisTile == null || thisTile.isRemoved()){ return new ArrayList<>(); @@ -47,7 +42,7 @@ public static List> filtersOnTile(@Null Level level = thisTile.getLevel(); BlockPos pos = thisTile.getBlockPos(); List> filters = new ArrayList<>(); - IItemHandler inv = thisTile.getCapability(Capabilities.ITEM_HANDLER).orElse(null); + IItemHandler inv = level.getCapability(Capabilities.ItemHandler.BLOCK, pos, level.getBlockState(pos), thisTile, null); if(inv == null) return filters; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java index 74139934da..e20183c0d7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.api.util; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.event.ManaRegenCalcEvent; import com.hollingsworth.arsnouveau.api.event.MaxManaCalcEvent; import com.hollingsworth.arsnouveau.api.mana.IManaCap; @@ -9,6 +10,7 @@ import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.setup.config.ServerConfig; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.player.Player; @@ -23,13 +25,14 @@ public class ManaUtil { public static int getPlayerDiscounts(LivingEntity e, Spell spell, ItemStack casterStack) { if (e == null) return 0; AtomicInteger discounts = new AtomicInteger(); - CuriosUtil.getAllWornItems(e).ifPresent(items -> { + var items = CuriosUtil.getAllWornItems(e); + if(items != null){ for (int i = 0; i < items.getSlots(); i++) { ItemStack item = items.getStackInSlot(i); if (item.getItem() instanceof IManaDiscountEquipment discountItem) discounts.addAndGet(discountItem.getManaDiscount(item, spell)); } - }); + } for (ItemStack armor : e.getArmorSlots()) { if (armor.getItem() instanceof IManaDiscountEquipment discountItem) discounts.addAndGet(discountItem.getManaDiscount(armor, spell)); @@ -56,8 +59,8 @@ public int getRealMax() { // UUIDs for the configurable bonus on mana attributes, to include them in multiplier calculations. // Only updated if the value changes. - static final UUID MAX_MANA_MODIFIER = UUID.fromString("6662fdb1-bc67-49bc-9bba-8e306bbc1ae6"); - static final UUID MANA_REGEN_MODIFIER = UUID.fromString("3bd42486-6a51-44c4-a88f-04021af5df03"); + static final ResourceLocation MAX_MANA_MODIFIER = ArsNouveau.prefix("MAX_MANA_MOD"); + static final ResourceLocation MANA_REGEN_MODIFIER = ArsNouveau.prefix("MANA_REGEN_MOD"); // Calculate Max Mana & Mana Reserve to keep track of the mana reserved by familiars & co. public static Mana calcMaxMana(Player e) { @@ -73,12 +76,12 @@ public static Mana calcMaxMana(Player e) { rawMax += numGlyphs * ServerConfig.GLYPH_MAX_BONUS.get(); rawMax += tier * ServerConfig.TIER_MAX_BONUS.get(); - var manaAttribute = e.getAttribute(PerkAttributes.MAX_MANA.get()); + var manaAttribute = e.getAttribute(PerkAttributes.MAX_MANA); if (manaAttribute != null) { var manaCache = manaAttribute.getModifier(MAX_MANA_MODIFIER); - if (manaCache == null || manaCache.getAmount() != rawMax) { + if (manaCache == null || manaCache.amount() != rawMax) { if (manaCache != null) manaAttribute.removeModifier(manaCache); - manaAttribute.addTransientModifier(new AttributeModifier(MAX_MANA_MODIFIER, "Mana Cache", rawMax, AttributeModifier.Operation.ADDITION)); + manaAttribute.addTransientModifier(new AttributeModifier(MAX_MANA_MODIFIER, rawMax, AttributeModifier.Operation.ADD_VALUE)); } rawMax = manaAttribute.getValue(); } @@ -110,12 +113,12 @@ public static double getManaRegen(Player e) { regen += tier * ServerConfig.TIER_REGEN_BONUS.get(); regen += ServerConfig.INIT_MANA_REGEN.get(); - var manaAttribute = e.getAttribute(PerkAttributes.MANA_REGEN_BONUS.get()); + var manaAttribute = e.getAttribute(PerkAttributes.MANA_REGEN_BONUS); if (manaAttribute != null) { var manaCache = manaAttribute.getModifier(MANA_REGEN_MODIFIER); - if (manaCache == null || manaCache.getAmount() != regen) { + if (manaCache == null || manaCache.amount() != regen) { if (manaCache != null) manaAttribute.removeModifier(manaCache); - manaAttribute.addTransientModifier(new AttributeModifier(MANA_REGEN_MODIFIER, "Mana Regen Cache", regen, AttributeModifier.Operation.ADDITION)); + manaAttribute.addTransientModifier(new AttributeModifier(MANA_REGEN_MODIFIER, regen, AttributeModifier.Operation.ADD_VALUE)); } regen = manaAttribute.getValue(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java index 1a59b33859..b34bcca534 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java @@ -12,14 +12,17 @@ import net.minecraft.world.entity.player.StackedContents; import net.minecraft.world.inventory.*; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeHolder; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; -public class StorageTerminalMenu extends RecipeBookMenu { +public class StorageTerminalMenu extends RecipeBookMenu { protected StorageLecternTile te; protected int playerSlotsStart; protected List storageSlotList = new ArrayList<>(); @@ -180,7 +183,7 @@ public void clearCraftingContent() { } @Override - public boolean recipeMatches(Recipe recipeIn) { + public boolean recipeMatches(RecipeHolder pRecipe) { return false; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java index f70a940671..de75c3518f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java @@ -18,13 +18,12 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.RegisterClientTooltipComponentFactoriesEvent; -import net.neoforged.neoforge.client.event.RenderGuiOverlayEvent; import net.neoforged.neoforge.client.event.RenderHighlightEvent; import net.neoforged.neoforge.client.event.RenderTooltipEvent; -import net.neoforged.neoforge.client.gui.overlay.VanillaGuiOverlay; import net.neoforged.neoforge.event.entity.player.ItemTooltipEvent; + import java.util.Collections; @EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientPlayerEvent.java b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientPlayerEvent.java index 123b618f8e..7f117152ee 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientPlayerEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientPlayerEvent.java @@ -6,7 +6,7 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GlyphRecipeTooltip.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GlyphRecipeTooltip.java index 41076620ac..6bd57eadc3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GlyphRecipeTooltip.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GlyphRecipeTooltip.java @@ -13,7 +13,7 @@ import java.util.List; public class GlyphRecipeTooltip implements ClientTooltipComponent { - public static final ResourceLocation TEXTURE_LOCATION = new ResourceLocation("textures/gui/container/bundle.png"); + public static final ResourceLocation TEXTURE_LOCATION = ResourceLocation.withDefaultNamespace("textures/gui/container/bundle.png"); private static final int MARGIN_Y = 4; private static final int BORDER_WIDTH = 1; private static final int TEX_SIZE = 128; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIConstants.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIConstants.java index ae166ac349..faf070a594 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIConstants.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIConstants.java @@ -5,10 +5,10 @@ public class JEIConstants { public static final String TEXTURE_GUI_PATH = "textures/jei/gui/"; public static final String TEXTURE_GUI_VANILLA = TEXTURE_GUI_PATH + "gui_vanilla.png"; - public static final ResourceLocation RECIPE_GUI_VANILLA = new ResourceLocation("jei", TEXTURE_GUI_VANILLA); + public static final ResourceLocation RECIPE_GUI_VANILLA = ResourceLocation.fromNamespaceAndPath("jei", TEXTURE_GUI_VANILLA); - public static final int MAX_TOOLTIP_WIDTH = 150; - public static final ResourceLocation UNIVERSAL_RECIPE_TRANSFER_UID = new ResourceLocation("jei", "universal_recipe_transfer_handler"); - public static final ResourceLocation LOCATION_JEI_GUI_TEXTURE_ATLAS = new ResourceLocation("jei", "textures/atlas/gui.png"); +// public static final int MAX_TOOLTIP_WIDTH = 150; +// public static final ResourceLocation UNIVERSAL_RECIPE_TRANSFER_UID = new ResourceLocation("jei", "universal_recipe_transfer_handler"); +// public static final ResourceLocation LOCATION_JEI_GUI_TEXTURE_ATLAS = new ResourceLocation("jei", "textures/atlas/gui.png"); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/keybindings/KeyHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/keybindings/KeyHandler.java index 9a320cc823..41f4b77452 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/keybindings/KeyHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/keybindings/KeyHandler.java @@ -17,9 +17,8 @@ import net.minecraft.world.item.ItemStack; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.InputEvent; -import net.neoforged.neoforge.common.util.LazyOptional; import net.neoforged.neoforge.items.IItemHandlerModifiable; import static com.hollingsworth.arsnouveau.api.util.StackUtil.getHeldSpellbook; @@ -110,25 +109,26 @@ public static void checkCasterKeys(int key) { } public static void checkCurioHotkey(int keyMapping) { - for (KeyMapping mapping : CURIO_MAPPINGS) { - if (mapping.getKey().getValue() == keyMapping) { - LazyOptional stacks = CuriosUtil.getAllWornItems(MINECRAFT.player); - if (!stacks.isPresent()) - return; - IItemHandlerModifiable handler = stacks.orElse(null); - for (int i = 0; i < handler.getSlots(); i++) { - ItemStack stack = handler.getStackInSlot(i); - if (stack.getItem() instanceof IRadialProvider radialProvider) { - if (MINECRAFT.screen instanceof GuiRadialMenu) { - MINECRAFT.player.closeContainer(); - } else { - radialProvider.onRadialKeyPressed(stack, MINECRAFT.player); - } - } - } - return; - } - } + // todo: curios +// for (KeyMapping mapping : CURIO_MAPPINGS) { +// if (mapping.getKey().getValue() == keyMapping) { +// LazyOptional stacks = CuriosUtil.getAllWornItems(MINECRAFT.player); +// if (!stacks.isPresent()) +// return; +// IItemHandlerModifiable handler = stacks.orElse(null); +// for (int i = 0; i < handler.getSlots(); i++) { +// ItemStack stack = handler.getStackInSlot(i); +// if (stack.getItem() instanceof IRadialProvider radialProvider) { +// if (MINECRAFT.screen instanceof GuiRadialMenu) { +// MINECRAFT.player.closeContainer(); +// } else { +// radialProvider.onRadialKeyPressed(stack, MINECRAFT.player); +// } +// } +// } +// return; +// } +// } } @SubscribeEvent diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ApparatusProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ApparatusProcessor.java index f46a0b1376..5e43234c8b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ApparatusProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ApparatusProcessor.java @@ -1,45 +1,45 @@ -package com.hollingsworth.arsnouveau.client.patchouli; - - -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; -import net.minecraft.client.Minecraft; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.level.Level; -import vazkii.patchouli.api.IComponentProcessor; -import vazkii.patchouli.api.IVariable; -import vazkii.patchouli.api.IVariableProvider; - -import java.util.Arrays; -import java.util.stream.Collectors; - -public class ApparatusProcessor implements IComponentProcessor { - EnchantingApparatusRecipe recipe; - - @Override - public void setup(Level level, IVariableProvider variables) { - RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); - String recipeID = variables.get("recipe").asString(); - recipe = (EnchantingApparatusRecipe) manager.byKey(new ResourceLocation(recipeID)).orElse(null); - } - - @Override - public IVariable process(Level level, String key) { - if (recipe == null) - return null; - if (key.equals("reagent")) - return IVariable.wrapList(Arrays.stream(recipe.reagent.getItems()).map(IVariable::from).collect(Collectors.toList())); - - if (key.equals("recipe")) { - return IVariable.wrap(recipe.getId().toString()); - } - if (key.equals("output")) { - return IVariable.from(recipe.result); - } - if (key.equals("footer")) { - return IVariable.wrap(recipe.result.getItem().getDescriptionId()); - } - - return null; - } -} +//package com.hollingsworth.arsnouveau.client.patchouli; +// +// +//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; +//import net.minecraft.client.Minecraft; +//import net.minecraft.resources.ResourceLocation; +//import net.minecraft.world.item.crafting.RecipeManager; +//import net.minecraft.world.level.Level; +//import vazkii.patchouli.api.IComponentProcessor; +//import vazkii.patchouli.api.IVariable; +//import vazkii.patchouli.api.IVariableProvider; +// +//import java.util.Arrays; +//import java.util.stream.Collectors; +// +//public class ApparatusProcessor implements IComponentProcessor { +// EnchantingApparatusRecipe recipe; +// +// @Override +// public void setup(Level level, IVariableProvider variables) { +// RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); +// String recipeID = variables.get("recipe").asString(); +// recipe = (EnchantingApparatusRecipe) manager.byKey(ResourceLocation.tryParse(recipeID)).orElse(null); +// } +// +// @Override +// public IVariable process(Level level, String key) { +// if (recipe == null) +// return null; +// if (key.equals("reagent")) +// return IVariable.wrapList(Arrays.stream(recipe.reagent.getItems()).map(IVariable::from).collect(Collectors.toList())); +// +// if (key.equals("recipe")) { +// return IVariable.wrap(recipe.getId().toString()); +// } +// if (key.equals("output")) { +// return IVariable.from(recipe.result); +// } +// if (key.equals("footer")) { +// return IVariable.wrap(recipe.result.getItem().getDescriptionId()); +// } +// +// return null; +// } +//} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/EnchantmentProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/EnchantmentProcessor.java index d0ae359daa..9240311808 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/EnchantmentProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/EnchantmentProcessor.java @@ -1,47 +1,47 @@ -package com.hollingsworth.arsnouveau.client.patchouli; - - -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantmentRecipe; -import net.minecraft.client.Minecraft; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.level.Level; -import vazkii.patchouli.api.IComponentProcessor; -import vazkii.patchouli.api.IVariable; -import vazkii.patchouli.api.IVariableProvider; - -import java.util.Arrays; -import java.util.stream.Collectors; - -public class EnchantmentProcessor implements IComponentProcessor { - EnchantmentRecipe recipe; - - @Override - public void setup(Level level, IVariableProvider variables) { - RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); - String recipeID = variables.get("recipe").asString(); - recipe = (EnchantmentRecipe) manager.byKey(new ResourceLocation(recipeID)).orElse(null); - } - - @Override - public IVariable process(Level level, String key) { - if (recipe == null) - return null; - if (key.equals("enchantment")) - return IVariable.wrap(recipe.enchantment.getDescriptionId()); - if (key.equals("level")) - return IVariable.wrap(recipe.enchantLevel); - - if (key.startsWith("item")) { - int index = Integer.parseInt(key.substring(4)) - 1; - if (recipe.pedestalItems.size() <= index) - return IVariable.from(ItemStack.EMPTY); - Ingredient ingredient = recipe.pedestalItems.get(Integer.parseInt(key.substring(4)) - 1); - return IVariable.wrapList(Arrays.stream(ingredient.getItems()).map(IVariable::from).collect(Collectors.toList())); - } - - return null; - } -} +//package com.hollingsworth.arsnouveau.client.patchouli; +// +// +//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantmentRecipe; +//import net.minecraft.client.Minecraft; +//import net.minecraft.resources.ResourceLocation; +//import net.minecraft.world.item.ItemStack; +//import net.minecraft.world.item.crafting.Ingredient; +//import net.minecraft.world.item.crafting.RecipeManager; +//import net.minecraft.world.level.Level; +//import vazkii.patchouli.api.IComponentProcessor; +//import vazkii.patchouli.api.IVariable; +//import vazkii.patchouli.api.IVariableProvider; +// +//import java.util.Arrays; +//import java.util.stream.Collectors; +// +//public class EnchantmentProcessor implements IComponentProcessor { +// EnchantmentRecipe recipe; +// +// @Override +// public void setup(Level level, IVariableProvider variables) { +// RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); +// String recipeID = variables.get("recipe").asString(); +// recipe = (EnchantmentRecipe) manager.byKey(ResourceLocation.tryParse(recipeID)).orElse(null); +// } +// +// @Override +// public IVariable process(Level level, String key) { +// if (recipe == null) +// return null; +// if (key.equals("enchantment")) +// return IVariable.wrap(recipe.enchantment.getDescriptionId()); +// if (key.equals("level")) +// return IVariable.wrap(recipe.enchantLevel); +// +// if (key.startsWith("item")) { +// int index = Integer.parseInt(key.substring(4)) - 1; +// if (recipe.pedestalItems.size() <= index) +// return IVariable.from(ItemStack.EMPTY); +// Ingredient ingredient = recipe.pedestalItems.get(Integer.parseInt(key.substring(4)) - 1); +// return IVariable.wrapList(Arrays.stream(ingredient.getItems()).map(IVariable::from).collect(Collectors.toList())); +// } +// +// return null; +// } +//} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/GlyphProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/GlyphProcessor.java index a2ca7271dc..bab5300021 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/GlyphProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/GlyphProcessor.java @@ -1,66 +1,66 @@ -package com.hollingsworth.arsnouveau.client.patchouli; - -import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; -import com.hollingsworth.arsnouveau.api.spell.SpellSchool; -import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; -import com.hollingsworth.arsnouveau.common.items.Glyph; -import net.minecraft.client.Minecraft; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.level.Level; -import vazkii.patchouli.api.IComponentProcessor; -import vazkii.patchouli.api.IVariable; -import vazkii.patchouli.api.IVariableProvider; - -public class GlyphProcessor implements IComponentProcessor { - - GlyphRecipe recipe; - - @Override - public void setup(Level level, IVariableProvider variables) { - RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); - String recipeID = variables.get("recipe").asString(); - try { - recipe = (GlyphRecipe) manager.byKey(new ResourceLocation(recipeID)).orElse(null); - } catch (Exception ignored) { - } - } - - @Override - public IVariable process(Level level, String s) { - if (recipe == null) - return null; - - if (s.equals("tier")) - return IVariable.wrap(Component.translatable("ars_nouveau.tier").getString() + ": " + Component.translatable("ars_nouveau.spell_tier." + recipe.getSpellPart().getConfigTier().value).getString()); - if (s.equals("schools")) { - AbstractSpellPart part = ((Glyph) recipe.output.getItem()).spellPart; - StringBuilder str = new StringBuilder(Component.translatable("ars_nouveau.spell_schools").getString() + ": "); - for (SpellSchool spellSchool : part.spellSchools) { - str.append(spellSchool.getTextComponent().getString()).append(","); - } - if (!part.spellSchools.isEmpty()) - str = new StringBuilder(str.substring(0, str.length() - 1)); - return IVariable.wrap(str.toString()); - } - if (s.equals("mana_cost")) { - if (recipe.output.getItem() instanceof Glyph) { - int cost = ((Glyph) recipe.output.getItem()).spellPart.getCastingCost(); - String costLang = ""; - if (cost == 0) - costLang = Component.translatable("ars_nouveau.mana_cost.none").getString(); - if (cost < 20) - costLang = Component.translatable("ars_nouveau.mana_cost.low").getString(); - if (cost < 50) - costLang = Component.translatable("ars_nouveau.mana_cost.medium").getString(); - if (cost >= 50) - costLang = Component.translatable("ars_nouveau.mana_cost.high").getString(); - return IVariable.wrap(Component.translatable("ars_nouveau.casting_cost").getString() + ": " + costLang); - } - return IVariable.wrap(""); - } - return null; - } -} - +//package com.hollingsworth.arsnouveau.client.patchouli; +// +//import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; +//import com.hollingsworth.arsnouveau.api.spell.SpellSchool; +//import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; +//import com.hollingsworth.arsnouveau.common.items.Glyph; +//import net.minecraft.client.Minecraft; +//import net.minecraft.network.chat.Component; +//import net.minecraft.resources.ResourceLocation; +//import net.minecraft.world.item.crafting.RecipeManager; +//import net.minecraft.world.level.Level; +//import vazkii.patchouli.api.IComponentProcessor; +//import vazkii.patchouli.api.IVariable; +//import vazkii.patchouli.api.IVariableProvider; +// +//public class GlyphProcessor implements IComponentProcessor { +// +// GlyphRecipe recipe; +// +// @Override +// public void setup(Level level, IVariableProvider variables) { +// RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); +// String recipeID = variables.get("recipe").asString(); +// try { +// recipe = (GlyphRecipe) manager.byKey(ResourceLocation.tryParse(recipeID)).orElse(null); +// } catch (Exception ignored) { +// } +// } +// +// @Override +// public IVariable process(Level level, String s) { +// if (recipe == null) +// return null; +// +// if (s.equals("tier")) +// return IVariable.wrap(Component.translatable("ars_nouveau.tier").getString() + ": " + Component.translatable("ars_nouveau.spell_tier." + recipe.getSpellPart().getConfigTier().value).getString()); +// if (s.equals("schools")) { +// AbstractSpellPart part = ((Glyph) recipe.output.getItem()).spellPart; +// StringBuilder str = new StringBuilder(Component.translatable("ars_nouveau.spell_schools").getString() + ": "); +// for (SpellSchool spellSchool : part.spellSchools) { +// str.append(spellSchool.getTextComponent().getString()).append(","); +// } +// if (!part.spellSchools.isEmpty()) +// str = new StringBuilder(str.substring(0, str.length() - 1)); +// return IVariable.wrap(str.toString()); +// } +// if (s.equals("mana_cost")) { +// if (recipe.output.getItem() instanceof Glyph) { +// int cost = ((Glyph) recipe.output.getItem()).spellPart.getCastingCost(); +// String costLang = ""; +// if (cost == 0) +// costLang = Component.translatable("ars_nouveau.mana_cost.none").getString(); +// if (cost < 20) +// costLang = Component.translatable("ars_nouveau.mana_cost.low").getString(); +// if (cost < 50) +// costLang = Component.translatable("ars_nouveau.mana_cost.medium").getString(); +// if (cost >= 50) +// costLang = Component.translatable("ars_nouveau.mana_cost.high").getString(); +// return IVariable.wrap(Component.translatable("ars_nouveau.casting_cost").getString() + ": " + costLang); +// } +// return IVariable.wrap(""); +// } +// return null; +// } +//} +// diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ImbuementProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ImbuementProcessor.java index ba3e88399e..1d032e17df 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ImbuementProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ImbuementProcessor.java @@ -1,44 +1,44 @@ -package com.hollingsworth.arsnouveau.client.patchouli; - -import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; -import net.minecraft.client.Minecraft; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.level.Level; -import vazkii.patchouli.api.IComponentProcessor; -import vazkii.patchouli.api.IVariable; -import vazkii.patchouli.api.IVariableProvider; - -import java.util.Arrays; -import java.util.stream.Collectors; - -public class ImbuementProcessor implements IComponentProcessor { - ImbuementRecipe recipe; - - @Override - public void setup(Level level, IVariableProvider variables) { - RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); - String recipeID = variables.get("recipe").asString(); - recipe = (ImbuementRecipe) manager.byKey(new ResourceLocation(recipeID)).orElse(null); - } - - @Override - public IVariable process(Level level, String key) { - if (recipe == null) - return null; - if (key.equals("reagent")) - return IVariable.wrapList(Arrays.stream(recipe.input.getItems()).map(IVariable::from).collect(Collectors.toList())); - - if (key.equals("recipe")) { - return IVariable.wrap(recipe.getId().toString()); - } - if (key.equals("output")) { - return IVariable.from(recipe.output); - } - if (key.equals("footer")) { - return IVariable.wrap(recipe.output.getItem().getDescriptionId()); - } - - return null; - } -} +//package com.hollingsworth.arsnouveau.client.patchouli; +// +//import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; +//import net.minecraft.client.Minecraft; +//import net.minecraft.resources.ResourceLocation; +//import net.minecraft.world.item.crafting.RecipeManager; +//import net.minecraft.world.level.Level; +//import vazkii.patchouli.api.IComponentProcessor; +//import vazkii.patchouli.api.IVariable; +//import vazkii.patchouli.api.IVariableProvider; +// +//import java.util.Arrays; +//import java.util.stream.Collectors; +// +//public class ImbuementProcessor implements IComponentProcessor { +// ImbuementRecipe recipe; +// +// @Override +// public void setup(Level level, IVariableProvider variables) { +// RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); +// String recipeID = variables.get("recipe").asString(); +// recipe = (ImbuementRecipe) manager.byKey(ResourceLocation.tryParse(recipeID)).orElse(null); +// } +// +// @Override +// public IVariable process(Level level, String key) { +// if (recipe == null) +// return null; +// if (key.equals("reagent")) +// return IVariable.wrapList(Arrays.stream(recipe.input.getItems()).map(IVariable::from).collect(Collectors.toList())); +// +// if (key.equals("recipe")) { +// return IVariable.wrap(recipe.getId().toString()); +// } +// if (key.equals("output")) { +// return IVariable.from(recipe.output); +// } +// if (key.equals("footer")) { +// return IVariable.wrap(recipe.output.getItem().getDescriptionId()); +// } +// +// return null; +// } +//} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/NoOutputApparatusProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/NoOutputApparatusProcessor.java index 646a1b712b..f0d2a28c00 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/NoOutputApparatusProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/NoOutputApparatusProcessor.java @@ -1,45 +1,45 @@ -package com.hollingsworth.arsnouveau.client.patchouli; - -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.ITextOutput; -import net.minecraft.client.Minecraft; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.level.Level; -import vazkii.patchouli.api.IComponentProcessor; -import vazkii.patchouli.api.IVariable; -import vazkii.patchouli.api.IVariableProvider; - -import java.util.Arrays; -import java.util.stream.Collectors; - -public class NoOutputApparatusProcessor implements IComponentProcessor { - EnchantingApparatusRecipe recipe; - - @Override - public void setup(Level level, IVariableProvider variables) { - RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); - String recipeID = variables.get("recipe").asString(); - recipe = (EnchantingApparatusRecipe) manager.byKey(new ResourceLocation(recipeID)).orElse(null); - } - - @Override - public IVariable process(Level level, String key) { - if (recipe == null) - return null; - if (key.equals("reagent")) - return IVariable.wrapList(Arrays.stream(recipe.reagent.getItems()).map(IVariable::from).collect(Collectors.toList())); - - if (key.equals("recipe")) { - return IVariable.wrap(recipe.getId().toString()); - } - if(recipe instanceof ITextOutput textOutput && key.equals("output")){ - return IVariable.wrap(textOutput.getOutputComponent().getString()); - } - if (key.equals("footer")) { - return IVariable.wrap(recipe.result.getItem().getDescriptionId()); - } - return null; - } -} - +//package com.hollingsworth.arsnouveau.client.patchouli; +// +//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; +//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.ITextOutput; +//import net.minecraft.client.Minecraft; +//import net.minecraft.resources.ResourceLocation; +//import net.minecraft.world.item.crafting.RecipeManager; +//import net.minecraft.world.level.Level; +//import vazkii.patchouli.api.IComponentProcessor; +//import vazkii.patchouli.api.IVariable; +//import vazkii.patchouli.api.IVariableProvider; +// +//import java.util.Arrays; +//import java.util.stream.Collectors; +// +//public class NoOutputApparatusProcessor implements IComponentProcessor { +// EnchantingApparatusRecipe recipe; +// +// @Override +// public void setup(Level level, IVariableProvider variables) { +// RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); +// String recipeID = variables.get("recipe").asString(); +// recipe = (EnchantingApparatusRecipe) manager.byKey(ResourceLocation.tryParse(recipeID)).orElse(null); +// } +// +// @Override +// public IVariable process(Level level, String key) { +// if (recipe == null) +// return null; +// if (key.equals("reagent")) +// return IVariable.wrapList(Arrays.stream(recipe.reagent.getItems()).map(IVariable::from).collect(Collectors.toList())); +// +// if (key.equals("recipe")) { +// return IVariable.wrap(recipe.getId().toString()); +// } +// if(recipe instanceof ITextOutput textOutput && key.equals("output")){ +// return IVariable.wrap(textOutput.getOutputComponent().getString()); +// } +// if (key.equals("footer")) { +// return IVariable.wrap(recipe.result.getItem().getDescriptionId()); +// } +// return null; +// } +//} +// diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponent.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponent.java index a0594ff0ec..3dec95ca92 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponent.java @@ -1,66 +1,66 @@ -package com.hollingsworth.arsnouveau.client.patchouli.component; - -import com.google.common.collect.ImmutableList; -import com.google.gson.annotations.SerializedName; -import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.IEnchantingRecipe; -import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; -import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; -import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.RecipeType; -import vazkii.patchouli.api.IVariable; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.function.UnaryOperator; - -public class RotatingItemListComponent extends RotatingItemListComponentBase { - @SerializedName("recipe_name") - public String recipeName; - - @SerializedName("recipe_type") - public String recipeType; - - - - @Override - protected List makeIngredients() { - ClientLevel world = Minecraft.getInstance().level; - if (world == null) return new ArrayList<>(); - - Map> map; - if ("enchanting_apparatus".equals(recipeType)) { - EnchantingApparatusRecipe recipe = world.getRecipeManager().getAllRecipesFor(RecipeRegistry.APPARATUS_TYPE.get()).stream().filter(f -> f.id.toString().equals(recipeName)).findFirst().orElse(null); - for(RecipeType type : ArsNouveauAPI.getInstance().getEnchantingRecipeTypes()){ - RecipeType enchantingRecipeRecipeType = (RecipeType) type; - Recipe recipe1 = world.getRecipeManager().getAllRecipesFor(enchantingRecipeRecipeType).stream().filter(f -> f.getId().toString().equals(recipeName)).findFirst().orElse(null); - if(recipe1 instanceof EnchantingApparatusRecipe enchantingApparatusRecipe){ - recipe = enchantingApparatusRecipe; - break; - } - } - return recipe == null ? ImmutableList.of() : recipe.pedestalItems; - } else if ("imbuement_chamber".equals(recipeType)) { - ImbuementRecipe recipe = world.getRecipeManager().getAllRecipesFor(RecipeRegistry.IMBUEMENT_TYPE.get()).stream().filter(f -> f.id.toString().equals(recipeName)).findFirst().orElse(null); - return recipe == null ? ImmutableList.of() : recipe.pedestalItems; - } else if ("glyph_recipe".equals(recipeType)) { - GlyphRecipe recipe = (GlyphRecipe) world.getRecipeManager().byKey(new ResourceLocation(recipeName)).orElse(null); - return recipe == null ? ImmutableList.of() : recipe.inputs; - } else { - throw new IllegalArgumentException("Type must be 'enchanting_apparatus', 'glyph_recipe', or 'imbuement_chamber'!"); - } - } - - @Override - public void onVariablesAvailable(UnaryOperator lookup) { - recipeName = lookup.apply(IVariable.wrap(recipeName)).asString(); - recipeType = lookup.apply(IVariable.wrap(recipeType)).asString(); - } -} +//package com.hollingsworth.arsnouveau.client.patchouli.component; +// +//import com.google.common.collect.ImmutableList; +//import com.google.gson.annotations.SerializedName; +//import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; +//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; +//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.IEnchantingRecipe; +//import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; +//import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; +//import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +//import net.minecraft.client.Minecraft; +//import net.minecraft.client.multiplayer.ClientLevel; +//import net.minecraft.resources.ResourceLocation; +//import net.minecraft.world.item.crafting.Ingredient; +//import net.minecraft.world.item.crafting.Recipe; +//import net.minecraft.world.item.crafting.RecipeType; +//import vazkii.patchouli.api.IVariable; +// +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Map; +//import java.util.function.UnaryOperator; +// +//public class RotatingItemListComponent extends RotatingItemListComponentBase { +// @SerializedName("recipe_name") +// public String recipeName; +// +// @SerializedName("recipe_type") +// public String recipeType; +// +// +// +// @Override +// protected List makeIngredients() { +// ClientLevel world = Minecraft.getInstance().level; +// if (world == null) return new ArrayList<>(); +// +// Map> map; +// if ("enchanting_apparatus".equals(recipeType)) { +// EnchantingApparatusRecipe recipe = world.getRecipeManager().getAllRecipesFor(RecipeRegistry.APPARATUS_TYPE.get()).stream().filter(f -> f.id.toString().equals(recipeName)).findFirst().orElse(null); +// for(RecipeType type : ArsNouveauAPI.getInstance().getEnchantingRecipeTypes()){ +// RecipeType enchantingRecipeRecipeType = (RecipeType) type; +// Recipe recipe1 = world.getRecipeManager().getAllRecipesFor(enchantingRecipeRecipeType).stream().filter(f -> f.getId().toString().equals(recipeName)).findFirst().orElse(null); +// if(recipe1 instanceof EnchantingApparatusRecipe enchantingApparatusRecipe){ +// recipe = enchantingApparatusRecipe; +// break; +// } +// } +// return recipe == null ? ImmutableList.of() : recipe.pedestalItems; +// } else if ("imbuement_chamber".equals(recipeType)) { +// ImbuementRecipe recipe = world.getRecipeManager().getAllRecipesFor(RecipeRegistry.IMBUEMENT_TYPE.get()).stream().filter(f -> f.id.toString().equals(recipeName)).findFirst().orElse(null); +// return recipe == null ? ImmutableList.of() : recipe.pedestalItems; +// } else if ("glyph_recipe".equals(recipeType)) { +// GlyphRecipe recipe = (GlyphRecipe) world.getRecipeManager().byKey(ResourceLocation.tryParse(recipeName)).orElse(null); +// return recipe == null ? ImmutableList.of() : recipe.inputs; +// } else { +// throw new IllegalArgumentException("Type must be 'enchanting_apparatus', 'glyph_recipe', or 'imbuement_chamber'!"); +// } +// } +// +// @Override +// public void onVariablesAvailable(UnaryOperator lookup) { +// recipeName = lookup.apply(IVariable.wrap(recipeName)).asString(); +// recipeType = lookup.apply(IVariable.wrap(recipeType)).asString(); +// } +//} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponentBase.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponentBase.java index a46de75f38..48093aae51 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponentBase.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponentBase.java @@ -1,57 +1,57 @@ -package com.hollingsworth.arsnouveau.client.patchouli.component; - -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.world.item.crafting.Ingredient; -import vazkii.patchouli.api.IComponentRenderContext; -import vazkii.patchouli.api.ICustomComponent; - -import java.util.List; - -/** - * Base custom Patchouli component that draws a rotating circle of items. - * Size is 80x80. For a centered one, set X to -1. - */ -abstract class RotatingItemListComponentBase implements ICustomComponent { - protected transient List ingredients; - protected transient int x, y; - - @Override - public void build(int componentX, int componentY, int pageNum) { - this.x = componentX != -1 ? componentX : 17; - this.y = componentY; - this.ingredients = makeIngredients(); - } - - protected abstract List makeIngredients(); - - @Override - public void render(GuiGraphics ms, IComponentRenderContext context, float pticks, int mouseX, int mouseY) { - int degreePerInput = (int) (360F / ingredients.size()); - int ticksElapsed = 0; - float currentDegree = ticksElapsed; - for (Ingredient input : ingredients) { - renderIngredientAtAngle(ms, context, currentDegree, input, mouseX, mouseY); - - currentDegree += degreePerInput; - } - } - - - private void renderIngredientAtAngle(GuiGraphics graphics, IComponentRenderContext context, float angle, Ingredient ingredient, int mouseX, int mouseY) { - if (ingredient.isEmpty()) { - return; - } - - angle -= 90; - int radius = 32; - double xPos = x + Math.cos(angle * Math.PI / 180D) * radius + 32; - double yPos = y + Math.sin(angle * Math.PI / 180D) * radius + 32; - PoseStack ms = graphics.pose(); - ms.pushPose(); // This translation makes it not stuttery. It does not affect the tooltip as that is drawn separately later. - ms.translate(xPos - (int) xPos, yPos - (int) yPos, 0); - context.renderIngredient(graphics, (int) xPos, (int) yPos, mouseX, mouseY, ingredient); - ms.popPose(); - } - -} \ No newline at end of file +//package com.hollingsworth.arsnouveau.client.patchouli.component; +// +//import com.mojang.blaze3d.vertex.PoseStack; +//import net.minecraft.client.gui.GuiGraphics; +//import net.minecraft.world.item.crafting.Ingredient; +//import vazkii.patchouli.api.IComponentRenderContext; +//import vazkii.patchouli.api.ICustomComponent; +// +//import java.util.List; +// +///** +// * Base custom Patchouli component that draws a rotating circle of items. +// * Size is 80x80. For a centered one, set X to -1. +// */ +//abstract class RotatingItemListComponentBase implements ICustomComponent { +// protected transient List ingredients; +// protected transient int x, y; +// +// @Override +// public void build(int componentX, int componentY, int pageNum) { +// this.x = componentX != -1 ? componentX : 17; +// this.y = componentY; +// this.ingredients = makeIngredients(); +// } +// +// protected abstract List makeIngredients(); +// +// @Override +// public void render(GuiGraphics ms, IComponentRenderContext context, float pticks, int mouseX, int mouseY) { +// int degreePerInput = (int) (360F / ingredients.size()); +// int ticksElapsed = 0; +// float currentDegree = ticksElapsed; +// for (Ingredient input : ingredients) { +// renderIngredientAtAngle(ms, context, currentDegree, input, mouseX, mouseY); +// +// currentDegree += degreePerInput; +// } +// } +// +// +// private void renderIngredientAtAngle(GuiGraphics graphics, IComponentRenderContext context, float angle, Ingredient ingredient, int mouseX, int mouseY) { +// if (ingredient.isEmpty()) { +// return; +// } +// +// angle -= 90; +// int radius = 32; +// double xPos = x + Math.cos(angle * Math.PI / 180D) * radius + 32; +// double yPos = y + Math.sin(angle * Math.PI / 180D) * radius + 32; +// PoseStack ms = graphics.pose(); +// ms.pushPose(); // This translation makes it not stuttery. It does not affect the tooltip as that is drawn separately later. +// ms.translate(xPos - (int) xPos, yPos - (int) yPos, 0); +// context.renderIngredient(graphics, (int) xPos, (int) yPos, mouseX, mouseY, ingredient); +// ms.popPose(); +// } +// +//} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index 5941579859..53ba7bea83 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -13,6 +13,7 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.renderer.entity.*; import com.hollingsworth.arsnouveau.client.renderer.entity.familiar.*; +import com.hollingsworth.arsnouveau.client.renderer.tile.GenericRenderer; import com.hollingsworth.arsnouveau.client.renderer.tile.*; import com.hollingsworth.arsnouveau.common.block.tile.MageBlockTile; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; @@ -33,25 +34,20 @@ import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; -import net.neoforged.neoforge.client.event.RegisterGuiOverlaysEvent; -import net.neoforged.neoforge.client.gui.overlay.NamedGuiOverlay; -import net.neoforged.neoforge.client.gui.overlay.VanillaGuiOverlay; - import org.jetbrains.annotations.Nullable; import static com.hollingsworth.arsnouveau.client.events.ClientEvents.localize; @@ -167,7 +163,7 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer if (!CameraUtil.isPlayerMountedOnCamera(mc.player)) { return; } - if (!mc.options.renderDebug) { + if (!mc.options.reducedDebugInfo().get()) { BlockEntity var10 = level.getBlockEntity(pos); if (var10 instanceof ICameraMountable be) { Font font = Minecraft.getInstance().font; @@ -331,6 +327,6 @@ public static int colorFromArmor(ItemStack stack) { public static int colorFromFlask(ItemStack stack) { PotionFlask.FlaskData data = new PotionFlask.FlaskData(stack); - return data.getPotion().getPotion() == Potions.EMPTY ? -1 : PotionUtils.getColor(data.getPotion().asPotionStack()); + return data.getPotion().getPotion() == PotionContents.EMPTY ? -1 : data.getPotion().getPotion().getColor(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java index b660f8c8aa..cfb856e282 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java @@ -9,7 +9,7 @@ import net.neoforged.neoforge.client.event.RegisterParticleProvidersEvent; import net.neoforged.neoforge.registries.DeferredRegister; -import net.neoforged.neoforge.registries.RegistryObject; + import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/RenderSpell.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/RenderSpell.java index c1d2d7730a..94b1d6dd2f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/RenderSpell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/RenderSpell.java @@ -9,8 +9,7 @@ import net.minecraft.resources.ResourceLocation; public class RenderSpell extends EntityRenderer { - private final ResourceLocation entityTexture; // new ResourceLocation(ExampleMod.MODID, "textures/entity/spell_proj.png"); - + private final ResourceLocation entityTexture; public RenderSpell(EntityRendererProvider.Context renderManagerIn, ResourceLocation entityTexture) { super(renderManagerIn); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java index c66da88b06..10ba67512c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java @@ -9,7 +9,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.alchemy.PotionUtils; + import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.model.GeoModel; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java index 9e35946d75..3b7a83cd2d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java @@ -173,7 +173,7 @@ public ResourceLocation getArmorResource(ItemStack stack, EquipmentSlot slot, @N ResourceLocation resourcelocation = ARMOR_LOCATION_CACHE.get(s1); if (resourcelocation == null) { - resourcelocation = new ResourceLocation(s1); + resourcelocation = ResourceLocation.tryParse(s1); ARMOR_LOCATION_CACHE.put(s1, resourcelocation); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericRenderer.java index e824d0a70f..04290105a3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericRenderer.java @@ -11,7 +11,6 @@ public class GenericRenderer extends GeoBlockRenderer { - public static GenericModel model = new GenericModel("source_relay"); public GenericRenderer(BlockEntityRendererProvider.Context rendererDispatcherIn, String loc) { super(new GenericModel(loc)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java index b2422b1576..479020e9d5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java @@ -15,6 +15,7 @@ import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -156,12 +157,12 @@ public void generateItems() { continue; } - LootTable loottable = this.level.getServer().getLootData().getLootTable(entity.getLootTable()); + LootTable loottable = this.level.registryAccess().registry(Registries.LOOT_TABLE).get().get(entity.getLootTable()); LootParams.Builder lootcontext$builder = (new LootParams.Builder((ServerLevel) this.level)) .withParameter(LootContextParams.THIS_ENTITY, entity).withParameter(LootContextParams.ORIGIN, entity.position()) .withParameter(LootContextParams.DAMAGE_SOURCE, damageSource) - .withOptionalParameter(LootContextParams.KILLER_ENTITY, fakePlayer) - .withOptionalParameter(LootContextParams.DIRECT_KILLER_ENTITY, damageSource.getDirectEntity()); + .withOptionalParameter(LootContextParams.ATTACKING_ENTITY, fakePlayer) + .withOptionalParameter(LootContextParams.DIRECT_ATTACKING_ENTITY, damageSource.getDirectEntity()); lootcontext$builder = lootcontext$builder.withParameter(LootContextParams.LAST_DAMAGE_PLAYER, fakePlayer) .withLuck(fakePlayer.getLuck()); @@ -170,7 +171,7 @@ public void generateItems() { if (entity instanceof Mob mob) { oldExp = mob.xpReward; } - exp += entity.getExperienceReward(); + exp += entity.getExperienceReward((ServerLevel) level, fakePlayer); if (entity instanceof Mob mob) { // EVERY TIME GET EXPERIENCE REWARD IS CALLED IN ZOMBIE ENTITY IT MULTIPLIES BY 2.5X. diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java index 47fab83e2c..ac449e4113 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java @@ -9,37 +9,29 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleLineData; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.block.ITickable; +import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; import com.hollingsworth.arsnouveau.common.entity.EntityFlyingItem; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.world.Container; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeInput; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.common.capabilities.Capabilities; -import net.neoforged.neoforge.common.capabilities.Capability; -import net.neoforged.neoforge.common.util.LazyOptional; -import net.neoforged.neoforge.items.IItemHandler; -import net.neoforged.neoforge.items.wrapper.InvWrapper; -import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -47,11 +39,11 @@ import java.util.List; -public class ImbuementTile extends AbstractSourceMachine implements Container, ITickable, GeoBlockEntity, ITooltipProvider, IPedestalMachine { +public class ImbuementTile extends AbstractSourceMachine implements Container, ITickable, GeoBlockEntity, ITooltipProvider, IPedestalMachine, RecipeInput { public ItemStack stack = ItemStack.EMPTY; public ItemEntity entity; public boolean draining; - RecipeHolder recipe; + ImbuementRecipe recipe; int backoff; public float frames; boolean hasRecipe; @@ -94,7 +86,8 @@ public void tick() { } } if(!stack.isEmpty() && recipe == null){ - this.recipe = getRecipeNow(); + RecipeHolder holder = getRecipeNow(); + this.recipe = holder != null ? holder.value() : null; } return; } @@ -111,9 +104,9 @@ public void tick() { // Restore the recipe on world restart if (recipe == null) { - RecipeHolder foundRecipe = getRecipeNow(); + RecipeHolder foundRecipe = getRecipeNow(); if(foundRecipe != null){ - this.recipe = foundRecipe; + this.recipe = foundRecipe.value(); this.craftTicks = 100; } } @@ -167,19 +160,17 @@ public void tick() { @Override protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.loadAdditional(tag, pRegistries); - stack = ItemStack.of((CompoundTag) tag.get("itemStack")); + stack = ItemStack.parseOptional(pRegistries, (CompoundTag) tag.get("itemStack")); draining = tag.getBoolean("draining"); this.hasRecipe = tag.getBoolean("hasRecipe"); this.craftTicks = tag.getInt("craftTicks"); - super.load(tag); } @Override protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); if (stack != null) { - CompoundTag reagentTag = new CompoundTag(); - stack.save(reagentTag); + Tag reagentTag = stack.save(pRegistries); tag.put("itemStack", reagentTag); } tag.putBoolean("draining", draining); @@ -207,7 +198,7 @@ public boolean canPlaceItem(int slot, ItemStack stack) { if (stack.isEmpty() || !this.stack.isEmpty()) return false; this.stack = stack.copy(); - RecipeHolder recipe = getRecipeNow(); + RecipeHolder recipe = getRecipeNow(); this.stack = ItemStack.EMPTY; return recipe != null; } @@ -222,6 +213,11 @@ public ItemStack getItem(int index) { return stack; } + @Override + public int size() { + return 1; + } + @Override public ItemStack removeItem(int index, int count) { ItemStack split = stack.split(count); @@ -292,18 +288,18 @@ public List getNearbyPedestals() { return pedestalList(getBlockPos(), 1, getLevel()); } - public @Nullable RecipeHolder getRecipeNow(){ + public @Nullable RecipeHolder getRecipeNow(){ return level.getRecipeManager().getAllRecipesFor(RecipeRegistry.IMBUEMENT_TYPE.get()).stream() - .filter(f -> f.matches(this, level)).findFirst().orElse(null); + .filter(f -> f.value().matches(this, level)).findFirst().orElse(null); } @Override public void getTooltip(List tooltip) { - RecipeHolder recipe = getRecipeNow(); - if(recipe != null && !recipe.output.isEmpty() && stack != null && !stack.isEmpty()) { - tooltip.add(Component.translatable("ars_nouveau.crafting", recipe.output.getHoverName())); - if(recipe.source > 0) { - tooltip.add(Component.translatable("ars_nouveau.crafting_progress", Math.min(100, (getSource() * 100) / recipe.source)).withStyle(ChatFormatting.GOLD)); + RecipeHolder recipe = getRecipeNow(); + if(recipe != null && !recipe.value().output.isEmpty() && stack != null && !stack.isEmpty()) { + tooltip.add(Component.translatable("ars_nouveau.crafting", recipe.value().output.getHoverName())); + if(recipe.value().source > 0) { + tooltip.add(Component.translatable("ars_nouveau.crafting_progress", Math.min(100, (getSource() * 100) / recipe.value().source)).withStyle(ChatFormatting.GOLD)); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java index f8bfd6d374..394724c5cc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java @@ -123,7 +123,7 @@ public void tick() { public static @Nullable ServerLevel getServerLevel(String dimID, ServerLevel level){ if(dimID != null && level != null){ - ResourceKey resourcekey = ResourceKey.create(Registries.DIMENSION, new ResourceLocation(dimID)); + ResourceKey resourcekey = ResourceKey.create(Registries.DIMENSION, ResourceLocation.tryParse(dimID)); return level.getServer().getLevel(resourcekey); } return null; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java index 3b26fe7f85..65fff9a533 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java @@ -11,6 +11,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -72,18 +73,18 @@ public void handleUpdateTag(CompoundTag tag, HolderLookup.Provider lookupProvide } public int getColor() { - return this.data.getPotion() == null ? 16253176 : PotionUtils.getColor(this.data.fullEffects()); + return this.data.getPotion() == null ? 16253176 : PotionContents.getColor(this.data.fullEffects()); } public boolean canAccept(PotionData otherData, int amount){ - if(otherData == null || otherData.getPotion() == Potions.EMPTY) + if(otherData == null || otherData.getPotion() == PotionContents.EMPTY) return false; return (!this.isLocked && this.getAmount() <= 0) || (amount <= (this.getMaxFill() - this.getAmount()) && otherData.areSameEffects(this.data)); } public void add(PotionData other, int amount){ if(this.currentFill == 0){ - if(!this.data.equals(other) || (this.data.getPotion() == Potions.EMPTY)) { + if(!this.data.equals(other) || (this.data.getPotion() == PotionContents.EMPTY)) { this.data = other; } currentFill += amount; @@ -112,7 +113,7 @@ public void getTooltip(List tooltip) { @Override protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { - super.loadAdditional(pTag, pRegistries); + super.loadAdditional(tag, pRegistries); if(tag.contains("potionData")) this.data = PotionData.fromTag(tag.getCompound("potionData")); this.isLocked = tag.getBoolean("locked"); @@ -127,7 +128,7 @@ public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { tag.putInt("currentFill", this.currentFill); // Include a sorted list of potion names so quests can check the jar's contents - Set potionSet = this.data.getIncludedPotions(); + Set potionSet = this.data.getIncludedPotions(); List potionNames = new ArrayList<>(potionSet.stream().map(potion -> NeoForgeRegistries.POTIONS.getKey(potion).toString()).toList()); potionNames.sort(String::compareTo); tag.putString("potionNames", String.join(",", potionNames)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java index 7c61f9ab00..da3b898af5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java @@ -24,7 +24,7 @@ import net.minecraft.network.chat.Style; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.alchemy.PotionUtils; + import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java index 6ab349bc08..e1a3d0975c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java @@ -271,7 +271,7 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis super.loadAdditional(compound, pRegistries); stack = ItemStack.of((CompoundTag) compound.get("itemStack")); if (compound.contains("recipe")) { - recipeID = new ResourceLocation(compound.getString("recipe")); + recipeID = ResourceLocation.tryParse(compound.getString("recipe")); } CompoundTag itemsTag = new CompoundTag(); itemsTag.putInt("numStacks", consumedStacks.size()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java index b79fc91e8b..1016f3d90f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java @@ -38,20 +38,18 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.common.capabilities.Capabilities; -import net.neoforged.neoforge.common.capabilities.Capability; -import net.neoforged.neoforge.common.util.LazyOptional; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.ICapabilityProvider; import net.neoforged.neoforge.items.IItemHandler; import org.jetbrains.annotations.Nullable; import java.util.*; -public class StorageLecternTile extends ModdedTile implements MenuProvider, ITickable, IWandable, ITooltipProvider { +public class StorageLecternTile extends ModdedTile implements MenuProvider, ITickable, IWandable, ITooltipProvider, ICapabilityProvider { public Map tabManagerMap = new HashMap<>(); public Map> itemsByTab = new HashMap<>(); public Map itemCounts = new HashMap<>(); @@ -70,7 +68,7 @@ public class StorageLecternTile extends ModdedTile implements MenuProvider, ITic public static final String TAB_ALL = "8f6fe318-4ca6-4b29-ab63-15ec5289f5c9"; public Queue transferTasks = EvictingQueue.create(10); - LazyOptional lecternInvWrapper; + IItemHandler lecternInvWrapper; public StorageLecternTile(BlockPos pos, BlockState state) { @@ -87,37 +85,9 @@ public InventoryManager getInvManager(@Nullable String tab) { return tabManagerMap.getOrDefault(tab, tabManagerMap.getOrDefault(TAB_ALL, new InventoryManager())); } - @Override - public LazyOptional getCapability(Capability cap, Direction side) { - if (!this.remove && cap == Capabilities.ITEM_HANDLER) { - StorageLecternTile lecternTile = getMainLectern(); - if (lecternTile == null) { - this.lecternInvWrapper = LazyOptional.of(() -> new LecternInvWrapper(this)); - return this.lecternInvWrapper.cast(); - } - List modifiables = new ArrayList<>(); - for (BlockPos pos : lecternTile.connectedInventories) { - BlockEntity invTile = lecternTile.level.getBlockEntity(pos); - if (invTile != null) { - IItemHandler lih = invTile.getCapability(Capabilities.ITEM_HANDLER, null).orElse(null); - if (lih == null) { - continue; - } - modifiables.add(lih); - } - } - lecternTile.lecternInvWrapper = LazyOptional.of(() -> new LecternInvWrapper(this, modifiables.toArray(new IItemHandler[0]))); - return lecternTile.lecternInvWrapper.cast(); - } - return super.getCapability(cap, side); - } - @Override public void setRemoved() { super.setRemoved(); - if (lecternInvWrapper != null) { - lecternInvWrapper.invalidate(); - } } @Override @@ -258,15 +228,8 @@ public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable Dir if (storedPos == null || level == null) { return; } - BlockEntity tile = level.getBlockEntity(storedPos); - if (tile instanceof StorageLecternTile) { - return; - } - if (tile == null) { - PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.storage.no_tile")); - return; - } - IItemHandler handler = tile.getCapability(Capabilities.ITEM_HANDLER, side).orElse(null); + + IItemHandler handler = level.getCapability(Capabilities.ItemHandler.BLOCK, storedPos, side); if (handler == null) { PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.storage.no_tile")); return; @@ -368,7 +331,7 @@ public void updateItems() { if (invTile == null) { continue; } - IItemHandler handler = invTile.getCapability(Capabilities.ITEM_HANDLER, null).orElse(null); + IItemHandler handler = level.getCapability(Capabilities.ItemHandler.BLOCK, pos, null); if (handler == null) { continue; } @@ -431,7 +394,7 @@ public void insertNearbyItems(){ BlockEntity tile = this.level.getBlockEntity(pos); if(tile == null || mainLectern.connectedInventories.contains(pos)) continue; - IItemHandler handler = tile.getCapability(Capabilities.ITEM_HANDLER).orElse(null); + IItemHandler handler = level.getCapability(Capabilities.ItemHandler.BLOCK, pos, null); if(handler == null) continue; for(int i = 0; i < handler.getSlots(); i++){ @@ -573,17 +536,28 @@ public void getTooltip(List tooltip) { } } - public record HandlerPos(BlockPos pos, IItemHandler handler) { - public static @Nullable HandlerPos fromLevel(Level level, BlockPos pos) { - BlockEntity tile = level.getBlockEntity(pos); - if (tile == null) { - return null; - } - IItemHandler handler = tile.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null); - if (handler == null) { - return null; + @Override + public @Nullable IItemHandler getCapability(CraftingLecternTile object, Direction context) { + StorageLecternTile lecternTile = object.getMainLectern(); + if (lecternTile == null) { + this.lecternInvWrapper = new LecternInvWrapper(this); + return this.lecternInvWrapper; + } + List modifiables = new ArrayList<>(); + for (BlockPos pos : lecternTile.connectedInventories) { + BlockEntity invTile = lecternTile.level.getBlockEntity(pos); + if (invTile != null) { + IItemHandler lih = level.getCapability(Capabilities.ItemHandler.BLOCK, pos, null); + if (lih == null) { + continue; + } + modifiables.add(lih); } - return new HandlerPos(pos, handler); } + lecternTile.lecternInvWrapper = new LecternInvWrapper(this, modifiables.toArray(new IItemHandler[0])); + return lecternTile.lecternInvWrapper; + } + + public record HandlerPos(BlockPos pos, IItemHandler handler) { } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java index 9b38cfd8cc..9c06db1a21 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java @@ -29,14 +29,14 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.Potion; -import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.items.IItemHandler; import org.jetbrains.annotations.Nullable; @@ -98,11 +98,8 @@ public void tick() { public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable LivingEntity storedEntity, Player playerEntity) { if(storedPos == null) return; - BlockEntity blockEntity = level.getBlockEntity(storedPos); - if(blockEntity == null){ - return; - } - IItemHandler itemHandler = blockEntity.getCapability(Capabilities.ITEM_HANDLER).orElse(null); + + IItemHandler itemHandler = level.getCapability(Capabilities.ItemHandler.BLOCK, storedPos, null); if(itemHandler == null){ return; } @@ -173,9 +170,9 @@ public void rotateCraft(){ Ingredient itemIngred = instructions.recipe().recipeIngredients.get(1); List needed = new ArrayList<>(Arrays.asList(itemIngred.getItems())); - Potion potionNeeded = PotionUtils.getPotion(potionIngred.getStack()); - Potion potionOutput = PotionUtils.getPotion(instructions.recipe().outputStack); - boolean foundInput = potionNeeded == Potions.WATER || findNeededPotion(potionNeeded, 300, level, worldPosition) != null; + PotionContents potionNeeded = PotionUtils.getPotion(potionIngred.getStack()); + PotionContents potionOutput = PotionUtils.getPotion(instructions.recipe().outputStack); + boolean foundInput = potionNeeded.is(Potions.WATER) || findNeededPotion(potionNeeded, 300, level, worldPosition) != null; boolean foundRoomForOutput = findPotionStorage(level, worldPosition, potionOutput) != null; if(!foundRoomForOutput || !foundInput){ return; @@ -203,7 +200,7 @@ public boolean needsPotion() { return craftManager instanceof PotionCraftingManager potionCraftingManager && potionCraftingManager.needsPotion(); } - public Potion getNeededPotion() { + public PotionContents getNeededPotion() { return craftManager instanceof PotionCraftingManager potionCraftingManager ? potionCraftingManager.getPotionNeeded() : null; } @@ -244,14 +241,14 @@ public void updateInventories() { BlockEntity blockEntity = level.getBlockEntity(bPos); if(blockEntity == null || blockEntity instanceof ArcanePedestalTile) continue; - if(!blockEntity.getCapability(Capabilities.ITEM_HANDLER).isPresent()) + if(level.getCapability(Capabilities.ItemHandler.BLOCK, bPos, null) == null) continue; cachedInventories.add(bPos.immutable()); } setChanged(); } - public static @Nullable BlockPos findPotionStorage(Level level, BlockPos worldPosition, Potion passedPot) { + public static @Nullable BlockPos findPotionStorage(Level level, BlockPos worldPosition, PotionContents passedPot) { for(BlockPos bPos : BlockPos.withinManhattan(worldPosition.below(2), 4, 3, 4)){ if (level.getBlockEntity(bPos) instanceof PotionJarTile tile && tile.canAccept(new PotionData(passedPot), 300)) { return bPos.immutable(); @@ -260,7 +257,7 @@ public void updateInventories() { return null; } - public static @Nullable BlockPos findNeededPotion(Potion passedPot, int amount, Level level, BlockPos worldPosition) { + public static @Nullable BlockPos findNeededPotion(PotionContents passedPot, int amount, Level level, BlockPos worldPosition) { for(BlockPos bPos : BlockPos.withinManhattan(worldPosition.below(2), 4, 3, 4)){ if (level.getBlockEntity(bPos) instanceof PotionJarTile tile && tile.getAmount() >= amount && @@ -305,7 +302,7 @@ private Map getInventoryCount() { stale.add(p); continue; } - IItemHandler handler = blockEntity.getCapability(Capabilities.ITEM_HANDLER).orElse(null); + IItemHandler handler = level.getCapability(Capabilities.ItemHandler.BLOCK, p, null); if(handler == null) { stale.add(p); continue; @@ -366,7 +363,7 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis } @Override - public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + public void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); if (setStack != null) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCapAttacher.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCapAttacher.java deleted file mode 100644 index 6113267e35..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCapAttacher.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.hollingsworth.arsnouveau.common.capability; - -import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.mana.IManaCap; -import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.Entity; -import net.neoforged.neoforge.common.capabilities.Capability; -import net.neoforged.neoforge.common.capabilities.ICapabilityProvider; -import net.neoforged.neoforge.common.util.INBTSerializable; -import net.neoforged.neoforge.common.util.LazyOptional; -import net.neoforged.neoforge.event.AttachCapabilitiesEvent; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class ManaCapAttacher { - private static class ManaCapProvider implements ICapabilityProvider, INBTSerializable { - - public static final ResourceLocation IDENTIFIER = ArsNouveau.prefix( "mana"); - - private final IManaCap backend = new ManaCap(null); - private final LazyOptional optionalData = LazyOptional.of(() -> backend); - - @NotNull - @Override - public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { - return CapabilityRegistry.MANA_CAPABILITY.orEmpty(cap, this.optionalData); - } - - void invalidate() { - this.optionalData.invalidate(); - } - - @Override - public CompoundTag serializeNBT() { - return this.backend.serializeNBT(); - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - this.backend.deserializeNBT(nbt); - } - } - - public static void attach(final AttachCapabilitiesEvent event) { - final ManaCapProvider provider = new ManaCapProvider(); - event.addCapability(ManaCapProvider.IDENTIFIER, provider); - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java index 5a319c05fe..617c042c8e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java @@ -187,7 +187,7 @@ public CrushRecipe fromJson(ResourceLocation recipeId, JsonObject json) { float chance = GsonHelper.getAsFloat(obj, "chance"); String itemId = GsonHelper.getAsString(obj, "item"); int count = obj.has("count") ? GsonHelper.getAsInt(obj, "count") : 1; - ItemStack output = new ItemStack(ForgeRegistries.ITEMS.getValue(new ResourceLocation(itemId)), count); + ItemStack output = new ItemStack(ForgeRegistries.ITEMS.getValue(ResourceLocation.tryParse(itemId)), count); int maxRange = obj.has("maxRange") ? GsonHelper.getAsInt(obj, "maxRange") : 1; parsedOutputs.add(new CrushOutput(output, chance, maxRange)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java index 4fc8c92a01..49ecd24664 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java @@ -20,7 +20,7 @@ import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.registries.RegistryObject; + import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -67,14 +67,6 @@ public GlyphRecipe withItem(ItemLike i) { return this; } - public GlyphRecipe withItem(RegistryObject i) { - return withItem(i.get()); - } - - public GlyphRecipe withItem(RegistryObject item, int count) { - return withItem(item.get(), count); - } - public GlyphRecipe withItem(ItemLike item, int count) { for (int i = 0; i < count; i++) { withItem(item); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java index 20b7aafb20..3089074770 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java @@ -7,15 +7,16 @@ import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; import com.hollingsworth.arsnouveau.common.block.tile.ImbuementTile; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -import net.minecraft.core.DefaultedRegistry; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.HolderLookup; -import net.minecraft.core.Registry; -import net.minecraft.core.RegistryAccess; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.GsonHelper; -import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -26,8 +27,6 @@ import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.registries.NeoForgeRegistries; -import net.neoforged.neoforge.registries.RegistryObject; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -37,27 +36,28 @@ public class ImbuementRecipe implements Recipe { + public final Ingredient input; public final ItemStack output; public final int source; - public final ResourceLocation id; public List pedestalItems; + public ResourceLocation id; - public ImbuementRecipe(ResourceLocation resourceLocation, Ingredient input, ItemStack output, int source, List pedestalItems) { - this.id = resourceLocation; + public ImbuementRecipe(Ingredient input, ItemStack output, int source, List pedestalItems) { this.input = input; this.output = output; this.source = source; this.pedestalItems = pedestalItems; } - public ImbuementRecipe(String id, Ingredient ingredient, ItemStack output, int source, List pedestalItems) { - this(ArsNouveau.prefix( RecipeRegistry.IMBUEMENT_RECIPE_ID + "_" + id), ingredient, output, source, pedestalItems); + public ImbuementRecipe(String id, Ingredient ingredient, ItemStack output, int source) { + this(ArsNouveau.prefix(id), ingredient, output, source); } - public ImbuementRecipe(String id, Ingredient ingredient, ItemStack output, int source) { - this(ArsNouveau.prefix( RecipeRegistry.IMBUEMENT_RECIPE_ID + "_" + id), ingredient, output, source, new ArrayList<>()); + public ImbuementRecipe(ResourceLocation id, Ingredient ingredient, ItemStack output, int source) { + this(ingredient, output, source, new ArrayList<>()); + this.id = id; } public ImbuementRecipe withPedestalItem(Ingredient i) { @@ -65,15 +65,6 @@ public ImbuementRecipe withPedestalItem(Ingredient i) { return this; } - public ImbuementRecipe withPedestalItem(RegistryObject i) { - return withPedestalItem(i.get()); - } - - public ImbuementRecipe withPedestalItem(ItemStack i) { - this.pedestalItems.add(Ingredient.of(i)); - return this; - } - public ImbuementRecipe withPedestalItem(ItemLike i) { this.pedestalItems.add(Ingredient.of(i)); return this; @@ -88,6 +79,22 @@ public boolean doesReagentMatch(ItemStack reag) { return this.input.test(reag); } + public Ingredient getInput() { + return input; + } + + public ItemStack getOutput() { + return output; + } + + public int getSource() { + return source; + } + + public List getPedestalItems() { + return pedestalItems; + } + @Override public boolean matches(ImbuementTile pContainer, Level pLevel) { return this.input.test(pContainer.getItem(0)) && EnchantingApparatusRecipe.doItemsMatch(pContainer.getPedestalItems(), pedestalItems); @@ -118,80 +125,49 @@ public RecipeType getType() { return BuiltInRegistries.RECIPE_TYPE.get(ArsNouveau.prefix( RecipeRegistry.IMBUEMENT_RECIPE_ID)); } - public JsonElement asRecipe() { - JsonObject jsonobject = new JsonObject(); - jsonobject.addProperty("type", "ars_nouveau:" + RecipeRegistry.IMBUEMENT_RECIPE_ID); - jsonobject.add("input", input.toJson()); - jsonobject.addProperty("output", getRegistryName(output.getItem()).toString()); - jsonobject.addProperty("count", output.getCount()); - jsonobject.addProperty("source", source); - JsonArray pedestalArr = new JsonArray(); - for (Ingredient i : this.pedestalItems) { - JsonObject object = new JsonObject(); - object.add("item", i.toJson()); - pedestalArr.add(object); - } - jsonobject.add("pedestalItems", pedestalArr); - return jsonobject; - } - public static class Serializer implements RecipeSerializer { - - @Override - public ImbuementRecipe fromJson(ResourceLocation recipeId, JsonObject json) { - Ingredient inputStack = null; - if (GsonHelper.isArrayNode(json, "input")) { - inputStack = Ingredient.fromJson(GsonHelper.getAsJsonArray(json, "input")); - } else { - inputStack = Ingredient.fromJson(GsonHelper.getAsJsonObject(json, "input")); - } - Item output = GsonHelper.getAsItem(json, "output"); - int count = GsonHelper.getAsInt(json, "count"); - ItemStack outputStack = new ItemStack(output, count); - int source = GsonHelper.getAsInt(json, "source"); - JsonArray pedestalItems = GsonHelper.getAsJsonArray(json, "pedestalItems"); - List stacks = new ArrayList<>(); - - for (JsonElement e : pedestalItems) { - JsonObject obj = e.getAsJsonObject(); - Ingredient input = null; - if (GsonHelper.isArrayNode(obj, "item")) { - input = Ingredient.fromJson(GsonHelper.getAsJsonArray(obj, "item")); - } else { - input = Ingredient.fromJson(GsonHelper.getAsJsonObject(obj, "item")); - } - stacks.add(input); - } - return new ImbuementRecipe(recipeId, inputStack, outputStack, source, stacks); - } - - - @Override - public void toNetwork(FriendlyByteBuf buf, ImbuementRecipe recipe) { + // Todo: restore count on output? + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Ingredient.CODEC.fieldOf("input").forGetter(ImbuementRecipe::getInput), + ItemStack.CODEC.fieldOf("output").forGetter(ImbuementRecipe::getOutput), + Codec.INT.fieldOf("source").forGetter(ImbuementRecipe::getSource), + Ingredient.CODEC.listOf().fieldOf("pedestalItems").forGetter(ImbuementRecipe::getPedestalItems) + ).apply(instance, ImbuementRecipe::new)); + + public void toNetwork(RegistryFriendlyByteBuf buf, ImbuementRecipe recipe) { buf.writeInt(recipe.pedestalItems.size()); for (Ingredient i : recipe.pedestalItems) { - i.toNetwork(buf); + Ingredient.CONTENTS_STREAM_CODEC.encode(buf, i); } - recipe.input.toNetwork(buf); - buf.writeItem(recipe.output); + Ingredient.CONTENTS_STREAM_CODEC.encode(buf, recipe.input); + ItemStack.STREAM_CODEC.encode(buf, recipe.output); buf.writeInt(recipe.source); } @Nullable - @Override - public ImbuementRecipe fromNetwork(ResourceLocation recipeId, FriendlyByteBuf buffer) { + public ImbuementRecipe fromNetwork(RegistryFriendlyByteBuf buffer) { int length = buffer.readInt(); List stacks = new ArrayList<>(); for (int i = 0; i < length; i++) { try { - stacks.add(Ingredient.fromNetwork(buffer)); + stacks.add(Ingredient.CONTENTS_STREAM_CODEC.decode(buffer)); } catch (Exception e) { e.printStackTrace(); break; } } - return new ImbuementRecipe(recipeId, Ingredient.fromNetwork(buffer), buffer.readItem(), buffer.readInt(), stacks); + return new ImbuementRecipe(Ingredient.CONTENTS_STREAM_CODEC.decode(buffer), ItemStack.STREAM_CODEC.decode(buffer), buffer.readInt(), stacks); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public StreamCodec streamCodec() { + return null; } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java index f80506b502..4e7645321d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java @@ -10,7 +10,7 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.level.ItemLike; -import net.neoforged.neoforge.registries.RegistryObject; + import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java index b898e05ea2..6cf3d17002 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java @@ -76,12 +76,12 @@ private void registerDoor(DoorBlock door, String reg) { } - - //will it work? idk - public void signBlock(Block sign, String reg) { - ModelFile signModel = models().withExistingParent(reg, new ResourceLocation("block/air")).texture("particle", ArsNouveau.prefix( "block/" + reg)); - getVariantBuilder(sign).forAllStates(s -> ConfiguredModel.builder().modelFile(signModel).build()); - } +// +// //will it work? idk +// public void signBlock(Block sign, String reg) { +// ModelFile signModel = models().withExistingParent(reg, ResourceLocation("block/air")).texture("particle", ArsNouveau.prefix( "block/" + reg)); +// getVariantBuilder(sign).forAllStates(s -> ConfiguredModel.builder().modelFile(signModel).build()); +// } public void registerNormalCube(Block block, String registry) { buildNormalCube(registry); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java index 9566a7eb02..0fc98291a0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java @@ -35,7 +35,7 @@ public class BlockTagProvider extends IntrinsicHolderTagsProvider { public static TagKey CLUSTER_BLOCKS = BlockTags.create(ArsNouveau.prefix( "golem/cluster")); public static TagKey BREAK_WITH_PICKAXE = BlockTags.create(ArsNouveau.prefix( "break_with_pickaxe")); public static TagKey AUTOPULL_DISABLED = BlockTags.create(ArsNouveau.prefix( "storage/autopull_disabled")); - public static TagKey RELOCATION_NOT_SUPPORTED = BlockTags.create(new ResourceLocation("c", "relocation_not_supported")); + public static TagKey RELOCATION_NOT_SUPPORTED = BlockTags.create(ResourceLocation.fromNamespaceAndPath("c", "relocation_not_supported")); public static TagKey OCCLUDES_SPELL_SENSOR = BlockTags.create(ArsNouveau.prefix( "occludes_spell_sensor")); public static TagKey INTERACT_BLACKLIST = BlockTags.create(ArsNouveau.prefix( "interact_blacklist")); public static TagKey CASCADING_LOGS = BlockTags.create(ArsNouveau.prefix( "cascading_logs")); @@ -43,7 +43,7 @@ public class BlockTagProvider extends IntrinsicHolderTagsProvider { public static TagKey VEXING_LOGS = BlockTags.create(ArsNouveau.prefix( "vexing_logs")); public static TagKey BLAZING_LOGS = BlockTags.create(ArsNouveau.prefix( "blazing_logs")); public static TagKey DOWSING_ROD = BlockTags.create(ArsNouveau.prefix( "dowsing_rod")); - public static TagKey BUSHES = BlockTags.create(new ResourceLocation("forge", "bushes")); + public static TagKey BUSHES = BlockTags.create(ResourceLocation.fromNamespaceAndPath("neoforge", "bushes")); public BlockTagProvider(PackOutput output, CompletableFuture future, ExistingFileHelper helper) { super(output, Registries.BLOCK, future, block -> block.builtInRegistryHolder().key(), ArsNouveau.MODID, helper); @@ -245,7 +245,7 @@ protected void addTags(HolderLookup.Provider pProvider) { this.tag(BlockTags.FENCE_GATES).add(BlockRegistry.ARCHWOOD_FENCE_GATE.get()); this.tag(BlockTags.FENCES).add(BlockRegistry.ARCHWOOD_FENCE.get()); this.tag(BlockTags.WOODEN_FENCES).add(BlockRegistry.ARCHWOOD_FENCE.get()); - TagKey ARCHWOOD_LEAVES = BlockTags.create(new ResourceLocation("minecraft", "leaves/archwood_leaves")); + TagKey ARCHWOOD_LEAVES = BlockTags.create(ResourceLocation.fromNamespaceAndPath("minecraft", "leaves/archwood_leaves")); this.tag(ARCHWOOD_LEAVES) .add(BlockRegistry.VEXING_LEAVES.get(), BlockRegistry.CASCADING_LEAVE.get(), diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DamageTypesProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DamageTypesProvider.java index 6f1e40b543..186dc3bfc3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DamageTypesProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DamageTypesProvider.java @@ -48,7 +48,7 @@ public String getName() { public static class DamageTypesTagsProvider extends DamageTypeTagsProvider { - TagKey FORGE_MAGIC = TagKey.create(Registries.DAMAGE_TYPE, new ResourceLocation("c", "is_magic")); + TagKey FORGE_MAGIC = TagKey.create(Registries.DAMAGE_TYPE, ResourceLocation.fromNamespaceAndPath("c", "is_magic")); public DamageTypesTagsProvider(PackOutput pPackOutput, CompletableFuture provider, @Nullable ExistingFileHelper existingFileHelper) { super(pPackOutput, provider, ArsNouveau.MODID, existingFileHelper); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java index b7c9fc6a7d..cebb5d9e99 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java @@ -64,7 +64,7 @@ protected void addTags(HolderLookup.Provider pProvider) { .add(EntityType.ARMOR_STAND) .add(EntityType.LIGHTNING_BOLT) .add(ModEntities.LIGHTNING_ENTITY.get()) - .add(EntityType.TRIDENT).addOptional(new ResourceLocation("create:contraption")); + .add(EntityType.TRIDENT).addOptional(ResourceLocation.parse("create:contraption")); this.tag(EntityTags.LINGERING_BLACKLIST) .add(ModEntities.LIGHTNING_ENTITY.get(), ModEntities.LINGER_SPELL.get(), ModEntities.WALL_SPELL.get()); this.tag(EntityTags.BERRY_BLACKLIST) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java index 48e8afa186..f1c51000dc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java @@ -6,6 +6,7 @@ import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; +import net.minecraft.data.DataProvider; import net.minecraft.tags.ItemTags; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -14,6 +15,7 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CompletableFuture; public class ImbuementRecipeProvider extends SimpleDataProvider{ @@ -23,6 +25,19 @@ public ImbuementRecipeProvider(DataGenerator generatorIn) { super(generatorIn); } + @Override + public CompletableFuture run(CachedOutput pOutput) { + collectJsons(pOutput); + List> futures = new ArrayList<>(); + return ModDatagen.registries.thenCompose((registry) -> { + for (ImbuementRecipe g : recipes) { + Path path = getRecipePath(output, g.id.getPath()); + futures.add(DataProvider.saveStable(pOutput, registry, ImbuementRecipe.Serializer.CODEC.codec(), g, path)); + } + return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); + }); + } + @Override public void collectJsons(CachedOutput pOutput) { recipes.add(new ImbuementRecipe("lapis", Ingredient.of(Tags.Items.GEMS_LAPIS), ItemsRegistry.SOURCE_GEM.get().getDefaultInstance(), 500)); @@ -72,12 +87,6 @@ public void collectJsons(CachedOutput pOutput) { .withPedestalItem(ItemsRegistry.SOURCE_GEM.get()) .withPedestalItem(ItemsRegistry.AIR_ESSENCE.get()) .withPedestalItem(ItemsRegistry.WILDEN_HORN.get())); - - - for (ImbuementRecipe g : recipes) { - Path path = getRecipePath(output, g.getId().getPath()); - saveStable(pOutput, g.asRecipe(), path); - } } private static Path getRecipePath(Path pathIn, String str) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java index f38bfaacf5..6d02bd78fc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java @@ -163,16 +163,16 @@ private ResourceLocation itemTexture(String item) { private ResourceLocation itemTexture(final Item item) { final ResourceLocation name = registryName(item); - return new ResourceLocation(name.getNamespace(), "item" + "/" + name.getPath()); + return ResourceLocation.fromNamespaceAndPath(name.getNamespace(), "item" + "/" + name.getPath()); } private ResourceLocation itemTexture(final Block item) { final ResourceLocation name = registryName(item); - return new ResourceLocation(name.getNamespace(), "item" + "/" + name.getPath()); + return ResourceLocation.fromNamespaceAndPath(name.getNamespace(), "item" + "/" + name.getPath()); } private ResourceLocation spellTexture(final Item item) { final ResourceLocation name = registryName(item); - return new ResourceLocation(name.getNamespace(), "item" + "/" + name.getPath().replace("glyph_", "")); + return ResourceLocation.fromNamespaceAndPath(name.getNamespace(), "item" + "/" + name.getPath().replace("glyph_", "")); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java index afdd52122c..97011f5c49 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java @@ -18,18 +18,18 @@ public class ItemTagProvider extends IntrinsicHolderTagsProvider { public static TagKey SUMMON_BED_ITEMS = ItemTags.create(ArsNouveau.prefix( "summon_bed")); - public static TagKey SOURCE_GEM_TAG = ItemTags.create(new ResourceLocation("forge:gems/source")); - public static TagKey SOURCE_GEM_BLOCK_TAG = ItemTags.create(new ResourceLocation("forge:storage_blocks/source")); - public static TagKey ARCHWOOD_LOG_TAG = ItemTags.create(new ResourceLocation("forge:logs/archwood")); + public static TagKey SOURCE_GEM_TAG = ItemTags.create(ResourceLocation.tryParse("neoforge:gems/source")); + public static TagKey SOURCE_GEM_BLOCK_TAG = ItemTags.create(ResourceLocation.tryParse("neoforge:storage_blocks/source")); + public static TagKey ARCHWOOD_LOG_TAG = ItemTags.create(ResourceLocation.tryParse("neoforge:logs/archwood")); public static TagKey MAGIC_FOOD = ItemTags.create(ArsNouveau.prefix( "magic_food")); public static TagKey WILDEN_DROP_TAG = ItemTags.create(ArsNouveau.prefix( "wilden_drop")); public static TagKey SHARD_TAG = ItemTags.create(ArsNouveau.prefix( "golem/shard")); - public static TagKey BERRY_TAG = ItemTags.create(new ResourceLocation("c", "fruits/berry")); + public static TagKey BERRY_TAG = ItemTags.create(ResourceLocation.fromNamespaceAndPath("c", "fruits/berry")); public static final TagKey SUMMON_SHARDS_TAG = ItemTags.create(ArsNouveau.prefix( "magic_shards")); public static TagKey JAR_ITEM_BLACKLIST = ItemTags.create(ArsNouveau.prefix( "interact_jar_blacklist")); public static TagKey RITUAL_LOOT_BLACKLIST = ItemTags.create(ArsNouveau.prefix( "ritual_loot_blacklist")); public static TagKey RITUAL_TRADE_BLACKLIST = ItemTags.create(ArsNouveau.prefix( "ritual_trade_blacklist")); - public static TagKey STORAGE_BLOCKS_QUARTZ = ItemTags.create(new ResourceLocation("storage_blocks/quartz")); + public static TagKey STORAGE_BLOCKS_QUARTZ = ItemTags.create(ResourceLocation.tryParse("storage_blocks/quartz")); public static TagKey SHADY_WIZARD_FRUITS = ItemTags.create(ArsNouveau.prefix( "shady_wizard_fruits")); @@ -120,7 +120,7 @@ protected void addTags(HolderLookup.Provider pProvider) { ); - this.tag(ItemTags.create(new ResourceLocation("c", "planks/archwood"))) + this.tag(ItemTags.create(ResourceLocation.fromNamespaceAndPath("c", "planks/archwood"))) .add(BlockRegistry.ARCHWOOD_PLANK.asItem()); this.tag(Tags.Items.SEEDS) .add(BlockRegistry.MAGE_BLOOM_CROP.asItem()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java index 5be39ebce6..7476761d59 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java @@ -6,21 +6,22 @@ import net.minecraft.data.PackOutput; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; import net.neoforged.neoforge.common.data.ExistingFileHelper; import net.neoforged.neoforge.data.event.GatherDataEvent; + import java.util.concurrent.CompletableFuture; @EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD) public class ModDatagen { - + public static CompletableFuture registries; @SubscribeEvent public static void datagen(GatherDataEvent event) { APIRegistry.postInit(); PackOutput output = event.getGenerator().getPackOutput(); CompletableFuture provider = event.getLookupProvider(); ExistingFileHelper fileHelper = event.getExistingFileHelper(); + ModDatagen.registries = provider; event.getGenerator().addProvider(event.includeClient(), new ItemModelGenerator(output, fileHelper)); event.getGenerator().addProvider(event.includeServer(), new BlockTagProvider(output, provider, fileHelper)); event.getGenerator().addProvider(event.includeClient(), new LangDatagen(output, ArsNouveau.MODID, "en_us")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java index 6ac73e9e25..d926178904 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java @@ -57,7 +57,7 @@ private TagKey forgeItemTag(String path) { } private ResourceLocation forgeTag(String path) { - return new ResourceLocation("forge", path); + return ResourceLocation.fromNamespaceAndPath("neoforge", path); } protected static Path getRecipePath(Path path, String id) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java index 62754fb375..c6aaaae4f6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java @@ -9,8 +9,8 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; + import javax.annotation.Nullable; -import java.util.Arrays; import java.util.Map; import java.util.Optional; import java.util.function.Consumer; @@ -164,7 +164,7 @@ public AdvancementHolder save(Consumer pConsumer, ResourceLoc } public AdvancementHolder save(Consumer pConsumer) { - return this.save(pConsumer, new ResourceLocation(modid, fileKey)); + return this.save(pConsumer, ResourceLocation.fromNamespaceAndPath(modid, fileKey)); } public String toString() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusPage.java index ec68a97398..bb9a5d424f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusPage.java @@ -3,7 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; -import net.neoforged.neoforge.registries.RegistryObject; + import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusTextPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusTextPage.java index 0a04ce2090..fa2dddf3b0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusTextPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusTextPage.java @@ -3,7 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; -import net.neoforged.neoforge.registries.RegistryObject; + public class ApparatusTextPage extends ApparatusPage{ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/CraftingPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/CraftingPage.java index 3089abf8af..44fa395e5c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/CraftingPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/CraftingPage.java @@ -2,7 +2,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; -import net.neoforged.neoforge.registries.RegistryObject; + import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; @@ -42,6 +42,6 @@ public CraftingPage withText(String text) { @Override public ResourceLocation getType() { - return new ResourceLocation("patchouli:crafting"); + return ResourceLocation.parse("patchouli:crafting"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/EntityPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/EntityPage.java index 2496588103..9ef72685c8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/EntityPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/EntityPage.java @@ -46,6 +46,6 @@ public EntityPage withName(String name){ @Override public ResourceLocation getType() { - return new ResourceLocation("patchouli:entity"); + return ResourceLocation.tryParse("patchouli:entity"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/GlyphScribePage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/GlyphScribePage.java index b43e29c838..c0cde09e92 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/GlyphScribePage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/GlyphScribePage.java @@ -11,6 +11,6 @@ public GlyphScribePage(AbstractSpellPart spellPart) { @Override public ResourceLocation getType() { - return new ResourceLocation("ars_nouveau:glyph_recipe"); + return ResourceLocation.tryParse("ars_nouveau:glyph_recipe"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ImagePage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ImagePage.java index 0acd298486..7f4ff192cb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ImagePage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ImagePage.java @@ -43,6 +43,6 @@ public JsonObject build() { @Override public ResourceLocation getType() { - return new ResourceLocation("patchouli:image"); + return ResourceLocation.tryParse("patchouli:image"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ImbuementPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ImbuementPage.java index 6a467df1df..56b6cad881 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ImbuementPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ImbuementPage.java @@ -17,6 +17,6 @@ public ImbuementPage(ItemLike itemLike) { @Override public ResourceLocation getType() { - return new ResourceLocation("ars_nouveau:imbuement_recipe"); + return ResourceLocation.tryParse("ars_nouveau:imbuement_recipe"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/LinkPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/LinkPage.java index 44541a3b11..59aff7260c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/LinkPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/LinkPage.java @@ -12,6 +12,6 @@ public LinkPage(String url, String linkText, String text) { @Override public ResourceLocation getType() { - return new ResourceLocation("patchouli:link"); + return ResourceLocation.tryParse("patchouli:link"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/MultiblockPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/MultiblockPage.java index d1b244e8bc..48a76e3043 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/MultiblockPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/MultiblockPage.java @@ -28,7 +28,7 @@ public MultiblockPage withMapping(String letter, String object) { @Override public ResourceLocation getType() { - return new ResourceLocation("patchouli:multiblock"); + return ResourceLocation.tryParse("patchouli:multiblock"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/PatchouliBuilder.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/PatchouliBuilder.java index 5880de9def..50d7840b00 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/PatchouliBuilder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/PatchouliBuilder.java @@ -4,7 +4,7 @@ import com.google.gson.JsonObject; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; -import net.neoforged.neoforge.registries.RegistryObject; + import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/RelationsPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/RelationsPage.java index aeff09c091..dc6e5c908b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/RelationsPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/RelationsPage.java @@ -56,6 +56,6 @@ public JsonObject build() { @Override public ResourceLocation getType() { - return new ResourceLocation("patchouli:relations"); + return ResourceLocation.tryParse("patchouli:relations"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/SpotlightPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/SpotlightPage.java index 34c055cdcf..201c731fa4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/SpotlightPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/SpotlightPage.java @@ -32,6 +32,6 @@ public SpotlightPage withText(String text) { @Override public ResourceLocation getType() { - return new ResourceLocation("patchouli:spotlight"); + return ResourceLocation.tryParse("patchouli:spotlight"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/TextPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/TextPage.java index f2a0b28654..a8742d9be2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/TextPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/TextPage.java @@ -15,6 +15,6 @@ public TextPage withTitle(String title) { @Override public ResourceLocation getType() { - return new ResourceLocation("patchouli:text"); + return ResourceLocation.tryParse("patchouli:text"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java index 1e37c40d29..30af0393a4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java @@ -285,7 +285,7 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public int getExperienceReward() { + public int getBaseExperienceReward() { return 0; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java index 79edcc8d4c..e8840a9a4f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java @@ -74,7 +74,7 @@ private

PlayState summonPredicate(AnimationState

ev } @Override - public int getExperienceReward() { + public int getBaseExperienceReward() { return 0; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/LightningEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/LightningEntity.java index 803fc953ed..5b08e3c297 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/LightningEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/LightningEntity.java @@ -26,11 +26,9 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.energy.IEnergyStorage; import net.neoforged.neoforge.event.entity.EntityStruckByLightningEvent; -import net.neoforged.neoforge.network.NetworkHooks; -import net.neoforged.neoforge.network.PlayMessages; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -150,16 +148,16 @@ public float getDamage(Entity entity) { float baseDamage = getDamage() + ampScalar * amps + (entity.isInWaterOrRain() ? wetBonus : 0.0f); int multiplier = 1; for (ItemStack i : entity.getArmorSlots()) { - IEnergyStorage energyStorage = i.getCapability(Capabilities.ENERGY).orElse(null); + IEnergyStorage energyStorage = i.getCapability(Capabilities.EnergyStorage.ITEM); if (energyStorage != null) { multiplier++; } } if (entity instanceof LivingEntity) { - IEnergyStorage energyStorage = ((LivingEntity) entity).getMainHandItem().getCapability(Capabilities.ENERGY).orElse(null); + IEnergyStorage energyStorage = ((LivingEntity) entity).getMainHandItem().getCapability(Capabilities.EnergyStorage.ITEM); if (energyStorage != null) multiplier++; - energyStorage = ((LivingEntity) entity).getOffhandItem().getCapability(Capabilities.ENERGY).orElse(null); + energyStorage = ((LivingEntity) entity).getOffhandItem().getCapability(Capabilities.EnergyStorage.ITEM); if (energyStorage != null) multiplier++; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 016563f236..e12ceffc8b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -666,7 +666,7 @@ public void getTooltip(List tooltip) { } @Override - public int getExperienceReward() { + public int getBaseExperienceReward() { return 0; } @@ -767,7 +767,7 @@ public StarbuncleData(CompoundTag tag) { bio = null; if (tag.contains("path")) { - pathBlock = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(tag.getString("path"))); + pathBlock = ForgeRegistries.BLOCKS.getValue(ResourceLocation.tryParse(tag.getString("path"))); } bedPos = NBTUtil.getBlockPos(tag, "bed_"); if (bedPos.equals(BlockPos.ZERO)) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonHorse.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonHorse.java index 8f16f86d4e..0a7e910687 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonHorse.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonHorse.java @@ -89,7 +89,7 @@ protected void dropEquipment() { } @Override - public int getExperienceReward() { + public int getBaseExperienceReward() { return 0; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonSkeleton.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonSkeleton.java index 1e436821e4..266a60d1a1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonSkeleton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonSkeleton.java @@ -212,7 +212,7 @@ public LivingEntity getActualOwner() { } @Override - public int getExperienceReward() { + public int getBaseExperienceReward() { return 0; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonWolf.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonWolf.java index 2c8c481e19..b76ec40e1d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonWolf.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonWolf.java @@ -84,7 +84,7 @@ public void addAdditionalSaveData(CompoundTag compound) { } @Override - public int getExperienceReward() { + public int getBaseExperienceReward() { return 0; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WealdWalker.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WealdWalker.java index 74e8373576..abec5c2f82 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WealdWalker.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WealdWalker.java @@ -310,7 +310,7 @@ public boolean removeWhenFarAway(double p_213397_1_) { } @Override - public int getExperienceReward() { + public int getBaseExperienceReward() { return 0; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java index bd7f85f5f2..5a6078c552 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java @@ -107,7 +107,7 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public int getExperienceReward() { + public int getBaseExperienceReward() { return 0; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenHunter.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenHunter.java index edb67ca433..97d461a0f4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenHunter.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenHunter.java @@ -79,7 +79,7 @@ protected SoundEvent getDeathSound() { } @Override - public int getExperienceReward() { + public int getBaseExperienceReward() { return 5; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenStalker.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenStalker.java index 1418032d2f..80f51e3c54 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenStalker.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenStalker.java @@ -109,7 +109,7 @@ public void setLeapCooldown(int leapCooldown) { } @Override - public int getExperienceReward() { + public int getBaseExperienceReward() { return 8; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java index ddfb9b77dc..e4c2d41aa3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java @@ -253,7 +253,7 @@ public void readAdditionalSaveData(CompoundTag tag) { if (tag.hasUUID("ownerID")) setOwnerID(tag.getUUID("ownerID")); terminatedFamiliar = tag.getBoolean("terminated"); - this.holderID = new ResourceLocation(tag.getString("holderID")); + this.holderID = ResourceLocation.tryParse(tag.getString("holderID")); this.persistentData = deserializePersistentData(tag.getCompound("familiarData")); this.entityData.set(COLOR, tag.getString("color")); this.entityData.set(COSMETIC, ItemStack.of(tag.getCompound("cosmetic"))); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java index f9e27fd2bb..93712e0b93 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java @@ -27,7 +27,7 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.item.alchemy.PotionUtils; + import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.Tags; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/DepositAmethystGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/DepositAmethystGoal.java index 83a738c06c..01c80c7b5c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/DepositAmethystGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/DepositAmethystGoal.java @@ -9,8 +9,6 @@ import net.neoforged.neoforge.items.ItemHandlerHelper; import java.util.function.Supplier; -import static net.neoforged.neoforge.common.capabilities.Capabilities.ITEM_HANDLER; - public class DepositAmethystGoal extends Goal { public AmethystGolem golem; public Supplier canUse; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/PickupAmethystGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/PickupAmethystGoal.java index 82d3ef4d49..5ef3f51699 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/PickupAmethystGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/PickupAmethystGoal.java @@ -6,7 +6,7 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.AABB; -import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.Capabilities; import java.util.function.Supplier; import static com.hollingsworth.arsnouveau.common.datagen.ItemTagProvider.SHARD_TAG; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java index e51cf765c1..818f74f322 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java @@ -27,7 +27,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.AABB; -import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.ItemHandlerHelper; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java index e7a51c458f..f6ad96bb72 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java @@ -17,7 +17,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.items.IItemHandler; import java.util.*; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index aa0e7c7549..9ca235616a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -64,31 +64,21 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.trading.ItemCost; import net.minecraft.world.item.trading.MerchantOffer; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.event.entity.living.*; -import net.neoforged.bus.api.Event; import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.event.AddReloadListenerEvent; import net.neoforged.neoforge.event.RegisterCommandsEvent; -import net.neoforged.neoforge.event.TickEvent; -import net.neoforged.neoforge.event.entity.living.LivingAttackEvent; -import net.neoforged.neoforge.event.entity.living.LivingEntityUseItemEvent; -import net.neoforged.neoforge.event.entity.living.LivingEvent; -import net.neoforged.neoforge.event.entity.living.LivingFallEvent; -import net.neoforged.neoforge.event.entity.living.LivingHealEvent; -import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; -import net.neoforged.neoforge.event.entity.living.LootingLevelEvent; -import net.neoforged.neoforge.event.entity.living.MobEffectEvent; -import net.neoforged.neoforge.event.entity.living.MobSpawnEvent; -import net.neoforged.neoforge.event.entity.living.ShieldBlockEvent; -import net.neoforged.neoforge.event.entity.player.EntityItemPickupEvent; +import net.neoforged.neoforge.event.entity.living.*; +import net.neoforged.neoforge.event.entity.player.ItemEntityPickupEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; -import net.neoforged.neoforge.event.level.SaplingGrowTreeEvent; +import net.neoforged.neoforge.event.tick.PlayerTickEvent; import net.neoforged.neoforge.event.village.VillagerTradesEvent; import net.neoforged.neoforge.items.ItemHandlerHelper; @@ -138,19 +128,10 @@ public boolean isExpired() { }); } - - @SubscribeEvent(priority = EventPriority.LOWEST) - public static void itemPickupEvent(EntityItemPickupEvent event) { - Player player = event.getEntity(); - ItemStack pickingUp = event.getItem().getItem(); - boolean voided = VoidJar.tryVoiding(player, pickingUp); - if (voided) event.setResult(Event.Result.ALLOW); - } - @SubscribeEvent(priority = EventPriority.LOWEST) - public static void itemPickupEvent(PlayerEvent.ItemPickupEvent event) { - Player player = event.getEntity(); - ItemStack pickingUp = event.getStack(); + public static void itemPickupEvent(ItemEntityPickupEvent event) { + Player player = event.getPlayer(); + ItemStack pickingUp = event.getItemEntity().getItem(); VoidJar.tryVoiding(player, pickingUp); } @@ -158,8 +139,8 @@ public static void itemPickupEvent(PlayerEvent.ItemPickupEvent event) { public static void shieldEvent(ShieldBlockEvent e) { if (!e.getEntity().level.isClientSide && e.getEntity() instanceof Player player && player.isBlocking()) { if (player.getUseItem().getItem() == ItemsRegistry.ENCHANTERS_SHIELD.asItem()) { - player.addEffect(new MobEffectInstance(ModPotions.MANA_REGEN_EFFECT.get(), 200, 1)); - player.addEffect(new MobEffectInstance(ModPotions.SPELL_DAMAGE_EFFECT.get(), 200, 1)); + player.addEffect(new MobEffectInstance(ModPotions.MANA_REGEN_EFFECT, 200, 1)); + player.addEffect(new MobEffectInstance(ModPotions.SPELL_DAMAGE_EFFECT, 200, 1)); } } } @@ -188,7 +169,7 @@ public static void livingAttackEvent(LivingAttackEvent e) { } @SubscribeEvent - public static void livingSpawnEvent(MobSpawnEvent.FinalizeSpawn checkSpawn) { + public static void livingSpawnEvent(FinalizeSpawnEvent checkSpawn) { if (checkSpawn.getLevel() instanceof Level level && !level.isClientSide) { RitualEventQueue.getRitual(level, DenySpawnRitual.class, ritu -> ritu.denySpawn(checkSpawn)); } @@ -197,7 +178,7 @@ public static void livingSpawnEvent(MobSpawnEvent.FinalizeSpawn checkSpawn) { @SubscribeEvent public static void jumpEvent(LivingEvent.LivingJumpEvent e) { - if (e.getEntity() != null && e.getEntity().hasEffect(ModPotions.SNARE_EFFECT.get())) { + if (e.getEntity() != null && e.getEntity().hasEffect(ModPotions.SNARE_EFFECT)) { e.getEntity().setDeltaMovement(0, 0, 0); return; } @@ -226,33 +207,34 @@ public static void playerLogin(PlayerEvent.PlayerLoggedInEvent e) { @SubscribeEvent - public static void clientTickEnd(TickEvent.ClientTickEvent event) { - if (event.phase == TickEvent.Phase.END) { - ClientInfo.ticksInGame++; - if (ClientInfo.redTicks()) { - ClientInfo.redOverlayTicks--; - } + public static void clientTickEnd(ClientTickEvent.Post event) { + + ClientInfo.ticksInGame++; + if (ClientInfo.redTicks()) { + ClientInfo.redOverlayTicks--; } + } @SubscribeEvent(priority = EventPriority.LOWEST) - public static void onGlideTick(TickEvent.PlayerTickEvent event) { - if (ArsNouveau.caelusLoaded && EffectGlide.canGlide(event.player)) { - CaelusHandler.setFlying(event.player); + public static void onGlideTick(PlayerTickEvent event) { + var player = event.getEntity(); + if (ArsNouveau.caelusLoaded && EffectGlide.canGlide(player)) { + CaelusHandler.setFlying(player); } - if (event.player.hasEffect(ModPotions.FLIGHT_EFFECT.get()) - && event.player.level.getGameTime() % 20 == 0 - && event.player.getEffect(ModPotions.FLIGHT_EFFECT.get()).getDuration() <= 30 * 20 - && event.player instanceof ServerPlayer serverPlayer) { - RitualEventQueue.getRitual(event.player.level, RitualFlight.class, flight -> flight.attemptRefresh(serverPlayer)); + if (player.hasEffect(ModPotions.FLIGHT_EFFECT) + && player.level.getGameTime() % 20 == 0 + && player.getEffect(ModPotions.FLIGHT_EFFECT).getDuration() <= 30 * 20 + && player instanceof ServerPlayer serverPlayer) { + RitualEventQueue.getRitual(player.level, RitualFlight.class, flight -> flight.attemptRefresh(serverPlayer)); } - if (event.player.level.getGameTime() % RitualGravity.renewInterval == 0 && event.player instanceof ServerPlayer serverPlayer) { - MobEffectInstance gravity = event.player.getEffect(ModPotions.GRAVITY_EFFECT.get()); + if (player.level.getGameTime() % RitualGravity.renewInterval == 0 && player instanceof ServerPlayer serverPlayer) { + MobEffectInstance gravity = player.getEffect(ModPotions.GRAVITY_EFFECT); if (gravity == null || gravity.getDuration() <= RitualGravity.renewThreshold) { - RitualEventQueue.getRitual(event.player.level, RitualGravity.class, ritual -> !serverPlayer.isCreative() && ritual.attemptRefresh(serverPlayer)); + RitualEventQueue.getRitual(player.level, RitualGravity.class, ritual -> !serverPlayer.isCreative() && ritual.attemptRefresh(serverPlayer)); } } } @@ -266,26 +248,26 @@ public static void onJump(LivingEvent.LivingJumpEvent event) { @SubscribeEvent public static void entityHurt(LivingHurtEvent e) { - if (e.getEntity() != null && e.getEntity().hasEffect(ModPotions.DEFENCE_EFFECT.get()) && (e.getSource().is(DamageTypes.MAGIC) || e.getSource().is(DamageTypes.GENERIC) || e.getSource().is(DamageTypes.MOB_ATTACK))) { + if (e.getEntity() != null && e.getEntity().hasEffect(ModPotions.DEFENCE_EFFECT) && (e.getSource().is(DamageTypes.MAGIC) || e.getSource().is(DamageTypes.GENERIC) || e.getSource().is(DamageTypes.MOB_ATTACK))) { if (e.getAmount() > 0.5) { - e.setAmount((float) Math.max(0.5, e.getAmount() - 1.0f - e.getEntity().getEffect(ModPotions.DEFENCE_EFFECT.get()).getAmplifier())); + e.setAmount((float) Math.max(0.5, e.getAmount() - 1.0f - e.getEntity().getEffect(ModPotions.DEFENCE_EFFECT).getAmplifier())); } } - if (e.getEntity() != null && e.getSource().is(DamageTypes.LIGHTNING_BOLT) && e.getEntity().hasEffect(ModPotions.SHOCKED_EFFECT.get())) { - float damage = e.getAmount() + 3.0f + 3.0f * e.getEntity().getEffect(ModPotions.SHOCKED_EFFECT.get()).getAmplifier(); + if (e.getEntity() != null && e.getSource().is(DamageTypes.LIGHTNING_BOLT) && e.getEntity().hasEffect(ModPotions.SHOCKED_EFFECT)) { + float damage = e.getAmount() + 3.0f + 3.0f * e.getEntity().getEffect(ModPotions.SHOCKED_EFFECT).getAmplifier(); e.setAmount(Math.max(0, damage)); } LivingEntity entity = e.getEntity(); if (entity == null) return; - if (entity.hasEffect(ModPotions.HEX_EFFECT.get()) + if (entity.hasEffect(ModPotions.HEX_EFFECT) && (entity.hasEffect(MobEffects.POISON) || entity.hasEffect(MobEffects.WITHER) || entity.isOnFire() - || entity.hasEffect(ModPotions.SHOCKED_EFFECT.get()) + || entity.hasEffect(ModPotions.SHOCKED_EFFECT) || entity.getTicksFrozen() >= entity.getTicksRequiredToFreeze())) { - e.setAmount(e.getAmount() + 0.5f + 0.33f * entity.getEffect(ModPotions.HEX_EFFECT.get()).getAmplifier()); + e.setAmount(e.getAmount() + 0.5f + 0.33f * entity.getEffect(ModPotions.HEX_EFFECT).getAmplifier()); } double warding = PerkUtil.valueOrZero(entity, PerkAttributes.WARDING.get()); double feather = PerkUtil.valueOrZero(entity, PerkAttributes.FEATHER.get()); @@ -310,12 +292,12 @@ public static void fallEvent(LivingFallEvent fallEvent) { @SubscribeEvent public static void entityHeal(LivingHealEvent e) { LivingEntity entity = e.getEntity(); - if (entity != null && entity.hasEffect(ModPotions.HEX_EFFECT.get())) { + if (entity != null && entity.hasEffect(ModPotions.HEX_EFFECT)) { e.setAmount(e.getAmount() / 2.0f); } - if (entity != null && entity.hasEffect(ModPotions.RECOVERY_EFFECT.get())) { - e.setAmount(e.getAmount() + 1 + entity.getEffect(ModPotions.RECOVERY_EFFECT.get()).getAmplifier()); + if (entity != null && entity.hasEffect(ModPotions.RECOVERY_EFFECT)) { + e.setAmount(e.getAmount() + 1 + entity.getEffect(ModPotions.RECOVERY_EFFECT).getAmplifier()); } } @@ -412,7 +394,7 @@ public static void registerTrades(VillagerTradesEvent event) { } level5.add((trader, rand) -> emerToItem(ItemsRegistry.SOURCE_BERRY_PIE, 4, 8, 2)); - level5.add((trader, rand) -> new MerchantOffer(new ItemStack(Items.EMERALD, 48), DungeonLootTables.getRandomItem(DungeonLootTables.RARE_LOOT), 1, 20, 0.2F)); + level5.add((trader, rand) -> new MerchantOffer(new ItemCost(Items.EMERALD, 48)), DungeonLootTables.getRandomItem(DungeonLootTables.RARE_LOOT), 1, 20, 0.2F); } } @@ -440,7 +422,7 @@ public static void onPotionAdd(MobEffectEvent.Added event) { if (target.level.isClientSide) return; double bonus = 0.0; - MobEffect effect = event.getEffectInstance().getEffect(); + MobEffect effect = event.getEffectInstance().getEffect().value(); if (effect.isBeneficial()) { bonus = PerkUtil.valueOrZero(target, PerkAttributes.WIXIE.get()); } else if (applier instanceof LivingEntity living) { @@ -472,7 +454,7 @@ public static void onPotionExpire(MobEffectEvent.Expired event) { private static void syncPotionRemoval(MobEffectEvent event) { if (event.getEntity() instanceof LivingEntity && event.getEffectInstance() != null && !event.getEntity().level.isClientSide) { LivingEntity target = event.getEntity(); - MobEffect effect = event.getEffectInstance().getEffect(); + MobEffect effect = event.getEffectInstance().getEffect().value(); ForgeRegistries.MOB_EFFECTS.getHolder(effect).ifPresent(holder -> { if (holder.is(PotionEffectTags.TO_SYNC)) { Networking.sendToNearby(target.level(), target, new PotionSyncPacket(target.getId(), effect, -1)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/LightEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/LightEvents.java index 5068fcc8bf..234232556c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/LightEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/LightEvents.java @@ -9,7 +9,7 @@ import net.minecraft.world.item.ItemStack; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.Mod; -import net.neoforged.neoforge.event.TickEvent; + import net.neoforged.neoforge.network.PacketDistributor; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java index 89e137d28a..23aca871bf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java @@ -11,7 +11,7 @@ import net.minecraft.world.entity.player.Player; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.Mod; -import net.neoforged.neoforge.event.TickEvent; + import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.network.PacketDistributor; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ScryEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ScryEvents.java index 79914ed552..afb5e224a0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ScryEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ScryEvents.java @@ -27,7 +27,7 @@ import net.neoforged.fml.LogicalSide; import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.client.event.RenderLevelStageEvent; -import net.neoforged.neoforge.event.TickEvent; + import net.neoforged.neoforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent; import net.neoforged.neoforge.network.PacketDistributor; import java.util.ArrayList; @@ -51,7 +51,7 @@ public static void playerTickEvent(final TickEvent.PlayerTickEvent event) { CompoundTag tag = ClientInfo.persistentData; if (!tag.contains("an_scryer")) return; - IScryer scryer = ArsNouveauAPI.getInstance().getScryer(new ResourceLocation(tag.getCompound("an_scryer").getString("id"))).fromTag(tag.getCompound("an_scryer")); + IScryer scryer = ArsNouveauAPI.getInstance().getScryer(ResourceLocation.tryParse(tag.getCompound("an_scryer").getString("id"))).fromTag(tag.getCompound("an_scryer")); if (scryer == null) return; Player playerEntity = event.player; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java index a75a4f6820..a7a2ab543a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java @@ -67,7 +67,7 @@ public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List 0) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java index 634218f0fd..6c8685c6b6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java @@ -10,14 +10,14 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.neoforged.neoforge.event.entity.living.MobSpawnEvent; +import net.neoforged.neoforge.event.entity.living.FinalizeSpawnEvent; import org.jetbrains.annotations.Nullable; public class DenySpawnRitual extends RangeRitual { public int radius = 32; public boolean deniedSpawn; - public boolean denySpawn(MobSpawnEvent.FinalizeSpawn checkSpawn){ + public boolean denySpawn(FinalizeSpawnEvent checkSpawn){ boolean shouldDeny = checkSpawn.getSpawnType() == MobSpawnType.NATURAL && checkSpawn.getEntity() instanceof Enemy && checkSpawn.getEntity().distanceToSqr(getPos().getX(), getPos().getY(), getPos().getZ()) <= radius * radius; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java index 3fa2797a34..d17c901a64 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java @@ -23,7 +23,7 @@ import net.minecraft.world.phys.EntityHitResult; import net.neoforged.neoforge.common.IShearable; import net.neoforged.neoforge.common.ModConfigSpec; -import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.Capabilities; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -49,8 +49,9 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull if (entity instanceof IShearable shearable) { ItemStack shears = new ItemStack(Items.SHEARS); applyEnchantments(spellStats, shears); - if (shearable.isShearable(shears, world, entity.blockPosition())) { - List items = shearable.onSheared(getPlayer(shooter, (ServerLevel) world), shears, world, entity.blockPosition(), spellStats.getBuffCount(AugmentFortune.INSTANCE)); + if (shearable.isShearable(getPlayer(shooter, (ServerLevel) world), shears, world, entity.blockPosition())) { + // TODO: restore fortune bonus on augment + List items = shearable.onSheared(getPlayer(shooter, (ServerLevel) world), shears, world, entity.blockPosition()); items.forEach(i -> world.addFreshEntity(new ItemEntity(world, entity.getX(), entity.getY(), entity.getZ(), i))); } } else { @@ -72,7 +73,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world,@NotNull L private boolean dupeCheck(Level world, BlockPos pos){ BlockEntity be = world.getBlockEntity(pos); - return be != null && (world.getCapability(Capabilities.ITEM_HANDLER).isPresent() || be instanceof Container); + return be != null && (world.getCapability(Capabilities.ItemHandler.BLOCK, pos, null) != null || be instanceof Container); } public void doStrip(BlockPos p, BlockHitResult rayTraceResult, Level world,@NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver){ @@ -90,8 +91,9 @@ public void doStrip(BlockPos p, BlockHitResult rayTraceResult, Level world,@NotN public void doShear(BlockPos p, BlockHitResult rayTraceResult, Level world,@NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver){ ItemStack shears = new ItemStack(Items.SHEARS); applyEnchantments(spellStats, shears); - if (world.getBlockState(p).getBlock() instanceof IShearable shearable && shearable.isShearable(shears, world, p)) { - List items = shearable.onSheared(getPlayer(shooter, (ServerLevel) world), shears, world, p, spellStats.getBuffCount(AugmentFortune.INSTANCE)); + if (world.getBlockState(p).getBlock() instanceof IShearable shearable && shearable.isShearable(getPlayer(shooter, (ServerLevel) world), shears, world, p)) { + // TODO: restore fortune bonus on augment + List items = shearable.onSheared(getPlayer(shooter, (ServerLevel) world), shears, world, p); items.forEach(i -> world.addFreshEntity(new ItemEntity(world, p.getX(), p.getY(), p.getZ(), i))); } Player entity = ANFakePlayer.getPlayer((ServerLevel) world); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExplosion.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExplosion.java index 9b17452551..8e746e7001 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExplosion.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExplosion.java @@ -59,7 +59,12 @@ public Explosion explode(Level world, @Nullable Entity e, @Nullable DamageSource for (Player serverplayerentity : world.players()) { if (serverplayerentity.distanceToSqr(x, y, z) < 4096.0D) { - ((ServerPlayer) serverplayerentity).connection.send(new ClientboundExplodePacket(x, y, z, radius, explosion.getToBlow(), explosion.getHitPlayers().get(serverplayerentity))); + ((ServerPlayer) serverplayerentity).connection.send(new ClientboundExplodePacket(x, y, z, radius, explosion.getToBlow(), + explosion.getHitPlayers().get(serverplayerentity), + explosion.blockInteraction, + explosion.smallExplosionParticles, + explosion.largeExplosionParticles, + explosion.explosionSound)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java index 2749509157..0b45d19503 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; -import net.neoforged.neoforge.common.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.ItemHandlerHelper; import org.jetbrains.annotations.NotNull; @@ -59,7 +59,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull return; } BlockEntity tileEntity = world.getBlockEntity(rayTraceResult.getBlockPos()); - IItemHandler targetInv = tileEntity.getCapability(Capabilities.ITEM_HANDLER).orElse(null); + IItemHandler targetInv = tileEntity.getCapability(Capabilities.ITEM_HANDLER); if (targetInv == null) { return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneSavedData.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneSavedData.java index 5624745927..d7c6d84526 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneSavedData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneSavedData.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.saveddata.SavedData; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.Mod; -import net.neoforged.neoforge.event.TickEvent; + import java.util.ArrayList; import java.util.HashMap; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/AbstractSupplierBlockStateProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/AbstractSupplierBlockStateProvider.java index ee05d2bbf8..a694ae51bc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/AbstractSupplierBlockStateProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/AbstractSupplierBlockStateProvider.java @@ -21,10 +21,6 @@ public static Codec codecBuild protected final ResourceLocation key; protected BlockState state = null; - public AbstractSupplierBlockStateProvider(String namespace, String path) { - this(new ResourceLocation(namespace, path)); - } - public AbstractSupplierBlockStateProvider(ResourceLocation key) { this.key = key; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTrunkPlacer.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTrunkPlacer.java index 2f3c65a470..b0493ddffe 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTrunkPlacer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTrunkPlacer.java @@ -36,7 +36,7 @@ public MagicTrunkPlacer(int baseHeight, int height_rand_a, int height_rand_b) { public MagicTrunkPlacer(int baseHeight, int height_rand_a, int height_rand_b, boolean isWorldGen, String podName) { this(baseHeight, height_rand_a, height_rand_b); this.isWorldGen = isWorldGen; - this.podID = new ResourceLocation(podName); + this.podID = ResourceLocation.tryParse(podName); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java index 87cc8a58cd..fa684cc664 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java @@ -15,7 +15,7 @@ import net.neoforged.neoforge.registries.IForgeRegistry; import net.neoforged.neoforge.registries.RegisterEvent; -import net.neoforged.neoforge.registries.RegistryObject; + import top.theillusivec4.curios.Curios; import top.theillusivec4.curios.api.SlotTypeMessage; import top.theillusivec4.curios.api.SlotTypePreset; @@ -25,12 +25,13 @@ public class ModSetup { public static void sendIntercoms() { - InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.HEAD.getMessageBuilder().build()); - InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.CHARM.getMessageBuilder().build()); - InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.RING.getMessageBuilder().size(2).build()); - InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.BELT.getMessageBuilder().build()); - InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> new SlotTypeMessage.Builder("an_focus").size(1).icon(new ResourceLocation(Curios.MODID, "slot/empty_curio_slot")).build()); - InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.NECKLACE.getMessageBuilder().build()); + // TODO: readd curios +// InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.HEAD.getMessageBuilder().build()); +// InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.CHARM.getMessageBuilder().build()); +// InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.RING.getMessageBuilder().size(2).build()); +// InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.BELT.getMessageBuilder().build()); +// InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> new SlotTypeMessage.Builder("an_focus").size(1).icon(new ResourceLocation(Curios.MODID, "slot/empty_curio_slot")).build()); +// InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.NECKLACE.getMessageBuilder().build()); } public static final DeferredRegister> TRUNK_PLACER_TYPE_DEFERRED_REGISTER = DeferredRegister.create(Registries.TRUNK_PLACER_TYPE, MODID); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java b/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java index b2e080cf19..24d3393188 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java @@ -183,11 +183,11 @@ public static void resetLightMaps(){ ITEM_LIGHTMAP = new HashMap<>(); // Copy values from ENTITY_LIGHT_CONFIG to ENTITY_LIGHT_MAP for(Map.Entry entry : ConfigUtil.parseMapConfig(ENTITY_LIGHT_CONFIG).entrySet()){ - ENTITY_LIGHT_MAP.put(new ResourceLocation(entry.getKey()), entry.getValue()); + ENTITY_LIGHT_MAP.put(ResourceLocation.tryParse(entry.getKey()), entry.getValue()); } // Copy values from ITEM_LIGHT_CONFIG to ITEM_LIGHT_MAP for(Map.Entry entry : ConfigUtil.parseMapConfig(ITEM_LIGHT_CONFIG).entrySet()){ - ITEM_LIGHTMAP.put(new ResourceLocation(entry.getKey()), entry.getValue()); + ITEM_LIGHTMAP.put(ResourceLocation.tryParse(entry.getKey()), entry.getValue()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java index 0867879730..7c35d1da49 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.mana.IManaCap; +import com.hollingsworth.arsnouveau.common.block.tile.StorageLecternTile; import com.hollingsworth.arsnouveau.common.capability.*; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketSyncPlayerCap; @@ -23,6 +24,7 @@ import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.wrapper.InvWrapper; +import javax.annotation.Nullable; import java.util.List; public class CapabilityRegistry { @@ -30,6 +32,7 @@ public class CapabilityRegistry { public static final EntityCapability MANA_CAPABILITY = EntityCapability.createVoid(ArsNouveau.prefix("mana"), IManaCap.class); public static final EntityCapability PLAYER_DATA_CAP = EntityCapability.createVoid(ArsNouveau.prefix("player_data"), IPlayerCap.class); + public static final BlockCapability LECTERN_CAP = BlockCapability.create(ArsNouveau.prefix("lectern_handler"), IItemHandler.class, Direction.class); /** * Get the {@link IManaCap} from the specified entity. * @@ -89,6 +92,8 @@ public static void registerCapabilities(final RegisterCapabilitiesEvent event) { for(var container : containers){ event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, container.get(), (c, side) -> new InvWrapper(c)); } + + event.registerBlockEntity(LECTERN_CAP, BlockRegistry.CRAFTING_LECTERN_TILE.get(), (c, side) -> c.getCapability(c, side)); } /** From 3730fbbb157827b7627b6dc4bd07041bba57d3b4 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 23 Jun 2024 12:12:21 -0500 Subject: [PATCH 010/363] codec all the recipes --- .../EnchantmentRecipe.java | 30 +-- .../api/recipe/BuddingConversionRecipe.java | 98 ---------- .../api/recipe/MultiRecipeWrapper.java | 8 +- .../api/recipe/ScryRitualRecipe.java | 101 ---------- .../arsnouveau/api/recipe/ShapedHelper.java | 4 +- .../api/recipe/SummonRitualRecipe.java | 107 ----------- .../registry/BuddingConversionRegistry.java | 2 +- .../api/registry/CasterTomeRegistry.java | 7 +- .../api/registry/ScryRitualRegistry.java | 7 +- .../api/ritual/RangeEffectRitual.java | 3 +- .../client/events/ClientEvents.java | 8 +- .../client/gui/GuiEntityInfoHUD.java | 9 +- .../arsnouveau/client/gui/GuiManaHUD.java | 13 +- .../arsnouveau/client/gui/GuiSpellHUD.java | 11 +- .../client/gui/radial_menu/GuiRadialMenu.java | 3 +- .../ApparatusEnchantingRecipeCategory.java | 3 +- .../jei/CraftingTerminalTransferHandler.java | 13 +- .../client/jei/DyeRecipeCategory.java | 12 +- .../client/jei/JEIArsNouveauPlugin.java | 7 +- .../client/registry/ClientHandler.java | 16 +- .../client/registry/ModParticles.java | 16 +- .../client/registry/ShaderRegistry.java | 2 +- .../common/block/BasicSpellTurret.java | 7 +- .../common/block/ScryerCrystal.java | 11 +- .../common/block/SourceBerryBush.java | 7 +- .../common/block/SpellPrismBlock.java | 27 +-- .../common/block/StrippableLog.java | 4 +- .../common/block/tile/FalseWeaveTile.java | 2 +- .../common/block/tile/GhostWeaveTile.java | 2 +- .../common/block/tile/MirrorWeaveTile.java | 5 - .../common/block/tile/ScribesTile.java | 64 +++---- .../common/camera/ClientCameraEvents.java | 13 +- .../common/command/AddTomeCommand.java | 2 +- .../common/compat/PatchouliHandler.java | 14 +- .../crafting/recipes/BookUpgradeRecipe.java | 60 +----- .../recipes/BuddingConversionRecipe.java | 59 ++++++ .../recipes}/CasterTomeData.java | 33 ++-- .../crafting/recipes/CheatSerializer.java | 26 +++ .../common/crafting/recipes/CrushRecipe.java | 180 +++++------------- .../crafting/recipes}/DispelEntityRecipe.java | 78 ++------ .../common/crafting/recipes/DyeRecipe.java | 89 +-------- .../ExtendableShapelessSerializer.java | 96 ++++++++++ .../common/crafting/recipes/GlyphRecipe.java | 122 +++++------- .../common/crafting/recipes/IDyeable.java | 8 +- .../crafting/recipes/ImbuementRecipe.java | 23 +-- .../crafting/recipes/PotionFlaskRecipe.java | 61 ++---- .../common/crafting/recipes/RecipeUtil.java | 37 ---- .../crafting/recipes/ScryRitualRecipe.java | 52 +++++ .../recipes/SpecialSingleInputRecipe.java | 34 ++++ .../crafting/recipes/SummonRitualRecipe.java | 118 ++++++++++++ .../datagen/ApparatusRecipeBuilder.java | 18 +- .../datagen/ApparatusRecipeProvider.java | 101 +++++----- .../common/datagen/AtlasProvider.java | 15 +- .../datagen/BuddingConversionProvider.java | 7 +- .../common/datagen/CasterTomeProvider.java | 8 +- .../common/datagen/CompostablesProvider.java | 11 -- .../common/datagen/DefaultTableProvider.java | 15 +- .../common/datagen/DispelEntityProvider.java | 6 +- .../common/datagen/ItemTagProvider.java | 11 +- .../common/datagen/PatchouliProvider.java | 5 - .../datagen/PotionEffectTagProvider.java | 4 +- .../common/datagen/ScryRitualProvider.java | 26 ++- .../common/datagen/SummonRitualProvider.java | 3 +- .../common/datagen/WorldgenProvider.java | 20 +- .../datagen/patchouli/ApparatusPage.java | 5 - .../datagen/patchouli/ApparatusTextPage.java | 4 - .../datagen/patchouli/CraftingPage.java | 5 - .../datagen/patchouli/PatchouliBuilder.java | 10 - .../common/entity/AmethystGolem.java | 6 +- .../entity/EntityChimeraProjectile.java | 26 ++- .../common/entity/EntityFollowProjectile.java | 26 +-- .../common/entity/EntityWallSpell.java | 25 +-- .../arsnouveau/common/entity/Starbuncle.java | 35 ++-- .../common/entity/WildenChimera.java | 41 ++-- .../entity/familiar/FamiliarBookwyrm.java | 3 +- .../entity/goal/FollowSummonerGoal.java | 9 +- .../amethyst_golem/ConvertBuddingGoal.java | 3 +- .../goal/whirlisprig/FollowPlayerGoal.java | 8 +- .../entity/pathfinding/MovementHandler.java | 4 +- .../statemachine/SimpleStateMachine.java | 2 +- .../starbuncle/DepositItemState.java | 4 +- .../starbuncle/TakeItemState.java | 3 +- .../arsnouveau/common/event/EventHandler.java | 26 ++- .../common/event/FamiliarEvents.java | 5 +- .../arsnouveau/common/event/JarEvents.java | 2 +- .../arsnouveau/common/event/LightEvents.java | 13 +- .../common/event/ManaCapEvents.java | 43 +++-- .../arsnouveau/common/event/PerkEvents.java | 5 +- .../common/event/ReactiveEvents.java | 8 +- .../arsnouveau/common/event/ScryEvents.java | 9 +- .../arsnouveau/common/items/ScryCaster.java | 6 +- .../common/ritual/RitualAnimalSummoning.java | 2 +- .../common/ritual/RitualFlight.java | 5 +- .../common/ritual/RitualGravity.java | 5 +- .../common/ritual/RitualScrying.java | 18 +- .../common/spell/effect/EffectName.java | 7 +- .../setup/registry/BlockRegistry.java | 3 +- .../setup/registry/RecipeRegistry.java | 18 +- 98 files changed, 991 insertions(+), 1367 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/recipe/BuddingConversionRecipe.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/recipe/ScryRitualRecipe.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/recipe/SummonRitualRecipe.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BuddingConversionRecipe.java rename src/main/java/com/hollingsworth/arsnouveau/common/{tomes => crafting/recipes}/CasterTomeData.java (89%) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CheatSerializer.java rename src/main/java/com/hollingsworth/arsnouveau/{api/recipe => common/crafting/recipes}/DispelEntityRecipe.java (59%) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ExtendableShapelessSerializer.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/RecipeUtil.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ScryRitualRecipe.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpecialSingleInputRecipe.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SummonRitualRecipe.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java index 944ff1a3db..4b6b8332d9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java @@ -7,6 +7,7 @@ import com.hollingsworth.arsnouveau.common.block.tile.EnchantingApparatusTile; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import net.minecraft.core.Holder; import net.minecraft.core.RegistryAccess; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; @@ -29,19 +30,16 @@ import java.util.Map; import java.util.stream.Collectors; -import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; - public class EnchantmentRecipe extends EnchantingApparatusRecipe { - public Enchantment enchantment; + public Holder enchantment; public int enchantLevel; - - public EnchantmentRecipe(List pedestalItems, Enchantment enchantment, int level, int manaCost) { + public EnchantmentRecipe(List pedestalItems, Holder enchantment, int level, int manaCost) { this.pedestalItems = pedestalItems; this.enchantment = enchantment; this.enchantLevel = level; this.sourceCost = manaCost; - this.id = ArsNouveau.prefix( getRegistryName(enchantment).getPath() + "_" + level); + this.id = ArsNouveau.prefix(enchantment.unwrapKey().get().location().getPath() + "_" + level); } @Override @@ -52,11 +50,11 @@ public RecipeType getType() { public boolean doesReagentMatch(ItemStack stack, Player playerEntity) { if (stack.isEmpty()) return false; - Map enchantments = EnchantmentHelper.getEnchantments(stack); - int level = enchantments.getOrDefault(enchantment, 0); - Collection enchantList = EnchantmentHelper.getEnchantments(stack).keySet(); + ItemEnchantments enchantments = EnchantmentHelper.getEnchantmentsForCrafting(stack); + int level = enchantments.getLevel(enchantment); + Collection> enchantList = enchantments.entrySet().stream().map(Map.Entry::getKey).collect(Collectors.toList()); enchantList.remove(enchantment); - if (stack.getItem() != Items.BOOK && stack.getItem() != Items.ENCHANTED_BOOK && !enchantment.canEnchant(stack)) { + if (stack.getItem() != Items.BOOK && stack.getItem() != Items.ENCHANTED_BOOK && !enchantment.value().canEnchant(stack)) { PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.enchanting.incompatible")); return false; } @@ -88,17 +86,19 @@ public boolean isMatch(List pedestalItems, ItemStack reagent, Enchant @Override public boolean doesReagentMatch(ItemStack stack) { - Map enchantments = EnchantmentHelper.getEnchantments(stack); - int level = enchantments.getOrDefault(enchantment, 0); - return enchantment.canEnchant(stack) && this.enchantLevel - level == 1 && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantments(stack).keySet(), enchantment); + ItemEnchantments enchantments = EnchantmentHelper.getEnchantmentsForCrafting(stack); + int level = enchantments.getLevel(enchantment); + var val = enchantment.value(); + return val.canEnchant(stack) && this.enchantLevel - level == 1 && EnchantmentHelper.isEnchantmentCompatible(enchantments.keySet(), enchantment); } @Override public ItemStack assemble(EnchantingApparatusTile inv, RegistryAccess p_267165_) { ItemStack stack = inv.getStack().getItem() == Items.BOOK ? new ItemStack(Items.ENCHANTED_BOOK) : inv.getStack().copy(); ItemEnchantments enchantments = EnchantmentHelper.getEnchantmentsForCrafting(stack); - enchantments.put(enchantment, enchantLevel); - EnchantmentHelper.setEnchantments(enchantments, stack); + var mutable = new ItemEnchantments.Mutable(enchantments); + mutable.set(enchantment, enchantLevel); + EnchantmentHelper.setEnchantments(stack, mutable.toImmutable()); return stack; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/BuddingConversionRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/BuddingConversionRecipe.java deleted file mode 100644 index cb7f976c2d..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/BuddingConversionRecipe.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.hollingsworth.arsnouveau.api.recipe; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -import com.mojang.serialization.Codec; -import com.mojang.serialization.JsonOps; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.core.RegistryAccess; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.Container; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import org.jetbrains.annotations.Nullable; - -public record BuddingConversionRecipe(ResourceLocation id, Block input, Block result) implements Recipe { - @Override - public boolean matches(Container container, Level level) { - return false; - } - - public boolean matches(BlockState block) { - return block.is(input); - } - - @Override - public ItemStack assemble(Container container, RegistryAccess registryAccess) { - return ItemStack.EMPTY; - } - - @Override - public boolean canCraftInDimensions(int i, int i1) { - return false; - } - - @Override - public ItemStack getResultItem(RegistryAccess registryAccess) { - return ItemStack.EMPTY; - } - - @Override - public ResourceLocation getId() { - return id; - } - - @Override - public RecipeSerializer getSerializer() { - return RecipeRegistry.BUDDING_CONVERSION_SERIALIZER.get(); - } - - @Override - public RecipeType getType() { - return RecipeRegistry.BUDDING_CONVERSION_TYPE.get(); - } - - @Override - public boolean isSpecial() { - return true; - } - - public JsonElement asRecipe() { - JsonElement recipe = Serializer.CODEC.encodeStart(JsonOps.INSTANCE, this).result().orElse(null); - JsonObject obj = recipe.getAsJsonObject(); - obj.addProperty("type", getType().toString()); - return obj; - } - - public static class Serializer implements RecipeSerializer { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - ResourceLocation.CODEC.fieldOf("id").forGetter(BuddingConversionRecipe::id), - BuiltInRegistries.BLOCK.byNameCodec().fieldOf("input").forGetter(BuddingConversionRecipe::input), - BuiltInRegistries.BLOCK.byNameCodec().fieldOf("result").forGetter(BuddingConversionRecipe::result) - ).apply(instance, BuddingConversionRecipe::new)); - - @Override - public BuddingConversionRecipe fromJson(ResourceLocation resourceLocation, JsonObject jsonObject) { - return CODEC.parse(JsonOps.INSTANCE, jsonObject).result().orElse(null); - } - - @Override - public @Nullable BuddingConversionRecipe fromNetwork(ResourceLocation resourceLocation, FriendlyByteBuf friendlyByteBuf) { - return friendlyByteBuf.readJsonWithCodec(CODEC); - } - - @Override - public void toNetwork(FriendlyByteBuf friendlyByteBuf, BuddingConversionRecipe buddingConversionRecipe) { - friendlyByteBuf.writeJsonWithCodec(CODEC, buddingConversionRecipe); - } - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/MultiRecipeWrapper.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/MultiRecipeWrapper.java index 1b30dfa256..8edef5b1ab 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/MultiRecipeWrapper.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/MultiRecipeWrapper.java @@ -3,12 +3,10 @@ import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; import com.hollingsworth.arsnouveau.common.block.tile.WixieCauldronTile; import net.minecraft.core.BlockPos; -import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.item.crafting.*; @@ -96,10 +94,8 @@ public List getItemsNeeded(Map inventory, Level world, if (stack.getItem() == Items.POTION) { PotionContents potionContents = stack.get(DataComponents.POTION_CONTENTS); if (potionContents == null) continue; - Optional> potionOpt = potionContents.potion(); - if (potionOpt.isEmpty()) continue; - Potion potion = potionOpt.get().value(); - if (potion == Potions.WATER || WixieCauldronTile.findNeededPotion(potion, 300, world, pos) != null) { + + if (potionContents.is(Potions.WATER) || WixieCauldronTile.findNeededPotion(potionContents, 300, world, pos) != null) { foundStack = true; break; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/ScryRitualRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/ScryRitualRecipe.java deleted file mode 100644 index c09ae82d1d..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/ScryRitualRecipe.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.hollingsworth.arsnouveau.api.recipe; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -import com.mojang.serialization.Codec; -import com.mojang.serialization.JsonOps; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.core.RegistryAccess; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.core.registries.Registries; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.TagKey; -import net.minecraft.world.Container; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import org.jetbrains.annotations.Nullable; - -public record ScryRitualRecipe(ResourceLocation id, TagKey augment, TagKey highlight) implements Recipe { - @Override - public boolean matches(Container container, Level level) { - return false; - } - - public boolean matches(ItemStack input) { - return input.is(augment); - } - - @Override - public ItemStack assemble(Container container, RegistryAccess registryAccess) { - return ItemStack.EMPTY; - } - - @Override - public boolean canCraftInDimensions(int i, int i1) { - return false; - } - - @Override - public ItemStack getResultItem(RegistryAccess registryAccess) { - return ItemStack.EMPTY; - } - - @Override - public ResourceLocation getId() { - return id; - } - - @Override - public RecipeSerializer getSerializer() { - return RecipeRegistry.SCRY_RITUAL_SERIALIZER.get(); - } - - @Override - public RecipeType getType() { - return RecipeRegistry.SCRY_RITUAL_TYPE.get(); - } - - @Override - public boolean isSpecial() { - return true; - } - - public JsonElement asRecipe() { - JsonElement recipe = Serializer.CODEC.encodeStart(JsonOps.INSTANCE, this).result().orElse(null); - JsonObject obj = recipe.getAsJsonObject(); - obj.addProperty("type", getType().toString()); - return obj; - } - - public static class Serializer implements RecipeSerializer { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - ResourceLocation.CODEC.fieldOf("id").forGetter(ScryRitualRecipe::id), - TagKey.codec(Registries.ITEM).fieldOf("augment").forGetter(ScryRitualRecipe::augment), - TagKey.codec(Registries.BLOCK).fieldOf("highlight").forGetter(ScryRitualRecipe::highlight) - ).apply(instance, ScryRitualRecipe::new)); - - @Override - public ScryRitualRecipe fromJson(ResourceLocation resourceLocation, JsonObject jsonObject) { - return CODEC.parse(JsonOps.INSTANCE, jsonObject).result().orElse(null); - } - - @Override - public @Nullable ScryRitualRecipe fromNetwork(ResourceLocation resourceLocation, FriendlyByteBuf friendlyByteBuf) { - return friendlyByteBuf.readJsonWithCodec(CODEC); - } - - @Override - public void toNetwork(FriendlyByteBuf friendlyByteBuf, ScryRitualRecipe buddingConversionRecipe) { - friendlyByteBuf.writeJsonWithCodec(CODEC, buddingConversionRecipe); - } - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/ShapedHelper.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/ShapedHelper.java index 6d098d639f..740d34b211 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/ShapedHelper.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/ShapedHelper.java @@ -14,8 +14,8 @@ public class ShapedHelper { public List> possibleRecipes; public ShapedHelper(ShapedRecipe recipe) { - recipeHeight = recipe.getRecipeHeight(); - recipeWidth = recipe.getRecipeWidth(); + recipeHeight = recipe.getHeight(); + recipeWidth = recipe.getWidth(); recipeItems = recipe.getIngredients(); possibleRecipes = getPossibleRecipes(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/SummonRitualRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/SummonRitualRecipe.java deleted file mode 100644 index b09e411848..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/SummonRitualRecipe.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.hollingsworth.arsnouveau.api.recipe; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; -import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -import com.mojang.serialization.Codec; -import com.mojang.serialization.JsonOps; -import com.mojang.serialization.MapCodec; -import com.mojang.serialization.MapLike; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.core.HolderLookup; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.random.WeightedRandomList; -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; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.biome.MobSpawnSettings; - -import java.util.Arrays; -import java.util.List; -import java.util.Optional; - -public record SummonRitualRecipe(ResourceLocation id, Ingredient augment, Integer count, WeightedRandomList mobs) implements Recipe { - @Override - public boolean matches(Container pContainer, Level pLevel) { - return false; - } - - public boolean matches(List augments) { - return EnchantingApparatusRecipe.doItemsMatch(augments, Arrays.stream(this.augment.getItems()).map(Ingredient::of).toList()); - } - - @Override - public ItemStack assemble(Container pCraftingContainer, HolderLookup.Provider pRegistries) { - return ItemStack.EMPTY; - } - - @Override - public boolean canCraftInDimensions(int pWidth, int pHeight) { - return false; - } - - @Override - public ItemStack getResultItem(HolderLookup.Provider pRegistries) { - return ItemStack.EMPTY; - } - - @Override - public RecipeSerializer getSerializer() { - return RecipeRegistry.SUMMON_RITUAL_SERIALIZER.get(); - } - - @Override - public RecipeType getType() { - return RecipeRegistry.SUMMON_RITUAL_TYPE.get(); - } - - @Override - public boolean isSpecial() { - return true; - } - - public JsonElement asRecipe() { - Optional encoded = Serializer.CODEC.encoder().encodeStart(JsonOps.INSTANCE, this).result(); - if (encoded.isEmpty()) return null; - - JsonObject obj = encoded.get().getAsJsonObject(); - obj.addProperty("type", "ars_nouveau:summon_ritual"); - - return obj; - } - - public static class Serializer implements RecipeSerializer { - public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - ResourceLocation.CODEC.fieldOf("id").forGetter(SummonRitualRecipe::id), - net.minecraft.world.item.crafting.Ingredient.CODEC.fieldOf("augment").forGetter(SummonRitualRecipe::augment), - Codec.INT.fieldOf("count").forGetter(SummonRitualRecipe::count), - WeightedRandomList.codec(MobSpawnSettings.SpawnerData.CODEC).fieldOf("mobs").forGetter(SummonRitualRecipe::mobs) - ).apply(instance, SummonRitualRecipe::new)); - - @Override - public MapCodec codec() { - return CODEC; - } - - @Override - public StreamCodec streamCodec() { - return StreamCodec.of(this::toNetwork, this::fromNetwork); - } - - private void toNetwork(RegistryFriendlyByteBuf friendlyByteBuf, SummonRitualRecipe recipe) { - friendlyByteBuf.writeJsonWithCodec(CODEC.codec(), recipe); - } - - private SummonRitualRecipe fromNetwork(RegistryFriendlyByteBuf friendlyByteBuf) { - return friendlyByteBuf.readJsonWithCodec(CODEC.codec()); - } - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/BuddingConversionRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/BuddingConversionRegistry.java index e7b9c835d2..0691cd6a4b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/BuddingConversionRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/BuddingConversionRegistry.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.api.registry; -import com.hollingsworth.arsnouveau.api.recipe.BuddingConversionRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.BuddingConversionRecipe; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import net.minecraft.world.item.crafting.RecipeManager; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java index 8b0a5a3d06..5e99a467b2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java @@ -1,8 +1,9 @@ package com.hollingsworth.arsnouveau.api.registry; import com.hollingsworth.arsnouveau.api.loot.DungeonLootTables; -import com.hollingsworth.arsnouveau.common.tomes.CasterTomeData; +import com.hollingsworth.arsnouveau.common.crafting.recipes.CasterTomeData; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.level.Level; @@ -22,8 +23,8 @@ public static List reloadTomeData(RecipeManager recipeManager, L var recipes = recipeManager.getAllRecipesFor(RecipeRegistry.CASTER_TOME_TYPE.get()); DungeonLootTables.CASTER_TOMES = new ArrayList<>(); TOME_DATA = new ArrayList<>(); - TOME_DATA.addAll(recipes); - recipes.forEach(tome -> DungeonLootTables.CASTER_TOMES.add(() -> tome.getResultItem(level.registryAccess()))); + TOME_DATA.addAll(recipes.stream().map(RecipeHolder::value).toList()); + recipes.forEach(tome -> DungeonLootTables.CASTER_TOMES.add(() -> tome.value().getResultItem(level.registryAccess()))); return TOME_DATA; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/ScryRitualRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/ScryRitualRegistry.java index ea23f6e167..de84daab76 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/ScryRitualRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/ScryRitualRegistry.java @@ -1,7 +1,8 @@ package com.hollingsworth.arsnouveau.api.registry; -import com.hollingsworth.arsnouveau.api.recipe.ScryRitualRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.ScryRitualRecipe; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeManager; import java.util.ArrayList; @@ -17,7 +18,7 @@ public static List getRecipes(){ public static void reloadScryRitualRecipes(RecipeManager recipeManager){ RECIPES = new ArrayList<>(); - List recipes = recipeManager.getAllRecipesFor(RecipeRegistry.SCRY_RITUAL_TYPE.get()); - RECIPES.addAll(recipes); + List> recipes = recipeManager.getAllRecipesFor(RecipeRegistry.SCRY_RITUAL_TYPE.get()); + RECIPES.addAll(recipes.stream().map(RecipeHolder::value).toList()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/RangeEffectRitual.java b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/RangeEffectRitual.java index 93ac7abd84..a1ec89baa7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/RangeEffectRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/RangeEffectRitual.java @@ -1,13 +1,14 @@ package com.hollingsworth.arsnouveau.api.ritual; import com.hollingsworth.arsnouveau.api.util.BlockUtil; +import net.minecraft.core.Holder; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectInstance; public abstract class RangeEffectRitual extends RangeRitual { - abstract public MobEffect getEffect(); + abstract public Holder getEffect(); abstract public int getRange(); abstract public int getDuration(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java index de75c3518f..0b37478845 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java @@ -20,8 +20,10 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.RegisterClientTooltipComponentFactoriesEvent; +import net.neoforged.neoforge.client.event.RenderGuiLayerEvent; import net.neoforged.neoforge.client.event.RenderHighlightEvent; import net.neoforged.neoforge.client.event.RenderTooltipEvent; +import net.neoforged.neoforge.client.gui.VanillaGuiLayers; import net.neoforged.neoforge.event.entity.player.ItemTooltipEvent; import java.util.Collections; @@ -63,8 +65,8 @@ public static void highlightBlockEvent(RenderHighlightEvent.Block e) { } @SubscribeEvent - public static void overlayEvent(RenderGuiOverlayEvent.Pre event) { - if (Minecraft.getInstance().screen instanceof GuiRadialMenu && event.getOverlay() == VanillaGuiOverlay.CROSSHAIR.type()) { + public static void overlayEvent(RenderGuiLayerEvent.Pre event) { + if (Minecraft.getInstance().screen instanceof GuiRadialMenu && event.getName().equals(VanillaGuiLayers.CROSSHAIR)) { event.setCanceled(true); } } @@ -73,7 +75,7 @@ public static void overlayEvent(RenderGuiOverlayEvent.Pre event) { @SubscribeEvent public static void onTooltip(final ItemTooltipEvent event) { ItemStack stack = event.getItemStack(); - int level = stack.getEnchantmentLevel(EnchantmentRegistry.REACTIVE_ENCHANTMENT.get()); + int level = stack.getEnchantmentLevel(EnchantmentRegistry.REACTIVE_ENCHANTMENT); if (level > 0 && new ReactiveCaster(stack).getSpell().isValid()) { Spell spell = new ReactiveCaster(stack).getSpell(); event.getToolTip().add(Component.literal(spell.getDisplayString())); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java index 91e747c3b8..8190ff5f72 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java @@ -6,9 +6,11 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.client.gui.screens.inventory.tooltip.DefaultTooltipPositioner; import net.minecraft.client.renderer.MultiBufferSource; @@ -24,8 +26,6 @@ import net.minecraft.world.phys.HitResult; import net.neoforged.neoforge.client.ClientHooks; import net.neoforged.neoforge.client.event.RenderTooltipEvent; -import net.neoforged.neoforge.client.gui.overlay.ExtendedGui; -import net.neoforged.neoforge.client.gui.overlay.IGuiOverlay; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.NotNull; import org.joml.Matrix4f; @@ -34,13 +34,12 @@ import java.util.List; public class GuiEntityInfoHUD { - public static final IGuiOverlay OVERLAY = GuiEntityInfoHUD::renderOverlay; + public static final LayeredDraw.Layer OVERLAY = GuiEntityInfoHUD::renderOverlay; public static int hoverTicks = 0; public static Object lastHovered = null; - public static void renderOverlay(ExtendedGui gui, GuiGraphics graphics, float partialTicks, int width, - int height) { + public static void renderOverlay(GuiGraphics graphics, DeltaTracker tracker) { PoseStack poseStack = graphics.pose(); Minecraft mc = Minecraft.getInstance(); if (mc.options.hideGui || mc.gameMode.getPlayerMode() == GameType.SPECTATOR) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java index e3749b7ac4..8504d65825 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java @@ -6,21 +6,19 @@ import com.hollingsworth.arsnouveau.api.mana.IManaCap; import com.hollingsworth.arsnouveau.api.util.ManaUtil; import com.hollingsworth.arsnouveau.client.ClientInfo; -import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.setup.config.Config; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.client.gui.LayeredDraw; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.client.gui.overlay.ExtendedGui; -import net.neoforged.neoforge.client.gui.overlay.IGuiOverlay; public class GuiManaHUD { - public static final IGuiOverlay OVERLAY = GuiManaHUD::renderOverlay; + public static final LayeredDraw.Layer OVERLAY = GuiManaHUD::renderOverlay; private static final Minecraft minecraft = Minecraft.getInstance(); @@ -32,8 +30,7 @@ public static boolean shouldDisplayBar() { || (ManaUtil.getMaxMana(minecraft.player) > ManaUtil.getCurrentMana(minecraft.player)); } - public static void renderOverlay(ExtendedGui gui, GuiGraphics guiGraphics, float pt, int width, - int height) { + public static void renderOverlay(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { if (!shouldDisplayBar()) return; PoseStack ms = guiGraphics.pose(); @@ -53,7 +50,7 @@ public static void renderOverlay(ExtendedGui gui, GuiGraphics guiGraphics, float int yOffset = minecraft.getWindow().getGuiScaledHeight() - 5 + Config.MANABAR_Y_OFFSET.get(); guiGraphics.blit( ArsNouveau.prefix( "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 18, 0, 0, 108, 18, 256, 256); - int manaOffset = (int) (((ClientInfo.ticksInGame + pt) / 3 % (33))) * 6; + int manaOffset = (int) (((ClientInfo.ticksInGame + deltaTracker.getGameTimeDeltaTicks()) / 3 % (33))) * 6; guiGraphics.blit(ArsNouveau.prefix( "textures/gui/manabar_gui_mana.png"), offsetLeft + 9, yOffset - 9, 0, manaOffset, manaLength, 6, 256, 256); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java index ba22fe7471..7fec514ced 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java @@ -4,26 +4,25 @@ import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.api.util.StackUtil; import com.hollingsworth.arsnouveau.common.items.SpellBook; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.client.gui.overlay.ExtendedGui; -import net.neoforged.neoforge.client.gui.overlay.IGuiOverlay; public class GuiSpellHUD { - public static final IGuiOverlay OVERLAY = GuiSpellHUD::renderOverlay; + public static final LayeredDraw.Layer OVERLAY = GuiSpellHUD::renderOverlay; private static final Minecraft minecraft = Minecraft.getInstance(); - public static void renderOverlay(ExtendedGui gui, GuiGraphics graphics, float pt, int width, - int height) { + public static void renderOverlay(GuiGraphics graphics, DeltaTracker deltaTracker) { ItemStack stack = StackUtil.getHeldSpellbook(minecraft.player); if (stack != ItemStack.EMPTY && stack.getItem() instanceof SpellBook && stack.getTag() != null) { int offsetLeft = 10; ISpellCaster caster = CasterUtil.getCaster(stack); String renderString = caster.getCurrentSlot() + 1 + " " + caster.getSpellName(); - graphics.drawString(gui.getFont(), renderString, offsetLeft, minecraft.getWindow().getGuiScaledHeight() - 30, 0xFFFFFF); + graphics.drawString(Minecraft.getInstance().font, renderString, offsetLeft, minecraft.getWindow().getGuiScaledHeight() - 30, 0xFFFFFF); } } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java index a9ac194fa7..d4490ae677 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java @@ -16,8 +16,9 @@ import net.minecraft.world.level.block.Blocks; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.MovementInputUpdateEvent; + import java.util.List; @EventBusSubscriber(Dist.CLIENT) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ApparatusEnchantingRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ApparatusEnchantingRecipeCategory.java index 6ff5260f57..927df426ab 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ApparatusEnchantingRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ApparatusEnchantingRecipeCategory.java @@ -6,6 +6,7 @@ import mezz.jei.api.recipe.IFocusGroup; import mezz.jei.api.recipe.RecipeIngredientRole; import mezz.jei.api.recipe.RecipeType; +import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.world.item.EnchantedBookItem; import net.minecraft.world.item.ItemStack; @@ -29,7 +30,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, EnchantmentRecipe recipe, IF ItemStack dummy = recipe.enchantLevel > 1 ? EnchantedBookItem.createForEnchantment(new EnchantmentInstance(recipe.enchantment, recipe.enchantLevel-1)) : Items.BOOK.getDefaultInstance(); Component message = recipe.enchantLevel == 1 ? Component.literal("Any compatible item") : Component.literal("Needs lower level enchantment"); - dummy.setHoverName(message); //TODO Translatable + dummy.set(DataComponents.CUSTOM_NAME, message); //TODO Translatable builder.addSlot(RecipeIngredientRole.INPUT, 48, 45).addItemStack(dummy); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/CraftingTerminalTransferHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/CraftingTerminalTransferHandler.java index 7aa23e0408..b60ec3b06e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/CraftingTerminalTransferHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/CraftingTerminalTransferHandler.java @@ -4,7 +4,6 @@ import com.hollingsworth.arsnouveau.client.container.IAutoFillTerminal; import com.hollingsworth.arsnouveau.client.container.StoredItemStack; import com.hollingsworth.arsnouveau.setup.registry.MenuRegistry; - import mezz.jei.api.constants.RecipeTypes; import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.gui.ingredient.IRecipeSlotView; @@ -18,17 +17,19 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.RecipeHolder; import org.jetbrains.annotations.Nullable; import java.util.*; -public class CraftingTerminalTransferHandler implements IRecipeTransferHandler { +public class CraftingTerminalTransferHandler implements IRecipeTransferHandler> { private final Class containerClass; private final IRecipeTransferHandlerHelper helper; private static final List> containerClasses = new ArrayList<>(); @@ -50,7 +51,7 @@ public Class getContainerClass() { } @Override - public @Nullable IRecipeTransferError transferRecipe(AbstractContainerMenu container, CraftingRecipe recipe, + public @Nullable IRecipeTransferError transferRecipe(C container, RecipeHolder recipe, IRecipeSlotsView recipeSlots, Player player, boolean maxTransfer, boolean doTransfer) { if (container instanceof IAutoFillTerminal term) { List missing = new ArrayList<>(); @@ -105,8 +106,7 @@ public Class getContainerClass() { if (stacks[i][j] != null && !stacks[i][j].isEmpty()) { StoredItemStack s = new StoredItemStack(stacks[i][j]); if(stored.contains(s) || player.getInventory().findSlotMatchingItem(stacks[i][j]) != -1) { - CompoundTag tag = new CompoundTag(); - stacks[i][j].save(tag); + Tag tag = stacks[i][j].save(player.level.registryAccess()); CompoundNBT.put("i" + (k++), tag); } } @@ -159,7 +159,8 @@ public Optional> getMenuType() { } @Override - public RecipeType getRecipeType() { + public RecipeType> getRecipeType() { return RecipeTypes.CRAFTING; } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/DyeRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/DyeRecipeCategory.java index 1b4b159671..0206b11c4b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/DyeRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/DyeRecipeCategory.java @@ -12,20 +12,20 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.DyeItem; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeHolder; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class DyeRecipeCategory implements ICraftingCategoryExtension { - private final DyeRecipe recipe; +public class DyeRecipeCategory implements ICraftingCategoryExtension { - public DyeRecipeCategory(DyeRecipe recipe) { - this.recipe = recipe; - } + + public DyeRecipeCategory() {} @Override - public void setRecipe(IRecipeLayoutBuilder builder, ICraftingGridHelper craftingGridHelper, IFocusGroup focuses) { + public void setRecipe(RecipeHolder recipeHolder, IRecipeLayoutBuilder builder, ICraftingGridHelper craftingGridHelper, IFocusGroup focuses) { + var recipe = recipeHolder.value(); List> inputs = recipe.getIngredients().stream() .map(ingredient -> List.of(ingredient.getItems())) .toList(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIArsNouveauPlugin.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIArsNouveauPlugin.java index 6b3c637628..173d1b2b38 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIArsNouveauPlugin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIArsNouveauPlugin.java @@ -21,6 +21,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeManager; import java.util.ArrayList; @@ -60,9 +61,9 @@ public void registerRecipes(IRecipeRegistration registry) { List enchantments = new ArrayList<>(); List crushRecipes = new ArrayList<>(); List armorUpgrades = new ArrayList<>(); - List imbuementRecipes = Minecraft.getInstance().level.getRecipeManager().getAllRecipesFor(RecipeRegistry.IMBUEMENT_TYPE.get()); + List imbuementRecipes = Minecraft.getInstance().level.getRecipeManager().getAllRecipesFor(RecipeRegistry.IMBUEMENT_TYPE.get()).stream().map(RecipeHolder::value).toList(); RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); - for (Recipe i : manager.getRecipes()) { + for (Recipe i : manager.getRecipes().stream().map(RecipeHolder::value).toList()) { if (i instanceof GlyphRecipe glyphRecipe) { recipeList.add(glyphRecipe); } @@ -108,7 +109,7 @@ public void registerRecipeTransferHandlers(IRecipeTransferRegistration registrat @Override public void registerVanillaCategoryExtensions(IVanillaCategoryExtensionRegistration registration) { - registration.getCraftingCategory().addCategoryExtension(DyeRecipe.class, DyeRecipeCategory::new); + registration.getCraftingCategory().addExtension(DyeRecipe.class, new DyeRecipeCategory()); } private static IJeiRuntime jeiRuntime; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index 53ba7bea83..8d9fff7b38 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -27,6 +27,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.Options; import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.LayeredDraw; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.entity.*; import net.minecraft.client.renderer.item.ClampedItemPropertyFunction; @@ -38,7 +39,6 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.alchemy.PotionContents; -import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.neoforged.api.distmarker.Dist; @@ -48,6 +48,8 @@ import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; +import net.neoforged.neoforge.client.event.RegisterGuiLayersEvent; +import net.neoforged.neoforge.client.gui.VanillaGuiLayers; import org.jetbrains.annotations.Nullable; import static com.hollingsworth.arsnouveau.client.events.ClientEvents.localize; @@ -156,7 +158,7 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerEntityRenderer(ModEntities.LILY.get(), LilyRenderer::new); } - public static NamedGuiOverlay cameraOverlay = new NamedGuiOverlay(ArsNouveau.prefix( "scry_camera"), (gui, pose, partialTick, width, height) -> { + public static LayeredDraw.Layer cameraOverlay = new LayeredDraw.Layer(ArsNouveau.prefix( "scry_camera"), (gui, pose, partialTick, width, height) -> { Minecraft mc = Minecraft.getInstance(); Level level = mc.level; BlockPos pos = mc.cameraEntity.blockPosition(); @@ -177,11 +179,11 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer }); @SubscribeEvent - public static void registerOverlays(final RegisterGuiOverlaysEvent event) { - event.registerAboveAll("scry_camera", cameraOverlay.overlay()); - event.registerAbove(VanillaGuiOverlay.HOTBAR.id(), "tooltip", GuiEntityInfoHUD.OVERLAY); - event.registerAboveAll("mana_hud", GuiManaHUD.OVERLAY); - event.registerAboveAll("spell_hud", GuiSpellHUD.OVERLAY); + public static void registerOverlays(final RegisterGuiLayersEvent event) { + event.registerAboveAll(ArsNouveau.prefix("scry_camera"), cameraOverlay); + event.registerAbove(VanillaGuiLayers.HOTBAR, ArsNouveau.prefix("tooltip"), GuiEntityInfoHUD.OVERLAY); + event.registerAboveAll(ArsNouveau.prefix("mana_hud"), GuiManaHUD.OVERLAY); + event.registerAboveAll(ArsNouveau.prefix("spell_hud"), GuiSpellHUD.OVERLAY); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java index cfb856e282..592e9ddaf5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java @@ -3,26 +3,26 @@ import com.hollingsworth.arsnouveau.client.particle.*; import net.minecraft.client.Minecraft; import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.registries.BuiltInRegistries; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.RegisterParticleProvidersEvent; +import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; - - import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; @EventBusSubscriber(modid = MODID, bus = EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) public class ModParticles { - public static final DeferredRegister> PARTICLES = DeferredRegister.create(ForgeRegistries.PARTICLE_TYPES, MODID); + public static final DeferredRegister> PARTICLES = DeferredRegister.create(BuiltInRegistries.PARTICLE_TYPE, MODID); - public static final RegistryObject> GLOW_TYPE = PARTICLES.register("glow", GlowParticleType::new); - public static final RegistryObject> LINE_TYPE = PARTICLES.register("line", LineParticleType::new); - public static final RegistryObject> SPARKLE_TYPE = PARTICLES.register("sparkle", () -> new SparkleParticleType()); - public static final RegistryObject> HELIX_TYPE = PARTICLES.register(HelixParticleData.NAME, () -> new HelixParticleType()); + public static final DeferredHolder, ParticleType> GLOW_TYPE = PARTICLES.register("glow", GlowParticleType::new); + public static final DeferredHolder, ParticleType> LINE_TYPE = PARTICLES.register("line", LineParticleType::new); + public static final DeferredHolder, ParticleType> SPARKLE_TYPE = PARTICLES.register("sparkle", SparkleParticleType::new); + public static final DeferredHolder, ParticleType> HELIX_TYPE = PARTICLES.register(HelixParticleData.NAME, HelixParticleType::new); @SubscribeEvent public static void registerFactories(RegisterParticleProvidersEvent evt) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ShaderRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ShaderRegistry.java index 403c5a437d..12e56bcfc3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ShaderRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ShaderRegistry.java @@ -15,7 +15,7 @@ import net.minecraft.resources.ResourceLocation; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.RegisterShadersEvent; import org.apache.commons.lang3.function.TriFunction; import org.apache.commons.lang3.tuple.Triple; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java index 09882ad2ba..151fcd59b1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java @@ -16,13 +16,11 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Position; -import net.minecraft.core.dispenser.BlockSource; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; 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.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -120,7 +118,7 @@ public void shootSpell(ServerLevel world, BlockPos pos) { if (manaCost > 0 && SourceUtil.takeSourceWithParticles(pos, world, 10, manaCost) == null) return; Networking.sendToNearby(world, pos, new PacketOneShotAnimation(pos)); - Position iposition = getDispensePosition(world.getBlockState(pos), pos); + Position iposition = getDispensePosition(pos, world.getBlockState(pos).getValue(FACING)); Direction direction = world.getBlockState(pos).getValue(FACING); FakePlayer fakePlayer = ANFakePlayer.getPlayer(world); fakePlayer.setPos(pos.getX(), pos.getY(), pos.getZ()); @@ -147,8 +145,7 @@ public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block /** * Get the position where the dispenser at the given Coordinates should dispense to. */ - public static Position getDispensePosition(BlockState state, BlockPos pos) { - Direction direction = state.getValue(FACING); + public static Position getDispensePosition(BlockPos pos, Direction direction) { double d0 = pos.getX() + 0.5D * (double) direction.getStepX(); double d1 = pos.getY() + 0.5D * (double) direction.getStepY(); double d2 = pos.getZ() + 0.5D * (double) direction.getStepZ(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryerCrystal.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryerCrystal.java index 4ba01e3f9e..ad08aef3c6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryerCrystal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryerCrystal.java @@ -21,6 +21,7 @@ import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.block.state.properties.DirectionProperty; import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; @@ -82,13 +83,13 @@ public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, /** * Get the position where the dispenser at the given Coordinates should dispense to. */ - public static Position getDispensePosition(BlockSource coords, Direction direction) { + public static Position getDispensePosition(BlockPos pos, Direction direction) { // Offset to get closer to the eye. double negOffset = -0.49; - double d0 = coords.x() + negOffset * (double) direction.getStepX(); - double d1 = coords.y() + negOffset * (double) direction.getStepY(); - double d2 = coords.z() + negOffset * (double) direction.getStepZ(); - return new PositionImpl(d0, d1, d2); + double d0 = pos.getX() + negOffset * (double) direction.getStepX(); + double d1 = pos.getY() + negOffset * (double) direction.getStepY(); + double d2 = pos.getZ() + negOffset * (double) direction.getStepZ(); + return new Vec3(d0, d1, d2); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java index 08e04f6659..f2b9a7a2da 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java @@ -9,7 +9,6 @@ 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.entity.Entity; import net.minecraft.world.entity.LivingEntity; @@ -133,10 +132,10 @@ public void performBonemeal(ServerLevel worldIn, RandomSource rand, BlockPos pos @Nullable @Override - public BlockPathTypes getBlockPathType(BlockState state, BlockGetter world, BlockPos pos, @Nullable Mob entity) { + public PathType getBlockPathType(BlockState state, BlockGetter world, BlockPos pos, @Nullable Mob entity) { if(entity instanceof Starbuncle){ - return BlockPathTypes.WALKABLE; + return PathType.WALKABLE; } - return BlockPathTypes.DAMAGE_OTHER; + return PathType.DAMAGE_OTHER; } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/SpellPrismBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/SpellPrismBlock.java index aad93faebf..0417eb7f72 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/SpellPrismBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/SpellPrismBlock.java @@ -6,14 +6,20 @@ import com.hollingsworth.arsnouveau.common.entity.EntityProjectileSpell; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAccelerate; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDecelerate; -import net.minecraft.core.*; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Position; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.phys.Vec3; import javax.annotation.Nullable; @@ -34,12 +40,11 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { return this.defaultBlockState().setValue(FACING, context.getNearestLookingDirection().getOpposite()); } - public static Position getDispensePosition(BlockSource coords) { - Direction direction = coords.getBlockState().getValue(FACING); - double d0 = coords.x() + 0.3D * direction.getStepX(); - double d1 = coords.y() + 0.3D * direction.getStepY(); - double d2 = coords.z() + 0.3D * direction.getStepZ(); - return new PositionImpl(d0, d1, d2); + public static Position getDispensePosition(BlockPos pos, Direction direction) { + double d0 = pos.getX() + 0.3D * direction.getStepX(); + double d1 = pos.getY() + 0.3D * direction.getStepY(); + double d2 = pos.getZ() + 0.3D * direction.getStepZ(); + return new Vec3(d0, d1, d2); } @Override @@ -57,12 +62,12 @@ public BlockState mirror(BlockState state, Mirror mirrorIn) { @Override public void onHit(ServerLevel world, BlockPos pos, EntityProjectileSpell spell) { - Position iposition = getDispensePosition(new BlockSourceImpl(world, pos)); - Direction direction = world.getBlockState(pos).getValue(DispenserBlock.FACING); + Direction direction = world.getBlockState(pos).getValue(FACING); + Position iposition = getDispensePosition(pos, direction); spell.setPos(iposition.x(), iposition.y(), iposition.z()); spell.prismRedirect++; if(spell.prismRedirect >= 3){ - ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.PRISMATIC, world, pos, 10); + ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.PRISMATIC.get(), world, pos, 10); } if (spell.spellResolver == null) { spell.remove(Entity.RemovalReason.DISCARDED); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/StrippableLog.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/StrippableLog.java index 52f3cfd68a..e3f9a0d619 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/StrippableLog.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/StrippableLog.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.common.block; -import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.BlockRegistryWrapper; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.RotatedPillarBlock; @@ -19,7 +19,7 @@ public StrippableLog(Properties properties, Supplier stateSupplier) { this.strippedState = stateSupplier; } - public StrippableLog(Properties properties, RegistryWrapper ro) { + public StrippableLog(Properties properties, BlockRegistryWrapper ro) { super(properties); this.strippedState = () -> ro.get(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/FalseWeaveTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/FalseWeaveTile.java index ce918ae680..426b357512 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/FalseWeaveTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/FalseWeaveTile.java @@ -6,7 +6,7 @@ public class FalseWeaveTile extends MirrorWeaveTile{ public FalseWeaveTile(BlockPos pos, BlockState state) { - super(BlockRegistry.FALSE_WEAVE_TILE, pos, state); + super(BlockRegistry.FALSE_WEAVE_TILE.get(), pos, state); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/GhostWeaveTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/GhostWeaveTile.java index 10f321d323..d40be41eca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/GhostWeaveTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/GhostWeaveTile.java @@ -14,7 +14,7 @@ public class GhostWeaveTile extends MirrorWeaveTile{ private boolean invisible; public GhostWeaveTile(BlockPos pos, BlockState state) { - super(BlockRegistry.GHOST_WEAVE_TILE, pos, state); + super(BlockRegistry.GHOST_WEAVE_TILE.get(), pos, state); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MirrorWeaveTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MirrorWeaveTile.java index b4617ede39..593fcb0643 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MirrorWeaveTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MirrorWeaveTile.java @@ -5,7 +5,6 @@ import com.hollingsworth.arsnouveau.api.spell.SpellStats; import com.hollingsworth.arsnouveau.common.block.MirrorWeave; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDampen; -import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderGetter; @@ -39,10 +38,6 @@ public MirrorWeaveTile(BlockPos pos, BlockState state) { this(BlockRegistry.MIRROR_WEAVE_TILE.get(), pos, state); } - public MirrorWeaveTile(RegistryWrapper type, BlockPos pos, BlockState state) { - this(type.get(), pos, state); - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar data) {} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java index e1a3d0975c..0f510ec143 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java @@ -16,9 +16,9 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; @@ -28,20 +28,17 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeInput; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.items.IItemHandler; - -import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -49,7 +46,7 @@ import java.util.List; -public class ScribesTile extends ModdedTile implements GeoBlockEntity, ITickable, Container, ITooltipProvider, IAnimationListener, IWandable { +public class ScribesTile extends ModdedTile implements GeoBlockEntity, ITickable, Container, ITooltipProvider, IAnimationListener, IWandable, RecipeInput { private ItemStack stack = ItemStack.EMPTY; boolean synced; public List consumedStacks = new ArrayList<>(); @@ -124,26 +121,23 @@ public void tick() { public void takeNearby() { for (BlockPos bPos : BlockPos.betweenClosed(worldPosition.north(6).east(6).below(2), worldPosition.south(6).west(6).above(2))) { - if (level.getBlockEntity(bPos) != null && level.getBlockEntity(bPos).getCapability(ITEM_HANDLER, null).isPresent()) { - IItemHandler handler = level.getBlockEntity(bPos).getCapability(ITEM_HANDLER, null).orElse(null); - if (handler != null) { - for (int i = 0; i < handler.getSlots(); i++) { - ItemStack stack = handler.getStackInSlot(i); - if (canConsumeItemstack(stack)) { - ItemStack stack1 = handler.extractItem(i, 1, false); - stack1.copy().setCount(1); - consumedStacks.add(stack1); - EntityFlyingItem flyingItem = new EntityFlyingItem(level, bPos, getBlockPos()); - flyingItem.setStack(stack1); - level.addFreshEntity(flyingItem); - updateBlock(); - return; - } + IItemHandler handler = level.getCapability(Capabilities.ItemHandler.BLOCK, bPos, null); + if (handler != null) { + for (int i = 0; i < handler.getSlots(); i++) { + ItemStack stack = handler.getStackInSlot(i); + if (canConsumeItemstack(stack)) { + ItemStack stack1 = handler.extractItem(i, 1, false); + stack1.copy().setCount(1); + consumedStacks.add(stack1); + EntityFlyingItem flyingItem = new EntityFlyingItem(level, bPos, getBlockPos()); + flyingItem.setStack(stack1); + level.addFreshEntity(flyingItem); + updateBlock(); + return; } } } } - } public boolean consumeStack(ItemStack stack) { @@ -269,7 +263,7 @@ public void onWanded(Player playerEntity) { @Override protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.loadAdditional(compound, pRegistries); - stack = ItemStack.of((CompoundTag) compound.get("itemStack")); + stack = ItemStack.parseOptional(pRegistries, (CompoundTag) compound.get("itemStack")); if (compound.contains("recipe")) { recipeID = ResourceLocation.tryParse(compound.getString("recipe")); } @@ -282,11 +276,11 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis } @Override - public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { - super.saveAdditional(tag, pRegistries); + public void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + super.saveAdditional(compound, pRegistries); if (stack != null) { - CompoundTag reagentTag = new CompoundTag(); - stack.save(reagentTag); + Tag reagentTag = stack.save(pRegistries); + compound.put("itemStack", reagentTag); } if (recipe != null) { @@ -319,11 +313,6 @@ public void registerControllers(AnimatableManager.ControllerRegistrar data) { data.add(controller); } - @Override - public AABB getRenderBoundingBox() { - return super.getRenderBoundingBox().inflate(2); - } - AnimatableInstanceCache factory = GeckoLibUtil.createInstanceCache(this); AnimationController controller; @@ -347,6 +336,11 @@ public ItemStack getItem(int pIndex) { return stack; } + @Override + public int size() { + return 0; + } + @Override public ItemStack removeItem(int pIndex, int pCount) { ItemStack removed = stack.copy().split(pCount); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/camera/ClientCameraEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/camera/ClientCameraEvents.java index 76e83de720..ad3a97cf0d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/camera/ClientCameraEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/camera/ClientCameraEvents.java @@ -2,13 +2,15 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.util.ClientCameraUtil; +import net.minecraft.resources.ResourceLocation; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.client.event.InputEvent; +import net.neoforged.neoforge.client.event.RenderGuiLayerEvent; import net.neoforged.neoforge.client.event.RenderHandEvent; +import net.neoforged.neoforge.client.gui.VanillaGuiLayers; @EventBusSubscriber(modid = ArsNouveau.MODID, value = Dist.CLIENT) @@ -28,13 +30,14 @@ public static void onClickInput(InputEvent.InteractionKeyMappingTriggered event) } } + public static final ResourceLocation[] overlays = new ResourceLocation[]{VanillaGuiLayers.JUMP_METER, VanillaGuiLayers.EXPERIENCE_BAR, VanillaGuiLayers.EFFECTS}; + @SubscribeEvent @OnlyIn(Dist.CLIENT) - public static void onGuiOpen(RenderGuiOverlayEvent.Pre event) { - VanillaGuiOverlay[] overlays = new VanillaGuiOverlay[]{VanillaGuiOverlay.JUMP_BAR,VanillaGuiOverlay.EXPERIENCE_BAR, VanillaGuiOverlay.POTION_ICONS}; + public static void onGuiOpen(RenderGuiLayerEvent.Pre event) { if(ClientCameraUtil.isPlayerMountedOnCamera()){ - for(VanillaGuiOverlay overlay : overlays){ - if(event.getOverlay() == overlay.type()){ + for(ResourceLocation overlay : overlays){ + if(event.getName().equals(overlay)){ event.setCanceled(true); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/command/AddTomeCommand.java b/src/main/java/com/hollingsworth/arsnouveau/common/command/AddTomeCommand.java index 319b8660d2..6beec83ace 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/command/AddTomeCommand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/command/AddTomeCommand.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.command; import com.hollingsworth.arsnouveau.api.registry.CasterTomeRegistry; -import com.hollingsworth.arsnouveau.common.tomes.CasterTomeData; +import com.hollingsworth.arsnouveau.common.crafting.recipes.CasterTomeData; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.suggestion.SuggestionProvider; import net.minecraft.commands.CommandSourceStack; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java index 51c2886eb1..ee2993fa1e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java @@ -1,29 +1,25 @@ package com.hollingsworth.arsnouveau.common.compat; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; -import net.minecraft.client.Minecraft; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; -import vazkii.patchouli.api.PatchouliAPI; -import vazkii.patchouli.client.book.gui.GuiBookEntry; - +//TODO: reenable patchouli public class PatchouliHandler { public static void openBookGUI(ServerPlayer player) { - PatchouliAPI.get().openBookGUI(player, ArsNouveau.prefix( "worn_notebook")); +// PatchouliAPI.get().openBookGUI(player, ArsNouveau.prefix( "worn_notebook")); } public static void openBookClient(){ - PatchouliAPI.get().openBookGUI(ForgeRegistries.ITEMS.getKey(ItemsRegistry.WORN_NOTEBOOK.asItem())); +// PatchouliAPI.get().openBookGUI(ForgeRegistries.ITEMS.getKey(ItemsRegistry.WORN_NOTEBOOK.asItem())); } public static boolean isPatchouliWorld() { if(!ArsNouveau.patchouliLoaded){ return false; } - return Minecraft.getInstance().screen instanceof GuiBookEntry; + return false; +// return Minecraft.getInstance().screen instanceof GuiBookEntry; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BookUpgradeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BookUpgradeRecipe.java index 59ddfc8449..5b611b133c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BookUpgradeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BookUpgradeRecipe.java @@ -1,33 +1,24 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; -import com.google.gson.JsonObject; import com.hollingsworth.arsnouveau.common.items.SpellBook; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import net.minecraft.core.HolderLookup; import net.minecraft.core.NonNullList; -import net.minecraft.core.RegistryAccess; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; -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.Ingredient; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.ShapelessRecipe; -import net.neoforged.neoforge.common.crafting.CraftingHelper; +import net.minecraft.world.item.crafting.*; public class BookUpgradeRecipe extends ShapelessRecipe { - private BookUpgradeRecipe(final ResourceLocation id, final String group, final ItemStack recipeOutput, final NonNullList ingredients) { - super(id, group, CraftingBookCategory.MISC, recipeOutput, ingredients); + public BookUpgradeRecipe(final String group, CraftingBookCategory category, final ItemStack recipeOutput, final NonNullList ingredients) { + super(group, CraftingBookCategory.MISC, recipeOutput, ingredients); } @Override - public ItemStack assemble(final CraftingContainer inv, RegistryAccess p_266797_) { + public ItemStack assemble(final CraftingInput inv, HolderLookup.Provider p_266797_) { final ItemStack output = super.assemble(inv, p_266797_); // Get the default output if (!output.isEmpty()) { - for (int i = 0; i < inv.getContainerSize(); i++) { // For each slot in the crafting inventory, + for (int i = 0; i < inv.size(); i++) { // For each slot in the crafting inventory, final ItemStack ingredient = inv.getItem(i); // Get the ingredient in the slot if (!ingredient.isEmpty() && ingredient.getItem() instanceof SpellBook) { output.setTag(ingredient.getTag()); @@ -42,43 +33,4 @@ public ItemStack assemble(final CraftingContainer inv, RegistryAccess p_266797_) public RecipeSerializer getSerializer() { return RecipeRegistry.BOOK_UPGRADE_RECIPE.get(); } - - public static class Serializer implements RecipeSerializer { - @Override - public BookUpgradeRecipe fromJson(final ResourceLocation recipeID, final JsonObject json) { - final String group = GsonHelper.getAsString(json, "group", ""); - final NonNullList ingredients = RecipeUtil.parseShapeless(json); - final ItemStack result = CraftingHelper.getItemStack(GsonHelper.getAsJsonObject(json, "result"), true); - - return new BookUpgradeRecipe(recipeID, group, result, ingredients); - } - - @Override - public BookUpgradeRecipe fromNetwork(final ResourceLocation recipeID, final FriendlyByteBuf buffer) { - final String group = buffer.readUtf(Short.MAX_VALUE); - final int numIngredients = buffer.readVarInt(); - final NonNullList ingredients = NonNullList.withSize(numIngredients, Ingredient.EMPTY); - - for (int j = 0; j < ingredients.size(); ++j) { - ingredients.set(j, Ingredient.fromNetwork(buffer)); - } - - final ItemStack result = buffer.readItem(); - - return new BookUpgradeRecipe(recipeID, group, result, ingredients); - } - - @Override - public void toNetwork(final FriendlyByteBuf buffer, final BookUpgradeRecipe recipe) { - buffer.writeUtf(recipe.getGroup()); - buffer.writeVarInt(recipe.getIngredients().size()); - - for (final Ingredient ingredient : recipe.getIngredients()) { - ingredient.toNetwork(buffer); - } - - buffer.writeItem(recipe.getResultItem(null)); - } - } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BuddingConversionRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BuddingConversionRecipe.java new file mode 100644 index 0000000000..494b92ae08 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BuddingConversionRecipe.java @@ -0,0 +1,59 @@ +package com.hollingsworth.arsnouveau.common.crafting.recipes; + +import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +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.StreamCodec; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SingleRecipeInput; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +public record BuddingConversionRecipe(ResourceLocation id, Block input, Block result) implements SpecialSingleInputRecipe { + + + public boolean matches(BlockState block) { + return block.is(input); + } + + @Override + public boolean matches(SingleRecipeInput p_346065_, Level p_345375_) { + return false; + } + + @Override + public RecipeSerializer getSerializer() { + return RecipeRegistry.BUDDING_CONVERSION_SERIALIZER.get(); + } + + @Override + public RecipeType getType() { + return RecipeRegistry.BUDDING_CONVERSION_TYPE.get(); + } + + + public static class Serializer implements RecipeSerializer { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + ResourceLocation.CODEC.fieldOf("id").forGetter(BuddingConversionRecipe::id), + BuiltInRegistries.BLOCK.byNameCodec().fieldOf("input").forGetter(BuddingConversionRecipe::input), + BuiltInRegistries.BLOCK.byNameCodec().fieldOf("result").forGetter(BuddingConversionRecipe::result) + ).apply(instance, BuddingConversionRecipe::new)); + + public static final StreamCodec STREAM = CheatSerializer.create(CODEC); + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public StreamCodec streamCodec() { + return STREAM; + } + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/tomes/CasterTomeData.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java similarity index 89% rename from src/main/java/com/hollingsworth/arsnouveau/common/tomes/CasterTomeData.java rename to src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java index a1300af7e9..da5bc62796 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/tomes/CasterTomeData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java @@ -1,4 +1,4 @@ -package com.hollingsworth.arsnouveau.common.tomes; +package com.hollingsworth.arsnouveau.common.crafting.recipes; import com.google.gson.JsonArray; import com.google.gson.JsonElement; @@ -16,30 +16,31 @@ import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import net.minecraft.ChatFormatting; -import net.minecraft.core.RegistryAccess; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.GsonHelper; -import net.minecraft.world.Container; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SingleRecipeInput; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.NotNull; - import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; -public class CasterTomeData implements Recipe { +public class CasterTomeData implements Recipe { ResourceLocation id; String name; @@ -68,18 +69,18 @@ public static ItemStack makeTome(Item tome, String name, Spell spell, String fla ItemStack stack = tome.getDefaultInstance(); ISpellCaster spellCaster = CasterUtil.getCaster(stack); spellCaster.setSpell(spell); - stack.setHoverName(Component.literal(name).setStyle(Style.EMPTY.withColor(ChatFormatting.DARK_PURPLE).withItalic(true))); + stack.set(DataComponents.CUSTOM_NAME, Component.literal(name).setStyle(Style.EMPTY.withColor(ChatFormatting.DARK_PURPLE).withItalic(true))); spellCaster.setFlavorText(flavorText); return stack; } @Override - public boolean matches(Container pContainer, Level pLevel) { + public boolean matches(SingleRecipeInput p_346065_, Level p_345375_) { return false; } @Override - public ItemStack assemble(Container p_44001_, RegistryAccess p_267165_) { + public ItemStack assemble(SingleRecipeInput p_345149_, HolderLookup.Provider p_346030_) { return ItemStack.EMPTY; } @@ -88,10 +89,12 @@ public boolean canCraftInDimensions(int pWidth, int pHeight) { return false; } + @Override - public ItemStack getResultItem(RegistryAccess p_267052_) { - Item tomeType = ForgeRegistries.ITEMS.getValue(this.type); - if (tomeType == null) tomeType = ItemsRegistry.CASTER_TOME.asItem(); + public ItemStack getResultItem(HolderLookup.Provider p_267052_) { + Item tomeType = BuiltInRegistries.ITEM.get(this.type); + if (tomeType == Items.AIR) + tomeType = ItemsRegistry.CASTER_TOME.asItem(); Spell spell = new Spell(); spell.name = this.name; if (this.particleColor != null) @@ -105,12 +108,6 @@ public ItemStack getResultItem(RegistryAccess p_267052_) { return makeTome(tomeType, name, spell, flavorText); } - @NotNull - @Override - public ResourceLocation getId() { - return id; - } - @Override public RecipeSerializer getSerializer() { return RecipeRegistry.CASTER_TOME_SERIALIZER.get(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CheatSerializer.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CheatSerializer.java new file mode 100644 index 0000000000..9615bd74d1 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CheatSerializer.java @@ -0,0 +1,26 @@ +package com.hollingsworth.arsnouveau.common.crafting.recipes; + +import com.mojang.serialization.MapCodec; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; + +/** + * Lazy serialization that takes any codec and creates a stream codec for it. + * Not performant, but find for recipe types that are not used often. + */ +public class CheatSerializer { + + public static StreamCodec create(MapCodec codec){ + return StreamCodec.of( + (buf, val) -> CheatSerializer.toNetwork(codec, buf, val), (buf) -> CheatSerializer.fromNetwork(codec, buf) + ); + } + + public static T fromNetwork(MapCodec codec, RegistryFriendlyByteBuf friendlyByteBuf) { + return friendlyByteBuf.readJsonWithCodec(codec.codec()); + } + + public static void toNetwork(MapCodec codec, RegistryFriendlyByteBuf friendlyByteBuf, T obj) { + friendlyByteBuf.writeJsonWithCodec(codec.codec(), obj); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java index 617c042c8e..645a8f2cb4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java @@ -1,60 +1,26 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.util.RandomSource; -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; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SingleRecipeInput; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; -import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; - -public class CrushRecipe implements Recipe { - - public final Ingredient input; - public final List outputs; - public final ResourceLocation id; - private boolean skipBlockPlace; - - public CrushRecipe(ResourceLocation id, Ingredient input, List outputs, boolean skipBlockPlace) { - this.input = input; - this.outputs = outputs; - this.id = id; - this.skipBlockPlace = skipBlockPlace; - } - - @Deprecated - public CrushRecipe(ResourceLocation id, Ingredient input, List outputs) { - this(id, input, outputs, false); - } - - public CrushRecipe(String id, Ingredient input, List outputs) { - this(ArsNouveau.prefix( "crush_" + id), input, outputs, false); - } +public record CrushRecipe(Ingredient input, List outputs, boolean skipBlockPlace) implements SpecialSingleInputRecipe { - public CrushRecipe(String id, Ingredient input, List outputs, boolean skipBlockPlace) { - this(ArsNouveau.prefix( "crush_" + id), input, outputs, skipBlockPlace); - } - - public CrushRecipe(String id, Ingredient input) { - this(id, input, new ArrayList<>()); + public CrushRecipe(Ingredient input, List outputs) { + this(input, outputs, false); } public List getRolledOutputs(RandomSource random) { @@ -86,43 +52,13 @@ public CrushRecipe withItems(ItemStack output) { return this; } - public CrushRecipe skipBlockPlace() { - this.skipBlockPlace = true; - return this; - } - - public Boolean shouldSkipBlockPlace() { + public boolean shouldSkipBlockPlace() { return this.skipBlockPlace; } @Override - public boolean matches(Container inventory, Level world) { - return this.input.test(inventory.getItem(0)); - } - - public boolean matches(ItemStack i, Level world) { - return this.input.test(i); - } - - @Override - public ItemStack assemble(Container p_44001_, RegistryAccess p_267165_) { - return ItemStack.EMPTY; - } - - @Override - public boolean canCraftInDimensions(int p_194133_1_, int p_194133_2_) { - return true; - } - - @Override - public ItemStack getResultItem(RegistryAccess p_267052_) { - return ItemStack.EMPTY; - } - - @NotNull - @Override - public ResourceLocation getId() { - return id; + public boolean matches(SingleRecipeInput p_346065_, Level p_345375_) { + return this.input.test(p_346065_.getItem(0)); } @Override @@ -135,91 +71,51 @@ public RecipeType getType() { return RecipeRegistry.CRUSH_TYPE.get(); } - public JsonElement asRecipe() { - JsonObject jsonobject = new JsonObject(); - jsonobject.addProperty("type", "ars_nouveau:crush"); - jsonobject.add("input", input.toJson()); - JsonArray array = new JsonArray(); - for (CrushOutput output : outputs) { - JsonObject element = new JsonObject(); - element.addProperty("item", getRegistryName(output.stack.getItem()).toString()); - element.addProperty("chance", output.chance); - element.addProperty("count", output.stack.getCount()); - element.addProperty("maxRange", output.maxRange); - array.add(element); - } - jsonobject.add("output", array); - jsonobject.addProperty("skip_block_place", skipBlockPlace); - return jsonobject; - } - - public static class CrushOutput { - public ItemStack stack; - public float chance; - public int maxRange; // Can drop the stack multiple times if this is greater than 1 + public record CrushOutput(ItemStack stack, float chance, int maxRange) { public CrushOutput(ItemStack stack, float chance) { this(stack, chance, 1); } - public CrushOutput(ItemStack stack, float chance, int maxRange) { - this.stack = stack; - this.chance = chance; - this.maxRange = maxRange; - } + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + ItemStack.CODEC.fieldOf("stack").forGetter(CrushOutput::stack), + Codec.FLOAT.fieldOf("chance").forGetter(CrushOutput::chance), + Codec.INT.fieldOf("maxRange").forGetter(CrushOutput::maxRange) + ).apply(instance, CrushOutput::new)); } public static class Serializer implements RecipeSerializer { - @Override - public CrushRecipe fromJson(ResourceLocation recipeId, JsonObject json) { - Ingredient input; - if (GsonHelper.isArrayNode(json, "input")) { - input = Ingredient.fromJson(GsonHelper.getAsJsonArray(json, "input")); - } else { - input = Ingredient.fromJson(GsonHelper.getAsJsonObject(json, "input")); - } - JsonArray outputs = GsonHelper.getAsJsonArray(json, "output"); - List parsedOutputs = new ArrayList<>(); - - for (JsonElement e : outputs) { - JsonObject obj = e.getAsJsonObject(); - float chance = GsonHelper.getAsFloat(obj, "chance"); - String itemId = GsonHelper.getAsString(obj, "item"); - int count = obj.has("count") ? GsonHelper.getAsInt(obj, "count") : 1; - ItemStack output = new ItemStack(ForgeRegistries.ITEMS.getValue(ResourceLocation.tryParse(itemId)), count); - int maxRange = obj.has("maxRange") ? GsonHelper.getAsInt(obj, "maxRange") : 1; - parsedOutputs.add(new CrushOutput(output, chance, maxRange)); - } - boolean skipBlockPlace = json.has("skip_block_place") && GsonHelper.getAsBoolean(json, "skip_block_place"); - - return new CrushRecipe(recipeId, input, parsedOutputs, skipBlockPlace); - } + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Ingredient.CODEC.fieldOf("input").forGetter(CrushRecipe::input), + CrushOutput.CODEC.listOf().fieldOf("output").forGetter(CrushRecipe::outputs), + Codec.BOOL.optionalFieldOf("skip_block_place", false).forGetter(CrushRecipe::shouldSkipBlockPlace) + ).apply(instance, CrushRecipe::new)); + public static final StreamCodec STREAM_CODEC = StreamCodec.of( + CrushRecipe.Serializer::toNetwork, CrushRecipe.Serializer::fromNetwork + ); - @Override - public void toNetwork(FriendlyByteBuf buf, CrushRecipe recipe) { + public static void toNetwork(RegistryFriendlyByteBuf buf, CrushRecipe recipe) { buf.writeInt(recipe.outputs.size()); - recipe.input.toNetwork(buf); + Ingredient.CONTENTS_STREAM_CODEC.encode(buf, recipe.input); for (CrushOutput i : recipe.outputs) { buf.writeFloat(i.chance); - buf.writeItemStack(i.stack, false); + ItemStack.STREAM_CODEC.encode(buf, i.stack); buf.writeInt(i.maxRange); } buf.writeBoolean(recipe.skipBlockPlace); } - @Nullable - @Override - public CrushRecipe fromNetwork(ResourceLocation recipeId, FriendlyByteBuf buffer) { + public static CrushRecipe fromNetwork(RegistryFriendlyByteBuf buffer) { int length = buffer.readInt(); - Ingredient input = Ingredient.fromNetwork(buffer); + Ingredient input = Ingredient.CONTENTS_STREAM_CODEC.decode(buffer); List stacks = new ArrayList<>(); for (int i = 0; i < length; i++) { try { float chance = buffer.readFloat(); - ItemStack outStack = buffer.readItem(); + ItemStack outStack = ItemStack.STREAM_CODEC.decode(buffer); int maxRange = buffer.readInt(); stacks.add(new CrushOutput(outStack, chance, maxRange)); } catch (Exception e) { @@ -228,7 +124,17 @@ public CrushRecipe fromNetwork(ResourceLocation recipeId, FriendlyByteBuf buffer } } boolean skipBlockPlace = buffer.readBoolean(); - return new CrushRecipe(recipeId, input, stacks, skipBlockPlace); + return new CrushRecipe(input, stacks, skipBlockPlace); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public StreamCodec streamCodec() { + return STREAM_CODEC; } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/DispelEntityRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DispelEntityRecipe.java similarity index 59% rename from src/main/java/com/hollingsworth/arsnouveau/api/recipe/DispelEntityRecipe.java rename to src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DispelEntityRecipe.java index 84860e3719..8b36b437e2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/DispelEntityRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DispelEntityRecipe.java @@ -1,27 +1,22 @@ -package com.hollingsworth.arsnouveau.api.recipe; +package com.hollingsworth.arsnouveau.common.crafting.recipes; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -import com.mojang.serialization.Codec; -import com.mojang.serialization.JsonOps; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.core.HolderLookup; -import net.minecraft.core.RegistryAccess; import net.minecraft.core.registries.BuiltInRegistries; 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.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SingleRecipeInput; import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.LootParams; @@ -30,21 +25,11 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.neoforged.neoforge.common.loot.IGlobalLootModifier; -import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.List; -public record DispelEntityRecipe(ResourceLocation id, EntityType entity, ResourceLocation lootTable, LootItemCondition[] conditions) implements Recipe { - @Override - public boolean matches(Container container, Level level) { - return false; - } - - @Override - public ItemStack assemble(Container p_345149_, HolderLookup.Provider p_346030_) { - return null; - } +public record DispelEntityRecipe(EntityType entity, ResourceLocation lootTable, LootItemCondition[] conditions) implements SpecialSingleInputRecipe { public boolean matches(LivingEntity killer, Entity victim) { if (!victim.getType().equals(this.entity)) return false; @@ -83,30 +68,10 @@ public List result(LivingEntity killer, Entity victim) { } @Override - public ItemStack assemble(Container container, RegistryAccess registryAccess) { - return ItemStack.EMPTY; - } - - @Override - public boolean canCraftInDimensions(int i, int i1) { + public boolean matches(SingleRecipeInput p_346065_, Level p_345375_) { return false; } - @Override - public ItemStack getResultItem(HolderLookup.Provider pRegistries) { - return null; - } - - @Override - public ItemStack getResultItem(RegistryAccess registryAccess) { - return ItemStack.EMPTY; - } - - @Override - public ResourceLocation getId() { - return id; - } - @Override public RecipeSerializer getSerializer() { return RecipeRegistry.DISPEL_ENTITY_SERIALIZER.get(); @@ -117,40 +82,23 @@ public RecipeType getType() { return RecipeRegistry.DISPEL_ENTITY_TYPE.get(); } - @Override - public boolean isSpecial() { - return true; - } - - public JsonElement asRecipe() { - JsonElement recipe = Serializer.CODEC.encodeStart(JsonOps.INSTANCE, this).result().orElse(null); - if (recipe == null) return null; - JsonObject obj = recipe.getAsJsonObject(); - obj.addProperty("type", getType().toString()); - return obj; - } - public static class Serializer implements RecipeSerializer { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - ResourceLocation.CODEC.fieldOf("id").forGetter(DispelEntityRecipe::id), + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( BuiltInRegistries.ENTITY_TYPE.byNameCodec().fieldOf("entity").forGetter(DispelEntityRecipe::entity), ResourceLocation.CODEC.fieldOf("loot_table").forGetter(DispelEntityRecipe::lootTable), IGlobalLootModifier.LOOT_CONDITIONS_CODEC.optionalFieldOf("loot_conditions", new LootItemCondition[]{}).forGetter(DispelEntityRecipe::conditions) ).apply(instance, DispelEntityRecipe::new)); - @Override - public DispelEntityRecipe fromJson(ResourceLocation resourceLocation, JsonObject jsonObject) { - return CODEC.parse(JsonOps.INSTANCE, jsonObject).result().orElse(null); - } + public static final StreamCodec STREAM = CheatSerializer.create(CODEC); @Override - public @Nullable DispelEntityRecipe fromNetwork(ResourceLocation resourceLocation, FriendlyByteBuf friendlyByteBuf) { - return friendlyByteBuf.readJsonWithCodec(CODEC); + public MapCodec codec() { + return CODEC; } @Override - public void toNetwork(FriendlyByteBuf friendlyByteBuf, DispelEntityRecipe buddingConversionRecipe) { - friendlyByteBuf.writeJsonWithCodec(CODEC, buddingConversionRecipe); + public StreamCodec streamCodec() { + return STREAM; } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java index 96fa89fbc3..18156f96cb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java @@ -1,49 +1,34 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import net.minecraft.core.HolderLookup; import net.minecraft.core.NonNullList; -import net.minecraft.core.RegistryAccess; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.CraftingBookCategory; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.ShapelessRecipe; -import net.neoforged.neoforge.common.Tags; -import net.neoforged.neoforge.common.crafting.CraftingHelper; - -import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; +import net.minecraft.world.item.crafting.*; public class DyeRecipe extends ShapelessRecipe { - public DyeRecipe(ResourceLocation idIn, String groupIn, ItemStack recipeOutputIn, NonNullList recipeItemsIn) { - super(idIn, groupIn, CraftingBookCategory.MISC, recipeOutputIn, recipeItemsIn); + public DyeRecipe(String groupIn, CraftingBookCategory category, ItemStack recipeOutputIn, NonNullList recipeItemsIn) { + super(groupIn, CraftingBookCategory.MISC, recipeOutputIn, recipeItemsIn); } @Override - public ItemStack assemble(CraftingContainer inv, RegistryAccess p_266797_) { + public ItemStack assemble(CraftingInput inv, HolderLookup.Provider p_266797_) { ItemStack output = super.assemble(inv, p_266797_); if (!output.isEmpty()) { - for (int i = 0; i < inv.getContainerSize(); i++) { // For each slot in the crafting inventory, + for (int i = 0; i < inv.size(); i++) { // For each slot in the crafting inventory, final ItemStack ingredient = inv.getItem(i); // Get the ingredient in the slot if (!ingredient.isEmpty() && ingredient.getItem() instanceof IDyeable) { output.setTag(ingredient.getOrCreateTag().copy()); } } - for (int i = 0; i < inv.getContainerSize(); i++) { // For each slot in the crafting inventory, + for (int i = 0; i < inv.size(); i++) { // For each slot in the crafting inventory, final ItemStack ingredient = inv.getItem(i); // Get the ingredient in the slot DyeColor color = DyeColor.getColor(ingredient); if (!ingredient.isEmpty() && color != null) { - if(output.getItem() instanceof IDyeable dyeable){ + if (output.getItem() instanceof IDyeable dyeable) { dyeable.onDye(output, color); } } @@ -56,62 +41,4 @@ public ItemStack assemble(CraftingContainer inv, RegistryAccess p_266797_) { public RecipeSerializer getSerializer() { return RecipeRegistry.DYE_RECIPE.get(); } - - public static JsonElement asRecipe(Item item) { - JsonObject jsonobject = new JsonObject(); - jsonobject.addProperty("type", "ars_nouveau:" + RecipeRegistry.DYE_RECIPE_ID); - JsonArray ingredients = new JsonArray(); - JsonObject dyeObject = new JsonObject(); - dyeObject.addProperty("tag", Tags.Items.DYES.location().toString()); - ingredients.add(dyeObject); - - JsonObject input = new JsonObject(); - input.addProperty("item", getRegistryName(item).toString()); - ingredients.add(input); - - jsonobject.add("ingredients", ingredients); - JsonObject itemObject = new JsonObject(); - itemObject.addProperty("item", getRegistryName(item).toString()); - jsonobject.add("result", itemObject); - return jsonobject; - } - - - public static class Serializer implements RecipeSerializer { - @Override - public DyeRecipe fromJson(final ResourceLocation recipeID, final JsonObject json) { - final String group = GsonHelper.getAsString(json, "group", ""); - final NonNullList ingredients = RecipeUtil.parseShapeless(json); - final ItemStack result = CraftingHelper.getItemStack(GsonHelper.getAsJsonObject(json, "result"), true); - - return new DyeRecipe(recipeID, group, result, ingredients); - } - - @Override - public DyeRecipe fromNetwork(final ResourceLocation recipeID, final FriendlyByteBuf buffer) { - final String group = buffer.readUtf(Short.MAX_VALUE); - final int numIngredients = buffer.readVarInt(); - final NonNullList ingredients = NonNullList.withSize(numIngredients, Ingredient.EMPTY); - - for (int j = 0; j < ingredients.size(); ++j) { - ingredients.set(j, Ingredient.fromNetwork(buffer)); - } - - final ItemStack result = buffer.readItem(); - - return new DyeRecipe(recipeID, group, result, ingredients); - } - - @Override - public void toNetwork(final FriendlyByteBuf buffer, final DyeRecipe recipe) { - buffer.writeUtf(recipe.getGroup()); - buffer.writeVarInt(recipe.getIngredients().size()); - - for (final Ingredient ingredient : recipe.getIngredients()) { - ingredient.toNetwork(buffer); - } - - buffer.writeItem(recipe.getResultItem(RegistryAccess.EMPTY)); - } - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ExtendableShapelessSerializer.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ExtendableShapelessSerializer.java new file mode 100644 index 0000000000..4e32f2bfe6 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ExtendableShapelessSerializer.java @@ -0,0 +1,96 @@ +package com.hollingsworth.arsnouveau.common.crafting.recipes; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.NonNullList; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.*; + +/** + * Copied from {@link net.minecraft.world.item.crafting.ShapelessRecipe.Serializer} + * and adapted to take any conforming {@link ShapelessRecipe} implementation. + */ +public class ExtendableShapelessSerializer { + + public static RecipeSerializer create(ShapelessConstructor creator){ + return new RecipeSerializer() { + public final MapCodec CODEC = ExtendableShapelessSerializer.createMap(creator); + public final StreamCodec STREAM_CODEC = ExtendableShapelessSerializer.createStream(creator); + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public StreamCodec streamCodec() { + return STREAM_CODEC; + } + }; + } + + public static MapCodec createMap(ShapelessConstructor create){ + return RecordCodecBuilder.mapCodec( + p_340779_ -> p_340779_.group( + Codec.STRING.optionalFieldOf("group", "").forGetter(ShapelessRecipe::getGroup), + CraftingBookCategory.CODEC.fieldOf("category").orElse(CraftingBookCategory.MISC).forGetter(ShapelessRecipe::category), + ItemStack.STRICT_CODEC.fieldOf("result").forGetter(p_301142_ -> p_301142_.getResultItem(null)), + Ingredient.CODEC_NONEMPTY + .listOf() + .fieldOf("ingredients") + .flatXmap( + p_301021_ -> { + Ingredient[] aingredient = p_301021_.toArray(Ingredient[]::new); // Neo skip the empty check and immediately create the array. + if (aingredient.length == 0) { + return DataResult.error(() -> "No ingredients for shapeless recipe"); + } else { + return aingredient.length > ShapedRecipePattern.getMaxHeight() * ShapedRecipePattern.getMaxWidth() + ? DataResult.error(() -> "Too many ingredients for shapeless recipe. The maximum is: %s".formatted(ShapedRecipePattern.getMaxHeight() * ShapedRecipePattern.getMaxWidth())) + : DataResult.success(NonNullList.of(Ingredient.EMPTY, aingredient)); + } + }, + DataResult::success + ) + .forGetter(ShapelessRecipe::getIngredients) + ) + .apply(p_340779_, create::create) + ); + } + + public static StreamCodec createStream(ShapelessConstructor create){ + return StreamCodec.of( + ExtendableShapelessSerializer::toNetwork, (a) -> ExtendableShapelessSerializer.fromNetwork(a, create) + ); + } + + private static T fromNetwork(RegistryFriendlyByteBuf p_319905_, ShapelessConstructor create) { + String s = p_319905_.readUtf(); + CraftingBookCategory craftingbookcategory = p_319905_.readEnum(CraftingBookCategory.class); + int i = p_319905_.readVarInt(); + NonNullList nonnulllist = NonNullList.withSize(i, Ingredient.EMPTY); + nonnulllist.replaceAll(p_319735_ -> Ingredient.CONTENTS_STREAM_CODEC.decode(p_319905_)); + ItemStack itemstack = ItemStack.STREAM_CODEC.decode(p_319905_); + return create.create(s, craftingbookcategory, itemstack, nonnulllist); + } + + private static void toNetwork(RegistryFriendlyByteBuf p_320371_, ShapelessRecipe p_320323_) { + p_320371_.writeUtf(p_320323_.getGroup()); + p_320371_.writeEnum(p_320323_.category()); + p_320371_.writeVarInt(p_320323_.getIngredients().size()); + + for (Ingredient ingredient : p_320323_.getIngredients()) { + Ingredient.CONTENTS_STREAM_CODEC.encode(p_320371_, ingredient); + } + + ItemStack.STREAM_CODEC.encode(p_320371_, p_320323_.getResultItem(null)); + } + + @FunctionalInterface + public interface ShapelessConstructor{ + T create(String group, CraftingBookCategory category, ItemStack result, NonNullList ingredients); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java index 49ecd24664..95819801f8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java @@ -1,17 +1,17 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import com.hollingsworth.arsnouveau.common.block.tile.ScribesTile; import com.hollingsworth.arsnouveau.common.items.Glyph; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.network.FriendlyByteBuf; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.HolderLookup; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; -import net.minecraft.util.GsonHelper; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -21,22 +21,22 @@ import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; -import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; -import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; - public class GlyphRecipe implements Recipe { - - public ItemStack output; - public List inputs; + public final ItemStack output; + public final List inputs; public ResourceLocation id; - public int exp; + public final int exp; public GlyphRecipe(ResourceLocation id, ItemStack output, List inputs, int exp) { + this(output, inputs, exp); this.id = id; + } + + public GlyphRecipe(ItemStack output, List inputs, int exp) { this.output = output; this.inputs = inputs; this.exp = exp; @@ -96,25 +96,33 @@ public boolean matches(ScribesTile pContainer, Level pLevel) { } @Override - public ItemStack assemble(ScribesTile p_44001_, RegistryAccess p_267165_) { + public ItemStack assemble(ScribesTile p_345149_, HolderLookup.Provider p_346030_) { return output.copy(); } + + public ItemStack getOutput() { + return output; + } + + public List getInputs() { + return inputs; + } + + public int getExp() { + return exp; + } + @Override public boolean canCraftInDimensions(int pWidth, int pHeight) { return true; } @Override - public ItemStack getResultItem(RegistryAccess p_267052_) { + public ItemStack getResultItem(HolderLookup.Provider pRegistries) { return output.copy(); } - @Override - public ResourceLocation getId() { - return id; - } - @Override public RecipeSerializer getSerializer() { return RecipeRegistry.GLYPH_SERIALIZER.get(); @@ -125,72 +133,46 @@ public RecipeType getType() { return RecipeRegistry.GLYPH_TYPE.get(); } - public JsonElement asRecipe() { - JsonObject jsonobject = new JsonObject(); - jsonobject.addProperty("type", "ars_nouveau:" + RecipeRegistry.GLYPH_RECIPE_ID); - jsonobject.addProperty("count", this.output.getCount()); - JsonArray pedestalArr = new JsonArray(); - for (Ingredient i : this.inputs) { - JsonObject object = new JsonObject(); - object.add("item", i.toJson()); - pedestalArr.add(object); - } - jsonobject.add("inputItems", pedestalArr); - jsonobject.addProperty("exp", exp); - jsonobject.addProperty("output", getRegistryName(output.getItem()).toString()); - return jsonobject; - } - public static class Serializer implements RecipeSerializer { - @Override - public GlyphRecipe fromJson(ResourceLocation recipeId, JsonObject json) { - Item output = GsonHelper.getAsItem(json, "output"); - int count = GsonHelper.getAsInt(json, "count"); - ItemStack outputStack = new ItemStack(output, count); - int levels = GsonHelper.getAsInt(json, "exp"); - JsonArray inputItems = GsonHelper.getAsJsonArray(json, "inputItems"); - List stacks = new ArrayList<>(); - - for (JsonElement e : inputItems) { - JsonObject obj = e.getAsJsonObject(); - Ingredient input = null; - if (GsonHelper.isArrayNode(obj, "item")) { - input = Ingredient.fromJson(GsonHelper.getAsJsonArray(obj, "item")); - } else { - input = Ingredient.fromJson(GsonHelper.getAsJsonObject(obj, "item")); - } - stacks.add(input); - } - return new GlyphRecipe(recipeId, outputStack, stacks, levels); - } - - - @Override - public void toNetwork(FriendlyByteBuf buf, GlyphRecipe recipe) { - buf.writeInt(recipe.inputs.size()); + public static void toNetwork(RegistryFriendlyByteBuf buffer, GlyphRecipe recipe) { + buffer.writeInt(recipe.inputs.size()); for (Ingredient i : recipe.inputs) { - i.toNetwork(buf); + Ingredient.CONTENTS_STREAM_CODEC.encode(buffer, i); } - buf.writeItem(recipe.output); - buf.writeInt(recipe.exp); + ItemStack.STREAM_CODEC.encode(buffer, recipe.output); + buffer.writeInt(recipe.exp); } - @Nullable - @Override - public GlyphRecipe fromNetwork(ResourceLocation recipeId, FriendlyByteBuf buffer) { + public static GlyphRecipe fromNetwork(RegistryFriendlyByteBuf buffer) { int length = buffer.readInt(); List stacks = new ArrayList<>(); for (int i = 0; i < length; i++) { try { - stacks.add(Ingredient.fromNetwork(buffer)); + Ingredient.CONTENTS_STREAM_CODEC.decode(buffer); } catch (Exception e) { e.printStackTrace(); break; } } - return new GlyphRecipe(recipeId, buffer.readItem(), stacks, buffer.readInt()); + return new GlyphRecipe(ItemStack.STREAM_CODEC.decode(buffer), stacks, buffer.readInt()); + } + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + ItemStack.CODEC.fieldOf("output").forGetter(GlyphRecipe::getOutput), + Ingredient.CODEC.listOf().fieldOf("inputs").forGetter(GlyphRecipe::getIngredients), + Codec.INT.fieldOf("exp").forGetter(GlyphRecipe::getExp) + ).apply(instance, GlyphRecipe::new)); + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public StreamCodec streamCodec() { + return null; } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/IDyeable.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/IDyeable.java index 8844002171..ba02643387 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/IDyeable.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/IDyeable.java @@ -4,15 +4,9 @@ import net.minecraft.world.item.ItemStack; public interface IDyeable { + default void onDye(ItemStack stack, DyeColor dyeColor){ stack.getOrCreateTag().putInt("color", dyeColor.getId()); } - default int getDyeColor(ItemStack stack){ - if(!stack.hasTag()){ - return -1; - } - int color = stack.getTag().getInt("color"); - return color; - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java index 3089074770..a544600779 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java @@ -1,8 +1,5 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; import com.hollingsworth.arsnouveau.common.block.tile.ImbuementTile; @@ -12,13 +9,10 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; @@ -32,8 +26,6 @@ import java.util.List; import java.util.stream.Collectors; -import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; - public class ImbuementRecipe implements Recipe { @@ -122,11 +114,11 @@ public RecipeSerializer getSerializer() { @Override public RecipeType getType() { - return BuiltInRegistries.RECIPE_TYPE.get(ArsNouveau.prefix( RecipeRegistry.IMBUEMENT_RECIPE_ID)); + return BuiltInRegistries.RECIPE_TYPE.get(ArsNouveau.prefix(RecipeRegistry.IMBUEMENT_RECIPE_ID)); } public static class Serializer implements RecipeSerializer { - // Todo: restore count on output? + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( Ingredient.CODEC.fieldOf("input").forGetter(ImbuementRecipe::getInput), ItemStack.CODEC.fieldOf("output").forGetter(ImbuementRecipe::getOutput), @@ -134,7 +126,11 @@ public static class Serializer implements RecipeSerializer { Ingredient.CODEC.listOf().fieldOf("pedestalItems").forGetter(ImbuementRecipe::getPedestalItems) ).apply(instance, ImbuementRecipe::new)); - public void toNetwork(RegistryFriendlyByteBuf buf, ImbuementRecipe recipe) { + public static final StreamCodec STREAM_CODEC = StreamCodec.of( + ImbuementRecipe.Serializer::toNetwork, ImbuementRecipe.Serializer::fromNetwork + ); + + public static void toNetwork(RegistryFriendlyByteBuf buf, ImbuementRecipe recipe) { buf.writeInt(recipe.pedestalItems.size()); for (Ingredient i : recipe.pedestalItems) { Ingredient.CONTENTS_STREAM_CODEC.encode(buf, i); @@ -144,8 +140,7 @@ public void toNetwork(RegistryFriendlyByteBuf buf, ImbuementRecipe recipe) { buf.writeInt(recipe.source); } - @Nullable - public ImbuementRecipe fromNetwork(RegistryFriendlyByteBuf buffer) { + public static ImbuementRecipe fromNetwork(RegistryFriendlyByteBuf buffer) { int length = buffer.readInt(); List stacks = new ArrayList<>(); @@ -167,7 +162,7 @@ public MapCodec codec() { @Override public StreamCodec streamCodec() { - return null; + return STREAM_CODEC; } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java index 346307f5b6..3716af7256 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java @@ -1,37 +1,32 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; -import com.google.gson.JsonObject; import com.hollingsworth.arsnouveau.api.potion.PotionData; import com.hollingsworth.arsnouveau.common.items.PotionFlask; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.HolderLookup; import net.minecraft.core.NonNullList; -import net.minecraft.core.RegistryAccess; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; -import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.PotionItem; -import net.minecraft.world.item.crafting.CraftingBookCategory; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.ShapelessRecipe; -import net.neoforged.neoforge.common.crafting.CraftingHelper; +import net.minecraft.world.item.crafting.*; public class PotionFlaskRecipe extends ShapelessRecipe { - public PotionFlaskRecipe(ResourceLocation idIn, String groupIn, ItemStack recipeOutputIn, NonNullList recipeItemsIn) { - super(idIn, groupIn, CraftingBookCategory.MISC, recipeOutputIn, recipeItemsIn); + public PotionFlaskRecipe(String groupIn, CraftingBookCategory category, ItemStack recipeOutputIn, NonNullList recipeItemsIn) { + super(groupIn, CraftingBookCategory.MISC, recipeOutputIn, recipeItemsIn); } + @Override - public ItemStack assemble(final CraftingContainer inv, RegistryAccess p_266797_) { + public ItemStack assemble(final CraftingInput inv, HolderLookup.Provider p_266797_) { final ItemStack output = super.assemble(inv, p_266797_); // Get the default output if (output.isEmpty()) return ItemStack.EMPTY; ItemStack flaskPotionStack = ItemStack.EMPTY; ItemStack potionStack = ItemStack.EMPTY; - for (int i = 0; i < inv.getContainerSize(); i++) { + for (int i = 0; i < inv.size(); i++) { final ItemStack stack = inv.getItem(i); if (stack.getItem() instanceof PotionFlask flask) { flaskPotionStack = stack.copy(); @@ -59,8 +54,8 @@ public ItemStack assemble(final CraftingContainer inv, RegistryAccess p_266797_) } @Override - public NonNullList getRemainingItems(CraftingContainer inv) { - NonNullList nonnulllist = NonNullList.withSize(inv.getContainerSize(), ItemStack.EMPTY); + public NonNullList getRemainingItems(CraftingInput inv) { + NonNullList nonnulllist = NonNullList.withSize(inv.size(), ItemStack.EMPTY); for (int i = 0; i < nonnulllist.size(); ++i) { ItemStack item = inv.getItem(i); if (item.hasCraftingRemainingItem()) { @@ -76,36 +71,4 @@ public NonNullList getRemainingItems(CraftingContainer inv) { public RecipeSerializer getSerializer() { return RecipeRegistry.POTION_FLASK_RECIPE.get(); } - - public static class Serializer implements RecipeSerializer { - @Override - public PotionFlaskRecipe fromJson(final ResourceLocation recipeID, final JsonObject json) { - final String group = GsonHelper.getAsString(json, "group", ""); - final NonNullList ingredients = RecipeUtil.parseShapeless(json); - final ItemStack result = CraftingHelper.getItemStack(GsonHelper.getAsJsonObject(json, "result"), true); - return new PotionFlaskRecipe(recipeID, group, result, ingredients); - } - - @Override - public PotionFlaskRecipe fromNetwork(final ResourceLocation recipeID, final FriendlyByteBuf buffer) { - final String group = buffer.readUtf(Short.MAX_VALUE); - final int numIngredients = buffer.readVarInt(); - final NonNullList ingredients = NonNullList.withSize(numIngredients, Ingredient.EMPTY); - for (int j = 0; j < ingredients.size(); ++j) { - ingredients.set(j, Ingredient.fromNetwork(buffer)); - } - final ItemStack result = buffer.readItem(); - return new PotionFlaskRecipe(recipeID, group, result, ingredients); - } - - @Override - public void toNetwork(final FriendlyByteBuf buffer, final PotionFlaskRecipe recipe) { - buffer.writeUtf(recipe.getGroup()); - buffer.writeVarInt(recipe.getIngredients().size()); - for (final Ingredient ingredient : recipe.getIngredients()) { - ingredient.toNetwork(buffer); - } - buffer.writeItem(recipe.getResultItem(null)); - } - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/RecipeUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/RecipeUtil.java deleted file mode 100644 index 6009510608..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/RecipeUtil.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.hollingsworth.arsnouveau.common.crafting.recipes; - - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import net.minecraft.core.NonNullList; -import net.minecraft.util.GsonHelper; -import net.minecraft.world.item.crafting.Ingredient; -import net.neoforged.neoforge.common.crafting.CraftingHelper; - -/** - * https://github.com/Choonster-Minecraft-Mods/TestMod3/blob/1.14.4/src/main/java/choonster/testmod3/crafting/recipe/RecipeUtil.java - * - * @author Choonster - */ -public class RecipeUtil { - - - /** - * Parse the input of a shapeless recipe. - * - * @param json The recipe's JSON object - * @return A NonNullList containing the ingredients specified in the JSON object - */ - public static NonNullList parseShapeless(final JsonObject json) { - final NonNullList ingredients = NonNullList.create(); - for (final JsonElement element : GsonHelper.getAsJsonArray(json, "ingredients")) - ingredients.add(CraftingHelper.getIngredient(element, true)); - - if (ingredients.isEmpty()) - throw new JsonParseException("No ingredients for shapeless recipe"); - - return ingredients; - } - -} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ScryRitualRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ScryRitualRecipe.java new file mode 100644 index 0000000000..a4bae4cfe5 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ScryRitualRecipe.java @@ -0,0 +1,52 @@ +package com.hollingsworth.arsnouveau.common.crafting.recipes; + +import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SingleRecipeInput; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; + +public record ScryRitualRecipe(TagKey augment, TagKey highlight) implements SpecialSingleInputRecipe { + + @Override + public boolean matches(SingleRecipeInput input, Level p_345375_) { + return input.getItem(0).is(augment); + } + + @Override + public RecipeSerializer getSerializer() { + return RecipeRegistry.SCRY_RITUAL_SERIALIZER.get(); + } + + @Override + public RecipeType getType() { + return RecipeRegistry.SCRY_RITUAL_TYPE.get(); + } + + public static class Serializer implements RecipeSerializer { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + TagKey.codec(Registries.ITEM).fieldOf("augment").forGetter(ScryRitualRecipe::augment), + TagKey.codec(Registries.BLOCK).fieldOf("highlight").forGetter(ScryRitualRecipe::highlight) + ).apply(instance, ScryRitualRecipe::new)); + + public static final StreamCodec STREAM_CODEC = CheatSerializer.create(CODEC); + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public StreamCodec streamCodec() { + return STREAM_CODEC; + } + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpecialSingleInputRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpecialSingleInputRecipe.java new file mode 100644 index 0000000000..6a100eabda --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpecialSingleInputRecipe.java @@ -0,0 +1,34 @@ +package com.hollingsworth.arsnouveau.common.crafting.recipes; + +import net.minecraft.core.HolderLookup; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.SingleRecipeInput; +import net.minecraft.world.level.Level; + +public interface SpecialSingleInputRecipe extends Recipe { + + default boolean matches(ItemStack stack, Level level){ + return this.matches(new SingleRecipeInput(stack), level); + } + + @Override + default ItemStack assemble(SingleRecipeInput p_345149_, HolderLookup.Provider p_346030_) { + return ItemStack.EMPTY; + } + + @Override + default boolean canCraftInDimensions(int pWidth, int pHeight) { + return false; + } + + @Override + default ItemStack getResultItem(HolderLookup.Provider pRegistries) { + return ItemStack.EMPTY; + } + + @Override + default boolean isSpecial() { + return true; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SummonRitualRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SummonRitualRecipe.java new file mode 100644 index 0000000000..540262ad40 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SummonRitualRecipe.java @@ -0,0 +1,118 @@ +package com.hollingsworth.arsnouveau.common.crafting.recipes; + +import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; +import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.random.Weight; +import net.minecraft.util.random.WeightedEntry; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SingleRecipeInput; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class SummonRitualRecipe implements SpecialSingleInputRecipe { + + public final Ingredient catalyst; + public final MobSource mobSource; + public final int count; + public final List mobs; + + public SummonRitualRecipe(Ingredient catalyst, MobSource source, int count, List mobs) { + this.catalyst = catalyst; + this.mobSource = source; + this.count = count; + this.mobs = mobs; + } + + + public SummonRitualRecipe(Ingredient catalyst, String source, int count, List mobs) { + this(catalyst, MobSource.valueOf(source), count, mobs); + } + + public SummonRitualRecipe(Ingredient catalyst, MobSource source, int count) { + this(catalyst, source, count, new ArrayList<>()); + } + + public boolean matches(List augments) { + return EnchantingApparatusRecipe.doItemsMatch(augments, Arrays.stream(this.catalyst.getItems()).map(Ingredient::of).toList()); + } + + @Override + public boolean matches(SingleRecipeInput p_346065_, Level p_345375_) { + return false; + } + + @Override + public RecipeSerializer getSerializer() { + return RecipeRegistry.SUMMON_RITUAL_SERIALIZER.get(); + } + + @Override + public RecipeType getType() { + return RecipeRegistry.SUMMON_RITUAL_TYPE.get(); + } + + + public static class Serializer implements RecipeSerializer { + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Ingredient.CODEC.fieldOf("augment").forGetter(r -> r.catalyst), + Codec.STRING.fieldOf("mobSource").fieldOf("source").forGetter(r -> r.mobSource.toString()), + Codec.INT.fieldOf("count").forGetter(r -> r.count), + Codec.list(WeightedMobType.CODEC.codec()).fieldOf("mobs").forGetter(r -> r.mobs) + ).apply(instance, SummonRitualRecipe::new)); + + public static final StreamCodec STREAM_CODEC = CheatSerializer.create(CODEC); + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public StreamCodec streamCodec() { + return STREAM_CODEC; + } + } + + /** + * A mob type with a weight and a chance to be selected for spawning + * + * @param mob The mob to spawn + * @param weight If there is more than one mob in the list, this is the chance that this mob will be selected + */ + public record WeightedMobType(ResourceLocation mob, int weight) implements WeightedEntry { + + public WeightedMobType(ResourceLocation mob) { + this(mob, 1); + } + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + ResourceLocation.CODEC.fieldOf("mob").forGetter(WeightedMobType::mob), + Codec.INT.fieldOf("weight").forGetter(WeightedMobType::weight) + ).apply(instance, WeightedMobType::new)); + + @Override + public @NotNull Weight getWeight() { + return Weight.of(this.weight); + } + } + + public enum MobSource { + CURRENT_BIOME, + MOB_LIST + } + +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java index 4e7645321d..659f72a673 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantmentRecipe; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; @@ -11,7 +12,6 @@ import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.level.ItemLike; - import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; public class ApparatusRecipeBuilder { @@ -35,10 +35,6 @@ public ApparatusRecipeBuilder withResult(ItemLike result, int count) { return this; } - public ApparatusRecipeBuilder withResult(RegistryObject result) { - return withResult(result.get()); - } - public ApparatusRecipeBuilder withResult(ItemStack result) { this.recipe.result = result; return this; @@ -49,10 +45,6 @@ public ApparatusRecipeBuilder withReagent(ItemLike provider) { return this; } - public ApparatusRecipeBuilder withReagent(RegistryObject provider) { - return withReagent(provider.get()); - } - public ApparatusRecipeBuilder withReagent(Ingredient ingredient) { this.recipe.reagent = ingredient; @@ -64,17 +56,11 @@ public ApparatusRecipeBuilder withPedestalItem(Ingredient i) { return this; } - public ApparatusRecipeBuilder withPedestalItem(RegistryObject i) { - return withPedestalItem(i.get()); - } public ApparatusRecipeBuilder withPedestalItem(ItemLike i) { return this.withPedestalItem(Ingredient.of(i)); } - public ApparatusRecipeBuilder withPedestalItem(int count, RegistryObject i) { - return withPedestalItem(count, i.get()); - } public ApparatusRecipeBuilder withPedestalItem(int count, ItemLike item) { for (int i = 0; i < count; i++) @@ -118,7 +104,7 @@ public EnchantingApparatusRecipe build() { return recipe; } - public EnchantmentRecipe buildEnchantmentRecipe(Enchantment enchantment, int level, int mana) { + public EnchantmentRecipe buildEnchantmentRecipe(ResourceKey enchantment, int level, int mana) { return new EnchantmentRecipe(this.recipe.pedestalItems, enchantment, level, mana); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java index b509224aea..e0fc40968d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java @@ -4,10 +4,10 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.enchanting_apparatus.*; import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; -import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.common.items.PerkItem; import com.hollingsworth.arsnouveau.common.perk.*; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; @@ -21,6 +21,7 @@ import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Blocks; import net.neoforged.neoforge.common.Tags; + import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; @@ -221,7 +222,7 @@ public void addEntries() { .withPedestalItem(ItemsRegistry.EARTH_ESSENCE) .withPedestalItem(ItemsRegistry.FIRE_ESSENCE) .withPedestalItem(ItemsRegistry.WATER_ESSENCE) - .buildEnchantmentRecipe(EnchantmentRegistry.REACTIVE_ENCHANTMENT.get(), 2, 6000)); + .buildEnchantmentRecipe(EnchantmentRegistry.REACTIVE_ENCHANTMENT.getKey(), 2, 6000)); addRecipe(builder() .withPedestalItem(4, Ingredient.of(Tags.Items.GEMS_EMERALD)) @@ -229,7 +230,7 @@ public void addEntries() { .withPedestalItem(ItemsRegistry.ABJURATION_ESSENCE) .withPedestalItem(ItemsRegistry.CONJURATION_ESSENCE) .withPedestalItem(ItemsRegistry.MANIPULATION_ESSENCE) - .buildEnchantmentRecipe(EnchantmentRegistry.REACTIVE_ENCHANTMENT.get(), 3, 9000)); + .buildEnchantmentRecipe(EnchantmentRegistry.REACTIVE_ENCHANTMENT.getKey(), 3, 9000)); addRecipe(builder() .withPedestalItem(2, Ingredient.of(Items.SPIDER_EYE)) @@ -274,7 +275,7 @@ public void addEntries() { addRecipe(builder() .withPedestalItem(2, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) - .withPedestalItem(2, Ingredient.of(Tags.Items.OBSIDIAN)) + .withPedestalItem(2, Ingredient.of(Tags.Items.OBSIDIANS)) .buildEnchantmentRecipe(Enchantments.BLAST_PROTECTION, 3, 6000)); addRecipe(builder() .withPedestalItem(4, Ingredient.of(Tags.Items.GEMS_DIAMOND)) @@ -301,55 +302,55 @@ public void addEntries() { .withPedestalItem(1, Ingredient.of(Items.SUGAR)) .withPedestalItem(1, Ingredient.of(Items.IRON_PICKAXE)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(Enchantments.BLOCK_EFFICIENCY, 1, 2000)); + .buildEnchantmentRecipe(Enchantments.EFFICIENCY, 1, 2000)); addRecipe(builder() .withPedestalItem(1, Ingredient.of(Tags.Items.STORAGE_BLOCKS_REDSTONE)) .withPedestalItem(1, Ingredient.of(Items.GOLDEN_PICKAXE)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(Enchantments.BLOCK_EFFICIENCY, 2, 3500)); + .buildEnchantmentRecipe(Enchantments.EFFICIENCY, 2, 3500)); addRecipe(builder() .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_REDSTONE)) .withPedestalItem(1, Ingredient.of(Items.GOLDEN_PICKAXE)) .withPedestalItem(3, RecipeDatagen.SOURCE_GEM_BLOCK) - .withPedestalItem(2, Ingredient.of(Tags.Items.OBSIDIAN)) - .buildEnchantmentRecipe(Enchantments.BLOCK_EFFICIENCY, 3, 5000)); + .withPedestalItem(2, Ingredient.of(Tags.Items.OBSIDIANS)) + .buildEnchantmentRecipe(Enchantments.EFFICIENCY, 3, 5000)); addRecipe(builder() .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_REDSTONE)) .withPedestalItem(1, Ingredient.of(Items.DIAMOND_PICKAXE)) .withPedestalItem(1, Ingredient.of(Items.IRON_SHOVEL)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) - .withPedestalItem(2, Ingredient.of(Tags.Items.OBSIDIAN)) - .buildEnchantmentRecipe(Enchantments.BLOCK_EFFICIENCY, 4, 6500)); + .withPedestalItem(2, Ingredient.of(Tags.Items.OBSIDIANS)) + .buildEnchantmentRecipe(Enchantments.EFFICIENCY, 4, 6500)); addRecipe(builder() .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_REDSTONE)) .withPedestalItem(1, Ingredient.of(Items.DIAMOND_PICKAXE)) .withPedestalItem(1, Ingredient.of(Items.DIAMOND_SHOVEL)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(Enchantments.BLOCK_EFFICIENCY, 5, 8000)); + .buildEnchantmentRecipe(Enchantments.EFFICIENCY, 5, 8000)); addRecipe(builder() .withPedestalItem(1, ItemsRegistry.AIR_ESSENCE) .withPedestalItem(1, Ingredient.of(Tags.Items.SLIMEBALLS)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(Enchantments.FALL_PROTECTION, 1, 2000)); + .buildEnchantmentRecipe(Enchantments.FEATHER_FALLING, 1, 2000)); addRecipe(builder() .withPedestalItem(2, ItemsRegistry.AIR_ESSENCE) .withPedestalItem(1, Ingredient.of(Tags.Items.SLIMEBALLS)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(Enchantments.FALL_PROTECTION, 2, 3500)); + .buildEnchantmentRecipe(Enchantments.FEATHER_FALLING, 2, 3500)); addRecipe(builder() .withPedestalItem(3, ItemsRegistry.AIR_ESSENCE) .withPedestalItem(1, Ingredient.of(Tags.Items.SLIMEBALLS)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(Enchantments.FALL_PROTECTION, 3, 5000)); + .buildEnchantmentRecipe(Enchantments.FEATHER_FALLING, 3, 5000)); addRecipe(builder() .withPedestalItem(4, ItemsRegistry.AIR_ESSENCE) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(Enchantments.FALL_PROTECTION, 4, 6500)); + .buildEnchantmentRecipe(Enchantments.FEATHER_FALLING, 4, 6500)); addRecipe(builder() .withPedestalItem(1, ItemsRegistry.FIRE_ESSENCE) @@ -397,29 +398,29 @@ public void addEntries() { .withPedestalItem(1, ItemsRegistry.FIRE_ESSENCE) .withPedestalItem(1, ItemsRegistry.AIR_ESSENCE) .withPedestalItem(1, Ingredient.of(Tags.Items.RODS_BLAZE)) - .buildEnchantmentRecipe(Enchantments.FLAMING_ARROWS, 1, 5000)); + .buildEnchantmentRecipe(Enchantments.FLAME, 1, 5000)); addRecipe(builder() .withPedestalItem(1, ItemsRegistry.EARTH_ESSENCE) .withPedestalItem(1, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(6, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(Enchantments.BLOCK_FORTUNE, 1, 6000)); + .buildEnchantmentRecipe(Enchantments.FORTUNE, 1, 6000)); addRecipe(builder() .withPedestalItem(2, ItemsRegistry.EARTH_ESSENCE) .withPedestalItem(4, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(Enchantments.BLOCK_FORTUNE, 2, 8000)); + .buildEnchantmentRecipe(Enchantments.FORTUNE, 2, 8000)); addRecipe(builder() .withPedestalItem(3, ItemsRegistry.EARTH_ESSENCE) .withPedestalItem(1, Ingredient.of(Tags.Items.STORAGE_BLOCKS_DIAMOND)) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(Enchantments.BLOCK_FORTUNE, 3, 9000)); + .buildEnchantmentRecipe(Enchantments.FORTUNE, 3, 9000)); addRecipe(builder() .withPedestalItem(7, ItemsRegistry.AIR_ESSENCE) .withPedestalItem(1, Ingredient.of(Tags.Items.STORAGE_BLOCKS_DIAMOND)) - .buildEnchantmentRecipe(Enchantments.INFINITY_ARROWS, 1, 9000)); + .buildEnchantmentRecipe(Enchantments.INFINITY, 1, 9000)); addRecipe(builder() .withPedestalItem(1, ItemsRegistry.MANIPULATION_ESSENCE) @@ -436,18 +437,18 @@ public void addEntries() { .withPedestalItem(1, ItemsRegistry.EARTH_ESSENCE) .withPedestalItem(1, Ingredient.of(Tags.Items.GEMS_EMERALD)) .withPedestalItem(6, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(Enchantments.MOB_LOOTING, 1, 6000)); + .buildEnchantmentRecipe(Enchantments.LOOTING, 1, 6000)); addRecipe(builder() .withPedestalItem(2, ItemsRegistry.EARTH_ESSENCE) .withPedestalItem(4, Ingredient.of(Tags.Items.GEMS_EMERALD)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(Enchantments.MOB_LOOTING, 2, 8000)); + .buildEnchantmentRecipe(Enchantments.LOOTING, 2, 8000)); addRecipe(builder() .withPedestalItem(3, ItemsRegistry.EARTH_ESSENCE) .withPedestalItem(1, Ingredient.of(Tags.Items.STORAGE_BLOCKS_EMERALD)) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(Enchantments.MOB_LOOTING, 3, 9000)); + .buildEnchantmentRecipe(Enchantments.LOOTING, 3, 9000)); addRecipe(builder() .withPedestalItem(3, ItemsRegistry.MANIPULATION_ESSENCE) @@ -479,30 +480,30 @@ public void addEntries() { .withPedestalItem(1, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(1, ItemsRegistry.AIR_ESSENCE) .withPedestalItem(1, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(Enchantments.POWER_ARROWS, 1, 2000)); + .buildEnchantmentRecipe(Enchantments.POWER, 1, 2000)); addRecipe(builder() .withPedestalItem(2, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(1, ItemsRegistry.AIR_ESSENCE) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(Enchantments.POWER_ARROWS, 2, 3500)); + .buildEnchantmentRecipe(Enchantments.POWER, 2, 3500)); addRecipe(builder() .withPedestalItem(3, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(1, ItemsRegistry.AIR_ESSENCE) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(Enchantments.POWER_ARROWS, 3, 5000)); + .buildEnchantmentRecipe(Enchantments.POWER, 3, 5000)); addRecipe(builder() .withPedestalItem(4, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(1, ItemsRegistry.AIR_ESSENCE) .withPedestalItem(1, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(Enchantments.POWER_ARROWS, 4, 6500)); + .buildEnchantmentRecipe(Enchantments.POWER, 4, 6500)); addRecipe(builder() .withPedestalItem(5, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(1, ItemsRegistry.AIR_ESSENCE) .withPedestalItem(1, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(1, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(Enchantments.POWER_ARROWS, 5, 9000)); + .buildEnchantmentRecipe(Enchantments.POWER, 5, 9000)); addRecipe(builder() @@ -543,42 +544,42 @@ public void addEntries() { .withPedestalItem(1, ItemsRegistry.ABJURATION_ESSENCE) .withPedestalItem(1, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(Enchantments.ALL_DAMAGE_PROTECTION, 1, 2000)); + .buildEnchantmentRecipe(Enchantments.PROTECTION, 1, 2000)); addRecipe(builder() .withPedestalItem(2, ItemsRegistry.MANIPULATION_ESSENCE) .withPedestalItem(1, ItemsRegistry.ABJURATION_ESSENCE) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(Enchantments.ALL_DAMAGE_PROTECTION, 2, 3500)); + .buildEnchantmentRecipe(Enchantments.PROTECTION, 2, 3500)); addRecipe(builder() .withPedestalItem(2, ItemsRegistry.MANIPULATION_ESSENCE) .withPedestalItem(1, ItemsRegistry.ABJURATION_ESSENCE) .withPedestalItem(3, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(Enchantments.ALL_DAMAGE_PROTECTION, 3, 5000)); + .buildEnchantmentRecipe(Enchantments.PROTECTION, 3, 5000)); addRecipe(builder() .withPedestalItem(2, ItemsRegistry.MANIPULATION_ESSENCE) .withPedestalItem(2, ItemsRegistry.ABJURATION_ESSENCE) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(Enchantments.ALL_DAMAGE_PROTECTION, 4, 6500)); + .buildEnchantmentRecipe(Enchantments.PROTECTION, 4, 6500)); addRecipe(builder() .withPedestalItem(3, ItemsRegistry.MANIPULATION_ESSENCE) .withPedestalItem(3, ItemsRegistry.ABJURATION_ESSENCE) .withPedestalItem(1, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(1, Ingredient.of(Tags.Items.STORAGE_BLOCKS_DIAMOND)) - .buildEnchantmentRecipe(Enchantments.ALL_DAMAGE_PROTECTION, 5, 8000)); + .buildEnchantmentRecipe(Enchantments.PROTECTION, 5, 8000)); addRecipe(builder() .withPedestalItem(2, ItemsRegistry.AIR_ESSENCE) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(Enchantments.PUNCH_ARROWS, 1, 2000)); + .buildEnchantmentRecipe(Enchantments.PUNCH, 1, 2000)); addRecipe(builder() .withPedestalItem(3, ItemsRegistry.AIR_ESSENCE) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(Enchantments.PUNCH_ARROWS, 2, 4000)); + .buildEnchantmentRecipe(Enchantments.PUNCH, 2, 4000)); addRecipe(builder() .withPedestalItem(1, ItemsRegistry.AIR_ESSENCE) @@ -611,30 +612,30 @@ public void addEntries() { .buildEnchantmentRecipe(Enchantments.RESPIRATION, 3, 9000)); addRecipe(builder() - .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_QUARTZ)) + .withPedestalItem(2, Ingredient.of(Blocks.QUARTZ_BLOCK)) .withPedestalItem(1, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(1, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) .buildEnchantmentRecipe(Enchantments.SHARPNESS, 1, 2000)); addRecipe(builder() - .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_QUARTZ)) + .withPedestalItem(2, Ingredient.of(Blocks.QUARTZ_BLOCK)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(1, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) .buildEnchantmentRecipe(Enchantments.SHARPNESS, 2, 3500)); addRecipe(builder() - .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_QUARTZ)) + .withPedestalItem(2, Ingredient.of(Blocks.QUARTZ_BLOCK)) .withPedestalItem(1, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(1, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) .buildEnchantmentRecipe(Enchantments.SHARPNESS, 3, 5000)); addRecipe(builder() - .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_QUARTZ)) + .withPedestalItem(2, Ingredient.of(Blocks.QUARTZ_BLOCK)) .withPedestalItem(2, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(1, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) .buildEnchantmentRecipe(Enchantments.SHARPNESS, 4, 6500)); addRecipe(builder() - .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_QUARTZ)) + .withPedestalItem(2, Ingredient.of(Blocks.QUARTZ_BLOCK)) .withPedestalItem(2, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) .buildEnchantmentRecipe(Enchantments.SHARPNESS, 5, 8000)); @@ -733,40 +734,40 @@ public void addEntries() { addRecipe(builder() .withPedestalItem(1, BlockRegistry.SOURCEBERRY_BUSH) .withPedestalItem(4, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.get(), 1, 2000)); + .buildEnchantmentRecipe(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.getKey(), 1, 2000)); addRecipe(builder() .withPedestalItem(1, BlockRegistry.SOURCEBERRY_BUSH) .withPedestalItem(1, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(4, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.get(), 2, 3500)); + .buildEnchantmentRecipe(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.getKey(), 2, 3500)); addRecipe(builder() .withPedestalItem(1, BlockRegistry.SOURCEBERRY_BUSH) .withPedestalItem(2, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(4, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(1, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.get(), 3, 5000)); + .buildEnchantmentRecipe(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.getKey(), 3, 5000)); addRecipe(builder() .withPedestalItem(2, BlockRegistry.SOURCEBERRY_BUSH) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.get(), 1, 2000)); + .buildEnchantmentRecipe(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.getKey(), 1, 2000)); addRecipe(builder() .withPedestalItem(2, BlockRegistry.SOURCEBERRY_BUSH) .withPedestalItem(2, ItemsRegistry.ABJURATION_ESSENCE) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.get(), 2, 3500)); + .buildEnchantmentRecipe(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.getKey(), 2, 3500)); addRecipe(builder() .withPedestalItem(2, BlockRegistry.SOURCEBERRY_BUSH) .withPedestalItem(3, ItemsRegistry.ABJURATION_ESSENCE) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(1, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.get(), 3, 5000)); + .buildEnchantmentRecipe(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.getKey(), 3, 5000)); addRecipe(builder() .withResult(ItemsRegistry.ENCHANTERS_SWORD) @@ -829,7 +830,7 @@ public void addEntries() { addRecipe(builder() .withResult(ItemsRegistry.ENCHANTERS_MIRROR) .withReagent(RecipeDatagen.SOURCE_GEM_BLOCK) - .withPedestalItem(2, Ingredient.of(Tags.Items.GLASS)) + .withPedestalItem(2, Ingredient.of(Tags.Items.GLASS_BLOCKS)) .withPedestalItem(2, ItemsRegistry.MANIPULATION_ESSENCE) .withPedestalItem(2, RecipeDatagen.ARCHWOOD_LOG) .withPedestalItem(2, Ingredient.of(Tags.Items.INGOTS_GOLD)) @@ -861,7 +862,7 @@ public void addEntries() { .withPedestalItem(4, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(1, Ingredient.of(Tags.Items.ENDER_PEARLS)) .withPedestalItem(1, Ingredient.of(ItemsRegistry.WILDEN_TRIBUTE.get())) - .buildEnchantmentRecipe(EnchantmentRegistry.REACTIVE_ENCHANTMENT.get(), 4, 9000)); + .buildEnchantmentRecipe(EnchantmentRegistry.REACTIVE_ENCHANTMENT.getKey(), 4, 9000)); addRecipe(builder() .withResult(BlockRegistry.RELAY_COLLECTOR) @@ -894,7 +895,7 @@ public void addEntries() { .withReagent(Items.DISPENSER) .withPedestalItem(2, Tags.Items.INGOTS_GOLD) .withPedestalItem(2, Tags.Items.RODS_BLAZE) - .withPedestalItem(4, Tags.Items.GUNPOWDER).build()); + .withPedestalItem(4, Tags.Items.GUNPOWDERS).build()); addRecipe(builder().withResult(ItemsRegistry.LINGERING_LAUNCHER) .withReagent(ItemsRegistry.SPLASH_LAUNCHER) .withPedestalItem(Items.DRAGON_BREATH) @@ -1084,7 +1085,7 @@ public void addEntries() { .build()); addRecipe(builder().withResult(getPerkItem(KnockbackResistPerk.INSTANCE.getRegistryName())) .withReagent(ItemsRegistry.BLANK_THREAD) - .withPedestalItem(3, Ingredient.of(Tags.Items.OBSIDIAN)) + .withPedestalItem(3, Ingredient.of(Tags.Items.OBSIDIANS)) .build()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AtlasProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AtlasProvider.java index 2c487b1261..7dc342c171 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AtlasProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AtlasProvider.java @@ -7,11 +7,11 @@ import net.minecraft.client.renderer.texture.atlas.sources.SingleFile; import net.minecraft.client.resources.model.Material; import net.minecraft.data.PackOutput; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.properties.ChestType; import net.neoforged.neoforge.common.data.ExistingFileHelper; import net.neoforged.neoforge.common.data.SpriteSourceProvider; + import java.util.EnumMap; import java.util.Map; import java.util.Optional; @@ -29,13 +29,6 @@ public AtlasProvider(PackOutput output, ExistingFileHelper helper) { super(output, helper, ArsNouveau.MODID); } - @Override - protected void addSources() { - MATERIALS.values().stream().flatMap(e -> e.values().stream()).map(Material::texture) - .forEach(resourceLocation -> this.atlas(CHESTS_ATLAS).addSource(new SingleFile(resourceLocation, Optional.empty()))); - } - - private static EnumMap chestMaterial(String type) { EnumMap map = new EnumMap<>(ChestType.class); @@ -45,4 +38,10 @@ private static EnumMap chestMaterial(String type) { return map; } + + @Override + protected void gather() { + MATERIALS.values().stream().flatMap(e -> e.values().stream()).map(Material::texture) + .forEach(resourceLocation -> this.atlas(CHESTS_ATLAS).addSource(new SingleFile(resourceLocation, Optional.empty()))); + } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java index 51f29127a7..ab7e6d5559 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java @@ -2,14 +2,9 @@ import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.recipe.BuddingConversionRecipe; -import com.hollingsworth.arsnouveau.api.recipe.SummonRitualRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.BuddingConversionRecipe; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.block.Blocks; import java.nio.file.Path; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java index e2f613bf28..c52594eb55 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java @@ -4,15 +4,17 @@ import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; +import com.hollingsworth.arsnouveau.common.crafting.recipes.CasterTomeData; import com.hollingsworth.arsnouveau.common.spell.augment.*; import com.hollingsworth.arsnouveau.common.spell.effect.*; -import com.hollingsworth.arsnouveau.common.spell.method.*; -import com.hollingsworth.arsnouveau.common.tomes.CasterTomeData; +import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; +import com.hollingsworth.arsnouveau.common.spell.method.MethodSelf; +import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; +import com.hollingsworth.arsnouveau.common.spell.method.MethodUnderfoot; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.SoundRegistry; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; -import net.minecraft.resources.ResourceLocation; import java.nio.file.Path; import java.util.ArrayList; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CompostablesProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CompostablesProvider.java index 6b2e98645c..c7bc33ffb3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CompostablesProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CompostablesProvider.java @@ -1,25 +1,14 @@ package com.hollingsworth.arsnouveau.common.datagen; -import com.hollingsworth.arsnouveau.api.recipe.SummonRitualRecipe; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.HolderLookup; -import net.minecraft.data.CachedOutput; -import net.minecraft.data.DataGenerator; import net.minecraft.data.PackOutput; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.crafting.Ingredient; import net.neoforged.neoforge.common.data.DataMapProvider; -import net.neoforged.neoforge.registries.datamaps.DataMapType; import net.neoforged.neoforge.registries.datamaps.builtin.Compostable; import net.neoforged.neoforge.registries.datamaps.builtin.NeoForgeDataMaps; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.CompletableFuture; public class CompostablesProvider extends DataMapProvider { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java index a1988420a5..f522cffe69 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java @@ -5,7 +5,10 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.common.block.*; +import com.hollingsworth.arsnouveau.common.block.AlterationTable; +import com.hollingsworth.arsnouveau.common.block.ArchfruitPod; +import com.hollingsworth.arsnouveau.common.block.ScribesBlock; +import com.hollingsworth.arsnouveau.common.block.ThreePartBlock; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; import com.hollingsworth.arsnouveau.common.util.registry.BlockRegistryWrapper; import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; @@ -21,7 +24,6 @@ import net.minecraft.data.loot.EntityLootSubProvider; import net.minecraft.data.loot.LootTableProvider; import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.util.ProblemReporter; import net.minecraft.util.StringRepresentable; import net.minecraft.world.entity.EntityType; @@ -39,12 +41,15 @@ import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.ValidationContext; import net.minecraft.world.level.storage.loot.entries.LootItem; -import net.minecraft.world.level.storage.loot.functions.*; +import net.minecraft.world.level.storage.loot.functions.CopyCustomDataFunction; +import net.minecraft.world.level.storage.loot.functions.CopyNameFunction; +import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition; import net.minecraft.world.level.storage.loot.providers.nbt.ContextNbtProvider; import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; + import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.function.BiConsumer; @@ -272,7 +277,7 @@ protected void registerSlabItemTable(Block p_124291_) { @Override - public void generate(HolderLookup.Provider pRegistries, BiConsumer, LootTable.Builder> pGenerator) { + public void generate(BiConsumer, LootTable.Builder> pGenerator) { this.generate(); Set> set = new HashSet<>(); @@ -373,7 +378,7 @@ protected void add(EntityType pEntityType, ResourceKey pLootTableL } @Override - public void generate(HolderLookup.Provider pRegistries, BiConsumer, LootTable.Builder> pGenerator) { + public void generate(BiConsumer, LootTable.Builder> pGenerator) { this.generate(); Set> set = Sets.newHashSet(); this.getKnownEntityTypes().map(EntityType::builtInRegistryHolder).forEach((p_249003_) -> { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java index a125c85024..dde1f56d44 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java @@ -2,16 +2,12 @@ import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.recipe.DispelEntityRecipe; -import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import com.hollingsworth.arsnouveau.common.crafting.recipes.DispelEntityRecipe; import net.minecraft.advancements.critereon.EntityFlagsPredicate; import net.minecraft.advancements.critereon.EntityPredicate; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraft.world.level.storage.loot.predicates.LootItemEntityPropertyCondition; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java index 97011f5c49..5ae98a1fdc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java @@ -14,6 +14,7 @@ import net.minecraft.world.item.Items; import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.common.data.ExistingFileHelper; + import java.util.concurrent.CompletableFuture; public class ItemTagProvider extends IntrinsicHolderTagsProvider { @@ -173,7 +174,7 @@ protected void addTags(HolderLookup.Provider pProvider) { this.tag(ItemTags.BOOKSHELF_BOOKS).add(books); this.tag(ItemTags.SWORDS).add(ItemsRegistry.ENCHANTERS_SWORD.get()); - this.tag(Tags.Items.TOOLS_SHIELDS).add(ItemsRegistry.ENCHANTERS_SHIELD.get()); + this.tag(Tags.Items.TOOLS_SHIELD).add(ItemsRegistry.ENCHANTERS_SHIELD.get()); this.tag(Tags.Items.ARMORS).add(ItemsRegistry.SORCERER_ROBES.asItem(), ItemsRegistry.ARCANIST_ROBES.asItem(), @@ -188,19 +189,19 @@ protected void addTags(HolderLookup.Provider pProvider) { ItemsRegistry.ARCANIST_HOOD.asItem(), ItemsRegistry.BATTLEMAGE_HOOD.asItem()); - this.tag(Tags.Items.ARMORS_BOOTS) + this.tag(ItemTags.FOOT_ARMOR) .add(ItemsRegistry.SORCERER_BOOTS.asItem(), ItemsRegistry.ARCANIST_BOOTS.asItem(), ItemsRegistry.BATTLEMAGE_BOOTS.asItem()); - this.tag(Tags.Items.ARMORS_CHESTPLATES) + this.tag(ItemTags.CHEST_ARMOR) .add(ItemsRegistry.SORCERER_ROBES.asItem(), ItemsRegistry.ARCANIST_ROBES.asItem(), ItemsRegistry.BATTLEMAGE_ROBES.asItem()); - this.tag(Tags.Items.ARMORS_HELMETS) + this.tag(ItemTags.HEAD_ARMOR) .add(ItemsRegistry.SORCERER_HOOD.asItem(), ItemsRegistry.ARCANIST_HOOD.asItem(), ItemsRegistry.BATTLEMAGE_HOOD.asItem()); - this.tag(Tags.Items.ARMORS_LEGGINGS).add(ItemsRegistry.SORCERER_LEGGINGS.asItem(), + this.tag(ItemTags.LEG_ARMOR).add(ItemsRegistry.SORCERER_LEGGINGS.asItem(), ItemsRegistry.ARCANIST_LEGGINGS.asItem(), ItemsRegistry.BATTLEMAGE_LEGGINGS.asItem()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java index 953678af72..6a92fc9eb6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java @@ -33,7 +33,6 @@ import net.minecraft.world.level.block.Block; import org.apache.commons.io.FilenameUtils; - import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; @@ -681,10 +680,6 @@ public PatchouliPage addBasicItem(ItemLike item, ResourceLocation category, IPat return addPage(new PatchouliPage(builder, getPath(category, getRegistryName(item.asItem())))); } - public void addBasicItem(RegistryObject item, ResourceLocation category, IPatchouliPage recipePage) { - addBasicItem(item.get(), category, recipePage); - } - public Path getPath(ResourceLocation category, ResourceLocation fileName) { return this.output.resolve("assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/" + category.getPath() + "/" + fileName.getPath() + ".json"); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PotionEffectTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PotionEffectTagProvider.java index 426c3fb1d4..0ec04b51e8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PotionEffectTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PotionEffectTagProvider.java @@ -26,8 +26,8 @@ public PotionEffectTagProvider(PackOutput pOutput, CompletableFuture recipes = new ArrayList<>(); + public List recipes = new ArrayList<>(); public ScryRitualProvider(DataGenerator generatorIn) { super(generatorIn); @@ -29,9 +28,9 @@ public ScryRitualProvider(DataGenerator generatorIn) { @Override public void collectJsons(CachedOutput pOutput) { addEntries(); - for (ScryRitualRecipe recipe : recipes) { - Path path = getRecipePath(output, recipe.getId().getPath()); - saveStable(pOutput, recipe.asRecipe(), path); + for (ScryRecipeWrapper recipe : recipes) { + Path path = getRecipePath(output, recipe.id().getPath()); + saveStable(pOutput, ScryRitualRecipe.Serializer.CODEC.codec().encodeStart(JsonOps.INSTANCE, recipe.recipe()).getOrThrow(), path); } } @@ -40,12 +39,12 @@ protected void addEntries() { for (String ore : defaultOres) { addForgeOreRecipe(ore); } - recipes.add(new ScryRitualRecipe(ArsNouveau.prefix( "amethyst_gems"), forgeItemTag("gems/amethyst"), forgeBlockTag("storage_blocks/amethyst"))); - recipes.add(new ScryRitualRecipe(ArsNouveau.prefix( "amethyst_blocks"), forgeItemTag("storage_blocks/amethyst"), forgeBlockTag("storage_blocks/amethyst"))); + recipes.add(new ScryRecipeWrapper(ArsNouveau.prefix( "amethyst_gems"), forgeItemTag("gems/amethyst"), forgeBlockTag("storage_blocks/amethyst"))); + recipes.add(new ScryRecipeWrapper(ArsNouveau.prefix( "amethyst_blocks"), forgeItemTag("storage_blocks/amethyst"), forgeBlockTag("storage_blocks/amethyst"))); } private void addForgeOreRecipe(String ore) { - recipes.add(new ScryRitualRecipe(ArsNouveau.prefix( ore + "_ores"), forgeItemTag("ores/" + ore), forgeBlockTag("ores/" + ore))); + recipes.add(new ScryRecipeWrapper(ArsNouveau.prefix( ore + "_ores"), forgeItemTag("ores/" + ore), forgeBlockTag("ores/" + ore))); } private TagKey forgeBlockTag(String path) { @@ -71,4 +70,11 @@ protected static Path getRecipePath(Path path, String id) { public String getName() { return "Scry Ritual Datagen"; } + + public record ScryRecipeWrapper(ResourceLocation id, TagKey augment, TagKey highlight){ + + public ScryRitualRecipe recipe(){ + return new ScryRitualRecipe(augment, highlight); + } + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java index 15270acb50..b8a5d865ed 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java @@ -2,10 +2,9 @@ import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.recipe.SummonRitualRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.SummonRitualRecipe; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java index 27a7d778d7..51dd563fd3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java @@ -2,9 +2,9 @@ import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.setup.registry.BiomeRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import com.hollingsworth.arsnouveau.setup.registry.WorldgenRegistry; -import com.hollingsworth.arsnouveau.setup.registry.BiomeRegistry; import net.minecraft.core.Holder; import net.minecraft.core.HolderLookup; import net.minecraft.core.HolderSet; @@ -22,7 +22,7 @@ import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; import net.neoforged.neoforge.common.world.BiomeModifier; import net.neoforged.neoforge.common.world.BiomeModifiers; - +import net.neoforged.neoforge.registries.NeoForgeRegistries; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -32,20 +32,20 @@ public class WorldgenProvider extends DatapackBuiltinEntriesProvider { private static final RegistrySetBuilder BUILDER = new RegistrySetBuilder() .add(Registries.CONFIGURED_FEATURE, WorldgenRegistry::bootstrapConfiguredFeatures) .add(Registries.PLACED_FEATURE, WorldgenRegistry::bootstrapPlacedFeatures) - .add(ForgeRegistries.Keys.BIOME_MODIFIERS, BiomeModifierRegistry::bootstrap) - .add(ForgeRegistries.Keys.BIOMES, BiomeRegistry::bootstrap); + .add(NeoForgeRegistries.Keys.BIOME_MODIFIERS, BiomeModifierRegistry::bootstrap) + .add(NeoForgeRegistries.Keys.BIOMES, BiomeRegistry::bootstrap); public WorldgenProvider(PackOutput output, CompletableFuture registries) { super(output, registries, BUILDER, Set.of(ArsNouveau.MODID)); } public static class BiomeModifierRegistry { - public static final ResourceKey STARBUNCLE_SPAWN = ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, prefix("starbuncle_spawn")); - public static final ResourceKey GIFT_STARBUNCLE_SPAWN = ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, prefix("gift_starbuncle_spawn")); - public static final ResourceKey DRYGMY_SPAWN = ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, prefix("drygmy_spawn")); - public static final ResourceKey WHIRLISPRIG_SPAWN = ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, prefix("whirlisprig_spawn")); - public static final ResourceKey ARCHWOOD_MIX_RARE = ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, prefix("rare_archwood_mix")); - public static final ResourceKey BERRY_COMMON = ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, prefix("common_source_berry")); + public static final ResourceKey STARBUNCLE_SPAWN = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, prefix("starbuncle_spawn")); + public static final ResourceKey GIFT_STARBUNCLE_SPAWN = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, prefix("gift_starbuncle_spawn")); + public static final ResourceKey DRYGMY_SPAWN = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, prefix("drygmy_spawn")); + public static final ResourceKey WHIRLISPRIG_SPAWN = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, prefix("whirlisprig_spawn")); + public static final ResourceKey ARCHWOOD_MIX_RARE = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, prefix("rare_archwood_mix")); + public static final ResourceKey BERRY_COMMON = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, prefix("common_source_berry")); public static void bootstrap(BootstrapContext context) { HolderSet OVERWORLD_TAG = context.lookup(Registries.BIOME).getOrThrow(BiomeTags.IS_OVERWORLD); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusPage.java index bb9a5d424f..ca8736513f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusPage.java @@ -4,7 +4,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; - import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; public class ApparatusPage extends AbstractPage { @@ -17,10 +16,6 @@ public ApparatusPage(ItemLike itemLike) { this(getRegistryName(itemLike.asItem()).toString()); } - public ApparatusPage(RegistryObject itemLike) { - this(itemLike.get()); - } - @Override public ResourceLocation getType() { return ArsNouveau.prefix( "apparatus_recipe"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusTextPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusTextPage.java index fa2dddf3b0..12fadba31e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusTextPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/ApparatusTextPage.java @@ -15,10 +15,6 @@ public ApparatusTextPage(ItemLike itemLike) { super(itemLike); } - public ApparatusTextPage(RegistryObject itemLike) { - super(itemLike); - } - @Override public ResourceLocation getType() { return ArsNouveau.prefix( "no_output_apparatus_recipe"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/CraftingPage.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/CraftingPage.java index 44fa395e5c..2d5b90595a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/CraftingPage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/CraftingPage.java @@ -3,7 +3,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; - import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; public class CraftingPage extends AbstractPage { @@ -16,10 +15,6 @@ public CraftingPage(ItemLike itemLike) { this(getRegistryName(itemLike.asItem()).toString()); } - public CraftingPage(RegistryObject itemLike) { - this(itemLike.get().asItem()); - } - public CraftingPage withRecipe2(String recipe) { object.addProperty("recipe2", recipe); return this; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/PatchouliBuilder.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/PatchouliBuilder.java index 50d7840b00..744d2047cc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/PatchouliBuilder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/patchouli/PatchouliBuilder.java @@ -5,7 +5,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; - import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; public class PatchouliBuilder { @@ -31,10 +30,6 @@ public PatchouliBuilder(ResourceLocation category, ItemLike itemLike) { this.withCategory(category); } - public PatchouliBuilder(ResourceLocation category, RegistryObject itemLike) { - this(category, itemLike.get()); - } - public PatchouliBuilder withName(String path) { object.addProperty("name", path); this.name = path; @@ -61,11 +56,6 @@ public PatchouliBuilder withIcon(ItemLike item) { return this; } - public PatchouliBuilder withIcon(RegistryObject item) { - object.addProperty("icon", getRegistryName(((ItemLike) item.get()).asItem()).toString()); - return this; - } - public PatchouliBuilder withCategory(ResourceLocation path) { object.addProperty("category", path.toString()); return this; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java index e0fcccb0de..5bc03ad1bf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java @@ -3,7 +3,6 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.api.entity.IDispellable; import com.hollingsworth.arsnouveau.api.item.IWandable; -import com.hollingsworth.arsnouveau.api.recipe.BuddingConversionRecipe; import com.hollingsworth.arsnouveau.api.registry.BuddingConversionRegistry; import com.hollingsworth.arsnouveau.api.util.NBTUtil; import com.hollingsworth.arsnouveau.api.util.SummonUtil; @@ -12,13 +11,13 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.compat.PatchouliHandler; +import com.hollingsworth.arsnouveau.common.crafting.recipes.BuddingConversionRecipe; import com.hollingsworth.arsnouveau.common.entity.goal.GoBackHomeGoal; import com.hollingsworth.arsnouveau.common.entity.goal.amethyst_golem.*; import com.hollingsworth.arsnouveau.common.entity.pathfinding.MinecoloniesAdvancedPathNavigate; import com.hollingsworth.arsnouveau.common.entity.pathfinding.PathingStuckHandler; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; -import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -41,7 +40,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; @@ -49,8 +47,8 @@ import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.ArrayList; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java index 89fc128185..08fd7323b1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java @@ -2,20 +2,17 @@ import com.hollingsworth.arsnouveau.api.entity.ISummon; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.neoforged.neoforge.network.NetworkHooks; -import net.neoforged.neoforge.network.PlayMessages; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; @@ -47,6 +44,16 @@ protected ItemStack getPickupItem() { return ItemStack.EMPTY; } + @Override + protected ItemStack getDefaultPickupItem() { + return ItemStack.EMPTY; + } + + @Override + protected boolean tryPickup(Player pPlayer) { + return false; + } + @Override public void registerControllers(AnimatableManager.ControllerRegistrar data) {} @@ -104,7 +111,7 @@ protected void doPostHurtEffects(LivingEntity entity) { Collection effects = entity.getActiveEffects(); MobEffectInstance[] array = effects.toArray(new MobEffectInstance[0]); for (MobEffectInstance e : array) { - if (e.getEffect().isBeneficial()) + if (e.getEffect().value().isBeneficial()) entity.removeEffect(e.getEffect()); } entity.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 100, 2)); @@ -139,13 +146,4 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { public EntityType getType() { return ModEntities.ENTITY_CHIMERA_SPIKE.get(); } - - @Override - public Packet getAddEntityPacket() { - return NetworkHooks.getEntitySpawningPacket(this); - } - - public EntityChimeraProjectile(PlayMessages.SpawnEntity packet, Level world) { - super(ModEntities.ENTITY_CHIMERA_SPIKE.get(), world); - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java index f9fca2142a..b46c583684 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java @@ -9,16 +9,12 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.network.NetworkHooks; -import net.neoforged.neoforge.network.PlayMessages; public class EntityFollowProjectile extends ColoredProjectile { public static final EntityDataAccessor to = SynchedEntityData.defineId(EntityFollowProjectile.class, EntityDataSerializers.BLOCK_POS); @@ -73,12 +69,13 @@ public EntityFollowProjectile(EntityType entit super(entityAOEProjectileEntityType, world); } - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(to, new BlockPos(0, 0, 0)); - this.entityData.define(from, new BlockPos(0, 0, 0)); - this.entityData.define(SPAWN_TOUCH, defaultsBurst()); - this.entityData.define(DESPAWN, 10); + @Override + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(to, new BlockPos(0, 0, 0)); + pBuilder.define(from, new BlockPos(0, 0, 0)); + pBuilder.define(SPAWN_TOUCH, defaultsBurst()); + pBuilder.define(DESPAWN, 10); } public boolean defaultsBurst() { @@ -174,15 +171,6 @@ public void addAdditionalSaveData(CompoundTag compound) { NBTUtil.storeBlockPos(compound, "to", this.entityData.get(EntityFollowProjectile.to)); } - @Override - public Packet getAddEntityPacket() { - return NetworkHooks.getEntitySpawningPacket(this); - } - - public EntityFollowProjectile(PlayMessages.SpawnEntity packet, Level world) { - super(ModEntities.ENTITY_FOLLOW_PROJ.get(), world); - } - @Override public EntityType getType() { return ModEntities.ENTITY_FOLLOW_PROJ.get(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWallSpell.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWallSpell.java index f6f0096c37..03d5499b22 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWallSpell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWallSpell.java @@ -18,7 +18,6 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.*; -import net.neoforged.neoforge.network.PlayMessages; import org.jetbrains.annotations.Nullable; import java.lang.ref.WeakReference; @@ -105,7 +104,7 @@ public void castSpells() { int i = 0; // Expand the axis if start and end are equal - AABB aabb = new AABB(start, end); + AABB aabb = AABB.encapsulatingFullBlocks(start, end); if(aabb.maxX == aabb.minX){ aabb = aabb.inflate(growthFactor, 0, 0); } @@ -174,10 +173,6 @@ public void playParticles() { ParticleUtil.spawnLight(level, getParticleColor(), position.add(0, 0.5, 0), 10); } - public EntityWallSpell(PlayMessages.SpawnEntity packet, Level world) { - super(ModEntities.WALL_SPELL.get(), world); - } - @Override public EntityType getType() { return ModEntities.WALL_SPELL.get(); @@ -188,7 +183,7 @@ protected void onHit(HitResult result) { if (!level.isClientSide && result instanceof BlockHitResult && !this.isRemoved()) { BlockState state = level.getBlockState(((BlockHitResult) result).getBlockPos()); if (state.is(BlockTags.PORTALS)) { - state.getBlock().entityInside(state, level, ((BlockHitResult) result).getBlockPos(), this); + state.entityInside(level, ((BlockHitResult) result).getBlockPos(), this); return; } this.setLanded(true); @@ -240,14 +235,14 @@ public boolean shouldFall() { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - entityData.define(ACCELERATES, 0); - entityData.define(AOE, 0f); - entityData.define(LANDED, false); - entityData.define(SENSITIVE, false); - entityData.define(DIRECTION, Direction.NORTH); - entityData.define(SHOULD_FALL, true); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(ACCELERATES, 0); + pBuilder.define(AOE, 0f); + pBuilder.define(LANDED, false); + pBuilder.define(SENSITIVE, false); + pBuilder.define(DIRECTION, Direction.NORTH); + pBuilder.define(SHOULD_FALL, true); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index e12ceffc8b..1182aa4b36 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -39,6 +39,7 @@ import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; @@ -68,18 +69,17 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.DirtPathBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.pathfinder.BlockPathTypes; +import net.minecraft.world.level.pathfinder.PathType; import net.minecraft.world.phys.AABB; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.common.Tags; - import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -133,8 +133,8 @@ public Starbuncle(EntityType entityCarbuncleEntityType, Le dynamicBehavior = new StarbyTransportBehavior(this, new CompoundTag()); reloadGoals(); this.moveControl = new MovementHandler(this); - this.setPathfindingMalus(BlockPathTypes.DANGER_OTHER, 0.0F); - this.setPathfindingMalus(BlockPathTypes.DAMAGE_OTHER, 0.0F); + this.setPathfindingMalus(PathType.DANGER_OTHER, 0.0F); + this.setPathfindingMalus(PathType.DAMAGE_OTHER, 0.0F); } public Starbuncle(Level world, boolean tamed) { @@ -255,7 +255,7 @@ public void attemptTame() { } level.addFreshEntity(new ItemEntity(level, getX(), getY() + 0.5, getZ(), stack)); level.playSound(null, getX(), getY(), getZ(), SoundEvents.ILLUSIONER_MIRROR_MOVE, SoundSource.NEUTRAL, 1f, 1f); - ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.POOF_MOB, (ServerLevel) this.level, this.getOnPos(), 10); + ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.POOF_MOB.get(), (ServerLevel) this.level, this.getOnPos(), 10); this.remove(RemovalReason.DISCARDED); } else if (tamingTime > 55 && level.isClientSide) { for (int i = 0; i < 10; i++) { @@ -505,13 +505,13 @@ public EntityType getType() { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(TAMED, false); - this.entityData.define(COLOR, DyeColor.ORANGE.getName()); - this.entityData.define(PATH_BLOCK, ""); - this.entityData.define(HEAD_COSMETIC, ItemStack.EMPTY); - this.entityData.define(BEHAVIOR_TAG, new CompoundTag()); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(TAMED, false); + pBuilder.define(COLOR, DyeColor.ORANGE.getName()); + pBuilder.define(PATH_BLOCK, ""); + pBuilder.define(HEAD_COSMETIC, ItemStack.EMPTY); + pBuilder.define(BEHAVIOR_TAG, new CompoundTag()); } @Override @@ -575,7 +575,7 @@ public void readAdditionalSaveData(CompoundTag tag) { super.readAdditionalSaveData(tag); data = new StarbuncleData(tag.contains("starbuncleData") ? tag.getCompound("starbuncleData") : new CompoundTag()); if (tag.contains("held")) - setHeldStack(ItemStack.of((CompoundTag) tag.get("held"))); + setHeldStack(ItemStack.parseOptional(level.registryAccess(), (CompoundTag) tag.get("held"))); backOff = tag.getInt("backoff"); this.entityData.set(TAMED, tag.getBoolean("tamed")); @@ -595,8 +595,7 @@ public void addAdditionalSaveData(CompoundTag tag) { super.addAdditionalSaveData(tag); tag.put("starbuncleData", data.toTag(this, new CompoundTag())); if (getHeldStack() != null) { - CompoundTag itemTag = new CompoundTag(); - getHeldStack().save(itemTag); + Tag itemTag = getHeldStack().save(level.registryAccess()); tag.put("held", itemTag); } tag.putInt("backoff", backOff); @@ -699,7 +698,7 @@ public ResourceLocation getTexture(Starbuncle entity) { @org.jetbrains.annotations.Nullable @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @org.jetbrains.annotations.Nullable SpawnGroupData pSpawnData, @org.jetbrains.annotations.Nullable CompoundTag pDataTag) { + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @org.jetbrains.annotations.Nullable SpawnGroupData pSpawnData) { RandomSource randomSource = pLevel.getRandom(); if (randomSource.nextFloat() <= 0.1f && !Rewards.starbuncles.isEmpty()) { try { @@ -714,7 +713,7 @@ public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstan } else { this.setColor(carbyColors[randomSource.nextInt(carbyColors.length)]); } - return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData); } public static String[] carbyColors = Arrays.stream(DyeColor.values()).map(DyeColor::getName).toArray(String[]::new); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java index fce452bb34..d3776482c7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java @@ -10,7 +10,6 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleLineData; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.entity.goal.chimera.*; -import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import com.hollingsworth.arsnouveau.common.potions.SnareEffect; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; import com.hollingsworth.arsnouveau.common.spell.effect.EffectDelay; @@ -19,6 +18,7 @@ import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; +import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import com.hollingsworth.arsnouveau.setup.registry.SoundRegistry; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance; @@ -59,7 +59,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.pathfinder.BlockPathTypes; +import net.minecraft.world.level.pathfinder.PathType; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.fluids.FluidType; @@ -67,8 +67,8 @@ import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.ArrayList; @@ -111,7 +111,7 @@ public WildenChimera(EntityType type, Level level) { flyingpathnavigator.setCanOpenDoors(true); flyingpathnavigator.setCanFloat(false); flyingpathnavigator.setCanPassDoors(true); - this.setPathfindingMalus(BlockPathTypes.WATER, 0.0F); + this.setPathfindingMalus(PathType.WATER, 0.0F); this.flyingNavigator = flyingpathnavigator; this.waterNavigation = new WaterBoundPathNavigation(this, level); this.groundNavigation = new GroundPathNavigation(this, level); @@ -335,8 +335,9 @@ public static void spawnPhaseParticles(BlockPos pos, Level level, int multiplier } } - protected void dropCustomDeathLoot(DamageSource p_213333_1_, int p_213333_2_, boolean p_213333_3_) { - super.dropCustomDeathLoot(p_213333_1_, p_213333_2_, p_213333_3_); + @Override + protected void dropCustomDeathLoot(ServerLevel p_348683_, DamageSource p_21385_, boolean p_21387_) { + super.dropCustomDeathLoot(p_348683_, p_21385_, p_21387_); ItemEntity itementity = this.spawnAtLocation(ItemsRegistry.WILDEN_TRIBUTE.get()); if (itementity != null) { itementity.setExtendedLifetime(); @@ -517,7 +518,7 @@ public boolean canChangeDimensions() { } public boolean canBeAffected(MobEffectInstance instance) { - MobEffect effect = instance.getEffect(); + MobEffect effect = instance.getEffect().value(); if (instance.getEffect() instanceof SnareEffect) return false; @@ -541,19 +542,19 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(HAS_HORNS, false); - this.entityData.define(HAS_SPIKES, false); - this.entityData.define(HAS_WINGS, false); - this.entityData.define(PHASE, 1); - this.entityData.define(DEFENSIVE_MODE, false); - this.entityData.define(PHASE_SWAPPING, false); - this.entityData.define(IS_FLYING, false); - this.entityData.define(IS_HOWLING, false); - this.entityData.define(IS_DIVING, false); - this.entityData.define(IS_RAMMING, false); - this.entityData.define(RAM_PREP, false); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(HAS_HORNS, false); + pBuilder.define(HAS_SPIKES, false); + pBuilder.define(HAS_WINGS, false); + pBuilder.define(PHASE, 1); + pBuilder.define(DEFENSIVE_MODE, false); + pBuilder.define(PHASE_SWAPPING, false); + pBuilder.define(IS_FLYING, false); + pBuilder.define(IS_HOWLING, false); + pBuilder.define(IS_DIVING, false); + pBuilder.define(IS_RAMMING, false); + pBuilder.define(RAM_PREP, false); } public boolean isFlying() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java index 4ec362ff63..06067dcd0b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java @@ -17,11 +17,10 @@ import net.minecraft.world.phys.AABB; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.Tags; -import net.neoforged.neoforge.event.entity.player.EntityItemPickupEvent; import net.neoforged.neoforge.items.wrapper.PlayerMainInvWrapper; import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/FollowSummonerGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/FollowSummonerGoal.java index 4c42fc9c48..2da3db25de 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/FollowSummonerGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/FollowSummonerGoal.java @@ -12,7 +12,8 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.pathfinder.BlockPathTypes; +import net.minecraft.world.level.pathfinder.PathType; +import net.minecraft.world.level.pathfinder.PathType; import java.util.EnumSet; @@ -76,8 +77,8 @@ public boolean canContinueToUse() { public void start() { this.timeToRecalcPath = 0; - this.oldWaterCost = this.summon.getSelfEntity().getPathfindingMalus(BlockPathTypes.WATER); - this.summon.getSelfEntity().setPathfindingMalus(BlockPathTypes.WATER, 0.0F); + this.oldWaterCost = this.summon.getSelfEntity().getPathfindingMalus(PathType.WATER); + this.summon.getSelfEntity().setPathfindingMalus(PathType.WATER, 0.0F); } /** @@ -86,7 +87,7 @@ public void start() { public void stop() { this.navigator.stop(); - this.summon.getSelfEntity().setPathfindingMalus(BlockPathTypes.WATER, this.oldWaterCost); + this.summon.getSelfEntity().setPathfindingMalus(PathType.WATER, this.oldWaterCost); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/ConvertBuddingGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/ConvertBuddingGoal.java index 73c6bcb2f6..75e1588143 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/ConvertBuddingGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/ConvertBuddingGoal.java @@ -1,15 +1,14 @@ package com.hollingsworth.arsnouveau.common.entity.goal.amethyst_golem; -import com.hollingsworth.arsnouveau.api.recipe.BuddingConversionRecipe; import com.hollingsworth.arsnouveau.api.util.BlockUtil; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; +import com.hollingsworth.arsnouveau.common.crafting.recipes.BuddingConversionRecipe; import com.hollingsworth.arsnouveau.common.entity.AmethystGolem; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.level.block.state.BlockState; -import java.util.List; import java.util.Optional; import java.util.function.Supplier; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/whirlisprig/FollowPlayerGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/whirlisprig/FollowPlayerGoal.java index 3d41a9e530..b6a8e714e4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/whirlisprig/FollowPlayerGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/whirlisprig/FollowPlayerGoal.java @@ -6,7 +6,7 @@ import net.minecraft.world.entity.ai.navigation.GroundPathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.pathfinder.BlockPathTypes; +import net.minecraft.world.level.pathfinder.PathType; import java.util.EnumSet; import java.util.List; @@ -74,8 +74,8 @@ public boolean canContinueToUse() { */ public void start() { this.timeToRecalcPath = 0; - this.oldWaterCost = this.entity.getPathfindingMalus(BlockPathTypes.WATER); - this.entity.setPathfindingMalus(BlockPathTypes.WATER, 0.0F); + this.oldWaterCost = this.entity.getPathfindingMalus(PathType.WATER); + this.entity.setPathfindingMalus(PathType.WATER, 0.0F); } /** @@ -84,7 +84,7 @@ public void start() { public void stop() { this.followingEntity = null; this.navigation.stop(); - this.entity.setPathfindingMalus(BlockPathTypes.WATER, this.oldWaterCost); + this.entity.setPathfindingMalus(PathType.WATER, this.oldWaterCost); } /** diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/MovementHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/MovementHandler.java index 38954755d2..d2d1564517 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/MovementHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/MovementHandler.java @@ -11,7 +11,7 @@ import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.pathfinder.BlockPathTypes; +import net.minecraft.world.level.pathfinder.PathType; import net.minecraft.world.level.pathfinder.NodeEvaluator; import net.minecraft.world.phys.shapes.VoxelShape; @@ -56,7 +56,7 @@ public void tick() { if (nodeprocessor.getBlockPathType(this.mob.level, Mth.floor(this.mob.getX() + (double) rot1), Mth.floor(this.mob.getY()), - Mth.floor(this.mob.getZ() + (double) rot2)) != BlockPathTypes.WALKABLE) { + Mth.floor(this.mob.getZ() + (double) rot2)) != PathType.WALKABLE) { this.strafeForwards = 1.0F; this.strafeRight = 0.0F; speed = speedAtt; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/SimpleStateMachine.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/SimpleStateMachine.java index 1771760332..959bc449f4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/SimpleStateMachine.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/SimpleStateMachine.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.entity.statemachine; import com.hollingsworth.arsnouveau.common.util.Log; -import net.minecraftforge.fml.loading.FMLEnvironment; +import net.neoforged.fml.loading.FMLEnvironment; import javax.annotation.Nonnull; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/starbuncle/DepositItemState.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/starbuncle/DepositItemState.java index 651a87844f..2cc7485b6e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/starbuncle/DepositItemState.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/starbuncle/DepositItemState.java @@ -11,8 +11,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.ItemHandlerHelper; public class DepositItemState extends TravelToPosState { public DepositItemState(Starbuncle starbuncle, StarbyTransportBehavior behavior, BlockPos target) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/starbuncle/TakeItemState.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/starbuncle/TakeItemState.java index 6aab75f389..baa261c41b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/starbuncle/TakeItemState.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/starbuncle/TakeItemState.java @@ -12,7 +12,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.items.IItemHandler; +import net.neoforged.neoforge.items.IItemHandler; + public class TakeItemState extends TravelToPosState{ public TakeItemState(Starbuncle starbuncle, StarbyTransportBehavior behavior, BlockPos target) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index 9ca235616a..48c9cbf033 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -7,7 +7,6 @@ import com.hollingsworth.arsnouveau.api.event.ITimedEvent; import com.hollingsworth.arsnouveau.api.loot.DungeonLootTables; import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; -import com.hollingsworth.arsnouveau.api.recipe.DispelEntityRecipe; import com.hollingsworth.arsnouveau.api.recipe.MultiRecipeWrapper; import com.hollingsworth.arsnouveau.api.registry.BuddingConversionRegistry; import com.hollingsworth.arsnouveau.api.registry.CasterTomeRegistry; @@ -22,6 +21,7 @@ import com.hollingsworth.arsnouveau.common.block.LavaLily; import com.hollingsworth.arsnouveau.common.command.*; import com.hollingsworth.arsnouveau.common.compat.CaelusHandler; +import com.hollingsworth.arsnouveau.common.crafting.recipes.DispelEntityRecipe; import com.hollingsworth.arsnouveau.common.datagen.ItemTagProvider; import com.hollingsworth.arsnouveau.common.entity.Whirlisprig; import com.hollingsworth.arsnouveau.common.entity.debug.FixedStack; @@ -43,6 +43,7 @@ import com.hollingsworth.arsnouveau.setup.registry.*; import com.hollingsworth.arsnouveau.setup.reward.Rewards; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import net.minecraft.core.Holder; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -422,7 +423,8 @@ public static void onPotionAdd(MobEffectEvent.Added event) { if (target.level.isClientSide) return; double bonus = 0.0; - MobEffect effect = event.getEffectInstance().getEffect().value(); + Holder holder = event.getEffectInstance().getEffect(); + MobEffect effect = holder.value(); if (effect.isBeneficial()) { bonus = PerkUtil.valueOrZero(target, PerkAttributes.WIXIE.get()); } else if (applier instanceof LivingEntity living) { @@ -433,12 +435,9 @@ public static void onPotionAdd(MobEffectEvent.Added event) { event.getEffectInstance().duration = (int) (event.getEffectInstance().duration * bonus); } - ForgeRegistries.MOB_EFFECTS.getHolder(effect).ifPresent(holder -> { - if (holder.is(PotionEffectTags.TO_SYNC)) { - Networking.sendToNearby(target.level(), target, new PotionSyncPacket(target.getId(), effect, event.getEffectInstance().getDuration())); - } - }); - + if(holder.is(PotionEffectTags.TO_SYNC)){ + Networking.sendToNearby(target.level(), target, new PotionSyncPacket(target.getId(), effect, event.getEffectInstance().getDuration())); + } } @SubscribeEvent @@ -454,12 +453,11 @@ public static void onPotionExpire(MobEffectEvent.Expired event) { private static void syncPotionRemoval(MobEffectEvent event) { if (event.getEntity() instanceof LivingEntity && event.getEffectInstance() != null && !event.getEntity().level.isClientSide) { LivingEntity target = event.getEntity(); - MobEffect effect = event.getEffectInstance().getEffect().value(); - ForgeRegistries.MOB_EFFECTS.getHolder(effect).ifPresent(holder -> { - if (holder.is(PotionEffectTags.TO_SYNC)) { - Networking.sendToNearby(target.level(), target, new PotionSyncPacket(target.getId(), effect, -1)); - } - }); + Holder holder = event.getEffectInstance().getEffect(); + MobEffect effect = holder.value(); + if(holder.is(PotionEffectTags.TO_SYNC)){ + Networking.sendToNearby(target.level(), target, new PotionSyncPacket(target.getId(), effect, -1)); + } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/FamiliarEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/FamiliarEvents.java index 1715057a93..6e177b4651 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/FamiliarEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/FamiliarEvents.java @@ -8,14 +8,13 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.event.entity.living.*; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.living.LivingEntityUseItemEvent; import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; import net.neoforged.neoforge.event.entity.living.LivingKnockBackEvent; -import net.neoforged.neoforge.event.entity.living.LootingLevelEvent; import net.neoforged.neoforge.event.entity.living.MobEffectEvent; + import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/JarEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/JarEvents.java index 040c183c3d..198dba891d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/JarEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/JarEvents.java @@ -12,7 +12,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.LevelAccessor; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.EntityMountEvent; import net.neoforged.neoforge.event.level.NoteBlockEvent; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/LightEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/LightEvents.java index 234232556c..c975955fe7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/LightEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/LightEvents.java @@ -8,9 +8,10 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; - +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.tick.PlayerTickEvent; import net.neoforged.neoforge.network.PacketDistributor; + import java.util.ArrayList; import java.util.List; @@ -18,12 +19,12 @@ public class LightEvents { @SubscribeEvent - public static void onTick(TickEvent.PlayerTickEvent e) { - if (e.player.level.isClientSide) + public static void onTick(PlayerTickEvent.Post e) { + if (e.getEntity().level.isClientSide) return; - if (e.player.level.getGameTime() % 100 == 0 && e.player.getServer() != null && e.phase == TickEvent.Phase.END && e.player instanceof ServerPlayer serverPlayer) { + if (e.getEntity().level.getGameTime() % 100 == 0 && e.getEntity().getServer() != null && e.getEntity() instanceof ServerPlayer serverPlayer) { List litID = new ArrayList<>(); - for (ServerPlayer player : e.player.getServer().getPlayerList().getPlayers()) { + for (ServerPlayer player : serverPlayer.getServer().getPlayerList().getPlayers()) { NonNullList list = player.inventory.items; for (int i = 0; i < 9; i++) { ItemStack jar = list.get(i); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java index 23aca871bf..e53ba9e0b6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java @@ -3,16 +3,16 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.mana.IManaCap; import com.hollingsworth.arsnouveau.api.util.ManaUtil; -import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketUpdateMana; import com.hollingsworth.arsnouveau.setup.config.ServerConfig; +import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; - +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.event.tick.PlayerTickEvent; import net.neoforged.neoforge.network.PacketDistributor; @@ -21,25 +21,26 @@ public class ManaCapEvents { public static double MEAN_TPS = 20.0; @SubscribeEvent - public static void playerOnTick(TickEvent.PlayerTickEvent e) { - if (e.player.getCommandSenderWorld().isClientSide || e.player.getCommandSenderWorld().getGameTime() % ServerConfig.REGEN_INTERVAL.get() != 0) + public static void playerOnTick(PlayerTickEvent.Pre e) { + Player player = e.getEntity(); + if (player.getCommandSenderWorld().isClientSide || player.getCommandSenderWorld().getGameTime() % ServerConfig.REGEN_INTERVAL.get() != 0) return; - IManaCap mana = CapabilityRegistry.getMana(e.player).orElse(null); + IManaCap mana = CapabilityRegistry.getMana(player).orElse(null); if (mana == null) return; // Force sync mana to client because client caps vanish on world change - boolean shouldIgnoreMax = e.player.level().getGameTime() % 60 == 0; + boolean shouldIgnoreMax = player.level().getGameTime() % 60 == 0; if (mana.getCurrentMana() != mana.getMaxMana() || shouldIgnoreMax) { - double regenPerSecond = ManaUtil.getManaRegen(e.player) / Math.max(1, ((int) MEAN_TPS / ServerConfig.REGEN_INTERVAL.get())); + double regenPerSecond = ManaUtil.getManaRegen(player) / Math.max(1, ((int) MEAN_TPS / ServerConfig.REGEN_INTERVAL.get())); mana.addMana(regenPerSecond); - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) e.player), new PacketUpdateMana(mana.getCurrentMana(), mana.getMaxMana(), mana.getGlyphBonus(), mana.getBookTier())); + Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new PacketUpdateMana(mana.getCurrentMana(), mana.getMaxMana(), mana.getGlyphBonus(), mana.getBookTier())); } - ManaUtil.Mana maxmana = ManaUtil.calcMaxMana(e.player); + ManaUtil.Mana maxmana = ManaUtil.calcMaxMana(player); int max = maxmana.getRealMax(); if (mana.getMaxMana() != max || shouldIgnoreMax) { mana.setMaxMana(max); - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) e.player), new PacketUpdateMana(mana.getCurrentMana(), mana.getMaxMana(), mana.getGlyphBonus(), mana.getBookTier(), maxmana.Reserve())); + Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new PacketUpdateMana(mana.getCurrentMana(), mana.getMaxMana(), mana.getGlyphBonus(), mana.getBookTier(), maxmana.Reserve())); } } @@ -53,12 +54,14 @@ public static void playerClone(PlayerEvent.Clone e) { if (e.getOriginal().level.isClientSide) return; - CapabilityRegistry.getMana(e.getEntity()).ifPresent(newMana -> CapabilityRegistry.getMana(e.getOriginal()).ifPresent(origMana -> { + var newMana = CapabilityRegistry.getMana(e.getEntity()).orElse(null); + var origMana = CapabilityRegistry.getMana(e.getOriginal()).orElse(null); + if(newMana != null && origMana != null){ newMana.setMaxMana(origMana.getMaxMana()); newMana.setGlyphBonus(origMana.getGlyphBonus()); newMana.setBookTier(origMana.getBookTier()); Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) e.getEntity()), new PacketUpdateMana(newMana.getCurrentMana(), newMana.getMaxMana(), newMana.getGlyphBonus(), newMana.getBookTier())); - })); + } } @SubscribeEvent @@ -73,23 +76,25 @@ public static void playerChangeDimension(PlayerEvent.PlayerChangedDimensionEvent public static void syncPlayerEvent(Player playerEntity) { if (playerEntity instanceof ServerPlayer) { - CapabilityRegistry.getMana(playerEntity).ifPresent(mana -> { + var mana = CapabilityRegistry.getMana(playerEntity).orElse(null); + if (mana != null) { var manaCalc = ManaUtil.calcMaxMana(playerEntity); mana.setMaxMana(manaCalc.getRealMax()); mana.setGlyphBonus(mana.getGlyphBonus()); mana.setBookTier(mana.getBookTier()); Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) playerEntity), new PacketUpdateMana(mana.getCurrentMana(), mana.getMaxMana(), mana.getGlyphBonus(), mana.getBookTier(), manaCalc.Reserve())); - }); + } } } @SubscribeEvent - public static void onTick(TickEvent.PlayerTickEvent e) { - if (e.player.level.isClientSide) + public static void onTick(PlayerTickEvent.Post e) { + var player = e.getEntity(); + if (player.level.isClientSide) return; - if (e.player.level.getGameTime() % 600 == 0 && e.player.getServer() != null) { + if (player.level.getGameTime() % 600 == 0 && player.getServer() != null) { - double meanTickTime = mean(e.player.getServer().tickTimes) * 1.0E-6D; + double meanTickTime = mean(player.getServer().getTickTime(player.level.dimension())) * 1.0E-6D; double meanTPS = Math.min(1000.0 / meanTickTime, 20); ManaCapEvents.MEAN_TPS = Math.max(1, meanTPS); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java index 747d911a1f..eeef68116c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java @@ -20,10 +20,11 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.living.LivingDeathEvent; import net.neoforged.neoforge.event.entity.living.LivingEquipmentChangeEvent; import net.neoforged.neoforge.event.level.SleepFinishedTimeEvent; + import java.util.ArrayList; import java.util.List; @@ -33,7 +34,7 @@ public class PerkEvents { @SubscribeEvent public static void equipmentChangedEvent(final LivingEquipmentChangeEvent event) { if (!event.getEntity().level.isClientSide) { - if (event.getSlot().getType() != EquipmentSlot.Type.ARMOR) + if (event.getSlot().getType() != EquipmentSlot.Type.HUMANOID_ARMOR) return; List perkInstances = PerkUtil.getPerksFromItem(event.getFrom()); List toInstances = PerkUtil.getPerksFromItem(event.getTo()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java index a13c15625e..01ba45fb70 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java @@ -1,16 +1,16 @@ package com.hollingsworth.arsnouveau.common.event; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketReactiveSpell; import com.hollingsworth.arsnouveau.common.spell.casters.ReactiveCaster; +import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; import net.neoforged.neoforge.event.entity.player.AttackEntityEvent; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; @@ -30,7 +30,7 @@ public static void livingHitEvent(LivingHurtEvent e) { } public static void castSpell(LivingEntity playerIn, ItemStack s) { - if (s.getEnchantmentLevel(EnchantmentRegistry.REACTIVE_ENCHANTMENT.get()) * .25 >= Math.random() && new ReactiveCaster(s).getSpell().isValid()) { + if (s.getEnchantmentLevel(EnchantmentRegistry.REACTIVE_ENCHANTMENT) * .25 >= Math.random() && new ReactiveCaster(s).getSpell().isValid()) { ReactiveCaster reactiveCaster = new ReactiveCaster(s); reactiveCaster.castSpell(playerIn.getCommandSenderWorld(), playerIn, InteractionHand.MAIN_HAND, null); } @@ -59,7 +59,7 @@ public static void playerAttackEntity(AttackEntityEvent e) { @SubscribeEvent public static void leftClickAir(PlayerInteractEvent.LeftClickEmpty e) { - if (e.getItemStack().getEnchantmentLevel(EnchantmentRegistry.REACTIVE_ENCHANTMENT.get()) > 0) + if (e.getItemStack().getEnchantmentLevel(EnchantmentRegistry.REACTIVE_ENCHANTMENT) > 0) Networking.INSTANCE.sendToServer(new PacketReactiveSpell()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ScryEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ScryEvents.java index afb5e224a0..d75a96592c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ScryEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ScryEvents.java @@ -4,10 +4,10 @@ import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; import com.hollingsworth.arsnouveau.api.scrying.IScryer; import com.hollingsworth.arsnouveau.client.ClientInfo; +import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.client.particle.GlowParticleData; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; -import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketGetPersistentData; import com.hollingsworth.arsnouveau.setup.registry.ModPotions; @@ -25,11 +25,12 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.LogicalSide; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.RenderLevelStageEvent; - import net.neoforged.neoforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent; +import net.neoforged.neoforge.event.tick.PlayerTickEvent; import net.neoforged.neoforge.network.PacketDistributor; + import java.util.ArrayList; import java.util.List; @@ -44,7 +45,7 @@ public static void playerLoginEvent(final PlayerLoggedInEvent event) { } @SubscribeEvent - public static void playerTickEvent(final TickEvent.PlayerTickEvent event) { + public static void playerTickEvent(final PlayerTickEvent event) { if (event.side == LogicalSide.CLIENT && event.phase == TickEvent.Phase.END && event.player.getEffect(ModPotions.SCRYING_EFFECT.get()) != null && ClientInfo.ticksInGame % 30 == 0) { List scryingPos = new ArrayList<>(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java index df9e373735..714e5ef9ba 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java @@ -14,7 +14,6 @@ import com.hollingsworth.arsnouveau.common.util.PortUtil; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.BlockPos; -import net.minecraft.core.BlockSourceImpl; import net.minecraft.core.Direction; import net.minecraft.core.Position; import net.minecraft.nbt.CompoundTag; @@ -168,14 +167,13 @@ public InteractionResultHolder castSpell(Level worldIn, LivingEntity return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); } - BlockSourceImpl blockSource = new BlockSourceImpl((ServerLevel) worldIn, scryPos); Position position; Direction direction = castingAtState.getValue(ScryerCrystal.FACING); // Target the block the crystal is facing if the spell is a touch spell. if(spell.getCastMethod() instanceof MethodTouch){ - position = BasicSpellTurret.getDispensePosition(blockSource); + position = BasicSpellTurret.getDispensePosition(scryPos, direction); }else{ - position = ScryerCrystal.getDispensePosition( new BlockSourceImpl((ServerLevel) worldIn, scryPos), direction); + position = ScryerCrystal.getDispensePosition(scryPos, direction); } behavior.onCast(resolver, (ServerLevel) worldIn, scryPos, player, diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAnimalSummoning.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAnimalSummoning.java index c5f43e148c..d690c6f7b2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAnimalSummoning.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAnimalSummoning.java @@ -1,8 +1,8 @@ package com.hollingsworth.arsnouveau.common.ritual; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.recipe.SummonRitualRecipe; import com.hollingsworth.arsnouveau.api.ritual.AbstractRitual; +import com.hollingsworth.arsnouveau.common.crafting.recipes.SummonRitualRecipe; import com.hollingsworth.arsnouveau.common.lib.EntityTags; import com.hollingsworth.arsnouveau.common.lib.RitualLib; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualFlight.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualFlight.java index a1700c73af..d0bebee5fe 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualFlight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualFlight.java @@ -6,6 +6,7 @@ import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketUpdateFlight; import com.hollingsworth.arsnouveau.setup.registry.ModPotions; +import net.minecraft.core.Holder; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.effect.MobEffect; @@ -13,8 +14,8 @@ public class RitualFlight extends RangeEffectRitual { @Override - public MobEffect getEffect() { - return ModPotions.FLIGHT_EFFECT.get(); + public Holder getEffect() { + return ModPotions.FLIGHT_EFFECT; } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualGravity.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualGravity.java index 37c652dadb..d741ff3aeb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualGravity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualGravity.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.api.ritual.RangeEffectRitual; import com.hollingsworth.arsnouveau.common.lib.RitualLib; import com.hollingsworth.arsnouveau.setup.registry.ModPotions; +import net.minecraft.core.Holder; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.effect.MobEffect; @@ -12,8 +13,8 @@ public class RitualGravity extends RangeEffectRitual { public static int renewThreshold = 10 * 20; @Override - public MobEffect getEffect() { - return ModPotions.GRAVITY_EFFECT.get(); + public Holder getEffect() { + return ModPotions.GRAVITY_EFFECT; } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java index f569194fd3..3849708ae1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java @@ -1,7 +1,6 @@ package com.hollingsworth.arsnouveau.common.ritual; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.recipe.ScryRitualRecipe; import com.hollingsworth.arsnouveau.api.registry.ScryRitualRegistry; import com.hollingsworth.arsnouveau.api.ritual.AbstractRitual; import com.hollingsworth.arsnouveau.api.scrying.IScryer; @@ -9,20 +8,18 @@ import com.hollingsworth.arsnouveau.api.scrying.TagScryer; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; -import com.hollingsworth.arsnouveau.common.items.ManipulationEssence; +import com.hollingsworth.arsnouveau.common.crafting.recipes.ScryRitualRecipe; import com.hollingsworth.arsnouveau.common.lib.RitualLib; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketGetPersistentData; -import com.hollingsworth.arsnouveau.common.util.RegistryWrapper; -import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.AABB; import net.neoforged.neoforge.network.PacketDistributor; @@ -32,7 +29,6 @@ import java.util.Optional; public class RitualScrying extends AbstractRitual { - private RegistryWrapper MANIPULATION_ESSENCE = ItemsRegistry.MANIPULATION_ESSENCE; @Override protected void tick() { @@ -44,8 +40,8 @@ protected void tick() { if (!getWorld().isClientSide && getProgress() >= 15) { List players = getWorld().getEntitiesOfClass(ServerPlayer.class, new AABB(getPos()).inflate(5.0)); if (!players.isEmpty()) { - ItemStack item = getConsumedItems().stream().filter(i -> i.getItem() != MANIPULATION_ESSENCE.get()).findFirst().orElse(ItemStack.EMPTY); - int modifier = didConsumeItem(MANIPULATION_ESSENCE.get()) ? 3 : 1; + ItemStack item = getConsumedItems().stream().filter(i -> i.getItem() != ItemsRegistry.MANIPULATION_ESSENCE.get()).findFirst().orElse(ItemStack.EMPTY); + int modifier = didConsumeItem(ItemsRegistry.MANIPULATION_ESSENCE.get()) ? 3 : 1; for (ServerPlayer playerEntity : players) { Optional hasRecipe = ScryRitualRegistry.getRecipes().stream().filter(recipe -> recipe.matches(item)).findFirst(); IScryer scryer = null; @@ -66,7 +62,7 @@ public ResourceLocation getRegistryName() { } public static void grantScrying(ServerPlayer playerEntity, int ticks, IScryer scryer) { - playerEntity.addEffect(new MobEffectInstance(ModPotions.SCRYING_EFFECT.get(), ticks)); + playerEntity.addEffect(new MobEffectInstance(ModPotions.SCRYING_EFFECT, ticks)); CompoundTag tag = playerEntity.getPersistentData().getCompound(Player.PERSISTED_NBT_TAG); tag.put("an_scryer", scryer.toTag(new CompoundTag())); playerEntity.getPersistentData().put(Player.PERSISTED_NBT_TAG, tag); @@ -80,8 +76,8 @@ public boolean canStart(@Nullable Player player) { @Override public boolean canConsumeItem(ItemStack stack) { - boolean hasExtended = didConsumeItem(MANIPULATION_ESSENCE.get()); - if (!hasExtended && stack.getItem() == MANIPULATION_ESSENCE.get()) return true; + boolean hasExtended = didConsumeItem(ItemsRegistry.MANIPULATION_ESSENCE.get()); + if (!hasExtended && stack.getItem() == ItemsRegistry.MANIPULATION_ESSENCE.get()) return true; boolean hasConsumedAugment = getConsumedItems().size() - (hasExtended ? 1 : 0) > 0; if (!hasConsumedAugment) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java index 433e265ca2..9935b7b76c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java @@ -9,6 +9,7 @@ import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.mojang.authlib.GameProfile; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; @@ -45,12 +46,12 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul if (entity instanceof Mob mob) { mob.setPersistenceRequired(); } else if (entity instanceof ItemEntity item) { - item.getItem().setHoverName(newName); + item.getItem().set(DataComponents.CUSTOM_NAME, newName); } if(shooter instanceof Player player && isRealPlayer(shooter) && player.equals(entity)){ ItemStack offhand = player.getOffhandItem(); - offhand.setHoverName(newName); + offhand.set(DataComponents.CUSTOM_NAME, newName); } } @@ -95,7 +96,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull if (entity instanceof Mob mob) { mob.setPersistenceRequired(); } else if (entity instanceof ItemEntity item) { - item.getItem().setHoverName(name); + item.getItem().set(DataComponents.CUSTOM_NAME, name); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java index 5f7af5fd4c..b3cf3c0850 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java @@ -36,7 +36,6 @@ import net.minecraft.world.level.material.MapColor; import net.minecraft.world.level.material.PushReaction; import net.neoforged.neoforge.registries.DeferredRegister; -import top.theillusivec4.caelus.common.registry.RegistryObject; import java.util.HashMap; import java.util.Map; @@ -53,7 +52,7 @@ public class BlockRegistry { public static final DeferredRegister BLOCKS = DeferredRegister.create(BuiltInRegistries.BLOCK, ArsNouveau.MODID); public static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create(BuiltInRegistries.BLOCK_ENTITY_TYPE, ArsNouveau.MODID); public static final DeferredRegister> BS_PROVIDERS = DeferredRegister.create(BuiltInRegistries.BLOCKSTATE_PROVIDER_TYPE, ArsNouveau.MODID); - public static final RegistryObject> stateProviderType = BS_PROVIDERS.register(LibBlockNames.STATE_PROVIDER, () -> new BlockStateProviderType<>(SupplierBlockStateProvider.CODEC)); + public static final DeferredRegister> stateProviderType = BS_PROVIDERS.register(LibBlockNames.STATE_PROVIDER, () -> new BlockStateProviderType<>(SupplierBlockStateProvider.CODEC)); public static BlockBehaviour.Properties LOG_PROP = BlockBehaviour.Properties.of().mapColor(MapColor.WOOD).strength(2.0F, 3.0F).ignitedByLava().sound(SoundType.WOOD); public static BlockBehaviour.Properties SAP_PROP = BlockBehaviour.Properties.of().noCollission().randomTicks().instabreak().sound(SoundType.GRASS).pushReaction(PushReaction.DESTROY); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java index 0133491ea1..5efde1afc6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java @@ -1,13 +1,7 @@ package com.hollingsworth.arsnouveau.setup.registry; import com.hollingsworth.arsnouveau.api.enchanting_apparatus.*; -import com.hollingsworth.arsnouveau.api.event.ChimeraSummonEvent; -import com.hollingsworth.arsnouveau.api.recipe.BuddingConversionRecipe; -import com.hollingsworth.arsnouveau.api.recipe.DispelEntityRecipe; -import com.hollingsworth.arsnouveau.api.recipe.ScryRitualRecipe; -import com.hollingsworth.arsnouveau.api.recipe.SummonRitualRecipe; import com.hollingsworth.arsnouveau.common.crafting.recipes.*; -import com.hollingsworth.arsnouveau.common.tomes.CasterTomeData; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeSerializer; @@ -39,6 +33,8 @@ public class RecipeRegistry { public static final String BUDDING_CONVERSION_RECIPE_ID = "budding_conversion"; public static final String DISPEL_ENTITY_RECIPE_ID = "dispel_entity"; public static final String SCRY_RITUAL_RECIPE_ID = "scry_ritual"; + public static final String BOOK_UPGRADE_RECIPE_ID = "book_upgrade"; + public static final String POTION_FLASK_RECIPE_ID = "potion_flask"; public static final DeferredHolder, ModRecipeType> APPARATUS_TYPE = RECIPE_TYPES.register(ENCHANTING_APPARATUS_RECIPE_ID, () -> new ModRecipeType<>()); public static final DeferredHolder, EnchantingApparatusRecipe.Serializer> APPARATUS_SERIALIZER = RECIPE_SERIALIZERS.register(ENCHANTING_APPARATUS_RECIPE_ID, () -> new EnchantingApparatusRecipe.Serializer()); @@ -53,15 +49,15 @@ public class RecipeRegistry { public static final DeferredHolder, ImbuementRecipe.Serializer> IMBUEMENT_SERIALIZER = RECIPE_SERIALIZERS.register(IMBUEMENT_RECIPE_ID, () -> new ImbuementRecipe.Serializer()); - public static final DeferredHolder, ModRecipeType> BOOK_UPGRADE_TYPE = RECIPE_TYPES.register("book_upgrade", () -> new ModRecipeType<>()); - public static final DeferredHolder, BookUpgradeRecipe.Serializer> BOOK_UPGRADE_RECIPE = RECIPE_SERIALIZERS.register("book_upgrade", () -> new BookUpgradeRecipe.Serializer()); + public static final DeferredHolder, ModRecipeType> BOOK_UPGRADE_TYPE = RECIPE_TYPES.register(BOOK_UPGRADE_RECIPE_ID, () -> new ModRecipeType<>()); + public static final DeferredHolder, RecipeSerializer> BOOK_UPGRADE_RECIPE = RECIPE_SERIALIZERS.register(BOOK_UPGRADE_RECIPE_ID, () -> ExtendableShapelessSerializer.create(BookUpgradeRecipe::new)); - public static final DeferredHolder, ModRecipeType> POTION_FLASK_TYPE = RECIPE_TYPES.register("potion_flask", () -> new ModRecipeType<>()); - public static final DeferredHolder, PotionFlaskRecipe.Serializer> POTION_FLASK_RECIPE = RECIPE_SERIALIZERS.register("potion_flask", () -> new PotionFlaskRecipe.Serializer()); + public static final DeferredHolder, ModRecipeType> POTION_FLASK_TYPE = RECIPE_TYPES.register(POTION_FLASK_RECIPE_ID, () -> new ModRecipeType<>()); + public static final DeferredHolder, RecipeSerializer> POTION_FLASK_RECIPE = RECIPE_SERIALIZERS.register(POTION_FLASK_RECIPE_ID, () -> ExtendableShapelessSerializer.create(PotionFlaskRecipe::new)); public static final DeferredHolder, ModRecipeType> DYE_TYPE = RECIPE_TYPES.register(DYE_RECIPE_ID, () -> new ModRecipeType<>()); - public static final DeferredHolder, DyeRecipe.Serializer> DYE_RECIPE = RECIPE_SERIALIZERS.register(DYE_RECIPE_ID, () -> new DyeRecipe.Serializer()); + public static final DeferredHolder, RecipeSerializer> DYE_RECIPE = RECIPE_SERIALIZERS.register(DYE_RECIPE_ID, () -> ExtendableShapelessSerializer.create(DyeRecipe::new)); public static final DeferredHolder, ModRecipeType> REACTIVE_TYPE = RECIPE_TYPES.register(REACTIVE_RECIPE_ID, () -> new ModRecipeType<>()); From 76587d05c18200b282bd95cc9cfd57c833d7e8ee Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 23 Jun 2024 19:12:02 -0500 Subject: [PATCH 011/363] generic spaghetti --- .../arsnouveau/api/ArsNouveauAPI.java | 2 +- .../EnchantingApparatusRecipe.java | 261 ------------------ .../EnchantmentRecipe.java | 187 ------------- .../IEnchantingRecipe.java | 25 -- .../ApparatusEnchantingRecipeCategory.java | 6 +- .../jei/ArmorUpgradeRecipeCategory.java | 2 +- .../EnchantingApparatusRecipeCategory.java | 2 +- .../client/jei/JEIArsNouveauPlugin.java | 8 +- .../client/patchouli/ApparatusProcessor.java | 2 +- .../patchouli/EnchantmentProcessor.java | 2 +- .../patchouli/NoOutputApparatusProcessor.java | 4 +- .../component/RotatingItemListComponent.java | 4 +- .../block/EnchantingApparatusBlock.java | 5 +- .../block/tile/EnchantingApparatusTile.java | 20 +- .../EnchantingApparatusManager.java | 2 +- .../recipes/ApparatusRecipeInput.java | 30 ++ .../crafting/recipes}/ArmorUpgradeRecipe.java | 6 +- .../crafting/recipes/CasterTomeData.java | 37 +-- .../recipes/EnchantingApparatusRecipe.java | 150 ++++++++++ .../crafting/recipes/EnchantmentRecipe.java | 148 ++++++++++ .../crafting/recipes/IEnchantingRecipe.java | 33 +++ .../crafting/recipes}/ITextOutput.java | 2 +- .../crafting/recipes/ImbuementRecipe.java | 1 - .../recipes}/ReactiveEnchantmentRecipe.java | 12 +- .../common/crafting/recipes/Serializers.java | 13 + .../crafting/recipes}/SpellWriteRecipe.java | 12 +- .../crafting/recipes/SummonRitualRecipe.java | 1 - .../datagen/ApparatusRecipeBuilder.java | 58 ++-- .../datagen/ApparatusRecipeProvider.java | 42 +-- .../common/datagen/BlockStatesDatagen.java | 5 - .../common/datagen/CasterTomeProvider.java | 29 +- .../common/datagen/ItemModelGenerator.java | 10 +- .../common/datagen/SummonRitualProvider.java | 30 +- .../setup/registry/RecipeRegistry.java | 1 - 34 files changed, 533 insertions(+), 619 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantingApparatusRecipe.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/IEnchantingRecipe.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ApparatusRecipeInput.java rename src/main/java/com/hollingsworth/arsnouveau/{api/enchanting_apparatus => common/crafting/recipes}/ArmorUpgradeRecipe.java (96%) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantingApparatusRecipe.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantmentRecipe.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/IEnchantingRecipe.java rename src/main/java/com/hollingsworth/arsnouveau/{api/enchanting_apparatus => common/crafting/recipes}/ITextOutput.java (76%) rename src/main/java/com/hollingsworth/arsnouveau/{api/enchanting_apparatus => common/crafting/recipes}/ReactiveEnchantmentRecipe.java (90%) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/Serializers.java rename src/main/java/com/hollingsworth/arsnouveau/{api/enchanting_apparatus => common/crafting/recipes}/SpellWriteRecipe.java (93%) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/ArsNouveauAPI.java b/src/main/java/com/hollingsworth/arsnouveau/api/ArsNouveauAPI.java index 72196dec92..9c17a06670 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/ArsNouveauAPI.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/ArsNouveauAPI.java @@ -1,10 +1,10 @@ package com.hollingsworth.arsnouveau.api; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.IEnchantingRecipe; import com.hollingsworth.arsnouveau.api.recipe.PotionIngredient; import com.hollingsworth.arsnouveau.api.scrying.IScryer; import com.hollingsworth.arsnouveau.api.spell.ISpellValidator; +import com.hollingsworth.arsnouveau.common.crafting.recipes.IEnchantingRecipe; import com.hollingsworth.arsnouveau.common.mixin.PotionRecipeMixin; import com.hollingsworth.arsnouveau.common.spell.validation.StandardSpellValidator; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantingApparatusRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantingApparatusRecipe.java deleted file mode 100644 index 2fc19389da..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantingApparatusRecipe.java +++ /dev/null @@ -1,261 +0,0 @@ -package com.hollingsworth.arsnouveau.api.enchanting_apparatus; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.common.block.tile.EnchantingApparatusTile; -import com.hollingsworth.arsnouveau.common.util.Log; -import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.player.StackedContents; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.world.item.crafting.ShapedRecipe; -import net.minecraft.world.level.Level; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; - -import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; - -public class EnchantingApparatusRecipe implements IEnchantingRecipe { - - public Ingredient reagent; // Used in the arcane pedestal - public ItemStack result; // Result item - public List pedestalItems; // Items part of the recipe - public ResourceLocation id; - public int sourceCost; - public boolean keepNbtOfReagent = false; - - - public EnchantingApparatusRecipe(ItemStack result, Ingredient reagent, List pedestalItems) { - this.reagent = reagent; - this.pedestalItems = pedestalItems; - this.result = result; - sourceCost = 0; - this.id = ArsNouveau.prefix( getRegistryName(result.getItem()).getPath()); - } - - public EnchantingApparatusRecipe(ResourceLocation id, List pedestalItems, Ingredient reagent, ItemStack result) { - this(id, pedestalItems, reagent, result, 0, false); - } - - public EnchantingApparatusRecipe(ResourceLocation id, List pedestalItems, Ingredient reagent, ItemStack result, int cost, boolean keepNbtOfReagent) { - this.reagent = reagent; - this.pedestalItems = pedestalItems; - this.result = result; - sourceCost = cost; - this.id = id; - this.keepNbtOfReagent = keepNbtOfReagent; - } - - public EnchantingApparatusRecipe() { - reagent = Ingredient.EMPTY; - result = ItemStack.EMPTY; - pedestalItems = new ArrayList<>(); - sourceCost = 0; - this.id = ArsNouveau.prefix( "empty"); - } - - public boolean excludeJei(){ - return false; - } - - @Override - public boolean isMatch(List pedestalItems, ItemStack reagent, EnchantingApparatusTile enchantingApparatusTile, @Nullable Player player) { - pedestalItems = pedestalItems.stream().filter(itemStack -> !itemStack.isEmpty()).collect(Collectors.toList()); - return doesReagentMatch(reagent) && this.pedestalItems.size() == pedestalItems.size() && doItemsMatch(pedestalItems, this.pedestalItems); - } - - public boolean doesReagentMatch(ItemStack reag) { - return this.reagent.test(reag); - } - - @Override - public ItemStack getResult(List pedestalItems, ItemStack reagent, EnchantingApparatusTile enchantingApparatusTile) { - ItemStack result = this.result.copy(); - if (keepNbtOfReagent && reagent.hasTag()) { - result.setTag(reagent.getTag()); - result.setDamageValue(0); - } - return result.copy(); - } - - - // Function to check if both arrays are same - public static boolean doItemsMatch(List inputs, List recipeItems) { - StackedContents recipeitemhelper = new StackedContents(); - for (ItemStack i : inputs) - recipeitemhelper.accountStack(i, 1); - - return inputs.size() == recipeItems.size() && (net.neoforged.neoforge.common.util.RecipeMatcher.findMatches(inputs, recipeItems) != null); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - EnchantingApparatusRecipe that = (EnchantingApparatusRecipe) o; - return Objects.equals(reagent, that.reagent) && - Objects.equals(pedestalItems, that.pedestalItems); - } - - - @Override - public int hashCode() { - return Objects.hash(reagent, pedestalItems); - } - - @Override - public String toString() { - return "EnchantingApparatusRecipe{" + - "augment=" + reagent + - ", result=" + result + - ", pedestalItems=" + pedestalItems + - '}'; - } - // TODO: 1.20 unnest item and use tag/item directly - public JsonElement asRecipe() { - JsonObject jsonobject = new JsonObject(); - jsonobject.addProperty("type", "ars_nouveau:enchanting_apparatus"); - - JsonArray pedestalArr = new JsonArray(); - for (Ingredient i : this.pedestalItems) { - pedestalArr.add(i.toJson()); - } - JsonArray reagent = new JsonArray(); - reagent.add(this.reagent.toJson()); - jsonobject.add("reagent", reagent); - - JsonObject resultObj = new JsonObject(); - resultObj.addProperty("item", getRegistryName(result.getItem()).toString()); - int count = this.result.getCount(); - if (count > 1) { - resultObj.addProperty("count", count); - } - jsonobject.add("pedestalItems", pedestalArr); - jsonobject.add("output", resultObj); - jsonobject.addProperty("sourceCost", sourceCost); - jsonobject.addProperty("keepNbtOfReagent", keepNbtOfReagent); - return jsonobject; - } - - @Override - public boolean consumesSource() { - return getSourceCost() > 0; - } - - @Override - public int getSourceCost() { - return sourceCost; - } - - @Override - public boolean matches(EnchantingApparatusTile tile, Level worldIn) { - return isMatch(tile.getPedestalItems(), tile.getStack(), tile, null); - } - - public boolean matches(EnchantingApparatusTile tile, Level worldIn, @Nullable Player playerEntity) { - return isMatch(tile.getPedestalItems(), tile.getStack(), tile, playerEntity); - } - - @Override - public ItemStack assemble(EnchantingApparatusTile p_44001_, RegistryAccess p_267165_) { - return this.result; - } - - @Override - public boolean canCraftInDimensions(int width, int height) { - return false; - } - - @Override - public ItemStack getResultItem(RegistryAccess p_267052_) { - return ItemStack.EMPTY; - } - - - @Override - public ResourceLocation getId() { - return id; - } - - @Override - public RecipeSerializer getSerializer() { - return RecipeRegistry.APPARATUS_SERIALIZER.get(); - } - - @Override - public RecipeType getType() { - return ForgeRegistries.RECIPE_TYPES.getValue(ArsNouveau.prefix( RecipeRegistry.ENCHANTING_APPARATUS_RECIPE_ID)); - } - - - public static class Serializer implements RecipeSerializer { - - private List getPedestalItems(ResourceLocation recipeId, JsonArray pedestalJson) { - return StreamSupport.stream(pedestalJson.spliterator(), true).map(el -> { - if (el instanceof JsonObject obj && (GsonHelper.isObjectNode(obj, "item") || GsonHelper.isArrayNode(obj, "item"))) { - Log.getLogger().warn("Use of deprecated recipe format in recipe ID: {}", recipeId); - return Ingredient.fromJson(obj.get("item")); - } - return Ingredient.fromJson(el); - }).collect(Collectors.toList()); - } - - @Override - public EnchantingApparatusRecipe fromJson(ResourceLocation recipeId, JsonObject json) { - Ingredient reagent = Ingredient.fromJson(GsonHelper.getAsJsonArray(json, "reagent")); - ItemStack output = ShapedRecipe.itemStackFromJson(GsonHelper.getAsJsonObject(json, "output")); - int cost = json.has("sourceCost") ? GsonHelper.getAsInt(json, "sourceCost") : 0; - boolean keepNbtOfReagent = json.has("keepNbtOfReagent") && GsonHelper.getAsBoolean(json, "keepNbtOfReagent"); - JsonArray pedestalItems = GsonHelper.getAsJsonArray(json, "pedestalItems"); - List stacks = getPedestalItems(recipeId, pedestalItems); - return new EnchantingApparatusRecipe(recipeId, stacks, reagent, output, cost, keepNbtOfReagent); - } - - @Nullable - @Override - public EnchantingApparatusRecipe fromNetwork(ResourceLocation recipeId, FriendlyByteBuf buffer) { - int length = buffer.readInt(); - Ingredient reagent = Ingredient.fromNetwork(buffer); - ItemStack output = buffer.readItem(); - List stacks = new ArrayList<>(); - - for (int i = 0; i < length; i++) { - try { - stacks.add(Ingredient.fromNetwork(buffer)); - } catch (Exception e) { - e.printStackTrace(); - break; - } - } - int cost = buffer.readInt(); - boolean keepNbtOfReagent = buffer.readBoolean(); - return new EnchantingApparatusRecipe(recipeId, stacks, reagent, output, cost, keepNbtOfReagent); - } - - @Override - public void toNetwork(FriendlyByteBuf buf, EnchantingApparatusRecipe recipe) { - buf.writeInt(recipe.pedestalItems.size()); - recipe.reagent.toNetwork(buf); - buf.writeItem(recipe.result); - for (Ingredient i : recipe.pedestalItems) { - i.toNetwork(buf); - } - buf.writeInt(recipe.sourceCost); - buf.writeBoolean(recipe.keepNbtOfReagent); - } - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java deleted file mode 100644 index 4b6b8332d9..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/EnchantmentRecipe.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.hollingsworth.arsnouveau.api.enchanting_apparatus; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.common.block.tile.EnchantingApparatusTile; -import com.hollingsworth.arsnouveau.common.util.PortUtil; -import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -import net.minecraft.core.Holder; -import net.minecraft.core.RegistryAccess; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.ItemEnchantments; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -public class EnchantmentRecipe extends EnchantingApparatusRecipe { - public Holder enchantment; - public int enchantLevel; - - public EnchantmentRecipe(List pedestalItems, Holder enchantment, int level, int manaCost) { - this.pedestalItems = pedestalItems; - this.enchantment = enchantment; - this.enchantLevel = level; - this.sourceCost = manaCost; - this.id = ArsNouveau.prefix(enchantment.unwrapKey().get().location().getPath() + "_" + level); - } - - @Override - public RecipeType getType() { - return RecipeRegistry.ENCHANTMENT_TYPE.get(); - } - - public boolean doesReagentMatch(ItemStack stack, Player playerEntity) { - if (stack.isEmpty()) - return false; - ItemEnchantments enchantments = EnchantmentHelper.getEnchantmentsForCrafting(stack); - int level = enchantments.getLevel(enchantment); - Collection> enchantList = enchantments.entrySet().stream().map(Map.Entry::getKey).collect(Collectors.toList()); - enchantList.remove(enchantment); - if (stack.getItem() != Items.BOOK && stack.getItem() != Items.ENCHANTED_BOOK && !enchantment.value().canEnchant(stack)) { - PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.enchanting.incompatible")); - return false; - } - - if (!EnchantmentHelper.isEnchantmentCompatible(enchantList, enchantment)) { - PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.enchanting.incompatible")); - return false; - } - - if (!(this.enchantLevel - level == 1)) { - PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.enchanting.bad_level")); - return false; - } - - return true; - } - - @Override - public boolean excludeJei() { - return true; - } - - // Override and move reagent match to the end, so we can give feedback - @Override - public boolean isMatch(List pedestalItems, ItemStack reagent, EnchantingApparatusTile enchantingApparatusTile, @Nullable Player player) { - pedestalItems = pedestalItems.stream().filter(itemStack -> !itemStack.isEmpty()).collect(Collectors.toList()); - return this.pedestalItems.size() == pedestalItems.size() && doItemsMatch(pedestalItems, this.pedestalItems) && doesReagentMatch(reagent, player); - } - - @Override - public boolean doesReagentMatch(ItemStack stack) { - ItemEnchantments enchantments = EnchantmentHelper.getEnchantmentsForCrafting(stack); - int level = enchantments.getLevel(enchantment); - var val = enchantment.value(); - return val.canEnchant(stack) && this.enchantLevel - level == 1 && EnchantmentHelper.isEnchantmentCompatible(enchantments.keySet(), enchantment); - } - - @Override - public ItemStack assemble(EnchantingApparatusTile inv, RegistryAccess p_267165_) { - ItemStack stack = inv.getStack().getItem() == Items.BOOK ? new ItemStack(Items.ENCHANTED_BOOK) : inv.getStack().copy(); - ItemEnchantments enchantments = EnchantmentHelper.getEnchantmentsForCrafting(stack); - var mutable = new ItemEnchantments.Mutable(enchantments); - mutable.set(enchantment, enchantLevel); - EnchantmentHelper.setEnchantments(stack, mutable.toImmutable()); - return stack; - } - - @Override - public ItemStack getResult(List pedestalItems, ItemStack reagent, EnchantingApparatusTile tile) { - return assemble(tile, null); - } - - @Override - public RecipeSerializer getSerializer() { - return RecipeRegistry.ENCHANTMENT_SERIALIZER.get(); - } - - @Override - public JsonElement asRecipe() { - JsonObject jsonobject = new JsonObject(); - jsonobject.addProperty("type", "ars_nouveau:" + RecipeRegistry.ENCHANTMENT_RECIPE_ID); - jsonobject.addProperty("enchantment", getRegistryName(enchantment).toString()); - jsonobject.addProperty("level", enchantLevel); - jsonobject.addProperty("sourceCost", getSourceCost()); - - JsonArray pedestalArr = new JsonArray(); - for (Ingredient i : this.pedestalItems) { - JsonObject object = new JsonObject(); - object.add("item", i.toJson()); - pedestalArr.add(object); - } - jsonobject.add("pedestalItems", pedestalArr); - return jsonobject; - } - - public static class Serializer implements RecipeSerializer { - - @Override - public EnchantmentRecipe fromJson(ResourceLocation recipeId, JsonObject json) { - Enchantment enchantment = ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryParse(GsonHelper.getAsString(json, "enchantment"))); - int level = GsonHelper.getAsInt(json, "level", 1); - int manaCost = GsonHelper.getAsInt(json, "sourceCost", 0); - JsonArray pedestalItems = GsonHelper.getAsJsonArray(json, "pedestalItems"); - List stacks = new ArrayList<>(); - - for (JsonElement e : pedestalItems) { - JsonObject obj = e.getAsJsonObject(); - Ingredient input = null; - if (GsonHelper.isArrayNode(obj, "item")) { - input = Ingredient.fromJson(GsonHelper.getAsJsonArray(obj, "item")); - } else { - input = Ingredient.fromJson(GsonHelper.getAsJsonObject(obj, "item")); - } - stacks.add(input); - } - return new EnchantmentRecipe(stacks, enchantment, level, manaCost); - } - - @Nullable - @Override - public EnchantmentRecipe fromNetwork(ResourceLocation recipeId, FriendlyByteBuf buffer) { - int length = buffer.readInt(); - String enchantID = buffer.readUtf(); - int level = buffer.readInt(); - int manaCost = buffer.readInt(); - List stacks = new ArrayList<>(); - - for (int i = 0; i < length; i++) { - try { - stacks.add(Ingredient.fromNetwork(buffer)); - } catch (Exception e) { - e.printStackTrace(); - break; - } - } - return new EnchantmentRecipe(stacks, ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryParse(enchantID)), level, manaCost); - } - - @Override - public void toNetwork(FriendlyByteBuf buf, EnchantmentRecipe recipe) { - buf.writeInt(recipe.pedestalItems.size()); - buf.writeUtf(getRegistryName(recipe.enchantment).toString()); - buf.writeInt(recipe.enchantLevel); - buf.writeInt(recipe.getSourceCost()); - for (Ingredient i : recipe.pedestalItems) { - i.toNetwork(buf); - } - } - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/IEnchantingRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/IEnchantingRecipe.java deleted file mode 100644 index dd801d05bb..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/IEnchantingRecipe.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.hollingsworth.arsnouveau.api.enchanting_apparatus; - -import com.hollingsworth.arsnouveau.common.block.tile.EnchantingApparatusTile; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Recipe; - -import javax.annotation.Nullable; -import java.util.List; - -public interface IEnchantingRecipe extends Recipe { - - boolean isMatch(List pedestalItems, ItemStack reagent, EnchantingApparatusTile enchantingApparatusTile, @Nullable Player player); - - /** - * Tile sensitive result - */ - ItemStack getResult(List pedestalItems, ItemStack reagent, EnchantingApparatusTile enchantingApparatusTile); - - default boolean consumesSource() { - return getSourceCost() > 0; - } - - int getSourceCost(); -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ApparatusEnchantingRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ApparatusEnchantingRecipeCategory.java index 927df426ab..68a7a126d3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ApparatusEnchantingRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ApparatusEnchantingRecipeCategory.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.client.jei; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantmentRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantmentRecipe; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.helpers.IGuiHelper; import mezz.jei.api.recipe.IFocusGroup; @@ -28,7 +28,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, EnchantmentRecipe recipe, IF double angleBetweenEach = 360.0 / inputs.size(); - ItemStack dummy = recipe.enchantLevel > 1 ? EnchantedBookItem.createForEnchantment(new EnchantmentInstance(recipe.enchantment, recipe.enchantLevel-1)) : Items.BOOK.getDefaultInstance(); + ItemStack dummy = recipe.enchantLevel > 1 ? EnchantedBookItem.createForEnchantment(new EnchantmentInstance(recipe.enchantmentKey, recipe.enchantLevel-1)) : Items.BOOK.getDefaultInstance(); Component message = recipe.enchantLevel == 1 ? Component.literal("Any compatible item") : Component.literal("Needs lower level enchantment"); dummy.set(DataComponents.CUSTOM_NAME, message); //TODO Translatable @@ -40,7 +40,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, EnchantmentRecipe recipe, IF point = rotatePointAbout(point, center, angleBetweenEach); } - builder.addSlot(RecipeIngredientRole.OUTPUT, 86, 10).addItemStack(EnchantedBookItem.createForEnchantment(new EnchantmentInstance(recipe.enchantment, recipe.enchantLevel))); + builder.addSlot(RecipeIngredientRole.OUTPUT, 86, 10).addItemStack(EnchantedBookItem.createForEnchantment(new EnchantmentInstance(recipe.enchantmentKey, recipe.enchantLevel))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ArmorUpgradeRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ArmorUpgradeRecipeCategory.java index d5a6aa79f5..44873128cf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ArmorUpgradeRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ArmorUpgradeRecipeCategory.java @@ -1,10 +1,10 @@ package com.hollingsworth.arsnouveau.client.jei; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.ArmorUpgradeRecipe; import com.hollingsworth.arsnouveau.api.perk.ArmorPerkHolder; import com.hollingsworth.arsnouveau.api.perk.IPerkProvider; import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; import com.hollingsworth.arsnouveau.common.armor.AnimatedMagicArmor; +import com.hollingsworth.arsnouveau.common.crafting.recipes.ArmorUpgradeRecipe; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.gui.ingredient.IRecipeSlotsView; import mezz.jei.api.helpers.IGuiHelper; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/EnchantingApparatusRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/EnchantingApparatusRecipeCategory.java index 873fac130c..2170ccbc68 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/EnchantingApparatusRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/EnchantingApparatusRecipeCategory.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.client.jei; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantingApparatusRecipe; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.gui.drawable.IDrawable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIArsNouveauPlugin.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIArsNouveauPlugin.java index 173d1b2b38..5482049bf8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIArsNouveauPlugin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIArsNouveauPlugin.java @@ -1,14 +1,8 @@ package com.hollingsworth.arsnouveau.client.jei; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.ArmorUpgradeRecipe; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantmentRecipe; import com.hollingsworth.arsnouveau.client.container.IAutoFillTerminal; -import com.hollingsworth.arsnouveau.common.crafting.recipes.CrushRecipe; -import com.hollingsworth.arsnouveau.common.crafting.recipes.DyeRecipe; -import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; -import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.*; import com.hollingsworth.arsnouveau.common.spell.effect.EffectCrush; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ApparatusProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ApparatusProcessor.java index 5e43234c8b..986044ab4f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ApparatusProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ApparatusProcessor.java @@ -1,7 +1,7 @@ //package com.hollingsworth.arsnouveau.client.patchouli; // // -//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; +//import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantingApparatusRecipe; //import net.minecraft.client.Minecraft; //import net.minecraft.resources.ResourceLocation; //import net.minecraft.world.item.crafting.RecipeManager; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/EnchantmentProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/EnchantmentProcessor.java index 9240311808..064fee739a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/EnchantmentProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/EnchantmentProcessor.java @@ -1,7 +1,7 @@ //package com.hollingsworth.arsnouveau.client.patchouli; // // -//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantmentRecipe; +//import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantmentRecipe; //import net.minecraft.client.Minecraft; //import net.minecraft.resources.ResourceLocation; //import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/NoOutputApparatusProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/NoOutputApparatusProcessor.java index f0d2a28c00..c4c352b1c1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/NoOutputApparatusProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/NoOutputApparatusProcessor.java @@ -1,7 +1,7 @@ //package com.hollingsworth.arsnouveau.client.patchouli; // -//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; -//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.ITextOutput; +//import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantingApparatusRecipe; +//import com.hollingsworth.arsnouveau.common.crafting.recipes.ITextOutput; //import net.minecraft.client.Minecraft; //import net.minecraft.resources.ResourceLocation; //import net.minecraft.world.item.crafting.RecipeManager; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponent.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponent.java index 3dec95ca92..0419fab28f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponent.java @@ -3,8 +3,8 @@ //import com.google.common.collect.ImmutableList; //import com.google.gson.annotations.SerializedName; //import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; -//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; -//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.IEnchantingRecipe; +//import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantingApparatusRecipe; +//import com.hollingsworth.arsnouveau.common.crafting.recipes.IEnchantingRecipe; //import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; //import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; //import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/EnchantingApparatusBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/EnchantingApparatusBlock.java index 8c0f186038..d93c7f2652 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/EnchantingApparatusBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/EnchantingApparatusBlock.java @@ -1,17 +1,16 @@ package com.hollingsworth.arsnouveau.common.block; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.IEnchantingRecipe; import com.hollingsworth.arsnouveau.api.util.SourceUtil; import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.common.block.tile.ArcanePedestalTile; import com.hollingsworth.arsnouveau.common.block.tile.EnchantingApparatusTile; +import com.hollingsworth.arsnouveau.common.crafting.recipes.IEnchantingRecipe; import com.hollingsworth.arsnouveau.common.network.HighlightAreaPacket; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.util.PortUtil; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; @@ -69,7 +68,7 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level } Networking.sendToNearby(world, tile.getBlockPos(), new HighlightAreaPacket(colorPos, 60)); PortUtil.sendMessage(player, Component.translatable("ars_nouveau.apparatus.norecipe")); - } else if (recipe.consumesSource() && !SourceUtil.hasSourceNearby(tile.getBlockPos(), tile.getLevel(), 10, recipe.getSourceCost())) { + } else if (recipe.consumesSource() && !SourceUtil.hasSourceNearby(tile.getBlockPos(), tile.getLevel(), 10, recipe.sourceCost())) { PortUtil.sendMessage(player, Component.translatable("ars_nouveau.apparatus.nomana")); } else { if (tile.attemptCraft(player.getMainHandItem(), player)) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java index 1da3aea12a..6ae3bc1615 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java @@ -2,14 +2,10 @@ import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; import com.hollingsworth.arsnouveau.api.block.IPedestalMachine; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.IEnchantingRecipe; import com.hollingsworth.arsnouveau.api.util.SourceUtil; -import com.hollingsworth.arsnouveau.client.particle.GlowParticleData; -import com.hollingsworth.arsnouveau.client.particle.ParticleColor; -import com.hollingsworth.arsnouveau.client.particle.ParticleLineData; -import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; -import com.hollingsworth.arsnouveau.client.particle.ColorPos; +import com.hollingsworth.arsnouveau.client.particle.*; import com.hollingsworth.arsnouveau.common.block.ITickable; +import com.hollingsworth.arsnouveau.common.crafting.recipes.IEnchantingRecipe; import com.hollingsworth.arsnouveau.common.network.HighlightAreaPacket; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketOneShotAnimation; @@ -31,8 +27,8 @@ import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -141,7 +137,7 @@ public List getPedestalItems() { public IEnchantingRecipe getRecipe(ItemStack stack, @Nullable Player playerEntity) { List pedestalItems = getPedestalItems(); - var holder = ArsNouveauAPI.getInstance().getEnchantingApparatusRecipes(level).stream().filter(r -> r.value().isMatch(pedestalItems, stack, this, playerEntity)).findFirst().orElse(null); + var holder = ArsNouveauAPI.getInstance().getEnchantingApparatusRecipes(level).stream().filter(r -> r.value().matches(pedestalItems, stack, this, playerEntity)).findFirst().orElse(null); return holder != null ? holder.value() : null; } @@ -153,7 +149,7 @@ public boolean attemptCraft(ItemStack catalyst, @Nullable Player playerEntity) { } IEnchantingRecipe recipe = this.getRecipe(catalyst, playerEntity); if (recipe.consumesSource()) - SourceUtil.takeSourceWithParticles(worldPosition, level, 10, recipe.getSourceCost()); + SourceUtil.takeSourceWithParticles(worldPosition, level, 10, recipe.sourceCost()); this.isCrafting = true; updateBlock(); Networking.sendToNearby(level, worldPosition, new PacketOneShotAnimation(worldPosition)); @@ -175,18 +171,18 @@ public boolean craftingPossible(ItemStack stack, Player playerEntity) { Networking.sendToNearby(level, worldPosition, new HighlightAreaPacket(colorPos, 60)); } - return recipe != null && (!recipe.consumesSource() || (recipe.consumesSource() && SourceUtil.hasSourceNearby(worldPosition, level, 10, recipe.getSourceCost()))); + return recipe != null && (!recipe.consumesSource() || (recipe.consumesSource() && SourceUtil.hasSourceNearby(worldPosition, level, 10, recipe.sourceCost()))); } @Override - protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + public void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.loadAdditional(compound, pRegistries); isCrafting = compound.getBoolean("is_crafting"); counter = compound.getInt("counter"); } @Override - protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); tag.putBoolean("is_crafting", isCrafting); tag.putInt("counter", counter); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/compat/crafttweaker/EnchantingApparatusManager.java b/src/main/java/com/hollingsworth/arsnouveau/common/compat/crafttweaker/EnchantingApparatusManager.java index 7ef7fea3ad..d2ba47d2ca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/compat/crafttweaker/EnchantingApparatusManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/compat/crafttweaker/EnchantingApparatusManager.java @@ -6,7 +6,7 @@ //import com.blamejared.crafttweaker.api.item.IItemStack; //import com.blamejared.crafttweaker.api.managers.IRecipeManager; //import com.blamejared.crafttweaker.impl.actions.recipes.ActionAddRecipe; -//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; +//import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantingApparatusRecipe; //import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; //import net.minecraft.world.item.crafting.RecipeType; //import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ApparatusRecipeInput.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ApparatusRecipeInput.java new file mode 100644 index 0000000000..c1b764d782 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ApparatusRecipeInput.java @@ -0,0 +1,30 @@ +package com.hollingsworth.arsnouveau.common.crafting.recipes; + +import com.hollingsworth.arsnouveau.common.block.tile.EnchantingApparatusTile; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeInput; + +import javax.annotation.Nullable; +import java.util.List; + +public record ApparatusRecipeInput(ItemStack catalyst, List pedestals, @Nullable Player player) implements RecipeInput { + + public ApparatusRecipeInput(EnchantingApparatusTile tile) { + this(tile.getStack(), tile.getPedestalItems(), null); + } + + public ApparatusRecipeInput(EnchantingApparatusTile tile, @Nullable Player player) { + this(tile.getStack(), tile.getPedestalItems(), player); + } + + @Override + public ItemStack getItem(int p_346128_) { + return pedestals.get(p_346128_); + } + + @Override + public int size() { + return pedestals.size(); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/ArmorUpgradeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java similarity index 96% rename from src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/ArmorUpgradeRecipe.java rename to src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java index ac968225f2..69e11cce13 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/ArmorUpgradeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java @@ -1,4 +1,4 @@ -package com.hollingsworth.arsnouveau.api.enchanting_apparatus; +package com.hollingsworth.arsnouveau.common.crafting.recipes; import com.google.gson.JsonArray; import com.google.gson.JsonElement; @@ -47,7 +47,7 @@ public boolean excludeJei() { public JsonElement asRecipe() { JsonObject jsonobject = new JsonObject(); jsonobject.addProperty("type", "ars_nouveau:" + RecipeRegistry.ARMOR_RECIPE_ID); - jsonobject.addProperty("sourceCost", getSourceCost()); + jsonobject.addProperty("sourceCost", sourceCost()); JsonArray pedestalArr = new JsonArray(); for (Ingredient i : this.pedestalItems) { JsonObject object = new JsonObject(); @@ -70,7 +70,7 @@ public boolean isMatch(List pedestalItems, ItemStack reagent, Enchant if(!(perkHolder instanceof ArmorPerkHolder armorPerkHolder)){ return false; } - return armorPerkHolder.getTier() == (tier - 1) && super.isMatch(pedestalItems, reagent, enchantingApparatusTile, player); + return armorPerkHolder.getTier() == (tier - 1) && super.matches(pedestalItems, reagent, enchantingApparatusTile, player); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java index da5bc62796..d4d298b772 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java @@ -28,7 +28,6 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.SingleRecipeInput; @@ -40,9 +39,8 @@ import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; -public class CasterTomeData implements Recipe { +public class CasterTomeData implements SpecialSingleInputRecipe { - ResourceLocation id; String name; List spell; ResourceLocation type; @@ -50,21 +48,29 @@ public class CasterTomeData implements Recipe { public ParticleColor particleColor; ConfiguredSpellSound sound; - - public CasterTomeData(ResourceLocation id, String name, + public CasterTomeData(String name, List spell, ResourceLocation type, String flavorText, - CompoundTag particleColor, ConfiguredSpellSound sound) { + ConfiguredSpellSound sound, + ParticleColor color) { this.name = name; this.spell = spell; - this.id = id; this.type = type; this.flavorText = flavorText; - this.particleColor = ParticleColorRegistry.from(particleColor); + this.particleColor = color; this.sound = sound; } + + public CasterTomeData(String name, + List spell, + ResourceLocation type, + String flavorText, + CompoundTag particleColor, ConfiguredSpellSound sound) { + this(name, spell, type, flavorText, sound, ParticleColorRegistry.from(particleColor)); + } + public static ItemStack makeTome(Item tome, String name, Spell spell, String flavorText) { ItemStack stack = tome.getDefaultInstance(); ISpellCaster spellCaster = CasterUtil.getCaster(stack); @@ -79,17 +85,6 @@ public boolean matches(SingleRecipeInput p_346065_, Level p_345375_) { return false; } - @Override - public ItemStack assemble(SingleRecipeInput p_345149_, HolderLookup.Provider p_346030_) { - return ItemStack.EMPTY; - } - - @Override - public boolean canCraftInDimensions(int pWidth, int pHeight) { - return false; - } - - @Override public ItemStack getResultItem(HolderLookup.Provider p_267052_) { Item tomeType = BuiltInRegistries.ITEM.get(this.type); @@ -118,10 +113,6 @@ public RecipeType getType() { return RecipeRegistry.CASTER_TOME_TYPE.get(); } - @Override - public boolean isSpecial() { - return true; - } public JsonElement toJson() { JsonObject jsonobject = new JsonObject(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantingApparatusRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantingApparatusRecipe.java new file mode 100644 index 0000000000..115746be9d --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantingApparatusRecipe.java @@ -0,0 +1,150 @@ +package com.hollingsworth.arsnouveau.common.crafting.recipes; + +import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.HolderLookup; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.player.StackedContents; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; + +import javax.annotation.Nullable; +import java.util.List; +import java.util.stream.Collectors; + +public class EnchantingApparatusRecipe implements IEnchantingRecipe { + + private final Ingredient reagent; + private final ItemStack result; + private final List pedestalItems; + private final int sourceCost; + private final boolean keepNbtOfReagent; + + + public EnchantingApparatusRecipe(Ingredient reagent, ItemStack result, List pedestalItems, int sourceCost, boolean keepNbtOfReagent){ + this.reagent = reagent; + this.result = result; + this.pedestalItems = pedestalItems; + this.sourceCost = sourceCost; + this.keepNbtOfReagent = keepNbtOfReagent; + + } + + public boolean excludeJei(){ + return false; + } + + @Override + public boolean matches(ApparatusRecipeInput input, Level level, @Nullable Player player) { + var pedestalItems = input.pedestals().stream().filter(itemStack -> !itemStack.isEmpty()).collect(Collectors.toList()); + return doesReagentMatch(input, level, player) && this.pedestalItems.size() == pedestalItems.size() && doItemsMatch(pedestalItems, this.pedestalItems); + } + + public boolean doesReagentMatch(ApparatusRecipeInput input, Level level, @Nullable Player player) { + return this.reagent.test(input.catalyst()); + } + + // Function to check if both arrays are same + public static boolean doItemsMatch(List inputs, List recipeItems) { + StackedContents recipeitemhelper = new StackedContents(); + for (ItemStack i : inputs) + recipeitemhelper.accountStack(i, 1); + + return inputs.size() == recipeItems.size() && (net.neoforged.neoforge.common.util.RecipeMatcher.findMatches(inputs, recipeItems) != null); + } + + @Override + public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider p_346030_) { + ItemStack result = this.result.copy(); + ItemStack reagent = input.catalyst(); + if (keepNbtOfReagent && reagent.hasTag()) { + result.setTag(reagent.getTag()); + result.setDamageValue(0); + } + return result.copy(); + } + + @Override + public boolean consumesSource() { + return sourceCost() > 0; + } + + @Override + public int sourceCost() { + return sourceCost; + } + + @Override + public ItemStack getResultItem(HolderLookup.Provider pRegistries) { + return this.result.copy(); + } + + @Override + public RecipeSerializer getSerializer() { + return RecipeRegistry.APPARATUS_SERIALIZER.get(); + } + + @Override + public RecipeType getType() { + return RecipeRegistry.APPARATUS_TYPE.get(); + } + + public Ingredient reagent() { + return reagent; + } + + public ItemStack result() { + return result; + } + + public List pedestalItems() { + return pedestalItems; + } + + public boolean keepNbtOfReagent() { + return keepNbtOfReagent; + } + + public static class Serializer implements RecipeSerializer { + + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Ingredient.CODEC.fieldOf("reagent").forGetter(EnchantingApparatusRecipe::reagent), + ItemStack.CODEC.fieldOf("result").forGetter(EnchantingApparatusRecipe::result), + Ingredient.CODEC.listOf().fieldOf("pedestalItems").forGetter(EnchantingApparatusRecipe::pedestalItems), + Codec.INT.fieldOf("sourceCost").forGetter(EnchantingApparatusRecipe::sourceCost), + Codec.BOOL.fieldOf("keepNbtOfReagent").forGetter(EnchantingApparatusRecipe::keepNbtOfReagent) + ).apply(instance, EnchantingApparatusRecipe::new)); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + Ingredient.CONTENTS_STREAM_CODEC, + EnchantingApparatusRecipe::reagent, + ItemStack.STREAM_CODEC, + EnchantingApparatusRecipe::result, + Serializers.INGREDIENT_LIST_STREAM, + EnchantingApparatusRecipe::pedestalItems, + ByteBufCodecs.VAR_INT, + EnchantingApparatusRecipe::sourceCost, + ByteBufCodecs.BOOL, + EnchantingApparatusRecipe::keepNbtOfReagent, + EnchantingApparatusRecipe::new + ); + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public StreamCodec streamCodec() { + return STREAM_CODEC; + } + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantmentRecipe.java new file mode 100644 index 0000000000..583abf88e0 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantmentRecipe.java @@ -0,0 +1,148 @@ +package com.hollingsworth.arsnouveau.common.crafting.recipes; + +import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.ItemEnchantments; +import net.minecraft.world.level.Level; + +import javax.annotation.Nullable; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class EnchantmentRecipe extends EnchantingApparatusRecipe { + + public ResourceKey enchantmentKey; + public int enchantLevel; + + public EnchantmentRecipe(List pedestalItems, ResourceKey enchantmentKey, int level, int source) { + super(Ingredient.EMPTY, ItemStack.EMPTY, pedestalItems, source, true); + this.enchantmentKey = enchantmentKey; + this.enchantLevel = level; + } + + @Override + public RecipeType getType() { + return RecipeRegistry.ENCHANTMENT_TYPE.get(); + } + + @Override + public boolean excludeJei() { + return true; + } + + @Override + public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.annotations.Nullable Player player) { + return super.matches(input, level, player); + } + + public Holder holderFor(Level level){ + return level.registryAccess().registryOrThrow(Registries.ENCHANTMENT).getHolderOrThrow(enchantmentKey); + } + + @Override + public boolean doesReagentMatch(ApparatusRecipeInput input, Level world, @Nullable Player player) { + ItemStack stack = input.catalyst(); + if (stack.isEmpty()) + return false; + ItemEnchantments enchantments = EnchantmentHelper.getEnchantmentsForCrafting(stack); + var enchantment = holderFor(world); + int level = enchantments.getLevel(enchantment); + Collection> enchantList = enchantments.entrySet().stream().map(Map.Entry::getKey).collect(Collectors.toList()); + enchantList.remove(enchantment); + if (stack.getItem() != Items.BOOK && stack.getItem() != Items.ENCHANTED_BOOK && !enchantment.value().canEnchant(stack)) { + if(player != null) { + PortUtil.sendMessage(player, Component.translatable("ars_nouveau.enchanting.incompatible")); + } + return false; + } + + if (!EnchantmentHelper.isEnchantmentCompatible(enchantList, enchantment)) { + if(player != null) { + PortUtil.sendMessage(player, Component.translatable("ars_nouveau.enchanting.incompatible")); + } + return false; + } + + if (!(this.enchantLevel - level == 1)) { + if(player != null) { + PortUtil.sendMessage(player, Component.translatable("ars_nouveau.enchanting.bad_level")); + } + return false; + } + + return true; + } + + @Override + public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider lookup) { + ItemStack inStack = input.catalyst(); + ItemStack stack = inStack.getItem() == Items.BOOK ? new ItemStack(Items.ENCHANTED_BOOK) : inStack.copy(); + ItemEnchantments enchantments = EnchantmentHelper.getEnchantmentsForCrafting(stack); + var mutable = new ItemEnchantments.Mutable(enchantments); + var enchantment = lookup.lookupOrThrow(Registries.ENCHANTMENT).getOrThrow(enchantmentKey); + mutable.set(enchantment, enchantLevel); + EnchantmentHelper.setEnchantments(stack, mutable.toImmutable()); + return stack; + } + + @Override + public ItemStack getResultItem(HolderLookup.Provider pRegistries) { + return ItemStack.EMPTY; + } + + @Override + public RecipeSerializer getSerializer() { + return RecipeRegistry.ENCHANTMENT_SERIALIZER.get(); + } + + public ResourceKey enchantmentKey() { + return enchantmentKey; + } + + public int enchantLevel() { + return enchantLevel; + } + + public static class Serializer implements RecipeSerializer { + + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Ingredient.CODEC.listOf().fieldOf("pedestalItems").forGetter(EnchantmentRecipe::pedestalItems), + ResourceKey.codec(Registries.ENCHANTMENT).fieldOf("enchantment").forGetter(EnchantmentRecipe::enchantmentKey), + Codec.INT.fieldOf("level").forGetter(EnchantmentRecipe::enchantLevel), + Codec.INT.fieldOf("sourceCost").forGetter(EnchantmentRecipe::sourceCost) + ).apply(instance, EnchantmentRecipe::new)); + + //TODO: use proper codec + public static StreamCodec STREAM_CODEC = CheatSerializer.create(CODEC); + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public StreamCodec streamCodec() { + return STREAM_CODEC; + } + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/IEnchantingRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/IEnchantingRecipe.java new file mode 100644 index 0000000000..e14f8e4ec2 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/IEnchantingRecipe.java @@ -0,0 +1,33 @@ +package com.hollingsworth.arsnouveau.common.crafting.recipes; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.level.Level; + +import javax.annotation.Nullable; + +public interface IEnchantingRecipe extends Recipe { + + @Override + default boolean matches(ApparatusRecipeInput input, Level level) { + return matches(input, level, null); + } + + boolean matches(ApparatusRecipeInput input, Level level, @Nullable Player player); + + default boolean consumesSource() { + return sourceCost() > 0; + } + + int sourceCost(); + + @Override + default boolean isSpecial() { + return true; + } + + @Override + default boolean canCraftInDimensions(int pWidth, int pHeight) { + return false; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/ITextOutput.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ITextOutput.java similarity index 76% rename from src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/ITextOutput.java rename to src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ITextOutput.java index a21b66e27c..90b8735287 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/ITextOutput.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ITextOutput.java @@ -1,4 +1,4 @@ -package com.hollingsworth.arsnouveau.api.enchanting_apparatus; +package com.hollingsworth.arsnouveau.common.crafting.recipes; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java index a544600779..a8a1e6a81f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java @@ -1,7 +1,6 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; import com.hollingsworth.arsnouveau.common.block.tile.ImbuementTile; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import com.mojang.serialization.Codec; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/ReactiveEnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java similarity index 90% rename from src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/ReactiveEnchantmentRecipe.java rename to src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java index d152679758..b152941fd3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/ReactiveEnchantmentRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java @@ -1,4 +1,4 @@ -package com.hollingsworth.arsnouveau.api.enchanting_apparatus; +package com.hollingsworth.arsnouveau.common.crafting.recipes; import com.google.gson.JsonArray; import com.google.gson.JsonElement; @@ -6,9 +6,9 @@ import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.common.block.tile.EnchantingApparatusTile; -import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.common.items.SpellParchment; import com.hollingsworth.arsnouveau.common.spell.casters.ReactiveCaster; +import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; @@ -31,9 +31,9 @@ public ReactiveEnchantmentRecipe(List pedestalItems, int sourceCost) } @Override - public boolean isMatch(List pedestalItems, ItemStack reagent, EnchantingApparatusTile enchantingApparatusTile, @Nullable Player player) { + public boolean matches(List pedestalItems, ItemStack reagent, @Nullable Player player) { ItemStack parchment = getParchment(pedestalItems); - return super.isMatch(pedestalItems, reagent, enchantingApparatusTile, player) && !parchment.isEmpty() && !CasterUtil.getCaster(parchment).getSpell().isEmpty(); + return super.matches(pedestalItems, reagent, player) && !parchment.isEmpty() && !CasterUtil.getCaster(parchment).getSpell().isEmpty(); } public static@NotNull ItemStack getParchment(List pedestalItems) { @@ -70,7 +70,7 @@ public ItemStack getResult(List pedestalItems, ItemStack reagent, Enc public JsonElement asRecipe() { JsonObject jsonobject = new JsonObject(); jsonobject.addProperty("type", "ars_nouveau:" + RecipeRegistry.REACTIVE_RECIPE_ID); - jsonobject.addProperty("sourceCost", getSourceCost()); + jsonobject.addProperty("sourceCost", sourceCost()); JsonArray pedestalArr = new JsonArray(); for (Ingredient i : this.pedestalItems) { JsonObject object = new JsonObject(); @@ -123,7 +123,7 @@ public ReactiveEnchantmentRecipe fromNetwork(ResourceLocation recipeId, Friendly @Override public void toNetwork(FriendlyByteBuf buf, ReactiveEnchantmentRecipe recipe) { buf.writeInt(recipe.pedestalItems.size()); - buf.writeInt(recipe.getSourceCost()); + buf.writeInt(recipe.sourceCost()); for (Ingredient i : recipe.pedestalItems) { i.toNetwork(buf); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/Serializers.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/Serializers.java new file mode 100644 index 0000000000..47751bd2c6 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/Serializers.java @@ -0,0 +1,13 @@ +package com.hollingsworth.arsnouveau.common.crafting.recipes; + +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.crafting.Ingredient; + +import java.util.ArrayList; +import java.util.List; + +public class Serializers { + public static final StreamCodec> INGREDIENT_LIST_STREAM = Ingredient.CONTENTS_STREAM_CODEC.apply(ByteBufCodecs.collection(ArrayList::new)); +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/SpellWriteRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java similarity index 93% rename from src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/SpellWriteRecipe.java rename to src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java index ac0ec807d1..64ccc819b2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/enchanting_apparatus/SpellWriteRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java @@ -1,4 +1,4 @@ -package com.hollingsworth.arsnouveau.api.enchanting_apparatus; +package com.hollingsworth.arsnouveau.common.crafting.recipes; import com.google.gson.JsonArray; import com.google.gson.JsonElement; @@ -7,10 +7,9 @@ import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.common.block.tile.EnchantingApparatusTile; -import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.common.spell.casters.ReactiveCaster; +import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -import net.minecraft.core.component.DataComponentType; import net.minecraft.core.component.DataComponents; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; @@ -21,14 +20,13 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.ItemEnchantments; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; -import static com.hollingsworth.arsnouveau.api.enchanting_apparatus.ReactiveEnchantmentRecipe.getParchment; +import static com.hollingsworth.arsnouveau.common.crafting.recipes.ReactiveEnchantmentRecipe.getParchment; public class SpellWriteRecipe extends EnchantingApparatusRecipe implements ITextOutput { @@ -53,7 +51,7 @@ public boolean isMatch(List pedestalItems, ItemStack reagent, Enchant ItemEnchantments enchantments = reagent.get(DataComponents.ENCHANTMENTS); int level = enchantments.getLevel(EnchantmentRegistry.REACTIVE_ENCHANTMENT.get()); ItemStack parchment = getParchment(pedestalItems); - return !parchment.isEmpty() && !CasterUtil.getCaster(parchment).getSpell().isEmpty() && level > 0 && super.isMatch(pedestalItems, reagent, enchantingApparatusTile, player); + return !parchment.isEmpty() && !CasterUtil.getCaster(parchment).getSpell().isEmpty() && level > 0 && super.matches(pedestalItems, reagent, enchantingApparatusTile, player); } @Override @@ -75,7 +73,7 @@ public ItemStack getResult(List pedestalItems, ItemStack reagent, Enc public JsonElement asRecipe() { JsonObject jsonobject = new JsonObject(); jsonobject.addProperty("type", "ars_nouveau:" + RecipeRegistry.SPELL_WRITE_RECIPE_ID); - jsonobject.addProperty("sourceCost", getSourceCost()); + jsonobject.addProperty("sourceCost", sourceCost()); JsonArray pedestalArr = new JsonArray(); for (Ingredient i : this.pedestalItems) { JsonObject object = new JsonObject(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SummonRitualRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SummonRitualRecipe.java index 540262ad40..4781c909fa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SummonRitualRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SummonRitualRecipe.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java index 659f72a673..3745645684 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java @@ -1,8 +1,9 @@ package com.hollingsworth.arsnouveau.common.datagen; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantmentRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantingApparatusRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantmentRecipe; +import com.mojang.serialization.MapCodec; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; @@ -12,47 +13,54 @@ import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.level.ItemLike; +import java.util.ArrayList; +import java.util.List; + import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; public class ApparatusRecipeBuilder { - EnchantingApparatusRecipe recipe; - public ApparatusRecipeBuilder() { - this.recipe = new EnchantingApparatusRecipe(); - } + private Ingredient reagent; + private ItemStack result; + private List pedestalItems = new ArrayList<>(); + private int sourceCost; + private boolean keepNbtOfReagent; + private ResourceLocation id; + + public ApparatusRecipeBuilder() {} public static ApparatusRecipeBuilder builder() { return new ApparatusRecipeBuilder(); } public ApparatusRecipeBuilder withResult(ItemLike result) { - this.recipe.result = new ItemStack(result); + this.result = new ItemStack(result); return this; } public ApparatusRecipeBuilder withResult(ItemLike result, int count) { - this.recipe.result = new ItemStack(result, count); + this.result = new ItemStack(result, count); return this; } public ApparatusRecipeBuilder withResult(ItemStack result) { - this.recipe.result = result; + this.result = result; return this; } public ApparatusRecipeBuilder withReagent(ItemLike provider) { - this.recipe.reagent = Ingredient.of(provider); + this.reagent = Ingredient.of(provider); return this; } public ApparatusRecipeBuilder withReagent(Ingredient ingredient) { - this.recipe.reagent = ingredient; + this.reagent = ingredient; return this; } public ApparatusRecipeBuilder withPedestalItem(Ingredient i) { - this.recipe.pedestalItems.add(i); + this.pedestalItems.add(i); return this; } @@ -80,32 +88,38 @@ public ApparatusRecipeBuilder withPedestalItem(int count, TagKey ingred) { } public ApparatusRecipeBuilder keepNbtOfReagent(boolean keepEnchantmentsOfReagent) { - this.recipe.keepNbtOfReagent = keepEnchantmentsOfReagent; + this.keepNbtOfReagent = keepEnchantmentsOfReagent; return this; } public ApparatusRecipeBuilder withSourceCost(int cost) { - this.recipe.sourceCost = cost; + this.sourceCost = cost; return this; } public ApparatusRecipeBuilder withId(ResourceLocation id) { - this.recipe.id = id; + this.id = id; return this; } - public EnchantingApparatusRecipe build() { - if (recipe.id.getPath().equals("empty")) - recipe.id = ArsNouveau.prefix( getRegistryName(recipe.result.getItem()).getPath()); - if(recipe.result.isEmpty()){ + public RecipeWrapper build() { + if (id == null || id.getPath().equals("empty")) + id = ArsNouveau.prefix( getRegistryName(result.getItem()).getPath()); + if(result.isEmpty()){ throw new IllegalStateException("Enchanting Apparatus Recipe has no result"); } - return recipe; + return new RecipeWrapper(id, new EnchantingApparatusRecipe(reagent, result, pedestalItems, sourceCost, keepNbtOfReagent), EnchantingApparatusRecipe.Serializer.CODEC); } - public EnchantmentRecipe buildEnchantmentRecipe(ResourceKey enchantment, int level, int mana) { - return new EnchantmentRecipe(this.recipe.pedestalItems, enchantment, level, mana); + public RecipeWrapper buildEnchantmentRecipe(ResourceKey enchantment, int level, int mana) { + if(id == null || id.getPath().equals("empty")){ + id = ArsNouveau.prefix(enchantment.location().getPath() + "_" + level); + } + return new RecipeWrapper(id, new EnchantmentRecipe(this.pedestalItems, enchantment, level, mana), EnchantmentRecipe.Serializer.CODEC); } + public record RecipeWrapper(ResourceLocation id, T recipe, MapCodec codec) { + + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java index e0fc40968d..d6a53ffe6c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java @@ -2,13 +2,16 @@ import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.*; import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; +import com.hollingsworth.arsnouveau.common.crafting.recipes.ArmorUpgradeRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.ReactiveEnchantmentRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.SpellWriteRecipe; import com.hollingsworth.arsnouveau.common.items.PerkItem; import com.hollingsworth.arsnouveau.common.perk.*; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import com.mojang.serialization.JsonOps; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; import net.minecraft.resources.ResourceLocation; @@ -24,7 +27,6 @@ import java.nio.file.Path; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; @@ -38,15 +40,14 @@ public ApparatusRecipeProvider(DataGenerator generatorIn) { @Override public void collectJsons(CachedOutput pOutput) { addEntries(); - for (IEnchantingRecipe g : recipes) { - if (g instanceof EnchantingApparatusRecipe recipe) { - Path path = getRecipePath(output, recipe.getId().getPath()); - saveStable(pOutput, recipe.asRecipe(), path); - } + for (ApparatusRecipeBuilder.RecipeWrapper wrapper : recipes) { + Path path = getRecipePath(output, wrapper.id().getPath()); + saveStable(pOutput, wrapper.codec().codec().encodeStart(JsonOps.INSTANCE, wrapper.recipe()).getOrThrow(), path); + } } - public List recipes = new ArrayList<>(); + public List recipes = new ArrayList<>(); public ApparatusRecipeBuilder builder() { return ApparatusRecipeBuilder.builder(); } @@ -89,17 +90,18 @@ public void addEntries() { .withPedestalItem(2, RecipeDatagen.SOURCE_GEM) .build()); - - addRecipe(new EnchantingApparatusRecipe(new ItemStack(ItemsRegistry.BELT_OF_UNSTABLE_GIFTS.get()), Ingredient.of(ItemsRegistry.MUNDANE_BELT.get()), Arrays.asList( - Ingredient.of(Items.SUGAR), - Ingredient.of(Tags.Items.CROPS_NETHER_WART), - Ingredient.of(Tags.Items.RODS_BLAZE), - Ingredient.of(Tags.Items.DUSTS_GLOWSTONE), - Ingredient.of(Items.FERMENTED_SPIDER_EYE), - Ingredient.of(Tags.Items.DUSTS_REDSTONE), - Ingredient.of(Items.BREWING_STAND), - Ingredient.of(Tags.Items.FEATHERS) - ))); + addRecipe(builder() + .withResult(ItemsRegistry.BELT_OF_UNSTABLE_GIFTS) + .withReagent(ItemsRegistry.MUNDANE_BELT) + .withPedestalItem(Ingredient.of(Items.SUGAR)) + .withPedestalItem(Ingredient.of(Tags.Items.CROPS_NETHER_WART)) + .withPedestalItem(Ingredient.of(Tags.Items.RODS_BLAZE)) + .withPedestalItem(Ingredient.of(Tags.Items.DUSTS_GLOWSTONE)) + .withPedestalItem(Ingredient.of(Items.FERMENTED_SPIDER_EYE)) + .withPedestalItem(Ingredient.of(Tags.Items.DUSTS_REDSTONE)) + .withPedestalItem(Ingredient.of(Items.BREWING_STAND)) + .withPedestalItem(Ingredient.of(Tags.Items.FEATHERS)) + .build()); addRecipe(builder() .withResult(ItemsRegistry.STARBUNCLE_CHARM) @@ -1102,7 +1104,7 @@ public PerkItem getPerkItem(ResourceLocation id) { return PerkRegistry.getPerkItemMap().get(id); } - public void addRecipe(EnchantingApparatusRecipe recipe) { + public void addRecipe(ApparatusRecipeBuilder.RecipeWrapper recipe) { recipes.add(recipe); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java index 6cf3d17002..f1522cba06 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java @@ -3,7 +3,6 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; -import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; @@ -12,7 +11,6 @@ import net.minecraft.world.level.block.SlabBlock; import net.minecraft.world.level.block.StairBlock; import net.neoforged.neoforge.client.model.generators.BlockStateProvider; -import net.neoforged.neoforge.client.model.generators.ConfiguredModel; import net.neoforged.neoforge.client.model.generators.ModelFile; import net.neoforged.neoforge.common.data.ExistingFileHelper; @@ -62,9 +60,6 @@ protected void registerStatesAndModels() { } } - private void registerOnlyState(RegistryWrapper block, String registry) { - registerOnlyState(block.get(), registry); - } private void registerOnlyState(Block block, String registry) { simpleBlock(block, getUncheckedModel(registry)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java index c52594eb55..cfa6936acc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java @@ -15,6 +15,8 @@ import com.hollingsworth.arsnouveau.setup.registry.SoundRegistry; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; import java.nio.file.Path; import java.util.ArrayList; @@ -23,7 +25,7 @@ public class CasterTomeProvider extends SimpleDataProvider { - public List tomes = new ArrayList<>(); + public List tomes = new ArrayList<>(); public CasterTomeProvider(DataGenerator generatorIn) { super(generatorIn); @@ -252,8 +254,8 @@ public void collectJsons(CachedOutput pOutput) { tomes.add(buildTome("uni","Uni's Windshield", new Spell(MethodSelf.INSTANCE, EffectOrbit.INSTANCE, EffectKnockback.INSTANCE).add(AugmentAmplify.INSTANCE, 8), "Stay away!")); - for (CasterTomeData g : tomes) { - Path path = getRecipePath(output, g.getId().getPath()); + for (CasterRecipeWrapper g : tomes) { + Path path = getRecipePath(output, g.id().getPath()); saveStable(pOutput, g.toJson(), path); } } @@ -262,8 +264,8 @@ protected Path getRecipePath(Path pathIn, String str) { return pathIn.resolve("data/ars_nouveau/recipes/tomes/" + str + ".json"); } - public CasterTomeData buildTome(String id, String name, Spell spell, String flavorText) { - return new CasterTomeData(ArsNouveau.prefix( id + "_tome"), + public CasterRecipeWrapper buildTome(String id, String name, Spell spell, String flavorText) { + return new CasterRecipeWrapper(ArsNouveau.prefix( id + "_tome"), name, spell.serializeRecipe(), ItemsRegistry.CASTER_TOME.registryObject.getId(), @@ -271,10 +273,13 @@ public CasterTomeData buildTome(String id, String name, Spell spell, String flav spell.color.serialize(), spell.sound); } - public CasterTomeData buildTome(String id, String name, Spell spell, String flavorText, ParticleColor color) { - CasterTomeData data = buildTome(id, name, spell, flavorText); - data.particleColor = color; - return data; + public CasterRecipeWrapper buildTome(String id, String name, Spell spell, String flavorText, ParticleColor color) { + return new CasterRecipeWrapper(ArsNouveau.prefix( id + "_tome"), + name, + spell.serializeRecipe(), + ItemsRegistry.CASTER_TOME.registryObject.getId(), + flavorText, + color.serialize(), spell.sound); } /** @@ -284,4 +289,10 @@ public CasterTomeData buildTome(String id, String name, Spell spell, String flav public String getName() { return "Ars Nouveau Caster Tomes Datagen"; } + + public static record CasterRecipeWrapper(ResourceLocation id, String name, List spell, ResourceLocation tomeType, String flavorText, CompoundTag particleColor, ConfiguredSpellSound sound) { + public CasterTomeData toData() { + return new CasterTomeData(name, spell, tomeType, flavorText, particleColor, sound); + } + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java index 6d02bd78fc..fd581ff1a9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java @@ -11,7 +11,7 @@ import com.hollingsworth.arsnouveau.common.items.PerkItem; import com.hollingsworth.arsnouveau.common.items.RitualTablet; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; -import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; +import com.hollingsworth.arsnouveau.common.util.registry.ItemRegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; @@ -20,6 +20,7 @@ import net.neoforged.neoforge.client.model.generators.ItemModelProvider; import net.neoforged.neoforge.client.model.generators.ModelFile; import net.neoforged.neoforge.common.data.ExistingFileHelper; + import java.util.function.Supplier; import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; @@ -128,12 +129,7 @@ public void blockAsItem(String s){ .texture("layer0", itemTexture(s)); } - public void blockAsItem(RegistryWrapper block){ - getBuilder(block.getRegistryName()).parent(new ModelFile.UncheckedModelFile("item/generated")) - .texture("layer0", itemTexture(block.get())); - } - - public void itemUnchecked(RegistryWrapper item){ + public void itemUnchecked(ItemRegistryWrapper item){ getBuilder(item.getRegistryName()).parent(new ModelFile.UncheckedModelFile("item/generated")) .texture("layer0", itemTexture(item.get())); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java index b8a5d865ed..bc47c33501 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java @@ -3,8 +3,10 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.crafting.recipes.SummonRitualRecipe; +import com.mojang.serialization.JsonOps; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; @@ -15,7 +17,7 @@ public class SummonRitualProvider extends SimpleDataProvider{ - public List recipes = new ArrayList<>(); + public List recipes = new ArrayList<>(); public SummonRitualProvider(DataGenerator generatorIn) { super(generatorIn); @@ -24,16 +26,16 @@ public SummonRitualProvider(DataGenerator generatorIn) { @Override public void collectJsons(CachedOutput pOutput) { addEntries(); - for (SummonRitualRecipe recipe : recipes) { - Path path = getRecipePath(output, recipe.getId().getPath()); - saveStable(pOutput, recipe.asRecipe(), path); + for (SummonRitualRecipeWrapper recipe : recipes) { + Path path = getRecipePath(output, recipe.id().getPath()); + saveStable(pOutput, SummonRitualRecipe.Serializer.CODEC.codec().encodeStart(JsonOps.INSTANCE, recipe.recipe()).getOrThrow(), path); } } protected void addEntries() { ArrayList bats = new ArrayList<>(); bats.add(new SummonRitualRecipe.WeightedMobType(EntityType.getKey(EntityType.BAT))); - recipes.add(new SummonRitualRecipe(ArsNouveau.prefix( "bats"), Ingredient.of(Items.AMETHYST_SHARD), SummonRitualRecipe.MobSource.MOB_LIST, 5, bats)); + recipes.add(new SummonRitualRecipeWrapper(ArsNouveau.prefix( "bats"), new SummonRitualRecipe(Ingredient.of(Items.AMETHYST_SHARD), SummonRitualRecipe.MobSource.MOB_LIST, 5, bats))); } protected static Path getRecipePath(Path path, String id) { @@ -47,4 +49,22 @@ protected static Path getRecipePath(Path path, String id) { public String getName() { return "Summon Ritual Datagen"; } + + public static class SummonRitualRecipeWrapper { + private final SummonRitualRecipe recipe; + private final ResourceLocation id; + + public SummonRitualRecipeWrapper(ResourceLocation id, SummonRitualRecipe recipe) { + this.recipe = recipe; + this.id = id; + } + + public SummonRitualRecipe recipe() { + return recipe; + } + + public ResourceLocation id() { + return id; + } + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java index 5efde1afc6..d124bef74e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.setup.registry; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.*; import com.hollingsworth.arsnouveau.common.crafting.recipes.*; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.item.crafting.Recipe; From b0c6a7501a9eaa5e58a3f95c4b1d4332a3d07551 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 23 Jun 2024 19:42:15 -0500 Subject: [PATCH 012/363] fix generic soup --- .../api/item/inv/CombinedHandlerInv.java | 3 +- .../crafting/recipes/ArmorUpgradeRecipe.java | 37 +++++++------------ .../crafting/recipes/BookUpgradeRecipe.java | 2 +- .../common/crafting/recipes/DyeRecipe.java | 3 +- .../recipes/EnchantingApparatusRecipe.java | 4 +- .../datagen/ApparatusRecipeBuilder.java | 14 ++++--- .../datagen/ApparatusRecipeProvider.java | 8 ++-- .../common/datagen/BlockStatesDatagen.java | 23 ++++++------ 8 files changed, 45 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/CombinedHandlerInv.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/CombinedHandlerInv.java index 443631aee2..6a3325e7f4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/CombinedHandlerInv.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/CombinedHandlerInv.java @@ -2,6 +2,7 @@ import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.wrapper.EmptyItemHandler; import org.jetbrains.annotations.NotNull; public class CombinedHandlerInv implements IItemHandler { @@ -42,7 +43,7 @@ protected IItemHandler getHandlerFromIndex(int index) { if (index < 0 || index >= itemHandler.length) { - return EmptyHandler.INSTANCE; + return EmptyItemHandler.INSTANCE; } return itemHandler[index]; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java index 69e11cce13..f8c4327d14 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java @@ -3,7 +3,6 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.perk.ArmorPerkHolder; import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; import com.hollingsworth.arsnouveau.api.util.PerkUtil; @@ -18,6 +17,7 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; import javax.annotation.Nullable; import java.util.ArrayList; @@ -27,14 +27,12 @@ public class ArmorUpgradeRecipe extends EnchantingApparatusRecipe implements ITe public int tier; // 0 indexed - public ArmorUpgradeRecipe(List pedestalItems, int cost, int tier) { - this(ArsNouveau.prefix( "upgrade_" + tier), pedestalItems, cost, tier); - } +// public ArmorUpgradeRecipe(List pedestalItems, int cost, int tier) { +// this(ArsNouveau.prefix( "upgrade_" + tier), pedestalItems, cost, tier); +// } - public ArmorUpgradeRecipe(ResourceLocation id, List pedestalItems, int cost, int tier) { - this.pedestalItems = pedestalItems; - this.id = id; - this.sourceCost = cost; + public ArmorUpgradeRecipe(List pedestalItems, int cost, int tier) { + super(Ingredient.EMPTY, ItemStack.EMPTY, pedestalItems, cost, false); this.tier = tier; } @@ -44,24 +42,17 @@ public boolean excludeJei() { } @Override - public JsonElement asRecipe() { - JsonObject jsonobject = new JsonObject(); - jsonobject.addProperty("type", "ars_nouveau:" + RecipeRegistry.ARMOR_RECIPE_ID); - jsonobject.addProperty("sourceCost", sourceCost()); - JsonArray pedestalArr = new JsonArray(); - for (Ingredient i : this.pedestalItems) { - JsonObject object = new JsonObject(); - object.add("item", i.toJson()); - pedestalArr.add(object); - } - jsonobject.add("pedestalItems", pedestalArr); - jsonobject.addProperty("tier", tier); - return jsonobject; + public boolean doesReagentMatch(ApparatusRecipeInput input, Level level, @org.jetbrains.annotations.Nullable Player player) { + return true; } @Override - public boolean doesReagentMatch(ItemStack reag) { - return true; + public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.annotations.Nullable Player player) { + IPerkHolder perkHolder = PerkUtil.getPerkHolder(input.catalyst()); + if(!(perkHolder instanceof ArmorPerkHolder armorPerkHolder)){ + return false; + } + return armorPerkHolder.getTier() == (tier - 1) && super.matches(input, level, player); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BookUpgradeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BookUpgradeRecipe.java index 5b611b133c..01655470dc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BookUpgradeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BookUpgradeRecipe.java @@ -21,7 +21,7 @@ public ItemStack assemble(final CraftingInput inv, HolderLookup.Provider p_26679 for (int i = 0; i < inv.size(); i++) { // For each slot in the crafting inventory, final ItemStack ingredient = inv.getItem(i); // Get the ingredient in the slot if (!ingredient.isEmpty() && ingredient.getItem() instanceof SpellBook) { - output.setTag(ingredient.getTag()); + output.applyComponents(ingredient.getComponents()); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java index 18156f96cb..ffe6144719 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java @@ -9,7 +9,6 @@ public class DyeRecipe extends ShapelessRecipe { - public DyeRecipe(String groupIn, CraftingBookCategory category, ItemStack recipeOutputIn, NonNullList recipeItemsIn) { super(groupIn, CraftingBookCategory.MISC, recipeOutputIn, recipeItemsIn); } @@ -21,7 +20,7 @@ public ItemStack assemble(CraftingInput inv, HolderLookup.Provider p_266797_) { for (int i = 0; i < inv.size(); i++) { // For each slot in the crafting inventory, final ItemStack ingredient = inv.getItem(i); // Get the ingredient in the slot if (!ingredient.isEmpty() && ingredient.getItem() instanceof IDyeable) { - output.setTag(ingredient.getOrCreateTag().copy()); + output.applyComponents(ingredient.getComponents()); } } for (int i = 0; i < inv.size(); i++) { // For each slot in the crafting inventory, diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantingApparatusRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantingApparatusRecipe.java index 115746be9d..3f1290d13c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantingApparatusRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantingApparatusRecipe.java @@ -65,8 +65,8 @@ public static boolean doItemsMatch(List inputs, List reci public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider p_346030_) { ItemStack result = this.result.copy(); ItemStack reagent = input.catalyst(); - if (keepNbtOfReagent && reagent.hasTag()) { - result.setTag(reagent.getTag()); + if (keepNbtOfReagent) { + result.applyComponents(reagent.getComponents()); result.setDamageValue(0); } return result.copy(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java index 3745645684..0652b14ba6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java @@ -1,8 +1,10 @@ package com.hollingsworth.arsnouveau.common.datagen; +import com.google.gson.JsonElement; import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantingApparatusRecipe; import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantmentRecipe; +import com.mojang.serialization.JsonOps; import com.mojang.serialization.MapCodec; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; @@ -102,24 +104,26 @@ public ApparatusRecipeBuilder withId(ResourceLocation id) { return this; } - public RecipeWrapper build() { + public RecipeWrapper build() { if (id == null || id.getPath().equals("empty")) id = ArsNouveau.prefix( getRegistryName(result.getItem()).getPath()); if(result.isEmpty()){ throw new IllegalStateException("Enchanting Apparatus Recipe has no result"); } - return new RecipeWrapper(id, new EnchantingApparatusRecipe(reagent, result, pedestalItems, sourceCost, keepNbtOfReagent), EnchantingApparatusRecipe.Serializer.CODEC); + return new RecipeWrapper<>(id, new EnchantingApparatusRecipe(reagent, result, pedestalItems, sourceCost, keepNbtOfReagent), EnchantingApparatusRecipe.Serializer.CODEC); } - public RecipeWrapper buildEnchantmentRecipe(ResourceKey enchantment, int level, int mana) { + public RecipeWrapper buildEnchantmentRecipe(ResourceKey enchantment, int level, int mana) { if(id == null || id.getPath().equals("empty")){ id = ArsNouveau.prefix(enchantment.location().getPath() + "_" + level); } - return new RecipeWrapper(id, new EnchantmentRecipe(this.pedestalItems, enchantment, level, mana), EnchantmentRecipe.Serializer.CODEC); + return new RecipeWrapper<>(id, new EnchantmentRecipe(this.pedestalItems, enchantment, level, mana), EnchantmentRecipe.Serializer.CODEC); } public record RecipeWrapper(ResourceLocation id, T recipe, MapCodec codec) { - + public JsonElement serialize() { + return codec().codec().encodeStart(JsonOps.INSTANCE, recipe).getOrThrow(); + } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java index d6a53ffe6c..3c2f21ff60 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; import com.hollingsworth.arsnouveau.common.crafting.recipes.ArmorUpgradeRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantingApparatusRecipe; import com.hollingsworth.arsnouveau.common.crafting.recipes.ReactiveEnchantmentRecipe; import com.hollingsworth.arsnouveau.common.crafting.recipes.SpellWriteRecipe; import com.hollingsworth.arsnouveau.common.items.PerkItem; @@ -11,7 +12,6 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; -import com.mojang.serialization.JsonOps; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; import net.minecraft.resources.ResourceLocation; @@ -40,14 +40,14 @@ public ApparatusRecipeProvider(DataGenerator generatorIn) { @Override public void collectJsons(CachedOutput pOutput) { addEntries(); - for (ApparatusRecipeBuilder.RecipeWrapper wrapper : recipes) { + for (ApparatusRecipeBuilder.RecipeWrapper wrapper : recipes) { Path path = getRecipePath(output, wrapper.id().getPath()); - saveStable(pOutput, wrapper.codec().codec().encodeStart(JsonOps.INSTANCE, wrapper.recipe()).getOrThrow(), path); + saveStable(pOutput, wrapper.serialize(), path); } } - public List recipes = new ArrayList<>(); + public List> recipes = new ArrayList<>(); public ApparatusRecipeBuilder builder() { return ApparatusRecipeBuilder.builder(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java index f1522cba06..e425266253 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; @@ -23,14 +24,14 @@ public BlockStatesDatagen(PackOutput output, String modid, ExistingFileHelper ex @Override protected void registerStatesAndModels() { - registerOnlyState(BlockRegistry.SOURCE_GEM_BLOCK, LibBlockNames.SOURCE_GEM_BLOCK); - registerOnlyState(BlockRegistry.RED_SBED, LibBlockNames.RED_SBED); - registerOnlyState(BlockRegistry.BLUE_SBED, LibBlockNames.BLUE_SBED); - registerOnlyState(BlockRegistry.GREEN_SBED, LibBlockNames.GREEN_SBED); - registerOnlyState(BlockRegistry.YELLOW_SBED, LibBlockNames.YELLOW_SBED); - registerOnlyState(BlockRegistry.ORANGE_SBED, LibBlockNames.ORANGE_SBED); - registerOnlyState(BlockRegistry.PURPLE_SBED, LibBlockNames.PURPLE_SBED); - registerOnlyState(BlockRegistry.POTION_DIFFUSER, LibBlockNames.POTION_DIFFUSER); + registerOnlyState(BlockRegistry.SOURCE_GEM_BLOCK.get(), LibBlockNames.SOURCE_GEM_BLOCK); + registerOnlyState(BlockRegistry.RED_SBED.get(), LibBlockNames.RED_SBED); + registerOnlyState(BlockRegistry.BLUE_SBED.get(), LibBlockNames.BLUE_SBED); + registerOnlyState(BlockRegistry.GREEN_SBED.get(), LibBlockNames.GREEN_SBED); + registerOnlyState(BlockRegistry.YELLOW_SBED.get(), LibBlockNames.YELLOW_SBED); + registerOnlyState(BlockRegistry.ORANGE_SBED.get(), LibBlockNames.ORANGE_SBED); + registerOnlyState(BlockRegistry.PURPLE_SBED.get(), LibBlockNames.PURPLE_SBED); + registerOnlyState(BlockRegistry.POTION_DIFFUSER.get(), LibBlockNames.POTION_DIFFUSER); registerOnlyState(BlockRegistry.AGRONOMIC_SOURCELINK.get(), LibBlockNames.AGRONOMIC_SOURCELINK); registerOnlyState(BlockRegistry.ALCHEMICAL_BLOCK.get(), LibBlockNames.ALCHEMICAL_SOURCELINK); registerOnlyState(BlockRegistry.MYCELIAL_BLOCK.get(), LibBlockNames.MYCELIAL_SOURCELINK); @@ -43,7 +44,7 @@ protected void registerStatesAndModels() { registerNormalCube(BlockRegistry.VOID_PRISM.get(), LibBlockNames.VOID_PRISM); for (String s : LibBlockNames.DECORATIVE_SOURCESTONE) { - registerNormalCube(ForgeRegistries.BLOCKS.getValue(ArsNouveau.prefix( s)), s); + registerNormalCube(BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s)), s); } registerNormalCube(BlockRegistry.MAGEBLOOM_BLOCK.get(), LibBlockNames.MAGEBLOOM_BLOCK); registerNormalCube(BlockRegistry.FALSE_WEAVE.get(), LibBlockNames.FALSE_WEAVE); @@ -52,10 +53,10 @@ protected void registerStatesAndModels() { for(String s : LibBlockNames.DECORATIVE_SOURCESTONE){ ResourceLocation tex = ArsNouveau.prefix( "block/" + s); - Block block = ForgeRegistries.BLOCKS.getValue(ArsNouveau.prefix( s + "_stairs")); + Block block = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s + "_stairs")); stairsBlock((StairBlock) block, tex); - Block slab = ForgeRegistries.BLOCKS.getValue(ArsNouveau.prefix( s + "_slab")); + Block slab = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s + "_slab")); slabBlock((SlabBlock) slab, ArsNouveau.prefix( s), tex); } } From 50771800cc714fa0fe059c52e72c64d63df93420 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 23 Jun 2024 21:18:25 -0500 Subject: [PATCH 013/363] fix remaining apparatus recipes --- .../jei/ArmorUpgradeRecipeCategory.java | 2 +- .../block/tile/EnchantingApparatusTile.java | 7 +- .../common/block/tile/SingleItemTile.java | 10 +- .../crafting/recipes/ArmorUpgradeRecipe.java | 84 ++++--------- .../recipes/ReactiveEnchantmentRecipe.java | 107 +++++----------- .../crafting/recipes/SpellWriteRecipe.java | 116 +++++------------- .../common/util/SpellPartConfigUtil.java | 5 +- .../world/saved_data/RedstoneSavedData.java | 29 +++-- 8 files changed, 116 insertions(+), 244 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ArmorUpgradeRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ArmorUpgradeRecipeCategory.java index 44873128cf..a3f1ad8981 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ArmorUpgradeRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ArmorUpgradeRecipeCategory.java @@ -86,6 +86,6 @@ public void draw(ArmorUpgradeRecipe recipe, @NotNull IRecipeSlotsView slotsView, graphics.drawString(renderer, Component.translatable("ars_nouveau.tier", 1 + recipe.tier), 0, 0, 10,false); if (recipe.consumesSource()) - graphics.drawString(renderer, Component.translatable("ars_nouveau.source", recipe.sourceCost), 0, 100, 10,false); + graphics.drawString(renderer, Component.translatable("ars_nouveau.source", recipe.sourceCost()), 0, 100, 10,false); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java index 6ae3bc1615..1348661889 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.api.util.SourceUtil; import com.hollingsworth.arsnouveau.client.particle.*; import com.hollingsworth.arsnouveau.common.block.ITickable; +import com.hollingsworth.arsnouveau.common.crafting.recipes.ApparatusRecipeInput; import com.hollingsworth.arsnouveau.common.crafting.recipes.IEnchantingRecipe; import com.hollingsworth.arsnouveau.common.network.HighlightAreaPacket; import com.hollingsworth.arsnouveau.common.network.Networking; @@ -92,10 +93,8 @@ public void tick() { if (this.isCrafting) { IEnchantingRecipe recipe = this.getRecipe(stack, null); - List pedestalItems = getPedestalItems(); if (recipe != null) { - pedestalItems.forEach(i -> i = null); - this.stack = recipe.getResult(pedestalItems, this.stack, this); + this.stack = recipe.assemble(new ApparatusRecipeInput(this), level.registryAccess()); clearItems(); setChanged(); ParticleUtil.spawnPoof((ServerLevel) level, worldPosition); @@ -137,7 +136,7 @@ public List getPedestalItems() { public IEnchantingRecipe getRecipe(ItemStack stack, @Nullable Player playerEntity) { List pedestalItems = getPedestalItems(); - var holder = ArsNouveauAPI.getInstance().getEnchantingApparatusRecipes(level).stream().filter(r -> r.value().matches(pedestalItems, stack, this, playerEntity)).findFirst().orElse(null); + var holder = ArsNouveauAPI.getInstance().getEnchantingApparatusRecipes(level).stream().filter(r -> r.value().matches(new ApparatusRecipeInput(stack, pedestalItems, playerEntity), level)).findFirst().orElse(null); return holder != null ? holder.value() : null; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java index fceb4b9daf..6a04bb2761 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java @@ -1,10 +1,9 @@ package com.hollingsworth.arsnouveau.common.block.tile; -import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.world.Container; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; @@ -92,15 +91,16 @@ public void setStack(ItemStack otherStack){ @Override protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.loadAdditional(compound, pRegistries); - stack = ItemStack.of((CompoundTag) compound.get("itemStack")); + if(compound.contains("itemStack")) { + ItemStack.parse(pRegistries, compound.get("itemStack")).ifPresent(stack -> this.stack = stack); + } } @Override public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); if (stack != null) { - CompoundTag stackTag = new CompoundTag(); - stack.save(stackTag); + Tag stackTag = stack.save(pRegistries); tag.put("itemStack", stackTag); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java index f8c4327d14..6db246724a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java @@ -1,17 +1,16 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; import com.hollingsworth.arsnouveau.api.perk.ArmorPerkHolder; import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; import com.hollingsworth.arsnouveau.api.util.PerkUtil; -import com.hollingsworth.arsnouveau.common.block.tile.EnchantingApparatusTile; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -import net.minecraft.network.FriendlyByteBuf; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.HolderLookup; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -19,8 +18,6 @@ import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; -import javax.annotation.Nullable; -import java.util.ArrayList; import java.util.List; public class ArmorUpgradeRecipe extends EnchantingApparatusRecipe implements ITextOutput{ @@ -36,6 +33,10 @@ public ArmorUpgradeRecipe(List pedestalItems, int cost, int tier) { this.tier = tier; } + public int tier(){ + return tier; + } + @Override public boolean excludeJei() { return true; @@ -56,16 +57,13 @@ public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.a } @Override - public boolean isMatch(List pedestalItems, ItemStack reagent, EnchantingApparatusTile enchantingApparatusTile, @Nullable Player player) { - IPerkHolder perkHolder = PerkUtil.getPerkHolder(reagent); - if(!(perkHolder instanceof ArmorPerkHolder armorPerkHolder)){ - return false; - } - return armorPerkHolder.getTier() == (tier - 1) && super.matches(pedestalItems, reagent, enchantingApparatusTile, player); + public ItemStack getResultItem(HolderLookup.Provider pRegistries) { + return ItemStack.EMPTY; } @Override - public ItemStack getResult(List pedestalItems, ItemStack reagent, EnchantingApparatusTile enchantingApparatusTile) { + public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider p_346030_) { + ItemStack reagent = input.catalyst(); IPerkHolder perkHolder = PerkUtil.getPerkHolder(reagent); if(!(perkHolder instanceof ArmorPerkHolder armorPerkHolder)){ return reagent.copy(); @@ -74,7 +72,6 @@ public ItemStack getResult(List pedestalItems, ItemStack reagent, Enc return reagent.copy(); } - @Override public RecipeType getType() { return RecipeRegistry.ARMOR_UPGRADE_TYPE.get(); @@ -91,55 +88,22 @@ public RecipeSerializer getSerializer() { } public static class Serializer implements RecipeSerializer { + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Ingredient.CODEC.listOf().fieldOf("pedestalItems").forGetter(ArmorUpgradeRecipe::pedestalItems), + Codec.INT.fieldOf("sourceCost").forGetter(ArmorUpgradeRecipe::sourceCost), + Codec.INT.fieldOf("tier").forGetter(ArmorUpgradeRecipe::tier) + ).apply(instance, ArmorUpgradeRecipe::new)); - @Override - public ArmorUpgradeRecipe fromJson(ResourceLocation recipeId, JsonObject json) { - int cost = json.has("sourceCost") ? GsonHelper.getAsInt(json, "sourceCost") : 0; - int tier = json.has("tier") ? GsonHelper.getAsInt(json, "tier") : 0; - JsonArray pedestalItems = GsonHelper.getAsJsonArray(json, "pedestalItems"); - List stacks = new ArrayList<>(); - - for (JsonElement e : pedestalItems) { - JsonObject obj = e.getAsJsonObject(); - Ingredient input = null; - if (GsonHelper.isArrayNode(obj, "item")) { - input = Ingredient.fromJson(GsonHelper.getAsJsonArray(obj, "item")); - } else { - input = Ingredient.fromJson(GsonHelper.getAsJsonObject(obj, "item")); - } - stacks.add(input); - } - return new ArmorUpgradeRecipe(recipeId, stacks, cost, tier); - } + public static StreamCodec STREAM_CODEC = CheatSerializer.create(CODEC); - @Nullable @Override - public ArmorUpgradeRecipe fromNetwork(ResourceLocation recipeId, FriendlyByteBuf buffer) { - - int length = buffer.readInt(); - List stacks = new ArrayList<>(); - - for (int i = 0; i < length; i++) { - try { - stacks.add(Ingredient.fromNetwork(buffer)); - } catch (Exception e) { - e.printStackTrace(); - break; - } - } - int cost = buffer.readInt(); - int tier = buffer.readInt(); - return new ArmorUpgradeRecipe(recipeId, stacks, cost, tier); + public MapCodec codec() { + return CODEC; } @Override - public void toNetwork(FriendlyByteBuf buf, ArmorUpgradeRecipe recipe) { - buf.writeInt(recipe.pedestalItems.size()); - for (Ingredient i : recipe.pedestalItems) { - i.toNetwork(buf); - } - buf.writeInt(recipe.sourceCost); - buf.writeInt(recipe.tier); + public StreamCodec streamCodec() { + return STREAM_CODEC; } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java index b152941fd3..99027f37f0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java @@ -1,39 +1,48 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.util.CasterUtil; -import com.hollingsworth.arsnouveau.common.block.tile.EnchantingApparatusTile; import com.hollingsworth.arsnouveau.common.items.SpellParchment; import com.hollingsworth.arsnouveau.common.spell.casters.ReactiveCaster; import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.HolderLookup; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; -import java.util.ArrayList; import java.util.List; public class ReactiveEnchantmentRecipe extends EnchantmentRecipe { public ReactiveEnchantmentRecipe(List pedestalItems, int sourceCost) { - super(pedestalItems, EnchantmentRegistry.REACTIVE_ENCHANTMENT.get(), 1, sourceCost); + super(pedestalItems, EnchantmentRegistry.REACTIVE_ENCHANTMENT.getKey(), 1, sourceCost); } @Override - public boolean matches(List pedestalItems, ItemStack reagent, @Nullable Player player) { - ItemStack parchment = getParchment(pedestalItems); - return super.matches(pedestalItems, reagent, player) && !parchment.isEmpty() && !CasterUtil.getCaster(parchment).getSpell().isEmpty(); + public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider lookup) { + ItemStack result = super.assemble(input, lookup); + ItemStack parchment = getParchment(input.pedestals()); + ISpellCaster parchmentCaster = CasterUtil.getCaster(parchment); + ReactiveCaster reactiveCaster = new ReactiveCaster(result); + reactiveCaster.setColor(parchmentCaster.getColor()); + reactiveCaster.setSpell(parchmentCaster.getSpell()); + return result; + } + + @Override + public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.annotations.Nullable Player player) { + ItemStack parchment = getParchment(input.pedestals()); + return super.matches(input, level, player) && !parchment.isEmpty() && !CasterUtil.getCaster(parchment).getSpell().isEmpty(); } public static@NotNull ItemStack getParchment(List pedestalItems) { @@ -55,78 +64,24 @@ public RecipeSerializer getSerializer() { return RecipeRegistry.REACTIVE_RECIPE.get(); } - @Override - public ItemStack getResult(List pedestalItems, ItemStack reagent, EnchantingApparatusTile enchantingApparatusTile) { - ItemStack resultStack = super.getResult(pedestalItems, reagent, enchantingApparatusTile); - ItemStack parchment = getParchment(pedestalItems); - ISpellCaster parchmentCaster = CasterUtil.getCaster(parchment); - ReactiveCaster reactiveCaster = new ReactiveCaster(resultStack); - reactiveCaster.setColor(parchmentCaster.getColor()); - reactiveCaster.setSpell(parchmentCaster.getSpell()); - return resultStack; - } - - @Override - public JsonElement asRecipe() { - JsonObject jsonobject = new JsonObject(); - jsonobject.addProperty("type", "ars_nouveau:" + RecipeRegistry.REACTIVE_RECIPE_ID); - jsonobject.addProperty("sourceCost", sourceCost()); - JsonArray pedestalArr = new JsonArray(); - for (Ingredient i : this.pedestalItems) { - JsonObject object = new JsonObject(); - object.add("item", i.toJson()); - pedestalArr.add(object); - } - jsonobject.add("pedestalItems", pedestalArr); - return jsonobject; - } public static class Serializer implements RecipeSerializer { - @Override - public ReactiveEnchantmentRecipe fromJson(ResourceLocation recipeId, JsonObject json) { - int sourceCost = GsonHelper.getAsInt(json, "sourceCost", 0); - JsonArray pedestalItems = GsonHelper.getAsJsonArray(json, "pedestalItems"); - List stacks = new ArrayList<>(); + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Ingredient.CODEC.listOf().fieldOf("pedestalItems").forGetter(ReactiveEnchantmentRecipe::pedestalItems), + Codec.INT.fieldOf("sourceCost").forGetter(ReactiveEnchantmentRecipe::sourceCost) + ).apply(instance, ReactiveEnchantmentRecipe::new)); - for (JsonElement e : pedestalItems) { - JsonObject obj = e.getAsJsonObject(); - Ingredient input; - if (GsonHelper.isArrayNode(obj, "item")) { - input = Ingredient.fromJson(GsonHelper.getAsJsonArray(obj, "item")); - } else { - input = Ingredient.fromJson(GsonHelper.getAsJsonObject(obj, "item")); - } - stacks.add(input); - } - return new ReactiveEnchantmentRecipe(stacks, sourceCost); - } + public static final StreamCodec STREAM = CheatSerializer.create(CODEC); - @Nullable @Override - public ReactiveEnchantmentRecipe fromNetwork(ResourceLocation recipeId, FriendlyByteBuf buffer) { - int length = buffer.readInt(); - int sourceCost = buffer.readInt(); - List stacks = new ArrayList<>(); - - for (int i = 0; i < length; i++) { - try { - stacks.add(Ingredient.fromNetwork(buffer)); - } catch (Exception e) { - e.printStackTrace(); - break; - } - } - return new ReactiveEnchantmentRecipe(stacks, sourceCost); + public MapCodec codec() { + return CODEC; } @Override - public void toNetwork(FriendlyByteBuf buf, ReactiveEnchantmentRecipe recipe) { - buf.writeInt(recipe.pedestalItems.size()); - buf.writeInt(recipe.sourceCost()); - for (Ingredient i : recipe.pedestalItems) { - i.toNetwork(buf); - } + public StreamCodec streamCodec() { + return STREAM; } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java index 64ccc819b2..3544c97edd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java @@ -1,44 +1,34 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.util.CasterUtil; -import com.hollingsworth.arsnouveau.common.block.tile.EnchantingApparatusTile; import com.hollingsworth.arsnouveau.common.spell.casters.ReactiveCaster; import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.HolderLookup; import net.minecraft.core.component.DataComponents; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.enchantment.ItemEnchantments; +import net.minecraft.world.level.Level; -import javax.annotation.Nullable; -import java.util.ArrayList; import java.util.List; import static com.hollingsworth.arsnouveau.common.crafting.recipes.ReactiveEnchantmentRecipe.getParchment; public class SpellWriteRecipe extends EnchantingApparatusRecipe implements ITextOutput { - public SpellWriteRecipe(ResourceLocation id, List pedestalItems, int cost) { - this.pedestalItems = pedestalItems; - this.id = id; - this.sourceCost = cost; - } - - public SpellWriteRecipe(List pedestalItems) { - this.pedestalItems = pedestalItems; - this.id = ArsNouveau.prefix( "spell_write"); + public SpellWriteRecipe(List pedestalItems, int cost) { + super(Ingredient.EMPTY, ItemStack.EMPTY, pedestalItems, cost, true); } @Override @@ -47,41 +37,28 @@ public boolean excludeJei() { } @Override - public boolean isMatch(List pedestalItems, ItemStack reagent, EnchantingApparatusTile enchantingApparatusTile, @Nullable Player player) { - ItemEnchantments enchantments = reagent.get(DataComponents.ENCHANTMENTS); - int level = enchantments.getLevel(EnchantmentRegistry.REACTIVE_ENCHANTMENT.get()); - ItemStack parchment = getParchment(pedestalItems); - return !parchment.isEmpty() && !CasterUtil.getCaster(parchment).getSpell().isEmpty() && level > 0 && super.matches(pedestalItems, reagent, enchantingApparatusTile, player); + public boolean doesReagentMatch(ApparatusRecipeInput input, Level level, @org.jetbrains.annotations.Nullable Player player) { + return true; } @Override - public boolean doesReagentMatch(ItemStack reag) { - return true; + public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.annotations.Nullable Player player) { + ItemEnchantments enchantments = input.catalyst().get(DataComponents.ENCHANTMENTS); + int level1 = enchantments.getLevel(EnchantmentRegistry.REACTIVE_ENCHANTMENT); + ItemStack parchment = getParchment(input.pedestals()); + return !parchment.isEmpty() && !CasterUtil.getCaster(parchment).getSpell().isEmpty() && level1 > 0 && super.matches(input, level, player); + } @Override - public ItemStack getResult(List pedestalItems, ItemStack reagent, EnchantingApparatusTile enchantingApparatusTile) { - ItemStack parchment = getParchment(pedestalItems); + public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider p_346030_) { + ItemStack parchment = getParchment(input.pedestals()); ISpellCaster caster = CasterUtil.getCaster(parchment); - ReactiveCaster reactiveCaster = new ReactiveCaster(reagent); + ItemStack result = input.catalyst().copy(); + ReactiveCaster reactiveCaster = new ReactiveCaster(result); reactiveCaster.setSpell(caster.getSpell()); reactiveCaster.setColor(caster.getColor()); - return reagent.copy(); - } - - @Override - public JsonElement asRecipe() { - JsonObject jsonobject = new JsonObject(); - jsonobject.addProperty("type", "ars_nouveau:" + RecipeRegistry.SPELL_WRITE_RECIPE_ID); - jsonobject.addProperty("sourceCost", sourceCost()); - JsonArray pedestalArr = new JsonArray(); - for (Ingredient i : this.pedestalItems) { - JsonObject object = new JsonObject(); - object.add("item", i.toJson()); - pedestalArr.add(object); - } - jsonobject.add("pedestalItems", pedestalArr); - return jsonobject; + return result; } @Override @@ -103,50 +80,21 @@ public RecipeSerializer getSerializer() { public static class Serializer implements RecipeSerializer { - @Override - public SpellWriteRecipe fromJson(ResourceLocation recipeId, JsonObject json) { - int cost = json.has("sourceCost") ? GsonHelper.getAsInt(json, "sourceCost") : 0; - JsonArray pedestalItems = GsonHelper.getAsJsonArray(json, "pedestalItems"); - List stacks = new ArrayList<>(); - - for (JsonElement e : pedestalItems) { - JsonObject obj = e.getAsJsonObject(); - Ingredient input = null; - if (GsonHelper.isArrayNode(obj, "item")) { - input = Ingredient.fromJson(GsonHelper.getAsJsonArray(obj, "item")); - } else { - input = Ingredient.fromJson(GsonHelper.getAsJsonObject(obj, "item")); - } - stacks.add(input); - } - return new SpellWriteRecipe(recipeId, stacks, cost); - } + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Ingredient.CODEC.listOf().fieldOf("pedestalItems").forGetter(SpellWriteRecipe::pedestalItems), + Codec.INT.fieldOf("sourceCost").forGetter(SpellWriteRecipe::sourceCost) + ).apply(instance, SpellWriteRecipe::new)); + + public static final StreamCodec STREAM = CheatSerializer.create(CODEC); - @Nullable @Override - public SpellWriteRecipe fromNetwork(ResourceLocation recipeId, FriendlyByteBuf buffer) { - int length = buffer.readInt(); - List stacks = new ArrayList<>(); - - for (int i = 0; i < length; i++) { - try { - stacks.add(Ingredient.fromNetwork(buffer)); - } catch (Exception e) { - e.printStackTrace(); - break; - } - } - int cost = buffer.readInt(); - return new SpellWriteRecipe(recipeId, stacks, cost); + public MapCodec codec() { + return CODEC; } @Override - public void toNetwork(FriendlyByteBuf buf, SpellWriteRecipe recipe) { - buf.writeInt(recipe.pedestalItems.size()); - for (Ingredient i : recipe.pedestalItems) { - i.toNetwork(buf); - } - buf.writeInt(recipe.sourceCost); + public StreamCodec streamCodec() { + return STREAM; } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/SpellPartConfigUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/SpellPartConfigUtil.java index 8b81f3eff0..5075a6f364 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/SpellPartConfigUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/SpellPartConfigUtil.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.setup.config.ConfigUtil; import net.minecraft.resources.ResourceLocation; import net.neoforged.neoforge.common.ModConfigSpec; + import java.util.HashSet; import java.util.List; import java.util.Map; @@ -12,8 +13,6 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; -import static com.hollingsworth.arsnouveau.setup.config.ConfigUtil.writeConfig; - /** * Utility class for code around handling spell part configuration. */ @@ -110,7 +109,7 @@ public static AugmentLimits buildAugmentLimitsConfig(ModConfigSpec.Builder build public static ComboLimits buildInvalidCombosConfig(ModConfigSpec.Builder builder, Set defaults) { ModConfigSpec.ConfigValue> configValue = builder .comment("Prevents the given glyph from being used in the same spell as the given glyph", "Example entry: \"" + GlyphLib.EffectBurstID + "\"") - .defineList("invalid_combos", writeComboConfig(defaults), (o) -> o instanceof String s && ResourceLocation.isValidResourceLocation(s)); + .defineList("invalid_combos", writeComboConfig(defaults), (o) -> o instanceof String s && ResourceLocation.read(s).isSuccess()); return new ComboLimits(configValue); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneSavedData.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneSavedData.java index d7c6d84526..701c18f41d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneSavedData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/saved_data/RedstoneSavedData.java @@ -2,13 +2,14 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.saveddata.SavedData; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; - +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.tick.LevelTickEvent; import java.util.ArrayList; import java.util.HashMap; @@ -23,12 +24,18 @@ public RedstoneSavedData(){ } - public RedstoneSavedData(CompoundTag tag){ + public static SavedData.Factory factory() { + return new SavedData.Factory<>(RedstoneSavedData::new, RedstoneSavedData::load, null); + } + + public static RedstoneSavedData load(CompoundTag tag, HolderLookup.Provider p_323806_){ + RedstoneSavedData data = new RedstoneSavedData(); ListTag signalList = tag.getList("SignalList", 10); for(int i = 0; i < signalList.size(); i++){ var signal = new Entry(signalList.getCompound(i)); - SIGNAL_MAP.put(signal.pos, signal); + data.SIGNAL_MAP.put(signal.pos, signal); } + return data; } public void tick(ServerLevel serverLevel){ @@ -42,7 +49,7 @@ public void tick(ServerLevel serverLevel){ } for(var pos : toRemove){ SIGNAL_MAP.remove(pos); - serverLevel.getBlockState(pos).neighborChanged(serverLevel, pos, serverLevel.getBlockState(pos).getBlock(), pos, false); + serverLevel.getBlockState(pos).onNeighborChange(serverLevel, pos, pos); serverLevel.updateNeighborsAt(pos, serverLevel.getBlockState(pos).getBlock()); } } @@ -53,7 +60,7 @@ public boolean isDirty() { } @Override - public CompoundTag save(CompoundTag pCompoundTag) { + public CompoundTag save(CompoundTag pCompoundTag, HolderLookup.Provider pRegistries) { ListTag signalList = new ListTag(); for(var signal : SIGNAL_MAP.values()){ signalList.add(signal.save(new CompoundTag())); @@ -64,7 +71,7 @@ public CompoundTag save(CompoundTag pCompoundTag) { public static RedstoneSavedData from(ServerLevel level){ return level.getDataStorage() - .computeIfAbsent(RedstoneSavedData::new, RedstoneSavedData::new, "an_redstone_signals" ); + .computeIfAbsent(factory(), "an_redstone_signals" ); } public static class Entry{ @@ -93,12 +100,12 @@ public CompoundTag save(CompoundTag tag){ } @SubscribeEvent - public static void serverTick(TickEvent.LevelTickEvent e) { + public static void serverTick(LevelTickEvent.Post e) { - if (e.level.isClientSide || e.phase != TickEvent.Phase.END) + if (e.getLevel().isClientSide ) return; - RedstoneSavedData data = RedstoneSavedData.from((ServerLevel) e.level); - data.tick((ServerLevel) e.level); + RedstoneSavedData data = RedstoneSavedData.from((ServerLevel) e.getLevel()); + data.tick((ServerLevel) e.getLevel()); } } From 3966106007f38b347b0d5d76df0897863df8b844 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 24 Jun 2024 09:17:13 -0500 Subject: [PATCH 014/363] fix jei, more categories --- build.gradle | 11 +++++++ .../arsnouveau/api/spell/IPotionEffect.java | 7 +++-- .../ApparatusEnchantingRecipeCategory.java | 9 ++++-- .../client/jei/CrushRecipeCategory.java | 18 +++++------ .../EnchantingApparatusRecipeCategory.java | 4 +-- .../client/particle/ParticleRenderTypes.java | 30 +++++++++---------- .../client/registry/ModKeyBindings.java | 2 +- .../client/renderer/entity/BookwyrmModel.java | 4 +-- .../client/waila/MobJarComponent.java | 6 ++-- .../client/waila/WailaArsNouveauPlugin.java | 2 +- .../common/entity/AnimBlockSummon.java | 11 ++++--- .../common/entity/pathfinding/ChunkCache.java | 3 +- .../arsnouveau/common/event/EventHandler.java | 4 ++- .../arsnouveau/common/event/SummonEvents.java | 18 ----------- .../spell/effect/EffectSummonUndead.java | 5 ++-- .../common/spell/effect/EffectSummonVex.java | 4 +-- .../common/spell/effect/EffectToss.java | 4 +-- .../arsnouveau/common/util/HolderHelper.java | 17 +++++++++++ 18 files changed, 88 insertions(+), 71 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/event/SummonEvents.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/util/HolderHelper.java diff --git a/build.gradle b/build.gradle index 5a845a3fd4..9c034d649e 100644 --- a/build.gradle +++ b/build.gradle @@ -66,6 +66,16 @@ repositories { includeGroup("software.bernie.geckolib") } } + exclusiveContent { + forRepository { + maven { + url "https://cursemaven.com" + } + } + filter { + includeGroup "curse.maven" + } + } maven { name = "Illusive Soulworks maven" url = "https://maven.theillusivec4.top/" @@ -101,6 +111,7 @@ dependencies { compileOnly "mezz.jei:jei-1.21-neoforge-api:${jei_version}" localRuntime "mezz.jei:jei-1.21-neoforge:${jei_version}" implementation 'com.github.glitchfiend:TerraBlender-neoforge:1.21-4.0.0.0' + implementation "curse.maven:jade-324717:5444008" } tasks.withType(ProcessResources).configureEach { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/IPotionEffect.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/IPotionEffect.java index e2017c21bb..dbd31814b2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/IPotionEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/IPotionEffect.java @@ -1,20 +1,21 @@ package com.hollingsworth.arsnouveau.api.spell; +import net.minecraft.core.Holder; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.LivingEntity; public interface IPotionEffect { - default void applyConfigPotion(LivingEntity entity, MobEffect potionEffect, SpellStats spellStats) { + default void applyConfigPotion(LivingEntity entity, Holder potionEffect, SpellStats spellStats) { applyConfigPotion(entity, potionEffect, spellStats, true); } - default void applyConfigPotion(LivingEntity entity, MobEffect potionEffect, SpellStats spellStats, boolean showParticles) { + default void applyConfigPotion(LivingEntity entity, Holder potionEffect, SpellStats spellStats, boolean showParticles) { applyPotion(entity, potionEffect, spellStats, getBaseDuration(), getExtendTimeDuration(), showParticles); } - default void applyPotion(LivingEntity entity, MobEffect potionEffect, SpellStats stats, int baseDurationSeconds, int durationBuffSeconds, boolean showParticles) { + default void applyPotion(LivingEntity entity, Holder potionEffect, SpellStats stats, int baseDurationSeconds, int durationBuffSeconds, boolean showParticles) { if (entity == null) return; int ticks = baseDurationSeconds * 20 + durationBuffSeconds * stats.getDurationInTicks(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ApparatusEnchantingRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ApparatusEnchantingRecipeCategory.java index 68a7a126d3..5b065ed2fe 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ApparatusEnchantingRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ApparatusEnchantingRecipeCategory.java @@ -1,11 +1,13 @@ package com.hollingsworth.arsnouveau.client.jei; import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantmentRecipe; +import com.hollingsworth.arsnouveau.common.util.HolderHelper; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.helpers.IGuiHelper; import mezz.jei.api.recipe.IFocusGroup; import mezz.jei.api.recipe.RecipeIngredientRole; import mezz.jei.api.recipe.RecipeType; +import net.minecraft.client.Minecraft; import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.world.item.EnchantedBookItem; @@ -13,6 +15,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.enchantment.EnchantmentInstance; +import net.minecraft.world.level.Level; import java.util.List; @@ -27,8 +30,8 @@ public void setRecipe(IRecipeLayoutBuilder builder, EnchantmentRecipe recipe, IF List inputs = multiProvider.apply(recipe).input(); double angleBetweenEach = 360.0 / inputs.size(); - - ItemStack dummy = recipe.enchantLevel > 1 ? EnchantedBookItem.createForEnchantment(new EnchantmentInstance(recipe.enchantmentKey, recipe.enchantLevel-1)) : Items.BOOK.getDefaultInstance(); + Level level = Minecraft.getInstance().level; + ItemStack dummy = recipe.enchantLevel > 1 ? EnchantedBookItem.createForEnchantment(new EnchantmentInstance(HolderHelper.unwrap(level, recipe.enchantmentKey), recipe.enchantLevel-1)) : Items.BOOK.getDefaultInstance(); Component message = recipe.enchantLevel == 1 ? Component.literal("Any compatible item") : Component.literal("Needs lower level enchantment"); dummy.set(DataComponents.CUSTOM_NAME, message); //TODO Translatable @@ -40,7 +43,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, EnchantmentRecipe recipe, IF point = rotatePointAbout(point, center, angleBetweenEach); } - builder.addSlot(RecipeIngredientRole.OUTPUT, 86, 10).addItemStack(EnchantedBookItem.createForEnchantment(new EnchantmentInstance(recipe.enchantmentKey, recipe.enchantLevel))); + builder.addSlot(RecipeIngredientRole.OUTPUT, 86, 10).addItemStack(EnchantedBookItem.createForEnchantment(new EnchantmentInstance(HolderHelper.unwrap(level, recipe.enchantmentKey), recipe.enchantLevel))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/CrushRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/CrushRecipeCategory.java index 8417f6b61c..49d237e776 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/CrushRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/CrushRecipeCategory.java @@ -66,21 +66,21 @@ public void draw(CrushRecipe recipe, @NotNull IRecipeSlotsView slotsView, @NotNu IDrawableAnimated arrow = this.cachedArrows.getUnchecked(40); arrow.draw(matrixStack, 22, 6); Font renderer = Minecraft.getInstance().font; - for (int i = 0; i < recipe.outputs.size(); i++) { - CrushRecipe.CrushOutput output = recipe.outputs.get(i); - matrixStack.drawString(renderer, Math.round(100 * output.chance - 0.5f) + "%", 98, 11 + 17 * i, 10,false); - if(output.maxRange > 1) { - matrixStack.drawString(renderer, "1-" + output.maxRange, 75, 11 + 17 * i, 10,false); + for (int i = 0; i < recipe.outputs().size(); i++) { + CrushRecipe.CrushOutput output = recipe.outputs().get(i); + matrixStack.drawString(renderer, Math.round(100 * output.chance() - 0.5f) + "%", 98, 11 + 17 * i, 10,false); + if(output.maxRange() > 1) { + matrixStack.drawString(renderer, "1-" + output.maxRange(), 75, 11 + 17 * i, 10,false); } } } @Override public void setRecipe(IRecipeLayoutBuilder builder, CrushRecipe recipe, IFocusGroup focuses) { - builder.addSlot(RecipeIngredientRole.INPUT, 6, 5).addIngredients(recipe.input); - for (int i = 0; i < recipe.outputs.size(); i++) { - CrushRecipe.CrushOutput output = recipe.outputs.get(i); - builder.addSlot(RecipeIngredientRole.OUTPUT, 50, 5 + 16 * i).addItemStack(output.stack); + builder.addSlot(RecipeIngredientRole.INPUT, 6, 5).addIngredients(recipe.input()); + for (int i = 0; i < recipe.outputs().size(); i++) { + CrushRecipe.CrushOutput output = recipe.outputs().get(i); + builder.addSlot(RecipeIngredientRole.OUTPUT, 50, 5 + 16 * i).addItemStack(output.stack()); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/EnchantingApparatusRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/EnchantingApparatusRecipeCategory.java index 2170ccbc68..6c291743ec 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/EnchantingApparatusRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/EnchantingApparatusRecipeCategory.java @@ -20,7 +20,7 @@ public class EnchantingApparatusRecipeCategory new MultiProvider(enchantingApparatusRecipe.result, enchantingApparatusRecipe.pedestalItems, enchantingApparatusRecipe.reagent))); + super(helper, (enchantingApparatusRecipe -> new MultiProvider(enchantingApparatusRecipe.result(), enchantingApparatusRecipe.pedestalItems(), enchantingApparatusRecipe.reagent()))); background = helper.createBlankDrawable(114, 108); icon = helper.createDrawableIngredient(VanillaTypes.ITEM_STACK, new ItemStack(BlockRegistry.ENCHANTING_APP_BLOCK)); } @@ -50,6 +50,6 @@ public IDrawable getIcon() { public void draw(EnchantingApparatusRecipe recipe,@NotNull IRecipeSlotsView slotsView, GuiGraphics guiGraphics, double mouseX, double mouseY) { Font renderer = Minecraft.getInstance().font; if (recipe.consumesSource()) - guiGraphics.drawString(renderer, Component.translatable("ars_nouveau.source", recipe.sourceCost), 0, 100, 10,false); + guiGraphics.drawString(renderer, Component.translatable("ars_nouveau.source", recipe.sourceCost()), 0, 100, 10,false); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleRenderTypes.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleRenderTypes.java index 6228fd368f..fbb44f5c50 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleRenderTypes.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleRenderTypes.java @@ -1,7 +1,6 @@ package com.hollingsworth.arsnouveau.client.particle; import com.hollingsworth.arsnouveau.setup.config.Config; - import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.BufferBuilder; @@ -16,8 +15,9 @@ public class ParticleRenderTypes { static final ParticleRenderType EMBER_RENDER = new ParticleRenderType() { + @Override - public void begin(BufferBuilder buffer, TextureManager textureManager) { + public BufferBuilder begin(Tesselator buffer, TextureManager textureManager) { Minecraft.getInstance().gameRenderer.lightTexture().turnOnLightLayer(); if(Config.DISABLE_TRANSLUCENT_PARTICLES.get()) { RenderSystem.disableBlend(); @@ -32,12 +32,7 @@ public void begin(BufferBuilder buffer, TextureManager textureManager) { RenderSystem.enableCull(); RenderSystem.setShaderTexture(0, TextureAtlas.LOCATION_PARTICLES); RenderSystem.enableDepthTest(); - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE); - } - - @Override - public void end(Tesselator tessellator) { - tessellator.end(); + return buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE); } @Override @@ -47,8 +42,11 @@ public String toString() { }; static final ParticleRenderType EMBER_RENDER_NO_MASK = new ParticleRenderType() { + + + @Override - public void begin(BufferBuilder buffer, TextureManager textureManager) { + public BufferBuilder begin(Tesselator buffer, TextureManager textureManager) { if(Config.DISABLE_TRANSLUCENT_PARTICLES.get()) { RenderSystem.disableBlend(); RenderSystem.depthMask(true); @@ -62,14 +60,16 @@ public void begin(BufferBuilder buffer, TextureManager textureManager) { RenderSystem.enableCull(); RenderSystem.setShaderTexture(0, TextureAtlas.LOCATION_PARTICLES); RenderSystem.disableDepthTest(); - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE); + return buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE); } - @Override - public void end(Tesselator tessellator) { - tessellator.end(); - RenderSystem.enableDepthTest(); - } + //TODO: fix scry particles + +// @Override +// public void end(Tesselator tessellator) { +// tessellator.end(); +// RenderSystem.enableDepthTest(); +// } @Override public String toString() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModKeyBindings.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModKeyBindings.java index c0f0fea3ef..fa9d371bca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModKeyBindings.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModKeyBindings.java @@ -4,7 +4,7 @@ import net.minecraft.client.KeyMapping; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; import org.lwjgl.glfw.GLFW; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmModel.java index 914a46b7e2..92d72cf0e5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmModel.java @@ -3,10 +3,10 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; -import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.animatable.GeoAnimatable; - import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/waila/MobJarComponent.java b/src/main/java/com/hollingsworth/arsnouveau/client/waila/MobJarComponent.java index 40e79dfbad..5ecdf9d6dd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/waila/MobJarComponent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/waila/MobJarComponent.java @@ -4,7 +4,9 @@ import com.hollingsworth.arsnouveau.common.block.tile.MobJarTile; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.entity.BlockEntity; -import snownee.jade.api.*; +import snownee.jade.api.BlockAccessor; +import snownee.jade.api.IBlockComponentProvider; +import snownee.jade.api.ITooltip; import snownee.jade.api.config.IPluginConfig; import snownee.jade.impl.EntityAccessorImpl; @@ -23,7 +25,7 @@ public void appendTooltip(ITooltip tooltip, BlockAccessor blockAccessor, IPlugin .build(); // ._gatherComponents(($) -> tooltip); - tooltip.remove(Identifiers.CORE_MOD_NAME); +// tooltip.remove(Identifiers.CORE_MOD_NAME); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/waila/WailaArsNouveauPlugin.java b/src/main/java/com/hollingsworth/arsnouveau/client/waila/WailaArsNouveauPlugin.java index 53f557625d..b19b16e4df 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/waila/WailaArsNouveauPlugin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/waila/WailaArsNouveauPlugin.java @@ -20,7 +20,7 @@ public void registerClient(IWailaClientRegistration registration) { if (accessor instanceof BlockAccessor target) { Player player = accessor.getPlayer(); - if (player.isCreative() || player.isSpectator() || player.hasEffect(ModPotions.MAGIC_FIND_EFFECT.get())) + if (player.isCreative() || player.isSpectator() || player.hasEffect(ModPotions.MAGIC_FIND_EFFECT)) return accessor; if (target.getBlockEntity() instanceof GhostWeaveTile tile && tile.isInvisible()) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimBlockSummon.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimBlockSummon.java index a926ca1798..418304b057 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimBlockSummon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimBlockSummon.java @@ -10,9 +10,8 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.Util; +import net.minecraft.core.Holder; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; @@ -39,8 +38,8 @@ import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.Optional; @@ -66,8 +65,8 @@ public AnimBlockSummon(Level pLevel, BlockState state){ } @Override - public double getAttributeValue(Attribute pAttribute) { - if(pAttribute == Attributes.ATTACK_DAMAGE){ + public double getAttributeValue(Holder pAttribute) { + if(pAttribute.is(Attributes.ATTACK_DAMAGE)){ return super.getAttributeValue(pAttribute) + getStateDamageBonus(); } return super.getAttributeValue(pAttribute); @@ -93,7 +92,7 @@ protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); this.goalSelector.addGoal(4, new ConditionalLeapGoal(this, 0.4F, () -> entityData.get(CAN_WALK))); this.goalSelector.addGoal(5, new ConditionalMeleeGoal(this, 1.0D, true, () -> entityData.get(CAN_WALK))); - this.goalSelector.addGoal(6, new FollowOwnerGoal(this, 1.0D, 10.0F, 2.0F, false)); + this.goalSelector.addGoal(6, new FollowOwnerGoal(this, 1.0D, 10.0F, 2.0F)); this.goalSelector.addGoal(8, new WaterAvoidingRandomStrollGoal(this, 1.0D)); this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Player.class, 8.0F)); this.goalSelector.addGoal(10, new RandomLookAroundGoal(this)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/ChunkCache.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/ChunkCache.java index 8a8b0cb29b..df33dd584e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/ChunkCache.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/ChunkCache.java @@ -17,8 +17,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.border.WorldBorder; import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.lighting.LevelLightEngine; @@ -28,6 +28,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; + import javax.annotation.Nullable; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index 48c9cbf033..2750d606a6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -65,6 +65,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.trading.ItemCost; import net.minecraft.world.item.trading.MerchantOffer; import net.minecraft.world.level.ItemLike; @@ -332,7 +333,8 @@ public static void dispelEvent(DispelEvent event) { return; } } - for (DispelEntityRecipe recipe : level.getRecipeManager().getAllRecipesFor(RecipeRegistry.DISPEL_ENTITY_TYPE.get())) { + for (RecipeHolder holder : level.getRecipeManager().getAllRecipesFor(RecipeRegistry.DISPEL_ENTITY_TYPE.get())) { + var recipe = holder.value(); if (recipe.matches(event.shooter, entity)) { replaceEntityWithItems(level, entity, recipe.result(event.shooter, entity).toArray(ItemStack[]::new)); return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/SummonEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/SummonEvents.java deleted file mode 100644 index 9c5594dc43..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/SummonEvents.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.hollingsworth.arsnouveau.common.event; - -import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.event.SummonEvent; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; - -@EventBusSubscriber(modid = ArsNouveau.MODID) -public class SummonEvents { - - @SubscribeEvent - public static void summonedEvent(SummonEvent event) { - } - - @SubscribeEvent - public static void summonDeathEvent(SummonEvent.Death event) { - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java index 551271894d..4881179fa4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java @@ -3,8 +3,9 @@ import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.common.entity.SummonSkeleton; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; -import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import com.hollingsworth.arsnouveau.common.spell.augment.*; +import com.hollingsworth.arsnouveau.common.util.HolderHelper; +import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.core.BlockPos; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.LivingEntity; @@ -46,7 +47,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt if ((spellStats.hasBuff(AugmentPierce.INSTANCE))) { weapon = Items.BOW.getDefaultInstance(); if (spellStats.getAmpMultiplier() > 0) - weapon.enchant(Enchantments.POWER, Math.max(4, (int) spellStats.getAmpMultiplier()) - 1); + weapon.enchant(HolderHelper.unwrap(world, Enchantments.POWER), Math.max(4, (int) spellStats.getAmpMultiplier()) - 1); } else { if (spellStats.getAmpMultiplier() >= 3) { weapon = Items.NETHERITE_AXE.getDefaultInstance(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonVex.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonVex.java index bc9a938172..af29f715a4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonVex.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonVex.java @@ -38,13 +38,13 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt BlockPos blockpos = pos.offset(-2 + shooter.getRandom().nextInt(5), 2, -2 + shooter.getRandom().nextInt(5)); EntityAllyVex vexentity = new EntityAllyVex(world, shooter); vexentity.moveTo(blockpos, 0.0F, 0.0F); - vexentity.finalizeSpawn((ServerLevelAccessor) world, world.getCurrentDifficultyAt(blockpos), MobSpawnType.MOB_SUMMONED, null, null); + vexentity.finalizeSpawn((ServerLevelAccessor) world, world.getCurrentDifficultyAt(blockpos), MobSpawnType.MOB_SUMMONED, null); vexentity.setOwner(shooter); vexentity.setBoundOrigin(blockpos); vexentity.setLimitedLife(ticks); summonLivingEntity(rayTraceResult, world, shooter, spellStats, spellContext, resolver, vexentity); } - shooter.addEffect(new MobEffectInstance(ModPotions.SUMMONING_SICKNESS_EFFECT.get(), ticks)); + shooter.addEffect(new MobEffectInstance(ModPotions.SUMMONING_SICKNESS_EFFECT, ticks)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java index 0b45d19503..ba90d4edbd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java @@ -11,7 +11,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.neoforged.neoforge.capabilities.Capabilities; @@ -58,8 +57,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull summonStack(shooter, spellContext, world, pos, manager); return; } - BlockEntity tileEntity = world.getBlockEntity(rayTraceResult.getBlockPos()); - IItemHandler targetInv = tileEntity.getCapability(Capabilities.ITEM_HANDLER); + IItemHandler targetInv = world.getCapability(Capabilities.ItemHandler.BLOCK, rayTraceResult.getBlockPos(), null); if (targetInv == null) { return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/HolderHelper.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/HolderHelper.java new file mode 100644 index 0000000000..b293acfbec --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/HolderHelper.java @@ -0,0 +1,17 @@ +package com.hollingsworth.arsnouveau.common.util; + +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; + +public class HolderHelper { + + public static Holder unwrap(Level level, ResourceKey key){ + return level.registryAccess().registryOrThrow(key.registryKey()).getHolderOrThrow(key); + } + + public static Holder unwrap(BlockEntity entity, ResourceKey key){ + return entity.getLevel().registryAccess().registryOrThrow(key.registryKey()).getHolderOrThrow(key); + } +} From 579ca1ffd0b9c7157c2c4ea36160a880de44392a Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 25 Jun 2024 21:22:01 -0500 Subject: [PATCH 015/363] fix networking --- build.gradle | 6 +- .../hollingsworth/arsnouveau/ArsNouveau.java | 7 +- .../api/camera/ICameraMountable.java | 3 +- .../arsnouveau/api/item/ArsNouveauCurio.java | 13 +- .../arsnouveau/api/ritual/RitualUtil.java | 3 +- .../arsnouveau/api/spell/AbstractEffect.java | 9 +- .../arsnouveau/api/spell/SpellResolver.java | 19 +- .../arsnouveau/api/util/SpellUtil.java | 3 +- .../arsnouveau/client/SkyTextureHandler.java | 20 +- .../client/gui/book/GlyphUnlockMenu.java | 3 +- .../client/gui/book/GuiColorScreen.java | 9 +- .../client/gui/book/GuiFamiliarScreen.java | 3 +- .../client/gui/book/GuiSpellBook.java | 3 +- .../client/gui/book/InfinityGuiSpellBook.java | 3 +- .../client/gui/book/SoundScreen.java | 5 +- .../client/keybindings/KeyHandler.java | 7 +- .../particle/ColorParticleTypeData.java | 59 ++-- .../particle/ColoredDynamicTypeData.java | 57 ++-- .../client/particle/GlowParticleType.java | 13 +- .../client/particle/HelixParticleType.java | 13 +- .../particle/HelixParticleTypeData.java | 60 ++-- .../client/particle/LineParticleType.java | 13 +- .../client/particle/ParticleUtil.java | 2 +- .../client/particle/SparkleParticleType.java | 13 +- .../entity/AmethystGolemRenderer.java | 8 +- .../renderer/entity/AnimBlockRenderer.java | 13 +- .../renderer/entity/BookwyrmRenderer.java | 4 +- .../client/renderer/entity/DrygmyModel.java | 4 +- .../client/renderer/entity/DummyRenderer.java | 28 +- .../renderer/entity/GiftStarbyModel.java | 4 +- .../client/renderer/entity/LilyModel.java | 4 +- .../renderer/entity/StarbuncleModel.java | 4 +- .../renderer/entity/StarbuncleRenderer.java | 12 +- .../renderer/entity/WealdWalkerModel.java | 4 +- .../renderer/entity/WildenChimeraModel.java | 4 +- .../renderer/entity/WildenGuardianModel.java | 4 +- .../renderer/entity/WildenHunterModel.java | 4 +- .../renderer/entity/WildenStalkerModel.java | 4 +- .../client/renderer/entity/WixieModel.java | 4 +- .../familiar/FamiliarWhirlisprigRenderer.java | 3 +- .../familiar/GenericFamiliarRenderer.java | 8 +- .../client/renderer/item/ArmorRenderer.java | 8 +- .../renderer/item/FlaskCannonRenderer.java | 12 +- .../renderer/item/ScryCasterRenderer.java | 8 +- .../renderer/item/SpellBookRenderer.java | 24 +- .../renderer/item/SpellBowRenderer.java | 8 +- .../renderer/item/SpellCrossbowRenderer.java | 9 +- .../client/renderer/item/SwordRenderer.java | 9 +- .../client/renderer/item/WandRenderer.java | 6 +- .../tile/AlterationTableRenderer.java | 9 +- .../common/block/BasicSpellTurret.java | 2 +- .../block/EnchantingApparatusBlock.java | 2 +- .../common/block/ImbuementBlock.java | 4 +- .../common/block/RotatingSpellTurret.java | 3 +- .../arsnouveau/common/block/ScribesBlock.java | 15 +- .../common/block/ScryersOculus.java | 5 +- .../common/block/SourceBerryBush.java | 8 +- .../block/tile/CraftingLecternTile.java | 6 +- .../block/tile/EnchantingApparatusTile.java | 4 +- .../block/tile/MycelialSourcelinkTile.java | 4 +- .../common/block/tile/PortalTile.java | 76 +---- .../common/block/tile/ScribesTile.java | 2 +- .../block/tile/VolcanicSourcelinkTile.java | 4 +- .../common/camera/CameraController.java | 2 +- .../common/command/PathCommand.java | 27 -- .../common/command/ToggleLightCommand.java | 3 +- .../common/entity/EntityDrygmy.java | 8 +- .../common/entity/EntityFlyingItem.java | 6 +- .../common/entity/EntityLingeringSpell.java | 22 +- .../common/entity/EntityOrbitProjectile.java | 15 +- .../common/entity/EntityProjectileSpell.java | 7 +- .../common/entity/EntityRitualProjectile.java | 15 +- .../common/entity/LightningEntity.java | 20 +- .../arsnouveau/common/entity/Lily.java | 17 +- .../common/entity/ScryerCamera.java | 22 +- .../arsnouveau/common/entity/Starbuncle.java | 13 +- .../arsnouveau/common/entity/SummonHorse.java | 7 +- .../common/entity/SummonSkeleton.java | 34 +- .../arsnouveau/common/entity/SummonWolf.java | 7 +- .../arsnouveau/common/entity/Whirlisprig.java | 8 +- .../common/entity/debug/EntityDebugger.java | 2 +- .../common/entity/familiar/FamiliarWixie.java | 12 +- .../entity/goal/AnimatedAttackGoal.java | 2 +- .../carbuncle/StarbyTransportBehavior.java | 37 +-- .../entity/goal/chimera/ChimeraDiveGoal.java | 4 +- .../goal/chimera/ChimeraLeapRamGoal.java | 2 +- .../entity/goal/chimera/ChimeraRageGoal.java | 2 +- .../entity/goal/chimera/ChimeraRamGoal.java | 2 +- .../goal/chimera/ChimeraSummonGoal.java | 2 +- .../entity/goal/chimera/WildenSummon.java | 4 +- .../entity/goal/stalker/StartFlightGoal.java | 2 +- .../entity/goal/wealdwalker/CastGoal.java | 2 +- .../entity/goal/wixie/FindNextItemGoal.java | 7 +- .../entity/goal/wixie/FindPotionGoal.java | 2 +- .../entity/pathfinding/MovementHandler.java | 8 +- .../pathfinding/PathingStuckHandler.java | 67 ++-- .../arsnouveau/common/event/ArsEvents.java | 31 +- .../arsnouveau/common/event/EventHandler.java | 5 +- .../arsnouveau/common/event/LightEvents.java | 4 +- .../common/event/ManaCapEvents.java | 15 +- .../common/event/ReactiveEvents.java | 2 +- .../arsnouveau/common/event/ScryEvents.java | 15 +- .../common/event/timed/BuildPortalEvent.java | 4 +- .../common/items/AlchemistsCrown.java | 3 +- .../arsnouveau/common/items/FlaskCannon.java | 4 +- .../arsnouveau/common/items/SpellBook.java | 2 +- .../arsnouveau/common/items/WarpScroll.java | 2 +- .../common/lib/PotionEffectTags.java | 3 +- .../mixin/camera/ClientChunkCacheMixin.java | 8 +- .../common/mixin/jar/DispenserMixin.java | 68 ++-- .../common/network/AbstractPacket.java | 20 +- .../common/network/ChangeBiomePacket.java | 70 ++--- .../network/ClientToServerStoragePacket.java | 44 +-- .../common/network/HighlightAreaPacket.java | 49 ++- .../arsnouveau/common/network/Networking.java | 293 +++++------------- .../common/network/NotEnoughManaPacket.java | 47 +-- .../common/network/PacketANEffect.java | 95 +++--- .../common/network/PacketAddFadingLight.java | 54 ++-- .../common/network/PacketAnimEntity.java | 52 ++-- .../network/PacketClientDelayEffect.java | 52 ++-- .../network/PacketClientRewindEffect.java | 37 ++- .../common/network/PacketConsumePotion.java | 67 ++-- .../common/network/PacketDismountCamera.java | 38 +-- .../common/network/PacketDispelFamiliars.java | 35 ++- .../network/PacketGenericClientMessage.java | 36 ++- .../network/PacketGetPersistentData.java | 31 +- .../common/network/PacketHotkeyPressed.java | 55 ++-- .../common/network/PacketJoinedServer.java | 49 ++- .../common/network/PacketMountCamera.java | 48 +-- .../network/PacketNoSpamChatMessage.java | 54 ++-- .../network/PacketOneShotAnimation.java | 50 +-- .../common/network/PacketOpenGlyphCraft.java | 29 +- .../common/network/PacketOpenSpellBook.java | 47 ++- .../common/network/PacketQuickCast.java | 46 +-- .../common/network/PacketReactiveSpell.java | 35 ++- .../common/network/PacketSetBookMode.java | 39 +-- .../common/network/PacketSetCameraView.java | 63 ++-- .../common/network/PacketSetLauncher.java | 75 ++--- .../common/network/PacketSetScribeRecipe.java | 40 +-- .../common/network/PacketSetSound.java | 47 +-- .../common/network/PacketSummonFamiliar.java | 72 +++-- .../common/network/PacketSummonLily.java | 39 +-- .../common/network/PacketSyncLitEntities.java | 36 ++- .../common/network/PacketSyncPlayerCap.java | 38 ++- .../common/network/PacketSyncTag.java | 52 ++-- .../common/network/PacketTimedEvent.java | 36 ++- .../common/network/PacketToggleFamiliar.java | 80 ++--- .../common/network/PacketToggleLight.java | 31 +- .../common/network/PacketTogglePathing.java | 27 -- .../common/network/PacketUnsummonLily.java | 45 +-- .../common/network/PacketUpdateBookGUI.java | 31 +- .../common/network/PacketUpdateCaster.java | 58 ++-- .../common/network/PacketUpdateFlight.java | 30 +- .../common/network/PacketUpdateMana.java | 48 +-- .../network/PacketUpdateSpellColorAll.java | 49 +-- .../network/PacketUpdateSpellColors.java | 50 +-- .../network/PacketUpdateSpellSoundAll.java | 43 +-- .../common/network/PacketWarpPosition.java | 71 ++--- .../common/network/PotionSyncPacket.java | 65 ++-- .../network/ServerToClientStoragePacket.java | 42 +-- .../common/network/SyncPathMessage.java | 112 ------- .../network/SyncPathReachedMessage.java | 84 ----- .../arsnouveau/common/perk/ChillingPerk.java | 2 +- .../arsnouveau/common/perk/DepthsPerk.java | 4 +- .../arsnouveau/common/perk/FeatherPerk.java | 5 +- .../arsnouveau/common/perk/GlidingPerk.java | 3 - .../arsnouveau/common/perk/IgnitePerk.java | 2 +- .../arsnouveau/common/perk/ImmolatePerk.java | 4 +- .../common/perk/JumpHeightPerk.java | 3 - .../common/perk/KnockbackResistPerk.java | 5 +- .../arsnouveau/common/perk/LootingPerk.java | 3 - .../common/perk/MagicCapacityPerk.java | 5 +- .../common/perk/MagicResistPerk.java | 5 +- .../common/perk/PotionDurationPerk.java | 5 +- .../arsnouveau/common/perk/RepairingPerk.java | 16 +- .../common/perk/SaturationPerk.java | 5 +- .../common/perk/SpellDamagePerk.java | 5 +- .../common/perk/StarbunclePerk.java | 2 +- .../common/perk/StepHeightPerk.java | 5 +- .../arsnouveau/common/perk/ToughnessPerk.java | 5 +- .../common/ritual/RitualScrying.java | 3 +- .../common/ritual/RitualWildenSummoning.java | 2 +- .../common/spell/effect/EffectAnimate.java | 4 +- .../common/spell/effect/EffectBlink.java | 8 +- .../common/spell/effect/EffectBounce.java | 2 +- .../common/spell/effect/EffectCut.java | 8 +- .../common/spell/effect/EffectDelay.java | 2 +- .../common/spell/effect/EffectName.java | 2 +- .../common/spell/effect/EffectPickup.java | 9 +- .../common/spell/effect/EffectRewind.java | 12 +- .../common/spell/method/MethodSelf.java | 8 +- .../common/spell/method/MethodTouch.java | 8 +- .../common/world/structure/WildenDen.java | 5 +- .../arsnouveau/setup/ModSetup.java | 11 +- .../setup/registry/ModEntities.java | 2 +- .../resources/META-INF/accesstransformer.cfg | 3 +- 196 files changed, 1946 insertions(+), 2309 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/command/PathCommand.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/network/PacketTogglePathing.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/network/SyncPathMessage.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/network/SyncPathReachedMessage.java diff --git a/build.gradle b/build.gradle index 9c034d649e..0400599729 100644 --- a/build.gradle +++ b/build.gradle @@ -88,6 +88,10 @@ repositories { name = 'Forge' url = "https://maven.minecraftforge.net" } + maven { + name = "OctoStudios" + url = uri("https://maven.octo-studios.com/releases") + } } jarJar.enable() @@ -103,7 +107,6 @@ dependencies { implementation "software.bernie.geckolib:geckolib-neoforge-1.21:${geckolib_version}" // // implementation "vazkii.patchouli:Patchouli:1.20.4-${patchouli_version}" -// implementation "top.theillusivec4.caelus:neoforge:${caelus_version}+${minecraft_version}" // // compileOnly "top.theillusivec4.curios:curios-neoforge:${curios_version}+${minecraft_version}:api" // localRuntime "top.theillusivec4.curios:curios-neoforge:${curios_version}+${minecraft_version}" @@ -112,6 +115,7 @@ dependencies { localRuntime "mezz.jei:jei-1.21-neoforge:${jei_version}" implementation 'com.github.glitchfiend:TerraBlender-neoforge:1.21-4.0.0.0' implementation "curse.maven:jade-324717:5444008" + implementation 'top.theillusivec4.curios:curios-neoforge:9.0.3+1.21' } tasks.withType(ProcessResources).configureEach { diff --git a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java index 80b5d56e0c..a109acda5c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java +++ b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau; -import com.hollingsworth.arsnouveau.api.registry.BuddingConversionRegistry; import com.hollingsworth.arsnouveau.api.event.EventQueue; +import com.hollingsworth.arsnouveau.api.registry.BuddingConversionRegistry; import com.hollingsworth.arsnouveau.api.registry.CasterTomeRegistry; import com.hollingsworth.arsnouveau.api.registry.RitualRegistry; import com.hollingsworth.arsnouveau.api.registry.ScryRitualRegistry; @@ -77,9 +77,10 @@ public ArsNouveau(IEventBus modEventBus, ModContainer modContainer){ if (FMLEnvironment.dist.isClient()) { NeoForge.EVENT_BUS.register(ClientEventHandler.class); } - + modEventBus.addListener(Networking::register); modEventBus.addListener(ModSetup::registerEvents); ModSetup.registers(modEventBus); + modEventBus.addListener(ModEntities::registerPlacements); modEventBus.addListener(this::setup); modEventBus.addListener(this::postModLoadEvent); modEventBus.addListener(this::clientSetup); @@ -97,8 +98,6 @@ public ArsNouveau(IEventBus modEventBus, ModContainer modContainer){ public void setup(final FMLCommonSetupEvent event) { APIRegistry.postInit(); - Networking.registerMessages(); - event.enqueueWork(ModEntities::registerPlacements); if (terrablenderLoaded && Config.ARCHWOOD_FOREST_WEIGHT.get() > 0) { event.enqueueWork(Terrablender::registerBiomes); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java b/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java index 91b91991da..d7883b7949 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java @@ -11,7 +11,6 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.network.PacketDistributor; public interface ICameraMountable { @@ -39,7 +38,7 @@ default void mountCamera(Level level, BlockPos pos, Player player) { serverPlayer.camera = dummyEntity; - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new PacketSetCameraView(dummyEntity)); + Networking.sendToPlayerClient(new PacketSetCameraView(dummyEntity), serverPlayer); startViewing(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/ArsNouveauCurio.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/ArsNouveauCurio.java index 9d31ea9102..5eac1f782e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/ArsNouveauCurio.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/ArsNouveauCurio.java @@ -2,9 +2,10 @@ import com.hollingsworth.arsnouveau.common.items.ModItem; import net.minecraft.world.item.ItemStack; +import top.theillusivec4.curios.api.SlotContext; +import top.theillusivec4.curios.api.type.capability.ICurioItem; -//TODO: restore curios -public abstract class ArsNouveauCurio extends ModItem { +public abstract class ArsNouveauCurio extends ModItem implements ICurioItem { public ArsNouveauCurio() { this(new Properties().stacksTo(1)); @@ -15,8 +16,8 @@ public ArsNouveauCurio(Properties properties) { super(properties); } -// @Override -// public boolean canEquipFromUse(SlotContext slotContext, ItemStack stack) { -// return true; -// } + @Override + public boolean canEquipFromUse(SlotContext slotContext, ItemStack stack) { + return true; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/RitualUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/RitualUtil.java index ea5676a2ed..957f37c026 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/RitualUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/RitualUtil.java @@ -2,7 +2,6 @@ import com.hollingsworth.arsnouveau.common.network.ChangeBiomePacket; -import com.hollingsworth.arsnouveau.common.network.Networking; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.QuartPos; @@ -67,7 +66,7 @@ public static void changeBiome(Level level, BlockPos pos, ResourceKey tar if (level instanceof ServerLevel server) { if (!chunkAt.isUnsaved()) chunkAt.setUnsaved(true); ChangeBiomePacket message = new ChangeBiomePacket(pos, target); - Networking.INSTANCE.send(PacketDistributor.TRACKING_CHUNK.with(() -> chunkAt), message); + PacketDistributor.sendToPlayersTrackingChunk(server, chunkAt.getPos(), message); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractEffect.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractEffect.java index 01d714100b..4c31210a4d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractEffect.java @@ -6,6 +6,7 @@ import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.LivingCaster; import com.hollingsworth.arsnouveau.api.util.BlockUtil; import com.hollingsworth.arsnouveau.common.spell.augment.*; +import com.hollingsworth.arsnouveau.common.util.HolderHelper; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.core.BlockPos; @@ -22,8 +23,8 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.ModConfigSpec; +import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.util.FakePlayer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -111,14 +112,14 @@ public boolean isNotFakePlayer(Entity entity) { return !(entity instanceof FakePlayer); } - public void applyEnchantments(SpellStats stats, ItemStack stack) { + public void applyEnchantments(Level level, SpellStats stats, ItemStack stack) { if (stats.hasBuff(AugmentExtract.INSTANCE)) { - stack.enchant(Enchantments.SILK_TOUCH, 1); + stack.enchant(HolderHelper.unwrap(level, Enchantments.SILK_TOUCH), 1); } if (stats.hasBuff(AugmentFortune.INSTANCE)) { - stack.enchant(Enchantments.FORTUNE, stats.getBuffCount(AugmentFortune.INSTANCE)); + stack.enchant(HolderHelper.unwrap(level, Enchantments.FORTUNE), stats.getBuffCount(AugmentFortune.INSTANCE)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java index a3c2f4afbe..e20d40fb05 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java @@ -26,6 +26,7 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.neoforged.neoforge.common.NeoForge; + import javax.annotation.Nullable; import java.util.List; @@ -84,7 +85,7 @@ protected boolean enoughMana(LivingEntity entity) { return canCast; } - public boolean postEvent() { + public SpellCastEvent postEvent() { return SpellUtil.postEvent(new SpellCastEvent(spell, spellContext)); } @@ -97,7 +98,7 @@ private SpellStats getCastStats() { } public boolean onCast(ItemStack stack, Level level) { - if (canCast(spellContext.getUnwrappedCaster()) && !postEvent()) { + if (canCast(spellContext.getUnwrappedCaster()) && !postEvent().isCanceled()) { this.hitResult = null; CastResolveType resolveType = castType.onCast(stack, spellContext.getUnwrappedCaster(), level, getCastStats(), spellContext, this); if (resolveType == CastResolveType.SUCCESS) { @@ -109,7 +110,7 @@ public boolean onCast(ItemStack stack, Level level) { } public boolean onCastOnBlock(BlockHitResult blockRayTraceResult) { - if (canCast(spellContext.getUnwrappedCaster()) && !postEvent()) { + if (canCast(spellContext.getUnwrappedCaster()) && !postEvent().isCanceled()) { this.hitResult = blockRayTraceResult; CastResolveType resolveType = castType.onCastOnBlock(blockRayTraceResult, spellContext.getUnwrappedCaster(), getCastStats(), spellContext, this); if (resolveType == CastResolveType.SUCCESS) { @@ -122,7 +123,7 @@ public boolean onCastOnBlock(BlockHitResult blockRayTraceResult) { // Gives context for InteractionHand public boolean onCastOnBlock(UseOnContext context) { - if (canCast(spellContext.getUnwrappedCaster()) && !postEvent()) { + if (canCast(spellContext.getUnwrappedCaster()) && !postEvent().isCanceled()) { this.hitResult = context.hitResult; CastResolveType resolveType = castType.onCastOnBlock(context, getCastStats(), spellContext, this); if (resolveType == CastResolveType.SUCCESS) { @@ -134,7 +135,7 @@ public boolean onCastOnBlock(UseOnContext context) { } public boolean onCastOnEntity(ItemStack stack, Entity target, InteractionHand hand) { - if (canCast(spellContext.getUnwrappedCaster()) && !postEvent()) { + if (canCast(spellContext.getUnwrappedCaster()) && !postEvent().isCanceled()) { this.hitResult = new EntityHitResult(target); CastResolveType resolveType = castType.onCastOnEntity(stack, spellContext.getUnwrappedCaster(), target, hand, getCastStats(), spellContext, this); if (resolveType == CastResolveType.SUCCESS) { @@ -187,7 +188,8 @@ public void resume(Level world){ continue; EffectResolveEvent.Pre preEvent = new EffectResolveEvent.Pre(world, shooter, this.hitResult, spell, spellContext, effect, stats, this); - if (NeoForge.EVENT_BUS.post(preEvent)) + NeoForge.EVENT_BUS.post(preEvent); + if (preEvent.isCanceled()) continue; effect.onResolve(this.hitResult, world, shooter, stats, spellContext, this); NeoForge.EVENT_BUS.post(new EffectResolveEvent.Post(world, shooter, this.hitResult, spell, spellContext, effect, stats, this)); @@ -198,7 +200,10 @@ public void resume(Level world){ public void expendMana() { int totalCost = getResolveCost(); - CapabilityRegistry.getMana(spellContext.getUnwrappedCaster()).ifPresent(mana -> mana.removeMana(totalCost)); + var mana = CapabilityRegistry.getMana(spellContext.getUnwrappedCaster()).orElse(null); + if(mana != null){ + mana.removeMana(totalCost); + } } /** diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/SpellUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/SpellUtil.java index 7fc2d20e1e..a9fbd2c220 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/SpellUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/SpellUtil.java @@ -19,12 +19,13 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.util.FakePlayer; + import java.util.*; import java.util.function.Predicate; public class SpellUtil { - public static boolean postEvent(SpellCastEvent e) { + public static SpellCastEvent postEvent(SpellCastEvent e) { return NeoForge.EVENT_BUS.post(e); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/SkyTextureHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/SkyTextureHandler.java index 17dd15356f..9b18685c50 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/SkyTextureHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/SkyTextureHandler.java @@ -16,9 +16,10 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.RenderLevelStageEvent; import org.joml.Matrix4f; +import org.joml.Matrix4fStack; import static com.hollingsworth.arsnouveau.client.ClientInfo.skyRenderTarget; @@ -43,7 +44,7 @@ public static void renderSky(RenderLevelStageEvent event) { Vec3 cameraPosition = camera.getPosition(); Matrix4f projectionMatrix = event.getProjectionMatrix(); - float partialTick = event.getPartialTick(); + float partialTick = event.getPartialTick().getGameTimeDeltaTicks(); boolean isFoggy = minecraft.level.effects().isFoggyAt(Mth.floor(cameraPosition.x), Mth.floor(cameraPosition.y)) || minecraft.gui.getBossOverlay().shouldCreateWorldFog(); //setting the render target to our sky target @@ -55,19 +56,22 @@ public static void renderSky(RenderLevelStageEvent event) { FogRenderer.levelFogColor(); //rendering the actual sky RenderSystem.setShader(GameRenderer::getPositionShader); - levelRenderer.renderSky(poseStack, projectionMatrix, partialTick, camera, isFoggy, () -> { + // todo: check, was previously poseStack instead of modelViewMatrix + levelRenderer.renderSky(event.getModelViewMatrix(), projectionMatrix, partialTick, camera, isFoggy, () -> { FogRenderer.setupFog(camera, FogRenderer.FogMode.FOG_SKY, gameRenderer.getRenderDistance(), isFoggy, partialTick); }); - PoseStack modelViewStack = RenderSystem.getModelViewStack(); - modelViewStack.pushPose(); - modelViewStack.mulPoseMatrix(poseStack.last().pose()); + Matrix4fStack modelViewStack = RenderSystem.getModelViewStack(); + modelViewStack.pushMatrix(); + //todo: check mul vs mulPose + modelViewStack.mul(poseStack.last().pose()); RenderSystem.applyModelViewMatrix(); //rendering the clouds if (minecraft.options.getCloudsType() != CloudStatus.OFF) { RenderSystem.setShaderColor(1F, 1F, 1F, 1F); - levelRenderer.renderClouds(poseStack, projectionMatrix, partialTick, cameraPosition.x, cameraPosition.y, cameraPosition.z); + //todo: check, projectionMatrix as frustrum matrix? + levelRenderer.renderClouds(poseStack, projectionMatrix, projectionMatrix, partialTick, cameraPosition.x, cameraPosition.y, cameraPosition.z); } //the rain! @@ -75,7 +79,7 @@ public static void renderSky(RenderLevelStageEvent event) { levelRenderer.renderSnowAndRain(gameRenderer.lightTexture(), partialTick, cameraPosition.x, cameraPosition.y, cameraPosition.z); RenderSystem.depthMask(true); - modelViewStack.popPose(); + modelViewStack.popMatrix(); RenderSystem.applyModelViewMatrix(); minecraft.getMainRenderTarget().bindWrite(true); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java index 53e4410e13..e8d0a8554a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java @@ -29,7 +29,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import org.joml.Matrix4f; @@ -152,7 +151,7 @@ public void setFilter(Filter filter, SelectableButton button, String displayTitl private void onSelectClick(Button button) { if (selectedRecipe != null) { - Networking.INSTANCE.sendToServer(new PacketSetScribeRecipe(scribesPos, selectedRecipe.id)); + Networking.sendToServer(new PacketSetScribeRecipe(scribesPos, selectedRecipe.id)); Minecraft.getInstance().setScreen(null); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiColorScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiColorScreen.java index 93af651588..9eb0d35ac9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiColorScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiColorScreen.java @@ -13,7 +13,6 @@ import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.inventory.PageButton; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; @@ -72,7 +71,7 @@ private void layoutPageOne() { // column 2 addColorButton(73, 44, - "textures/gui/color_icons/rainbow_color_icon.png", () -> Networking.INSTANCE.sendToServer(new PacketUpdateSpellColors(slot, new RainbowParticleColor(0, 0, 0), this.stackHand == InteractionHand.MAIN_HAND))); + "textures/gui/color_icons/rainbow_color_icon.png", () -> Networking.sendToServer(new PacketUpdateSpellColors(slot, new RainbowParticleColor(0, 0, 0), this.stackHand == InteractionHand.MAIN_HAND))); addPresetColorButton(73, 68, ParticleColor.ORANGE, "textures/gui/color_icons/orange_color_icon.png"); addPresetColorButton(73, 92, ParticleColor.CYAN, "textures/gui/color_icons/cyan_color_icon.png"); addPresetColorButton(73, 116, ParticleColor.PINK, "textures/gui/color_icons/pink_color_icon.png"); @@ -104,7 +103,7 @@ private void layoutPageThree() { addColorButton(73, 92, "textures/gui/color_icons/orange_color_icon.png", () -> setFromPreset(255, 90, 1)); addPresetColorButton(73, 116, ParticleColor.CYAN, "textures/gui/color_icons/cyan_color_icon.png"); addRenderableWidget(new GuiImageButton(bookRight - 73, bookTop + 140, 0, 0, 48, 11, 48, 11, - "textures/gui/color_icons/white_color_icon.png", (_2) -> Networking.INSTANCE.sendToServer(new PacketUpdateSpellColors(slot, new RainbowParticleColor(0, 0, 0), this.stackHand == InteractionHand.MAIN_HAND)))); + "textures/gui/color_icons/white_color_icon.png", (_2) -> Networking.sendToServer(new PacketUpdateSpellColors(slot, new RainbowParticleColor(0, 0, 0), this.stackHand == InteractionHand.MAIN_HAND)))); } @@ -134,11 +133,11 @@ public void setFromPreset(ParticleColor preset) { public void onSaveClick(Button button) { - Networking.INSTANCE.sendToServer(new PacketUpdateSpellColors(slot, new ParticleColor(redW.getValue(), greenW.getValue(), blueW.getValue()), this.stackHand == InteractionHand.MAIN_HAND)); + Networking.sendToServer(new PacketUpdateSpellColors(slot, new ParticleColor(redW.getValue(), greenW.getValue(), blueW.getValue()), this.stackHand == InteractionHand.MAIN_HAND)); } public void onSaveAllClick(Button button) { - Networking.INSTANCE.sendToServer(new PacketUpdateSpellColorAll(slot, new ParticleColor(redW.getValue(), greenW.getValue(), blueW.getValue()), this.stackHand == InteractionHand.MAIN_HAND)); + Networking.sendToServer(new PacketUpdateSpellColorAll(slot, new ParticleColor(redW.getValue(), greenW.getValue(), blueW.getValue()), this.stackHand == InteractionHand.MAIN_HAND)); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiFamiliarScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiFamiliarScreen.java index d24e4155aa..97abbabfaf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiFamiliarScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiFamiliarScreen.java @@ -12,7 +12,6 @@ import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import java.util.List; @@ -61,7 +60,7 @@ public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, public void onFamiliarClicked(Button button) { FamiliarButton button1 = (FamiliarButton) button; - Networking.INSTANCE.sendToServer(new PacketSummonFamiliar(button1.familiarHolder.getRegistryName())); + Networking.sendToServer(new PacketSummonFamiliar(button1.familiarHolder.getRegistryName())); Minecraft.getInstance().setScreen(null); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index 67524c555f..b0defe5a15 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -13,7 +13,6 @@ import com.hollingsworth.arsnouveau.client.gui.GuiUtils; import com.hollingsworth.arsnouveau.client.gui.NoShadowTextField; import com.hollingsworth.arsnouveau.client.gui.buttons.*; -import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; import com.hollingsworth.arsnouveau.common.compat.PatchouliHandler; @@ -496,7 +495,7 @@ public void onCreateClick(Button button) { spell.add(spellPart); } } - Networking.INSTANCE.sendToServer(new PacketUpdateCaster(spell, this.selectedSpellSlot, this.spell_name.getValue(), hand == InteractionHand.MAIN_HAND)); + Networking.sendToServer(new PacketUpdateCaster(spell, this.selectedSpellSlot, this.spell_name.getValue(), hand == InteractionHand.MAIN_HAND)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java index a3f8dc789a..a954c0195c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java @@ -14,7 +14,6 @@ import com.hollingsworth.arsnouveau.client.gui.GuiUtils; import com.hollingsworth.arsnouveau.client.gui.NoShadowTextField; import com.hollingsworth.arsnouveau.client.gui.buttons.*; -import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; import com.hollingsworth.arsnouveau.common.compat.PatchouliHandler; @@ -570,7 +569,7 @@ public void onCreateClick(Button button) { spell.add(spellPart); } } - Networking.INSTANCE.sendToServer(new PacketUpdateCaster(spell, this.selectedSpellSlot, this.spell_name.getValue(), hand == InteractionHand.MAIN_HAND)); + Networking.sendToServer(new PacketUpdateCaster(spell, this.selectedSpellSlot, this.spell_name.getValue(), hand == InteractionHand.MAIN_HAND)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java index 2ebf6c09d9..d8168770bd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java @@ -17,7 +17,6 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; @@ -118,11 +117,11 @@ public void onTestClick(Button button) { } public void onSaveClick(Button button) { - Networking.INSTANCE.sendToServer(new PacketSetSound(casterSlot, selectedSound == null ? ConfiguredSpellSound.EMPTY : new ConfiguredSpellSound(selectedSound, (float) volumeSlider.getValue() / 100f, (float) pitchSlider.getValue() / 100f), stackHand == InteractionHand.MAIN_HAND)); + Networking.sendToServer(new PacketSetSound(casterSlot, selectedSound == null ? ConfiguredSpellSound.EMPTY : new ConfiguredSpellSound(selectedSound, (float) volumeSlider.getValue() / 100f, (float) pitchSlider.getValue() / 100f), stackHand == InteractionHand.MAIN_HAND)); } public void onSaveAllClick(Button button) { - Networking.INSTANCE.sendToServer(new PacketUpdateSpellSoundAll(casterSlot, selectedSound == null ? ConfiguredSpellSound.EMPTY : new ConfiguredSpellSound(selectedSound, (float) volumeSlider.getValue() / 100f, (float) pitchSlider.getValue() / 100f), stackHand == InteractionHand.MAIN_HAND)); + Networking.sendToServer(new PacketUpdateSpellSoundAll(casterSlot, selectedSound == null ? ConfiguredSpellSound.EMPTY : new ConfiguredSpellSound(selectedSound, (float) volumeSlider.getValue() / 100f, (float) pitchSlider.getValue() / 100f), stackHand == InteractionHand.MAIN_HAND)); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/keybindings/KeyHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/keybindings/KeyHandler.java index 41f4b77452..63062030e0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/keybindings/KeyHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/keybindings/KeyHandler.java @@ -19,7 +19,6 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.InputEvent; -import net.neoforged.neoforge.items.IItemHandlerModifiable; import static com.hollingsworth.arsnouveau.api.util.StackUtil.getHeldSpellbook; @@ -104,7 +103,7 @@ public static void checkCasterKeys(int key) { } int slot = ModKeyBindings.usedQuickSlot(key); if (slot != -1) { - Networking.INSTANCE.sendToServer(new PacketQuickCast(slot)); + Networking.sendToServer(new PacketQuickCast(slot)); } } @@ -152,12 +151,12 @@ public static void keyEvent(final InputEvent.Key event) { && !Minecraft.getInstance().player.onGround() && CuriosUtil.hasItem(Minecraft.getInstance().player, ItemsRegistry.JUMP_RING.get()) && Minecraft.getInstance().screen == null) { - Networking.INSTANCE.sendToServer(new PacketGenericClientMessage(PacketGenericClientMessage.Action.JUMP_RING)); + Networking.sendToServer(new PacketGenericClientMessage(PacketGenericClientMessage.Action.JUMP_RING)); } } } public static void sendHotkeyPacket(PacketHotkeyPressed.Key key) { - Networking.INSTANCE.sendToServer(new PacketHotkeyPressed(key)); + Networking.sendToServer(new PacketHotkeyPressed(key)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ColorParticleTypeData.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ColorParticleTypeData.java index e28a4ad600..b9639d340b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ColorParticleTypeData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ColorParticleTypeData.java @@ -1,16 +1,13 @@ package com.hollingsworth.arsnouveau.client.particle; -import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; import com.hollingsworth.arsnouveau.client.registry.ModParticles; -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleType; -import net.minecraft.network.FriendlyByteBuf; - -import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; /** @@ -20,7 +17,7 @@ public class ColorParticleTypeData implements ParticleOptions { protected ParticleType type; - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( Codec.FLOAT.fieldOf("r").forGetter(d -> d.color.getRed()), Codec.FLOAT.fieldOf("g").forGetter(d -> d.color.getGreen()), Codec.FLOAT.fieldOf("b").forGetter(d -> d.color.getBlue()), @@ -31,25 +28,37 @@ public class ColorParticleTypeData implements ParticleOptions { ) .apply(instance, ColorParticleTypeData::new)); + public static final StreamCodec STREAM_CODEC = StreamCodec.of( + ColorParticleTypeData::toNetwork, ColorParticleTypeData::fromNetwork + ); + + public static void toNetwork(RegistryFriendlyByteBuf buf, ColorParticleTypeData data) { + buf.writeFloat(data.color.getRed()); + buf.writeFloat(data.color.getGreen()); + buf.writeFloat(data.color.getBlue()); + buf.writeBoolean(data.disableDepthTest); + buf.writeFloat(data.size); + buf.writeFloat(data.alpha); + buf.writeInt(data.age); + } + + public static ColorParticleTypeData fromNetwork(RegistryFriendlyByteBuf buffer) { + float r = buffer.readFloat(); + float g = buffer.readFloat(); + float b = buffer.readFloat(); + boolean disableDepthTest = buffer.readBoolean(); + float size = buffer.readFloat(); + float alpha = buffer.readFloat(); + int age = buffer.readInt(); + return new ColorParticleTypeData(r, g, b, disableDepthTest, size, alpha, age); + } + public ParticleColor color; public boolean disableDepthTest; public float size = .25f; public float alpha = 1.0f; public int age = 36; - static final ParticleOptions.Deserializer DESERIALIZER = new ParticleOptions.Deserializer<>() { - @Override - public ColorParticleTypeData fromCommand(ParticleType type, StringReader reader) throws CommandSyntaxException { - reader.expect(' '); - return new ColorParticleTypeData(type, ParticleColor.fromString(reader.readString()), reader.readBoolean()); - } - - @Override - public ColorParticleTypeData fromNetwork(ParticleType type, FriendlyByteBuf buffer) { - return new ColorParticleTypeData(type, ParticleColorRegistry.from(buffer.readNbt()), buffer.readBoolean()); - } - }; - public ColorParticleTypeData(float r, float g, float b, boolean disableDepthTest, float size, float alpha, int age) { this(ModParticles.GLOW_TYPE.get(), new ParticleColor(r, g, b), disableDepthTest, size, alpha, age); } @@ -76,14 +85,4 @@ public ColorParticleTypeData(ParticleType parti public ParticleType getType() { return type; } - - @Override - public void writeToNetwork(FriendlyByteBuf packetBuffer) { - packetBuffer.writeNbt(color.serialize()); - } - - @Override - public String writeToString() { - return getRegistryName(type).toString() + " " + color.serialize(); - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ColoredDynamicTypeData.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ColoredDynamicTypeData.java index 881589619b..50d3f1bc11 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ColoredDynamicTypeData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ColoredDynamicTypeData.java @@ -1,16 +1,13 @@ package com.hollingsworth.arsnouveau.client.particle; -import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; import com.hollingsworth.arsnouveau.client.registry.ModParticles; -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleType; -import net.minecraft.network.FriendlyByteBuf; - -import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; public class ColoredDynamicTypeData implements ParticleOptions { @@ -19,7 +16,7 @@ public class ColoredDynamicTypeData implements ParticleOptions { float scale; int age; - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( Codec.FLOAT.fieldOf("r").forGetter(d -> d.color.getRed()), Codec.FLOAT.fieldOf("g").forGetter(d -> d.color.getGreen()), Codec.FLOAT.fieldOf("b").forGetter(d -> d.color.getBlue()), @@ -28,24 +25,32 @@ public class ColoredDynamicTypeData implements ParticleOptions { ) .apply(instance, ColoredDynamicTypeData::new)); + public static final StreamCodec STREAM_CODEC = StreamCodec.of( + ColoredDynamicTypeData::toNetwork, ColoredDynamicTypeData::fromNetwork + ); + + public static void toNetwork(RegistryFriendlyByteBuf buf, ColoredDynamicTypeData data) { + buf.writeFloat(data.color.getRed()); + buf.writeFloat(data.color.getGreen()); + buf.writeFloat(data.color.getBlue()); + buf.writeFloat(data.scale); + buf.writeInt(data.age); + } + + public static ColoredDynamicTypeData fromNetwork(RegistryFriendlyByteBuf buffer) { + float r = buffer.readFloat(); + float g = buffer.readFloat(); + float b = buffer.readFloat(); + float scale = buffer.readFloat(); + int age = buffer.readInt(); + return new ColoredDynamicTypeData(r, g, b, scale, age); + } + @Override public ParticleType getType() { return type; } - static final Deserializer DESERIALIZER = new Deserializer<>() { - @Override - public ColoredDynamicTypeData fromCommand(ParticleType type, StringReader reader) throws CommandSyntaxException { - reader.expect(' '); - return new ColoredDynamicTypeData(type, ParticleColor.fromString(reader.readString()), reader.readFloat(), reader.readInt()); - } - - @Override - public ColoredDynamicTypeData fromNetwork(ParticleType type, FriendlyByteBuf buffer) { - return new ColoredDynamicTypeData(type, ParticleColorRegistry.from(buffer.readNbt()), buffer.readFloat(), buffer.readInt()); - } - }; - public ColoredDynamicTypeData(float r, float g, float b, float scale, int age) { this.type = ModParticles.LINE_TYPE.get(); this.color = new ParticleColor(r, g, b); @@ -59,16 +64,4 @@ public ColoredDynamicTypeData(ParticleType particleTypeD this.scale = scale; this.age = age; } - - @Override - public void writeToNetwork(FriendlyByteBuf buffer) { - buffer.writeNbt(color.serialize()); - buffer.writeFloat(scale); - buffer.writeInt(age); - } - - @Override - public String writeToString() { - return getRegistryName(type).toString() + " " + color.serialize() + " " + scale + " " + age; - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/GlowParticleType.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/GlowParticleType.java index ded437110a..f01d31a9cc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/GlowParticleType.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/GlowParticleType.java @@ -1,15 +1,22 @@ package com.hollingsworth.arsnouveau.client.particle; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.core.particles.ParticleType; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; public class GlowParticleType extends ParticleType { public GlowParticleType() { - super(false, ColorParticleTypeData.DESERIALIZER); + super(false); } @Override - public Codec codec() { + public MapCodec codec() { return ColorParticleTypeData.CODEC; } + + @Override + public StreamCodec streamCodec() { + return ColorParticleTypeData.STREAM_CODEC; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/HelixParticleType.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/HelixParticleType.java index 116a412ec4..de19161356 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/HelixParticleType.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/HelixParticleType.java @@ -1,16 +1,23 @@ package com.hollingsworth.arsnouveau.client.particle; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.core.particles.ParticleType; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; public class HelixParticleType extends ParticleType { public HelixParticleType() { - super(false, HelixParticleTypeData.DESERIALIZER); + super(false); } @Override - public Codec codec() { + public MapCodec codec() { return HelixParticleTypeData.CODEC; } + @Override + public StreamCodec streamCodec() { + return HelixParticleTypeData.STREAM_CODEC; + } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/HelixParticleTypeData.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/HelixParticleTypeData.java index 0f83cde3b5..b5bca16465 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/HelixParticleTypeData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/HelixParticleTypeData.java @@ -1,14 +1,12 @@ package com.hollingsworth.arsnouveau.client.particle; -import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; import com.hollingsworth.arsnouveau.client.registry.ModParticles; -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; -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.StreamCodec; public class HelixParticleTypeData extends ColorParticleTypeData { @@ -50,7 +48,7 @@ public HelixParticleTypeData(ParticleType particleTypeDat this.speed = speed; } - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( Codec.FLOAT.fieldOf("r").forGetter(d -> d.color.getRed()), Codec.FLOAT.fieldOf("g").forGetter(d -> d.color.getGreen()), Codec.FLOAT.fieldOf("b").forGetter(d -> d.color.getBlue()), @@ -65,30 +63,36 @@ public HelixParticleTypeData(ParticleType particleTypeDat ) .apply(instance, HelixParticleTypeData::new)); - static final ParticleOptions.Deserializer DESERIALIZER = new ParticleOptions.Deserializer<>() { - @Override - public HelixParticleTypeData fromCommand(ParticleType type, StringReader reader) throws CommandSyntaxException { - reader.expect(' '); - return new HelixParticleTypeData(type, ParticleColor.fromString(reader.readString()), reader.readBoolean(), 0F, 0.2F, 0.1F, 0.2F); - } + public static final StreamCodec STREAM_CODEC = StreamCodec.of( + HelixParticleTypeData::toNetwork, HelixParticleTypeData::fromNetwork + ); - @Override - public HelixParticleTypeData fromNetwork(ParticleType type, FriendlyByteBuf buffer) { - return new HelixParticleTypeData(type, ParticleColorRegistry.from(buffer.readNbt()), buffer.readBoolean(), buffer.readFloat(), buffer.readFloat(), buffer.readFloat(), buffer.readFloat()); - } - }; - - @Override - public void writeToNetwork(FriendlyByteBuf packetBuffer) { - super.writeToNetwork(packetBuffer); - packetBuffer.writeFloat(angle); - packetBuffer.writeFloat(radius); - packetBuffer.writeFloat(radiusY); - packetBuffer.writeFloat(speed); + public static HelixParticleTypeData fromNetwork(RegistryFriendlyByteBuf buffer) { + float r = buffer.readFloat(); + float g = buffer.readFloat(); + float b = buffer.readFloat(); + boolean disableDepthTest = buffer.readBoolean(); + float size = buffer.readFloat(); + float alpha = buffer.readFloat(); + int age = buffer.readInt(); + float angle = buffer.readFloat(); + float radius = buffer.readFloat(); + float radiusY = buffer.readFloat(); + float speed = buffer.readFloat(); + return new HelixParticleTypeData(r, g, b, disableDepthTest, size, alpha, age, angle, radius, radiusY, speed); } - @Override - public String writeToString() { - return super.writeToString(); + public static void toNetwork(RegistryFriendlyByteBuf buf, HelixParticleTypeData data) { + buf.writeFloat(data.color.getRed()); + buf.writeFloat(data.color.getGreen()); + buf.writeFloat(data.color.getBlue()); + buf.writeBoolean(data.disableDepthTest); + buf.writeFloat(data.size); + buf.writeFloat(data.alpha); + buf.writeInt(data.age); + buf.writeFloat(data.angle); + buf.writeFloat(data.radius); + buf.writeFloat(data.radiusY); + buf.writeFloat(data.speed); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/LineParticleType.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/LineParticleType.java index 667c369aac..9bfa0241d4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/LineParticleType.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/LineParticleType.java @@ -1,15 +1,22 @@ package com.hollingsworth.arsnouveau.client.particle; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.core.particles.ParticleType; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; public class LineParticleType extends ParticleType { public LineParticleType() { - super(false, ColoredDynamicTypeData.DESERIALIZER); + super(false); } @Override - public Codec codec() { + public MapCodec codec() { return ColoredDynamicTypeData.CODEC; } + + @Override + public StreamCodec streamCodec() { + return ColoredDynamicTypeData.STREAM_CODEC; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleUtil.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleUtil.java index 2996878cd8..eeee4d3207 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleUtil.java @@ -112,7 +112,7 @@ public static void spawnTouch(ClientLevel world, BlockPos loc, ParticleColor par } public static void spawnTouchPacket(Level world, BlockPos pos, ParticleColor color) { - Networking.sendToNearby(world, pos, + Networking.sendToNearbyClient(world, pos, new PacketANEffect(PacketANEffect.EffectType.BURST, pos, color)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/SparkleParticleType.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/SparkleParticleType.java index a3571b2c12..f48bc27d48 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/SparkleParticleType.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/SparkleParticleType.java @@ -1,17 +1,24 @@ package com.hollingsworth.arsnouveau.client.particle; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.core.particles.ParticleType; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; public class SparkleParticleType extends ParticleType { public SparkleParticleType() { - super(false, ColoredDynamicTypeData.DESERIALIZER); + super(false); } @Override - public Codec codec() { + public MapCodec codec() { return ColoredDynamicTypeData.CODEC; } + @Override + public StreamCodec streamCodec() { + return null; + } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AmethystGolemRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AmethystGolemRenderer.java index f16d3542b4..d9e050e9a5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AmethystGolemRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AmethystGolemRenderer.java @@ -32,15 +32,15 @@ public RenderType getRenderType(AmethystGolem animatable, ResourceLocation textu } @Override - public void preRender(PoseStack poseStack, AmethystGolem animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void preRender(PoseStack poseStack, AmethystGolem animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int colour) { this.golem = animatable; this.buffer = bufferSource; this.text = this.getTextureLocation(animatable); - super.preRender(poseStack, animatable, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.preRender(poseStack, animatable, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, colour); } @Override - public void renderRecursively(PoseStack stack, AmethystGolem animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderRecursively(PoseStack stack, AmethystGolem animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int colour) { if (bone.getName().equals("item")) { stack.pushPose(); RenderUtil.translateToPivotPoint(stack, bone); @@ -50,7 +50,7 @@ public void renderRecursively(PoseStack stack, AmethystGolem animatable, GeoBone stack.popPose(); bufferIn = buffer.getBuffer(RenderType.entityCutoutNoCull(text)); } - super.renderRecursively(stack, animatable, bone, renderType, bufferSource, bufferIn, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.renderRecursively(stack, animatable, bone, renderType, bufferSource, bufferIn, isReRender, partialTick, packedLight, packedOverlay, colour); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java index 69dd7805b6..bfb773881b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java @@ -18,13 +18,12 @@ import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.client.model.data.ModelData; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; - -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.util.Color; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.renderer.GeoEntityRenderer; +import software.bernie.geckolib.util.Color; import software.bernie.geckolib.util.RenderUtil; @@ -74,13 +73,13 @@ public void render(BOBBY animatable, float entityYaw, float partialTick, PoseSta } @Override - public void preRender(PoseStack poseStack, BOBBY animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void preRender(PoseStack poseStack, BOBBY animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int colour) { this.bufferSource = bufferSource; - super.preRender(poseStack, animatable, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.preRender(poseStack, animatable, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, colour); } @Override - public void renderRecursively(PoseStack poseStack, BOBBY animatable, GeoBone bone, RenderType ty, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderRecursively(PoseStack poseStack, BOBBY animatable, GeoBone bone, RenderType ty, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int colour) { if (bone.getName().equals("block")) { AnimBlockSummon animBlock = animatable; if (animBlock == null) return; @@ -106,7 +105,7 @@ public void renderRecursively(PoseStack poseStack, BOBBY animatable, GeoBone bon } } } - super.renderRecursively(poseStack, animatable, bone, ty, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.renderRecursively(poseStack, animatable, bone, ty, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, colour); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmRenderer.java index 870471bdcb..66953a3d52 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmRenderer.java @@ -26,7 +26,7 @@ public BookwyrmRenderer(EntityRendererProvider.Context manager) { @Override - public void renderRecursively(PoseStack stack, EntityBookwyrm animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferIn, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderRecursively(PoseStack stack, EntityBookwyrm animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferIn, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { if (bone.getName().equals("item")) { stack.pushPose(); RenderUtil.translateToPivotPoint(stack, bone); @@ -37,7 +37,7 @@ public void renderRecursively(PoseStack stack, EntityBookwyrm animatable, GeoBon stack.popPose(); // buffer = bufferIn.getBuffer(RenderType.entityCutoutNoCull(text)); } - super.renderRecursively(stack, animatable, bone, renderType, bufferIn, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.renderRecursively(stack, animatable, bone, renderType, bufferIn, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/DrygmyModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/DrygmyModel.java index 86a6dffe32..69f47cd7ea 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/DrygmyModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/DrygmyModel.java @@ -3,10 +3,10 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; -import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.animatable.GeoAnimatable; - import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/DummyRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/DummyRenderer.java index 99ce8e8cb8..94b0d76b31 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/DummyRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/DummyRenderer.java @@ -125,15 +125,6 @@ protected void scale(EntityDummy p_225620_1_, PoseStack p_225620_2_, float p_225 p_225620_2_.scale(0.9375F, 0.9375F, 0.9375F); } - protected void renderNameTag(EntityDummy p_225629_1_, Component p_225629_2_, PoseStack p_225629_3_, MultiBufferSource p_225629_4_, int p_225629_5_) { - if(!p_225629_1_.shouldShowName()){ - return; - } - p_225629_3_.pushPose(); - super.renderNameTag(p_225629_1_, p_225629_2_, p_225629_3_, p_225629_4_, p_225629_5_); - p_225629_3_.popPose(); - } - public void renderRightHand(PoseStack p_229144_1_, MultiBufferSource p_229144_2_, int p_229144_3_, EntityDummy p_229144_4_) { this.renderHand(p_229144_1_, p_229144_2_, p_229144_3_, p_229144_4_, (this.model).rightArm, (this.model).rightSleeve); } @@ -142,6 +133,15 @@ public void renderLeftHand(PoseStack p_229146_1_, MultiBufferSource p_229146_2_, this.renderHand(p_229146_1_, p_229146_2_, p_229146_3_, p_229146_4_, (this.model).leftArm, (this.model).leftSleeve); } + + @Override + protected void renderNameTag(EntityDummy pEntity, Component pDisplayName, PoseStack pPoseStack, MultiBufferSource pBuffer, int pPackedLight, float pPartialTick) { + if(!pEntity.shouldShowName()){ + return; + } + super.renderNameTag(pEntity, pDisplayName, pPoseStack, pBuffer, pPackedLight, pPartialTick); + } + private void renderHand(PoseStack p_229145_1_, MultiBufferSource p_229145_2_, int p_229145_3_, EntityDummy p_229145_4_, ModelPart p_229145_5_, ModelPart p_229145_6_) { PlayerModel playermodel = this.getModel(); this.setModelProperties(p_229145_4_); @@ -155,10 +155,12 @@ private void renderHand(PoseStack p_229145_1_, MultiBufferSource p_229145_2_, in p_229145_6_.render(p_229145_1_, p_229145_2_.getBuffer(RenderType.entityTranslucent(p_229145_4_.getSkinTextureLocation())), p_229145_3_, OverlayTexture.NO_OVERLAY); } - protected void setupRotations(EntityDummy p_225621_1_, PoseStack p_225621_2_, float p_225621_3_, float p_225621_4_, float p_225621_5_) { + + @Override + protected void setupRotations(EntityDummy p_225621_1_, PoseStack p_225621_2_, float p_225621_3_, float p_225621_4_, float p_225621_5_, float pScale) { float f = p_225621_1_.getSwimAmount(p_225621_5_); if (p_225621_1_.isFallFlying()) { - super.setupRotations(p_225621_1_, p_225621_2_, p_225621_3_, p_225621_4_, p_225621_5_); + super.setupRotations(p_225621_1_, p_225621_2_, p_225621_3_, p_225621_4_, p_225621_5_, pScale); float f1 = (float) p_225621_1_.getFallFlyingTicks() + p_225621_5_; float f2 = Mth.clamp(f1 * f1 / 100.0F, 0.0F, 1.0F); if (!p_225621_1_.isAutoSpinAttack()) { @@ -175,7 +177,7 @@ protected void setupRotations(EntityDummy p_225621_1_, PoseStack p_225621_2_, fl p_225621_2_.mulPose(Axis.YP.rotation((float) (Math.signum(d3) * Math.acos(d2)))); } } else if (f > 0.0F) { - super.setupRotations(p_225621_1_, p_225621_2_, p_225621_3_, p_225621_4_, p_225621_5_); + super.setupRotations(p_225621_1_, p_225621_2_, p_225621_3_, p_225621_4_, p_225621_5_, pScale); float f3 = p_225621_1_.isInWater() ? -90.0F - p_225621_1_.getXRot() : -90.0F; float f4 = Mth.lerp(f, 0.0F, f3); p_225621_2_.mulPose(Axis.XP.rotationDegrees(f4)); @@ -183,7 +185,7 @@ protected void setupRotations(EntityDummy p_225621_1_, PoseStack p_225621_2_, fl p_225621_2_.translate(0.0D, -1.0D, 0.3F); } } else { - super.setupRotations(p_225621_1_, p_225621_2_, p_225621_3_, p_225621_4_, p_225621_5_); + super.setupRotations(p_225621_1_, p_225621_2_, p_225621_3_, p_225621_4_, p_225621_5_, pScale); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GiftStarbyModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GiftStarbyModel.java index 8b9c1dcb91..1502077437 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GiftStarbyModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GiftStarbyModel.java @@ -3,9 +3,9 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.entity.GiftStarbuncle; import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.constant.DataTickets; - import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyModel.java index 63a3915284..ad217174db 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyModel.java @@ -3,9 +3,9 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.entity.Lily; import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.constant.DataTickets; - import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java index 15e9366e07..c98c78b194 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java @@ -3,9 +3,9 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.entity.Starbuncle; import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.constant.DataTickets; - import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleRenderer.java index 8998aec7f5..729883e8c8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleRenderer.java @@ -16,8 +16,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.renderer.GeoEntityRenderer; import software.bernie.geckolib.util.RenderUtil; @@ -29,15 +27,9 @@ public StarbuncleRenderer(EntityRendererProvider.Context manager) { super(manager, new StarbuncleModel()); } - - @Override - public void renderFinal(PoseStack poseStack, Starbuncle animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - super.renderFinal(poseStack, animatable, model, bufferSource, buffer, partialTick, packedLight, packedOverlay, red, green, blue, alpha); - } - @Override - public void renderRecursively(PoseStack stack, Starbuncle animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - super.renderRecursively(stack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + public void renderRecursively(PoseStack stack, Starbuncle animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { + super.renderRecursively(stack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); if (bone.getName().equals("item")) { stack.pushPose(); RenderUtil.translateToPivotPoint(stack, bone); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WealdWalkerModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WealdWalkerModel.java index 8305ff1abf..09d17dfb74 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WealdWalkerModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WealdWalkerModel.java @@ -4,9 +4,9 @@ import com.hollingsworth.arsnouveau.common.entity.WealdWalker; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; -import software.bernie.geckolib.constant.DataTickets; - import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenChimeraModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenChimeraModel.java index 569f1e7c06..ef7696ca1d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenChimeraModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenChimeraModel.java @@ -3,9 +3,9 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.entity.WildenChimera; import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.constant.DataTickets; - import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenGuardianModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenGuardianModel.java index c5a8fa6d17..40c7adb5ba 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenGuardianModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenGuardianModel.java @@ -3,9 +3,9 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.entity.WildenGuardian; import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.constant.DataTickets; - import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenHunterModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenHunterModel.java index 22ff9c769f..2b84c13a72 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenHunterModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenHunterModel.java @@ -3,9 +3,9 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.entity.WildenHunter; import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.constant.DataTickets; - import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenStalkerModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenStalkerModel.java index c547c27137..782bd4bfa4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenStalkerModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenStalkerModel.java @@ -3,9 +3,9 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.entity.WildenStalker; import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.constant.DataTickets; - import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WixieModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WixieModel.java index b512374f27..52dd96bfdb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WixieModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WixieModel.java @@ -3,10 +3,10 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; -import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.animatable.GeoAnimatable; - import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java index b7ecafb265..7fa9960613 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java @@ -11,8 +11,7 @@ import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; - - +import software.bernie.geckolib.cache.object.GeoBone; import java.util.Random; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/GenericFamiliarRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/GenericFamiliarRenderer.java index e8e2b2cb10..48426224bf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/GenericFamiliarRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/GenericFamiliarRenderer.java @@ -25,20 +25,20 @@ public GenericFamiliarRenderer(EntityRendererProvider.Context renderManager, Geo } @Override - public void preRender(PoseStack poseStack, T animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void preRender(PoseStack poseStack, T animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { this.familiar = animatable; this.bufferSource = bufferSource; - super.preRender(poseStack, animatable, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.preRender(poseStack, animatable, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } @Override - public void renderRecursively(PoseStack stack, T animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderRecursively(PoseStack stack, T animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { if (this.familiar.getCosmeticItem().getItem() instanceof ICosmeticItem cosmetic && cosmetic.getBone().equals(bone.getName())) { CosmeticRenderUtil.renderCosmetic(bone, stack, this.bufferSource, familiar, packedLight); buffer = this.bufferSource.getBuffer(RenderType.entityCutoutNoCull(getTextureLocation(familiar))); } - super.renderRecursively(stack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.renderRecursively(stack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ArmorRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ArmorRenderer.java index 5a519ec685..1c367e0e8a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ArmorRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ArmorRenderer.java @@ -22,22 +22,22 @@ public ArmorRenderer(GeoModel modelProvider) { } @Override - public void renderRecursively(PoseStack poseStack, AnimatedMagicArmor animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderRecursively(PoseStack poseStack, AnimatedMagicArmor animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { if(bone.getName().equalsIgnoreCase("armorRightArmSlim") || bone.getName().equalsIgnoreCase("armorLeftArmSlim")){ bone.setHidden(true); } - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } @Override - public void actuallyRender(PoseStack poseStack, AnimatedMagicArmor animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void actuallyRender(PoseStack poseStack, AnimatedMagicArmor animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { Optional slimRight = model.getBone("armorRightArmSlim"); Optional slimLeft = model.getBone("armorLeftArmSlim"); slimRight.ifPresent(geoBone -> geoBone.setHidden(true)); slimLeft.ifPresent(geoBone -> geoBone.setHidden(true)); model.getBone("armorRightArmSlim").ifPresent(geoBone -> geoBone.setHidden(true)); model.getBone("armorLeftArmSlim").ifPresent(geoBone -> geoBone.setHidden(true)); - super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java index 10ba67512c..6ab8868dc8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java @@ -9,7 +9,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; import net.minecraft.resources.ResourceLocation; - +import net.minecraft.world.item.alchemy.PotionContents; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.model.GeoModel; @@ -28,9 +28,9 @@ public FlaskCannonRenderer(BlockEntityRenderDispatcher dispatcher, EntityModelSe } @Override - public void renderRecursively(PoseStack poseStack, FlaskCannon animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderRecursively(PoseStack poseStack, FlaskCannon animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int packedColor) { if(currentItemStack == null) { - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, packedColor); return; } FlaskCannon.PotionLauncherData flask = new FlaskCannon.PotionLauncherData(currentItemStack); @@ -49,10 +49,10 @@ public void renderRecursively(PoseStack poseStack, FlaskCannon animatable, GeoBo } if(bone.getName().equals("potion_levels") || (bone.getParent() != null && bone.getParent().getName().equals("potion_levels"))) { - ParticleColor color = ParticleColor.fromInt(PotionUtils.getColor(flask.getLastDataForRender().asPotionStack())); - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color.getRed(), color.getGreen(), color.getBlue(), alpha); + ParticleColor color = ParticleColor.fromInt(PotionContents.getColor(flask.getLastDataForRender().asPotionStack())); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color.getColor()); }else{ - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, packedColor); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java index 3fb6217536..f0ff726442 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java @@ -10,8 +10,8 @@ import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.util.Color; import software.bernie.geckolib.model.GeoModel; +import software.bernie.geckolib.util.Color; public class ScryCasterRenderer extends FixedGeoItemRenderer{ public ScryCasterRenderer() { @@ -34,12 +34,12 @@ public ResourceLocation getAnimationResource(ScryCaster wand) { } @Override - public void renderRecursively(PoseStack poseStack, ScryCaster animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderRecursively(PoseStack poseStack, ScryCaster animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int packedColor) { if (bone.getName().equals("eye")) { //NOTE: if the bone have a parent, the recursion will get here with the neutral color, making the color getter useless - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, packedColor); } else { - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, Color.WHITE.getRed() / 255f, Color.WHITE.getGreen() / 255f, Color.WHITE.getBlue() / 255f, Color.WHITE.getAlpha() / 255f); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, Color.WHITE.argbInt()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java index c4b1c66fe9..63e89a949d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java @@ -14,8 +14,8 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemDisplayContext; import software.bernie.geckolib.cache.object.BakedGeoModel; -import software.bernie.geckolib.util.Color; import software.bernie.geckolib.model.GeoModel; +import software.bernie.geckolib.util.Color; import javax.annotation.Nullable; @@ -29,20 +29,21 @@ public SpellBookRenderer() { } @Override - public void actuallyRender(PoseStack poseStack, SpellBook animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void actuallyRender(PoseStack poseStack, SpellBook animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int packedColor) { model.getBone("tier3").ifPresent(bone -> bone.setHidden(animatable.tier.value < 3)); model.getBone("tier1").ifPresent(bone -> bone.setHidden(animatable.tier.value != 1)); model.getBone("tier2").ifPresent(bone -> bone.setHidden(animatable.tier.value != 2)); - super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, packedColor); } @Override - protected void renderInGui(ItemDisplayContext transformType, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, int packedOverlay) { + protected void renderInGui(ItemDisplayContext transformType, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, int packedOverlay, float partialTick) { if (this.useEntityGuiLighting) { Lighting.setupForEntityInInventory(); } else { Lighting.setupForFlatItems(); } + int color = getRenderColor(animatable, partialTick, packedLight).argbInt(); MultiBufferSource.BufferSource var10000; if (bufferSource instanceof MultiBufferSource.BufferSource bufferSource2) { @@ -51,11 +52,11 @@ protected void renderInGui(ItemDisplayContext transformType, PoseStack poseStack var10000 = Minecraft.getInstance().renderBuffers().bufferSource(); } MultiBufferSource.BufferSource defaultBufferSource = var10000; - RenderType renderType = this.getRenderType(this.animatable, this.getTextureLocation(this.animatable), defaultBufferSource, Minecraft.getInstance().getFrameTime()); + RenderType renderType = this.getRenderType(this.animatable, this.getTextureLocation(this.animatable), defaultBufferSource, partialTick); VertexConsumer buffer = ItemRenderer.getFoilBufferDirect(bufferSource, renderType, true, this.currentItemStack != null && this.currentItemStack.hasFoil()); poseStack.pushPose(); - this.defaultRenderGui(poseStack, this.animatable, defaultBufferSource, renderType, buffer, 0.0F, Minecraft.getInstance().getFrameTime(), packedLight, packedOverlay); + this.defaultRenderGui(poseStack, this.animatable, defaultBufferSource, renderType, buffer, 0.0F, partialTick, packedLight, packedOverlay, color); defaultBufferSource.endBatch(); RenderSystem.enableDepthTest(); Lighting.setupFor3DItems(); @@ -67,7 +68,8 @@ public void defaultRender(PoseStack poseStack, SpellBook animatable, MultiBuffer super.defaultRender(poseStack, animatable, bufferSource, renderType, buffer, yaw, partialTick, packedLight); } - public void defaultRenderGui(PoseStack poseStack, SpellBook animatable, MultiBufferSource bufferSource, @Nullable RenderType renderType, @Nullable VertexConsumer buffer, float yaw, float partialTick, int packedLight, int packedOverlay) { + + public void defaultRenderGui(PoseStack poseStack, SpellBook animatable, MultiBufferSource bufferSource, @Nullable RenderType renderType, @Nullable VertexConsumer buffer, float yaw, float partialTick, int packedLight, int packedOverlay, int packedColor) { poseStack.pushPose(); Color renderColor = this.getRenderColor(animatable, partialTick, packedLight); float red = renderColor.getRedFloat(); @@ -83,17 +85,17 @@ public void defaultRenderGui(PoseStack poseStack, SpellBook animatable, MultiBuf buffer = bufferSource.getBuffer(renderType); } - this.preRender(poseStack, animatable, model, bufferSource, buffer, false, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + this.preRender(poseStack, animatable, model, bufferSource, buffer, false, partialTick, packedLight, packedOverlay, packedColor); if (this.firePreRenderEvent(poseStack, model, bufferSource, partialTick, packedLight)) { this.preApplyRenderLayers(poseStack, animatable, model, renderType, bufferSource, buffer, (float)packedLight, packedLight, packedOverlay); - this.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, false, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + this.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, false, partialTick, packedLight, packedOverlay, packedColor); this.applyRenderLayers(poseStack, animatable, model, renderType, bufferSource, buffer, partialTick, packedLight, packedOverlay); - this.postRender(poseStack, animatable, model, bufferSource, buffer, false, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + this.postRender(poseStack, animatable, model, bufferSource, buffer, false, partialTick, packedLight, packedOverlay, packedColor); this.firePostRenderEvent(poseStack, model, bufferSource, partialTick, packedLight); } poseStack.popPose(); - this.renderFinal(poseStack, animatable, model, bufferSource, buffer, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + this.renderFinal(poseStack, animatable, model, bufferSource, buffer, partialTick, packedLight, packedOverlay, packedColor); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java index 5454ac2914..fb1562c5c8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java @@ -27,12 +27,12 @@ public SpellBowRenderer() { } @Override - public void renderRecursively(PoseStack poseStack, SpellBow animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderRecursively(PoseStack poseStack, SpellBow animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { if (bone.getName().equals("gem")) { //NOTE: if the bone have a parent, the recursion will get here with the neutral color, making the color getter useless - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } else { - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, Color.WHITE.getRed() / 255f, Color.WHITE.getGreen() / 255f, Color.WHITE.getBlue() / 255f, Color.WHITE.getAlpha() / 255f); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, Color.WHITE.argbInt()); } } @@ -82,7 +82,7 @@ public void renderByItem(ItemStack itemStack, ItemDisplayContext transformType, } @Override - public void renderFinal(PoseStack poseStack, SpellBow animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTicks, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderFinal(PoseStack poseStack, SpellBow animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTicks, int packedLight, int packedOverlay, int color) { GeoBone top = model.getBone("bow_top").get(); GeoBone gem = model.getBone("gem").get(); GeoBone bottom = model.getBone("bow_bot").get(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java index 0e351cdc51..71b7b4c02e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java @@ -19,7 +19,6 @@ import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; - import software.bernie.geckolib.util.Color; public class SpellCrossbowRenderer extends FixedGeoItemRenderer { @@ -28,17 +27,17 @@ public SpellCrossbowRenderer() { } @Override - public void renderRecursively(PoseStack poseStack, SpellCrossbow animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderRecursively(PoseStack poseStack, SpellCrossbow animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { if (bone.getName().equals("gem")) { //NOTE: if the bone have a parent, the recursion will get here with the neutral color, making the color getter useless - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } else { - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, Color.WHITE.getRed() / 255f, Color.WHITE.getGreen() / 255f, Color.WHITE.getBlue() / 255f, Color.WHITE.getAlpha() / 255f); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, Color.WHITE.argbInt()); } } @Override - public void renderFinal(PoseStack poseStack, SpellCrossbow animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTicks, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderFinal(PoseStack poseStack, SpellCrossbow animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTicks, int packedLight, int packedOverlay, int color) { GeoBone right = model.getBone("bow_right").get(); GeoBone gem = model.getBone("gem").get(); GeoBone left = model.getBone("bow_left").get(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java index 65e0404331..a174d3a642 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java @@ -9,8 +9,8 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.util.Color; import software.bernie.geckolib.model.GeoModel; +import software.bernie.geckolib.util.Color; public class SwordRenderer extends FixedGeoItemRenderer { public SwordRenderer() { @@ -31,13 +31,14 @@ public ResourceLocation getAnimationResource(EnchantersSword wand) { } }); } + @Override - public void renderRecursively(PoseStack poseStack, EnchantersSword animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderRecursively(PoseStack poseStack, EnchantersSword animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { if (bone.getName().equals("blade")) { //NOTE: if the bone have a parent, the recursion will get here with the neutral color, making the color getter useless - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } else { - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, Color.WHITE.getRed() / 255f, Color.WHITE.getGreen() / 255f, Color.WHITE.getBlue() / 255f, Color.WHITE.getAlpha() / 255f); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, Color.WHITE.argbInt()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java index 8216f94c01..58ded7d076 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java @@ -16,12 +16,12 @@ public WandRenderer() { } @Override - public void renderRecursively(PoseStack poseStack, Wand animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderRecursively(PoseStack poseStack, Wand animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { if (bone.getName().equals("gem")) { //NOTE: if the bone have a parent, the recursion will get here with the neutral color, making the color getter useless - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } else { - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, Color.WHITE.getRed() / 255f, Color.WHITE.getGreen() / 255f, Color.WHITE.getBlue() / 255f, Color.WHITE.getAlpha() / 255f); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, Color.WHITE.argbInt()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java index 3b7a83cd2d..cc91728cf1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java @@ -146,7 +146,6 @@ private void renderArmorPiece(AlterationTile tile, ItemStack itemstack, PoseStac } else { this.renderModel(pPoseStack, pBuffer, packedLightIn, flag1, model, 1.0F, 1.0F, 1.0F, this.getArmorResource(itemstack, pSlot, null)); } - } protected net.minecraft.client.model.Model getArmorModelHook(ItemStack itemStack, EquipmentSlot slot, HumanoidModel model) { @@ -186,7 +185,7 @@ private boolean usesInnerModel(EquipmentSlot pSlot) { @Override - public void actuallyRender(PoseStack stack, AlterationTile tile, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void actuallyRender(PoseStack stack, AlterationTile tile, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { if (tile.getLevel().getBlockState(tile.getBlockPos()).getBlock() != BlockRegistry.ALTERATION_TABLE.get()) return; if (tile.getLevel().getBlockState(tile.getBlockPos()).getValue(AlterationTable.PART) != ThreePartBlock.HEAD) @@ -216,13 +215,13 @@ public void actuallyRender(PoseStack stack, AlterationTile tile, BakedGeoModel m } renderSlate(model, animatable); - super.actuallyRender(stack, tile, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.actuallyRender(stack, tile, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); stack.popPose(); } @Override - public void renderFinal(PoseStack stack, AlterationTile animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - super.renderFinal(stack, animatable, model, bufferSource, buffer, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + public void renderFinal(PoseStack stack, AlterationTile animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay, int colour) { + super.renderFinal(stack, animatable, model, bufferSource, buffer, partialTick, packedLight, packedOverlay, colour); if (animatable.getLevel().getBlockState(animatable.getBlockPos()).getBlock() != BlockRegistry.ALTERATION_TABLE.get()) return; if (animatable.getLevel().getBlockState(animatable.getBlockPos()).getValue(AlterationTable.PART) != ThreePartBlock.HEAD) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java index 151fcd59b1..f8b576919f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java @@ -117,7 +117,7 @@ public void shootSpell(ServerLevel world, BlockPos pos) { int manaCost = tile.getManaCost(); if (manaCost > 0 && SourceUtil.takeSourceWithParticles(pos, world, 10, manaCost) == null) return; - Networking.sendToNearby(world, pos, new PacketOneShotAnimation(pos)); + Networking.sendToNearbyClient(world, pos, new PacketOneShotAnimation(pos)); Position iposition = getDispensePosition(pos, world.getBlockState(pos).getValue(FACING)); Direction direction = world.getBlockState(pos).getValue(FACING); FakePlayer fakePlayer = ANFakePlayer.getPlayer(world); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/EnchantingApparatusBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/EnchantingApparatusBlock.java index d93c7f2652..4ac76ed6c0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/EnchantingApparatusBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/EnchantingApparatusBlock.java @@ -66,7 +66,7 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level colorPos.add(ColorPos.centeredAbove(pedPos)); } } - Networking.sendToNearby(world, tile.getBlockPos(), new HighlightAreaPacket(colorPos, 60)); + Networking.sendToNearbyClient(world, tile.getBlockPos(), new HighlightAreaPacket(colorPos, 60)); PortUtil.sendMessage(player, Component.translatable("ars_nouveau.apparatus.norecipe")); } else if (recipe.consumesSource() && !SourceUtil.hasSourceNearby(tile.getBlockPos(), tile.getLevel(), 10, recipe.sourceCost())) { PortUtil.sendMessage(player, Component.translatable("ars_nouveau.apparatus.nomana")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ImbuementBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ImbuementBlock.java index 9f48510643..e0c48cead3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ImbuementBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ImbuementBlock.java @@ -11,13 +11,11 @@ import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -61,7 +59,7 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level colorPos.add(ColorPos.centeredAbove(pedPos)); } } - Networking.sendToNearby(worldIn, tile.getBlockPos(), new HighlightAreaPacket(colorPos, 60)); + Networking.sendToNearbyClient(worldIn, tile.getBlockPos(), new HighlightAreaPacket(colorPos, 60)); PortUtil.sendMessage(player, Component.translatable("ars_nouveau.imbuement.norecipe")); tile.stack = ItemStack.EMPTY; } else { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java index e844457b96..176142eca9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java @@ -14,6 +14,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Position; +import net.minecraft.core.dispenser.BlockSource; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; @@ -60,7 +61,7 @@ public void shootSpell(ServerLevel world, BlockPos pos) { int manaCost = tile.getManaCost(); if (manaCost > 0 && SourceUtil.takeSourceWithParticles(pos, world, 10, manaCost) == null) return; - Networking.sendToNearby(world, pos, new PacketOneShotAnimation(pos)); + Networking.sendToNearbyClient(world, pos, new PacketOneShotAnimation(pos)); Position iposition = getDispensePosition(new BlockSourceImpl(world, pos), tile); FakePlayer fakePlayer = ANFakePlayer.getPlayer(world); fakePlayer.setPos(pos.getX(), pos.getY(), pos.getZ()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScribesBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScribesBlock.java index b9b98392fd..13f12e6934 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScribesBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScribesBlock.java @@ -11,12 +11,10 @@ import net.minecraft.core.Direction; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Blocks; @@ -27,7 +25,6 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; -import net.neoforged.neoforge.network.PacketDistributor; public class ScribesBlock extends TableBlock { @@ -43,8 +40,7 @@ public ItemInteractionResult useItemOn(ItemStack heldStack,BlockState state, Lev return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } if (player.getItemInHand(handIn).getItem() instanceof SpellBook && !player.isShiftKeyDown()) { - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), - new PacketOpenGlyphCraft(pos)); + Networking.sendToPlayerClient( new PacketOpenGlyphCraft(pos), (ServerPlayer) player); return ItemInteractionResult.SUCCESS; } @@ -96,14 +92,16 @@ public ItemInteractionResult useItemOn(ItemStack heldStack,BlockState state, Lev } @Override - public void playerWillDestroy(Level worldIn, BlockPos pos, BlockState state, Player player) { + public BlockState playerWillDestroy(Level worldIn, BlockPos pos, BlockState state, Player player) { super.playerWillDestroy(worldIn, pos, state, player); if (worldIn.getBlockEntity(pos) instanceof ScribesTile tile && tile.getStack() != null) { worldIn.addFreshEntity(new ItemEntity(worldIn, pos.getX(), pos.getY(), pos.getZ(), tile.getStack())); tile.refundConsumed(); } + return state; } + // If the user breaks the other side of the table, this side needs to drop its item public BlockState tearDown(BlockState state, Direction direction, BlockState state2, LevelAccessor world, BlockPos pos, BlockPos pos2) { if (!world.isClientSide()) { @@ -125,10 +123,11 @@ public void rightClick(PlayerInteractEvent.RightClickBlock event) { BlockPos pos = event.getPos(); if (world.getBlockState(pos).getBlock() instanceof ScribesBlock ) { - if(event.getEntity().getItemInHand(event.getHand()).getItem() instanceof DominionWand){ + ItemStack stack = event.getEntity().getItemInHand(event.getHand()); + if(stack.getItem() instanceof DominionWand){ return; } - BlockRegistry.SCRIBES_BLOCK.get().use(world.getBlockState(pos), world, pos, event.getEntity(), event.getHand(), null); + BlockRegistry.SCRIBES_BLOCK.get().useItemOn(stack, world.getBlockState(pos), world, pos, event.getEntity(), event.getHand(), null); event.setCanceled(true); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java index 6ad283c0f6..26a3554b94 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java @@ -3,7 +3,6 @@ import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenuSlot; -import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.common.block.tile.ArcanePedestalTile; import com.hollingsworth.arsnouveau.common.block.tile.ScryersOculusTile; import com.hollingsworth.arsnouveau.common.items.ScryerScroll; @@ -15,12 +14,10 @@ import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.entity.BlockEntity; @@ -80,7 +77,7 @@ public void openMenu(Level pLevel, BlockPos pPos, Player pPlayer) { PortUtil.sendMessage(pPlayer, Component.translatable("ars_nouveau.scryers_eye.no_pos")); return; } - Networking.INSTANCE.sendToServer(new PacketMountCamera(data.pos)); + Networking.sendToServer(new PacketMountCamera(data.pos)); }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtil.drawItemAsIcon(slotData.getDefaultInstance(), posestack, positionx, posy, size, transparent), 3))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java index f2b9a7a2da..598838980d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java @@ -27,8 +27,9 @@ import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.world.level.pathfinder.BlockPathTypes; +import net.minecraft.world.level.pathfinder.PathType; import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; @@ -45,7 +46,7 @@ public SourceBerryBush(BlockBehaviour.Properties properties) { } @Override - public ItemStack getCloneItemStack(BlockGetter worldIn, BlockPos pos, BlockState state) { + public ItemStack getCloneItemStack(BlockState state, HitResult target, LevelReader level, BlockPos pos, Player player) { return new ItemStack(BlockRegistry.SOURCEBERRY_BUSH); } @@ -113,9 +114,8 @@ protected void createBlockStateDefinition(StateDefinition.Builder passengers = entity.getPassengers(); - return entity.changeDimension((ServerLevel) targetWorld, new ITeleporter() { - @Override - public Entity placeEntity(Entity entity, ServerLevel currentWorld, ServerLevel destWorld, float yaw, Function repositionEntity) { - Entity repositionedEntity = repositionEntity.apply(false); - if (repositionedEntity != null) { - //Teleport all passengers to the other dimension and then make them start riding the entity again - for (Entity passenger : passengers) { - teleportPassenger(destWorld, destination, repositionedEntity, passenger); - } - } - return repositionedEntity; - } - - @Override - public PortalInfo getPortalInfo(Entity entity, ServerLevel destWorld, Function defaultPortalInfo) { - return new PortalInfo(destination, entity.getDeltaMovement(), rotationVec.y, rotationVec.x); - } - - @Override - public boolean playTeleportSound(ServerPlayer player, ServerLevel sourceWorld, ServerLevel destWorld) { - return false; - } - }); - } - - private static void teleportPassenger(ServerLevel destWorld, Vec3 destination, Entity repositionedEntity, Entity passenger) { - if (!passenger.canChangeDimensions()) { - //If the passenger can't change dimensions just let it peacefully stay after dismounting rather than trying to teleport it - return; - } - //Note: We grab the passengers here instead of in placeEntity as changeDimension starts by removing any passengers - List passengers = passenger.getPassengers(); - passenger.changeDimension(destWorld, new ITeleporter() { - @Override - public Entity placeEntity(Entity entity, ServerLevel currentWorld, ServerLevel destWorld, float yaw, Function repositionEntity) { - boolean invulnerable = entity.isInvulnerable(); - //Make the entity invulnerable so that when we teleport it, it doesn't take damage - // we revert this state to the previous state after teleporting - entity.setInvulnerable(true); - Entity repositionedPassenger = repositionEntity.apply(false); - if (repositionedPassenger != null) { - //Force our passenger to start riding the new entity again - repositionedPassenger.startRiding(repositionedEntity, true); - //Teleport "nested" passengers - for (Entity passenger : passengers) { - teleportPassenger(destWorld, destination, repositionedPassenger, passenger); - } - repositionedPassenger.setInvulnerable(invulnerable); - } - entity.setInvulnerable(invulnerable); - return repositionedPassenger; - } - - @Override - public PortalInfo getPortalInfo(Entity entity, ServerLevel destWorld, Function defaultPortalInfo) { - //This is needed to ensure the passenger starts getting tracked after teleporting - return new PortalInfo(destination, entity.getDeltaMovement(), entity.getYRot(), entity.getXRot()); - } - - @Override - public boolean playTeleportSound(ServerPlayer player, ServerLevel sourceWorld, ServerLevel destWorld) { - return false; - } - }); + return entity.changeDimension(new DimensionTransition ((ServerLevel) targetWorld, destination, new Vec3(0,0,0),rotationVec.y, rotationVec.x, false, DimensionTransition.DO_NOTHING)); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java index 0f510ec143..80c8748117 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java @@ -101,7 +101,7 @@ public void tick() { if (getRemainingRequired().isEmpty() && !crafting) { crafting = true; craftingTicks = 120; - Networking.sendToNearby(level, getBlockPos(), new PacketOneShotAnimation(getBlockPos(), 0)); + Networking.sendToNearbyClient(level, getBlockPos(), new PacketOneShotAnimation(getBlockPos(), 0)); updateBlock(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java index e7d04f3bd4..1b6a41020f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java @@ -47,7 +47,7 @@ public void tick() { if (!containerItem.isEmpty()) { level.addFreshEntity(new ItemEntity(level, i.getX(), i.getY(), i.getZ(), containerItem)); } - Networking.sendToNearby(level, getBlockPos(), + Networking.sendToNearbyClient(level, getBlockPos(), new PacketANEffect(PacketANEffect.EffectType.BURST, i.blockPosition(), new ParticleColor(255, 0, 0))); return; } @@ -59,7 +59,7 @@ public void tick() { ItemStack containerItem = i.getItem(0).getCraftingRemainingItem(); i.removeItem(0, 1); i.setItem(0, containerItem); - Networking.sendToNearby(level, getBlockPos(), + Networking.sendToNearbyClient(level, getBlockPos(), new PacketANEffect(PacketANEffect.EffectType.BURST, i.getBlockPos().above(), new ParticleColor(255, 0, 0))); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java index 847667a289..454a643596 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java @@ -87,7 +87,7 @@ public static void onClientTick(ClientTickEvent event) { } private static void dismount() { - Networking.INSTANCE.sendToServer(new PacketDismountCamera()); + Networking.sendToServer(new PacketDismountCamera()); } public static void moveViewUp(ScryerCamera cam) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/command/PathCommand.java b/src/main/java/com/hollingsworth/arsnouveau/common/command/PathCommand.java deleted file mode 100644 index 84c73376c6..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/command/PathCommand.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.hollingsworth.arsnouveau.common.command; - -import com.google.common.collect.ImmutableList; -import com.hollingsworth.arsnouveau.common.network.Networking; -import com.hollingsworth.arsnouveau.common.network.PacketTogglePathing; -import com.mojang.brigadier.CommandDispatcher; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.Commands; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.Entity; -import net.neoforged.neoforge.network.PacketDistributor; - -public class PathCommand { - - public static void register(CommandDispatcher dispatcher) { - dispatcher.register(Commands.literal("ars-pathing"). - requires(sender -> sender.hasPermission(2)) - .executes(context -> setPathing(context.getSource(), ImmutableList.of(context.getSource().getEntityOrException())))); - } - - private static int setPathing(CommandSourceStack source, ImmutableList of) { - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) of.get(0)), - new PacketTogglePathing()); - return 1; - } - -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/command/ToggleLightCommand.java b/src/main/java/com/hollingsworth/arsnouveau/common/command/ToggleLightCommand.java index a098d92f87..7ad52cb130 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/command/ToggleLightCommand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/command/ToggleLightCommand.java @@ -8,7 +8,6 @@ import net.minecraft.commands.Commands; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; -import net.neoforged.neoforge.network.PacketDistributor; public class ToggleLightCommand { public static void register(CommandDispatcher dispatcher) { @@ -26,7 +25,7 @@ private static int resetPlayers(CommandSourceStack source, boolean enable) { e.printStackTrace(); return 1; } - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), new PacketToggleLight(enable)); + Networking.sendToPlayerClient(new PacketToggleLight(enable), player); String path = enable ? "ars_nouveau.lights_on" : "ars_nouveau.lights_off"; player.sendSystemMessage(Component.translatable(path, enable)); return 1; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java index 64c4ddbe00..6ed6a939ad 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java @@ -52,11 +52,7 @@ import net.neoforged.neoforge.common.Tags; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -166,7 +162,7 @@ public void tick() { tamingTime++; if (tamingTime % 20 == 0 && !level.isClientSide()) - Networking.sendToNearby(level, this, new PacketANEffect(PacketANEffect.EffectType.TIMED_HELIX, blockPosition(), ParticleColor.ORANGE)); + Networking.sendToNearbyClient(level, this, new PacketANEffect(PacketANEffect.EffectType.TIMED_HELIX, blockPosition(), ParticleColor.ORANGE)); if (tamingTime > 60 && !level.isClientSide) { ItemStack stack = new ItemStack(ItemsRegistry.DRYGMY_SHARD, 1 + level.random.nextInt(2)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java index e1b3e9b7e2..8d8b6caef5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java @@ -13,6 +13,7 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; @@ -183,7 +184,7 @@ private double getDistanceAdjustment(Vec3 start, Vec3 end) { public void load(CompoundTag compound) { super.load(compound); if (compound.contains("item")) { - this.entityData.set(HELD_ITEM, ItemStack.of(compound.getCompound("item"))); + this.entityData.set(HELD_ITEM, ItemStack.parseOptional(level.registryAccess(), compound.getCompound("item"))); } this.age = compound.getInt("age"); this.entityData.set(DIDOFFSET, compound.getBoolean("didoffset")); @@ -196,8 +197,7 @@ public void load(CompoundTag compound) { public void addAdditionalSaveData(CompoundTag compound) { super.addAdditionalSaveData(compound); if (getStack() != null) { - CompoundTag tag = new CompoundTag(); - getStack().save(tag); + Tag tag = getStack().save(level.registryAccess()); compound.put("item", tag); } compound.putInt("age", age); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityLingeringSpell.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityLingeringSpell.java index 98e8bc6600..26795c7e4a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityLingeringSpell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityLingeringSpell.java @@ -15,9 +15,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; - import net.minecraft.world.phys.*; -import net.neoforged.neoforge.network.PlayMessages; import org.jetbrains.annotations.Nullable; public class EntityLingeringSpell extends EntityProjectileSpell { @@ -118,10 +116,6 @@ public void playParticles() { ParticleUtil.spawnLight(level, getParticleColor(), position.add(0, 0.5, 0), 10); } - public EntityLingeringSpell(PlayMessages.SpawnEntity packet, Level world) { - super(ModEntities.LINGER_SPELL.get(), world); - } - @Override public EntityType getType() { return ModEntities.LINGER_SPELL.get(); @@ -132,7 +126,7 @@ protected void onHit(HitResult result) { if (!level.isClientSide && result instanceof BlockHitResult && !this.isRemoved()) { BlockState state = level.getBlockState(((BlockHitResult) result).getBlockPos()); if (state.is(BlockTags.PORTALS)) { - state.getBlock().entityInside(state, level, ((BlockHitResult) result).getBlockPos(), this); + state.entityInside(level, ((BlockHitResult) result).getBlockPos(), this); return; } this.setLanded(true); @@ -177,13 +171,13 @@ public boolean shouldFall() { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - entityData.define(ACCELERATES, 0); - entityData.define(AOE, 0f); - entityData.define(LANDED, false); - entityData.define(SENSITIVE, false); - entityData.define(SHOULD_FALL, true); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(ACCELERATES, 0); + pBuilder.define(AOE, 0f); + pBuilder.define(LANDED, false); + pBuilder.define(SENSITIVE, false); + pBuilder.define(SHOULD_FALL, true); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityOrbitProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityOrbitProjectile.java index 672a4663ed..7751cde6e6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityOrbitProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityOrbitProjectile.java @@ -7,8 +7,6 @@ import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; @@ -169,7 +167,7 @@ protected void onHit(@NotNull HitResult result) { } if (this.spellResolver != null) { this.spellResolver.onResolveEffect(level, result); - Networking.sendToNearby(level, BlockPos.containing(result.getLocation()), new PacketANEffect(PacketANEffect.EffectType.BURST, + Networking.sendToNearbyClient(level, BlockPos.containing(result.getLocation()), new PacketANEffect(PacketANEffect.EffectType.BURST, BlockPos.containing(result.getLocation()), getParticleColor())); attemptRemoval(); } @@ -177,7 +175,7 @@ protected void onHit(@NotNull HitResult result) { if (this.spellResolver != null) { this.spellResolver.onResolveEffect(this.level, blockraytraceresult); } - Networking.sendToNearby(level, ((BlockHitResult) result).getBlockPos(), new PacketANEffect(PacketANEffect.EffectType.BURST, + Networking.sendToNearbyClient(level, ((BlockHitResult) result).getBlockPos(), new PacketANEffect(PacketANEffect.EffectType.BURST, BlockPos.containing(result.getLocation()).below(), getParticleColor())); attemptRemoval(); } @@ -223,13 +221,4 @@ public void readAdditionalSaveData(CompoundTag tag) { public EntityType getType() { return ModEntities.ORBIT_SPELL.get(); } - - @Override - public Packet getAddEntityPacket() { - return NetworkHooks.getEntitySpawningPacket(this); - } - - public EntityOrbitProjectile(PlayMessages.SpawnEntity packet, Level world) { - super(ModEntities.ORBIT_SPELL.get(), world); - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java index acfa25c33f..78773edf6c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java @@ -16,8 +16,6 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; @@ -38,6 +36,7 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.common.NeoForge; + import javax.annotation.Nullable; import java.util.HashSet; import java.util.Set; @@ -314,7 +313,7 @@ protected void onHit(HitResult result) { if (entityHitResult.getEntity().equals(this.getOwner())) return; if (this.spellResolver != null) { this.spellResolver.onResolveEffect(level, result); - Networking.sendToNearby(level, BlockPos.containing(result.getLocation()), new PacketANEffect(PacketANEffect.EffectType.BURST, + Networking.sendToNearbyClient(level, BlockPos.containing(result.getLocation()), new PacketANEffect(PacketANEffect.EffectType.BURST, BlockPos.containing(result.getLocation()), getParticleColor())); attemptRemoval(); } @@ -350,7 +349,7 @@ protected void onHit(HitResult result) { this.hitList.add(blockraytraceresult.getBlockPos()); this.spellResolver.onResolveEffect(this.level, blockraytraceresult); } - Networking.sendToNearby(level, ((BlockHitResult) result).getBlockPos(), new PacketANEffect(PacketANEffect.EffectType.BURST, + Networking.sendToNearbyClient(level, ((BlockHitResult) result).getBlockPos(), new PacketANEffect(PacketANEffect.EffectType.BURST, BlockPos.containing(result.getLocation()).below(), getParticleColor())); attemptRemoval(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityRitualProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityRitualProjectile.java index 3670587802..eae66b6e89 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityRitualProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityRitualProjectile.java @@ -8,12 +8,8 @@ import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.network.NetworkHooks; -import net.neoforged.neoforge.network.PlayMessages; public class EntityRitualProjectile extends ColoredProjectile { @@ -81,15 +77,6 @@ public EntityType getType() { return ModEntities.ENTITY_RITUAL.get(); } - @Override - public Packet getAddEntityPacket() { - return NetworkHooks.getEntitySpawningPacket(this); - } - - public EntityRitualProjectile(PlayMessages.SpawnEntity packet, Level world) { - super(ModEntities.ENTITY_RITUAL.get(), world); - } - @Override public boolean save(CompoundTag tag) { if (tilePos != null) @@ -101,7 +88,7 @@ public boolean save(CompoundTag tag) { public void load(CompoundTag compound) { super.load(compound); if (compound.contains("ritpos")) { - tilePos = NbtUtils.readBlockPos(compound.getCompound("ritpos")); + tilePos = NbtUtils.readBlockPos(compound, "ritpos").orElse(null); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/LightningEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/LightningEntity.java index 5b08e3c297..dfc64083a9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/LightningEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/LightningEntity.java @@ -1,12 +1,10 @@ package com.hollingsworth.arsnouveau.common.entity; -import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; +import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; @@ -25,10 +23,11 @@ import net.minecraft.world.phys.AABB; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.energy.IEnergyStorage; import net.neoforged.neoforge.event.entity.EntityStruckByLightningEvent; + import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -107,9 +106,9 @@ public void tick() { entity.thunderHit((ServerLevel) this.level, this); this.setDamage(origDamage); if (!level.isClientSide && !hitEntities.contains(entity.getId()) && entity instanceof LivingEntity) { - MobEffectInstance effectInstance = ((LivingEntity) entity).getEffect(ModPotions.SHOCKED_EFFECT.get()); + MobEffectInstance effectInstance = ((LivingEntity) entity).getEffect(ModPotions.SHOCKED_EFFECT); int amp = effectInstance != null ? effectInstance.getAmplifier() : -1; - ((LivingEntity) entity).addEffect(new MobEffectInstance(ModPotions.SHOCKED_EFFECT.get(), 200 + 10 * 20 * extendTimes, Math.min(2, amp + 1))); + ((LivingEntity) entity).addEffect(new MobEffectInstance(ModPotions.SHOCKED_EFFECT, 200 + 10 * 20 * extendTimes, Math.min(2, amp + 1))); } if (!level.isClientSide && !hitEntities.contains(entity.getId())) hitEntities.add(entity.getId()); @@ -189,13 +188,4 @@ protected void addAdditionalSaveData(CompoundTag compound) { public EntityType getType() { return ModEntities.LIGHTNING_ENTITY.get(); } - - @Override - public Packet getAddEntityPacket() { - return NetworkHooks.getEntitySpawningPacket(this); - } - - public LightningEntity(PlayMessages.SpawnEntity packet, Level world) { - super(ModEntities.LIGHTNING_ENTITY.get(), world); - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Lily.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Lily.java index 2ec338a3d9..3ebe20a333 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Lily.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Lily.java @@ -14,6 +14,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; +import net.minecraft.tags.ItemTags; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; @@ -22,7 +23,6 @@ import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.goal.*; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; @@ -33,8 +33,8 @@ import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.UUID; @@ -60,7 +60,7 @@ protected void registerGoals() { super.registerGoals(); this.goalSelector.addGoal(1, new FloatGoal(this)); this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); - this.goalSelector.addGoal(6, new FollowOwnerGoal(this, 1.0D, 10.0F, 2.0F, false)); + this.goalSelector.addGoal(6, new FollowOwnerGoal(this, 1.0D, 10.0F, 2.0F)); this.goalSelector.addGoal(7, new WagGoal(this)); this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D)); this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Player.class, 8.0F)); @@ -100,10 +100,10 @@ public void tick() { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(SIT, false); - this.entityData.define(WAG, false); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(SIT, false); + pBuilder.define(WAG, false); } @Override @@ -173,8 +173,7 @@ protected float getSoundVolume() { * the animal type) */ public boolean isFood(ItemStack pStack) { - Item item = pStack.getItem(); - return item.isEdible() && pStack.getFoodProperties(this).isMeat(); + return pStack.is(ItemTags.WOLF_FOOD); } @Nullable diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/ScryerCamera.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/ScryerCamera.java index b98811e87e..0841848451 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/ScryerCamera.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/ScryerCamera.java @@ -13,17 +13,13 @@ import net.minecraft.core.Direction; import net.minecraft.core.SectionPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; -import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.neoforged.neoforge.common.world.ForcedChunkManager; -import net.neoforged.neoforge.network.PacketDistributor; /** * Camera work is taken from SecurityCraft: @@ -96,6 +92,11 @@ protected boolean repositionEntityAfterLoad() { return false; } + @Override + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + + } + public void tick() { if (this.level.isClientSide) { if (this.screenshotSoundCooldown > 0) { @@ -132,7 +133,7 @@ public void stopViewing(ServerPlayer player) { if (!this.level.isClientSide) { this.discardCamera(); player.camera = player; - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), new PacketSetCameraView(player)); + Networking.sendToPlayerClient(new PacketSetCameraView(player), player); } } @@ -166,19 +167,14 @@ public boolean hasLoadedChunks() { return this.loadedChunks; } - protected void defineSynchedData() { - } - + @Override public void addAdditionalSaveData(CompoundTag tag) { } + @Override public void readAdditionalSaveData(CompoundTag tag) { } - public Packet getAddEntityPacket() { - return new ClientboundAddEntityPacket(this); - } - public boolean isAlwaysTicking() { return true; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 1182aa4b36..3ffa8b73cd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -38,6 +38,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; @@ -128,8 +129,6 @@ public enum StarbuncleGoalState { public Starbuncle(EntityType entityCarbuncleEntityType, Level world) { super(entityCarbuncleEntityType, world); - //TODO: check if this still works after AT - maxUpStep = 1.1f; dynamicBehavior = new StarbyTransportBehavior(this, new CompoundTag()); reloadGoals(); this.moveControl = new MovementHandler(this); @@ -338,7 +337,7 @@ public List getWandHighlight(List list) { } public void syncBehavior() { - Networking.sendToNearby(level, this, new PacketSyncTag(dynamicBehavior.toTag(new CompoundTag()), getId())); + Networking.sendToNearbyClient(level, this, new PacketSyncTag(dynamicBehavior.toTag(new CompoundTag()), getId())); } @Override @@ -361,7 +360,7 @@ public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @org.jetbrain public static AttributeSupplier.Builder attributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 20.0D) - .add(Attributes.MOVEMENT_SPEED, 0.2d); + .add(Attributes.MOVEMENT_SPEED, 0.2d).add(Attributes.STEP_HEIGHT, 1.1f); } @@ -766,7 +765,7 @@ public StarbuncleData(CompoundTag tag) { bio = null; if (tag.contains("path")) { - pathBlock = ForgeRegistries.BLOCKS.getValue(ResourceLocation.tryParse(tag.getString("path"))); + pathBlock = BuiltInRegistries.BLOCK.get(ResourceLocation.tryParse(tag.getString("path"))); } bedPos = NBTUtil.getBlockPos(tag, "bed_"); if (bedPos.equals(BlockPos.ZERO)) @@ -774,7 +773,7 @@ public StarbuncleData(CompoundTag tag) { if (tag.contains("behavior")) behaviorTag = tag.getCompound("behavior"); if (tag.contains("cosmetic")) { - cosmetic = ItemStack.of(tag.getCompound("cosmetic")); + cosmetic = ItemStack.parseOptional(tag.getCompound("cosmetic")); } if (tag.contains("adopter")) { adopter = tag.getString("adopter"); @@ -792,7 +791,7 @@ public CompoundTag toTag(Starbuncle starbuncle, CompoundTag tag) { if (bedPos != null) NBTUtil.storeBlockPos(tag, "bed_", bedPos); if (!starbuncle.getCosmeticItem().isEmpty()) { - tag.put("cosmetic", starbuncle.getCosmeticItem().serializeNBT()); + tag.put("cosmetic", starbuncle.getCosmeticItem().save(starbuncle.level.registryAccess())); } tag.put("behavior", starbuncle.dynamicBehavior.toTag(new CompoundTag())); if (adopter != null) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonHorse.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonHorse.java index 0a7e910687..ffef7782a1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonHorse.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonHorse.java @@ -12,7 +12,6 @@ import net.minecraft.world.InteractionResult; import net.minecraft.world.SimpleContainer; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.animal.Animal; @@ -44,9 +43,9 @@ public InteractionResult mobInteract(Player p_230254_1_, InteractionHand p_23025 } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(OWNER_UUID, Optional.of(Util.NIL_UUID)); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(OWNER_UUID, Optional.of(Util.NIL_UUID)); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonSkeleton.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonSkeleton.java index 266a60d1a1..8cc27e6590 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonSkeleton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonSkeleton.java @@ -6,6 +6,7 @@ import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.players.OldUsersConverter; import net.minecraft.util.RandomSource; @@ -29,7 +30,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; -import net.minecraft.world.scores.Team; +import net.minecraft.world.scores.PlayerTeam; import org.jetbrains.annotations.Nullable; import java.util.Optional; @@ -82,10 +83,11 @@ public EntityType getType() { } @Nullable - public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { - this.populateDefaultEquipmentSlots(getRandom(), difficultyIn); - this.populateDefaultEquipmentEnchantments(getRandom(), difficultyIn); - return super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pSpawnType, @Nullable SpawnGroupData pSpawnGroupData) { + this.populateDefaultEquipmentSlots(getRandom(), pDifficulty); + this.populateDefaultEquipmentEnchantments(pLevel, getRandom(), pDifficulty); + return super.finalizeSpawn(pLevel, pDifficulty, pSpawnType, pSpawnGroupData); } /** @@ -97,13 +99,17 @@ protected void populateDefaultEquipmentSlots(RandomSource randomSource, Difficul } @Override - protected void dropAllDeathLoot(DamageSource pDamageSource) {} + protected void dropAllDeathLoot(ServerLevel p_348524_, DamageSource p_21192_) { + + } @Override protected boolean shouldDropLoot() {return false;} @Override - protected void dropCustomDeathLoot(DamageSource pSource, int pLooting, boolean pRecentlyHit) {} + protected void dropCustomDeathLoot(ServerLevel p_348477_, DamageSource p_33574_, boolean p_33576_) { + + } @Override protected void dropEquipment() {} @@ -164,6 +170,7 @@ public boolean hurt(DamageSource pSource, float pAmount) { /** * Called to update the entity's position/logic. */ + @Override public void tick() { super.tick(); if (--this.limitedLifeTicks <= 0) { @@ -172,11 +179,13 @@ public void tick() { } } - public Team getTeam() { + @Override + public PlayerTeam getTeam() { if (this.getSummoner() != null) return getSummoner().getTeam(); return super.getTeam(); } + @Override public boolean isAlliedTo(Entity pEntity) { LivingEntity summoner = this.getSummoner(); @@ -219,6 +228,7 @@ public int getBaseExperienceReward() { /** * (abstract) Protected helper method to read subclass entity data from NBT. */ + @Override public void readAdditionalSaveData(CompoundTag compound) { super.readAdditionalSaveData(compound); if (compound.contains("BoundX")) { @@ -260,11 +270,13 @@ public LivingEntity getOwnerFromID() { } } - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(OWNER_UNIQUE_ID, Optional.empty()); + @Override + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(OWNER_UNIQUE_ID, Optional.of(Util.NIL_UUID)); } + @Override public void addAdditionalSaveData(CompoundTag compound) { super.addAdditionalSaveData(compound); if (this.boundOrigin != null) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonWolf.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonWolf.java index b76ec40e1d..1d4048c629 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonWolf.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonWolf.java @@ -15,7 +15,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import javax.annotation.Nullable; import java.util.Optional; import java.util.UUID; @@ -43,9 +42,9 @@ public void tick() { private static final EntityDataAccessor> OWNER_UUID = SynchedEntityData.defineId(SummonWolf.class, EntityDataSerializers.OPTIONAL_UUID); @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(OWNER_UUID, Optional.of(Util.NIL_UUID)); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(OWNER_UUID, Optional.of(Util.NIL_UUID)); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java index 5a6078c552..c12789d9f7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java @@ -58,11 +58,7 @@ import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -266,7 +262,7 @@ public void tick() { if (this.droppingShards) { tamingTime++; if (tamingTime % 20 == 0 && !level.isClientSide()) - Networking.sendToNearby(level, this, new PacketANEffect(PacketANEffect.EffectType.TIMED_HELIX, blockPosition(), ParticleColor.GREEN)); + Networking.sendToNearbyClient(level, this, new PacketANEffect(PacketANEffect.EffectType.TIMED_HELIX, blockPosition(), ParticleColor.GREEN)); if (tamingTime > 60 && !level.isClientSide) { ItemStack stack = new ItemStack(ItemsRegistry.WHIRLISPRIG_SHARDS, 1 + level.random.nextInt(1)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/debug/EntityDebugger.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/debug/EntityDebugger.java index e2c2a2ad41..f64135c21e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/debug/EntityDebugger.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/debug/EntityDebugger.java @@ -29,7 +29,7 @@ public void writeFile(PrintWriter writer) { writer.print("Entity: " + " (" + entity.getClass().getSimpleName() + ")"); // print current entity goal if(entity instanceof Mob mob){ - for(WrappedGoal goal : mob.goalSelector.getRunningGoals().toList()){ + for(WrappedGoal goal : mob.goalSelector.availableGoals.stream().filter(WrappedGoal::isRunning).toList()){ writer.println("Running Goal: " + goal.getGoal().getClass().getSimpleName()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java index 93712e0b93..7e485f5939 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java @@ -6,11 +6,11 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.block.tile.IAnimationListener; import com.hollingsworth.arsnouveau.common.entity.EntityWixie; -import com.hollingsworth.arsnouveau.common.util.PotionUtil; -import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketAnimEntity; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.common.util.PotionUtil; +import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; @@ -26,8 +26,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; - import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.Tags; @@ -35,8 +33,8 @@ import net.neoforged.neoforge.event.entity.living.MobEffectEvent; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; import java.util.ArrayList; import java.util.Arrays; @@ -74,7 +72,7 @@ protected InteractionResult mobInteract(Player player, InteractionHand hand) { if(!data.isEmpty()){ data.applyEffects(player, player, player); PortUtil.sendMessage(player, Component.translatable("ars_nouveau.wixie_familiar.applied",data.asPotionStack().getHoverName().getString())); - Networking.sendToNearby(level(), this, new PacketAnimEntity(this.getId(), EntityWixie.Animations.CAST.ordinal())); + Networking.sendToNearbyClient(level(), this, new PacketAnimEntity(this.getId(), EntityWixie.Animations.CAST.ordinal())); ParticleUtil.spawnPoof((ServerLevel) level(), player.blockPosition().above()); stack.shrink(1); return InteractionResult.SUCCESS; @@ -166,7 +164,7 @@ public void tick() { if (wixie.getTarget().isInvertedHealAndHarm()) effect = MobEffects.REGENERATION; } - Networking.sendToNearby(wixie.level, wixie, new PacketAnimEntity(wixie.getId(), EntityWixie.Animations.CAST.ordinal())); + Networking.sendToNearbyClient(wixie.level, wixie, new PacketAnimEntity(wixie.getId(), EntityWixie.Animations.CAST.ordinal())); wixie.getTarget().addEffect(new MobEffectInstance(effect, 7 * 20, new Random().nextInt(2))); wixie.debuffCooldown = 150; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/AnimatedAttackGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/AnimatedAttackGoal.java index 99f43f377c..29b8e0e7f6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/AnimatedAttackGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/AnimatedAttackGoal.java @@ -132,7 +132,7 @@ public void look(LivingEntity entity) { public void onArrive() { this.arrived = true; - Networking.sendToNearby(mob.level, mob, new PacketAnimEntity(mob.getId(), animationID)); + Networking.sendToNearbyClient(mob.level, mob, new PacketAnimEntity(mob.getId(), animationID)); } public void tick() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java index 818f74f322..caf658b9cb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java @@ -56,7 +56,7 @@ public StarbyTransportBehavior(Starbuncle entity, CompoundTag tag) { return; if (tag.contains("itemScroll")) - this.itemScroll = ItemStack.of(tag.getCompound("itemScroll")); + this.itemScroll = ItemStack.parseOptional(entity.level.registryAccess(), tag.getCompound("itemScroll")); } @Override @@ -132,20 +132,15 @@ public BlockPos getValidStorePos(ItemStack stack) { public ItemScroll.SortPref sortPrefForStack(@Nullable BlockPos b, ItemStack stack) { if (stack == null || stack.isEmpty() || b == null || !level.isLoaded(b)) return ItemScroll.SortPref.INVALID; - return canDepositItem(level.getBlockEntity(b), stack); + return canDepositItem(b, stack); } public boolean isPickupDisabled() { return starbuncle.getCosmeticItem().getItem() == ItemsRegistry.STARBUNCLE_SHADES.get(); } - public @Nullable IItemHandler getItemCapFromTile(BlockEntity blockEntity, @Nullable Direction face) { - if (blockEntity != null && blockEntity.getCapability(Capabilities.ITEM_HANDLER, face).isPresent()) { - var lazy = blockEntity.getCapability(Capabilities.ITEM_HANDLER, face).resolve(); - if (lazy.isPresent()) - return lazy.get(); - } - return null; + public @Nullable IItemHandler getItemCapFromTile(BlockPos pos, @Nullable Direction face) { + return starbuncle.level.getCapability(Capabilities.ItemHandler.BLOCK, pos, face); } public @Nullable BlockPos getValidTakePos() { @@ -163,7 +158,7 @@ public boolean isPositionValidTake(BlockPos p) { if (p == null || !level.isLoaded(p)) return false; Direction face = FROM_DIRECTION_MAP.get(p.hashCode()); - IItemHandler iItemHandler = getItemCapFromTile(level.getBlockEntity(p), face); + IItemHandler iItemHandler = getItemCapFromTile(p, face); if (iItemHandler == null) return false; for (int j = 0; j < iItemHandler.getSlots(); j++) { @@ -184,7 +179,7 @@ public int getMaxTake(ItemStack stack) { } BlockPos validStorePos = getValidStorePos(stack); if (validStorePos == null) return -1; - IItemHandler handler = getItemCapFromTile(level.getBlockEntity(validStorePos), FROM_DIRECTION_MAP.get(validStorePos.hashCode())); + IItemHandler handler = getItemCapFromTile(validStorePos, FROM_DIRECTION_MAP.get(validStorePos.hashCode())); if (handler == null) return -1; @@ -204,18 +199,18 @@ public int getMaxTake(ItemStack stack) { return -1; } - private ItemScroll.SortPref canDepositItem(BlockEntity tile, ItemStack stack) { + private ItemScroll.SortPref canDepositItem(BlockPos pos, ItemStack stack) { ItemScroll.SortPref pref = ItemScroll.SortPref.LOW; - if (tile == null || stack == null || stack.isEmpty()) + if (pos == null || stack == null || stack.isEmpty()) return ItemScroll.SortPref.INVALID; - IItemHandler handler = getItemCapFromTile(tile, TO_DIRECTION_MAP.get(tile.getBlockPos().hashCode())); + IItemHandler handler = getItemCapFromTile(pos, TO_DIRECTION_MAP.get(pos.hashCode())); if (handler == null) return ItemScroll.SortPref.INVALID; - for (ItemFrame i : level.getEntitiesOfClass(ItemFrame.class, new AABB(tile.getBlockPos()).inflate(1))) { + for (ItemFrame i : level.getEntitiesOfClass(ItemFrame.class, new AABB(pos).inflate(1))) { // Check if these frames are attached to the tile BlockEntity adjTile = level.getBlockEntity(i.blockPosition().relative(i.getDirection().getOpposite())); - if (adjTile == null || !adjTile.equals(tile) || i.getItem().isEmpty()) + if (adjTile == null || !adjTile.equals(level.getBlockEntity(pos)) || i.getItem().isEmpty()) continue; @@ -247,8 +242,8 @@ public void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @Nullable Di super.onFinishedConnectionFirst(storedPos, side, storedEntity, playerEntity); if (storedPos == null) return; - BlockEntity blockEntity = level.getBlockEntity(storedPos); - if (blockEntity != null && blockEntity.getCapability(Capabilities.ITEM_HANDLER, side).isPresent()) { + IItemHandler cap = level.getCapability(Capabilities.ItemHandler.BLOCK, storedPos, side); + if (cap != null) { PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.starbuncle.store")); addToPos(storedPos, side); } @@ -260,8 +255,8 @@ public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable Dir if (storedPos == null) return; - BlockEntity blockEntity = level.getBlockEntity(storedPos); - if (blockEntity != null && blockEntity.getCapability(Capabilities.ITEM_HANDLER, side).isPresent()) { + IItemHandler cap = level.getCapability(Capabilities.ItemHandler.BLOCK, storedPos, side); + if (cap != null) { PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.starbuncle.take")); addFromPos(storedPos, side); } @@ -277,7 +272,7 @@ public void onWanded(Player playerEntity) { public CompoundTag toTag(CompoundTag tag) { super.toTag(tag); if (itemScroll != null) { - tag.put("itemScroll", itemScroll.serializeNBT()); + tag.put("itemScroll", itemScroll.save(level.registryAccess())); } return tag; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraDiveGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraDiveGoal.java index 9b2eecbba7..a11e37df74 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraDiveGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraDiveGoal.java @@ -46,7 +46,7 @@ public void start() { boss.setFlying(true); boss.getNavigation().setCanFloat(true); - Networking.sendToNearby(boss.level, boss, new PacketAnimEntity(boss.getId(), WildenChimera.Animations.FLYING.ordinal())); + Networking.sendToNearbyClient(boss.level, boss, new PacketAnimEntity(boss.getId(), WildenChimera.Animations.FLYING.ordinal())); } @Override @@ -110,7 +110,7 @@ public void endGoal() { boss.diveCooldown = (int) (300 + ParticleUtil.inRange(-100, 100) + boss.getCooldownModifier()); boss.diving = false; finished = true; - ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.CHIMERA_EXPLOSION, (ServerLevel) boss.level, BlockPos.containing(boss.position().x, boss.position.y, boss.position.z), 10); + ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.CHIMERA_EXPLOSION.get(), (ServerLevel) boss.level, BlockPos.containing(boss.position().x, boss.position.y, boss.position.z), 10); for(int i = 0; i < 40; i++){ if(!boss.level.getBlockState(boss.getOnPos().below(i)).isAir()){ boss.setPos(boss.getX(), boss.getY() - i, boss.getZ()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraLeapRamGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraLeapRamGoal.java index 74dd57f0f2..feb2e2aba4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraLeapRamGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraLeapRamGoal.java @@ -94,7 +94,7 @@ public void tick() { } public void breakBlocks() { - if (!net.neoforged.neoforge.event.EventHooks.getMobGriefingEvent(this.boss.level, this.boss)) { + if (!net.neoforged.neoforge.event.EventHooks.canEntityGrief(this.boss.level, this.boss)) { return; } Direction facing = boss.getDirection(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraRageGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraRageGoal.java index cebeaf427a..ef5a99df15 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraRageGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraRageGoal.java @@ -53,7 +53,7 @@ public void start() { chimera.rageTimer = 200; finished = false; ticks = 0; - Networking.sendToNearby(chimera.level, chimera, new PacketAnimEntity(chimera.getId(), WildenChimera.Animations.HOWL.ordinal())); + Networking.sendToNearbyClient(chimera.level, chimera, new PacketAnimEntity(chimera.getId(), WildenChimera.Animations.HOWL.ordinal())); chimera.resetCooldowns(); chimera.removeAllEffects(); chimera.addEffect(new MobEffectInstance(MobEffects.REGENERATION, 100 + 100 * chimera.getPhase(), 3)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraRamGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraRamGoal.java index 9599022190..fbfdfc34e8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraRamGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraRamGoal.java @@ -94,7 +94,7 @@ public void tick() { } public void breakBlocks() { - if (!net.neoforged.neoforge.event.EventHooks.getMobGriefingEvent(this.boss.level, this.boss)) { + if (!net.neoforged.neoforge.event.EventHooks.canEntityGrief(this.boss.level, this.boss)) { return; } Direction facing = boss.getDirection(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraSummonGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraSummonGoal.java index 64faf423d8..d07fc7f8bb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraSummonGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraSummonGoal.java @@ -56,7 +56,7 @@ public void tick() { this.mob.setHowling(true); ChimeraSummonEvent summonEvent = new ChimeraSummonEvent(40 + mob.getPhase() * 20, mob.getPhase(), mob.level, mob.blockPosition(), this.mob.getId()); EventQueue.getServerInstance().addEvent(summonEvent); - Networking.sendToNearby(mob.level, mob, new PacketTimedEvent(summonEvent)); + Networking.sendToNearbyClient(mob.level, mob, new PacketTimedEvent(summonEvent)); mob.level.playSound(null, mob.blockPosition(), SoundEvents.WOLF_HOWL, SoundSource.HOSTILE, 1.0f, 0.2f); } timeSummoning++; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/WildenSummon.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/WildenSummon.java index e851be9185..c4b755acd4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/WildenSummon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/WildenSummon.java @@ -1,10 +1,10 @@ package com.hollingsworth.arsnouveau.common.entity.goal.chimera; -import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import com.hollingsworth.arsnouveau.common.entity.SummonWolf; import com.hollingsworth.arsnouveau.common.entity.WildenHunter; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketAnimEntity; +import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.ai.goal.Goal; @@ -35,7 +35,7 @@ public boolean canContinueToUse() { @Override public void start() { super.start(); - Networking.sendToNearby(entity.level, entity, new PacketAnimEntity(entity.getId(), WildenHunter.Animations.HOWL.ordinal())); + Networking.sendToNearbyClient(entity.level, entity, new PacketAnimEntity(entity.getId(), WildenHunter.Animations.HOWL.ordinal())); entity.level.playSound(null, entity.blockPosition(), SoundEvents.WOLF_HOWL, SoundSource.HOSTILE, 1.0f, 0.3f); ticksSummoning = 0; this.entity.summonCooldown = 400; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/stalker/StartFlightGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/stalker/StartFlightGoal.java index 131e6c6a14..cee73fe125 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/stalker/StartFlightGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/stalker/StartFlightGoal.java @@ -20,7 +20,7 @@ public void start() { stalker.setLeapCooldown(400); stalker.push(0, 0.5, 0); stalker.setFlying(true); - Networking.sendToNearby(stalker.level, stalker, new PacketAnimEntity(stalker.getId(), WildenStalker.Animations.FLY.ordinal())); + Networking.sendToNearbyClient(stalker.level, stalker, new PacketAnimEntity(stalker.getId(), WildenStalker.Animations.FLY.ordinal())); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wealdwalker/CastGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wealdwalker/CastGoal.java index 1930182a98..0fe9eaac25 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wealdwalker/CastGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wealdwalker/CastGoal.java @@ -110,7 +110,7 @@ public void tick() { } if (this.seeTime >= 40 && !this.hasAnimated) { this.hasAnimated = true; - Networking.sendToNearby(mob.level, mob, new PacketAnimEntity(mob.getId(), animId)); + Networking.sendToNearbyClient(mob.level, mob, new PacketAnimEntity(mob.getId(), animId)); } if (this.hasAnimated) { animatedTicks++; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java index f6ad96bb72..65fdd19735 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java @@ -19,6 +19,7 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.items.IItemHandler; + import java.util.*; public class FindNextItemGoal extends ExtendedRangeGoal { @@ -54,7 +55,7 @@ public void start() { BlockEntity blockEntity = world.getBlockEntity(b); if(blockEntity == null) continue; - IItemHandler itemHandler = blockEntity.getCapability(Capabilities.ITEM_HANDLER).orElse(null); + IItemHandler itemHandler = world.getCapability(Capabilities.ItemHandler.BLOCK, b, null); if (itemHandler == null) continue; for(int i = 0; i < itemHandler.getSlots(); i++){ @@ -113,7 +114,7 @@ public void tick() { BlockEntity blockEntity = world.getBlockEntity(b); if(blockEntity == null) continue; - IItemHandler itemHandler = blockEntity.getCapability(Capabilities.ITEM_HANDLER).orElse(null); + IItemHandler itemHandler = world.getCapability(Capabilities.ItemHandler.BLOCK, b, null); if (itemHandler == null) continue; handlers.add(new StorageLecternTile.HandlerPos(b.immutable(), itemHandler)); @@ -137,7 +138,7 @@ public void tick() { spawnFlyingItem(tile.getLevel(), tile.getBlockPos(), handler.pos(), stackToGive, 1 + 3 * spawnDelay++); tile.giveItem(stackToGive); if (!anyFound) { - Networking.sendToNearby(world, wixie, new PacketAnimEntity(wixie.getId(), EntityWixie.Animations.SUMMON_ITEM.ordinal())); + Networking.sendToNearbyClient(world, wixie, new PacketAnimEntity(wixie.getId(), EntityWixie.Animations.SUMMON_ITEM.ordinal())); wixie.inventoryBackoff = 60; anyFound = true; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindPotionGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindPotionGoal.java index 5936d50b1c..3615197857 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindPotionGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindPotionGoal.java @@ -67,7 +67,7 @@ public void tick() { } jar.remove(300); tile.givePotion(); - Networking.sendToNearby(world, wixie, new PacketAnimEntity(wixie.getId(), EntityWixie.Animations.SUMMON_ITEM.ordinal())); + Networking.sendToNearbyClient(world, wixie, new PacketAnimEntity(wixie.getId(), EntityWixie.Animations.SUMMON_ITEM.ordinal())); int color = jar.getColor(); int r = (color >> 16) & 0xFF; int g = (color >> 8) & 0xFF; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/MovementHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/MovementHandler.java index d2d1564517..e4b6672299 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/MovementHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/MovementHandler.java @@ -11,8 +11,8 @@ import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.pathfinder.PathType; import net.minecraft.world.level.pathfinder.NodeEvaluator; +import net.minecraft.world.level.pathfinder.PathType; import net.minecraft.world.phys.shapes.VoxelShape; /** @@ -53,10 +53,10 @@ public void tick() { final PathNavigation pathnavigator = this.mob.getNavigation(); final NodeEvaluator nodeprocessor = pathnavigator.getNodeEvaluator(); - if (nodeprocessor.getBlockPathType(this.mob.level, + if (nodeprocessor.getPathType(this.mob,new BlockPos( Mth.floor(this.mob.getX() + (double) rot1), Mth.floor(this.mob.getY()), - Mth.floor(this.mob.getZ() + (double) rot2)) != PathType.WALKABLE) { + Mth.floor(this.mob.getZ() + (double) rot2))) != PathType.WALKABLE) { this.strafeForwards = 1.0F; this.strafeRight = 0.0F; speed = speedAtt; @@ -84,7 +84,7 @@ public void tick() { final BlockState blockstate = this.mob.level.getBlockState(blockpos); final Block block = blockstate.getBlock(); final VoxelShape voxelshape = blockstate.getCollisionShape(this.mob.level, blockpos); - if ((yDif > this.mob.getStepHeight() && xDif * xDif + zDif * zDif < (double) Math.max(1.0F, this.mob.getBbWidth())) + if ((yDif > this.mob.maxUpStep() && xDif * xDif + zDif * zDif < (double) Math.max(1.0F, this.mob.getBbWidth())) || (!voxelshape.isEmpty() && this.mob.getY() < voxelshape.max(Direction.Axis.Y) + (double) blockpos.getY() && !blockstate.is(BlockTags.DOORS) && !blockstate.is( BlockTags.FENCES) && !blockstate.is(BlockTags.FENCE_GATES)) && !block.isLadder(blockstate, this.mob.level, blockpos, this.mob)) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/PathingStuckHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/PathingStuckHandler.java index 44c2389c5c..97eb32952b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/PathingStuckHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/PathingStuckHandler.java @@ -7,7 +7,6 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.LadderBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.pathfinder.Node; @@ -279,7 +278,7 @@ private void tryUnstuck(final AbstractAdvancedPathNavigate navigator) { if (stuckLevel >= 3 && stuckLevel <= 5) { if (canPlaceLadders && rand.nextBoolean()) { delayToNextUnstuckAction = 200; - placeLadders(navigator); +// placeLadders(navigator); } else if (canBuildLeafBridges && rand.nextBoolean()) { delayToNextUnstuckAction = 100; placeLeaves(navigator); @@ -370,20 +369,20 @@ private void setAirIfPossible(final Level world, final BlockPos pos) { * * @param navigator navigator to use */ - private void placeLadders(final AbstractAdvancedPathNavigate navigator) { - final Level world = navigator.getOurEntity().level; - final Mob entity = navigator.getOurEntity(); - - BlockPos entityPos = BlockPos.containing(entity.position()); - - while (world.getBlockState(entityPos).getBlock() == Blocks.LADDER) { - entityPos = entityPos.above(); - } - - tryPlaceLadderAt(world, entityPos); - tryPlaceLadderAt(world, entityPos.above()); - tryPlaceLadderAt(world, entityPos.above(2)); - } +// private void placeLadders(final AbstractAdvancedPathNavigate navigator) { +// final Level world = navigator.getOurEntity().level; +// final Mob entity = navigator.getOurEntity(); +// +// BlockPos entityPos = BlockPos.containing(entity.position()); +// +// while (world.getBlockState(entityPos).getBlock() == Blocks.LADDER) { +// entityPos = entityPos.above(); +// } +// +// tryPlaceLadderAt(world, entityPos); +// tryPlaceLadderAt(world, entityPos.above()); +// tryPlaceLadderAt(world, entityPos.above(2)); +// } /** * Tries to place leaves @@ -438,24 +437,24 @@ private void breakBlocks(final AbstractAdvancedPathNavigate navigator) { breakBlocksAhead(world, BlockPos.containing(entity.position()), facing); } - /** - * Tries to place a ladder at the given position - * - * @param world world to use - * @param pos position to set - */ - private void tryPlaceLadderAt(final Level world, final BlockPos pos) { - final BlockState state = world.getBlockState(pos); - if (state.getBlock() != Blocks.LADDER && !state.canOcclude() && world.getFluidState(pos).isEmpty()) { - for (final Direction dir : HORIZONTAL_DIRS) { - final BlockState toPlace = Blocks.LADDER.defaultBlockState().setValue(LadderBlock.FACING, dir.getOpposite()); - if (world.getBlockState(pos.relative(dir)).isSolid() && Blocks.LADDER.canSurvive(toPlace, world, pos)) { - world.setBlockAndUpdate(pos, toPlace); - break; - } - } - } - } +// /** +// * Tries to place a ladder at the given position +// * +// * @param world world to use +// * @param pos position to set +// */ +// private void tryPlaceLadderAt(final Level world, final BlockPos pos) { +// final BlockState state = world.getBlockState(pos); +// if (state.getBlock() != Blocks.LADDER && !state.canOcclude() && world.getFluidState(pos).isEmpty()) { +// for (final Direction dir : HORIZONTAL_DIRS) { +// final BlockState toPlace = Blocks.LADDER.defaultBlockState().setValue(LadderBlock.FACING, dir.getOpposite()); +// if (world.getBlockState(pos.relative(dir)).isSolid() && Blocks.LADDER.canSurvive(toPlace, world, pos)) { +// world.setBlockAndUpdate(pos, toPlace); +// break; +// } +// } +// } +// } public PathingStuckHandler withBlockBreaks() { canBreakBlocks = true; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java index eb33105718..36dc27bfad 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java @@ -12,6 +12,7 @@ import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModPotions; +import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.DamageTypeTags; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.AttributeModifier; @@ -21,9 +22,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.event.ItemAttributeModifierEvent; -import java.util.UUID; @EventBusSubscriber(modid = ArsNouveau.MODID) public class ArsEvents { @@ -96,26 +95,30 @@ public static void modifyItemAttributes(ItemAttributeModifierEvent event) { } else if (itemStack.getItem() instanceof ShieldItem && !(event.getSlotType() == EquipmentSlot.OFFHAND)) return; - if (itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.get()) > 0) { - UUID uuid = getEnchantBoostBySlot(event.getSlotType()); - event.addModifier(PerkAttributes.MAX_MANA, new AttributeModifier(uuid, "max_mana_enchant", ServerConfig.MANA_BOOST_BONUS.get() * itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.get()), AttributeModifier.Operation.ADD_VALUE)); + if (itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT) > 0) { + ResourceLocation uuid = getEnchantBoostBySlot(event.getSlotType()); + event.addModifier(PerkAttributes.MAX_MANA, new AttributeModifier(uuid, ServerConfig.MANA_BOOST_BONUS.get() * itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT), AttributeModifier.Operation.ADD_VALUE)); } - if (itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.get()) > 0) { - UUID uuid = getEnchantBoostBySlot(event.getSlotType()); - event.addModifier(PerkAttributes.MANA_REGEN_BONUS, new AttributeModifier(uuid, "mana_regen_enchant", ServerConfig.MANA_REGEN_ENCHANT_BONUS.get() * itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.get()), AttributeModifier.Operation.ADD_VALUE)); + if (itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT) > 0) { + ResourceLocation uuid = getEnchantBoostBySlot(event.getSlotType()); + event.addModifier(PerkAttributes.MANA_REGEN_BONUS, new AttributeModifier(uuid, ServerConfig.MANA_REGEN_ENCHANT_BONUS.get() * itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT), AttributeModifier.Operation.ADD_VALUE)); } } } - public static UUID getEnchantBoostBySlot(EquipmentSlot type) { + public static ResourceLocation getEnchantBoostBySlot(EquipmentSlot type) { return switch (type) { - case CHEST -> UUID.fromString("fe9f03b8-b958-450c-a498-81b7ba72118b"); - case LEGS -> UUID.fromString("052583f6-12ec-427a-aae2-82d79128bbab"); - case FEET -> UUID.fromString("7ea8f56f-f865-4ac1-bc20-ffd5c8300464"); - case HEAD -> UUID.fromString("79a1b1cd-3aaa-4913-8991-5c8540632f6b"); - default -> UUID.fromString("f2239f81-4253-42a1-b596-234f42675484"); + case CHEST -> ArsEvents.CHEST; + case LEGS -> ArsEvents.LEGS; + case FEET -> ArsEvents.FEET; + case HEAD -> ArsEvents.HEAD; + default -> ArsEvents.CHEST; }; } + static final ResourceLocation CHEST = ArsNouveau.prefix("chest_enchant"); + static final ResourceLocation LEGS = ArsNouveau.prefix("legs_enchant"); + static final ResourceLocation FEET = ArsNouveau.prefix("feet_enchant"); + static final ResourceLocation HEAD = ArsNouveau.prefix("head_enchant"); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index 2750d606a6..367b219edd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -347,7 +347,6 @@ public static void dispelEvent(DispelEvent event) { public static void commandRegister(RegisterCommandsEvent event) { ResetCommand.register(event.getDispatcher()); DataDumpCommand.register(event.getDispatcher()); - PathCommand.register(event.getDispatcher()); ToggleLightCommand.register(event.getDispatcher()); AddTomeCommand.register(event.getDispatcher()); SummonAnimHeadCommand.register(event.getDispatcher()); @@ -438,7 +437,7 @@ public static void onPotionAdd(MobEffectEvent.Added event) { } if(holder.is(PotionEffectTags.TO_SYNC)){ - Networking.sendToNearby(target.level(), target, new PotionSyncPacket(target.getId(), effect, event.getEffectInstance().getDuration())); + Networking.sendToNearbyClient(target.level(), target, new PotionSyncPacket(target.getId(), effect, event.getEffectInstance().getDuration())); } } @@ -458,7 +457,7 @@ private static void syncPotionRemoval(MobEffectEvent event) { Holder holder = event.getEffectInstance().getEffect(); MobEffect effect = holder.value(); if(holder.is(PotionEffectTags.TO_SYNC)){ - Networking.sendToNearby(target.level(), target, new PotionSyncPacket(target.getId(), effect, -1)); + Networking.sendToNearbyClient(target.level(), target, new PotionSyncPacket(target.getId(), effect, -1)); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/LightEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/LightEvents.java index c975955fe7..b31dc72da3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/LightEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/LightEvents.java @@ -10,7 +10,6 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.tick.PlayerTickEvent; -import net.neoforged.neoforge.network.PacketDistributor; import java.util.ArrayList; import java.util.List; @@ -34,8 +33,7 @@ public static void onTick(PlayerTickEvent.Post e) { } } } - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> serverPlayer), - new PacketSyncLitEntities(litID)); + Networking.sendToPlayerClient(new PacketSyncLitEntities(litID), serverPlayer); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java index e53ba9e0b6..6fb956d5e6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java @@ -13,7 +13,6 @@ import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.event.tick.PlayerTickEvent; -import net.neoforged.neoforge.network.PacketDistributor; @EventBusSubscriber(modid = ArsNouveau.MODID) @@ -23,7 +22,7 @@ public class ManaCapEvents { @SubscribeEvent public static void playerOnTick(PlayerTickEvent.Pre e) { Player player = e.getEntity(); - if (player.getCommandSenderWorld().isClientSide || player.getCommandSenderWorld().getGameTime() % ServerConfig.REGEN_INTERVAL.get() != 0) + if (!(player instanceof ServerPlayer serverPlayer) || player.getCommandSenderWorld().getGameTime() % ServerConfig.REGEN_INTERVAL.get() != 0) return; IManaCap mana = CapabilityRegistry.getMana(player).orElse(null); @@ -34,13 +33,13 @@ public static void playerOnTick(PlayerTickEvent.Pre e) { if (mana.getCurrentMana() != mana.getMaxMana() || shouldIgnoreMax) { double regenPerSecond = ManaUtil.getManaRegen(player) / Math.max(1, ((int) MEAN_TPS / ServerConfig.REGEN_INTERVAL.get())); mana.addMana(regenPerSecond); - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new PacketUpdateMana(mana.getCurrentMana(), mana.getMaxMana(), mana.getGlyphBonus(), mana.getBookTier())); + Networking.sendToPlayerClient(new PacketUpdateMana(mana.getCurrentMana(), mana.getMaxMana(), mana.getGlyphBonus(), mana.getBookTier()), serverPlayer); } ManaUtil.Mana maxmana = ManaUtil.calcMaxMana(player); int max = maxmana.getRealMax(); if (mana.getMaxMana() != max || shouldIgnoreMax) { mana.setMaxMana(max); - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new PacketUpdateMana(mana.getCurrentMana(), mana.getMaxMana(), mana.getGlyphBonus(), mana.getBookTier(), maxmana.Reserve())); + Networking.sendToPlayerClient(new PacketUpdateMana(mana.getCurrentMana(), mana.getMaxMana(), mana.getGlyphBonus(), mana.getBookTier(), maxmana.Reserve()), serverPlayer); } } @@ -51,7 +50,7 @@ public static void playerRespawn(PlayerEvent.PlayerRespawnEvent e) { @SubscribeEvent public static void playerClone(PlayerEvent.Clone e) { - if (e.getOriginal().level.isClientSide) + if (!(e.getOriginal() instanceof ServerPlayer serverPlayer)) return; var newMana = CapabilityRegistry.getMana(e.getEntity()).orElse(null); @@ -60,7 +59,7 @@ public static void playerClone(PlayerEvent.Clone e) { newMana.setMaxMana(origMana.getMaxMana()); newMana.setGlyphBonus(origMana.getGlyphBonus()); newMana.setBookTier(origMana.getBookTier()); - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) e.getEntity()), new PacketUpdateMana(newMana.getCurrentMana(), newMana.getMaxMana(), newMana.getGlyphBonus(), newMana.getBookTier())); + Networking.sendToPlayerClient(new PacketUpdateMana(newMana.getCurrentMana(), newMana.getMaxMana(), newMana.getGlyphBonus(), newMana.getBookTier()), serverPlayer); } } @@ -75,14 +74,14 @@ public static void playerChangeDimension(PlayerEvent.PlayerChangedDimensionEvent } public static void syncPlayerEvent(Player playerEntity) { - if (playerEntity instanceof ServerPlayer) { + if (playerEntity instanceof ServerPlayer serverPlayer) { var mana = CapabilityRegistry.getMana(playerEntity).orElse(null); if (mana != null) { var manaCalc = ManaUtil.calcMaxMana(playerEntity); mana.setMaxMana(manaCalc.getRealMax()); mana.setGlyphBonus(mana.getGlyphBonus()); mana.setBookTier(mana.getBookTier()); - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) playerEntity), new PacketUpdateMana(mana.getCurrentMana(), mana.getMaxMana(), mana.getGlyphBonus(), mana.getBookTier(), manaCalc.Reserve())); + Networking.sendToPlayerClient(new PacketUpdateMana(mana.getCurrentMana(), mana.getMaxMana(), mana.getGlyphBonus(), mana.getBookTier(), manaCalc.Reserve()), serverPlayer); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java index 01ba45fb70..59854496c0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java @@ -60,6 +60,6 @@ public static void playerAttackEntity(AttackEntityEvent e) { @SubscribeEvent public static void leftClickAir(PlayerInteractEvent.LeftClickEmpty e) { if (e.getItemStack().getEnchantmentLevel(EnchantmentRegistry.REACTIVE_ENCHANTMENT) > 0) - Networking.INSTANCE.sendToServer(new PacketReactiveSpell()); + Networking.sendToServer(new PacketReactiveSpell()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ScryEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ScryEvents.java index d75a96592c..83f48f6672 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ScryEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ScryEvents.java @@ -16,6 +16,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.RandomSource; @@ -24,12 +25,10 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.LogicalSide; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.RenderLevelStageEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent; import net.neoforged.neoforge.event.tick.PlayerTickEvent; -import net.neoforged.neoforge.network.PacketDistributor; import java.util.ArrayList; import java.util.List; @@ -38,15 +37,15 @@ public class ScryEvents { @SubscribeEvent public static void playerLoginEvent(final PlayerLoggedInEvent event) { - if (!event.getEntity().level.isClientSide && event.getEntity().hasEffect(ModPotions.SCRYING_EFFECT.get())) { + if (!event.getEntity().level.isClientSide && event.getEntity().hasEffect(ModPotions.SCRYING_EFFECT)) { CompoundTag tag = event.getEntity().getPersistentData().getCompound(Player.PERSISTED_NBT_TAG); - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) event.getEntity()), new PacketGetPersistentData(tag)); + Networking.sendToPlayerClient((CustomPacketPayload) new PacketGetPersistentData(tag), (ServerPlayer) event.getEntity()); } } @SubscribeEvent - public static void playerTickEvent(final PlayerTickEvent event) { - if (event.side == LogicalSide.CLIENT && event.phase == TickEvent.Phase.END && event.player.getEffect(ModPotions.SCRYING_EFFECT.get()) != null && ClientInfo.ticksInGame % 30 == 0) { + public static void playerTickEvent(final PlayerTickEvent.Post event) { + if (event.getEntity().level.isClientSide && event.getEntity().getEffect(ModPotions.SCRYING_EFFECT) != null && ClientInfo.ticksInGame % 30 == 0) { List scryingPos = new ArrayList<>(); CompoundTag tag = ClientInfo.persistentData; @@ -55,7 +54,7 @@ public static void playerTickEvent(final PlayerTickEvent event) { IScryer scryer = ArsNouveauAPI.getInstance().getScryer(ResourceLocation.tryParse(tag.getCompound("an_scryer").getString("id"))).fromTag(tag.getCompound("an_scryer")); if (scryer == null) return; - Player playerEntity = event.player; + Player playerEntity = event.getEntity(); Level world = playerEntity.level; Vec3i scrySize = scryer.getScryingSize(); for (BlockPos p : BlockPos.withinManhattan(playerEntity.blockPosition(), scrySize.getX(), scrySize.getY(), scrySize.getZ())) { @@ -108,7 +107,7 @@ public static void renderScry(final RenderLevelStageEvent event) { if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_WEATHER) return; ClientLevel world = Minecraft.getInstance().level; final Player playerEntity = Minecraft.getInstance().player; - if (playerEntity == null || playerEntity.getEffect(ModPotions.SCRYING_EFFECT.get()) == null) + if (playerEntity == null || playerEntity.getEffect(ModPotions.SCRYING_EFFECT) == null) return; Vec3 vector3d = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/timed/BuildPortalEvent.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/timed/BuildPortalEvent.java index 9581f79fba..89d578b5c3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/timed/BuildPortalEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/timed/BuildPortalEvent.java @@ -90,7 +90,7 @@ public void tick(boolean serverSide) { tile.gameTime = level.getGameTime(); tile.updateBlock(); } - level.playSound(null, pos, BlockRegistry.getBlock(LibBlockNames.SOURCESTONE).getSoundType(level.getBlockState(pos)).getPlaceSound(), SoundSource.BLOCKS, 1.0F, 1.0F); + level.playSound(null, pos, BlockRegistry.getBlock(LibBlockNames.SOURCESTONE).defaultBlockState().getSoundType().getPlaceSound(), SoundSource.BLOCKS, 1.0F, 1.0F); ParticleUtil.spawnTouchPacket(level, pos, ParticleColor.makeRandomColor(255, 255, 255, level.random)); placedBlocks.add(pos); return; @@ -105,7 +105,7 @@ public void tick(boolean serverSide) { for(BlockPos pos : portalPos) { if (level.getBlockState(pos).canBeReplaced()) { level.setBlock(pos, BlockRegistry.PORTAL_BLOCK.defaultBlockState().setValue(PortalBlock.AXIS, direction.getAxis()), 2); - level.playSound(null, pos, BlockRegistry.PORTAL_BLOCK.get().getSoundType(level.getBlockState(pos)).getPlaceSound(), SoundSource.BLOCKS, 1.0F, 1.0F); + level.playSound(null, pos, BlockRegistry.PORTAL_BLOCK.get().defaultBlockState().getSoundType().getPlaceSound(), SoundSource.BLOCKS, 1.0F, 1.0F); placedBlocks.add(pos); } else { destroyPortal = true; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java index 2185fa2f1e..8d81d63a25 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java @@ -5,7 +5,6 @@ import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenuSlot; -import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.client.registry.ModKeyBindings; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketConsumePotion; @@ -60,7 +59,7 @@ public void onRadialKeyPressed(ItemStack stack, Player player) { return; } Minecraft.getInstance().setScreen(new GuiRadialMenu<>(new RadialMenu<>((int index) -> { - Networking.INSTANCE.sendToServer(new PacketConsumePotion(slots.get(index).primarySlotIcon().slot)); + Networking.sendToServer(new PacketConsumePotion(slots.get(index).primarySlotIcon().slot)); }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtil.drawItemAsIcon(slotData.stack, posestack, positionx, posy, size, transparent), 3))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java index 84225d9c26..8ab2a59530 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java @@ -6,7 +6,6 @@ import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenuSlot; -import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.client.registry.ModKeyBindings; import com.hollingsworth.arsnouveau.client.renderer.item.FlaskCannonRenderer; import com.hollingsworth.arsnouveau.client.renderer.tile.GenericModel; @@ -27,7 +26,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.ThrownPotion; import net.minecraft.world.item.*; - import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.neoforged.api.distmarker.Dist; @@ -144,7 +142,7 @@ public void onRadialKeyPressed(ItemStack stack, Player player) { return; } Minecraft.getInstance().setScreen(new GuiRadialMenu<>(new RadialMenu<>((int index) -> { - Networking.INSTANCE.sendToServer(new PacketSetLauncher(slots.get(index).primarySlotIcon().getSlot())); + Networking.sendToServer(new PacketSetLauncher(slots.get(index).primarySlotIcon().getSlot())); }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtil.drawItemAsIcon(slotData.getStack(), posestack, positionx, posy, size, transparent), 3))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java index caab8864cf..b72ffe2a89 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java @@ -181,7 +181,7 @@ public RadialMenu getRadialMenuProviderForSpellpart(ItemStack return new RadialMenu<>((int slot) -> { BookCaster caster = new BookCaster(itemStack); caster.setCurrentSlot(slot); - Networking.INSTANCE.sendToServer(new PacketSetBookMode(itemStack.getTag())); + Networking.sendToServer(new PacketSetBookMode(itemStack.getTag())); }, getRadialMenuSlotsForSpellpart(itemStack), RenderUtils::drawSpellPart, diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java index 3dfd80067a..27954e99c5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java @@ -78,7 +78,7 @@ public InteractionResultHolder use(Level world, Player player, Intera Vec2 rotation = data.getRotation(); player.setXRot(rotation.x); player.setYRot(rotation.y); - Networking.sendToNearby(world, player, new PacketWarpPosition(player.getId(),pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, rotation.x, rotation.y)); + Networking.sendToNearbyClient(world, player, new PacketWarpPosition(player.getId(),pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, rotation.x, rotation.y)); serverLevel.sendParticles(ParticleTypes.PORTAL, pos.getX(), pos.getY() + 1.0, pos.getZ(), 10, (world.random.nextDouble() - 0.5D) * 2.0D, -world.random.nextDouble(), (world.random.nextDouble() - 0.5D) * 2.0D, 0.1f); world.playSound(null, pos, SoundEvents.ILLUSIONER_CAST_SPELL, SoundSource.NEUTRAL, 1.0f, 1.0f); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/PotionEffectTags.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/PotionEffectTags.java index dcc145b6df..60fff6d619 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/PotionEffectTags.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/PotionEffectTags.java @@ -4,7 +4,6 @@ import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.level.Level; @@ -26,7 +25,7 @@ public static ArrayList getEffects(Level level, TagKey tag if (effects.isEmpty()) return null; ArrayList effectList = new ArrayList<>(); for (Holder mobEffectHolder : effects.get()) { - effectList.add(mobEffectHolder.get()); + effectList.add(mobEffectHolder.value()); } return effectList; }); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ClientChunkCacheMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ClientChunkCacheMixin.java index 92ca85ee58..6ffec9e77c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ClientChunkCacheMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ClientChunkCacheMixin.java @@ -10,8 +10,8 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.game.ClientboundLevelChunkPacketData; import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.status.ChunkStatus; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.level.ChunkEvent; import org.spongepowered.asm.mixin.Final; @@ -63,7 +63,9 @@ public void onUpdateViewRadius(int viewDistance, CallbackInfo ci) { * Handles chunks that are dropped in range of the camera storage */ @Inject(method = "drop", at = @At(value = "HEAD")) - public void onDrop(int x, int z, CallbackInfo ci) { + public void onDrop(ChunkPos chunkPos, CallbackInfo ci) { + int x = chunkPos.x; + int z = chunkPos.z; ClientChunkCache.Storage cameraStorage = CameraController.getCameraStorage(); if (cameraStorage.inRange(x, z)) { @@ -106,7 +108,7 @@ private void onReplace(int x, int z, FriendlyByteBuf buffer, CompoundTag chunkTa /** * If chunks in range of a camera storage need to be acquired, ask the camera storage about these chunks */ - @Inject(method = "getChunk(IILnet/minecraft/world/level/chunk/ChunkStatus;Z)Lnet/minecraft/world/level/chunk/LevelChunk;", at = @At("TAIL"), cancellable = true) + @Inject(method = "getChunk(IILnet/minecraft/world/level/chunk/status/ChunkStatus;Z)Lnet/minecraft/world/level/chunk/ChunkAccess;", at = @At("TAIL"), cancellable = true) private void onGetChunk(int x, int z, ChunkStatus requiredStatus, boolean load, CallbackInfoReturnable callback) { if (CameraUtil.isPlayerMountedOnCamera(Minecraft.getInstance().player) && !storage.inRange(x, z) && CameraController.getCameraStorage().inRange(x, z)) { LevelChunk chunk = CameraController.getCameraStorage().getChunk(CameraController.getCameraStorage().getIndex(x, z)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/jar/DispenserMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/jar/DispenserMixin.java index 9472cd58a1..d9d6a3fd49 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/jar/DispenserMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/jar/DispenserMixin.java @@ -1,50 +1,32 @@ package com.hollingsworth.arsnouveau.common.mixin.jar; -import com.hollingsworth.arsnouveau.api.ANFakePlayer; -import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; -import net.minecraft.core.BlockPos; -import net.minecraft.core.BlockSourceImpl; -import net.minecraft.core.dispenser.DispenseItemBehavior; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.ShearsItem; import net.minecraft.world.level.block.DispenserBlock; -import net.minecraft.world.level.block.entity.DispenserBlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(DispenserBlock.class) public abstract class DispenserMixin { - - - @Shadow - protected abstract DispenseItemBehavior getDispenseMethod(ItemStack p_52667_); - - @Inject( - method = "dispenseFrom", - at = @At( - value = "INVOKE_ASSIGN", - target = "Lnet/minecraft/world/level/block/DispenserBlock;getDispenseMethod(Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/core/dispenser/DispenseItemBehavior;" - ), - locals = LocalCapture.CAPTURE_FAILHARD, - cancellable = true - ) - public void onDispenseFromInject(ServerLevel level, BlockPos pos, CallbackInfo ci, BlockSourceImpl source, DispenserBlockEntity dispenser, int slot, ItemStack stack) { - BlockState inFront = level.getBlockState(pos.relative(source.getBlockState().getValue(DispenserBlock.FACING))); - if (inFront.is(BlockRegistry.MOB_JAR.get()) && stack.getItem() instanceof ShearsItem) { - BlockPos relativePos = pos.relative(source.getBlockState().getValue(DispenserBlock.FACING)); - ANFakePlayer fakePlayer = ANFakePlayer.getPlayer(level); - fakePlayer.setItemInHand(InteractionHand.MAIN_HAND, stack); - BlockRegistry.MOB_JAR.get().use(inFront, level, relativePos, fakePlayer, InteractionHand.MAIN_HAND, new BlockHitResult(new Vec3(relativePos.getX(), relativePos.getY(), relativePos.getZ()), source.getBlockState().getValue(DispenserBlock.FACING), relativePos, false)); - dispenser.setItem(slot, stack); - ci.cancel(); - } - } +// todo: reenable jar dispenser mixin +// +// @Shadow +// protected abstract DispenseItemBehavior getDispenseMethod(Level pLevel, ItemStack p_52667_); +// +// @Inject( +// method = "dispenseFrom", +// at = @At( +// value = "INVOKE_ASSIGN", +// target = "Lnet/minecraft/world/level/block/DispenserBlock;getDispenseMethod(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/core/dispenser/DispenseItemBehavior;" +// ), +// locals = LocalCapture.CAPTURE_FAILHARD, +// cancellable = true +// ) +// public void onDispenseFromInject(ServerLevel level, BlockState state, BlockPos pos, CallbackInfo ci) { +// BlockState inFront = level.getBlockState(pos.relative(state.getValue(DispenserBlock.FACING))); +// if (inFront.is(BlockRegistry.MOB_JAR.get()) && stack.getItem() instanceof ShearsItem) { +// BlockPos relativePos = pos.relative(source.getBlockState().getValue(DispenserBlock.FACING)); +// ANFakePlayer fakePlayer = ANFakePlayer.getPlayer(level); +// fakePlayer.setItemInHand(InteractionHand.MAIN_HAND, stack); +// BlockRegistry.MOB_JAR.get().use(inFront, level, relativePos, fakePlayer, InteractionHand.MAIN_HAND, new BlockHitResult(new Vec3(relativePos.getX(), relativePos.getY(), relativePos.getZ()), source.getBlockState().getValue(DispenserBlock.FACING), relativePos, false)); +// dispenser.setItem(slot, stack); +// ci.cancel(); +// } +// } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/AbstractPacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/AbstractPacket.java index 3b2aba3c4a..0f5b31d791 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/AbstractPacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/AbstractPacket.java @@ -1,16 +1,20 @@ package com.hollingsworth.arsnouveau.common.network; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; +import net.minecraft.client.Minecraft; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; -public abstract class AbstractPacket { - - public AbstractPacket(FriendlyByteBuf buf) {} +public abstract class AbstractPacket implements CustomPacketPayload { public AbstractPacket(){} - public abstract void toBytes(FriendlyByteBuf buf); + public abstract void toBytes(RegistryFriendlyByteBuf buf); + + public void onClientReceived(Minecraft minecraft, Player player){} + + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player){} - public abstract void handle(Supplier ctx); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/ChangeBiomePacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/ChangeBiomePacket.java index 3a9ac95511..0b296e3849 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/ChangeBiomePacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/ChangeBiomePacket.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; @@ -8,18 +9,22 @@ import net.minecraft.core.QuartPos; import net.minecraft.core.SectionPos; 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.util.Mth; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.chunk.PalettedContainer; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; -public class ChangeBiomePacket { +public class ChangeBiomePacket extends AbstractPacket { + public static final Type TYPE = new Type<>(ArsNouveau.prefix("change_biome")); + public static final StreamCodec CODEC = StreamCodec.ofMember(ChangeBiomePacket::toBytes, ChangeBiomePacket::new); + private final BlockPos pos; private final ResourceKey biomeId; @@ -28,50 +33,45 @@ public ChangeBiomePacket(BlockPos pos, ResourceKey id) { this.biomeId = id; } - public ChangeBiomePacket(FriendlyByteBuf buf) { + public ChangeBiomePacket(RegistryFriendlyByteBuf buf) { this.pos = new BlockPos(buf.readInt(), 0, buf.readInt()); this.biomeId = ResourceKey.create(Registries.BIOME, buf.readResourceLocation()); } - public void encode(FriendlyByteBuf buf) { + @Override + public Type type() { + return TYPE; + } + + @Override + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeInt(this.pos.getX()); buf.writeInt(this.pos.getZ()); buf.writeResourceLocation(this.biomeId.location()); } - public static class Handler { - - @SuppressWarnings("Convert2Lambda") - public static boolean onMessage(ChangeBiomePacket message, Supplier ctx) { - ctx.get().enqueueWork(new Runnable() { - @Override - public void run() { - ClientLevel world = Minecraft.getInstance().level; - LevelChunk chunkAt = (LevelChunk) world.getChunk(message.pos); - - Holder biome = world.registryAccess().registryOrThrow(Registries.BIOME).getHolderOrThrow(message.biomeId); + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + ClientLevel world = minecraft.level; + LevelChunk chunkAt = (LevelChunk) world.getChunk(pos); - int minY = QuartPos.fromBlock(world.getMinBuildHeight()); - int maxY = minY + QuartPos.fromBlock(world.getHeight()) - 1; + Holder biome = world.registryAccess().registryOrThrow(Registries.BIOME).getHolderOrThrow(biomeId); - int x = QuartPos.fromBlock(message.pos.getX()); - int z = QuartPos.fromBlock(message.pos.getZ()); + int minY = QuartPos.fromBlock(world.getMinBuildHeight()); + int maxY = minY + QuartPos.fromBlock(world.getHeight()) - 1; - for (LevelChunkSection section : chunkAt.getSections()) { - for (int sy = 0; sy < 16; sy += 4) { - int y = Mth.clamp(QuartPos.fromBlock(chunkAt.getMinSection() + sy), minY, maxY); - if (section.getBiomes() instanceof PalettedContainer> container) - container.set(x & 3, y & 3, z & 3, biome); - SectionPos pos = SectionPos.of(message.pos.getX() >> 4, (chunkAt.getMinSection() >> 4) + sy, message.pos.getZ() >> 4); - world.setSectionDirtyWithNeighbors(pos.x(), pos.y(), pos.z()); - } - } - world.onChunkLoaded(new ChunkPos(message.pos)); - } - }); + int x = QuartPos.fromBlock(pos.getX()); + int z = QuartPos.fromBlock(pos.getZ()); - ctx.get().setPacketHandled(true); - return true; + for (LevelChunkSection section : chunkAt.getSections()) { + for (int sy = 0; sy < 16; sy += 4) { + int y = Mth.clamp(QuartPos.fromBlock(chunkAt.getMinSection() + sy), minY, maxY); + if (section.getBiomes() instanceof PalettedContainer> container) + container.set(x & 3, y & 3, z & 3, biome); + SectionPos pos = SectionPos.of(this.pos.getX() >> 4, (chunkAt.getMinSection() >> 4) + sy, this.pos.getZ() >> 4); + world.setSectionDirtyWithNeighbors(pos.x(), pos.y(), pos.z()); + } } + world.onChunkLoaded(new ChunkPos(pos)); } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/ClientToServerStoragePacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/ClientToServerStoragePacket.java index 802ee365ed..463500d2f5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/ClientToServerStoragePacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/ClientToServerStoragePacket.java @@ -1,42 +1,42 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.container.StorageTerminalMenu; 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.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; -import net.neoforged.neoforge.network.NetworkDirection; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; -public class ClientToServerStoragePacket { +public class ClientToServerStoragePacket extends AbstractPacket{ + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("storage_packet")); + public static final StreamCodec CODEC = StreamCodec.ofMember(ClientToServerStoragePacket::toBytes, ClientToServerStoragePacket::new); + public CompoundTag tag; public ClientToServerStoragePacket(CompoundTag tag) { this.tag = tag; } - public ClientToServerStoragePacket(FriendlyByteBuf pb) { - tag = pb.readAnySizeNbt(); + public ClientToServerStoragePacket(RegistryFriendlyByteBuf pb) { + tag = pb.readNbt(); } - public void toBytes(FriendlyByteBuf pb) { + public void toBytes(RegistryFriendlyByteBuf pb) { pb.writeNbt(tag); } - public static class Handler { - - @SuppressWarnings("Convert2Lambda") - public static boolean onMessage(ClientToServerStoragePacket message, Supplier ctx) { - if (ctx.get().getDirection() == NetworkDirection.PLAY_TO_SERVER) { - ctx.get().enqueueWork(() -> { - ServerPlayer sender = ctx.get().getSender(); - if (sender.containerMenu instanceof StorageTerminalMenu terminalScreen){ - terminalScreen.receive(message.tag); - } - }); - } - ctx.get().setPacketHandled(true); - return true; + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer sender) { + if (sender.containerMenu instanceof StorageTerminalMenu terminalScreen){ + terminalScreen.receive(tag); } } + + @Override + public Type type() { + return TYPE; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/HighlightAreaPacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/HighlightAreaPacket.java index 25ff09023f..e040223ed5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/HighlightAreaPacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/HighlightAreaPacket.java @@ -1,14 +1,21 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.ClientInfo; import com.hollingsworth.arsnouveau.client.particle.ColorPos; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; +import net.minecraft.client.Minecraft; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; + import java.util.ArrayList; import java.util.List; -import java.util.function.Supplier; -public class HighlightAreaPacket { +public class HighlightAreaPacket extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("highlight_area")); + public static final StreamCodec CODEC = StreamCodec.ofMember(HighlightAreaPacket::toBytes, HighlightAreaPacket::decode); + public List colorPos; public int ticks; @@ -17,7 +24,7 @@ public HighlightAreaPacket(List colorPos, int ticks){ this.ticks = ticks; } - public static HighlightAreaPacket decode(FriendlyByteBuf buf) { + public static HighlightAreaPacket decode(RegistryFriendlyByteBuf buf) { HighlightAreaPacket packet = new HighlightAreaPacket(new ArrayList<>(), 0); int size = buf.readInt(); for(int i = 0; i < size; i++){ @@ -27,30 +34,22 @@ public static HighlightAreaPacket decode(FriendlyByteBuf buf) { return packet; } - public static void encode(HighlightAreaPacket msg, FriendlyByteBuf buf) { - buf.writeInt(msg.colorPos.size()); - for(ColorPos pos : msg.colorPos){ + @Override + public void toBytes(RegistryFriendlyByteBuf buf) { + buf.writeInt(colorPos.size()); + for(ColorPos pos : colorPos){ buf.writeNbt(pos.toTag()); } - buf.writeInt(msg.ticks); + buf.writeInt(ticks); } - public static class Handler { - public static void handle(final HighlightAreaPacket m, final Supplier ctx) { - if (ctx.get().getDirection().getReceptionSide().isServer()) { - ctx.get().setPacketHandled(true); - return; - } - - ctx.get().enqueueWork(new Runnable() { - // Use anon - lambda causes classloading issues - @Override - public void run() { - ClientInfo.highlightPosition(m.colorPos, m.ticks); - } - }); - ctx.get().setPacketHandled(true); + @Override + public Type type() { + return TYPE; + } - } + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + ClientInfo.highlightPosition(colorPos, ticks); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java index 8c934f4be1..a0ef46b043 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java @@ -1,19 +1,21 @@ package com.hollingsworth.arsnouveau.common.network; -import com.hollingsworth.arsnouveau.ArsNouveau; +import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; - +import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.network.PacketDistributor; -import java.util.Optional; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import net.neoforged.neoforge.network.registration.PayloadRegistrar; public class Networking { - public static SimpleChannel INSTANCE; private static int ID = 0; @@ -21,225 +23,98 @@ public static int nextID() { return ID++; } - public static void registerMessages() { - INSTANCE = NetworkRegistry.newSimpleChannel(ArsNouveau.prefix( "network"), () -> "1.0", s -> true, s -> true); - - INSTANCE.registerMessage(nextID(), - PacketOpenSpellBook.class, - PacketOpenSpellBook::toBytes, - PacketOpenSpellBook::new, - PacketOpenSpellBook::handle); - INSTANCE.registerMessage(nextID(), - PacketUpdateCaster.class, - PacketUpdateCaster::toBytes, - PacketUpdateCaster::new, - PacketUpdateCaster::handle); - - INSTANCE.registerMessage(nextID(), - PacketUpdateBookGUI.class, - PacketUpdateBookGUI::toBytes, - PacketUpdateBookGUI::new, - PacketUpdateBookGUI::handle); - INSTANCE.registerMessage(nextID(), - PacketUpdateMana.class, - PacketUpdateMana::toBytes, - PacketUpdateMana::new, - PacketUpdateMana::handle); - INSTANCE.registerMessage(nextID(), - PacketSetBookMode.class, - PacketSetBookMode::toBytes, - PacketSetBookMode::new, - PacketSetBookMode::handle); - - INSTANCE.registerMessage(nextID(), - PacketANEffect.class, - PacketANEffect::encode, - PacketANEffect::decode, - PacketANEffect.Handler::handle); - - INSTANCE.registerMessage(nextID(), - PacketReactiveSpell.class, - PacketReactiveSpell::toBytes, - PacketReactiveSpell::new, - PacketReactiveSpell::handle); - INSTANCE.registerMessage(nextID(), - PacketWarpPosition.class, - PacketWarpPosition::encode, - PacketWarpPosition::decode, - PacketWarpPosition.Handler::handle); - INSTANCE.registerMessage(nextID(), - PacketUpdateSpellColors.class, - PacketUpdateSpellColors::toBytes, - PacketUpdateSpellColors::new, - PacketUpdateSpellColors::handle); - INSTANCE.registerMessage(nextID(), - PacketOneShotAnimation.class, - PacketOneShotAnimation::encode, - PacketOneShotAnimation::decode, - PacketOneShotAnimation.Handler::handle); - - INSTANCE.registerMessage(nextID(), - PacketAnimEntity.class, - PacketAnimEntity::encode, - PacketAnimEntity::decode, - PacketAnimEntity.Handler::handle); - - - INSTANCE.registerMessage(nextID(), - PacketGetPersistentData.class, - PacketGetPersistentData::toBytes, - PacketGetPersistentData::new, - PacketGetPersistentData::handle); - - INSTANCE.registerMessage(nextID(), - PacketNoSpamChatMessage.class, - PacketNoSpamChatMessage::toBytes, - PacketNoSpamChatMessage::new, - PacketNoSpamChatMessage::handle, - Optional.of(NetworkDirection.PLAY_TO_CLIENT)); - - INSTANCE.registerMessage(nextID(), - PacketUpdateFlight.class, - PacketUpdateFlight::toBytes, - PacketUpdateFlight::new, - PacketUpdateFlight::handle); - INSTANCE.registerMessage(nextID(), - PacketClientDelayEffect.class, - PacketClientDelayEffect::toBytes, - PacketClientDelayEffect::new, - PacketClientDelayEffect::handle); - - INSTANCE.registerMessage(nextID(), - PacketTimedEvent.class, - PacketTimedEvent::toBytes, - PacketTimedEvent::new, - PacketTimedEvent::handle); - INSTANCE.registerMessage(nextID(), - PacketSummonFamiliar.class, - PacketSummonFamiliar::toBytes, - PacketSummonFamiliar::new, - PacketSummonFamiliar::handle); - INSTANCE.registerMessage(nextID(), - PacketSyncPlayerCap.class, - PacketSyncPlayerCap::toBytes, - PacketSyncPlayerCap::new, - PacketSyncPlayerCap::handle); - - INSTANCE.registerMessage(nextID(), - PacketTogglePathing.class, - PacketTogglePathing::toBytes, - PacketTogglePathing::new, - PacketTogglePathing::handle); + public static void register(final RegisterPayloadHandlersEvent event) { + // Sets the current network version + final PayloadRegistrar reg = event.registrar("1"); + reg.playToServer(PacketOpenSpellBook.TYPE, PacketOpenSpellBook.CODEC, Networking::handle); + reg.playToClient(ChangeBiomePacket.TYPE, ChangeBiomePacket.CODEC, Networking::handle); + reg.playToServer(PacketSetLauncher.TYPE, PacketSetLauncher.CODEC, Networking::handle); + reg.playToServer(ClientToServerStoragePacket.TYPE, ClientToServerStoragePacket.CODEC, Networking::handle); + reg.playToClient(HighlightAreaPacket.TYPE, HighlightAreaPacket.CODEC, Networking::handle); + reg.playToClient(NotEnoughManaPacket.TYPE, NotEnoughManaPacket.CODEC, Networking::handle); + reg.playToClient(PacketAddFadingLight.TYPE, PacketAddFadingLight.CODEC, Networking::handle); + reg.playToClient(PacketANEffect.TYPE, PacketANEffect.CODEC, Networking::handle); + reg.playToClient(PacketClientDelayEffect.TYPE, PacketClientDelayEffect.CODEC, Networking::handle); + reg.playToClient(PacketClientRewindEffect.TYPE, PacketClientRewindEffect.CODEC, Networking::handle); + reg.playToServer(PacketConsumePotion.TYPE, PacketConsumePotion.CODEC, Networking::handle); + reg.playToServer(PacketDismountCamera.TYPE, PacketDismountCamera.CODEC, Networking::handle); + reg.playToServer(PacketDispelFamiliars.TYPE, PacketDispelFamiliars.CODEC, Networking::handle); + reg.playToServer(PacketAnimEntity.TYPE, PacketAnimEntity.CODEC, Networking::handle); + reg.playToClient(PacketGetPersistentData.TYPE, PacketGetPersistentData.CODEC, Networking::handle); + reg.playToServer(PacketHotkeyPressed.TYPE, PacketHotkeyPressed.CODEC, Networking::handle); + reg.playToClient(PacketJoinedServer.TYPE, PacketJoinedServer.CODEC, Networking::handle); + reg.playToServer(PacketGenericClientMessage.TYPE, PacketGenericClientMessage.CODEC, Networking::handle); + reg.playToServer(PacketMountCamera.TYPE, PacketMountCamera.CODEC, Networking::handle); + reg.playToClient(PacketNoSpamChatMessage.TYPE, PacketNoSpamChatMessage.CODEC, Networking::handle); + reg.playToClient(PacketOneShotAnimation.TYPE, PacketOneShotAnimation.CODEC, Networking::handle); + reg.playToClient(PacketOpenGlyphCraft.TYPE, PacketOpenGlyphCraft.CODEC, Networking::handle); + reg.playToServer(PacketQuickCast.TYPE, PacketQuickCast.CODEC, Networking::handle); + reg.playToServer(PacketReactiveSpell.TYPE, PacketReactiveSpell.CODEC, Networking::handle); + reg.playToServer(PacketSetBookMode.TYPE, PacketSetBookMode.CODEC, Networking::handle); + reg.playToClient(PacketSetCameraView.TYPE, PacketSetCameraView.CODEC, Networking::handle); + reg.playToServer(PacketSetScribeRecipe.TYPE, PacketSetScribeRecipe.CODEC, Networking::handle); + reg.playToServer(PacketSetSound.TYPE, PacketSetSound.CODEC, Networking::handle); + reg.playToServer(PacketSummonFamiliar.TYPE, PacketSummonFamiliar.CODEC, Networking::handle); + reg.playToServer(PacketSummonLily.TYPE, PacketSummonLily.CODEC, Networking::handle); + reg.playToClient(PacketSyncLitEntities.TYPE, PacketSyncLitEntities.CODEC, Networking::handle); + reg.playToClient(PacketSyncPlayerCap.TYPE, PacketSyncPlayerCap.CODEC, Networking::handle); + reg.playToClient(PacketSyncTag.TYPE , PacketSyncTag.CODEC, Networking::handle); + reg.playToClient(PacketTimedEvent.TYPE, PacketTimedEvent.CODEC, Networking::handle); + reg.playToServer(PacketToggleFamiliar.TYPE, PacketToggleFamiliar.CODEC, Networking::handle); + reg.playToClient(PacketToggleLight.TYPE, PacketToggleLight.CODEC, Networking::handle); + reg.playToServer(PacketUnsummonLily.TYPE, PacketUnsummonLily.CODEC, Networking::handle); + reg.playToClient(PacketUpdateBookGUI.TYPE, PacketUpdateBookGUI.CODEC, Networking::handle); + reg.playToServer(PacketUpdateCaster.TYPE, PacketUpdateCaster.CODEC, Networking::handle); + reg.playToClient(PacketUpdateFlight.TYPE, PacketUpdateFlight.CODEC, Networking::handle); + reg.playToClient(PacketUpdateMana.TYPE, PacketUpdateMana.CODEC, Networking::handle); + reg.playToServer(PacketUpdateSpellColorAll.TYPE, PacketUpdateSpellColorAll.CODEC, Networking::handle); + reg.playToServer(PacketUpdateSpellColors.TYPE, PacketUpdateSpellColors.CODEC, Networking::handle); + reg.playToServer(PacketUpdateSpellSoundAll.TYPE, PacketUpdateSpellSoundAll.CODEC, Networking::handle); + reg.playToClient(PacketWarpPosition.TYPE, PacketWarpPosition.CODEC, Networking::handle); + reg.playToClient(PotionSyncPacket.TYPE, PotionSyncPacket.CODEC, Networking::handle); + reg.playToClient(ServerToClientStoragePacket.TYPE, ServerToClientStoragePacket.CODEC, Networking::handle); + } - INSTANCE.registerMessage(nextID(), - PacketHotkeyPressed.class, - PacketHotkeyPressed::toBytes, - PacketHotkeyPressed::new, - PacketHotkeyPressed::handle); + private static void handle(T message, IPayloadContext ctx) { + if (ctx.flow().getReceptionSide() == LogicalSide.SERVER) { + handleServer(message, ctx); + } else { + //separate class to avoid loading client code on server. + //Using OnlyIn on a method in this class would work too, but is discouraged + ClientMessageHandler.handleClient(message, ctx); + } + } - INSTANCE.registerMessage(nextID(), - PacketOpenGlyphCraft.class, - PacketOpenGlyphCraft::toBytes, - PacketOpenGlyphCraft::new, - PacketOpenGlyphCraft::handle); + private static void handleServer(T message, IPayloadContext ctx) { + MinecraftServer server = ctx.player().getServer(); + message.onServerReceived(server, (ServerPlayer) ctx.player()); + } - INSTANCE.registerMessage(nextID(), - PacketSetScribeRecipe.class, - PacketSetScribeRecipe::toBytes, - PacketSetScribeRecipe::new, - PacketSetScribeRecipe::handle); - INSTANCE.registerMessage(nextID(), - PacketToggleLight.class, - PacketToggleLight::toBytes, - PacketToggleLight::new, - PacketToggleLight::handle); - INSTANCE.registerMessage(nextID(), - PacketAddFadingLight.class, - PacketAddFadingLight::encode, - PacketAddFadingLight::decode, - PacketAddFadingLight.Handler::handle); + private static class ClientMessageHandler { - INSTANCE.registerMessage(nextID(), - PacketSetSound.class, - PacketSetSound::toBytes, - PacketSetSound::new, - PacketSetSound::handle); - INSTANCE.registerMessage(nextID(), - PacketMountCamera.class, - PacketMountCamera::encode, - PacketMountCamera::decode, - PacketMountCamera::onMessage); - INSTANCE.registerMessage(nextID(), - PacketDismountCamera.class, - PacketDismountCamera::encode, - PacketDismountCamera::decode, - PacketDismountCamera::onMessage); - INSTANCE.registerMessage(nextID(), - PacketSetCameraView.class, - PacketSetCameraView::encode, - PacketSetCameraView::decode, - PacketSetCameraView::onMessage); - INSTANCE.registerMessage(nextID(), - PacketSyncLitEntities.class, - PacketSyncLitEntities::toBytes, - PacketSyncLitEntities::new, - PacketSyncLitEntities::handle); - INSTANCE.registerMessage(nextID(), - PacketSyncTag.class, - PacketSyncTag::encode, - PacketSyncTag::decode, - PacketSyncTag.Handler::handle); - INSTANCE.registerMessage(nextID(), - PacketQuickCast.class, - PacketQuickCast::toBytes, - PacketQuickCast::new, - PacketQuickCast::handle); - INSTANCE.registerMessage(nextID(), - PacketConsumePotion.class, - PacketConsumePotion::toBytes, - PacketConsumePotion::new, - PacketConsumePotion::handle); - INSTANCE.registerMessage(nextID(), - PacketSetLauncher.class, - PacketSetLauncher::toBytes, - PacketSetLauncher::new, - PacketSetLauncher::handle); - INSTANCE.registerMessage(nextID(), ChangeBiomePacket.class, ChangeBiomePacket::encode, ChangeBiomePacket::new, ChangeBiomePacket.Handler::onMessage); - INSTANCE.registerMessage(nextID(), ServerToClientStoragePacket.class, ServerToClientStoragePacket::toBytes, ServerToClientStoragePacket::new, ServerToClientStoragePacket.Handler::onMessage); - INSTANCE.registerMessage(nextID(), ClientToServerStoragePacket.class, ClientToServerStoragePacket::toBytes, ClientToServerStoragePacket::new, ClientToServerStoragePacket.Handler::onMessage); - INSTANCE.registerMessage(nextID(), HighlightAreaPacket.class, HighlightAreaPacket::encode, HighlightAreaPacket::decode, HighlightAreaPacket.Handler::handle); - INSTANCE.registerMessage(nextID(), PacketToggleFamiliar.class, PacketToggleFamiliar::toBytes, PacketToggleFamiliar::new, PacketToggleFamiliar::handle); - INSTANCE.registerMessage(nextID(), PacketDispelFamiliars.class, PacketDispelFamiliars::toBytes, PacketDispelFamiliars::new, PacketDispelFamiliars::handle); - INSTANCE.registerMessage(nextID(), PacketGenericClientMessage.class, PacketGenericClientMessage::toBytes, PacketGenericClientMessage::new, PacketGenericClientMessage::handle); - INSTANCE.registerMessage(nextID(), NotEnoughManaPacket.class, NotEnoughManaPacket::encode, NotEnoughManaPacket::decode, NotEnoughManaPacket::handle); - INSTANCE.registerMessage(nextID(), PacketSummonLily.class, PacketSummonLily::toBytes, PacketSummonLily::new, PacketSummonLily::handle); - INSTANCE.registerMessage(nextID(), PacketJoinedServer.class, PacketJoinedServer::toBytes, PacketJoinedServer::new, PacketJoinedServer.Handler::handle); - INSTANCE.registerMessage(nextID(), PacketUnsummonLily.class, PacketUnsummonLily::toBytes, PacketUnsummonLily::new, PacketUnsummonLily::handle); - INSTANCE.registerMessage(nextID(), SyncPathMessage.class, SyncPathMessage::toBytes, SyncPathMessage::new, SyncPathMessage.Handler::handle); - INSTANCE.registerMessage(nextID(), SyncPathReachedMessage.class, SyncPathReachedMessage::toBytes, SyncPathReachedMessage::new, SyncPathReachedMessage.Handler::handle); - INSTANCE.registerMessage(nextID(), PacketUpdateSpellColorAll.class, PacketUpdateSpellColorAll::toBytes, PacketUpdateSpellColorAll::new, PacketUpdateSpellColorAll::handle); - INSTANCE.registerMessage(nextID(), PacketUpdateSpellSoundAll.class, PacketUpdateSpellSoundAll::toBytes, PacketUpdateSpellSoundAll::new, PacketUpdateSpellSoundAll::handle); - INSTANCE.registerMessage(nextID(), PotionSyncPacket.class, PotionSyncPacket::toBytes, PotionSyncPacket::new, PotionSyncPacket::handle); - INSTANCE.registerMessage(nextID(), PacketClientRewindEffect.class, PacketClientRewindEffect::toBytes, PacketClientRewindEffect::new, PacketClientRewindEffect::handle); + public static void handleClient(T message, IPayloadContext ctx) { + Minecraft minecraft = Minecraft.getInstance(); + message.onClientReceived(minecraft, minecraft.player); + } } - public static void sendToNearby(Level world, BlockPos pos, Object toSend) { + public static void sendToNearbyClient(Level world, BlockPos pos, CustomPacketPayload toSend) { if (world instanceof ServerLevel ws) { ws.getChunkSource().chunkMap.getPlayers(new ChunkPos(pos), false).stream() .filter(p -> p.distanceToSqr(pos.getX(), pos.getY(), pos.getZ()) < 64 * 64) - .forEach(p -> INSTANCE.send(PacketDistributor.PLAYER.with(() -> p), toSend)); + .forEach(p -> Networking.sendToPlayerClient(toSend, p)); } } - public static void sendToNearby(Level world, Entity e, Object toSend) { - sendToNearby(world, e.blockPosition(), toSend); + public static void sendToNearbyClient(Level world, Entity e, CustomPacketPayload toSend) { + sendToNearbyClient(world, e.blockPosition(), toSend); } - public static void sendToPlayerClient(Object msg, ServerPlayer player) { - INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), msg); + public static void sendToPlayerClient(CustomPacketPayload msg, ServerPlayer player) { + PacketDistributor.sendToPlayer(player, msg); } - public static void sendToServer(Object msg) { - INSTANCE.sendToServer(msg); + public static void sendToServer(CustomPacketPayload msg) { + PacketDistributor.sendToServer(msg); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/NotEnoughManaPacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/NotEnoughManaPacket.java index 6cde192fd5..557d588741 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/NotEnoughManaPacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/NotEnoughManaPacket.java @@ -1,36 +1,45 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.ClientInfo; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; +import net.minecraft.client.Minecraft; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; -public class NotEnoughManaPacket{ +public class NotEnoughManaPacket extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("not_enough_mana")); + + public static final StreamCodec CODEC = StreamCodec.ofMember(NotEnoughManaPacket::toBytes, NotEnoughManaPacket::new); int totalCost; + public NotEnoughManaPacket(int totalCost) { this.totalCost = totalCost; } - public void handle(Supplier ctxSupplier) { - NetworkEvent.Context ctx = ctxSupplier.get(); - // This packet is only registered to be received on the client - if (ctx.getDirection().getReceptionSide().isClient()) { - ctx.enqueueWork(() -> { - ClientInfo.redOverlayTicks = 35; - ClientInfo.redOverlayMana = totalCost; - }); - } - ctx.setPacketHandled(true); + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + ClientInfo.redOverlayTicks = 35; + ClientInfo.redOverlayMana = totalCost; } - public static void encode(NotEnoughManaPacket msg, FriendlyByteBuf friendlyByteBuf) { - friendlyByteBuf.writeInt(msg.totalCost); + public static void encode(NotEnoughManaPacket msg, RegistryFriendlyByteBuf RegistryFriendlyByteBuf) { + RegistryFriendlyByteBuf.writeInt(msg.totalCost); } - public static NotEnoughManaPacket decode(FriendlyByteBuf friendlyByteBuf) { - int totalCost = friendlyByteBuf.readInt(); - return new NotEnoughManaPacket(totalCost); + public NotEnoughManaPacket(RegistryFriendlyByteBuf RegistryFriendlyByteBuf) { + totalCost = RegistryFriendlyByteBuf.readInt(); } + @Override + public void toBytes(RegistryFriendlyByteBuf buf) { + buf.writeInt(totalCost); + } + + @Override + public Type type() { + return TYPE; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketANEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketANEffect.java index 5e442d5f55..810bc55717 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketANEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketANEffect.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; import com.hollingsworth.arsnouveau.client.particle.GlowParticleData; import com.hollingsworth.arsnouveau.client.particle.HelixParticleData; @@ -8,12 +9,14 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; - -public class PacketANEffect { - +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; + +public class PacketANEffect extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("effect")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketANEffect::toBytes, PacketANEffect::decode); private final EffectType type; private final double x; private final double y; @@ -51,7 +54,7 @@ public PacketANEffect(EffectType type, BlockPos pos, ParticleColor wrapper, int. this(type, pos.getX(), pos.getY(), pos.getZ(), wrapper, args); } - public static PacketANEffect decode(FriendlyByteBuf buf) { + public static PacketANEffect decode(RegistryFriendlyByteBuf buf) { EffectType type = EffectType.values()[buf.readByte()]; double x = buf.readDouble(); double y = buf.readDouble(); @@ -65,58 +68,48 @@ public static PacketANEffect decode(FriendlyByteBuf buf) { return new PacketANEffect(type, x, y, z, ParticleColorRegistry.from(nbt), args); } - public static void encode(PacketANEffect msg, FriendlyByteBuf buf) { - buf.writeByte(msg.type.ordinal()); - buf.writeDouble(msg.x); - buf.writeDouble(msg.y); - buf.writeDouble(msg.z); - buf.writeNbt(msg.particleNbt); - for (int i = 0; i < msg.type.argCount; i++) { - buf.writeVarInt(msg.args[i]); + @Override + public void toBytes(RegistryFriendlyByteBuf buf) { + buf.writeByte(type.ordinal()); + buf.writeDouble(x); + buf.writeDouble(y); + buf.writeDouble(z); + buf.writeNbt(particleNbt); + for (int i = 0; i < type.argCount; i++) { + buf.writeVarInt(args[i]); } } - public static class Handler { - public static void handle(final PacketANEffect message, final Supplier ctx) { - if (ctx.get().getDirection().getReceptionSide().isServer()) { - ctx.get().setPacketHandled(true); - return; - } - ctx.get().enqueueWork(new Runnable() { - // Use anon - lambda causes classloading issues - @Override - public void run() { - Minecraft mc = Minecraft.getInstance(); - ClientLevel world = mc.level; - ParticleColor color = ParticleColorRegistry.from(message.particleNbt); - switch (message.type) { - case BURST -> { - for (int i = 0; i < 10; i++) { - double d0 = message.x + 0.5; //+ world.rand.nextFloat(); - double d1 = message.y + 1.2;//+ world.rand.nextFloat() ; - double d2 = message.z + .5; //+ world.rand.nextFloat(); - world.addParticle(GlowParticleData.createData(color), d0, d1, d2, - (world.random.nextFloat() - 0.5) / 3.0, - (world.random.nextFloat() - 0.5) / 3.0, - (world.random.nextFloat() - 0.5) / 3.0); - } - } - case TIMED_HELIX -> { - - int numParticles = 8; - for (int i = 0; i < numParticles; i++) { - world.addParticle(HelixParticleData.createData(color, 0.25f, 1.00f, 50, i * 360F / numParticles), message.x + 0.5, message.y + 0.1 * i, message.z + 0.5, 0, 0, 0); - } - } - } + @Override + public Type type() { + return TYPE; + } + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + ClientLevel world = minecraft.level; + ParticleColor color = ParticleColorRegistry.from(particleNbt); + switch (type) { + case BURST -> { + for (int i = 0; i < 10; i++) { + double d0 = x + 0.5; //+ world.rand.nextFloat(); + double d1 = y + 1.2;//+ world.rand.nextFloat() ; + double d2 = z + .5; //+ world.rand.nextFloat(); + world.addParticle(GlowParticleData.createData(color), d0, d1, d2, + (world.random.nextFloat() - 0.5) / 3.0, + (world.random.nextFloat() - 0.5) / 3.0, + (world.random.nextFloat() - 0.5) / 3.0); } - }); - ctx.get().setPacketHandled(true); + } + case TIMED_HELIX -> { + int numParticles = 8; + for (int i = 0; i < numParticles; i++) { + world.addParticle(HelixParticleData.createData(color, 0.25f, 1.00f, 50, i * 360F / numParticles), x + 0.5, y + 0.1 * i, z + 0.5, 0, 0, 0); + } + } } } - public enum EffectType { TIMED_GLOW(4), //dest xyz num_particles TIMED_HELIX(0), diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAddFadingLight.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAddFadingLight.java index f6878d6888..9c41ccd3c0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAddFadingLight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAddFadingLight.java @@ -1,17 +1,21 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.event.EventQueue; import com.hollingsworth.arsnouveau.api.event.FadeLightTimedEvent; import com.hollingsworth.arsnouveau.common.light.LightManager; import com.hollingsworth.arsnouveau.setup.config.Config; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; -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.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; -public class PacketAddFadingLight { +public class PacketAddFadingLight extends AbstractPacket{ + public static final Type TYPE = new Type(ArsNouveau.prefix("add_fading_light")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketAddFadingLight::toBytes, PacketAddFadingLight::new); final double x; final double y; final double z; @@ -28,33 +32,27 @@ public PacketAddFadingLight(BlockPos pos) { this.z = pos.getZ(); } - public static PacketAddFadingLight decode(FriendlyByteBuf buf) { - return new PacketAddFadingLight(buf.readDouble(), buf.readDouble(), buf.readDouble()); + public PacketAddFadingLight(RegistryFriendlyByteBuf buf) { + this.x = buf.readDouble(); + this.y = buf.readDouble(); + this.z = buf.readDouble(); } - public static void encode(PacketAddFadingLight msg, FriendlyByteBuf buf) { - buf.writeDouble(msg.x); - buf.writeDouble(msg.y); - buf.writeDouble(msg.z); + @Override + public void toBytes(RegistryFriendlyByteBuf buf) { + buf.writeDouble(x); + buf.writeDouble(y); + buf.writeDouble(z); } - public static class Handler { - public static void handle(final PacketAddFadingLight m, final Supplier ctx) { - if (ctx.get().getDirection().getReceptionSide().isServer()) { - ctx.get().setPacketHandled(true); - return; - } - - ctx.get().enqueueWork(new Runnable() { - // Use anon - lambda causes classloading issues - @Override - public void run() { - if (LightManager.shouldUpdateDynamicLight()) - EventQueue.getClientQueue().addEvent(new FadeLightTimedEvent(Minecraft.getInstance().level, new Vec3(m.x, m.y, m.z), Config.TOUCH_LIGHT_DURATION.get(), Config.TOUCH_LIGHT_LUMINANCE.get())); - } - }); - ctx.get().setPacketHandled(true); - - } + @Override + public Type type() { + return TYPE; + } + + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + if (LightManager.shouldUpdateDynamicLight()) + EventQueue.getClientQueue().addEvent(new FadeLightTimedEvent(Minecraft.getInstance().level, new Vec3(x,y, z), Config.TOUCH_LIGHT_DURATION.get(), Config.TOUCH_LIGHT_LUMINANCE.get())); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAnimEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAnimEntity.java index 4951478d01..2cdcab461e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAnimEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAnimEntity.java @@ -1,13 +1,17 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.block.tile.IAnimationListener; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; -public class PacketAnimEntity { +public class PacketAnimEntity extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("anim_entity")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketAnimEntity::toBytes, PacketAnimEntity::new); int entityID; int anim; @@ -22,35 +26,27 @@ public PacketAnimEntity(int entityID, int anim) { this.anim = anim; } - public static PacketAnimEntity decode(FriendlyByteBuf buf) { - return new PacketAnimEntity(buf.readInt(), buf.readInt()); + public PacketAnimEntity(RegistryFriendlyByteBuf buf) { + entityID = buf.readInt(); + anim = buf.readInt(); } - public static void encode(PacketAnimEntity msg, FriendlyByteBuf buf) { - buf.writeInt(msg.entityID); - buf.writeInt(msg.anim); + @Override + public void toBytes(RegistryFriendlyByteBuf buf) { + buf.writeInt(entityID); + buf.writeInt(anim); } - public static class Handler { - public static void handle(final PacketAnimEntity m, final Supplier ctx) { - if (ctx.get().getDirection().getReceptionSide().isServer()) { - ctx.get().setPacketHandled(true); - return; - } - - ctx.get().enqueueWork(new Runnable() { - // Use anon - lambda causes classloading issues - @Override - public void run() { - Minecraft mc = Minecraft.getInstance(); - ClientLevel world = mc.level; - if (world.getEntity(m.entityID) instanceof IAnimationListener) { - ((IAnimationListener) world.getEntity(m.entityID)).startAnimation(m.anim); - } - } - }); - ctx.get().setPacketHandled(true); + @Override + public Type type() { + return TYPE; + } + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + ClientLevel world = minecraft.level; + if (world.getEntity(entityID) instanceof IAnimationListener) { + ((IAnimationListener) world.getEntity(entityID)).startAnimation(anim); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientDelayEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientDelayEffect.java index f8e4013f11..454e92e538 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientDelayEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientDelayEffect.java @@ -6,21 +6,26 @@ import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.api.spell.SpellContext; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.LivingCaster; +import net.minecraft.client.Minecraft; 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.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.network.NetworkEvent; + import javax.annotation.Nullable; -import java.util.function.Supplier; -public class PacketClientDelayEffect { +public class PacketClientDelayEffect extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("client_delay_effect")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketClientDelayEffect::toBytes, PacketClientDelayEffect::new); public Spell spell; public int duration; @@ -29,7 +34,7 @@ public class PacketClientDelayEffect { public int hitEntityID; //Decoder - public PacketClientDelayEffect(FriendlyByteBuf buf) { + public PacketClientDelayEffect(RegistryFriendlyByteBuf buf) { duration = buf.readInt(); spell = Spell.fromTag(buf.readNbt()); shooterID = buf.readInt(); @@ -40,7 +45,7 @@ public PacketClientDelayEffect(FriendlyByteBuf buf) { } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeInt(duration); buf.writeNbt(spell.serialize()); buf.writeInt(shooterID); @@ -60,21 +65,24 @@ public PacketClientDelayEffect(int duration, @Nullable LivingEntity shooter, Spe this.hitEntityID = hitEntity == null ? -1 : hitEntity.getId(); } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - Level world = ArsNouveau.proxy.getClientWorld(); - Entity hitEntity = world.getEntity(hitEntityID); - HitResult result; - if (hitEntityID == -1) { - result = hitPos; - } else if (hitEntity == null) { - result = BlockHitResult.miss(new Vec3(0, 0, 0), Direction.UP, BlockPos.ZERO); - } else { - result = new EntityHitResult(hitEntity); - } - EventQueue.getClientQueue().addEvent(new DelayedSpellEvent(duration, spell, result, world, (LivingEntity) world.getEntity(shooterID), - new SpellContext(world, spell, (LivingEntity) world.getEntity(shooterID), new LivingCaster((LivingEntity) world.getEntity(shooterID))))); - }); - ctx.get().setPacketHandled(true); + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + Level world = ArsNouveau.proxy.getClientWorld(); + Entity hitEntity = world.getEntity(hitEntityID); + HitResult result; + if (hitEntityID == -1) { + result = hitPos; + } else if (hitEntity == null) { + result = BlockHitResult.miss(new Vec3(0, 0, 0), Direction.UP, BlockPos.ZERO); + } else { + result = new EntityHitResult(hitEntity); + } + EventQueue.getClientQueue().addEvent(new DelayedSpellEvent(duration, spell, result, world, (LivingEntity) world.getEntity(shooterID), + new SpellContext(world, spell, (LivingEntity) world.getEntity(shooterID), new LivingCaster((LivingEntity) world.getEntity(shooterID))))); + } + + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientRewindEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientRewindEffect.java index 495f087050..02b0f13012 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientRewindEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientRewindEffect.java @@ -3,24 +3,28 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.event.EventQueue; import com.hollingsworth.arsnouveau.common.event.timed.RewindEvent; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraftforge.network.NetworkEvent; -import java.util.function.Supplier; +public class PacketClientRewindEffect extends AbstractPacket{ -public class PacketClientRewindEffect { + public static final Type TYPE = new Type<>(ArsNouveau.prefix("rewind_effect")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketClientRewindEffect::toBytes, PacketClientRewindEffect::new); public int duration; public int hitEntityID; - public PacketClientRewindEffect(FriendlyByteBuf buf) { + public PacketClientRewindEffect(RegistryFriendlyByteBuf buf) { duration = buf.readInt(); hitEntityID = buf.readInt(); } - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeInt(duration); buf.writeInt(hitEntityID); } @@ -30,14 +34,17 @@ public PacketClientRewindEffect(int duration, Entity hitEntity) { this.hitEntityID = hitEntity.getId(); } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - Level world = ArsNouveau.proxy.getClientWorld(); - Entity hitEntity = world.getEntity(hitEntityID); - if(hitEntity != null) { - EventQueue.getClientQueue().addEvent(new RewindEvent(hitEntity, hitEntity.level.getGameTime(), duration)); - } - }); - ctx.get().setPacketHandled(true); + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + Level world = player.level; + Entity hitEntity = world.getEntity(hitEntityID); + if(hitEntity != null) { + EventQueue.getClientQueue().addEvent(new RewindEvent(hitEntity, hitEntity.level.getGameTime(), duration)); + } + } + + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java index 705769e9c6..2426086fcc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java @@ -1,27 +1,31 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.potion.PotionData; import com.hollingsworth.arsnouveau.common.items.PotionFlask; -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.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.PotionItem; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; -public class PacketConsumePotion { - int inventorySlot; +public class PacketConsumePotion extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("consume_potion")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketConsumePotion::toBytes, PacketConsumePotion::new); + int inventorySlot; - public PacketConsumePotion(FriendlyByteBuf buf) { + public PacketConsumePotion(RegistryFriendlyByteBuf buf) { this.inventorySlot = buf.readInt(); } //Encoder - public void toBytes(FriendlyByteBuf buf){ + public void toBytes(RegistryFriendlyByteBuf buf){ buf.writeInt(inventorySlot); } @@ -29,31 +33,32 @@ public PacketConsumePotion(int inventorySlot) { this.inventorySlot = inventorySlot; } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - ServerPlayer player = ctx.get().getSender(); - if (player == null) - return; + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + if (player == null) + return; - if(inventorySlot >= player.inventory.getContainerSize()) + if(inventorySlot >= player.inventory.getContainerSize()) + return; + ItemStack stack = player.inventory.getItem(inventorySlot); + if(stack.getItem() instanceof PotionItem){ + PotionData data = new PotionData(stack); + data.applyEffects(player, player, player); + stack.shrink(1); + player.inventory.add(new ItemStack(Items.GLASS_BOTTLE)); + player.level.playSound(null, player.blockPosition(), SoundEvents.GENERIC_DRINK, SoundSource.PLAYERS, 0.5f, player.level.random.nextFloat() * 0.1F + 0.9F); + }else if(stack.getItem() instanceof PotionFlask){ + PotionFlask.FlaskData data = new PotionFlask.FlaskData(stack); + if(data.getPotion().isEmpty() || data.getCount() <= 0) return; - ItemStack stack = player.inventory.getItem(inventorySlot); - if(stack.getItem() instanceof PotionItem){ - PotionData data = new PotionData(stack); - data.applyEffects(player, player, player); - stack.shrink(1); - player.inventory.add(new ItemStack(Items.GLASS_BOTTLE)); - player.level.playSound(null, player.blockPosition(), SoundEvents.GENERIC_DRINK, SoundSource.PLAYERS, 0.5f, player.level.random.nextFloat() * 0.1F + 0.9F); - }else if(stack.getItem() instanceof PotionFlask){ - PotionFlask.FlaskData data = new PotionFlask.FlaskData(stack); - if(data.getPotion().isEmpty() || data.getCount() <= 0) - return; - data.getPotion().applyEffects(player, player, player); - data.setCount(data.getCount() - 1); - player.level.playSound(null, player.blockPosition(), SoundEvents.GENERIC_DRINK, SoundSource.PLAYERS, 0.5f, player.level.random.nextFloat() * 0.1F + 0.9F); - } - - }); - ctx.get().setPacketHandled(true); + data.getPotion().applyEffects(player, player, player); + data.setCount(data.getCount() - 1); + player.level.playSound(null, player.blockPosition(), SoundEvents.GENERIC_DRINK, SoundSource.PLAYERS, 0.5f, player.level.random.nextFloat() * 0.1F + 0.9F); + } + } + + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketDismountCamera.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketDismountCamera.java index 0bdd61355d..7573e33589 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketDismountCamera.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketDismountCamera.java @@ -1,31 +1,33 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.entity.ScryerCamera; -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.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; // https://github.com/Geforce132/SecurityCraft/blob/1.18.2/src/main/java/net/geforcemods/securitycraft/network/server/DismountCamera.java -public class PacketDismountCamera { - public PacketDismountCamera() { - } +public class PacketDismountCamera extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("dismount_camera")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketDismountCamera::toBytes, PacketDismountCamera::new); - public static void encode(PacketDismountCamera message, FriendlyByteBuf buf) { - } + public PacketDismountCamera(){} - public static PacketDismountCamera decode(FriendlyByteBuf buf) { - return new PacketDismountCamera(); - } + public PacketDismountCamera(RegistryFriendlyByteBuf buf) {} - public static void onMessage(PacketDismountCamera message, Supplier ctx) { - ctx.get().enqueueWork(() -> { - ServerPlayer player = ctx.get().getSender(); + @Override + public void toBytes(RegistryFriendlyByteBuf buf) {} - if (player.getCamera() instanceof ScryerCamera cam) - cam.stopViewing(player); - }); + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + if (player.getCamera() instanceof ScryerCamera cam) + cam.stopViewing(player); + } - ctx.get().setPacketHandled(true); + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketDispelFamiliars.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketDispelFamiliars.java index 67b0762d22..5f3a94cf76 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketDispelFamiliars.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketDispelFamiliars.java @@ -1,37 +1,37 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.entity.familiar.FamiliarEntity; import com.hollingsworth.arsnouveau.common.event.FamiliarEvents; import com.hollingsworth.arsnouveau.common.util.PortUtil; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; -public class PacketDispelFamiliars { +public class PacketDispelFamiliars extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("dispel_familiars")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketDispelFamiliars::toBytes, PacketDispelFamiliars::new); + public PacketDispelFamiliars() {} //Decoder - public PacketDispelFamiliars(FriendlyByteBuf buf) { + public PacketDispelFamiliars(RegistryFriendlyByteBuf buf) { } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - if (ctx.get().getSender() != null) { - Entity owner = ctx.get().getSender(); - dispelForPlayer(owner); - } - }); - ctx.get().setPacketHandled(true); - + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + dispelForPlayer(player); } public static boolean dispelForPlayer(Entity owner) { @@ -46,4 +46,9 @@ public static boolean dispelForPlayer(Entity owner) { } return removedFamiliar; } + + @Override + public Type type() { + return TYPE; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketGenericClientMessage.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketGenericClientMessage.java index 4e1a98713d..16f0446a8e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketGenericClientMessage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketGenericClientMessage.java @@ -1,12 +1,16 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.items.curios.JumpingRing; -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.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; -public class PacketGenericClientMessage { +public class PacketGenericClientMessage extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("generic_client_message")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketGenericClientMessage::toBytes, PacketGenericClientMessage::new); public enum Action{ JUMP_RING } @@ -17,26 +21,24 @@ public PacketGenericClientMessage(Action action){ this.action = action; } //Decoder - public PacketGenericClientMessage(FriendlyByteBuf buf) { + public PacketGenericClientMessage(RegistryFriendlyByteBuf buf) { this.action = Action.valueOf(buf.readUtf()); } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeUtf(action.name()); } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - ServerPlayer player = ctx.get().getSender(); - if (player != null) { - if(action == Action.JUMP_RING){ - JumpingRing.doJump(player); - } - } - }); - ctx.get().setPacketHandled(true); + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + if(action == Action.JUMP_RING){ + JumpingRing.doJump(player); + } } - + @Override + public Type type() { + return TYPE; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketGetPersistentData.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketGetPersistentData.java index a0716d5c5c..7b4253a61a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketGetPersistentData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketGetPersistentData.java @@ -1,22 +1,26 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.ClientInfo; +import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; - -public class PacketGetPersistentData { +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; +public class PacketGetPersistentData extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("get_persistent_data")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketGetPersistentData::toBytes, PacketGetPersistentData::new); public CompoundTag tag; //Decoder - public PacketGetPersistentData(FriendlyByteBuf buf) { + public PacketGetPersistentData(RegistryFriendlyByteBuf buf) { tag = buf.readNbt(); } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeNbt(tag); } @@ -24,10 +28,13 @@ public PacketGetPersistentData(CompoundTag tag) { this.tag = tag; } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - ClientInfo.persistentData = tag; - }); - ctx.get().setPacketHandled(true); + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + ClientInfo.persistentData = tag; + } + + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketHotkeyPressed.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketHotkeyPressed.java index e300e17875..e5d1de6f8d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketHotkeyPressed.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketHotkeyPressed.java @@ -1,15 +1,19 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.item.ISpellHotkeyListener; import com.hollingsworth.arsnouveau.api.util.StackUtil; -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.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; -public class PacketHotkeyPressed { +public class PacketHotkeyPressed extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("hotkey_pressed")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketHotkeyPressed::toBytes, PacketHotkeyPressed::new); public enum Key { NEXT, @@ -23,35 +27,34 @@ public PacketHotkeyPressed(Key key) { } //Decoder - public PacketHotkeyPressed(FriendlyByteBuf buf) { + public PacketHotkeyPressed(RegistryFriendlyByteBuf buf) { this.key = Key.valueOf(buf.readUtf()); } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeUtf(key.name()); } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - ServerPlayer player = ctx.get().getSender(); - if (player != null) { - // Returns the hand holding an item with slots > 1, this only checks for NEXT/PREVIOUS slots for hotkeys. - InteractionHand hand = StackUtil.getHeldCasterTool(player, (tool) -> tool.getSpellCaster().getMaxSlots() > 1); - if (hand == null) - return; - ItemStack stack = player.getItemInHand(hand); - if (!(stack.getItem() instanceof ISpellHotkeyListener hotkeyListener)) { - return; - } - if (key == Key.NEXT) { - hotkeyListener.onNextKeyPressed(stack, player); - } else if (key == Key.PREVIOUS) { - hotkeyListener.onPreviousKeyPressed(stack, player); - } - } - }); - ctx.get().setPacketHandled(true); + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + // Returns the hand holding an item with slots > 1, this only checks for NEXT/PREVIOUS slots for hotkeys. + InteractionHand hand = StackUtil.getHeldCasterTool(player, (tool) -> tool.getSpellCaster().getMaxSlots() > 1); + if (hand == null) + return; + ItemStack stack = player.getItemInHand(hand); + if (!(stack.getItem() instanceof ISpellHotkeyListener hotkeyListener)) { + return; + } + if (key == Key.NEXT) { + hotkeyListener.onNextKeyPressed(stack, player); + } else if (key == Key.PREVIOUS) { + hotkeyListener.onPreviousKeyPressed(stack, player); + } } + @Override + public Type type() { + return TYPE; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketJoinedServer.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketJoinedServer.java index 4a61e82ebc..164d2d95a4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketJoinedServer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketJoinedServer.java @@ -1,49 +1,44 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.ClientInfo; import com.hollingsworth.arsnouveau.setup.config.Config; import net.minecraft.client.Minecraft; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; + +public class PacketJoinedServer extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("joined_server")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketJoinedServer::toBytes, PacketJoinedServer::new); -public class PacketJoinedServer { public boolean isSupporter; public PacketJoinedServer(boolean isSupporter){ this.isSupporter = isSupporter; } - public PacketJoinedServer(FriendlyByteBuf buf) { + public PacketJoinedServer(RegistryFriendlyByteBuf buf) { this.isSupporter = buf.readBoolean(); } - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeBoolean(isSupporter); } - public static class Handler { - public static void handle(final PacketJoinedServer message, final Supplier ctx) { - if (ctx.get().getDirection().getReceptionSide().isServer()) { - ctx.get().setPacketHandled(true); - return; - } - - ctx.get().enqueueWork(new Runnable() { - // Use anon - lambda causes classloading issues - @Override - public void run() { - ClientInfo.isSupporter = message.isSupporter; - if(Config.SHOW_SUPPORTER_MESSAGE.get()) { - Minecraft.getInstance().player.sendSystemMessage(Component.translatable("ars_nouveau.rewards.enabled")); - Config.SHOW_SUPPORTER_MESSAGE.set(false); - Config.SHOW_SUPPORTER_MESSAGE.save(); - } - } - }); - ctx.get().setPacketHandled(true); - + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + ClientInfo.isSupporter = isSupporter; + if(Config.SHOW_SUPPORTER_MESSAGE.get()) { + Minecraft.getInstance().player.sendSystemMessage(Component.translatable("ars_nouveau.rewards.enabled")); + Config.SHOW_SUPPORTER_MESSAGE.set(false); + Config.SHOW_SUPPORTER_MESSAGE.save(); } } + @Override + public Type type() { + return TYPE; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketMountCamera.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketMountCamera.java index fdf661bb96..979e70fc3d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketMountCamera.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketMountCamera.java @@ -1,46 +1,54 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.camera.ICameraMountable; import com.hollingsworth.arsnouveau.common.util.PortUtil; import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; -public class PacketMountCamera { +public class PacketMountCamera extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("mount_camera")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketMountCamera::encode, PacketMountCamera::decode); private BlockPos pos; public PacketMountCamera() { } + @Override + public void toBytes(RegistryFriendlyByteBuf buf) { + + } + public PacketMountCamera(BlockPos pos) { this.pos = pos; } - public static void encode(PacketMountCamera message, FriendlyByteBuf buf) { + public static void encode(PacketMountCamera message, RegistryFriendlyByteBuf buf) { buf.writeBlockPos(message.pos); } - public static PacketMountCamera decode(FriendlyByteBuf buf) { + public static PacketMountCamera decode(RegistryFriendlyByteBuf buf) { return new PacketMountCamera(buf.readBlockPos()); } - public static void onMessage(PacketMountCamera message, Supplier ctx) { - (ctx.get()).enqueueWork(() -> { - // Resolve serverside - BlockPos pos = message.pos; - ServerPlayer player = (ctx.get()).getSender(); - Level level = player.level; - - if (level.isLoaded(pos) && level.getBlockEntity(pos) instanceof ICameraMountable mountable) { - mountable.mountCamera(level, pos, player); - return; - } - PortUtil.sendMessage(player, Component.translatable("ars_nouveau.camera.not_loaded")); - }); - (ctx.get()).setPacketHandled(true); + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + Level level = player.level; + if (level.isLoaded(pos) && level.getBlockEntity(pos) instanceof ICameraMountable mountable) { + mountable.mountCamera(level, pos, player); + return; + } + PortUtil.sendMessage(player, Component.translatable("ars_nouveau.camera.not_loaded")); + } + + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketNoSpamChatMessage.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketNoSpamChatMessage.java index 4d948657a3..f9cd180516 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketNoSpamChatMessage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketNoSpamChatMessage.java @@ -6,18 +6,23 @@ import net.minecraft.client.GuiMessageTag; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.ChatComponent; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MessageSignature; import net.minecraft.network.chat.Style; -import net.neoforged.neoforge.network.NetworkEvent; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; + import java.util.Random; -import java.util.function.Supplier; /** * A text message sent from player to client */ -public class PacketNoSpamChatMessage { +public class PacketNoSpamChatMessage extends AbstractPacket { + public static final Type TYPE = new Type<>(ArsNouveau.prefix("no_spam_chat_message")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketNoSpamChatMessage::toBytes, PacketNoSpamChatMessage::new); + private final Component message; private final int messageChannelId; private final boolean overlayMessage; @@ -54,37 +59,38 @@ public PacketNoSpamChatMessage(Component message, int messageChannelId, boolean } // Decoder - public PacketNoSpamChatMessage(FriendlyByteBuf buf) { + public PacketNoSpamChatMessage(RegistryFriendlyByteBuf buf) { this.message = buf.readComponent(); this.messageChannelId = buf.readInt(); this.overlayMessage = buf.readBoolean(); } // Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeComponent(message); buf.writeInt(messageChannelId); buf.writeBoolean(overlayMessage); } - // Handler - public void handle(Supplier ctxSupplier) { - NetworkEvent.Context ctx = ctxSupplier.get(); - ctx.enqueueWork(() -> { - // This packet is only registered to be received on the client - if (overlayMessage) { - if (Minecraft.getInstance().player != null) { - Minecraft.getInstance().player.displayClientMessage(message, true); - } - } else { - ChatComponent gui = Minecraft.getInstance().gui.getChat(); - ChatComponentAccessor chatComponentAccessor = (ChatComponentAccessor) gui; - chatComponentAccessor.getAllMessages().removeIf(m -> m.signature() != null && m.signature().equals(AN_SIGNATURE)); - gui.rescaleChat(); - gui.addMessage(message.plainCopy().setStyle(Style.EMPTY.withColor(ChatFormatting.GOLD)), AN_SIGNATURE, GuiMessageTag.system()); - + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + // This packet is only registered to be received on the client + if (overlayMessage) { + if (Minecraft.getInstance().player != null) { + Minecraft.getInstance().player.displayClientMessage(message, true); } - }); - ctx.setPacketHandled(true); + } else { + ChatComponent gui = minecraft.gui.getChat(); + ChatComponentAccessor chatComponentAccessor = (ChatComponentAccessor) gui; + chatComponentAccessor.getAllMessages().removeIf(m -> m.signature() != null && m.signature().equals(AN_SIGNATURE)); + gui.rescaleChat(); + gui.addMessage(message.plainCopy().setStyle(Style.EMPTY.withColor(ChatFormatting.GOLD)), AN_SIGNATURE, GuiMessageTag.system()); + + } + } + + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOneShotAnimation.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOneShotAnimation.java index 689079e09c..4056c6b246 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOneShotAnimation.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOneShotAnimation.java @@ -1,14 +1,20 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.block.tile.IAnimationListener; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; + +public class PacketOneShotAnimation extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("one_shot_animation")); + + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketOneShotAnimation::encode, PacketOneShotAnimation::decode); -public class PacketOneShotAnimation { final int x; final int y; final int z; @@ -35,37 +41,33 @@ public PacketOneShotAnimation(BlockPos pos) { this.arg = 0; } - public static PacketOneShotAnimation decode(FriendlyByteBuf buf) { + public static PacketOneShotAnimation decode(RegistryFriendlyByteBuf buf) { return new PacketOneShotAnimation(buf.readInt(), buf.readInt(), buf.readInt(), buf.readInt()); } - public static void encode(PacketOneShotAnimation msg, FriendlyByteBuf buf) { + public static void encode(PacketOneShotAnimation msg, RegistryFriendlyByteBuf buf) { buf.writeInt(msg.x); buf.writeInt(msg.y); buf.writeInt(msg.z); buf.writeInt(msg.arg); } - public static class Handler { - public static void handle(final PacketOneShotAnimation m, final Supplier ctx) { - if (ctx.get().getDirection().getReceptionSide().isServer()) { - ctx.get().setPacketHandled(true); - return; - } - ctx.get().enqueueWork(new Runnable() { - // Use anon - lambda causes classloading issues - @Override - public void run() { - Minecraft mc = Minecraft.getInstance(); - ClientLevel world = mc.level; - if (world.getBlockEntity(new BlockPos(m.x, m.y, m.z)) instanceof IAnimationListener) { - ((IAnimationListener) world.getBlockEntity(new BlockPos(m.x, m.y, m.z))).startAnimation(m.arg); - } - } - }); - ctx.get().setPacketHandled(true); + @Override + public void toBytes(RegistryFriendlyByteBuf buf) { + + } + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + ClientLevel world = minecraft.level; + if (world.getBlockEntity(new BlockPos(x, y, z)) instanceof IAnimationListener) { + ((IAnimationListener) world.getBlockEntity(new BlockPos(x, y, z))).startAnimation(arg); } } + + @Override + public Type type() { + return TYPE; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenGlyphCraft.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenGlyphCraft.java index 861ebcd6a4..d9f4bdad6d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenGlyphCraft.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenGlyphCraft.java @@ -1,20 +1,25 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.gui.book.GlyphUnlockMenu; +import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; -public class PacketOpenGlyphCraft { +public class PacketOpenGlyphCraft extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("open_glyph_craft")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketOpenGlyphCraft::toBytes, PacketOpenGlyphCraft::new); BlockPos scribePos; - public PacketOpenGlyphCraft(FriendlyByteBuf buf) { + public PacketOpenGlyphCraft(RegistryFriendlyByteBuf buf) { this.scribePos = buf.readBlockPos(); } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeBlockPos(scribePos); } @@ -22,11 +27,13 @@ public PacketOpenGlyphCraft(BlockPos scribesPos) { this.scribePos = scribesPos; } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() ->{ - GlyphUnlockMenu.open(scribePos); - }); - ctx.get().setPacketHandled(true); + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + GlyphUnlockMenu.open(scribePos); } + @Override + public Type type() { + return TYPE; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenSpellBook.java index 1522e150b3..48dfcb1614 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenSpellBook.java @@ -1,38 +1,51 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.gui.book.GuiSpellBook; import com.hollingsworth.arsnouveau.client.gui.book.InfinityGuiSpellBook; import com.hollingsworth.arsnouveau.setup.config.ServerConfig; -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.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; -public class PacketOpenSpellBook { - public boolean isMainHand; + +public class PacketOpenSpellBook extends AbstractPacket{ + boolean isMainHand; + + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketOpenSpellBook::toBytes, PacketOpenSpellBook::new); + public static final Type TYPE = new Type<>(ArsNouveau.prefix("open_spell_book")); + + public PacketOpenSpellBook(boolean isMainHand) { + this.isMainHand = isMainHand; + } //Decoder - public PacketOpenSpellBook(FriendlyByteBuf buf) { - isMainHand = buf.readBoolean(); + public PacketOpenSpellBook(RegistryFriendlyByteBuf buf) { + this(buf.readBoolean()); } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeBoolean(isMainHand); } - + public PacketOpenSpellBook(InteractionHand hand) { this.isMainHand = hand == InteractionHand.MAIN_HAND; } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - InteractionHand hand = isMainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; - if (ServerConfig.INFINITE_SPELLS.get()) - InfinityGuiSpellBook.open(hand); - else GuiSpellBook.open(hand); - }); - ctx.get().setPacketHandled(true); + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + InteractionHand hand = isMainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; + if (ServerConfig.INFINITE_SPELLS.get()) + InfinityGuiSpellBook.open(hand); + else GuiSpellBook.open(hand); } + @Override + public Type type() { + return TYPE; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketQuickCast.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketQuickCast.java index e3ed2893dd..a14040216c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketQuickCast.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketQuickCast.java @@ -1,15 +1,19 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.item.ISpellHotkeyListener; import com.hollingsworth.arsnouveau.api.util.StackUtil; -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.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; -public class PacketQuickCast { +public class PacketQuickCast extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("quick_cast")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketQuickCast::toBytes, PacketQuickCast::new); int slot; public PacketQuickCast(int slot){ @@ -17,29 +21,29 @@ public PacketQuickCast(int slot){ } //Decoder - public PacketQuickCast(FriendlyByteBuf buf){ + public PacketQuickCast(RegistryFriendlyByteBuf buf){ this.slot = buf.readInt(); } //Encoder - public void toBytes(FriendlyByteBuf buf){ + public void toBytes(RegistryFriendlyByteBuf buf){ buf.writeInt(slot); } - public void handle(Supplier ctx){ - ctx.get().enqueueWork(()->{ - ServerPlayer player = ctx.get().getSender(); - if(player != null){ - InteractionHand hand = StackUtil.getQuickCaster(player); - if(hand == null) - return; - ItemStack stack = player.getItemInHand(hand); - if(!(stack.getItem() instanceof ISpellHotkeyListener hotkeyListener)){ - return; - } - hotkeyListener.onQuickCast(stack, player, hand, slot); - } - }); - ctx.get().setPacketHandled(true); + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + InteractionHand hand = StackUtil.getQuickCaster(player); + if(hand == null) + return; + ItemStack stack = player.getItemInHand(hand); + if(!(stack.getItem() instanceof ISpellHotkeyListener hotkeyListener)){ + return; + } + hotkeyListener.onQuickCast(stack, player, hand, slot); + } + + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketReactiveSpell.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketReactiveSpell.java index 7995c4524f..1657eeb21f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketReactiveSpell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketReactiveSpell.java @@ -1,35 +1,40 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.event.ReactiveEvents; -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.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; -public class PacketReactiveSpell { +public class PacketReactiveSpell extends AbstractPacket{ + + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("reactive_spell")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketReactiveSpell::toBytes, PacketReactiveSpell::new); public PacketReactiveSpell() { } //Decoder - public PacketReactiveSpell(FriendlyByteBuf buf) { + public PacketReactiveSpell(RegistryFriendlyByteBuf buf) { } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - ServerPlayer serverPlayerEntity = ctx.get().getSender(); - if (serverPlayerEntity != null) { - ItemStack stack = serverPlayerEntity.getMainHandItem(); - ReactiveEvents.castSpell(ctx.get().getSender(), stack); - } - }); - ctx.get().setPacketHandled(true); + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + ItemStack stack = player.getMainHandItem(); + ReactiveEvents.castSpell(player, stack); + } + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java index 95f97d4029..a4146a39ea 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java @@ -1,25 +1,28 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.util.StackUtil; import com.hollingsworth.arsnouveau.common.items.SpellBook; 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.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; - -public class PacketSetBookMode { +public class PacketSetBookMode extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("set_book_mode")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketSetBookMode::toBytes, PacketSetBookMode::new); public CompoundTag tag; //Decoder - public PacketSetBookMode(FriendlyByteBuf buf) { + public PacketSetBookMode(RegistryFriendlyByteBuf buf) { tag = buf.readNbt(); } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeNbt(tag); } @@ -27,18 +30,16 @@ public PacketSetBookMode(CompoundTag tag) { this.tag = tag; } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - ctx.get().enqueueWork(() -> { - ServerPlayer sender = ctx.get().getSender(); - if (sender == null) return; + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + ItemStack stack = StackUtil.getHeldSpellbook(player); + if (stack.getItem() instanceof SpellBook) { + stack.setTag(tag); + } + } - ItemStack stack = StackUtil.getHeldSpellbook(ctx.get().getSender()); - if (stack.getItem() instanceof SpellBook) { - stack.setTag(tag); - } - }); - }); - ctx.get().setPacketHandled(true); + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetCameraView.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetCameraView.java index 984ff9594d..610cf28590 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetCameraView.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetCameraView.java @@ -1,56 +1,59 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.camera.CameraController; import com.hollingsworth.arsnouveau.common.entity.ScryerCamera; import net.minecraft.client.CameraType; 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.world.entity.Entity; import net.minecraft.world.entity.player.Player; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; // https://github.com/Geforce132/SecurityCraft/blob/1.18.2/src/main/java/net/geforcemods/securitycraft/network/client/SetCameraView.java -public class PacketSetCameraView { +public class PacketSetCameraView extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("set_camera_view")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketSetCameraView::toBytes, PacketSetCameraView::new); private int id; public PacketSetCameraView() { } + @Override + public void toBytes(RegistryFriendlyByteBuf buf) { + buf.writeVarInt(id); + } + public PacketSetCameraView(Entity camera) { id = camera.getId(); } - public static void encode(PacketSetCameraView message, FriendlyByteBuf buf) { - buf.writeVarInt(message.id); + public PacketSetCameraView(RegistryFriendlyByteBuf buf) { + id = buf.readVarInt(); } - public static PacketSetCameraView decode(FriendlyByteBuf buf) { - PacketSetCameraView message = new PacketSetCameraView(); + @Override + public void onClientReceived(Minecraft mc, Player player) { + Entity entity = mc.level.getEntity(id); + boolean isCamera = entity instanceof ScryerCamera; + + if (isCamera || entity instanceof Player) { + mc.setCameraEntity(entity); + + if (isCamera) { + CameraController.previousCameraType = mc.options.getCameraType(); + mc.options.setCameraType(CameraType.FIRST_PERSON); + CameraController.setRenderPosition(entity); + } else if (CameraController.previousCameraType != null) + mc.options.setCameraType(CameraController.previousCameraType); - message.id = buf.readVarInt(); - return message; + mc.levelRenderer.allChanged(); + } } - public static void onMessage(PacketSetCameraView message, Supplier ctx) { - ctx.get().enqueueWork(() -> { - Minecraft mc = Minecraft.getInstance(); - Entity entity = mc.level.getEntity(message.id); - boolean isCamera = entity instanceof ScryerCamera; - - if (isCamera || entity instanceof Player) { - mc.setCameraEntity(entity); - - if (isCamera) { - CameraController.previousCameraType = mc.options.getCameraType(); - mc.options.setCameraType(CameraType.FIRST_PERSON); - CameraController.setRenderPosition(entity); - } else if (CameraController.previousCameraType != null) - mc.options.setCameraType(CameraController.previousCameraType); - - mc.levelRenderer.allChanged(); - } - }); - ctx.get().setPacketHandled(true); + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java index 373bf15f35..f0f2f49aca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java @@ -1,20 +1,24 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.potion.PotionData; import com.hollingsworth.arsnouveau.common.items.FlaskCannon; import com.hollingsworth.arsnouveau.common.items.PotionFlask; -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.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.PotionItem; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; public class PacketSetLauncher extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("set_launcher")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketSetLauncher::toBytes, PacketSetLauncher::new); public int inventorySlot; - public PacketSetLauncher(FriendlyByteBuf buf) { + public PacketSetLauncher(RegistryFriendlyByteBuf buf) { inventorySlot = buf.readInt(); } @@ -23,41 +27,40 @@ public PacketSetLauncher(int slot) { } @Override - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeInt(inventorySlot); } @Override - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - ServerPlayer player = ctx.get().getSender(); - if (player == null) - return; - if(inventorySlot >= player.inventory.getContainerSize()) - return; - ItemStack stack = player.inventory.getItem(inventorySlot); - ItemStack launcherStack = ItemStack.EMPTY; - if(player.getMainHandItem().getItem() instanceof FlaskCannon){ - launcherStack = player.getMainHandItem(); - }else if(player.getOffhandItem().getItem() instanceof FlaskCannon){ - launcherStack = player.getOffhandItem(); - } - if(launcherStack.isEmpty()){ - return; - } - FlaskCannon.PotionLauncherData data = new FlaskCannon.PotionLauncherData(launcherStack); - if (stack.getItem() instanceof PotionFlask ) { - PotionFlask.FlaskData flaskData = new PotionFlask.FlaskData(stack); - data.setLastDataForRender(flaskData.getPotion()); - data.setLastSlot(inventorySlot); - data.setAmountLeft(flaskData.getCount()); - }else if(stack.getItem() instanceof PotionItem){ - PotionData potionData = new PotionData(stack); - data.setLastDataForRender(potionData); - data.setLastSlot(inventorySlot); - data.setAmountLeft(stack.getCount()); - } - - }); + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + if(inventorySlot >= player.inventory.getContainerSize()) + return; + ItemStack stack = player.inventory.getItem(inventorySlot); + ItemStack launcherStack = ItemStack.EMPTY; + if(player.getMainHandItem().getItem() instanceof FlaskCannon){ + launcherStack = player.getMainHandItem(); + }else if(player.getOffhandItem().getItem() instanceof FlaskCannon){ + launcherStack = player.getOffhandItem(); + } + if(launcherStack.isEmpty()){ + return; + } + FlaskCannon.PotionLauncherData data = new FlaskCannon.PotionLauncherData(launcherStack); + if (stack.getItem() instanceof PotionFlask ) { + PotionFlask.FlaskData flaskData = new PotionFlask.FlaskData(stack); + data.setLastDataForRender(flaskData.getPotion()); + data.setLastSlot(inventorySlot); + data.setAmountLeft(flaskData.getCount()); + }else if(stack.getItem() instanceof PotionItem){ + PotionData potionData = new PotionData(stack); + data.setLastDataForRender(potionData); + data.setLastSlot(inventorySlot); + data.setAmountLeft(stack.getCount()); + } + } + + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetScribeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetScribeRecipe.java index 19e9a6538b..6cdbe9003f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetScribeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetScribeRecipe.java @@ -1,26 +1,30 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.block.tile.ScribesTile; import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; import net.minecraft.core.BlockPos; -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; import net.minecraft.world.item.crafting.Recipe; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; -public class PacketSetScribeRecipe { +public class PacketSetScribeRecipe extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("set_scribe_recipe")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketSetScribeRecipe::toBytes, PacketSetScribeRecipe::new); BlockPos scribePos; ResourceLocation recipeID; - public PacketSetScribeRecipe(FriendlyByteBuf buf) { + public PacketSetScribeRecipe(RegistryFriendlyByteBuf buf) { this.scribePos = buf.readBlockPos(); this.recipeID = buf.readResourceLocation(); } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeBlockPos(scribePos); buf.writeResourceLocation(recipeID); } @@ -30,18 +34,18 @@ public PacketSetScribeRecipe(BlockPos scribesPos, ResourceLocation resourceLocat this.recipeID = resourceLocation; } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - ServerPlayer player = ctx.get().getSender(); - if (player == null) - return; - if (player.level.getBlockEntity(scribePos) instanceof ScribesTile scribesTile) { - Recipe recipe = player.level.getRecipeManager().byKey(recipeID).orElse(null); - if (recipe instanceof GlyphRecipe glyphRecipe) { - scribesTile.setRecipe(glyphRecipe, player); - } + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + if (player.level.getBlockEntity(scribePos) instanceof ScribesTile scribesTile) { + Recipe recipe = player.level.getRecipeManager().byKey(recipeID).orElse(null); + if (recipe instanceof GlyphRecipe glyphRecipe) { + scribesTile.setRecipe(glyphRecipe, player); } - }); - ctx.get().setPacketHandled(true); + } + } + + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java index e0d454dd74..57c1e04add 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java @@ -1,19 +1,22 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.common.items.SpellBook; 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.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.network.NetworkEvent; -import net.neoforged.neoforge.network.PacketDistributor; -import java.util.function.Supplier; - -public class PacketSetSound { +public class PacketSetSound extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("set_sound")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketSetSound::toBytes, PacketSetSound::new); int castSlot; ConfiguredSpellSound sound; boolean mainHand; @@ -24,7 +27,7 @@ public PacketSetSound(int castSlot, ConfiguredSpellSound sound, boolean mainHand } //Decoder - public PacketSetSound(FriendlyByteBuf buf) { + public PacketSetSound(RegistryFriendlyByteBuf buf) { castSlot = buf.readInt(); CompoundTag tag = buf.readNbt(); sound = tag == null ? ConfiguredSpellSound.DEFAULT : ConfiguredSpellSound.fromTag(tag); @@ -32,25 +35,25 @@ public PacketSetSound(FriendlyByteBuf buf) { } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeInt(castSlot); buf.writeNbt(sound.serialize()); buf.writeBoolean(mainHand); } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - if (ctx.get().getSender() != null) { - ItemStack stack = ctx.get().getSender().getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); - if (stack.getItem() instanceof SpellBook) { - ISpellCaster caster = CasterUtil.getCaster(stack); - caster.setSound(sound, castSlot); - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> ctx.get().getSender()), new PacketUpdateBookGUI(stack)); - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> ctx.get().getSender()), - new PacketOpenSpellBook(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND)); - } - } - }); - ctx.get().setPacketHandled(true); + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + ItemStack stack = player.getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); + if (stack.getItem() instanceof SpellBook) { + ISpellCaster caster = CasterUtil.getCaster(stack); + caster.setSound(sound, castSlot); + Networking.sendToPlayerClient(new PacketUpdateBookGUI(stack), player); + Networking.sendToPlayerClient(new PacketOpenSpellBook(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND), player); + } + } + + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonFamiliar.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonFamiliar.java index 02d058ff73..ececc7bac0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonFamiliar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonFamiliar.java @@ -1,19 +1,25 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.event.FamiliarSummonEvent; import com.hollingsworth.arsnouveau.api.familiar.IFamiliar; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; -import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; -import net.minecraft.network.FriendlyByteBuf; +import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; +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.ServerLevel; -import net.minecraft.world.entity.Entity; +import net.minecraft.server.level.ServerPlayer; import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; -public class PacketSummonFamiliar { +public class PacketSummonFamiliar extends AbstractPacket{ + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("summon_familiar")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketSummonFamiliar::toBytes, PacketSummonFamiliar::new); + ResourceLocation familiarID; @@ -22,40 +28,40 @@ public PacketSummonFamiliar(ResourceLocation id) { } //Decoder - public PacketSummonFamiliar(FriendlyByteBuf buf) { + public PacketSummonFamiliar(RegistryFriendlyByteBuf buf) { familiarID = buf.readResourceLocation(); } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeResourceLocation(familiarID); } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - if (ctx.get().getSender() != null) { - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(ctx.get().getSender()).orElse(null); - if (cap == null) - return; - Entity owner = ctx.get().getSender(); - if(owner == null) - return; - - IFamiliar familiarEntity = cap.getFamiliarData(familiarID).getEntity(ctx.get().getSender().level); - familiarEntity.setOwnerID(owner.getUUID()); - familiarEntity.getThisEntity().setPos(owner.getX(), owner.getY(), owner.getZ()); - - FamiliarSummonEvent summonEvent = new FamiliarSummonEvent(familiarEntity.getThisEntity(), owner); - NeoForge.EVENT_BUS.post(summonEvent); - - if (!summonEvent.isCanceled()) { - owner.level.addFreshEntity(familiarEntity.getThisEntity()); - ParticleUtil.spawnPoof((ServerLevel) owner.level, familiarEntity.getThisEntity().blockPosition()); - cap.setLastSummonedFamiliar(familiarID); - } - } - }); - ctx.get().setPacketHandled(true); + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer owner) { + IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(owner).orElse(null); + if (cap == null) + return; + + if(owner == null) + return; + + IFamiliar familiarEntity = cap.getFamiliarData(familiarID).getEntity(owner.level); + familiarEntity.setOwnerID(owner.getUUID()); + familiarEntity.getThisEntity().setPos(owner.getX(), owner.getY(), owner.getZ()); + + FamiliarSummonEvent summonEvent = new FamiliarSummonEvent(familiarEntity.getThisEntity(), owner); + NeoForge.EVENT_BUS.post(summonEvent); + + if (!summonEvent.isCanceled()) { + owner.level.addFreshEntity(familiarEntity.getThisEntity()); + ParticleUtil.spawnPoof((ServerLevel) owner.level, familiarEntity.getThisEntity().blockPosition()); + cap.setLastSummonedFamiliar(familiarID); + } + } + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonLily.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonLily.java index 963ceecf60..18aba729aa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonLily.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonLily.java @@ -1,12 +1,16 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.entity.Lily; -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.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; -public class PacketSummonLily { +public class PacketSummonLily extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("summon_lily")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketSummonLily::toBytes, PacketSummonLily::new); public PacketSummonLily() { @@ -14,27 +18,26 @@ public PacketSummonLily() { } //Decoder - public PacketSummonLily(FriendlyByteBuf buf) { + public PacketSummonLily(RegistryFriendlyByteBuf buf) { } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - if (ctx.get().getSender() != null) { - ServerPlayer player = ctx.get().getSender(); - Lily lily = new Lily(player.level); - lily.setPos(player.getX(), player.getY(), player.getZ()); - lily.setOwnerUUID(player.getUUID()); - player.level.addFreshEntity(lily); - Lily.ownerLilyMap.put(player.getUUID(), lily.getUUID()); - } - }); - ctx.get().setPacketHandled(true); + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + Lily lily = new Lily(player.level); + lily.setPos(player.getX(), player.getY(), player.getZ()); + lily.setOwnerUUID(player.getUUID()); + player.level.addFreshEntity(lily); + Lily.ownerLilyMap.put(player.getUUID(), lily.getUUID()); + } + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncLitEntities.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncLitEntities.java index e2b85b62ad..22d25aee21 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncLitEntities.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncLitEntities.java @@ -1,17 +1,24 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.light.LightManager; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; +import net.minecraft.client.Minecraft; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; + import java.util.ArrayList; import java.util.List; -import java.util.function.Supplier; -public class PacketSyncLitEntities { +public class PacketSyncLitEntities extends AbstractPacket { + public static final Type TYPE = new Type<>(ArsNouveau.prefix("sync_lit_entities")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketSyncLitEntities::toBytes, PacketSyncLitEntities::new); + List entityIDs = new ArrayList<>(); //Decoder - public PacketSyncLitEntities(FriendlyByteBuf buf) { + public PacketSyncLitEntities(RegistryFriendlyByteBuf buf) { int num = buf.readInt(); for (int i = 0; i < num; i++) { entityIDs.add(buf.readInt()); @@ -19,22 +26,25 @@ public PacketSyncLitEntities(FriendlyByteBuf buf) { } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeInt(entityIDs.size()); for (Integer i : entityIDs) buf.writeInt(i); } + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + if (LightManager.shouldUpdateDynamicLight()) { + LightManager.jarHoldingEntityList = entityIDs; + } + } + public PacketSyncLitEntities(List entityIDs) { this.entityIDs = entityIDs; } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - if (LightManager.shouldUpdateDynamicLight()) { - LightManager.jarHoldingEntityList = entityIDs; - } - }); - ctx.get().setPacketHandled(true); + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java index bff29b89db..60a1e37f8c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java @@ -2,24 +2,25 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.capability.ANPlayerDataCap; -import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; +import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; +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.world.entity.player.Player; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; -public class PacketSyncPlayerCap { +public class PacketSyncPlayerCap extends AbstractPacket{ CompoundTag tag; //Decoder - public PacketSyncPlayerCap(FriendlyByteBuf buf) { + public PacketSyncPlayerCap(RegistryFriendlyByteBuf buf) { tag = buf.readNbt(); } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeNbt(tag); } @@ -27,15 +28,20 @@ public PacketSyncPlayerCap(CompoundTag famCaps) { this.tag = famCaps; } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - Player playerEntity = ArsNouveau.proxy.getPlayer(); - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(playerEntity).orElse(new ANPlayerDataCap()); + @Override + public void onClientReceived(Minecraft minecraft, Player playerEntity) { + IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(playerEntity).orElse(new ANPlayerDataCap()); + + if (cap != null) { + cap.deserializeNBT(tag); + } + } + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("sync_player_cap")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketSyncPlayerCap::toBytes, PacketSyncPlayerCap::new); - if (cap != null) { - cap.deserializeNBT(tag); - } - }); - ctx.get().setPacketHandled(true); + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncTag.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncTag.java index 5e75b8d344..c7be8c5faa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncTag.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncTag.java @@ -1,13 +1,15 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; -public class PacketSyncTag { +public class PacketSyncTag extends AbstractPacket{ public CompoundTag tag; public int entityId; @@ -17,35 +19,29 @@ public PacketSyncTag(CompoundTag tag, int entityId){ this.entityId = entityId; } - public static PacketSyncTag decode(FriendlyByteBuf buf) { + public static PacketSyncTag decode(RegistryFriendlyByteBuf buf) { return new PacketSyncTag(buf.readNbt(), buf.readInt()); } - public static void encode(PacketSyncTag msg, FriendlyByteBuf buf) { - buf.writeNbt(msg.tag); - buf.writeInt(msg.entityId); + @Override + public void toBytes(RegistryFriendlyByteBuf buf) { + buf.writeNbt(tag); + buf.writeInt(entityId); } - public static class Handler { - public static void handle(final PacketSyncTag m, final Supplier ctx) { - if (ctx.get().getDirection().getReceptionSide().isServer()) { - ctx.get().setPacketHandled(true); - return; - } - - ctx.get().enqueueWork(new Runnable() { - // Use anon - lambda causes classloading issues - @Override - public void run() { - Minecraft mc = Minecraft.getInstance(); - ClientLevel world = mc.level; - if (world.getEntity(m.entityId) instanceof ITagSyncable tagSyncable) { - tagSyncable.onTagSync(m.tag); - } - } - }); - ctx.get().setPacketHandled(true); - + @Override + public void onClientReceived(Minecraft mc, Player player) { + ClientLevel world = mc.level; + if (world.getEntity(entityId) instanceof ITagSyncable tagSyncable) { + tagSyncable.onTagSync(tag); } } + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("sync_tag")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketSyncTag::toBytes, PacketSyncTag::decode); + + @Override + public Type type() { + return TYPE; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketTimedEvent.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketTimedEvent.java index f23aa98edd..f21d871101 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketTimedEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketTimedEvent.java @@ -1,27 +1,31 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.event.ChimeraSummonEvent; import com.hollingsworth.arsnouveau.api.event.ITimedEvent; import com.hollingsworth.arsnouveau.common.event.timed.EruptionEvent; +import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; + import java.util.HashMap; import java.util.Map; import java.util.function.Function; -import java.util.function.Supplier; -public class PacketTimedEvent { +public class PacketTimedEvent extends AbstractPacket{ CompoundTag tag; //Decoder - public PacketTimedEvent(FriendlyByteBuf buf) { + public PacketTimedEvent(RegistryFriendlyByteBuf buf) { tag = buf.readNbt(); } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeNbt(tag); } @@ -34,13 +38,19 @@ public PacketTimedEvent(ITimedEvent event) { event.serialize(tag); } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - if (!methodMap.containsKey(tag.getString("id"))) - throw new IllegalStateException("No event found for ID or ID missing"); - methodMap.get(tag.getString("id")).apply(tag); - }); - ctx.get().setPacketHandled(true); + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + if (!methodMap.containsKey(tag.getString("id"))) + throw new IllegalStateException("No event found for ID or ID missing"); + methodMap.get(tag.getString("id")).apply(tag); + } + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("timed_event")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketTimedEvent::toBytes, PacketTimedEvent::new); + + @Override + public Type type() { + return TYPE; } public static Map> methodMap = new HashMap<>(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleFamiliar.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleFamiliar.java index 9d737fab6b..83e8556f10 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleFamiliar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleFamiliar.java @@ -1,61 +1,65 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.event.FamiliarSummonEvent; import com.hollingsworth.arsnouveau.api.familiar.IFamiliar; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; -import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.hollingsworth.arsnouveau.common.capability.FamiliarData; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; -import net.minecraft.network.FriendlyByteBuf; +import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.Entity; +import net.minecraft.server.level.ServerPlayer; import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; -public class PacketToggleFamiliar { +public class PacketToggleFamiliar extends AbstractPacket{ public PacketToggleFamiliar() {} //Decoder - public PacketToggleFamiliar(FriendlyByteBuf buf) { + public PacketToggleFamiliar(RegistryFriendlyByteBuf buf) { } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - if (ctx.get().getSender() != null) { - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(ctx.get().getSender()).orElse(null); - if (cap == null) - return; - - - Entity owner = ctx.get().getSender(); - if(PacketDispelFamiliars.dispelForPlayer(owner)){ - return; - } - - FamiliarData lastSummoned = cap.getLastSummonedFamiliar(); - if(lastSummoned == null) - return; - IFamiliar familiarEntity = lastSummoned.getEntity(ctx.get().getSender().level); - familiarEntity.setOwnerID(owner.getUUID()); - familiarEntity.getThisEntity().setPos(owner.getX(), owner.getY(), owner.getZ()); - - FamiliarSummonEvent summonEvent = new FamiliarSummonEvent(familiarEntity.getThisEntity(), owner); - NeoForge.EVENT_BUS.post(summonEvent); - - if (!summonEvent.isCanceled()) { - owner.level.addFreshEntity(familiarEntity.getThisEntity()); - ParticleUtil.spawnPoof((ServerLevel) owner.level, familiarEntity.getThisEntity().blockPosition()); - } - } - }); - ctx.get().setPacketHandled(true); + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer owner) { + IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(owner).orElse(null); + if (cap == null) + return; + + if(PacketDispelFamiliars.dispelForPlayer(owner)){ + return; + } + + FamiliarData lastSummoned = cap.getLastSummonedFamiliar(); + if(lastSummoned == null) + return; + IFamiliar familiarEntity = lastSummoned.getEntity(owner.level); + familiarEntity.setOwnerID(owner.getUUID()); + familiarEntity.getThisEntity().setPos(owner.getX(), owner.getY(), owner.getZ()); + + FamiliarSummonEvent summonEvent = new FamiliarSummonEvent(familiarEntity.getThisEntity(), owner); + NeoForge.EVENT_BUS.post(summonEvent); + + if (!summonEvent.isCanceled()) { + owner.level.addFreshEntity(familiarEntity.getThisEntity()); + ParticleUtil.spawnPoof((ServerLevel) owner.level, familiarEntity.getThisEntity().blockPosition()); + } + } + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("toggle_familiar")); + + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketToggleFamiliar::toBytes, PacketToggleFamiliar::new); + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleLight.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleLight.java index 05f4ce88c4..70af40691b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleLight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleLight.java @@ -1,20 +1,23 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.light.LightManager; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; +import net.minecraft.client.Minecraft; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; -public class PacketToggleLight { +public class PacketToggleLight extends AbstractPacket { boolean enabled; //Decoder - public PacketToggleLight(FriendlyByteBuf buf) { + public PacketToggleLight(RegistryFriendlyByteBuf buf) { enabled = buf.readBoolean(); } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeBoolean(enabled); } @@ -22,11 +25,17 @@ public PacketToggleLight(boolean stack) { this.enabled = stack; } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - LightManager.toggleLightsAndConfig(enabled); - }); - ctx.get().setPacketHandled(true); + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + LightManager.toggleLightsAndConfig(enabled); } + public static final Type TYPE = new Type<>(ArsNouveau.prefix("toggle_light")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketToggleLight::toBytes, PacketToggleLight::new); + + + @Override + public Type type() { + return TYPE; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketTogglePathing.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketTogglePathing.java deleted file mode 100644 index 785a7158e1..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketTogglePathing.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.hollingsworth.arsnouveau.common.network; - -import com.hollingsworth.arsnouveau.common.entity.pathfinding.pathjobs.AbstractPathJob; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; - -public class PacketTogglePathing { - - - //Decoder - public PacketTogglePathing(FriendlyByteBuf buf) { - } - - //Encoder - public void toBytes(FriendlyByteBuf buf) { - - } - - public PacketTogglePathing() { - } - - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> AbstractPathJob.DEBUG_DRAW = !AbstractPathJob.DEBUG_DRAW); - ctx.get().setPacketHandled(true); - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUnsummonLily.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUnsummonLily.java index 78d1624cbd..b18977cd71 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUnsummonLily.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUnsummonLily.java @@ -1,15 +1,18 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.entity.Lily; -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.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; -import net.neoforged.neoforge.network.NetworkEvent; + import java.util.UUID; -import java.util.function.Supplier; -public class PacketUnsummonLily { +public class PacketUnsummonLily extends AbstractPacket { public PacketUnsummonLily() { @@ -17,30 +20,32 @@ public PacketUnsummonLily() { } //Decoder - public PacketUnsummonLily(FriendlyByteBuf buf) { + public PacketUnsummonLily(RegistryFriendlyByteBuf buf) { } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - if (ctx.get().getSender() != null) { - ServerPlayer serverPlayer = ctx.get().getSender(); - ServerLevel level = (ServerLevel) serverPlayer.level(); - UUID lilyUuid = Lily.ownerLilyMap.get(ctx.get().getSender().getUUID()); - if (lilyUuid != null) { - Lily lily = (Lily) level.getEntity(lilyUuid); - if (lily != null) { - lily.remove(Entity.RemovalReason.DISCARDED); - } - } + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + ServerLevel level = (ServerLevel) player.level(); + UUID lilyUuid = Lily.ownerLilyMap.get(player.getUUID()); + if (lilyUuid != null) { + Lily lily = (Lily) level.getEntity(lilyUuid); + if (lily != null) { + lily.remove(Entity.RemovalReason.DISCARDED); } - }); - ctx.get().setPacketHandled(true); + } + } + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("unsummon_lily")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketUnsummonLily::toBytes, PacketUnsummonLily::new); + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateBookGUI.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateBookGUI.java index aa9fffaec9..7c1cb01d47 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateBookGUI.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateBookGUI.java @@ -2,22 +2,25 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.gui.book.GuiSpellBook; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; - -public class PacketUpdateBookGUI { +public class PacketUpdateBookGUI extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("update_book_gui")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketUpdateBookGUI::toBytes, PacketUpdateBookGUI::new); public ItemStack bookStack; //Decoder - public PacketUpdateBookGUI(FriendlyByteBuf buf) { + public PacketUpdateBookGUI(RegistryFriendlyByteBuf buf) { bookStack = buf.readItem(); } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeItem(bookStack); } @@ -25,12 +28,14 @@ public PacketUpdateBookGUI(ItemStack stack) { this.bookStack = stack; } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - if (ArsNouveau.proxy.getMinecraft().screen instanceof GuiSpellBook) - ((GuiSpellBook) ArsNouveau.proxy.getMinecraft().screen).bookStack = bookStack; - }); - ctx.get().setPacketHandled(true); + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + if (ArsNouveau.proxy.getMinecraft().screen instanceof GuiSpellBook) + ((GuiSpellBook) ArsNouveau.proxy.getMinecraft().screen).bookStack = bookStack; } + @Override + public Type type() { + return TYPE; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java index 22c2b6f4b5..9a79eb4b8b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java @@ -1,17 +1,19 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.item.ICasterTool; import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.api.util.CasterUtil; -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.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.network.NetworkEvent; -import net.neoforged.neoforge.network.PacketDistributor; -import java.util.function.Supplier; -public class PacketUpdateCaster { +public class PacketUpdateCaster extends AbstractPacket{ Spell spellRecipe; int cast_slot; @@ -26,7 +28,7 @@ public PacketUpdateCaster(Spell spellRecipe, int cast_slot, String spellName, bo } //Decoder - public PacketUpdateCaster(FriendlyByteBuf buf) { + public PacketUpdateCaster(RegistryFriendlyByteBuf buf) { spellRecipe = Spell.fromTag(buf.readNbt()); cast_slot = buf.readInt(); spellName = buf.readUtf(32767); @@ -34,32 +36,36 @@ public PacketUpdateCaster(FriendlyByteBuf buf) { } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeNbt(spellRecipe.serialize()); buf.writeInt(cast_slot); buf.writeUtf(spellName); buf.writeBoolean(mainHand); } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - if (ctx.get().getSender() != null) { - InteractionHand hand = mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; - ItemStack stack = ctx.get().getSender().getItemInHand(hand); - if(!(stack.getItem() instanceof ICasterTool)) - return; - if (spellRecipe != null) { - ISpellCaster caster = CasterUtil.getCaster(stack); - caster.setCurrentSlot(cast_slot); - // Update just the recipe, don't overwrite the entire spell. - Spell spell = caster.getSpell(cast_slot).setRecipe(spellRecipe.recipe); - caster.setSpell(spell, cast_slot); - caster.setSpellName(spellName, cast_slot); + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + InteractionHand hand = mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; + ItemStack stack = player.getItemInHand(hand); + if(!(stack.getItem() instanceof ICasterTool)) + return; + if (spellRecipe != null) { + ISpellCaster caster = CasterUtil.getCaster(stack); + caster.setCurrentSlot(cast_slot); + // Update just the recipe, don't overwrite the entire spell. + Spell spell = caster.getSpell(cast_slot).setRecipe(spellRecipe.recipe); + caster.setSpell(spell, cast_slot); + caster.setSpellName(spellName, cast_slot); - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> ctx.get().getSender()), new PacketUpdateBookGUI(stack)); - } - } - }); - ctx.get().setPacketHandled(true); + Networking.sendToPlayerClient(new PacketUpdateBookGUI(stack), player); + } + } + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("update_caster")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketUpdateCaster::toBytes, PacketUpdateCaster::new); + + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateFlight.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateFlight.java index c2826271a6..cd865dd8e3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateFlight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateFlight.java @@ -1,23 +1,25 @@ package com.hollingsworth.arsnouveau.common.network; import com.hollingsworth.arsnouveau.ArsNouveau; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; +import net.minecraft.client.Minecraft; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; -public class PacketUpdateFlight { +public class PacketUpdateFlight extends AbstractPacket{ public boolean canFly; public boolean wasFlying; //Decoder - public PacketUpdateFlight(FriendlyByteBuf buf) { + public PacketUpdateFlight(RegistryFriendlyByteBuf buf) { canFly = buf.readBoolean(); wasFlying = buf.readBoolean(); } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeBoolean(canFly); buf.writeBoolean(wasFlying); } @@ -31,12 +33,16 @@ public PacketUpdateFlight(boolean canFly, boolean wasFlying) { this.wasFlying = wasFlying; } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - ArsNouveau.proxy.getPlayer().getAbilities().mayfly = canFly; - ArsNouveau.proxy.getPlayer().getAbilities().flying = wasFlying; - }); - ctx.get().setPacketHandled(true); + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + ArsNouveau.proxy.getPlayer().getAbilities().mayfly = canFly; + ArsNouveau.proxy.getPlayer().getAbilities().flying = wasFlying; } + public static final Type TYPE = new Type<>(ArsNouveau.prefix("update_flight")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketUpdateFlight::toBytes, PacketUpdateFlight::new); + @Override + public Type type() { + return TYPE; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateMana.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateMana.java index 1f89da4c0a..0225d32fd6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateMana.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateMana.java @@ -3,11 +3,13 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.ClientInfo; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; +import net.minecraft.client.Minecraft; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; -public class PacketUpdateMana { +public class PacketUpdateMana extends AbstractPacket{ public double mana; @@ -19,7 +21,7 @@ public class PacketUpdateMana { public float reserved; //Decoder - public PacketUpdateMana(FriendlyByteBuf buf) { + public PacketUpdateMana(RegistryFriendlyByteBuf buf) { mana = buf.readDouble(); maxMana = buf.readInt(); glyphBonus = buf.readInt(); @@ -28,7 +30,7 @@ public PacketUpdateMana(FriendlyByteBuf buf) { } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeDouble(mana); buf.writeInt(maxMana); buf.writeInt(glyphBonus); @@ -52,20 +54,24 @@ public PacketUpdateMana(double mana, int maxMana, int glyphBonus, int tierBonus) this.reserved = -1; } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - if (ArsNouveau.proxy.getPlayer() == null) - return; - CapabilityRegistry.getMana(ArsNouveau.proxy.getPlayer()).ifPresent(mana -> { - mana.setMana(this.mana); - mana.setMaxMana(this.maxMana); - mana.setGlyphBonus(this.glyphBonus); - mana.setBookTier(this.tierBonus); - }); - //sync the client cache of reserved mana - if (ctx.get().getDirection().getReceptionSide().isClient() && reserved != -1) - ClientInfo.reservedOverlayMana = reserved; - }); - ctx.get().setPacketHandled(true); + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + var cap = CapabilityRegistry.getMana(ArsNouveau.proxy.getPlayer()).orElse(null); + if(cap != null){ + cap.setMana(this.mana); + cap.setMaxMana(this.maxMana); + cap.setGlyphBonus(this.glyphBonus); + cap.setBookTier(this.tierBonus); + } + //sync the client cache of reserved mana + ClientInfo.reservedOverlayMana = reserved; + } + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("update_mana")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketUpdateMana::toBytes, PacketUpdateMana::new); + + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColorAll.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColorAll.java index 7c0854e237..f38ca2d02e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColorAll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColorAll.java @@ -1,47 +1,50 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.items.SpellBook; -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.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.network.NetworkEvent; -import net.neoforged.neoforge.network.PacketDistributor; -import java.util.function.Supplier; public class PacketUpdateSpellColorAll extends PacketUpdateSpellColors { public PacketUpdateSpellColorAll(int slot, ParticleColor color, boolean mainHand) { super(slot, color, mainHand); } - public PacketUpdateSpellColorAll(FriendlyByteBuf buf) { + public PacketUpdateSpellColorAll(RegistryFriendlyByteBuf buf) { super(buf); } - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { super.toBytes(buf); } + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + ItemStack stack = player.getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); + if (stack.getItem() instanceof SpellBook) { + ISpellCaster caster = CasterUtil.getCaster(stack); + for (int i = 0; i < caster.getMaxSlots(); i++) { + caster.setColor(color, i); + } + caster.setCurrentSlot(castSlot); + Networking.sendToPlayerClient(new PacketUpdateBookGUI(stack), player); + Networking.sendToPlayerClient(new PacketOpenSpellBook(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND), player); - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - if (ctx.get().getSender() != null) { - ItemStack stack = ctx.get().getSender().getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); - if (stack.getItem() instanceof SpellBook) { - ISpellCaster caster = CasterUtil.getCaster(stack); - for (int i = 0; i < caster.getMaxSlots(); i++) { - caster.setColor(color, i); - } - caster.setCurrentSlot(castSlot); - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> ctx.get().getSender()), new PacketUpdateBookGUI(stack)); - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> ctx.get().getSender()), - new PacketOpenSpellBook(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND)); + } + } + public static final Type TYPE = new Type<>(ArsNouveau.prefix("update_spell_color_all")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketUpdateSpellColorAll::toBytes, PacketUpdateSpellColorAll::new); - } - } - }); - ctx.get().setPacketHandled(true); + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColors.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColors.java index d041a679d0..fce8ffa1e0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColors.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColors.java @@ -1,18 +1,20 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.items.SpellBook; -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.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.network.NetworkEvent; -import net.neoforged.neoforge.network.PacketDistributor; -import java.util.function.Supplier; -public class PacketUpdateSpellColors { +public class PacketUpdateSpellColors extends AbstractPacket{ int castSlot; ParticleColor color; @@ -25,34 +27,36 @@ public PacketUpdateSpellColors(int slot, ParticleColor color, boolean mainHand) } //Decoder - public PacketUpdateSpellColors(FriendlyByteBuf buf) { + public PacketUpdateSpellColors(RegistryFriendlyByteBuf buf) { castSlot = buf.readInt(); color = ParticleColorRegistry.from(buf.readNbt()); mainHand = buf.readBoolean(); } //Encoder - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeInt(castSlot); buf.writeNbt(color.serialize()); buf.writeBoolean(mainHand); } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - if (ctx.get().getSender() != null) { - ItemStack stack = ctx.get().getSender().getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); - if (stack.getItem() instanceof SpellBook) { - ISpellCaster caster = CasterUtil.getCaster(stack); - caster.setColor(color, castSlot); - caster.setCurrentSlot(castSlot); - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> ctx.get().getSender()), new PacketUpdateBookGUI(stack)); - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> ctx.get().getSender()), - new PacketOpenSpellBook(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND)); - - } - } - }); - ctx.get().setPacketHandled(true); + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + ItemStack stack = player.getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); + if (stack.getItem() instanceof SpellBook) { + ISpellCaster caster = CasterUtil.getCaster(stack); + caster.setColor(color, castSlot); + caster.setCurrentSlot(castSlot); + Networking.sendToPlayerClient(new PacketUpdateBookGUI(stack), player); + Networking.sendToPlayerClient( new PacketOpenSpellBook(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND), player); + } + } + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("update_spell_colors")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketUpdateSpellColors::toBytes, PacketUpdateSpellColors::new); + + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java index 40eb7e8480..02023d0ef9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java @@ -1,44 +1,45 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.common.items.SpellBook; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.network.NetworkEvent; -import net.neoforged.neoforge.network.PacketDistributor; -import java.util.function.Supplier; public class PacketUpdateSpellSoundAll extends PacketSetSound { + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("update_spell_sound_all")); + + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketUpdateSpellSoundAll::toBytes, PacketUpdateSpellSoundAll::new); + public PacketUpdateSpellSoundAll(int castSlot, ConfiguredSpellSound sound, boolean mainHand) { super(castSlot, sound, mainHand); } - public PacketUpdateSpellSoundAll(FriendlyByteBuf buf) { + public PacketUpdateSpellSoundAll(RegistryFriendlyByteBuf buf) { super(buf); } - public void toBytes(FriendlyByteBuf buf) { + public void toBytes(RegistryFriendlyByteBuf buf) { super.toBytes(buf); } - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - if (ctx.get().getSender() != null) { - ItemStack stack = ctx.get().getSender().getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); - if (stack.getItem() instanceof SpellBook) { - ISpellCaster caster = CasterUtil.getCaster(stack); - for (int i = 0; i < caster.getMaxSlots(); i++) { - caster.setSound(sound, i); - } - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> ctx.get().getSender()), new PacketUpdateBookGUI(stack)); - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> ctx.get().getSender()), - new PacketOpenSpellBook(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND)); - } + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + ItemStack stack = player.getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); + if (stack.getItem() instanceof SpellBook) { + ISpellCaster caster = CasterUtil.getCaster(stack); + for (int i = 0; i < caster.getMaxSlots(); i++) { + caster.setSound(sound, i); } - }); - ctx.get().setPacketHandled(true); + Networking.sendToPlayerClient(new PacketUpdateBookGUI(stack), player); + Networking.sendToPlayerClient(new PacketOpenSpellBook(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND), player); + } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketWarpPosition.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketWarpPosition.java index 54d9589a62..9e3aa9725c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketWarpPosition.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketWarpPosition.java @@ -1,13 +1,15 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; -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.world.entity.Entity; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; +import net.minecraft.world.entity.player.Player; -public class PacketWarpPosition { +public class PacketWarpPosition extends AbstractPacket{ private final int entityID; double x; double y; @@ -31,42 +33,41 @@ public PacketWarpPosition(int id, double x, double y, double z, float xRot, floa this.yRot = yRot; } - public static PacketWarpPosition decode(FriendlyByteBuf buf) { - return new PacketWarpPosition(buf.readInt(), buf.readDouble(), buf.readDouble(), buf.readDouble(), buf.readFloat(), buf.readFloat()); + public PacketWarpPosition(RegistryFriendlyByteBuf buf) { + entityID = buf.readInt(); + x = buf.readDouble(); + y = buf.readDouble(); + z = buf.readDouble(); + xRot = buf.readFloat(); + yRot = buf.readFloat(); } - public static void encode(PacketWarpPosition msg, FriendlyByteBuf buf) { - buf.writeInt(msg.entityID); - buf.writeDouble(msg.x); - buf.writeDouble(msg.y); - buf.writeDouble(msg.z); - buf.writeFloat(msg.xRot); - buf.writeFloat(msg.yRot); + @Override + public void toBytes(RegistryFriendlyByteBuf buf) { + buf.writeInt(entityID); + buf.writeDouble(x); + buf.writeDouble(y); + buf.writeDouble(z); + buf.writeFloat(xRot); + buf.writeFloat(yRot); } - public static class Handler { - public static void handle(final PacketWarpPosition message, final Supplier ctx) { - if (ctx.get().getDirection().getReceptionSide().isServer()) { - ctx.get().setPacketHandled(true); - return; - } + @Override + public void onClientReceived(Minecraft mc, Player player) { + ClientLevel world = mc.level; + Entity e = world.getEntity(entityID); + if (e == null) + return; + e.setPos(x, y, z); + e.setXRot(xRot); + e.setYRot(yRot); + } - ctx.get().enqueueWork(new Runnable() { - // Use anon - lambda causes classloading issues - @Override - public void run() { - Minecraft mc = Minecraft.getInstance(); - ClientLevel world = mc.level; - Entity e = world.getEntity(message.entityID); - if (e == null) - return; - e.setPos(message.x, message.y, message.z); - e.setXRot(message.xRot); - e.setYRot(message.yRot); - } - }); - ctx.get().setPacketHandled(true); + public static final Type TYPE = new Type<>(ArsNouveau.prefix("warp_position")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketWarpPosition::toBytes, PacketWarpPosition::new); - } + @Override + public Type type() { + return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PotionSyncPacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PotionSyncPacket.java index 4371540eab..f8c4355117 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PotionSyncPacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PotionSyncPacket.java @@ -2,17 +2,16 @@ import com.hollingsworth.arsnouveau.ArsNouveau; 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.effect.MobEffect; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.LivingEntity; -import net.neoforged.neoforge.network.NetworkDirection; -import net.neoforged.neoforge.network.NetworkEvent; +import net.minecraft.world.entity.player.Player; -import java.util.function.Supplier; - -public class PotionSyncPacket { +public class PotionSyncPacket extends AbstractPacket{ public int entity; public int duration; @@ -30,40 +29,40 @@ public PotionSyncPacket(int entity, MobEffect effect, int duration) { this.duration = duration; } - public void toBytes(FriendlyByteBuf friendlyByteBuf) { - friendlyByteBuf.writeInt(this.entity); - friendlyByteBuf.writeResourceLocation(this.effect); - friendlyByteBuf.writeInt(this.duration); + public void toBytes(RegistryFriendlyByteBuf RegistryFriendlyByteBuf) { + RegistryFriendlyByteBuf.writeInt(this.entity); + RegistryFriendlyByteBuf.writeResourceLocation(this.effect); + RegistryFriendlyByteBuf.writeInt(this.duration); } - public PotionSyncPacket(FriendlyByteBuf friendlyByteBuf) { - this.entity = friendlyByteBuf.readInt(); - this.effect = friendlyByteBuf.readResourceLocation(); - this.duration = friendlyByteBuf.readInt(); + public PotionSyncPacket(RegistryFriendlyByteBuf RegistryFriendlyByteBuf) { + this.entity = RegistryFriendlyByteBuf.readInt(); + this.effect = RegistryFriendlyByteBuf.readResourceLocation(); + this.duration = RegistryFriendlyByteBuf.readInt(); } - public void handle(Supplier contextSupplier) { - - if (contextSupplier.get().getDirection() != NetworkDirection.PLAY_TO_CLIENT) return; - contextSupplier.get().enqueueWork(() -> { - - Minecraft mc = ArsNouveau.proxy.getMinecraft(); - if (mc != null && mc.level != null) - if (mc.level.getEntity(this.entity) instanceof LivingEntity living && living != ArsNouveau.proxy.getPlayer()) { - MobEffect effect = ForgeRegistries.MOB_EFFECTS.getValue(this.effect); - if (effect == null) return; - if (duration > 0) { - living.addEffect(new MobEffectInstance(effect, duration, 0, false, false, false)); - } else { - living.removeEffect(effect); - } - } - }); - contextSupplier.get().setPacketHandled(true); - + @Override + public void onClientReceived(Minecraft mc, Player player) { + if (mc.level.getEntity(this.entity) instanceof LivingEntity living && living != ArsNouveau.proxy.getPlayer()) { + MobEffect effect = ForgeRegistries.MOB_EFFECTS.getValue(this.effect); + if (effect == null) return; + if (duration > 0) { + living.addEffect(new MobEffectInstance(effect, duration, 0, false, false, false)); + } else { + living.removeEffect(effect); + } + } } public static ResourceLocation getRegistryName(MobEffect effect) { return ForgeRegistries.MOB_EFFECTS.getKey(effect); } + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("potion_sync")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PotionSyncPacket::toBytes, PotionSyncPacket::new); + + @Override + public Type type() { + return TYPE; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/ServerToClientStoragePacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/ServerToClientStoragePacket.java index 737ef5e23e..1307377631 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/ServerToClientStoragePacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/ServerToClientStoragePacket.java @@ -1,41 +1,41 @@ package com.hollingsworth.arsnouveau.common.network; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.container.AbstractStorageTerminalScreen; import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkDirection; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.function.Supplier; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; -public class ServerToClientStoragePacket { +public class ServerToClientStoragePacket extends AbstractPacket{ public CompoundTag tag; public ServerToClientStoragePacket(CompoundTag tag) { this.tag = tag; } - public ServerToClientStoragePacket(FriendlyByteBuf pb) { - tag = pb.readAnySizeNbt(); + public ServerToClientStoragePacket(RegistryFriendlyByteBuf pb) { + tag = pb.readNbt(); } - public void toBytes(FriendlyByteBuf pb) { + public void toBytes(RegistryFriendlyByteBuf pb) { pb.writeNbt(tag); } - public static class Handler { - - @SuppressWarnings("Convert2Lambda") - public static boolean onMessage(ServerToClientStoragePacket message, Supplier ctx) { - if (ctx.get().getDirection() == NetworkDirection.PLAY_TO_CLIENT) { - ctx.get().enqueueWork(() -> { - if (Minecraft.getInstance().screen instanceof AbstractStorageTerminalScreen terminalScreen) { - terminalScreen.receive(message.tag); - } - }); - } - ctx.get().setPacketHandled(true); - return true; + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + if (minecraft.screen instanceof AbstractStorageTerminalScreen terminalScreen) { + terminalScreen.receive(tag); } } + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("server_to_client_storage")); + public static final StreamCodec CODEC = StreamCodec.ofMember(ServerToClientStoragePacket::toBytes, ServerToClientStoragePacket::new); + + @Override + public Type type() { + return TYPE; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/SyncPathMessage.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/SyncPathMessage.java deleted file mode 100644 index 4f1e00c64e..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/SyncPathMessage.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.hollingsworth.arsnouveau.common.network; - -import com.hollingsworth.arsnouveau.client.renderer.world.PathfindingDebugRenderer; -import com.hollingsworth.arsnouveau.common.entity.pathfinding.ModNode; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.HashSet; -import java.util.Set; -import java.util.function.Supplier; - -/** - * Message to sync some path over to the client. - */ -public class SyncPathMessage -{ - /** - * Set of visited nodes. - */ - public Set lastDebugNodesVisited = new HashSet<>(); - - /** - * Set of not visited nodes. - */ - public Set lastDebugNodesNotVisited = new HashSet<>(); - - /** - * Set of chosen nodes for the path. - */ - public Set lastDebugNodesPath = new HashSet<>(); - - /** - * Default constructor. - */ - public SyncPathMessage() - { - super(); - } - - /** - * Create a new path message with the filled pathpoints. - */ - public SyncPathMessage(final Set lastDebugNodesVisited, final Set lastDebugNodesNotVisited, final Set lastDebugNodesPath) - { - super(); - this.lastDebugNodesVisited = lastDebugNodesVisited; - this.lastDebugNodesNotVisited = lastDebugNodesNotVisited; - this.lastDebugNodesPath = lastDebugNodesPath; - } - - public void toBytes(final FriendlyByteBuf buf) - { - buf.writeInt(lastDebugNodesVisited.size()); - for (final ModNode node : lastDebugNodesVisited) - { - node.serializeToBuf(buf); - } - - buf.writeInt(lastDebugNodesNotVisited.size()); - for (final ModNode node : lastDebugNodesNotVisited) - { - node.serializeToBuf(buf); - } - - buf.writeInt(lastDebugNodesPath.size()); - for (final ModNode node : lastDebugNodesPath) - { - node.serializeToBuf(buf); - } - } - - public SyncPathMessage(final FriendlyByteBuf buf) - { - int size = buf.readInt(); - for (int i = 0; i < size; i++) - { - lastDebugNodesVisited.add(new ModNode(buf)); - } - - size = buf.readInt(); - for (int i = 0; i < size; i++) - { - lastDebugNodesNotVisited.add(new ModNode(buf)); - } - - size = buf.readInt(); - for (int i = 0; i < size; i++) - { - lastDebugNodesPath.add(new ModNode(buf)); - } - } - - public static class Handler { - public static void handle(final SyncPathMessage m, final Supplier ctx) { - if (ctx.get().getDirection().getReceptionSide().isServer()) { - ctx.get().setPacketHandled(true); - return; - } - - ctx.get().enqueueWork(new Runnable() { - // Use anon - lambda causes classloading issues - @Override - public void run() { - PathfindingDebugRenderer.lastDebugNodesVisited = m.lastDebugNodesVisited; - PathfindingDebugRenderer.lastDebugNodesNotVisited = m.lastDebugNodesNotVisited; - PathfindingDebugRenderer.lastDebugNodesPath = m.lastDebugNodesPath; - } - }); - ctx.get().setPacketHandled(true); - - } - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/SyncPathReachedMessage.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/SyncPathReachedMessage.java deleted file mode 100644 index b95803ec12..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/SyncPathReachedMessage.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.hollingsworth.arsnouveau.common.network; - -import com.hollingsworth.arsnouveau.client.renderer.world.PathfindingDebugRenderer; -import com.hollingsworth.arsnouveau.common.entity.pathfinding.ModNode; -import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; -import net.neoforged.neoforge.network.NetworkEvent; -import java.util.HashSet; -import java.util.Set; -import java.util.function.Supplier; - -/** - * Message to sync the reached positions over to the client for rendering. - */ -public class SyncPathReachedMessage -{ - /** - * Set of reached positions. - */ - public Set reached = new HashSet<>(); - - /** - * Default constructor. - */ - public SyncPathReachedMessage() - { - super(); - } - - /** - * Create the message to send a set of positions over to the client side. - * - */ - public SyncPathReachedMessage(final Set reached) - { - super(); - this.reached = reached; - } - - - public void toBytes(final FriendlyByteBuf buf) - { - buf.writeInt(reached.size()); - for (final BlockPos node : reached) - { - buf.writeBlockPos(node); - } - } - - - public SyncPathReachedMessage(final FriendlyByteBuf buf) - { - int size = buf.readInt(); - for (int i = 0; i < size; i++) - { - reached.add(buf.readBlockPos()); - } - } - - public static class Handler { - public static void handle(final SyncPathReachedMessage m, final Supplier ctx) { - if (ctx.get().getDirection().getReceptionSide().isServer()) { - ctx.get().setPacketHandled(true); - return; - } - - ctx.get().enqueueWork(new Runnable() { - // Use anon - lambda causes classloading issues - @Override - public void run() { - for (final ModNode node : PathfindingDebugRenderer.lastDebugNodesPath) - { - if (m.reached.contains(node.pos)) - { - node.setReachedByWorker(true); - } - } - } - }); - ctx.get().setPacketHandled(true); - - } - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ChillingPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ChillingPerk.java index b3588f0683..7e2306a9f3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ChillingPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ChillingPerk.java @@ -36,7 +36,7 @@ public void onPreResolve(HitResult rayTraceResult, Level world, @NotNull LivingE if(effect instanceof IDamageEffect damageEffect && rayTraceResult instanceof EntityHitResult entityHitResult && entityHitResult.getEntity() instanceof LivingEntity livingEntity){ if(damageEffect.canDamage(shooter, spellStats, spellContext, resolver, entityHitResult.getEntity()) && shooter != entityHitResult.getEntity()){ livingEntity.setTicksFrozen(livingEntity.getTicksFrozen() + 1); - livingEntity.addEffect(new MobEffectInstance(ModPotions.FREEZING_EFFECT.get(), perkInstance.getSlot().value * 10 * 20, perkInstance.getSlot().value >= 3 ? 2 : 1)); + livingEntity.addEffect(new MobEffectInstance(ModPotions.FREEZING_EFFECT, perkInstance.getSlot().value * 10 * 20, perkInstance.getSlot().value >= 3 ? 2 : 1)); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/DepthsPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/DepthsPerk.java index 5e34afe87c..895a9ed5c3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/DepthsPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/DepthsPerk.java @@ -10,12 +10,10 @@ import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.common.NeoForgeMod; -import java.util.UUID; public class DepthsPerk extends Perk { public static DepthsPerk INSTANCE = new DepthsPerk(ArsNouveau.prefix( "thread_depths")); - public static final UUID PERK_UUID = UUID.fromString("ce320c42-9d63-4b83-9e69-ef144790d667"); public DepthsPerk(ResourceLocation key) { super(key); @@ -25,7 +23,7 @@ public DepthsPerk(ResourceLocation key) { public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { ImmutableMultimap.Builder modifiers = new ImmutableMultimap.Builder<>(); if(slotValue >= 3){ - modifiers.put(NeoForgeMod.SWIM_SPEED.get(), new AttributeModifier(PERK_UUID, "DepthsPerk", 2.0, AttributeModifier.Operation.ADDITION)); + modifiers.put(NeoForgeMod.SWIM_SPEED.value(), new AttributeModifier(INSTANCE.getRegistryName(), 2.0, AttributeModifier.Operation.ADD_VALUE)); } return modifiers.build(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/FeatherPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/FeatherPerk.java index 8c1ca2c7b6..83345b4b59 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/FeatherPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/FeatherPerk.java @@ -10,12 +10,9 @@ import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ItemStack; -import java.util.UUID; - public class FeatherPerk extends Perk { public static final FeatherPerk INSTANCE = new FeatherPerk(ArsNouveau.prefix( "thread_feather")); - public static final UUID PERK_UUID = UUID.fromString("3923ee66-756d-4b1d-b216-bb9338b0315b"); public FeatherPerk(ResourceLocation key) { super(key); @@ -23,7 +20,7 @@ public FeatherPerk(ResourceLocation key) { @Override public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - return attributeBuilder().put(PerkAttributes.FEATHER.get(), new AttributeModifier(PERK_UUID, "Feather", 0.2 * slotValue, AttributeModifier.Operation.ADDITION)).build(); + return attributeBuilder().put(PerkAttributes.FEATHER.get(), new AttributeModifier(INSTANCE.getRegistryName(), 0.2 * slotValue, AttributeModifier.Operation.ADD_VALUE)).build(); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/GlidingPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/GlidingPerk.java index f1f7873b3a..6b34b2b17a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/GlidingPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/GlidingPerk.java @@ -5,12 +5,9 @@ import com.hollingsworth.arsnouveau.api.perk.PerkSlot; import net.minecraft.resources.ResourceLocation; -import java.util.UUID; - public class GlidingPerk extends Perk { public static final GlidingPerk INSTANCE = new GlidingPerk(ArsNouveau.prefix( "thread_gliding")); - public static final UUID PERK_UUID = UUID.fromString("556fd264-22f2-4454-85b1-19070179f09a"); public GlidingPerk(ResourceLocation key) { super(key); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/IgnitePerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/IgnitePerk.java index e035055747..8c80fb3e87 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/IgnitePerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/IgnitePerk.java @@ -33,7 +33,7 @@ public String getLangName() { public void onPreResolve(HitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver, AbstractEffect effect, PerkInstance perkInstance) { if(effect instanceof IDamageEffect damageEffect && rayTraceResult instanceof EntityHitResult entityHitResult){ if(damageEffect.canDamage(shooter, spellStats, spellContext, resolver, entityHitResult.getEntity()) && shooter != entityHitResult.getEntity()){ - entityHitResult.getEntity().setSecondsOnFire(20 * 5 * perkInstance.getSlot().value); + entityHitResult.getEntity().setRemainingFireTicks(20 * 5 * perkInstance.getSlot().value); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ImmolatePerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ImmolatePerk.java index 757b51ac78..8f6abc1336 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ImmolatePerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ImmolatePerk.java @@ -26,11 +26,11 @@ public void onSpellCast(SpellCastEvent spellCastEvent, PerkInstance perkInstance if(caster.isOnFire()){ caster.extinguishFire(); - caster.addEffect(new MobEffectInstance(ModPotions.IMMOLATE_EFFECT.get(), 20 * 5, level - 1)); + caster.addEffect(new MobEffectInstance(ModPotions.IMMOLATE_EFFECT, 20 * 5, level - 1)); } if(caster.level.getBlockState(caster.blockPosition()).is(BlockTags.FIRE)){ caster.level.removeBlock(caster.blockPosition(), false); - caster.addEffect(new MobEffectInstance(ModPotions.IMMOLATE_EFFECT.get(), 20 * 5, level - 1)); + caster.addEffect(new MobEffectInstance(ModPotions.IMMOLATE_EFFECT, 20 * 5, level - 1)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/JumpHeightPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/JumpHeightPerk.java index 8d5d8d6e48..3fcd074b53 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/JumpHeightPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/JumpHeightPerk.java @@ -4,12 +4,9 @@ import com.hollingsworth.arsnouveau.api.perk.Perk; import net.minecraft.resources.ResourceLocation; -import java.util.UUID; - public class JumpHeightPerk extends Perk { public static final JumpHeightPerk INSTANCE = new JumpHeightPerk(ArsNouveau.prefix( "thread_heights")); - public static final UUID PERK_UUID = UUID.fromString("e5f68a8c-589f-4dde-978d-b4c507a4485b"); public JumpHeightPerk(ResourceLocation key) { super(key); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/KnockbackResistPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/KnockbackResistPerk.java index 33cb1788ad..a01bc23ace 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/KnockbackResistPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/KnockbackResistPerk.java @@ -10,12 +10,9 @@ import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.ItemStack; -import java.util.UUID; - public class KnockbackResistPerk extends Perk { public static final KnockbackResistPerk INSTANCE = new KnockbackResistPerk(ArsNouveau.prefix( "thread_amethyst_golem")); - public static final UUID PERK_UUID = UUID.fromString("b1d84c5d-4c84-4626-b275-94698b08aae1"); public KnockbackResistPerk(ResourceLocation key) { super(key); @@ -23,7 +20,7 @@ public KnockbackResistPerk(ResourceLocation key) { @Override public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - return attributeBuilder().put(Attributes.KNOCKBACK_RESISTANCE, new AttributeModifier(PERK_UUID, "KnockbackPerk", .15 * slotValue, AttributeModifier.Operation.ADDITION)).build(); + return attributeBuilder().put(Attributes.KNOCKBACK_RESISTANCE.value(), new AttributeModifier(INSTANCE.getRegistryName(), .15 * slotValue, AttributeModifier.Operation.ADD_VALUE)).build(); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/LootingPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/LootingPerk.java index 9d55b06e30..888be39c4c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/LootingPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/LootingPerk.java @@ -4,12 +4,9 @@ import com.hollingsworth.arsnouveau.api.perk.Perk; import net.minecraft.resources.ResourceLocation; -import java.util.UUID; - public class LootingPerk extends Perk { public static final LootingPerk INSTANCE = new LootingPerk(ArsNouveau.prefix( "thread_drygmy")); - public static final UUID PERK_UUID = UUID.fromString("ff9459e5-ec2c-44c8-ac3b-19c78c76b4bb"); public LootingPerk(ResourceLocation key) { super(key); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicCapacityPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicCapacityPerk.java index f9fb7edb49..183a3bf585 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicCapacityPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicCapacityPerk.java @@ -10,12 +10,9 @@ import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ItemStack; -import java.util.UUID; - public class MagicCapacityPerk extends Perk { public static final MagicCapacityPerk INSTANCE = new MagicCapacityPerk(ArsNouveau.prefix( "thread_magic_capacity")); - public static final UUID PERK_UUID = UUID.fromString("42ebba5f-7843-4da9-9ad4-e9ca37120602"); public MagicCapacityPerk(ResourceLocation key) { super(key); @@ -23,7 +20,7 @@ public MagicCapacityPerk(ResourceLocation key) { @Override public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - return attributeBuilder().put(PerkAttributes.MAX_MANA.get(), new AttributeModifier(PERK_UUID, "MagicCapacity", 0.1 * slotValue, AttributeModifier.Operation.MULTIPLY_TOTAL)).build(); + return attributeBuilder().put(PerkAttributes.MAX_MANA.get(), new AttributeModifier(INSTANCE.getRegistryName(), 0.1 * slotValue, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)).build(); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicResistPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicResistPerk.java index 69b040cdd8..45fa15eb88 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicResistPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicResistPerk.java @@ -10,12 +10,9 @@ import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ItemStack; -import java.util.UUID; - public class MagicResistPerk extends Perk { public static final MagicResistPerk INSTANCE = new MagicResistPerk(ArsNouveau.prefix( "thread_warding")); - public static final UUID PERK_UUID = UUID.fromString("fc967b66-a432-44e1-93ec-e8ed583b47b3"); public MagicResistPerk(ResourceLocation key) { super(key); @@ -23,7 +20,7 @@ public MagicResistPerk(ResourceLocation key) { @Override public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - return attributeBuilder().put(PerkAttributes.WARDING.get(), new AttributeModifier(PERK_UUID, "MagicResist", 2 * slotValue, AttributeModifier.Operation.ADDITION)).build(); + return attributeBuilder().put(PerkAttributes.WARDING.get(), new AttributeModifier(INSTANCE.getRegistryName(), 2 * slotValue, AttributeModifier.Operation.ADD_VALUE)).build(); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/PotionDurationPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/PotionDurationPerk.java index 564593bdc5..aaedd85764 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/PotionDurationPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/PotionDurationPerk.java @@ -10,12 +10,9 @@ import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ItemStack; -import java.util.UUID; - public class PotionDurationPerk extends Perk { public static final PotionDurationPerk INSTANCE = new PotionDurationPerk(ArsNouveau.prefix( "thread_wixie")); - public static final UUID PERK_UUID = UUID.fromString("f4c0926e-82a7-44d6-bd6b-a0321a65de2f"); public PotionDurationPerk(ResourceLocation key) { super(key); @@ -23,7 +20,7 @@ public PotionDurationPerk(ResourceLocation key) { @Override public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - return attributeBuilder().put(PerkAttributes.WIXIE.get(), new AttributeModifier(PERK_UUID, "PotionDurationPerk", 0.15 * slotValue, AttributeModifier.Operation.MULTIPLY_BASE)).build(); + return attributeBuilder().put(PerkAttributes.WIXIE.get(), new AttributeModifier(INSTANCE.getRegistryName(), 0.15 * slotValue, AttributeModifier.Operation.ADD_MULTIPLIED_BASE)).build(); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/RepairingPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/RepairingPerk.java index 97e21731ae..e062e558b1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/RepairingPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/RepairingPerk.java @@ -8,12 +8,9 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import java.util.UUID; - public class RepairingPerk extends Perk { public static final RepairingPerk INSTANCE = new RepairingPerk(ArsNouveau.prefix( "thread_repairing")); - public static final UUID PERK_UUID = UUID.fromString("e2a7e5bc-ab34-4ea2-b3b6-ef23d352fa47"); public RepairingPerk(ResourceLocation key) { super(key); @@ -23,12 +20,13 @@ public static void attemptRepair(ItemStack stack, Player entity){ if(entity.level.getGameTime() % 200 != 0 || stack.getDamageValue() <= 0) return; double repairLevel = PerkUtil.countForPerk(RepairingPerk.INSTANCE, entity); - CapabilityRegistry.getMana(entity).ifPresent(mana -> { - if (mana.getCurrentMana() > 20) { - mana.removeMana(20); - stack.setDamageValue(stack.getDamageValue() - Math.min(stack.getDamageValue(), (int)repairLevel + 1)); - } - }); + var cap = CapabilityRegistry.getMana(entity).orElse(null); + if(cap != null){ + if(cap.getCurrentMana() < 20) + return; + cap.removeMana(20); + stack.setDamageValue(stack.getDamageValue() - Math.min(stack.getDamageValue(), (int)repairLevel + 1)); + } } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/SaturationPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/SaturationPerk.java index 11300539b5..f1e989bca8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/SaturationPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/SaturationPerk.java @@ -10,12 +10,9 @@ import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ItemStack; -import java.util.UUID; - public class SaturationPerk extends Perk { public static final SaturationPerk INSTANCE = new SaturationPerk(ArsNouveau.prefix( "thread_whirlisprig")); - public static final UUID PERK_UUID = UUID.fromString("fe329876-34b0-4349-a60a-6215ca44bd4e"); public SaturationPerk(ResourceLocation key) { super(key); @@ -30,7 +27,7 @@ public Multimap getModifiers(EquipmentSlot pEquipm val = 0.6; if(slotValue >= 3) val = 1.0; - return attributeBuilder().put(PerkAttributes.WHIRLIESPRIG.get(), new AttributeModifier(PERK_UUID, "SaturationPerk", val, AttributeModifier.Operation.MULTIPLY_TOTAL)).build(); + return attributeBuilder().put(PerkAttributes.WHIRLIESPRIG.get(), new AttributeModifier(INSTANCE.getRegistryName(), val, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)).build(); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/SpellDamagePerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/SpellDamagePerk.java index 15283a36bb..d943a948b8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/SpellDamagePerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/SpellDamagePerk.java @@ -10,12 +10,9 @@ import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ItemStack; -import java.util.UUID; - public class SpellDamagePerk extends Perk { public static final SpellDamagePerk INSTANCE = new SpellDamagePerk(ArsNouveau.prefix( "thread_spellpower")); - public static final UUID PERK_UUID = UUID.fromString("8b96679e-29e2-4a53-9f44-85024d78c366"); public SpellDamagePerk(ResourceLocation key) { super(key); @@ -23,7 +20,7 @@ public SpellDamagePerk(ResourceLocation key) { @Override public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - return attributeBuilder().put(PerkAttributes.SPELL_DAMAGE_BONUS.get(), new AttributeModifier(PERK_UUID, "SpellDamagePerk", 2 * slotValue, AttributeModifier.Operation.ADDITION)).build(); + return attributeBuilder().put(PerkAttributes.SPELL_DAMAGE_BONUS.get(), new AttributeModifier(INSTANCE.getRegistryName(), 2 * slotValue, AttributeModifier.Operation.ADD_VALUE)).build(); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/StarbunclePerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/StarbunclePerk.java index 736c350e1a..b89747ece8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/StarbunclePerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/StarbunclePerk.java @@ -25,7 +25,7 @@ protected StarbunclePerk(ResourceLocation key) { @Override public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { ImmutableMultimap.Builder modifiers = new ImmutableMultimap.Builder<>(); - modifiers.put(Attributes.MOVEMENT_SPEED, new AttributeModifier(PERK_SPEED_UUID, "StarbunclePerk", 0.2 * slotValue, AttributeModifier.Operation.MULTIPLY_TOTAL)); + modifiers.put(Attributes.MOVEMENT_SPEED.value(), new AttributeModifier(INSTANCE.getRegistryName(), 0.2 * slotValue, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); return modifiers.build(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/StepHeightPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/StepHeightPerk.java index 9c94250aec..44d0d7abce 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/StepHeightPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/StepHeightPerk.java @@ -8,8 +8,9 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.common.NeoForgeMod; + import java.util.UUID; public class StepHeightPerk extends Perk { @@ -25,7 +26,7 @@ public StepHeightPerk(ResourceLocation key) { @Override public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { ImmutableMultimap.Builder modifiers = new ImmutableMultimap.Builder<>(); - modifiers.put(NeoForgeMod.STEP_HEIGHT_ADDITION.get(), new AttributeModifier(PERK_STEP_UUID, "StepPerk", slotValue, AttributeModifier.Operation.ADDITION)); + modifiers.put(Attributes.STEP_HEIGHT.value(), new AttributeModifier(INSTANCE.getRegistryName(), slotValue, AttributeModifier.Operation.ADD_VALUE)); return modifiers.build(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ToughnessPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ToughnessPerk.java index be9c8b70a1..347e1c61f7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ToughnessPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ToughnessPerk.java @@ -10,12 +10,9 @@ import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.ItemStack; -import java.util.UUID; - public class ToughnessPerk extends Perk { public static final ToughnessPerk INSTANCE = new ToughnessPerk(ArsNouveau.prefix( "thread_toughness")); - public static final UUID PERK_UUID = UUID.fromString("a628398e-20e1-493c-b81f-d1e58d7d0d69"); public ToughnessPerk(ResourceLocation key) { super(key); @@ -23,7 +20,7 @@ public ToughnessPerk(ResourceLocation key) { @Override public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - return attributeBuilder().put(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(PERK_UUID, "Toughness", 1 * slotValue, AttributeModifier.Operation.ADDITION)).build(); + return attributeBuilder().put(Attributes.ARMOR_TOUGHNESS.value(), new AttributeModifier(INSTANCE.getRegistryName(), 1 * slotValue, AttributeModifier.Operation.ADD_VALUE)).build(); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java index 3849708ae1..b289e3f814 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java @@ -22,7 +22,6 @@ import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.AABB; -import net.neoforged.neoforge.network.PacketDistributor; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -66,7 +65,7 @@ public static void grantScrying(ServerPlayer playerEntity, int ticks, IScryer sc CompoundTag tag = playerEntity.getPersistentData().getCompound(Player.PERSISTED_NBT_TAG); tag.put("an_scryer", scryer.toTag(new CompoundTag())); playerEntity.getPersistentData().put(Player.PERSISTED_NBT_TAG, tag); - Networking.INSTANCE.send(PacketDistributor.PLAYER.with(() -> playerEntity), new PacketGetPersistentData(tag)); + Networking.sendToPlayerClient(new PacketGetPersistentData(tag), playerEntity); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java index f963508c34..1e505921b5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java @@ -42,7 +42,7 @@ protected void tick() { WildenChimera chimera = new WildenChimera(getWorld()); summon(chimera, getPos().above()); for(BlockPos b : BlockPos.betweenClosed(getPos().east(5).north(5).above(), getPos().west(5).south(5).above(5))){ - if (!net.neoforged.neoforge.event.EventHooks.getMobGriefingEvent(this.getWorld(), chimera)) { + if (!net.neoforged.neoforge.event.EventHooks.canEntityGrief(this.getWorld(), chimera)) { continue; } if (SpellUtil.isCorrectHarvestLevel(4, this.getWorld().getBlockState(b))) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectAnimate.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectAnimate.java index e59b9916c8..3e800d5d53 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectAnimate.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectAnimate.java @@ -36,7 +36,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull BlockState state = world.getBlockState(pos); if (EnchantedFallingBlock.canFall(world, pos, shooter, spellStats)) { BlockEntity blockEntity = world.getBlockEntity(pos); - animateBlock(rayTraceResult, new Vec3(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5), world, shooter, spellStats, spellContext, resolver, state, blockEntity == null ? new CompoundTag() : blockEntity.saveWithoutMetadata()); + animateBlock(rayTraceResult, new Vec3(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5), world, shooter, spellStats, spellContext, resolver, state, blockEntity == null ? new CompoundTag() : blockEntity.saveWithoutMetadata(world.registryAccess())); world.setBlock(pos, state.getFluidState().createLegacyBlock(), 3); } } @@ -60,7 +60,7 @@ private AnimBlockSummon animateBlock(HitResult rayTraceResult, Vec3 pos, Level w blockSummon.setTicksLeft(ticks); blockSummon.setTarget(shooter.getLastHurtMob()); blockSummon.setAggressive(true); - blockSummon.setTame(true); + blockSummon.setTame(true, false); if (shooter instanceof Player player) blockSummon.tame(player); summonLivingEntity(rayTraceResult, world, shooter, spellStats, spellContext, resolver, blockSummon); return blockSummon; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java index 84151fa064..fbf3904658 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java @@ -25,9 +25,9 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; -import net.neoforged.bus.api.Event; import net.neoforged.neoforge.common.ModConfigSpec; import net.neoforged.neoforge.event.EventHooks; +import net.neoforged.neoforge.event.entity.EntityTeleportEvent; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -80,7 +80,7 @@ public static void warpEntity(Entity entity, WarpScroll.WarpScrollData warpScrol if (entity == null) return; if (entity instanceof LivingEntity living){ - Event event = EventHooks.onEnderTeleport(living, warpScrollData.getPos().getX(), warpScrollData.getPos().getY(), warpScrollData.getPos().getZ()); + EntityTeleportEvent. EnderEntity event = EventHooks.onEnderTeleport(living, warpScrollData.getPos().getX(), warpScrollData.getPos().getY(), warpScrollData.getPos().getZ()); if (event.isCanceled()) return; } ServerLevel dimension = PortalTile.getServerLevel(warpScrollData.getDimension(), (ServerLevel) entity.level); @@ -94,14 +94,14 @@ public static void warpEntity(Entity entity, BlockPos warpPos) { if (entity == null) return; Level world = entity.level; if (entity instanceof LivingEntity living){ - Event event = EventHooks.onEnderTeleport(living, warpPos.getX(), warpPos.getY(), warpPos.getZ()); + EntityTeleportEvent.EnderEntity event = EventHooks.onEnderTeleport(living, warpPos.getX(), warpPos.getY(), warpPos.getZ()); if (event.isCanceled()) return; } ((ServerLevel) entity.level).sendParticles(ParticleTypes.PORTAL, entity.getX(), entity.getY() + 1, entity.getZ(), 4, (world.random.nextDouble() - 0.5D) * 2.0D, -world.random.nextDouble(), (world.random.nextDouble() - 0.5D) * 2.0D, 0.1f); entity.teleportTo(warpPos.getX() + 0.5, warpPos.getY(), warpPos.getZ() + 0.5); - Networking.sendToNearby(world, entity, new PacketWarpPosition(entity.getId(), entity.getX(), entity.getY(), entity.getZ(), entity.getXRot(), entity.getYRot())); + Networking.sendToNearbyClient(world, entity, new PacketWarpPosition(entity.getId(), entity.getX(), entity.getY(), entity.getZ(), entity.getXRot(), entity.getYRot())); entity.level.playSound(null, entity.blockPosition(), SoundEvents.ILLUSIONER_MIRROR_MOVE, SoundSource.NEUTRAL, 1.0f, 1.0f); ((ServerLevel) entity.level).sendParticles(ParticleTypes.PORTAL, entity.blockPosition().getX() + 0.5, entity.blockPosition().getY() + 1.0, entity.blockPosition().getZ() + 0.5, 4, (world.random.nextDouble() - 0.5D) * 2.0D, -world.random.nextDouble(), (world.random.nextDouble() - 0.5D) * 2.0D, 0.1f); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBounce.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBounce.java index 2bf6d11578..894b75d1ae 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBounce.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBounce.java @@ -22,7 +22,7 @@ private EffectBounce() { @Override public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { if (rayTraceResult.getEntity() instanceof LivingEntity living) { - ((IPotionEffect)this).applyConfigPotion(living, ModPotions.BOUNCE_EFFECT.get(), spellStats); + ((IPotionEffect)this).applyConfigPotion(living, ModPotions.BOUNCE_EFFECT, spellStats); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java index d17c901a64..2df3b63c2f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java @@ -21,9 +21,9 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; +import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.common.IShearable; import net.neoforged.neoforge.common.ModConfigSpec; -import net.neoforged.neoforge.capabilities.Capabilities; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -48,7 +48,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull Entity entity = rayTraceResult.getEntity(); if (entity instanceof IShearable shearable) { ItemStack shears = new ItemStack(Items.SHEARS); - applyEnchantments(spellStats, shears); + applyEnchantments(world, spellStats, shears); if (shearable.isShearable(getPlayer(shooter, (ServerLevel) world), shears, world, entity.blockPosition())) { // TODO: restore fortune bonus on augment List items = shearable.onSheared(getPlayer(shooter, (ServerLevel) world), shears, world, entity.blockPosition()); @@ -78,7 +78,7 @@ private boolean dupeCheck(Level world, BlockPos pos){ public void doStrip(BlockPos p, BlockHitResult rayTraceResult, Level world,@NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver){ ItemStack axe = new ItemStack(Items.DIAMOND_AXE); - applyEnchantments(spellStats, axe); + applyEnchantments(world, spellStats, axe); Player entity = ANFakePlayer.getPlayer((ServerLevel) world); entity.setItemInHand(InteractionHand.MAIN_HAND, axe); // TODO Replace with AN shears @@ -90,7 +90,7 @@ public void doStrip(BlockPos p, BlockHitResult rayTraceResult, Level world,@NotN public void doShear(BlockPos p, BlockHitResult rayTraceResult, Level world,@NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver){ ItemStack shears = new ItemStack(Items.SHEARS); - applyEnchantments(spellStats, shears); + applyEnchantments(world, spellStats, shears); if (world.getBlockState(p).getBlock() instanceof IShearable shearable && shearable.isShearable(getPlayer(shooter, (ServerLevel) world), shears, world, p)) { // TODO: restore fortune bonus on augment List items = shearable.onSheared(getPlayer(shooter, (ServerLevel) world), shears, world, p); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDelay.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDelay.java index 0299efb775..d9da56f63f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDelay.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDelay.java @@ -43,7 +43,7 @@ public void sendPacket(Level world, HitResult rayTraceResult, @Nullable LivingEn spellContext.delay(delayEvent); EventQueue.getServerInstance().addEvent(delayEvent); - Networking.sendToNearby(world, BlockPos.containing(safelyGetHitPos(rayTraceResult)), + Networking.sendToNearbyClient(world, BlockPos.containing(safelyGetHitPos(rayTraceResult)), new PacketClientDelayEffect(duration, shooter, spellContext.getSpell(), spellContext, blockResult, hitEntity)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java index 9935b7b76c..ee927e9dbd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java @@ -65,7 +65,7 @@ public Component getName(Level world, @NotNull LivingEntity shooter, SpellStats } if (newName == null && isRealPlayer(shooter) && shooter instanceof Player player) { ItemStack stack = StackUtil.getHeldCasterToolOrEmpty(player); - if (stack != ItemStack.EMPTY && stack.getTag() != null) { + if (stack != ItemStack.EMPTY) { ISpellCaster caster = CasterUtil.getCaster(stack); newName = Component.literal(caster.getSpellName()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java index fbf8060b4c..339807dc19 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java @@ -17,7 +17,7 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.event.entity.player.EntityItemPickupEvent; +import net.neoforged.neoforge.event.entity.player.ItemEntityPickupEvent; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -42,16 +42,19 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt InventoryManager manager = spellContext.getCaster().getInvManager().extractSlotMax(-1); for (ItemEntity i : entityList) { ItemStack stack = i.getItem(); - if (stack.isEmpty() || NeoForge.EVENT_BUS.post(new EntityItemPickupEvent(getPlayer(shooter, (ServerLevel) world), i))) + var pickupPre = NeoForge.EVENT_BUS.post(new ItemEntityPickupEvent.Pre(getPlayer(shooter, (ServerLevel) world), i)); + if (stack.isEmpty() || pickupPre.canPickup().isFalse()) continue; stack = manager.insertStack(stack); i.setItem(stack); + NeoForge.EVENT_BUS.post(new ItemEntityPickupEvent.Post(getPlayer(shooter, (ServerLevel) world), i, stack)); } List orbList = world.getEntitiesOfClass(ExperienceOrb.class, new AABB( posVec.add(expansion, expansion, expansion), posVec.subtract(expansion, expansion, expansion))); for (ExperienceOrb i : orbList) { if (shooter instanceof Player player && isNotFakePlayer(player) && spellContext.castingTile == null) { - if (NeoForge.EVENT_BUS.post(new net.neoforged.neoforge.event.entity.player.PlayerXpEvent.PickupXp(player, i))) + var expPickup = NeoForge.EVENT_BUS.post(new net.neoforged.neoforge.event.entity.player.PlayerXpEvent.PickupXp(player, i)); + if (expPickup.isCanceled()) continue; player.giveExperiencePoints(i.value); i.remove(Entity.RemovalReason.DISCARDED); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRewind.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRewind.java index 039b84c496..bfd9342e49 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRewind.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRewind.java @@ -17,7 +17,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -44,7 +44,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul spellContext.delay(delayEvent); EventQueue.getServerInstance().addEvent(new RewindEvent(entity, world.getGameTime(), ticksToRewind, spellContext)); if(rewindable instanceof Player player){ - Networking.sendToNearby(world, player, new PacketClientRewindEffect(ticksToRewind, player)); + Networking.sendToNearbyClient(world, player, new PacketClientRewindEffect(ticksToRewind, player)); } EventQueue.getServerInstance().addEvent(delayEvent); @@ -87,19 +87,19 @@ public static boolean shouldRecordData(Entity entity, IRewindable rewindable){ return !rewindable.isRewinding(); } - public ForgeConfigSpec.IntValue BASE_REWIND_TIME; + public ModConfigSpec.IntValue BASE_REWIND_TIME; @Override - public void buildConfig(ForgeConfigSpec.Builder builder) { + public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); addGenericInt(builder, 60, "Max ticks entities should track for motion and health, etc. Note: Entities ANYWHERE are tracking this, setting this to a high value is not recommended for low-spec machines.", "entityRewindTracking"); BASE_REWIND_TIME = builder.comment("How many ticks should be rewound before augments").defineInRange("baseRewindTime", 40, 1, 60); - addExtendTimeTicksConfig(builder, 20); + addExtendTimeConfig(builder, 20); addDurationDownConfig(builder, 10); } @Override - protected void buildAugmentLimitsConfig(ForgeConfigSpec.Builder builder, Map defaults) { + protected void buildAugmentLimitsConfig(ModConfigSpec.Builder builder, Map defaults) { super.buildAugmentLimitsConfig(builder, defaults); defaults.put(AugmentExtendTime.INSTANCE.getRegistryName(), 1); defaults.put(AugmentDurationDown.INSTANCE.getRegistryName(), 5); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodSelf.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodSelf.java index 45e7c23ad9..1ac9758cf6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodSelf.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodSelf.java @@ -26,7 +26,7 @@ private MethodSelf() { @Override public CastResolveType onCast(ItemStack stack, LivingEntity caster, Level world, SpellStats spellStats, SpellContext context, SpellResolver resolver) { resolver.onResolveEffect(caster.getCommandSenderWorld(), new EntityHitResult(caster)); - Networking.sendToNearby(caster.level, caster, new PacketANEffect(PacketANEffect.EffectType.TIMED_HELIX, caster.blockPosition(), context.getColors())); + Networking.sendToNearbyClient(caster.level, caster, new PacketANEffect(PacketANEffect.EffectType.TIMED_HELIX, caster.blockPosition(), context.getColors())); return CastResolveType.SUCCESS; } @@ -34,7 +34,7 @@ public CastResolveType onCast(ItemStack stack, LivingEntity caster, Level world, public CastResolveType onCastOnBlock(UseOnContext context, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { Level world = context.getLevel(); resolver.onResolveEffect(world, new EntityHitResult(context.getPlayer())); - Networking.sendToNearby(context.getLevel(), context.getPlayer(), new PacketANEffect(PacketANEffect.EffectType.TIMED_HELIX, context.getPlayer().blockPosition(), spellContext.getColors())); + Networking.sendToNearbyClient(context.getLevel(), context.getPlayer(), new PacketANEffect(PacketANEffect.EffectType.TIMED_HELIX, context.getPlayer().blockPosition(), spellContext.getColors())); return CastResolveType.SUCCESS; } @@ -42,7 +42,7 @@ public CastResolveType onCastOnBlock(UseOnContext context, SpellStats spellStats public CastResolveType onCastOnBlock(BlockHitResult blockRayTraceResult, LivingEntity caster, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { Level world = caster.level; resolver.onResolveEffect(world, new EntityHitResult(caster)); - Networking.sendToNearby(caster.level, caster, new PacketANEffect(PacketANEffect.EffectType.TIMED_HELIX, caster.blockPosition(), spellContext.getColors())); + Networking.sendToNearbyClient(caster.level, caster, new PacketANEffect(PacketANEffect.EffectType.TIMED_HELIX, caster.blockPosition(), spellContext.getColors())); return CastResolveType.SUCCESS; } @@ -50,7 +50,7 @@ public CastResolveType onCastOnBlock(BlockHitResult blockRayTraceResult, LivingE public CastResolveType onCastOnEntity(ItemStack stack, LivingEntity playerIn, Entity target, InteractionHand hand, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { Level world = playerIn.level; resolver.onResolveEffect(world, new EntityHitResult(playerIn)); - Networking.sendToNearby(playerIn.level, playerIn, new PacketANEffect(PacketANEffect.EffectType.TIMED_HELIX, playerIn.blockPosition(), spellContext.getColors())); + Networking.sendToNearbyClient(playerIn.level, playerIn, new PacketANEffect(PacketANEffect.EffectType.TIMED_HELIX, playerIn.blockPosition(), spellContext.getColors())); return CastResolveType.SUCCESS; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodTouch.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodTouch.java index 181f97e2cb..d1a74ffa80 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodTouch.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodTouch.java @@ -41,7 +41,7 @@ public CastResolveType onCastOnBlock(UseOnContext context, SpellStats spellStats Level world = context.getLevel(); BlockHitResult res = new BlockHitResult(context.getClickLocation(), context.getClickedFace(), context.getClickedPos(), false); resolver.onResolveEffect(world, res); - Networking.sendToNearby(context.getLevel(), context.getPlayer(), + Networking.sendToNearbyClient(context.getLevel(), context.getPlayer(), new PacketANEffect(PacketANEffect.EffectType.BURST, res.getBlockPos(), spellContext.getColors())); addFadingLight(context.getLevel(), res.getBlockPos().getX() + 0.5, res.getBlockPos().getY() + 0.5, res.getBlockPos().getZ() + 0.5); return CastResolveType.SUCCESS; @@ -50,7 +50,7 @@ public CastResolveType onCastOnBlock(UseOnContext context, SpellStats spellStats @Override public CastResolveType onCastOnBlock(BlockHitResult res, LivingEntity caster, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { resolver.onResolveEffect(caster.getCommandSenderWorld(), res); - Networking.sendToNearby(caster.level, caster, new PacketANEffect(PacketANEffect.EffectType.BURST, res.getBlockPos(), spellContext.getColors())); + Networking.sendToNearbyClient(caster.level, caster, new PacketANEffect(PacketANEffect.EffectType.BURST, res.getBlockPos(), spellContext.getColors())); addFadingLight(caster.level(), res.getBlockPos().getX() + 0.5, res.getBlockPos().getY() + 0.5, res.getBlockPos().getZ() + 0.5); return CastResolveType.SUCCESS; } @@ -58,13 +58,13 @@ public CastResolveType onCastOnBlock(BlockHitResult res, LivingEntity caster, Sp @Override public CastResolveType onCastOnEntity(ItemStack stack, LivingEntity caster, Entity target, InteractionHand hand, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { resolver.onResolveEffect(caster.getCommandSenderWorld(), new EntityHitResult(target)); - Networking.sendToNearby(caster.level, caster, new PacketANEffect(PacketANEffect.EffectType.BURST, target.blockPosition(), spellContext.getColors())); + Networking.sendToNearbyClient(caster.level, caster, new PacketANEffect(PacketANEffect.EffectType.BURST, target.blockPosition(), spellContext.getColors())); addFadingLight(caster.level(), target.blockPosition().getX() + 0.5, target.blockPosition().getY() + 0.5, target.blockPosition().getZ() + 0.5); return spellContext.getCaster().getCasterType() != SpellContext.CasterType.RUNE ? CastResolveType.SUCCESS : CastResolveType.SUCCESS_NO_EXPEND; } public void addFadingLight(Level level, double x, double y, double z) { - Networking.sendToNearby(level, BlockPos.containing(x, y, z), new PacketAddFadingLight(x, y, z)); + Networking.sendToNearbyClient(level, BlockPos.containing(x, y, z), new PacketAddFadingLight(x, y, z)); } @NotNull diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/structure/WildenDen.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/structure/WildenDen.java index a0f9b4fad7..6c00a47dda 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/structure/WildenDen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/structure/WildenDen.java @@ -24,8 +24,11 @@ import net.minecraft.world.level.levelgen.structure.Structure; import net.minecraft.world.level.levelgen.structure.StructureType; import net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer; +import net.minecraft.world.level.levelgen.structure.pools.DimensionPadding; import net.minecraft.world.level.levelgen.structure.pools.JigsawPlacement; import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool; +import net.minecraft.world.level.levelgen.structure.pools.alias.PoolAliasLookup; +import net.minecraft.world.level.levelgen.structure.templatesystem.LiquidSettings; import java.util.Optional; @@ -137,7 +140,7 @@ public Optional findGenerationPoint(Structure.Generati // Here, blockpos's y value is 60 which means the structure spawn 60 blocks above terrain height. // Set this to false for structure to be place only at the passed in blockpos's Y value instead. // Definitely keep this false when placing structures in the nether as otherwise, heightmap placing will put the structure on the Bedrock roof. - this.maxDistanceFromCenter); // Maximum limit for how far pieces can spawn from center. You cannot set this bigger than 128 or else pieces gets cutoff. + this.maxDistanceFromCenter, PoolAliasLookup.EMPTY, DimensionPadding.ZERO, LiquidSettings.APPLY_WATERLOGGING); // Maximum limit for how far pieces can spawn from center. You cannot set this bigger than 128 or else pieces gets cutoff. return structurePiecesGenerator; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java index fa684cc664..d7af994a15 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java @@ -5,27 +5,18 @@ import com.hollingsworth.arsnouveau.common.world.tree.MagicTrunkPlacer; import com.hollingsworth.arsnouveau.setup.registry.*; import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType; -import net.minecraftforge.registries.*; import net.neoforged.bus.api.IEventBus; -import net.neoforged.fml.InterModComms; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; - -import net.neoforged.neoforge.registries.IForgeRegistry; import net.neoforged.neoforge.registries.RegisterEvent; -import top.theillusivec4.curios.Curios; -import top.theillusivec4.curios.api.SlotTypeMessage; -import top.theillusivec4.curios.api.SlotTypePreset; - import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; public class ModSetup { public static void sendIntercoms() { - // TODO: readd curios +// TODO: readd curios // InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.HEAD.getMessageBuilder().build()); // InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.CHARM.getMessageBuilder().build()); // InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.RING.getMessageBuilder().size(2).build()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java index dc836f2d52..be35eafaf0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java @@ -159,7 +159,7 @@ public boolean isNoGravity() { .sized(2.5f, 2.25f) .setTrackingRange(10) .setShouldReceiveVelocityUpdates(true)); - public static final DeferredHolder, EntityType> LIGHTNING_ENTITY = registerEntity(LibEntityNames.AN_LIGHTNING, EntityType.Builder.of(LightningEntity::new, MobCategory.MISC) + public static final DeferredHolder, EntityType> LIGHTNING_ENTITY = registerEntity(LibEntityNames.AN_LIGHTNING, EntityType.Builder.of(LightningEntity::new, MobCategory.MISC) .sized(0.0F, 0.0F) .clientTrackingRange(16) .updateInterval(Integer.MAX_VALUE diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 4e29c4d2d3..fe031d2a79 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -30,7 +30,8 @@ public net.minecraft.client.multiplayer.ClientChunkCache$Storage viewCenterX # v public net.minecraft.client.multiplayer.ClientChunkCache$Storage viewCenterZ # viewCenterZ public net.minecraft.client.multiplayer.ClientChunkCache$Storage *() # wildcard for all methods public net.minecraft.world.entity.item.FallingBlockEntity (Lnet/minecraft/world/level/Level;DDDLnet/minecraft/world/level/block/state/BlockState;)V # FallingBlockEntity -public net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType (Lcom/mojang/serialization/Codec;)V # TrunkPlacerType +public net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType (Lcom/mojang/serialization/MapCodec;)V # TrunkPlacerType + public net.minecraft.world.entity.Entity eyeHeight # eyeHeight public net.minecraft.world.entity.npc.Villager increaseMerchantCareer()V # increaseMerchantCareer public net.minecraft.world.entity.npc.Villager increaseProfessionLevelOnUpdate # increaseProfessionLevelOnUpdate From a5dbcb15e6b3974b1ce95bedb9f68c1be7f8fe04 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 26 Jun 2024 19:58:34 -0500 Subject: [PATCH 016/363] fix tooltips, rendering --- build.gradle | 6 +- gradle.properties | 2 +- .../arsnouveau/api/item/ICasterTool.java | 6 +- .../registry/BuddingConversionRegistry.java | 3 +- .../arsnouveau/api/util/LootUtil.java | 13 +- .../client/gui/radial_menu/GuiRadialMenu.java | 8 +- .../client/gui/utils/RenderUtils.java | 48 +++-- .../gui/utils/TintedVertexConsumer.java | 46 ++--- .../entity/familiar/AnimSkullRenderer.java | 4 +- .../tile/AlterationTableRenderer.java | 68 +++---- .../renderer/tile/ArsGeoBlockRenderer.java | 5 +- .../renderer/tile/BasicTurretRenderer.java | 8 +- .../tile/EnchantingApparatusRenderer.java | 6 +- .../renderer/tile/FalseweaveRenderer.java | 2 +- .../renderer/tile/GhostweaveRenderer.java | 2 +- .../renderer/tile/ImbuementRenderer.java | 6 +- .../renderer/tile/IntangibleAirRenderer.java | 3 +- .../renderer/tile/MageBlockRenderer.java | 6 +- .../renderer/tile/MirrorweaveRenderer.java | 4 +- .../renderer/tile/PortalTileRenderer.java | 16 +- .../renderer/tile/RedstoneRelayRenderer.java | 16 +- .../renderer/tile/RepositoryRenderer.java | 4 +- .../renderer/tile/RotatingTurretRenderer.java | 4 +- .../client/renderer/tile/RuneRenderer.java | 6 +- .../client/renderer/tile/ScribesRenderer.java | 10 +- .../renderer/tile/ScryerOculusRenderer.java | 5 +- .../renderer/world/WorldEventContext.java | 4 +- .../renderer/world/WorldRenderMacros.java | 171 ------------------ .../common/armor/AnimatedMagicArmor.java | 16 +- .../arsnouveau/common/armor/Materials.java | 131 +++++++------- .../block/tile/AgronomicSourcelinkTile.java | 4 +- .../block/tile/CraftingLecternTile.java | 13 +- .../common/compat/CaelusHandler.java | 7 +- .../common/crafting/recipes/CrushRecipe.java | 10 - .../common/datagen/CrushRecipeProvider.java | 86 ++++++--- .../common/datagen/DispelEntityProvider.java | 2 +- .../common/datagen/GlyphRecipeProvider.java | 5 +- .../common/datagen/PatchouliProvider.java | 4 +- .../common/entity/AmethystGolem.java | 6 +- .../common/entity/EntitySpellArrow.java | 15 +- .../arsnouveau/common/entity/EntityWixie.java | 16 +- .../common/entity/GiftStarbuncle.java | 8 +- .../familiar/FamiliarAmethystGolem.java | 4 +- .../entity/familiar/FamiliarBookwyrm.java | 33 ++-- .../entity/familiar/FamiliarDrygmy.java | 19 +- .../entity/familiar/FamiliarEntity.java | 25 +-- .../entity/familiar/FamiliarStarbuncle.java | 11 +- .../entity/familiar/FamiliarWhirlisprig.java | 8 +- .../common/entity/familiar/FamiliarWixie.java | 7 +- .../amethyst_golem/DepositAmethystGoal.java | 11 +- .../amethyst_golem/PickupAmethystGoal.java | 5 +- .../pathfinding/ClientEventHandler.java | 2 +- .../arsnouveau/common/event/EventHandler.java | 27 +-- .../common/event/FamiliarEvents.java | 17 +- .../common/items/AlchemistsCrown.java | 6 +- .../common/items/AnnotatedCodex.java | 5 +- .../arsnouveau/common/items/CasterTome.java | 8 +- .../arsnouveau/common/items/DominionWand.java | 2 +- .../arsnouveau/common/items/EarthEssence.java | 6 +- .../common/items/EnchantersMirror.java | 6 +- .../common/items/EnchantersSword.java | 7 +- .../common/items/FamiliarScript.java | 5 +- .../arsnouveau/common/items/FireEssence.java | 5 +- .../arsnouveau/common/items/Glyph.java | 3 +- .../arsnouveau/common/items/ItemScroll.java | 5 +- .../common/items/ManipulationEssence.java | 6 +- .../arsnouveau/common/items/ModItem.java | 5 +- .../arsnouveau/common/items/PerkItem.java | 4 +- .../arsnouveau/common/items/PotionFlask.java | 4 +- .../arsnouveau/common/items/Present.java | 5 +- .../arsnouveau/common/items/RitualTablet.java | 5 +- .../arsnouveau/common/items/ScryCaster.java | 6 +- .../arsnouveau/common/items/ScryerScroll.java | 5 +- .../arsnouveau/common/items/SpellBook.java | 2 +- .../arsnouveau/common/items/SpellBow.java | 30 ++- .../common/items/SpellCrossbow.java | 7 +- .../common/items/SpellParchment.java | 7 +- .../common/items/StableWarpScroll.java | 5 +- .../common/items/StarbuncleShard.java | 6 +- .../arsnouveau/common/items/VoidJar.java | 6 +- .../arsnouveau/common/items/Wand.java | 14 +- .../arsnouveau/common/items/WarpScroll.java | 2 +- .../items/curios/AbstractManaCurio.java | 25 ++- .../items/curios/BeltOfUnstableGifts.java | 3 +- .../common/items/curios/DiscountRing.java | 6 +- .../items/summon_charms/BookwyrmCharm.java | 5 +- .../items/summon_charms/StarbuncleCharm.java | 9 +- .../common/lib/PotionEffectTags.java | 8 +- .../common/spell/effect/EffectFirework.java | 36 ++-- .../arsnouveau/common/util/WorldUtil.java | 1 + 90 files changed, 531 insertions(+), 713 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/world/WorldRenderMacros.java diff --git a/build.gradle b/build.gradle index 0400599729..e1c10f9103 100644 --- a/build.gradle +++ b/build.gradle @@ -108,9 +108,9 @@ dependencies { // // implementation "vazkii.patchouli:Patchouli:1.20.4-${patchouli_version}" // -// compileOnly "top.theillusivec4.curios:curios-neoforge:${curios_version}+${minecraft_version}:api" -// localRuntime "top.theillusivec4.curios:curios-neoforge:${curios_version}+${minecraft_version}" -// + runtimeOnly "com.illusivesoulworks.caelus:caelus-neoforge:${caelus_version}" + compileOnly "com.illusivesoulworks.caelus:caelus-neoforge:${caelus_version}:api" + compileOnly "mezz.jei:jei-1.21-neoforge-api:${jei_version}" localRuntime "mezz.jei:jei-1.21-neoforge:${jei_version}" implementation 'com.github.glitchfiend:TerraBlender-neoforge:1.21-4.0.0.0' diff --git a/gradle.properties b/gradle.properties index d2b20a01a2..fe31396499 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,4 +26,4 @@ jei_version=19.0.0.9 curios_version=8.0.0-beta geckolib_version=4.5.5 patchouli_version=85-NEOFORGE -caelus_version=6.0.0 +caelus_version=7.0.0+1.21 diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java index 02047377c3..32f479a283 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java @@ -18,12 +18,12 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; +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.NotNull; -import javax.annotation.Nullable; import java.util.List; /** @@ -109,9 +109,7 @@ default boolean shouldDisplay(ItemStack stack) { return true; } - default void getInformation(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - if (worldIn == null) - return; + default void getInformation(ItemStack stack, Item.TooltipContext context, List tooltip2, TooltipFlag flagIn) { ISpellCaster caster = getSpellCaster(stack); if (caster.getSpell().isEmpty()) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/BuddingConversionRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/BuddingConversionRegistry.java index 0691cd6a4b..c007ec3a87 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/BuddingConversionRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/BuddingConversionRegistry.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.common.crafting.recipes.BuddingConversionRecipe; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeManager; import java.util.ArrayList; @@ -18,7 +19,7 @@ public static List getRecipes(){ public static void reloadBuddingConversionRecipes(RecipeManager recipeManager){ RECIPES = new ArrayList<>(); - List recipes = recipeManager.getAllRecipesFor(RecipeRegistry.BUDDING_CONVERSION_TYPE.get()); + List recipes = recipeManager.getAllRecipesFor(RecipeRegistry.BUDDING_CONVERSION_TYPE.get()).stream().map(RecipeHolder::value).toList(); RECIPES.addAll(recipes); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/LootUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/LootUtil.java index 35987604ef..f4c97a723b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/LootUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/LootUtil.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.api.util; import com.hollingsworth.arsnouveau.api.ANFakePlayer; +import com.hollingsworth.arsnouveau.common.util.HolderHelper; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.damagesource.DamageSource; @@ -31,27 +32,27 @@ public static LootParams.Builder getDefaultContext(ServerLevel serverWorld, Bloc public static LootParams.Builder getSilkContext(ServerLevel serverWorld, BlockPos pos, LivingEntity shooter) { ItemStack stack = getDefaultFakeTool(); - stack.enchant(Enchantments.SILK_TOUCH, 1); + stack.enchant(HolderHelper.unwrap(serverWorld, Enchantments.SILK_TOUCH), 1); return getDefaultContext(serverWorld, pos, shooter).withParameter(LootContextParams.TOOL, stack); } public static LootParams.Builder getFortuneContext(ServerLevel world, BlockPos pos, LivingEntity shooter, int enchLevel) { ItemStack stack = getDefaultFakeTool(); - stack.enchant(Enchantments.BLOCK_FORTUNE, enchLevel); + stack.enchant(HolderHelper.unwrap(world, Enchantments.FORTUNE), enchLevel); return getDefaultContext(world, pos, shooter).withParameter(LootContextParams.TOOL, stack); } public static LootParams.Builder getLootingContext(ServerLevel world, LivingEntity player, LivingEntity slainEntity, int looting, DamageSource source) { ItemStack stack = getDefaultFakeWeapon(); - stack.enchant(Enchantments.MOB_LOOTING, looting); + stack.enchant(HolderHelper.unwrap(world, Enchantments.LOOTING), looting); return new LootParams.Builder(world) .withParameter(LootContextParams.THIS_ENTITY, slainEntity) .withParameter(LootContextParams.ORIGIN, new Vec3(slainEntity.getX(), slainEntity.getY(), slainEntity.getZ())) .withParameter(LootContextParams.LAST_DAMAGE_PLAYER, ANFakePlayer.getPlayer(world)) - .withParameter(LootContextParams.DAMAGE_SOURCE, source).withOptionalParameter(LootContextParams.KILLER_ENTITY, source.getEntity()) - .withOptionalParameter(LootContextParams.DIRECT_KILLER_ENTITY, source.getDirectEntity()) - .withParameter(LootContextParams.KILLER_ENTITY, player).withLuck(player instanceof Player ? ((Player) player).getLuck() : 1.0f) + .withParameter(LootContextParams.DAMAGE_SOURCE, source).withOptionalParameter(LootContextParams.ATTACKING_ENTITY, source.getEntity()) + .withOptionalParameter(LootContextParams.DIRECT_ATTACKING_ENTITY, source.getDirectEntity()) + .withParameter(LootContextParams.ATTACKING_ENTITY, player).withLuck(player instanceof Player ? ((Player) player).getLuck() : 1.0f) .withParameter(LootContextParams.TOOL, stack).withParameter(LootContextParams.EXPLOSION_RADIUS, 0.0f) .withParameter(LootContextParams.BLOCK_STATE, Blocks.AIR.defaultBlockState()) .withOptionalParameter(LootContextParams.BLOCK_ENTITY, null); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java index d4490ae677..ba8059ddf0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java @@ -262,10 +262,10 @@ public void drawSlice( float pos2InX = x + radiusIn * (float) Math.cos(angle2); float pos2InY = y + radiusIn * (float) Math.sin(angle2); - buffer.vertex(pos1OutX, pos1OutY, z).color(r, g, b, a).endVertex(); - buffer.vertex(pos1InX, pos1InY, z).color(r, g, b, a).endVertex(); - buffer.vertex(pos2InX, pos2InY, z).color(r, g, b, a).endVertex(); - buffer.vertex(pos2OutX, pos2OutY, z).color(r, g, b, a).endVertex(); + buffer.addVertex(pos1OutX, pos1OutY, z).color(r, g, b, a).endVertex(); + buffer.addVertex(pos1InX, pos1InY, z).color(r, g, b, a).endVertex(); + buffer.addVertex(pos2InX, pos2InY, z).color(r, g, b, a).endVertex(); + buffer.addVertex(pos2OutX, pos2OutY, z).color(r, g, b, a).endVertex(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/RenderUtils.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/RenderUtils.java index 2227feaa79..a660fb2805 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/RenderUtils.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/RenderUtils.java @@ -1,14 +1,12 @@ package com.hollingsworth.arsnouveau.client.gui.utils; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; -import com.hollingsworth.arsnouveau.client.gui.Color; import com.hollingsworth.arsnouveau.setup.config.Config; import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; +import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -52,7 +50,7 @@ public static void renderFakeItemTransparent(PoseStack poseStack, ItemStack stac public static void renderItemModel(PoseStack poseStack, ItemStack stack, int x, int y, int scale, int alpha, BakedModel model, ItemRenderer renderer, boolean transparent, int zIndex) { poseStack.pushPose(); poseStack.translate(x + 8F, y + 8F, zIndex); - poseStack.mulPoseMatrix(SCALE_INVERT_Y); + poseStack.mulPose(SCALE_INVERT_Y); poseStack.scale(scale, scale, scale); boolean flatLight = !model.usesBlockLight(); @@ -87,26 +85,26 @@ private static MultiBufferSource transparentBuffer(MultiBufferSource buffer) { return renderType -> new TintedVertexConsumer(buffer.getBuffer(TRANSLUCENT), 1.0f, 1.0f, 1.0f, 0.25f); } - /* - * Adapted from Eidolon, Elucent - */ - public static void colorBlit(PoseStack mStack, int x, int y, int uOffset, int vOffset, int width, int height, int textureWidth, int textureHeight, Color color) { - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.setShader(GameRenderer::getPositionTexColorShader); - Matrix4f matrix = mStack.last().pose(); - int maxX = x + width, maxY = y + height; - float minU = (float) uOffset / textureWidth, minV = (float) vOffset / textureHeight; - float maxU = minU + (float) width / textureWidth, maxV = minV + (float) height / textureHeight; - int r = color.getRed(), g = color.getGreen(), b = color.getBlue(), alpha = color.getAlpha(); - BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); - bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); - bufferbuilder.vertex(matrix, (float) x, (float) maxY, 0).uv(minU, maxV).color(r, g, b, alpha).endVertex(); - bufferbuilder.vertex(matrix, (float) maxX, (float) maxY, 0).uv(maxU, maxV).color(r, g, b, alpha).endVertex(); - bufferbuilder.vertex(matrix, (float) maxX, (float) y, 0).uv(maxU, minV).color(r, g, b, alpha).endVertex(); - bufferbuilder.vertex(matrix, (float) x, (float) y, 0).uv(minU, minV).color(r, g, b, alpha).endVertex(); - BufferUploader.drawWithShader(bufferbuilder.end()); - RenderSystem.disableBlend(); - } +// /* +// * Adapted from Eidolon, Elucent +// */ +// public static void colorBlit(PoseStack mStack, int x, int y, int uOffset, int vOffset, int width, int height, int textureWidth, int textureHeight, Color color) { +// RenderSystem.enableBlend(); +// RenderSystem.defaultBlendFunc(); +// RenderSystem.setShader(GameRenderer::getPositionTexColorShader); +// Matrix4f matrix = mStack.last().pose(); +// int maxX = x + width, maxY = y + height; +// float minU = (float) uOffset / textureWidth, minV = (float) vOffset / textureHeight; +// float maxU = minU + (float) width / textureWidth, maxV = minV + (float) height / textureHeight; +// int r = color.getRed(), g = color.getGreen(), b = color.getBlue(), alpha = color.getAlpha(); +// BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); +// bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); +// bufferbuilder.addVertex(matrix, (float) x, (float) maxY, 0).uv(minU, maxV).color(r, g, b, alpha).endVertex(); +// bufferbuilder.addVertex(matrix, (float) maxX, (float) maxY, 0).uv(maxU, maxV).color(r, g, b, alpha).endVertex(); +// bufferbuilder.addVertex(matrix, (float) maxX, (float) y, 0).uv(maxU, minV).color(r, g, b, alpha).endVertex(); +// bufferbuilder.addVertex(matrix, (float) x, (float) y, 0).uv(minU, minV).color(r, g, b, alpha).endVertex(); +// BufferUploader.drawWithShader(bufferbuilder.end()); +// RenderSystem.disableBlend(); +// } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/TintedVertexConsumer.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/TintedVertexConsumer.java index bd29a0582a..86eca96385 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/TintedVertexConsumer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/TintedVertexConsumer.java @@ -18,13 +18,13 @@ public TintedVertexConsumer(VertexConsumer wrapped, float red, float green, floa } @Override - public VertexConsumer vertex(double x, double y, double z) { - return wrapped.vertex(x, y, z); + public VertexConsumer addVertex(float x, float y, float z) { + return wrapped.addVertex(x, y, z); } @Override - public VertexConsumer color(int red, int green, int blue, int alpha) { - return wrapped.color( + public VertexConsumer setColor(int red, int green, int blue, int alpha) { + return wrapped.setColor( (int) (red * this.red), (int) (green * this.green), (int) (blue * this.blue), @@ -33,38 +33,40 @@ public VertexConsumer color(int red, int green, int blue, int alpha) { } @Override - public VertexConsumer uv(float u, float v) { - return wrapped.uv(u, v); + public VertexConsumer setUv(float u, float v) { + return wrapped.setUv(u, v); } @Override - public VertexConsumer overlayCoords(int u, int v) { - return wrapped.overlayCoords(u, v); + public VertexConsumer setUv1(int p_350815_, int p_350629_) { + return wrapped.setUv1(p_350815_, p_350629_); } @Override - public VertexConsumer uv2(int u, int v) { - return wrapped.uv2(u, v); + public VertexConsumer setOverlay(int p_350697_) { + return wrapped.setOverlay(p_350697_); } - @Override - public VertexConsumer normal(float x, float y, float z) { - return wrapped.normal(x, y, z); - } @Override - public void endVertex() { - wrapped.endVertex(); + public VertexConsumer setUv2(int u, int v) { + return wrapped.setUv2(u, v); } @Override - public void defaultColor(int r, int g, int b, int a) { - wrapped.defaultColor(r, g, b, a); + public VertexConsumer setNormal(float x, float y, float z) { + return wrapped.setNormal(x, y, z); } - @Override - public void unsetDefaultColor() { - wrapped.unsetDefaultColor(); - } + +// @Override +// public void defaultColor(int r, int g, int b, int a) { +// wrapped.defaultColor(r, g, b, a); +// } +// +// @Override +// public void unsetDefaultColor() { +// wrapped.unsetDefaultColor(); +// } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/AnimSkullRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/AnimSkullRenderer.java index a040d9b7f1..b43dc04b38 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/AnimSkullRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/AnimSkullRenderer.java @@ -20,7 +20,7 @@ public AnimSkullRenderer(EntityRendererProvider.Context renderManager) { @Override - public void renderRecursively(PoseStack poseStack, AnimHeadSummon animatable, GeoBone bone, RenderType ty, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderRecursively(PoseStack poseStack, AnimHeadSummon animatable, GeoBone bone, RenderType ty, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { if (bone.getName().equals("block")) { AnimHeadSummon animBlock = animatable; if (animBlock == null) return; @@ -33,6 +33,6 @@ public void renderRecursively(PoseStack poseStack, AnimHeadSummon animatable, Ge poseStack.popPose(); buffer = this.bufferSource.getBuffer(RenderType.entityCutoutNoCull(TEXTURE)); } - super.renderRecursively(poseStack, animatable, bone, ty, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.renderRecursively(poseStack, animatable, bone, ty, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java index cc91728cf1..887c3b9fb6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java @@ -24,15 +24,15 @@ import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.Direction; +import net.minecraft.core.component.DataComponents; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.DyeableLeatherItem; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.DyedItemColor; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.client.ClientHooks; import org.joml.Quaternionf; import org.joml.Vector3d; import software.bernie.geckolib.cache.object.BakedGeoModel; @@ -56,7 +56,7 @@ public AlterationTableRenderer(BlockEntityRendererProvider.Context p_i226006_1_) outerModel = new ArmorStandArmorModel(p_i226006_1_.bakeLayer(ModelLayers.ARMOR_STAND_OUTER_ARMOR)); } - public void renderArmorStack(AlterationTile tile, PoseStack matrixStack, float ticks, MultiBufferSource iRenderTypeBuffer, VertexConsumer bufferIn, int packedLightIn, int packedOverlayIn, float partialTicks) { + public void renderArmorStack(AlterationTile tile, PoseStack matrixStack, float ticks, MultiBufferSource iRenderTypeBuffer, VertexConsumer bufferIn, int packedLightIn, int packedOverlayIn, float partialTicks, int colour) { matrixStack.pushPose(); BlockState state = tile.getLevel().getBlockState(tile.getBlockPos()); if (!(state.getBlock() instanceof AlterationTable)) @@ -78,7 +78,7 @@ public void renderArmorStack(AlterationTile tile, PoseStack matrixStack, float t matrixStack.mulPose(Axis.ZP.rotationDegrees(180F)); matrixStack.translate(0, yOffset + rotForSlot(armorItem.getEquipmentSlot()), 0); - this.renderArmorPiece(tile, tile.armorStack, matrixStack, iRenderTypeBuffer, packedLightIn, getArmorModel(armorItem.getEquipmentSlot())); + this.renderArmorPiece(tile, tile.armorStack, matrixStack, iRenderTypeBuffer, packedLightIn, getArmorModel(armorItem.getEquipmentSlot()), colour); } else { Minecraft.getInstance().getItemRenderer().renderStatic(tile.armorStack, ItemDisplayContext.FIXED, packedLightIn, packedOverlayIn, matrixStack, iRenderTypeBuffer, tile.getLevel(), (int) tile.getBlockPos().asLong()); } @@ -129,22 +129,23 @@ private ArmorStandArmorModel getArmorModel(EquipmentSlot pSlot) { return (this.usesInnerModel(pSlot) ? this.innerModel : this.outerModel); } - private void renderArmorPiece(AlterationTile tile, ItemStack itemstack, PoseStack pPoseStack, MultiBufferSource pBuffer, int packedLightIn, ArmorStandArmorModel armorModel) { + private void renderArmorPiece(AlterationTile tile, ItemStack itemstack, PoseStack pPoseStack, MultiBufferSource pBuffer, int packedLightIn, ArmorStandArmorModel armorModel, int defaultColor) { if (!(itemstack.getItem() instanceof ArmorItem armoritem)) return; EquipmentSlot pSlot = armoritem.getEquipmentSlot(); Model model = getArmorModelHook(itemstack, pSlot, armorModel); boolean flag1 = itemstack.hasFoil(); - if (armoritem instanceof DyeableLeatherItem dyeableLeatherItem) { - int i = dyeableLeatherItem.getColor(itemstack); + DyedItemColor color = itemstack.get(DataComponents.DYED_COLOR); + if (color != null) { + int i = color.rgb(); float f = (i >> 16 & 255) / 255.0F; float f1 = (i >> 8 & 255) / 255.0F; float f2 = (i & 255) / 255.0F; - this.renderModel(pPoseStack, pBuffer, packedLightIn, flag1, model, f, f1, f2, this.getArmorResource(itemstack, pSlot, null)); - this.renderModel(pPoseStack, pBuffer, packedLightIn, flag1, model, 1.0F, 1.0F, 1.0F, this.getArmorResource(itemstack, pSlot, "overlay")); + this.renderModel(pPoseStack, pBuffer, packedLightIn, flag1, model, i, this.getArmorResource(itemstack, pSlot, null)); + this.renderModel(pPoseStack, pBuffer, packedLightIn, flag1, model, i, this.getArmorResource(itemstack, pSlot, "overlay")); } else { - this.renderModel(pPoseStack, pBuffer, packedLightIn, flag1, model, 1.0F, 1.0F, 1.0F, this.getArmorResource(itemstack, pSlot, null)); + this.renderModel(pPoseStack, pBuffer, packedLightIn, flag1, model, defaultColor, this.getArmorResource(itemstack, pSlot, null)); } } @@ -152,31 +153,32 @@ protected net.minecraft.client.model.Model getArmorModelHook(ItemStack itemStack return net.neoforged.neoforge.client.ClientHooks.getArmorModel(Minecraft.getInstance().player, itemStack, slot, model); } - private void renderModel(PoseStack pPoseStack, MultiBufferSource pBuffer, int packedLight, boolean p_117111_, net.minecraft.client.model.Model pModel, float p_117114_, float p_117115_, float p_117116_, ResourceLocation armorResource) { - VertexConsumer vertexconsumer = ItemRenderer.getArmorFoilBuffer(pBuffer, RenderType.armorCutoutNoCull(armorResource), false, p_117111_); - pModel.renderToBuffer(pPoseStack, vertexconsumer, packedLight, OverlayTexture.NO_OVERLAY, p_117114_, p_117115_, p_117116_, 1.0F); + private void renderModel(PoseStack pPoseStack, MultiBufferSource pBuffer, int packedLight, boolean p_117111_, net.minecraft.client.model.Model pModel, int color, ResourceLocation armorResource) { + VertexConsumer vertexconsumer = ItemRenderer.getArmorFoilBuffer(pBuffer, RenderType.armorCutoutNoCull(armorResource), false); + pModel.renderToBuffer(pPoseStack, vertexconsumer, packedLight, OverlayTexture.NO_OVERLAY, color); } public ResourceLocation getArmorResource(ItemStack stack, EquipmentSlot slot, @Nullable String type) { - ArmorItem item = (ArmorItem) stack.getItem(); - String texture = item.getMaterial().getName(); - String domain = "minecraft"; - int idx = texture.indexOf(':'); - if (idx != -1) { - domain = texture.substring(0, idx); - texture = texture.substring(idx + 1); - } - String s1 = String.format(java.util.Locale.ROOT, "%s:textures/models/armor/%s_layer_%d%s.png", domain, texture, (usesInnerModel(slot) ? 2 : 1), type == null ? "" : String.format(java.util.Locale.ROOT, "_%s", type)); - - s1 = ClientHooks.getArmorTexture(Minecraft.getInstance().player, stack, s1, slot, type); - ResourceLocation resourcelocation = ARMOR_LOCATION_CACHE.get(s1); - - if (resourcelocation == null) { - resourcelocation = ResourceLocation.tryParse(s1); - ARMOR_LOCATION_CACHE.put(s1, resourcelocation); - } - - return resourcelocation; +// ArmorItem item = (ArmorItem) stack.getItem(); +// String texture = item.getMaterial().getName(); +// String domain = "minecraft"; +// int idx = texture.indexOf(':'); +// if (idx != -1) { +// domain = texture.substring(0, idx); +// texture = texture.substring(idx + 1); +// } +// String s1 = String.format(java.util.Locale.ROOT, "%s:textures/models/armor/%s_layer_%d%s.png", domain, texture, (usesInnerModel(slot) ? 2 : 1), type == null ? "" : String.format(java.util.Locale.ROOT, "_%s", type)); +// +// s1 = ClientHooks.getArmorTexture(Minecraft.getInstance().player, stack, s1, slot, type); +// ResourceLocation resourcelocation = ARMOR_LOCATION_CACHE.get(s1); +// +// if (resourcelocation == null) { +// resourcelocation = ResourceLocation.tryParse(s1); +// ARMOR_LOCATION_CACHE.put(s1, resourcelocation); +// } + +// return resourcelocation; + return null; //TODO: reenable armor rendering } private boolean usesInnerModel(EquipmentSlot pSlot) { @@ -268,7 +270,7 @@ public void renderFinal(PoseStack stack, AlterationTile animatable, BakedGeoMode stack.translate(-1.5, 1.95, 0); } - this.renderArmorStack(animatable, stack, (float) ticks, bufferSource, buffer, packedLight, packedOverlay, partialTick); + this.renderArmorStack(animatable, stack, (float) ticks, bufferSource, buffer, packedLight, packedOverlay, partialTick, colour); stack.popPose(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ArsGeoBlockRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ArsGeoBlockRenderer.java index 7840baf6cf..61639420c3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ArsGeoBlockRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ArsGeoBlockRenderer.java @@ -17,9 +17,10 @@ public ArsGeoBlockRenderer(BlockEntityRendererProvider.Context rendererProvider, } - public void actuallyRender(PoseStack poseStack, T animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + @Override + public void actuallyRender(PoseStack poseStack, T animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { try { - super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); }catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/BasicTurretRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/BasicTurretRenderer.java index 3ec3d8399b..c028fd3813 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/BasicTurretRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/BasicTurretRenderer.java @@ -11,10 +11,10 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.core.Direction; import net.minecraft.util.Mth; -import software.bernie.geckolib.cache.object.BakedGeoModel; -import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.animatable.GeoAnimatable; import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.model.GeoModel; import java.util.Optional; @@ -42,7 +42,7 @@ public BasicTurretRenderer(BlockEntityRendererProvider.Context rendererDispatche } @Override - public void actuallyRender(PoseStack poseStack, BasicSpellTurretTile animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void actuallyRender(PoseStack poseStack, BasicSpellTurretTile animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { poseStack.pushPose(); Direction direction = animatable.getBlockState().getValue(BasicSpellTurret.FACING); if (direction == Direction.UP) { @@ -50,7 +50,7 @@ public void actuallyRender(PoseStack poseStack, BasicSpellTurretTile animatable, } else if (direction == Direction.DOWN) { poseStack.translate(0, 0.5, 0.5); } - super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); poseStack.popPose(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantingApparatusRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantingApparatusRenderer.java index 4715e4d301..19a035bf63 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantingApparatusRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantingApparatusRenderer.java @@ -11,7 +11,7 @@ import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import software.bernie.geckolib.cache.object.BakedGeoModel; - +import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.util.RenderUtil; @@ -22,8 +22,8 @@ public EnchantingApparatusRenderer(BlockEntityRendererProvider.Context p_i226006 } @Override - public void renderFinal(PoseStack stack, EnchantingApparatusTile tile, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - super.renderFinal(stack, tile, model, bufferSource, buffer, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + public void renderFinal(PoseStack stack, EnchantingApparatusTile tile, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay, int color) { + super.renderFinal(stack, tile, model, bufferSource, buffer, partialTick, packedLight, packedOverlay, color); GeoBone frame = model.getBone("frame_all").orElse(null); if (frame != null && tile.getStack() != null) { double x = tile.getBlockPos().getX(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/FalseweaveRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/FalseweaveRenderer.java index 04d8c60c9c..e2c8ab27ab 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/FalseweaveRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/FalseweaveRenderer.java @@ -23,7 +23,7 @@ public FalseweaveRenderer(BlockEntityRendererProvider.Context pContext) { @Override public void render(FalseWeaveTile tileEntityIn, float partialTick, PoseStack pPoseStack, MultiBufferSource bufferIn, int combinedLightIn, int combinedOverlayIn) { BlockState renderState = tileEntityIn.mimicState; - boolean hasMagicFind = Minecraft.getInstance().player != null && Minecraft.getInstance().player.hasEffect(ModPotions.MAGIC_FIND_EFFECT.get()); + boolean hasMagicFind = Minecraft.getInstance().player != null && Minecraft.getInstance().player.hasEffect(ModPotions.MAGIC_FIND_EFFECT); if(hasMagicFind) return; ModelBlockRenderer.enableCaching(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GhostweaveRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GhostweaveRenderer.java index b32caa4f15..24cb02b5b6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GhostweaveRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GhostweaveRenderer.java @@ -23,7 +23,7 @@ public GhostweaveRenderer(BlockEntityRendererProvider.Context pContext) { @Override public void render(GhostWeaveTile tileEntityIn, float partialTick, PoseStack pPoseStack, MultiBufferSource bufferIn, int combinedLightIn, int combinedOverlayIn) { BlockState renderState = tileEntityIn.mimicState; - boolean hasMagicFind = Minecraft.getInstance().player != null && Minecraft.getInstance().player.hasEffect(ModPotions.MAGIC_FIND_EFFECT.get()); + boolean hasMagicFind = Minecraft.getInstance().player != null && Minecraft.getInstance().player.hasEffect(ModPotions.MAGIC_FIND_EFFECT); boolean shouldShow = hasMagicFind || !tileEntityIn.isInvisible(); if(!shouldShow) return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ImbuementRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ImbuementRenderer.java index 17037e9874..5fa4a68791 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ImbuementRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ImbuementRenderer.java @@ -18,8 +18,8 @@ public ImbuementRenderer(BlockEntityRendererProvider.Context p_i226006_1_) { } @Override - public void actuallyRender(PoseStack matrixStack, ImbuementTile tileEntityIn, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - super.actuallyRender(matrixStack, tileEntityIn, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + public void actuallyRender(PoseStack matrixStack, ImbuementTile tileEntityIn, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { + super.actuallyRender(matrixStack, tileEntityIn, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); double x = tileEntityIn.getBlockPos().getX(); double y = tileEntityIn.getBlockPos().getY(); double z = tileEntityIn.getBlockPos().getZ(); @@ -29,7 +29,7 @@ public void actuallyRender(PoseStack matrixStack, ImbuementTile tileEntityIn, Ba } if (tileEntityIn.entity != null) { ItemEntity entityItem = tileEntityIn.entity; - tileEntityIn.frames += 1.5f * Minecraft.getInstance().getDeltaFrameTime(); + tileEntityIn.frames += 1.5f * partialTick; entityItem.setYHeadRot(tileEntityIn.frames); entityItem.age = (int) tileEntityIn.frames; matrixStack.pushPose(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/IntangibleAirRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/IntangibleAirRenderer.java index 01fcc93960..6984ad961f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/IntangibleAirRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/IntangibleAirRenderer.java @@ -23,6 +23,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.client.model.data.ModelData; + import java.util.List; public class IntangibleAirRenderer implements BlockEntityRenderer { @@ -52,7 +53,7 @@ public DummyRender(String p_173178_, VertexFormat p_173179_, VertexFormat.Mode p } - private void renderModelBrightnessColorQuads(PoseStack.Pose matrixEntry, VertexConsumer builder, float red, float green, float blue, float alpha, List listQuads, int combinedLightsIn, int combinedOverlayIn) { + private void renderModelBrightnessColorQuads(PoseStack.Pose matrixEntry, VertexConsumer builder, int color, List listQuads, int combinedLightsIn, int combinedOverlayIn) { for (BakedQuad bakedquad : listQuads) { float f; float f1; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/MageBlockRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/MageBlockRenderer.java index 4c76aef7db..596856733a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/MageBlockRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/MageBlockRenderer.java @@ -20,9 +20,9 @@ public MageBlockRenderer(EntityRendererProvider.Context rendererDispatcherIn) { } @Override - public void actuallyRender(PoseStack poseStack, EnchantedMageblock animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - ParticleColor color = animatable.getParticleColor(); - super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color.getRed(), color.getGreen(), color.getBlue(), alpha); + public void actuallyRender(PoseStack poseStack, EnchantedMageblock animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { + ParticleColor particleColor = animatable.getParticleColor(); + super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, particleColor.getColor()); } public static GenericItemBlockRenderer getISTER() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/MirrorweaveRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/MirrorweaveRenderer.java index abe83bf0d9..11ad2d0f54 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/MirrorweaveRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/MirrorweaveRenderer.java @@ -1,8 +1,8 @@ package com.hollingsworth.arsnouveau.client.renderer.tile; import com.hollingsworth.arsnouveau.common.block.tile.MirrorWeaveTile; -import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; @@ -24,7 +24,7 @@ public MirrorweaveRenderer(BlockEntityRendererProvider.Context pContext) { @Override public void render(MirrorWeaveTile tileEntityIn, float partialTick, PoseStack pPoseStack, MultiBufferSource bufferIn, int combinedLightIn, int combinedOverlayIn) { BlockState renderState = tileEntityIn.mimicState; - if(Minecraft.getInstance().player != null && Minecraft.getInstance().player.hasEffect(ModPotions.MAGIC_FIND_EFFECT.get())){ + if(Minecraft.getInstance().player != null && Minecraft.getInstance().player.hasEffect(ModPotions.MAGIC_FIND_EFFECT)){ renderState = BlockRegistry.MIRROR_WEAVE.defaultBlockState(); } if (renderState == null) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PortalTileRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PortalTileRenderer.java index 77644dbe6b..24e77fb629 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PortalTileRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PortalTileRenderer.java @@ -57,16 +57,16 @@ private void renderCube(PortalTile tileEntityIn, float p_228883_2_, float p_2288 private void renderFace(PortalTile tileEntityIn, Matrix4f matrix, VertexConsumer iBuilder, float p_228884_4_, float p_228884_5_, float p_228884_6_, float p_228884_7_, float p_228884_8_, float p_228884_9_, float p_228884_10_, float p_228884_11_, float p_228884_12_, float p_228884_13_, float p_228884_14_, Direction direction) { if (!tileEntityIn.isHorizontal && (direction == Direction.EAST || direction == Direction.WEST || direction == Direction.SOUTH || direction == Direction.NORTH)) { - iBuilder.vertex(matrix, p_228884_4_, p_228884_6_, p_228884_8_).color(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F).endVertex(); - iBuilder.vertex(matrix, p_228884_5_, p_228884_6_, p_228884_9_).color(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F).endVertex(); - iBuilder.vertex(matrix, p_228884_5_, p_228884_7_, p_228884_10_).color(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F).endVertex(); - iBuilder.vertex(matrix, p_228884_4_, p_228884_7_, p_228884_11_).color(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F).endVertex(); + iBuilder.addVertex(matrix, p_228884_4_, p_228884_6_, p_228884_8_).setColor(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F); + iBuilder.addVertex(matrix, p_228884_5_, p_228884_6_, p_228884_9_).setColor(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F); + iBuilder.addVertex(matrix, p_228884_5_, p_228884_7_, p_228884_10_).setColor(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F); + iBuilder.addVertex(matrix, p_228884_4_, p_228884_7_, p_228884_11_).setColor(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F); } else if (tileEntityIn.isHorizontal && (direction == Direction.UP || direction == Direction.DOWN)) { - iBuilder.vertex(matrix, p_228884_4_, p_228884_6_, p_228884_8_).color(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F).endVertex(); - iBuilder.vertex(matrix, p_228884_5_, p_228884_6_, p_228884_9_).color(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F).endVertex(); - iBuilder.vertex(matrix, p_228884_5_, p_228884_7_, p_228884_10_).color(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F).endVertex(); - iBuilder.vertex(matrix, p_228884_4_, p_228884_7_, p_228884_11_).color(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F).endVertex(); + iBuilder.addVertex(matrix, p_228884_4_, p_228884_6_, p_228884_8_).setColor(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F); + iBuilder.addVertex(matrix, p_228884_5_, p_228884_6_, p_228884_9_).setColor(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F); + iBuilder.addVertex(matrix, p_228884_5_, p_228884_7_, p_228884_10_).setColor(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F); + iBuilder.addVertex(matrix, p_228884_4_, p_228884_7_, p_228884_11_).setColor(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RedstoneRelayRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RedstoneRelayRenderer.java index af2d0ea4d7..5ca60ef847 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RedstoneRelayRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RedstoneRelayRenderer.java @@ -23,7 +23,7 @@ public RedstoneRelayRenderer(BlockEntityRendererProvider.Context rendererDispatc } @Override - public void renderRecursively(PoseStack poseStack, RedstoneRelayTile animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderRecursively(PoseStack poseStack, RedstoneRelayTile animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { ArrayList strings = new ArrayList<>(List.of(new String[]{ "framework_input", "bone", @@ -33,15 +33,15 @@ public void renderRecursively(PoseStack poseStack, RedstoneRelayTile animatable, })); if (strings.contains(bone.getName())) { //NOTE: if the bone have a parent, the recursion will get here with the neutral color, making the color getter useless - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, Color.WHITE.getRed() / 255f, Color.WHITE.getGreen() / 255f, Color.WHITE.getBlue() / 255f, Color.WHITE.getAlpha() / 255f); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, Color.WHITE.getRed() / 255f, Color.WHITE.argbInt()); } else { - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } } @Override - public void actuallyRender(PoseStack poseStack, RedstoneRelayTile animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + public void actuallyRender(PoseStack poseStack, RedstoneRelayTile animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { + super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } @Override @@ -53,7 +53,7 @@ public static GenericItemBlockRenderer getISTER() { return new GenericItemBlockRenderer(new GenericModel<>("redstone_relay")){ @Override - public void renderRecursively(PoseStack poseStack, AnimBlockItem animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderRecursively(PoseStack poseStack, AnimBlockItem animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay,int color) { ArrayList strings = new ArrayList<>(List.of(new String[]{ "framework_input", "bone", @@ -63,9 +63,9 @@ public void renderRecursively(PoseStack poseStack, AnimBlockItem animatable, Geo })); if (strings.contains(bone.getName())) { //NOTE: if the bone have a parent, the recursion will get here with the neutral color, making the color getter useless - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, Color.WHITE.getRed() / 255f, Color.WHITE.getGreen() / 255f, Color.WHITE.getBlue() / 255f, Color.WHITE.getAlpha() / 255f); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, Color.WHITE.argbInt()); } else { - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RepositoryRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RepositoryRenderer.java index 81aa94dc7b..2a2985e3f5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RepositoryRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RepositoryRenderer.java @@ -21,7 +21,7 @@ public RepositoryRenderer(BlockEntityRendererProvider.Context rendererProvider) public static GenericItemBlockRenderer getISTER() { return new GenericItemBlockRenderer(model) { @Override - public void actuallyRender(PoseStack poseStack, AnimBlockItem animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void actuallyRender(PoseStack poseStack, AnimBlockItem animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { int level = 0; model.getBone("1").get().setHidden(level == 0); model.getBone("2_3").get().setHidden(level < 3); @@ -33,7 +33,7 @@ public void actuallyRender(PoseStack poseStack, AnimBlockItem animatable, BakedG model.getBone("19_21").get().setHidden(level < 13); model.getBone("22_24").get().setHidden(level < 14); model.getBone("25_27").get().setHidden(level < 15); - super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } }; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RotatingTurretRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RotatingTurretRenderer.java index 5188c3056f..20d5abd9bc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RotatingTurretRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RotatingTurretRenderer.java @@ -17,8 +17,8 @@ public RotatingTurretRenderer(BlockEntityRendererProvider.Context rendererDispat } @Override - public void actuallyRender(PoseStack poseStack, RotatingTurretTile tile, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - super.actuallyRender(poseStack, tile, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + public void actuallyRender(PoseStack poseStack, RotatingTurretTile tile, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { + super.actuallyRender(poseStack, tile, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); float rotationX = tile.rotationX; float neededRotationX = tile.clientNeededX; float rotationY = tile.rotationY; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RuneRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RuneRenderer.java index 91ccf9a6e0..10a52bcab2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RuneRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RuneRenderer.java @@ -24,17 +24,17 @@ public RuneRenderer(BlockEntityRendererProvider.Context rendererDispatcherIn) { } @Override - public void preRender(PoseStack poseStack, RuneTile animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void preRender(PoseStack poseStack, RuneTile animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { } @Override - public void renderFinal(PoseStack poseStack, RuneTile animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderFinal(PoseStack poseStack, RuneTile animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay, int color) { } @Override - public void actuallyRender(PoseStack poseStack, RuneTile animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void actuallyRender(PoseStack poseStack, RuneTile animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { ParticleColor color = animatable.spell.color; poseStack.pushPose(); Direction direction = animatable.getBlockState().getValue(BasicSpellTurret.FACING); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScribesRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScribesRenderer.java index c3eb2e1313..3d2bf47d5d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScribesRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScribesRenderer.java @@ -36,7 +36,7 @@ public ScribesRenderer(BlockEntityRendererProvider.Context rendererDispatcherIn) } @Override - public void preRender(PoseStack stack, ScribesTile tile, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void preRender(PoseStack stack, ScribesTile tile, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { if (tile.getLevel().getBlockState(tile.getBlockPos()).getBlock() != BlockRegistry.SCRIBES_BLOCK.get()) return; if (tile.getLevel().getBlockState(tile.getBlockPos()).getValue(ScribesBlock.PART) != ThreePartBlock.HEAD) @@ -64,12 +64,12 @@ public void preRender(PoseStack stack, ScribesTile tile, BakedGeoModel model, Mu stack.translate(0, 0, 0); } - super.preRender(stack, tile, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.preRender(stack, tile, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); stack.popPose(); } @Override - public void actuallyRender(PoseStack stack, ScribesTile tile, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void actuallyRender(PoseStack stack, ScribesTile tile, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { if (tile.getLevel().getBlockState(tile.getBlockPos()).getBlock() != BlockRegistry.SCRIBES_BLOCK.get()) return; if (tile.getLevel().getBlockState(tile.getBlockPos()).getValue(ScribesBlock.PART) != ThreePartBlock.HEAD) @@ -97,13 +97,13 @@ public void actuallyRender(PoseStack stack, ScribesTile tile, BakedGeoModel mode stack.translate(0, 0, 0); } - super.actuallyRender(stack, tile, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.actuallyRender(stack, tile, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); stack.popPose(); } @Override - public void renderFinal(PoseStack stack, ScribesTile tile, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void renderFinal(PoseStack stack, ScribesTile tile, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay, int color) { if (tile.getLevel().getBlockState(tile.getBlockPos()).getBlock() != BlockRegistry.SCRIBES_BLOCK.get()) return; if (tile.getLevel().getBlockState(tile.getBlockPos()).getValue(ScribesBlock.PART) != ThreePartBlock.HEAD) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScryerOculusRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScryerOculusRenderer.java index 6b41efce4e..4c4bf47829 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScryerOculusRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScryerOculusRenderer.java @@ -10,6 +10,7 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.util.Mth; import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; public class ScryerOculusRenderer extends ArsGeoBlockRenderer { @@ -21,7 +22,7 @@ public ScryerOculusRenderer(BlockEntityRendererProvider.Context rendererDispatch @Override - public void actuallyRender(PoseStack poseStack, ScryersOculusTile pBlockEntity, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + public void actuallyRender(PoseStack poseStack, ScryersOculusTile pBlockEntity, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { GeoBone eye = this.getGeoModel().getBone("eye").orElse(null); if (eye == null) return; @@ -37,7 +38,7 @@ public void actuallyRender(PoseStack poseStack, ScryersOculusTile pBlockEntity, float f2 = pBlockEntity.oRot + f1 * ClientInfo.partialTicks - 4.7f; eye.setRotY(-f2); eye.setPosY((Mth.sin((ClientInfo.ticksInGame + ClientInfo.partialTicks) / 10.0f)) / 2f); - super.actuallyRender(poseStack, pBlockEntity, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + super.actuallyRender(poseStack, pBlockEntity, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } public static GenericItemBlockRenderer getISTER() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/world/WorldEventContext.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/world/WorldEventContext.java index 90e92fa71b..7bf12dfb76 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/world/WorldEventContext.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/world/WorldEventContext.java @@ -1,10 +1,8 @@ package com.hollingsworth.arsnouveau.client.renderer.world; -import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.client.event.RenderLevelStageEvent; @@ -16,7 +14,7 @@ public class WorldEventContext { public static final WorldEventContext INSTANCE = new WorldEventContext(); - public static MultiBufferSource.BufferSource bufferSource = MultiBufferSource.immediate(new BufferBuilder(256)); +// public static MultiBufferSource.BufferSource bufferSource = MultiBufferSource.immediate(new BufferBuilder(256)); private WorldEventContext() { // singleton diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/world/WorldRenderMacros.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/world/WorldRenderMacros.java deleted file mode 100644 index 8d9cc8fc64..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/world/WorldRenderMacros.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.hollingsworth.arsnouveau.client.renderer.world; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.core.BlockPos; -import org.joml.Matrix4f; - -public class WorldRenderMacros { - - - public static void renderBox(final MultiBufferSource.BufferSource buffer, - final PoseStack ps, - final BlockPos posA, - final BlockPos posB, - final int argbColor) - { - renderBox(buffer.getBuffer(RenderType.LINES), - ps, - posA, - posB, - (argbColor >> 16) & 0xff, - (argbColor >> 8) & 0xff, - argbColor & 0xff, - (argbColor >> 24) & 0xff); - } - - public static void renderBox(final VertexConsumer buffer, - final PoseStack ps, - final BlockPos posA, - final BlockPos posB, - final int red, - final int green, - final int blue, - final int alpha) - { - if (alpha == 0) - { - return; - } - - final float minX = Math.min(posA.getX(), posB.getX()); - final float minY = Math.min(posA.getY(), posB.getY()); - final float minZ = Math.min(posA.getZ(), posB.getZ()); - - final float maxX = Math.max(posA.getX(), posB.getX()) + 1; - final float maxY = Math.max(posA.getY(), posB.getY()) + 1; - final float maxZ = Math.max(posA.getZ(), posB.getZ()) + 1; - - final Matrix4f m = ps.last().pose(); - buffer.defaultColor(red, green, blue, alpha); - - populateCuboid(minX, minY, minZ, maxX, maxY, maxZ, m, buffer); - - buffer.unsetDefaultColor(); - } - - public static void populateCuboid(final float minX, - final float minY, - final float minZ, - final float maxX, - final float maxY, - final float maxZ, - final Matrix4f m, - final VertexConsumer buf) - { - // z plane - - buf.vertex(m, minX, maxY, minZ).endVertex(); - buf.vertex(m, maxX, minY, minZ).endVertex(); - buf.vertex(m, minX, minY, minZ).endVertex(); - - buf.vertex(m, minX, maxY, minZ).endVertex(); - buf.vertex(m, maxX, maxY, minZ).endVertex(); - buf.vertex(m, maxX, minY, minZ).endVertex(); - - buf.vertex(m, minX, maxY, maxZ).endVertex(); - buf.vertex(m, minX, minY, maxZ).endVertex(); - buf.vertex(m, maxX, minY, maxZ).endVertex(); - - buf.vertex(m, minX, maxY, maxZ).endVertex(); - buf.vertex(m, maxX, minY, maxZ).endVertex(); - buf.vertex(m, maxX, maxY, maxZ).endVertex(); - - // y plane - - buf.vertex(m, minX, minY, maxZ).endVertex(); - buf.vertex(m, minX, minY, minZ).endVertex(); - buf.vertex(m, maxX, minY, minZ).endVertex(); - - buf.vertex(m, minX, minY, maxZ).endVertex(); - buf.vertex(m, maxX, minY, minZ).endVertex(); - buf.vertex(m, maxX, minY, maxZ).endVertex(); - - buf.vertex(m, minX, maxY, maxZ).endVertex(); - buf.vertex(m, maxX, maxY, minZ).endVertex(); - buf.vertex(m, minX, maxY, minZ).endVertex(); - - buf.vertex(m, minX, maxY, maxZ).endVertex(); - buf.vertex(m, maxX, maxY, maxZ).endVertex(); - buf.vertex(m, maxX, maxY, minZ).endVertex(); - - // x plane - - buf.vertex(m, minX, minY, maxZ).endVertex(); - buf.vertex(m, minX, maxY, minZ).endVertex(); - buf.vertex(m, minX, minY, minZ).endVertex(); - - buf.vertex(m, minX, minY, maxZ).endVertex(); - buf.vertex(m, minX, maxY, maxZ).endVertex(); - buf.vertex(m, minX, maxY, minZ).endVertex(); - - buf.vertex(m, maxX, minY, maxZ).endVertex(); - buf.vertex(m, maxX, minY, minZ).endVertex(); - buf.vertex(m, maxX, maxY, minZ).endVertex(); - - buf.vertex(m, maxX, minY, maxZ).endVertex(); - buf.vertex(m, maxX, maxY, minZ).endVertex(); - buf.vertex(m, maxX, maxY, maxZ).endVertex(); - } - - - public static void renderFillRectangle(final MultiBufferSource.BufferSource buffer, - final PoseStack ps, - final int x, - final int y, - final int z, - final int w, - final int h, - final int argbColor) - { - populateRectangle(x, - y, - z, - w, - h, - (argbColor >> 16) & 0xff, - (argbColor >> 8) & 0xff, - argbColor & 0xff, - (argbColor >> 24) & 0xff, - buffer.getBuffer(RenderType.LINES), - ps.last().pose()); - } - - public static void populateRectangle(final int x, - final int y, - final int z, - final int w, - final int h, - final int red, - final int green, - final int blue, - final int alpha, - final VertexConsumer buffer, - final Matrix4f m) - { - if (alpha == 0) - { - return; - } - - buffer.vertex(m, x, y, z).color(red, green, blue, alpha).endVertex(); - buffer.vertex(m, x, y + h, z).color(red, green, blue, alpha).endVertex(); - buffer.vertex(m, x + w, y + h, z).color(red, green, blue, alpha).endVertex(); - - buffer.vertex(m, x, y, z).color(red, green, blue, alpha).endVertex(); - buffer.vertex(m, x + w, y + h, z).color(red, green, blue, alpha).endVertex(); - buffer.vertex(m, x + w, y, z).color(red, green, blue, alpha).endVertex(); - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java index 086bf4e80f..45cf039242 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java @@ -25,6 +25,7 @@ import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.*; +import net.minecraft.world.item.component.ItemAttributeModifiers; import net.minecraft.world.level.Level; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; @@ -85,6 +86,11 @@ public void onArmorTick(ItemStack stack, Level world, Player player) { } } + @Override + public ItemAttributeModifiers getDefaultAttributeModifiers(ItemStack stack) { + return super.getDefaultAttributeModifiers(stack); + } + @Override public Multimap getAttributeModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack) { ImmutableMultimap.Builder attributes = new ImmutableMultimap.Builder<>(); @@ -93,8 +99,8 @@ public Multimap getAttributeModifiers(EquipmentSlo UUID uuid = ARMOR_MODIFIER_UUID_PER_TYPE.get(type); IPerkHolder perkHolder = PerkUtil.getPerkHolder(stack); if (perkHolder != null) { - attributes.put(PerkAttributes.MAX_MANA.get(), new AttributeModifier(uuid, "max_mana_armor", 30 * (perkHolder.getTier() + 1), AttributeModifier.Operation.ADDITION)); - attributes.put(PerkAttributes.MANA_REGEN_BONUS.get(), new AttributeModifier(uuid, "mana_regen_armor", perkHolder.getTier() + 1, AttributeModifier.Operation.ADDITION)); + attributes.put(PerkAttributes.MAX_MANA.get(), new AttributeModifier(uuid, "max_mana_armor", 30 * (perkHolder.getTier() + 1), AttributeModifier.Operation.ADD_VALUE)); + attributes.put(PerkAttributes.MANA_REGEN_BONUS.get(), new AttributeModifier(uuid, "mana_regen_armor", perkHolder.getTier() + 1, AttributeModifier.Operation.ADD_VALUE)); for (PerkInstance perkInstance : perkHolder.getPerkInstances()) { IPerk perk = perkInstance.getPerk(); attributes.putAll(perk.getModifiers(this.type.getSlot(), stack, perkInstance.getSlot().value)); @@ -107,7 +113,7 @@ public Multimap getAttributeModifiers(EquipmentSlo @Override @OnlyIn(Dist.CLIENT) - public void appendHoverText(ItemStack stack, Level world, List tooltip, TooltipFlag flag) { + public void appendHoverText(ItemStack stack, TooltipContext world, List tooltip, TooltipFlag flag) { super.appendHoverText(stack, world, tooltip, flag); IPerkProvider perkProvider = PerkRegistry.getPerkProvider(stack.getItem()); if (perkProvider != null) { @@ -164,9 +170,9 @@ public GeoModel getArmorModel() { * Needed to avoid file not found errors since Geckolib doesn't redirect to the correct texture */ @Override - public @Nullable String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String type) { + public @Nullable ResourceLocation getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, ArmorMaterial.Layer layer, boolean innerModel) { GenericModel genericModel = (GenericModel) model; - return ArsNouveau.prefix( "textures/" + genericModel.textPathRoot + "/" + genericModel.name + "_" + this.getColor(stack) + ".png").toString(); + return ArsNouveau.prefix( "textures/" + genericModel.textPathRoot + "/" + genericModel.name + "_" + this.getColor(stack) + ".png"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/Materials.java b/src/main/java/com/hollingsworth/arsnouveau/common/armor/Materials.java index cfe6cba66e..91f0420796 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/Materials.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/armor/Materials.java @@ -1,86 +1,79 @@ package com.hollingsworth.arsnouveau.common.armor; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import net.minecraft.Util; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; -import net.minecraft.util.LazyLoadedValue; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.crafting.Ingredient; +import net.neoforged.neoforge.registries.DeferredRegister; +import java.util.EnumMap; +import java.util.List; import java.util.function.Supplier; -public class Materials { - - public static final ANArmorMaterial LIGHT = new ANArmorMaterial("an_light", 25, new int[]{1, 3, 5, 2}, - 30, SoundEvents.ARMOR_EQUIP_LEATHER, 0.0F, () -> Ingredient.of(ItemsRegistry.MAGE_FIBER)); - - public static final ANArmorMaterial MEDIUM = new ANArmorMaterial("an_medium", 25, new int[]{2, 5, 6, 2}, - 30, SoundEvents.ARMOR_EQUIP_LEATHER, 0.0F, () -> Ingredient.of(ItemsRegistry.MAGE_FIBER)); - - public static final ANArmorMaterial HEAVY = new ANArmorMaterial("an_heavy", 33, new int[]{3, 6, 8, 3}, - 30, SoundEvents.ARMOR_EQUIP_LEATHER, 2.0f, () -> Ingredient.of(ItemsRegistry.MAGE_FIBER)); - - public static class ANArmorMaterial implements ArmorMaterial { - - private static final int[] Max_Damage_Array = new int[]{13, 15, 16, 11}; - private final String name; - private final int maxDamageFactor; - private final int[] damageReductionAmountArray; - private final int enchantability; +import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; - public ANArmorMaterial(String name, int maxDamageFactor, int[] damageReductionAmountArray, int enchantability, SoundEvent soundEvent, float toughness, Supplier supplier) { - this.name = name; - this.maxDamageFactor = maxDamageFactor; - this.damageReductionAmountArray = damageReductionAmountArray; - this.enchantability = enchantability; - this.soundEvent = soundEvent; - this.toughness = toughness; - this.repairMaterial = new LazyLoadedValue<>(supplier); - } - - private final SoundEvent soundEvent; - private final float toughness; - private final LazyLoadedValue repairMaterial; - - @Override - public int getDurabilityForType(ArmorItem.Type p_266807_) { - return Max_Damage_Array[p_266807_.getSlot().getIndex()] * maxDamageFactor; - } - - @Override - public int getDefenseForType(ArmorItem.Type p_267168_) { - return damageReductionAmountArray[p_267168_.getSlot().getIndex()]; - } - - @Override - public int getEnchantmentValue() { - return enchantability; - } - - @Override - public SoundEvent getEquipSound() { - return soundEvent; - } - - @Override - public Ingredient getRepairIngredient() { - return repairMaterial.get(); - } - - @Override - public String getName() { - return name; - } +public class Materials { + public static final DeferredRegister MATERIALS = DeferredRegister.create(BuiltInRegistries.ARMOR_MATERIAL, MODID); + + + public static final Holder LIGHT = MATERIALS.register("an_light", () -> register("an_light", Util.make(new EnumMap<>(ArmorItem.Type.class), map -> { + map.put(ArmorItem.Type.BOOTS, 1); + map.put(ArmorItem.Type.LEGGINGS, 3); + map.put(ArmorItem.Type.CHESTPLATE, 5); + map.put(ArmorItem.Type.HELMET, 2); + map.put(ArmorItem.Type.BODY, 4); + }), 30, SoundEvents.ARMOR_EQUIP_LEATHER, 0.0f, 0.0f, () -> Ingredient.of(ItemsRegistry.MAGE_FIBER))); + + public static final Holder MEDIUM = MATERIALS.register("an_medium", () -> register("an_medium", Util.make(new EnumMap<>(ArmorItem.Type.class), map -> { + map.put(ArmorItem.Type.BOOTS, 2); + map.put(ArmorItem.Type.LEGGINGS, 5); + map.put(ArmorItem.Type.CHESTPLATE, 6); + map.put(ArmorItem.Type.HELMET, 2); + map.put(ArmorItem.Type.BODY, 4); + }), 30, SoundEvents.ARMOR_EQUIP_LEATHER, 0.0f, 0.0f, () -> Ingredient.of(ItemsRegistry.MAGE_FIBER))); + + public static final Holder HEAVY = MATERIALS.register("an_heavy", () -> register("an_heavy", Util.make(new EnumMap<>(ArmorItem.Type.class), map -> { + map.put(ArmorItem.Type.BOOTS, 3); + map.put(ArmorItem.Type.LEGGINGS, 6); + map.put(ArmorItem.Type.CHESTPLATE, 8); + map.put(ArmorItem.Type.HELMET, 3); + map.put(ArmorItem.Type.BODY, 4); + }), 30, SoundEvents.ARMOR_EQUIP_LEATHER, 0.0f, 0.0f, () -> Ingredient.of(ItemsRegistry.MAGE_FIBER))); + + private static ArmorMaterial register( + String pName, + EnumMap pDefense, + int pEnchantmentValue, + Holder pEquipSound, + float pToughness, + float pKnockbackResistance, + Supplier pRepairIngredient + ) { + List list = List.of(new ArmorMaterial.Layer(ArsNouveau.prefix(pName))); + return register(pDefense, pEnchantmentValue, pEquipSound, pToughness, pKnockbackResistance, pRepairIngredient, list); + } - @Override - public float getToughness() { - return toughness; + private static ArmorMaterial register( + EnumMap pDefense, + int pEnchantmentValue, + Holder pEquipSound, + float pToughness, + float pKnockbackResistance, + Supplier pRepairIngridient, + List pLayers + ) { + EnumMap enummap = new EnumMap<>(ArmorItem.Type.class); + + for (ArmorItem.Type armoritem$type : ArmorItem.Type.values()) { + enummap.put(armoritem$type, pDefense.get(armoritem$type)); } - @Override - public float getKnockbackResistance() { - return 0; - } + return new ArmorMaterial(enummap, pEnchantmentValue, pEquipSound, pRepairIngridient, pLayers, pToughness, pKnockbackResistance); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AgronomicSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AgronomicSourcelinkTile.java index 2f3c9e26d8..af9b84009b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AgronomicSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AgronomicSourcelinkTile.java @@ -9,7 +9,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.event.level.SaplingGrowTreeEvent; +import net.neoforged.neoforge.event.level.BlockGrowFeatureEvent; import net.neoforged.neoforge.event.level.block.CropGrowEvent; @EventBusSubscriber(modid = ArsNouveau.MODID) @@ -36,7 +36,7 @@ public static void cropGrow(CropGrowEvent.Post event) { } @SubscribeEvent - public static void treeGrow(SaplingGrowTreeEvent event) { + public static void treeGrow(BlockGrowFeatureEvent event) { int mana = 50; if (event.getLevel().getBlockState(event.getPos()).is(BlockTagProvider.MAGIC_SAPLINGS)) { mana += 50; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java index 89613e9402..b426654968 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java @@ -98,7 +98,7 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis CompoundTag compoundnbt = listnbt.getCompound(i); int j = compoundnbt.getInt("Slot"); if (j >= 0 && j < craftMatrix.getContainerSize()) { - craftMatrix.setItem(j, ItemStack.of(compoundnbt)); + craftMatrix.setItem(j, ItemStack.parseOptional(pRegistries, compoundnbt)); } } reading = false; @@ -139,7 +139,7 @@ public void craft(Player thePlayer, @Nullable String tab) { if(currentRecipe == null) { return; } - NonNullList remainder = currentRecipe.getRemainingItems(craftMatrix); + NonNullList remainder = currentRecipe.getRemainingItems(craftMatrix.asCraftInput()); boolean playerInvUpdate = false; for (int i = 0; i < remainder.size(); ++i) { ItemStack currentStack = craftMatrix.getItem(i); @@ -202,14 +202,17 @@ public void registerCrafting(CraftingTerminalMenu containerCraftingTerminal) { } protected void onCraftingMatrixChanged() { - if (currentRecipe == null || !currentRecipe.matches(craftMatrix, level)) { - currentRecipe = level.getRecipeManager().getRecipeFor(RecipeType.CRAFTING, craftMatrix, level).orElse(null); + if (currentRecipe == null || !currentRecipe.matches(craftMatrix.asCraftInput(), level)) { + var holder = level.getRecipeManager().getRecipeFor(RecipeType.CRAFTING, craftMatrix.asCraftInput(), level).orElse(null); + if(holder != null){ + currentRecipe = holder.value(); + } } if (currentRecipe == null) { craftResult.setItem(0, ItemStack.EMPTY); } else { - craftResult.setItem(0, currentRecipe.assemble(craftMatrix, level.registryAccess())); + craftResult.setItem(0, currentRecipe.assemble(craftMatrix.asCraftInput(), level.registryAccess())); } craftingListeners.forEach(CraftingTerminalMenu::onCraftMatrixChanged); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/compat/CaelusHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/compat/CaelusHandler.java index b4cdcb6b48..0d3ec3aefd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/compat/CaelusHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/compat/CaelusHandler.java @@ -1,14 +1,15 @@ package com.hollingsworth.arsnouveau.common.compat; +import com.illusivesoulworks.caelus.api.CaelusApi; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.player.Player; -import top.theillusivec4.caelus.api.CaelusApi; + public class CaelusHandler { public static void setFlying(Player entity) { - AttributeInstance attributeInstance = entity.getAttribute(CaelusApi.getInstance().getFlightAttribute()); - if (attributeInstance != null && !attributeInstance.hasModifier(CaelusApi.getInstance().getElytraModifier())) + AttributeInstance attributeInstance = entity.getAttribute(CaelusApi.getInstance().getFallFlyingAttribute()); + if (attributeInstance != null && !attributeInstance.hasModifier(CaelusApi.getInstance().getElytraModifier().id())) attributeInstance.addTransientModifier(CaelusApi.getInstance().getElytraModifier()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java index 645a8f2cb4..48facc36da 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CrushRecipe.java @@ -42,16 +42,6 @@ public List getRolledOutputs(RandomSource random) { return finalOutputs; } - public CrushRecipe withItems(ItemStack output, float chance) { - this.outputs.add(new CrushOutput(output, chance)); - return this; - } - - public CrushRecipe withItems(ItemStack output) { - this.outputs.add(new CrushOutput(output, 1.0f)); - return this; - } - public boolean shouldSkipBlockPlace() { return this.skipBlockPlace; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CrushRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CrushRecipeProvider.java index 84ce72ad9f..a73d3a2e9a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CrushRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CrushRecipeProvider.java @@ -1,21 +1,25 @@ package com.hollingsworth.arsnouveau.common.datagen; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.crafting.recipes.CrushRecipe; +import com.mojang.serialization.JsonOps; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.block.Blocks; import net.neoforged.neoforge.common.Tags; + import java.nio.file.Path; import java.util.ArrayList; import java.util.List; public class CrushRecipeProvider extends SimpleDataProvider { - public List recipes = new ArrayList<>(); + public List recipes = new ArrayList<>(); public CrushRecipeProvider(DataGenerator generatorIn) { super(generatorIn); @@ -23,42 +27,64 @@ public CrushRecipeProvider(DataGenerator generatorIn) { @Override public void collectJsons(CachedOutput pOutput) { - recipes.add(new CrushRecipe("stone", Ingredient.of(Tags.Items.STONES)) + recipes.add(new CrushWrapper("stone", Ingredient.of(Tags.Items.STONES)) .withItems(Items.GRAVEL.getDefaultInstance(), 1.0f)); - recipes.add(new CrushRecipe("gravel", Ingredient.of(Tags.Items.GRAVELS)) + recipes.add(new CrushWrapper("gravel", Ingredient.of(Tags.Items.GRAVELS)) .withItems(Items.SAND.getDefaultInstance(), 1.0f) .withItems(Items.FLINT.getDefaultInstance(), 0.02f)); - recipes.add(new CrushRecipe("cobblestone", Ingredient.of(Tags.Items.COBBLESTONES)).withItems(Items.GRAVEL.getDefaultInstance(), 1.0f)); - recipes.add(new CrushRecipe("white_dye", Ingredient.of(Items.LILY_OF_THE_VALLEY)).withItems(new ItemStack(Items.WHITE_DYE, 2))); - recipes.add(new CrushRecipe("orange_dye", Ingredient.of(Items.ORANGE_TULIP)).withItems(new ItemStack(Items.ORANGE_DYE, 2))); - recipes.add(new CrushRecipe("magenta_dye", Ingredient.of(Items.ALLIUM)).withItems(new ItemStack(Items.MAGENTA_DYE, 2))); - recipes.add(new CrushRecipe("light_blue_dye", Ingredient.of(Items.BLUE_ORCHID)).withItems(new ItemStack(Items.LIGHT_BLUE_DYE, 2))); - recipes.add(new CrushRecipe("yellow_dye", Ingredient.of(Items.DANDELION)).withItems(new ItemStack(Items.YELLOW_DYE, 2))); - recipes.add(new CrushRecipe("pink_dye", Ingredient.of(Items.PINK_TULIP)).withItems(new ItemStack(Items.PINK_DYE, 2))); - recipes.add(new CrushRecipe("light_gray_dye_oxeye", Ingredient.of(Items.OXEYE_DAISY)).withItems(new ItemStack(Items.LIGHT_GRAY_DYE, 2))); - recipes.add(new CrushRecipe("light_gray_dye_azure", Ingredient.of(Items.AZURE_BLUET)).withItems(new ItemStack(Items.LIGHT_GRAY_DYE, 2))); - recipes.add(new CrushRecipe("light_gray_dye_tulip", Ingredient.of(Items.WHITE_TULIP)).withItems(new ItemStack(Items.LIGHT_GRAY_DYE, 2))); - recipes.add(new CrushRecipe("blue_dye", Ingredient.of(Items.CORNFLOWER)).withItems(new ItemStack(Items.BLUE_DYE, 2))); - recipes.add(new CrushRecipe("brown_dye", Ingredient.of(Items.COCOA_BEANS)).withItems(new ItemStack(Items.BROWN_DYE, 2))); - recipes.add(new CrushRecipe("red_dye_tulip", Ingredient.of(Items.RED_TULIP)).withItems(new ItemStack(Items.RED_DYE, 2))); - recipes.add(new CrushRecipe("red_dye_beetroot", Ingredient.of(Items.BEETROOT)).withItems(new ItemStack(Items.RED_DYE, 2))); - recipes.add(new CrushRecipe("red_dye_poppy", Ingredient.of(Items.POPPY)).withItems(new ItemStack(Items.RED_DYE, 2))); - recipes.add(new CrushRecipe("red_dye_rose_bush", Ingredient.of(Items.ROSE_BUSH)).withItems(new ItemStack(Items.RED_DYE, 4))); - recipes.add(new CrushRecipe("yellow_dye_sunflower", Ingredient.of(Items.SUNFLOWER)).withItems(new ItemStack(Items.YELLOW_DYE, 4))); - recipes.add(new CrushRecipe("magenta_dye_lilac", Ingredient.of(Items.LILAC)).withItems(new ItemStack(Items.MAGENTA_DYE, 4))); - recipes.add(new CrushRecipe("pink_dye_peony", Ingredient.of(Items.PEONY)).withItems(new ItemStack(Items.PINK_DYE, 4))); + recipes.add(new CrushWrapper("cobblestone", Ingredient.of(Tags.Items.COBBLESTONES)).withItems(Items.GRAVEL.getDefaultInstance(), 1.0f)); + recipes.add(new CrushWrapper("white_dye", Ingredient.of(Items.LILY_OF_THE_VALLEY)).withItems(new ItemStack(Items.WHITE_DYE, 2))); + recipes.add(new CrushWrapper("orange_dye", Ingredient.of(Items.ORANGE_TULIP)).withItems(new ItemStack(Items.ORANGE_DYE, 2))); + recipes.add(new CrushWrapper("magenta_dye", Ingredient.of(Items.ALLIUM)).withItems(new ItemStack(Items.MAGENTA_DYE, 2))); + recipes.add(new CrushWrapper("light_blue_dye", Ingredient.of(Items.BLUE_ORCHID)).withItems(new ItemStack(Items.LIGHT_BLUE_DYE, 2))); + recipes.add(new CrushWrapper("yellow_dye", Ingredient.of(Items.DANDELION)).withItems(new ItemStack(Items.YELLOW_DYE, 2))); + recipes.add(new CrushWrapper("pink_dye", Ingredient.of(Items.PINK_TULIP)).withItems(new ItemStack(Items.PINK_DYE, 2))); + recipes.add(new CrushWrapper("light_gray_dye_oxeye", Ingredient.of(Items.OXEYE_DAISY)).withItems(new ItemStack(Items.LIGHT_GRAY_DYE, 2))); + recipes.add(new CrushWrapper("light_gray_dye_azure", Ingredient.of(Items.AZURE_BLUET)).withItems(new ItemStack(Items.LIGHT_GRAY_DYE, 2))); + recipes.add(new CrushWrapper("light_gray_dye_tulip", Ingredient.of(Items.WHITE_TULIP)).withItems(new ItemStack(Items.LIGHT_GRAY_DYE, 2))); + recipes.add(new CrushWrapper("blue_dye", Ingredient.of(Items.CORNFLOWER)).withItems(new ItemStack(Items.BLUE_DYE, 2))); + recipes.add(new CrushWrapper("brown_dye", Ingredient.of(Items.COCOA_BEANS)).withItems(new ItemStack(Items.BROWN_DYE, 2))); + recipes.add(new CrushWrapper("red_dye_tulip", Ingredient.of(Items.RED_TULIP)).withItems(new ItemStack(Items.RED_DYE, 2))); + recipes.add(new CrushWrapper("red_dye_beetroot", Ingredient.of(Items.BEETROOT)).withItems(new ItemStack(Items.RED_DYE, 2))); + recipes.add(new CrushWrapper("red_dye_poppy", Ingredient.of(Items.POPPY)).withItems(new ItemStack(Items.RED_DYE, 2))); + recipes.add(new CrushWrapper("red_dye_rose_bush", Ingredient.of(Items.ROSE_BUSH)).withItems(new ItemStack(Items.RED_DYE, 4))); + recipes.add(new CrushWrapper("yellow_dye_sunflower", Ingredient.of(Items.SUNFLOWER)).withItems(new ItemStack(Items.YELLOW_DYE, 4))); + recipes.add(new CrushWrapper("magenta_dye_lilac", Ingredient.of(Items.LILAC)).withItems(new ItemStack(Items.MAGENTA_DYE, 4))); + recipes.add(new CrushWrapper("pink_dye_peony", Ingredient.of(Items.PEONY)).withItems(new ItemStack(Items.PINK_DYE, 4))); + recipes.add(new CrushWrapper("terracotta", Ingredient.of(Items.TERRACOTTA)).withItems(Items.RED_SAND.getDefaultInstance())); + recipes.add(new CrushWrapper("sugar_cane", Ingredient.of(Items.SUGAR_CANE)).withItems(new ItemStack(Items.SUGAR, 2))); + recipes.add(new CrushWrapper("sandstone_to_sand", Ingredient.of(Items.SANDSTONE)).withItems(Items.SAND.getDefaultInstance())); + recipes.add(new CrushWrapper("quartz_block_to_quartz", Ingredient.of(ItemTagProvider.STORAGE_BLOCKS_QUARTZ)).withItems((new ItemStack(Items.QUARTZ, 4)))); + recipes.add(new CrushWrapper("glowstone_block_to_dust", Ingredient.of(Blocks.GLOWSTONE)).withItems((new ItemStack(Items.GLOWSTONE_DUST, 4)))); + + + for (CrushWrapper g : recipes) { + Path path = getRecipePath(output, g.path.getPath()); + saveStable(pOutput, CrushRecipe.Serializer.CODEC.codec().encodeStart(JsonOps.INSTANCE, g.asRecipe()).getOrThrow(), path); + } + } + public static class CrushWrapper{ + public ResourceLocation path; + public Ingredient ing; + public CrushWrapper(String string, Ingredient ingredient){ + this.path = ArsNouveau.prefix(string); + this.ing = ingredient; + } + List outputs = new ArrayList<>(); - recipes.add(new CrushRecipe("terracotta", Ingredient.of(Items.TERRACOTTA)).withItems(Items.RED_SAND.getDefaultInstance())); - recipes.add(new CrushRecipe("sugar_cane", Ingredient.of(Items.SUGAR_CANE)).withItems(new ItemStack(Items.SUGAR, 2))); - recipes.add(new CrushRecipe("sandstone_to_sand", Ingredient.of(Items.SANDSTONE)).withItems(Items.SAND.getDefaultInstance())); - recipes.add(new CrushRecipe("quartz_block_to_quartz", Ingredient.of(ItemTagProvider.STORAGE_BLOCKS_QUARTZ)).withItems((new ItemStack(Items.QUARTZ, 4)))); - recipes.add(new CrushRecipe("glowstone_block_to_dust", Ingredient.of(Blocks.GLOWSTONE)).withItems((new ItemStack(Items.GLOWSTONE_DUST, 4)))); + public CrushWrapper withItems(ItemStack output, float chance) { + this.outputs.add(new CrushRecipe.CrushOutput(output, chance)); + return this; + } + public CrushWrapper withItems(ItemStack output) { + this.outputs.add(new CrushRecipe.CrushOutput(output, 1.0f)); + return this; + } - for (CrushRecipe g : recipes) { - Path path = getRecipePath(output, g.getId().getPath()); - saveStable(pOutput, g.asRecipe(), path); + public CrushRecipe asRecipe() { + return new CrushRecipe(this.ing, outputs); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java index dde1f56d44..ec4f3e0def 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java @@ -35,7 +35,7 @@ public void collectJsons(CachedOutput pOutput) { protected void addEntries() { recipes.add(new DispelEntityRecipe(ArsNouveau.prefix( "blaze_powder"), EntityType.BLAZE, EntityType.BLAZE.getDefaultLootTable(), new LootItemCondition[]{ - LootItemEntityPropertyCondition.hasProperties(LootContext.EntityTarget.THIS, EntityPredicate.Builder.entity().flags(EntityFlagsPredicate.Builder.flags().setOnFire(true).build())).build() + LootItemEntityPropertyCondition.hasProperties(LootContext.EntityTarget.THIS, EntityPredicate.Builder.entity().flags(EntityFlagsPredicate.Builder.flags().setOnFire(true))).build() })); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java index d2334aca13..716e4b083b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java @@ -17,6 +17,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.neoforged.neoforge.common.Tags; + import java.nio.file.Path; import java.util.ArrayList; import java.util.List; @@ -93,7 +94,7 @@ public void collectJsons(CachedOutput pOutput) { add(get(EffectLinger.INSTANCE).withItem(ItemsRegistry.MANIPULATION_ESSENCE).withItem(Items.DRAGON_BREATH) .withIngredient(Ingredient.of(Tags.Items.STORAGE_BLOCKS_DIAMOND)) .withIngredient(Ingredient.of(Tags.Items.RODS_BLAZE), 2)); - add(get(EffectPhantomBlock.INSTANCE).withIngredient(Tags.Items.GLASS, 8)); + add(get(EffectPhantomBlock.INSTANCE).withIngredient(Tags.Items.GLASS_BLOCKS, 8)); add(get(EffectPickup.INSTANCE).withItem(Items.HOPPER, 2)); add(get(EffectPull.INSTANCE).withItem(Items.FISHING_ROD, 1)); add(get(EffectRedstone.INSTANCE).withItem(ItemsRegistry.MANIPULATION_ESSENCE).withIngredient(Tags.Items.STORAGE_BLOCKS_REDSTONE, 3)); @@ -118,7 +119,7 @@ public void collectJsons(CachedOutput pOutput) { .withIngredient(Ingredient.of(Tags.Items.STORAGE_BLOCKS_DIAMOND)) .withIngredient(Ingredient.of(Tags.Items.RODS_BLAZE), 2)); add(get(EffectRotate.INSTANCE).withItem(ItemsRegistry.MANIPULATION_ESSENCE)); - add(get(EffectAnimate.INSTANCE).withItem(ItemsRegistry.CONJURATION_ESSENCE).withIngredient(Tags.Items.OBSIDIAN, 3)); + add(get(EffectAnimate.INSTANCE).withItem(ItemsRegistry.CONJURATION_ESSENCE).withIngredient(Tags.Items.OBSIDIANS, 3)); add(get(EffectBurst.INSTANCE).withItem(ItemsRegistry.MANIPULATION_ESSENCE).withItem(Items.TNT, 5).withItem(Items.FIREWORK_STAR)); add(get(AugmentRandomize.INSTANCE).withItem(Items.PINK_CARPET, 2)); add(get(EffectReset.INSTANCE).withItem(Items.TARGET, 1)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java index 6a92fc9eb6..320aab56c6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java @@ -68,7 +68,7 @@ public PatchouliProvider(DataGenerator generatorIn) { public void addEntries() { Block SOURCESTONE = BlockRegistry.getBlock(LibBlockNames.SOURCESTONE); - for (Enchantment g : enchants) { + for (ResourceKey g : enchants) { addEnchantmentPage(g); } for (AbstractRitual r : RitualRegistry.getRitualMap().values()) { @@ -746,7 +746,7 @@ public void addRitualPage(AbstractRitual ritual) { this.pages.add(new PatchouliPage(builder, this.output.resolve("assets/" + ritual.getRegistryName().getNamespace() + "/patchouli_books/worn_notebook/en_us/entries/rituals/" + ritual.getRegistryName().getPath() + ".json"))); } - public void addEnchantmentPage(Enchantment enchantment) { + public void addEnchantmentPage(ResourceKey enchantment) { PatchouliBuilder builder = new PatchouliBuilder(ENCHANTMENTS, enchantment.getDescriptionId()) .withIcon(getRegistryName(Items.ENCHANTED_BOOK).toString()); for (int i = enchantment.getMinLevel(); i <= enchantment.getMaxLevel(); i++) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java index 5bc03ad1bf..907628938c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java @@ -20,6 +20,7 @@ import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; @@ -265,8 +266,7 @@ public void addAdditionalSaveData(CompoundTag tag) { tag.putInt("pickup", pickupCooldown); if (getHeldStack() != null) { - CompoundTag itemTag = new CompoundTag(); - getHeldStack().save(itemTag); + Tag itemTag = getHeldStack().save(level.registryAccess()); tag.put("held", itemTag); } } @@ -283,7 +283,7 @@ public void readAdditionalSaveData(CompoundTag tag) { this.pickupCooldown = tag.getInt("pickup"); if (tag.contains("held")) - setHeldStack(ItemStack.of((CompoundTag) tag.get("held"))); + setHeldStack(ItemStack.parse(level.registryAccess(), tag.get("held")).orElse(ItemStack.EMPTY)); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java index a54b2ce1cd..5ca2806505 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java @@ -7,8 +7,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; @@ -19,6 +17,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.Arrow; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; @@ -28,6 +27,8 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; +import javax.annotation.Nullable; + public class EntitySpellArrow extends Arrow { public SpellResolver spellResolver; public int pierceLeft; @@ -42,13 +43,13 @@ public EntitySpellArrow(EntityType type, Level worldIn) { setDefaultColors(); } - public EntitySpellArrow(Level worldIn, double x, double y, double z) { - super(worldIn, x, y, z); + public EntitySpellArrow(Level worldIn, double x, double y, double z, ItemStack pPickupItemStack, @Nullable ItemStack p_345233_) { + super(worldIn, x, y, z, pPickupItemStack, p_345233_); setDefaultColors(); } - public EntitySpellArrow(Level worldIn, LivingEntity shooter) { - super(worldIn, shooter); + public EntitySpellArrow(Level worldIn, LivingEntity shooter, ItemStack pPickupItemStack, @Nullable ItemStack weaponStack) { + super(worldIn, shooter, pPickupItemStack, weaponStack); setDefaultColors(); } @@ -229,7 +230,7 @@ protected void onHitEntity(EntityHitResult p_213868_1_) { boolean flag = entity.getType() == EntityType.ENDERMAN; int k = entity.getRemainingFireTicks(); if (this.isOnFire() && !flag) { - entity.setSecondsOnFire(5); + entity.setRemainingFireTicks(100); } if (entity.hurt(damagesource, (float) i)) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java index e8840a9a4f..68f0ace5f2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java @@ -38,14 +38,10 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.Tags; -import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -150,9 +146,9 @@ protected void registerGoals() { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(COLOR, "blue"); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(COLOR, "blue"); } @Override @@ -170,7 +166,7 @@ protected PathNavigation createNavigation(Level world) { } public static AttributeSupplier.Builder attributes() { - return Mob.createMobAttributes().add(Attributes.FLYING_SPEED, Attributes.FLYING_SPEED.getDefaultValue()) + return Mob.createMobAttributes().add(Attributes.FLYING_SPEED, Attributes.FLYING_SPEED.value().getDefaultValue()) .add(Attributes.MAX_HEALTH, 20.0D) .add(Attributes.MOVEMENT_SPEED, 0.2D); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/GiftStarbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/GiftStarbuncle.java index 029a246dad..fbfb4462a6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/GiftStarbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/GiftStarbuncle.java @@ -30,11 +30,7 @@ import net.neoforged.neoforge.common.Tags; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; public class GiftStarbuncle extends PathfinderMob implements GeoEntity { @@ -68,7 +64,7 @@ public void tick() { level.addFreshEntity(new ItemEntity(level, getX(), getY() + 0.5, getZ(), stack)); level.playSound(null, getX(), getY(), getZ(), SoundEvents.ILLUSIONER_MIRROR_MOVE, SoundSource.NEUTRAL, 1f, 1f); - ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.POOF_MOB, (ServerLevel) this.level, this.getOnPos(), 10); + ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.POOF_MOB.get(), (ServerLevel) this.level, this.getOnPos(), 10); this.remove(RemovalReason.DISCARDED); } else if (tamingTime == 60 && level.isClientSide) { for (int i = 0; i < 10; i++) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java index 87bfcee706..fd873bedfb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java @@ -13,8 +13,8 @@ import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.Tags; import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; import java.util.HashMap; import java.util.Map; @@ -30,7 +30,7 @@ protected InteractionResult mobInteract(Player player, InteractionHand hand) { return InteractionResult.SUCCESS; if (player.getMainHandItem().is(Tags.Items.GEMS_AMETHYST)) { - player.addEffect(new MobEffectInstance(ModPotions.DEFENCE_EFFECT.get(), 20 * 60 * 3)); + player.addEffect(new MobEffectInstance(ModPotions.DEFENCE_EFFECT, 20 * 60 * 3)); player.getMainHandItem().shrink(1); return InteractionResult.SUCCESS; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java index 06067dcd0b..3c681012ec 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java @@ -17,6 +17,7 @@ import net.minecraft.world.phys.AABB; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.event.entity.player.ItemEntityPickupEvent; import net.neoforged.neoforge.items.wrapper.PlayerMainInvWrapper; import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.animation.PlayState; @@ -51,30 +52,36 @@ public InteractionResult mobInteract(Player player, InteractionHand hand) { @Override public void tick() { super.tick(); - if(level.isClientSide || level.getGameTime() % 20 != 0) + if (level.isClientSide || level.getGameTime() % 20 != 0) return; LivingEntity owner = getOwner(); - if(!(owner instanceof Player player)) + if (!(owner instanceof Player player)) return; FilterableItemHandler filterableItemHandler = new FilterableItemHandler(new PlayerMainInvWrapper(player.inventory), new ArrayList<>()); - InventoryManager manager = new InventoryManager(new ArrayList<>(){{ + InventoryManager manager = new InventoryManager(new ArrayList<>() {{ add(filterableItemHandler); }}); - for(Entity entity : level.getEntities(owner, new AABB(owner.getOnPos()).inflate(5.0))){ - if(entity instanceof ItemEntity i){ + for (Entity entity : level.getEntities(owner, new AABB(owner.getOnPos()).inflate(5.0))) { + if (entity instanceof ItemEntity i) { ItemStack stack = i.getItem(); - if (stack.isEmpty() - || NeoForge.EVENT_BUS.post(new EntityItemPickupEvent(player, i)) - || getOwnerID().equals(i.getOwner()) - || i.hasPickUpDelay() + if (stack.isEmpty() || i.hasPickUpDelay() || i.getPersistentData().getBoolean("PreventRemoteMovement") - || !i.isAlive()) + || !i.isAlive()) { + continue; + } + var prePickup = NeoForge.EVENT_BUS.post(new ItemEntityPickupEvent.Pre(player, i)); + if (prePickup.canPickup().isFalse() + || getOwnerID().equals(i.getOwner())) continue; stack = manager.insertStack(stack); i.setItem(stack); } - if(entity instanceof ExperienceOrb orb){ - if (orb.isRemoved() || NeoForge.EVENT_BUS.post(new net.neoforged.neoforge.event.entity.player.PlayerXpEvent.PickupXp(player, orb))) + if (entity instanceof ExperienceOrb orb) { + if (orb.isRemoved()) { + continue; + } + var pickupEvent = NeoForge.EVENT_BUS.post(new net.neoforged.neoforge.event.entity.player.PlayerXpEvent.PickupXp(player, orb)); + if (pickupEvent.isCanceled()) continue; player.giveExperiencePoints(orb.value); orb.remove(Entity.RemovalReason.DISCARDED); @@ -98,6 +105,6 @@ public ResourceLocation getTexture(FamiliarEntity entity) { String color = getColor().toLowerCase(); if (color.isEmpty()) color = "blue"; - return ArsNouveau.prefix( "textures/entity/book_wyrm_" + color + ".png"); + return ArsNouveau.prefix("textures/entity/book_wyrm_" + color + ".png"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java index 158d557c3e..29b27a92ea 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java @@ -15,10 +15,9 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.Tags; -import net.neoforged.neoforge.event.entity.living.LootingLevelEvent; import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; import java.util.Arrays; @@ -51,14 +50,14 @@ public void onModifier(SpellModifierEvent event) { event.builder.addDamageModifier(2.0f); } } - - public void onLootingEvent(LootingLevelEvent event) { - if (event.getDamageSource() != null && isAlive() && getOwner() != null && event.getDamageSource().getEntity() != null && getOwner().equals(event.getDamageSource().getEntity())) { - if (level.random.nextFloat() > 0.4) { - event.setLootingLevel(event.getLootingLevel() + 1 + random.nextInt(3)); - } - } - } +// TODO: restore looting event +// public void onLootingEvent(LootingLevelEvent event) { +// if (event.getDamageSource() != null && isAlive() && getOwner() != null && event.getDamageSource().getEntity() != null && getOwner().equals(event.getDamageSource().getEntity())) { +// if (level.random.nextFloat() > 0.4) { +// event.setLootingLevel(event.getLootingLevel() + 1 + random.nextInt(3)); +// } +// } +// } @Override public PlayState walkPredicate(AnimationState event) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java index e4c2d41aa3..6934f29c0e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java @@ -7,16 +7,15 @@ import com.hollingsworth.arsnouveau.api.familiar.IFamiliar; import com.hollingsworth.arsnouveau.api.familiar.PersistentFamiliarData; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; -import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; import com.hollingsworth.arsnouveau.common.entity.goal.familiar.FamOwnerHurtByTargetGoal; import com.hollingsworth.arsnouveau.common.entity.goal.familiar.FamOwnerHurtTargetGoal; import com.hollingsworth.arsnouveau.common.entity.goal.familiar.FamiliarFollowGoal; +import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; @@ -156,11 +155,11 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(OWNER_UUID, Optional.empty()); - this.entityData.define(COLOR, ""); - this.entityData.define(COSMETIC, ItemStack.EMPTY); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(OWNER_UUID, Optional.empty()); + pBuilder.define(COLOR, ""); + pBuilder.define(COSMETIC, ItemStack.EMPTY); } @Override @@ -198,11 +197,6 @@ public void setCosmeticItem(ItemStack stack) { setCosmeticItem(stack, true); } - @Override - public Packet getAddEntityPacket() { - return NetworkHooks.getEntitySpawningPacket(this); - } - public static AttributeSupplier.Builder attributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 100d) .add(Attributes.MOVEMENT_SPEED, 0.2d).add(Attributes.FLYING_SPEED, Attributes.FLYING_SPEED.value().getDefaultValue()) @@ -241,8 +235,7 @@ public void addAdditionalSaveData(CompoundTag tag) { } tag.putString("color", this.entityData.get(COLOR)); if (!this.entityData.get(COSMETIC).isEmpty()) { - CompoundTag cosmeticTag = new CompoundTag(); - this.entityData.get(COSMETIC).save(cosmeticTag); + Tag cosmeticTag = this.entityData.get(COSMETIC).save(level.registryAccess()); tag.put("cosmetic", cosmeticTag); } } @@ -256,7 +249,7 @@ public void readAdditionalSaveData(CompoundTag tag) { this.holderID = ResourceLocation.tryParse(tag.getString("holderID")); this.persistentData = deserializePersistentData(tag.getCompound("familiarData")); this.entityData.set(COLOR, tag.getString("color")); - this.entityData.set(COSMETIC, ItemStack.of(tag.getCompound("cosmetic"))); + this.entityData.set(COSMETIC, ItemStack.parseOptional(this.level.registryAccess(), tag.getCompound("cosmetic"))); syncAfterPersistentFamiliarInit(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java index 075b6637e1..b8fdb42a47 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java @@ -3,9 +3,10 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.scrying.CompoundScryer; import com.hollingsworth.arsnouveau.api.scrying.TagScryer; -import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import com.hollingsworth.arsnouveau.common.entity.Starbuncle; import com.hollingsworth.arsnouveau.common.ritual.RitualScrying; +import com.hollingsworth.arsnouveau.setup.registry.ModEntities; +import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.tags.BlockTags; @@ -21,8 +22,8 @@ import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.Tags; import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; import java.util.Arrays; @@ -71,9 +72,9 @@ public PlayState walkPredicate(AnimationState event) { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.set(COLOR, DyeColor.ORANGE.getName()); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(COLOR, DyeColor.ORANGE.getName()); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java index 292e2d1617..5631e621e9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java @@ -20,8 +20,8 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.event.entity.living.LivingEntityUseItemEvent; import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; public class FamiliarWhirlisprig extends FlyingFamiliarEntity implements ISpellCastListener { @@ -68,9 +68,9 @@ public void eatEvent(LivingEntityUseItemEvent.Finish event) { if (!event.getEntity().level.isClientSide && getOwner() != null && getOwner().equals(event.getEntity())) { FoodProperties food = event.getItem().getItem().getFoodProperties(event.getItem(), getOwner()); - if (food != null && event.getItem().getItem().isEdible()) { - float saturationModifier = food.getSaturationModifier(); - int nutrition = food.getNutrition(); + if (food != null) { + float saturationModifier = food.saturation(); + int nutrition = food.nutrition(); float satAmount = nutrition * saturationModifier * 2.0f; if (event.getEntity() instanceof Player) { FoodData stats = ((Player) event.getEntity()).getFoodData(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java index 7e485f5939..d4746e723d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java @@ -11,6 +11,7 @@ import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.common.util.PotionUtil; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; +import net.minecraft.core.Holder; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; @@ -89,7 +90,7 @@ public void potionEvent(MobEffectEvent.Added event) { Entity target = event.getEntity(); Entity applier = event.getEffectSource(); - boolean isBeneficialOwner = target.equals(getOwner()) && event.getEffectInstance().getEffect().isBeneficial(); + boolean isBeneficialOwner = target.equals(getOwner()) && event.getEffectInstance().getEffect().value().isBeneficial(); boolean isApplierOwner = applier != null && applier.equals(this.getOwner()); if(isBeneficialOwner || isApplierOwner){ event.getEffectInstance().getCures(); @@ -146,7 +147,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar controller public static class DebuffTargetGoal extends Goal { FamiliarWixie wixie; - public static ArrayList effectTable = new ArrayList<>(Arrays.asList( + public static ArrayList> effectTable = new ArrayList<>(Arrays.asList( MobEffects.MOVEMENT_SLOWDOWN, MobEffects.WEAKNESS, MobEffects.LEVITATION, MobEffects.POISON )); @@ -159,7 +160,7 @@ public void tick() { super.tick(); if (wixie.getTarget() == null) return; - MobEffect effect = effectTable.get(new Random().nextInt(effectTable.size())); + Holder effect = effectTable.get(new Random().nextInt(effectTable.size())); if (effect == MobEffects.POISON) { if (wixie.getTarget().isInvertedHealAndHarm()) effect = MobEffects.REGENERATION; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/DepositAmethystGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/DepositAmethystGoal.java index 01c80c7b5c..8d0e260a65 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/DepositAmethystGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/DepositAmethystGoal.java @@ -4,9 +4,10 @@ import com.hollingsworth.arsnouveau.common.entity.AmethystGolem; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BlockEntity; +import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.ItemHandlerHelper; + import java.util.function.Supplier; public class DepositAmethystGoal extends Goal { @@ -46,10 +47,7 @@ public void tick() { } public void deposit() { - BlockEntity tileEntity = golem.level().getBlockEntity(golem.getHome()); - if (tileEntity == null) - return; - IItemHandler iItemHandler = tileEntity.getCapability(ITEM_HANDLER).orElse(null); + IItemHandler iItemHandler = golem.level.getCapability(Capabilities.ItemHandler.BLOCK, golem.getHome(), null); if (iItemHandler != null) { ItemStack oldStack = new ItemStack(golem.getHeldStack().getItem(), golem.getHeldStack().getCount()); @@ -83,7 +81,6 @@ public boolean isInterruptable() { public boolean canUse() { if (golem.getHome() == null || golem.getHeldStack().isEmpty()) return false; - BlockEntity entity = golem.level().getBlockEntity(golem.getHome()); - return canUse.get() && entity != null && entity.getCapability(ITEM_HANDLER).isPresent(); + return canUse.get() && golem.level.getCapability(Capabilities.ItemHandler.BLOCK, golem.getHome(), null) != null; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/PickupAmethystGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/PickupAmethystGoal.java index 5ef3f51699..9f4c50922b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/PickupAmethystGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/PickupAmethystGoal.java @@ -4,9 +4,9 @@ import com.hollingsworth.arsnouveau.common.entity.AmethystGolem; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.AABB; import net.neoforged.neoforge.capabilities.Capabilities; + import java.util.function.Supplier; import static com.hollingsworth.arsnouveau.common.datagen.ItemTagProvider.SHARD_TAG; @@ -104,7 +104,6 @@ public boolean isInterruptable() { public boolean canUse() { if (golem.getHome() == null) return false; - BlockEntity entity = golem.level().getBlockEntity(golem.getHome()); - return canUse.get() && golem.pickupCooldown <= 0 && entity != null && entity.getCapability(Capabilities.ITEM_HANDLER).isPresent(); + return canUse.get() && golem.pickupCooldown <= 0 && golem.level.getCapability(Capabilities.ItemHandler.BLOCK, golem.getHome(), null) != null; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/ClientEventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/ClientEventHandler.java index 6d6498faf3..55a9f0652d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/ClientEventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/ClientEventHandler.java @@ -27,7 +27,7 @@ public class ClientEventHandler { @SubscribeEvent(priority = EventPriority.LOWEST) public static void renderWorldLastEvent(final RenderLevelStageEvent event) { if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRIPWIRE_BLOCKS) { - ClientInfo.partialTicks = event.getPartialTick(); + ClientInfo.partialTicks = event.getPartialTick().getGameTimeDeltaPartialTick(false); LightManager.updateAll(event.getLevelRenderer()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index 367b219edd..111ec8fc02 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -33,7 +33,6 @@ import com.hollingsworth.arsnouveau.common.network.PacketJoinedServer; import com.hollingsworth.arsnouveau.common.network.PotionSyncPacket; import com.hollingsworth.arsnouveau.common.perk.JumpHeightPerk; -import com.hollingsworth.arsnouveau.common.perk.LootingPerk; import com.hollingsworth.arsnouveau.common.ritual.DenySpawnRitual; import com.hollingsworth.arsnouveau.common.ritual.RitualFlight; import com.hollingsworth.arsnouveau.common.ritual.RitualGravity; @@ -80,7 +79,9 @@ import net.neoforged.neoforge.event.entity.living.*; import net.neoforged.neoforge.event.entity.player.ItemEntityPickupEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.event.level.BlockGrowFeatureEvent; import net.neoforged.neoforge.event.tick.PlayerTickEvent; +import net.neoforged.neoforge.event.tick.ServerTickEvent; import net.neoforged.neoforge.event.village.VillagerTradesEvent; import net.neoforged.neoforge.items.ItemHandlerHelper; @@ -107,12 +108,12 @@ protected void apply(Object pObject, ResourceManager pResourceManager, ProfilerF boolean expired; @Override - public void tickEvent(TickEvent event) { - if (event instanceof TickEvent.ServerTickEvent serverTickEvent) { + public void tickEvent(ServerTickEvent serverTickEvent) { + CasterTomeRegistry.reloadTomeData(serverTickEvent.getServer().getRecipeManager(), serverTickEvent.getServer().getLevel(Level.OVERWORLD)); BuddingConversionRegistry.reloadBuddingConversionRecipes(serverTickEvent.getServer().getRecipeManager()); ScryRitualRegistry.reloadScryRitualRecipes(serverTickEvent.getServer().getRecipeManager()); - } + expired = true; } @@ -396,7 +397,7 @@ public static void registerTrades(VillagerTradesEvent event) { } level5.add((trader, rand) -> emerToItem(ItemsRegistry.SOURCE_BERRY_PIE, 4, 8, 2)); - level5.add((trader, rand) -> new MerchantOffer(new ItemCost(Items.EMERALD, 48)), DungeonLootTables.getRandomItem(DungeonLootTables.RARE_LOOT), 1, 20, 0.2F); + level5.add((trader, rand) -> new MerchantOffer(new ItemCost(Items.EMERALD, 48), DungeonLootTables.getRandomItem(DungeonLootTables.RARE_LOOT), 1, 20, 0.2F)); } } @@ -409,13 +410,14 @@ public static MerchantOffer itemToEmer(ItemLike itemLike, int cost, int uses, in return new VillagerTrades.EmeraldForItems(itemLike.asItem(), cost, uses, exp).getOffer(null, null); } + //TODO: restore looting level event - @SubscribeEvent - public static void onLootingEvent(LootingLevelEvent event) { - if (event.getDamageSource() != null && event.getDamageSource().getEntity() instanceof LivingEntity living) { - event.setLootingLevel(event.getLootingLevel() + Math.round(PerkUtil.countForPerk(LootingPerk.INSTANCE, living))); - } - } +// @SubscribeEvent +// public static void onLootingEvent(LootingLevelEvent event) { +// if (event.getDamageSource() != null && event.getDamageSource().getEntity() instanceof LivingEntity living) { +// event.setLootingLevel(event.getLootingLevel() + Math.round(PerkUtil.countForPerk(LootingPerk.INSTANCE, living))); +// } +// } @SubscribeEvent public static void onPotionAdd(MobEffectEvent.Added event) { @@ -463,9 +465,10 @@ private static void syncPotionRemoval(MobEffectEvent event) { } @SubscribeEvent - public static void treeGrow(SaplingGrowTreeEvent event) { + public static void treeGrow(BlockGrowFeatureEvent event) { if (!(event.getLevel() instanceof ServerLevel level)) return; + Set sprigs = Whirlisprig.WHIRLI_MAP.getEntities(level); List sprigsToRemove = new ArrayList<>(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/FamiliarEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/FamiliarEvents.java index 6e177b4651..70af19e908 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/FamiliarEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/FamiliarEvents.java @@ -94,14 +94,15 @@ public static void modifierEvent(SpellModifierEvent event) { } } - @SubscribeEvent - public static void fortuneEvent(LootingLevelEvent event) { - for (FamiliarEntity entity : getFamiliars((familiarEntity -> familiarEntity instanceof FamiliarDrygmy))) { - if (entity instanceof FamiliarDrygmy) { - ((FamiliarDrygmy) entity).onLootingEvent(event); - } - } - } + // TODO: restore drygmy fortune event +// @SubscribeEvent +// public static void fortuneEvent(LootingLevelEvent event) { +// for (FamiliarEntity entity : getFamiliars((familiarEntity -> familiarEntity instanceof FamiliarDrygmy))) { +// if (entity instanceof FamiliarDrygmy) { +// ((FamiliarDrygmy) entity).onLootingEvent(event); +// } +// } +// } @SubscribeEvent public static void eatEvent(LivingEntityUseItemEvent.Finish event) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java index 8d81d63a25..8a9f062823 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java @@ -16,10 +16,8 @@ import net.minecraft.world.item.ArrowItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; -import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -31,8 +29,8 @@ public AlchemistsCrown(Properties properties) { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); tooltip2.add(Component.translatable("ars_nouveau.tooltip.alchemists_crown", KeyMapping.createNameSupplier(ModKeyBindings.HEAD_CURIO_HOTKEY.getName()).get())); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java index da4baba8a5..abe6180f1e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java @@ -18,7 +18,6 @@ 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.ArrayList; import java.util.Collection; @@ -106,8 +105,8 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); CodexData data = new CodexData(stack); if (data.glyphs.isEmpty()) { tooltip2.add(Component.translatable("ars_nouveau.codex_tooltip")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java index a7a2ab543a..d599753c7f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java @@ -60,8 +60,8 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - if (worldIn == null) + public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { + if (context == null) return; ISpellCaster caster = getSpellCaster(stack); @@ -71,11 +71,11 @@ public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip, TooltipFlag p_77624_4_) { + public void appendHoverText(ItemStack stack, TooltipContext world, List tooltip, TooltipFlag p_77624_4_) { DominionData data = new DominionData(stack); if (data.getStoredEntityID() == -1) { tooltip.add(Component.translatable("ars_nouveau.dominion_wand.no_entity")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EarthEssence.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EarthEssence.java index 6049412b32..09f2d905bd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EarthEssence.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EarthEssence.java @@ -8,9 +8,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; -import org.jetbrains.annotations.Nullable; import java.util.List; @@ -37,8 +35,8 @@ public InteractionResult useOn(UseOnContext pContext) { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); tooltip2.add(Component.translatable("ars_nouveau.earth_essence.tooltip").withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java index 2ba400e56e..46436d2d64 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java @@ -81,10 +81,10 @@ public boolean setSpell(ISpellCaster caster, Player player, InteractionHand hand } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - getInformation(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { + getInformation(stack, context, tooltip2, flagIn); new SpellStats.Builder().addDurationModifier(1.0).build().addTooltip(tooltip2); - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + super.appendHoverText(stack, context, tooltip2, flagIn); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java index 4cd49a5805..35562d9c7c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java @@ -29,7 +29,6 @@ import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; @@ -85,9 +84,9 @@ public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity enti } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - getInformation(stack, worldIn, tooltip2, flagIn); - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + getInformation(stack, context, tooltip2, flagIn); + super.appendHoverText(stack, context, tooltip2, flagIn); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FamiliarScript.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FamiliarScript.java index df67ce1bdc..a4147a5b50 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FamiliarScript.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FamiliarScript.java @@ -1,8 +1,8 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.familiar.AbstractFamiliarHolder; -import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; +import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; @@ -10,7 +10,6 @@ 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; @@ -55,7 +54,7 @@ public Component getName(ItemStack pStack) { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { tooltip2.add(Component.translatable("ars_nouveau.familiar.script")); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FireEssence.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FireEssence.java index 42f02039e4..f800a8f71c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FireEssence.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FireEssence.java @@ -6,7 +6,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -24,8 +23,8 @@ public int getBurnTime(ItemStack itemStack, @Nullable RecipeType recipeType) } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); tooltip2.add(Component.translatable("ars_nouveau.fire_essence.tooltip").withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java index 8b8ed754f7..e7608c47f7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java @@ -20,6 +20,7 @@ import net.minecraft.world.level.Level; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; + import javax.annotation.Nullable; import java.util.List; @@ -61,7 +62,7 @@ public Component getName(ItemStack pStack) { @Override @OnlyIn(Dist.CLIENT) - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { if (spellPart == null) return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java index ef10a1032a..ada9559c50 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java @@ -1,9 +1,9 @@ package com.hollingsworth.arsnouveau.common.items; -import com.hollingsworth.arsnouveau.setup.registry.RegistryHelper; import com.hollingsworth.arsnouveau.api.item.IScribeable; import com.hollingsworth.arsnouveau.api.nbt.ItemstackData; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.registry.RegistryHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -14,6 +14,7 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.neoforged.neoforge.items.IItemHandler; + import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -58,7 +59,7 @@ public boolean onScribe(Level world, BlockPos pos, Player player, InteractionHan } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { if(!stack.hasTag()) return; ItemScrollData scrollData = new ItemScrollData(stack); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ManipulationEssence.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ManipulationEssence.java index 028d942bc4..0122a317dd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ManipulationEssence.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ManipulationEssence.java @@ -5,8 +5,6 @@ import net.minecraft.network.chat.Style; 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; @@ -18,8 +16,8 @@ public ManipulationEssence() { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); tooltip2.add(Component.translatable("ars_nouveau.manipulation_essence.tooltip").withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java index 557b8f3022..f76c7aa487 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java @@ -6,9 +6,9 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; + import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -44,7 +44,8 @@ public ModItem withRarity(Rarity rarity) { * allows items to add custom lines of information to the mouseover description */ @OnlyIn(Dist.CLIENT) - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { + @Override + public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { if (tooltip != null && !tooltip.isEmpty()) { tooltip2.addAll(tooltip); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/PerkItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/PerkItem.java index 963df96e16..ab7765360d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/PerkItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/PerkItem.java @@ -7,9 +7,9 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; + import javax.annotation.Nullable; import java.util.List; @@ -33,7 +33,7 @@ public Component getName(ItemStack pStack) { @Override @OnlyIn(Dist.CLIENT) - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { if (perk == null) return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java index 2edf4423a4..c0c9a4721b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java @@ -140,8 +140,8 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip, TooltipFlag flagIn) { - super.appendHoverText(stack, worldIn, tooltip, flagIn); + public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip, flagIn); FlaskData data = new FlaskData(stack); tooltip.add(Component.translatable("ars_nouveau.flask.charges", data.getCount()).withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); data.potionData.appendHoverText(tooltip); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Present.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Present.java index 34c4ff3246..b3892eaa51 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Present.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Present.java @@ -17,7 +17,6 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; -import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.UUID; @@ -63,8 +62,8 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); PresentData data = new PresentData(stack); if(data.uuid != null){ if(data.uuid.equals(ArsNouveau.proxy.getPlayer().getUUID())){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/RitualTablet.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/RitualTablet.java index 634abf06fa..c89af4e275 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/RitualTablet.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/RitualTablet.java @@ -12,7 +12,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.Level; import javax.annotation.Nullable; import java.util.List; @@ -47,8 +46,8 @@ public InteractionResult useOn(UseOnContext context) { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); tooltip2.add(Component.translatable("tooltip.ars_nouveau.tablet")); if (InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), Minecraft.getInstance().options.keyShift.getKey().getValue())) { tooltip2.add(Component.translatable(ritual.getDescriptionKey())); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java index 714e5ef9ba..65f9419298 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java @@ -84,15 +84,15 @@ public ISpellCaster getSpellCaster(CompoundTag tag) { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - getInformation(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { + getInformation(stack, context, tooltip2, flagIn); Data data = new Data(stack); if(data.scryPos == null){ tooltip2.add(Component.translatable("ars_nouveau.scry_caster.no_pos")); }else{ tooltip2.add(Component.translatable("ars_nouveau.scryer_scroll.bound", data.getScryPos().getX() + ", " + data.getScryPos().getY() + ", " + data.getScryPos().getZ())); } - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + super.appendHoverText(stack, context, tooltip2, flagIn); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java index 8e219b3dc3..660c68a31e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java @@ -10,7 +10,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.Level; import javax.annotation.Nullable; import java.util.List; @@ -36,14 +35,14 @@ public InteractionResult useOn(UseOnContext pContext) { @Override - public void appendHoverText(ItemStack stack, @org.jetbrains.annotations.Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { ScryerScrollData data = new ScryerScrollData(stack); if (data.pos != null) { tooltip2.add(Component.translatable("ars_nouveau.scryer_scroll.bound", data.pos.getX() + ", " + data.pos.getY() + ", " + data.pos.getZ())); } else { tooltip2.add(Component.translatable("ars_nouveau.scryer_scroll.craft")); } - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + super.appendHoverText(stack, context, tooltip2, flagIn); } public static class ScryerScrollData { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java index b72ffe2a89..16ee6b4717 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java @@ -112,7 +112,7 @@ public boolean doesSneakBypassUse(ItemStack stack, LevelReader world, BlockPos p @Override @OnlyIn(Dist.CLIENT) - public void appendHoverText(final ItemStack stack, @Nullable final Level world, final List tooltip, final TooltipFlag flag) { + public void appendHoverText(final ItemStack stack, @Nullable final TooltipContext world, final List tooltip, final TooltipFlag flag) { super.appendHoverText(stack, world, tooltip, flag); tooltip.add(Component.translatable("ars_nouveau.spell_book.select", KeyMapping.createNameSupplier(ModKeyBindings.OPEN_RADIAL_HUD.getName()).get())); tooltip.add(Component.translatable("ars_nouveau.spell_book.craft", KeyMapping.createNameSupplier(ModKeyBindings.OPEN_BOOK.getName()).get())); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java index 9bffd2391a..3e5045663b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java @@ -8,6 +8,7 @@ import com.hollingsworth.arsnouveau.common.entity.EntitySpellArrow; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentSplit; import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; +import com.hollingsworth.arsnouveau.common.util.HolderHelper; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; @@ -29,7 +30,6 @@ import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; @@ -77,6 +77,7 @@ public ItemStack findAmmo(Player playerEntity, ItemStack shootable) { } } + @Override public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { ItemStack itemstack = playerIn.getItemInHand(handIn); ISpellCaster caster = getSpellCaster(playerIn.getItemInHand(handIn)); @@ -112,10 +113,10 @@ public void releaseUsing(ItemStack bowStack, Level worldIn, LivingEntity entityL //Copied from BowItem, so we can spawn arrows in case there are no items. if (!(entityLiving instanceof Player playerentity)) return; - boolean isInfinity = playerentity.abilities.instabuild || bowStack.getEnchantmentLevel(Enchantments.INFINITY_ARROWS) > 0; + boolean isInfinity = playerentity.abilities.instabuild || bowStack.getEnchantmentLevel(HolderHelper.unwrap(worldIn, Enchantments.INFINITY)) > 0; ItemStack arrowStack = findAmmo(playerentity, bowStack); - int useTime = this.getUseDuration(bowStack) - timeLeft; + int useTime = this.getUseDuration(bowStack, entityLiving) - timeLeft; useTime = net.neoforged.neoforge.event.EventHooks.onArrowLoose(bowStack, worldIn, playerentity, useTime, !arrowStack.isEmpty() || isInfinity); if (useTime < 0) return; boolean canFire = false; @@ -141,8 +142,8 @@ public void releaseUsing(ItemStack bowStack, Level worldIn, LivingEntity entityL boolean isArrowInfinite = playerentity.abilities.instabuild || (arrowStack.getItem() instanceof ArrowItem arrowItem && arrowItem.isInfinite(arrowStack, bowStack, playerentity)); if (!worldIn.isClientSide) { ArrowItem arrowitem = (ArrowItem) (arrowStack.getItem() instanceof ArrowItem ? arrowStack.getItem() : Items.ARROW); - AbstractArrow abstractarrowentity = arrowitem.createArrow(worldIn, arrowStack, playerentity); - abstractarrowentity = customArrow(abstractarrowentity); + AbstractArrow abstractarrowentity = arrowitem.createArrow(worldIn, arrowStack, playerentity, bowStack); + abstractarrowentity = customArrow(abstractarrowentity, arrowStack, bowStack); List arrows = new ArrayList<>(); SpellResolver resolver = new SpellResolver(new SpellContext(worldIn, caster.modifySpellBeforeCasting(worldIn, entityLiving, InteractionHand.MAIN_HAND, caster.getSpell()), playerentity, new PlayerCaster(playerentity), bowStack)); @@ -193,18 +194,18 @@ public void releaseUsing(ItemStack bowStack, Level worldIn, LivingEntity entityL } public void addArrow(AbstractArrow abstractarrowentity, ItemStack bowStack, ItemStack arrowStack, boolean isArrowInfinite, Player playerentity) { - int power = bowStack.getEnchantmentLevel(Enchantments.POWER_ARROWS); + int power = bowStack.getEnchantmentLevel(HolderHelper.unwrap(playerentity.level, Enchantments.POWER)); if (power > 0) { abstractarrowentity.setBaseDamage(abstractarrowentity.getBaseDamage() + power * 0.5D + 0.5D); } - int punch = bowStack.getEnchantmentLevel(Enchantments.PUNCH_ARROWS); + int punch = bowStack.getEnchantmentLevel(HolderHelper.unwrap(playerentity.level, Enchantments.PUNCH)); if (punch > 0) { abstractarrowentity.setKnockback(punch); } - if (bowStack.getEnchantmentLevel(Enchantments.FLAMING_ARROWS) > 0) { - abstractarrowentity.setSecondsOnFire(100); + if (bowStack.getEnchantmentLevel(HolderHelper.unwrap(playerentity.level, Enchantments.FLAME)) > 0) { + abstractarrowentity.setRemainingFireTicks(100); } if (isArrowInfinite || playerentity.abilities.instabuild && (arrowStack.getItem() == Items.SPECTRAL_ARROW || arrowStack.getItem() == Items.TIPPED_ARROW)) { @@ -224,11 +225,6 @@ public Predicate getAllSupportedProjectiles() { public void registerControllers(AnimatableManager.ControllerRegistrar data) { } - @Override - public AbstractArrow customArrow(AbstractArrow arrow) { - return super.customArrow(arrow); - } - public AnimatableInstanceCache factory = GeckoLibUtil.createInstanceCache(this); @Override @@ -237,9 +233,9 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - getInformation(stack, worldIn, tooltip2, flagIn); - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + getInformation(stack, context, tooltip2, flagIn); + super.appendHoverText(stack, context, tooltip2, flagIn); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java index 248537ac9d..6f77f069a7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java @@ -41,7 +41,6 @@ import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; @@ -301,9 +300,9 @@ public EntitySpellArrow buildSpellArrow(Level worldIn, LivingEntity playerentity } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - getInformation(stack, worldIn, tooltip2, flagIn); - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + getInformation(stack, context, tooltip2, flagIn); + super.appendHoverText(stack, context, tooltip2, flagIn); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java index 9d482e5a1c..a3de7bd6e2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java @@ -9,7 +9,6 @@ import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; import javax.annotation.Nullable; import java.util.List; @@ -32,13 +31,13 @@ public Component getName(ItemStack pStack) { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { ISpellCaster caster = getSpellCaster(stack); if (!Config.GLYPH_TOOLTIPS.get() || Screen.hasShiftDown() || caster.isSpellHidden() || caster.getSpell().isEmpty()) - getInformation(stack, worldIn, tooltip2, flagIn); + getInformation(stack, context, tooltip2, flagIn); - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + super.appendHoverText(stack, context, tooltip2, flagIn); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java index 26a9c1a617..5f086f76aa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java @@ -18,7 +18,6 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; import java.util.List; @@ -64,8 +63,8 @@ public InteractionResultHolder use(Level pLevel, Player player, Inter } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); WarpScroll.WarpScrollData data = WarpScroll.WarpScrollData.get(stack); if (!data.isValid()) { tooltip2.add(Component.translatable("ars_nouveau.warp_scroll.no_location")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java index 1946b4bac9..2e310fead6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java @@ -6,8 +6,6 @@ import net.minecraft.network.chat.Style; 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; @@ -19,7 +17,7 @@ public StarbuncleShard(){ } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { if(stack.hasTag()){ Starbuncle.StarbuncleData data = new Starbuncle.StarbuncleData(stack.getOrCreateTag()); if (data.name != null) { @@ -32,7 +30,7 @@ public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List use(Level worldIn, Player player, Inte } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { if(!stack.hasTag()) return; VoidJarData data = new VoidJarData(stack); @@ -94,7 +94,7 @@ public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - getInformation(stack, worldIn, tooltip2, flagIn); - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { + getInformation(stack, context, tooltip2, flagIn); + super.appendHoverText(stack, context, tooltip2, flagIn); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java index 27954e99c5..3045a638cf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java @@ -109,7 +109,7 @@ public InteractionResultHolder use(Level world, Player player, Intera } @Override - public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag p_77624_4_) { + public void appendHoverText(ItemStack stack, @Nullable TooltipContext world, List tooltip, TooltipFlag p_77624_4_) { WarpScrollData data = new WarpScrollData(stack); if (!data.isValid()) { tooltip.add(Component.translatable("ars_nouveau.warp_scroll.no_location")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/AbstractManaCurio.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/AbstractManaCurio.java index 3108cbac58..5d9a85b6d8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/AbstractManaCurio.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/AbstractManaCurio.java @@ -1,15 +1,14 @@ package com.hollingsworth.arsnouveau.common.items.curios; -import com.google.common.collect.Multimap; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.item.ArsNouveauCurio; import com.hollingsworth.arsnouveau.api.mana.IManaEquipment; import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; -import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ItemStack; -import top.theillusivec4.curios.api.SlotContext; - -import java.util.UUID; +import net.minecraft.world.item.component.ItemAttributeModifiers; public abstract class AbstractManaCurio extends ArsNouveauCurio implements IManaEquipment { public AbstractManaCurio() { @@ -24,12 +23,18 @@ public int getManaRegenBonus(ItemStack i) { return 0; } + public static final ResourceLocation CURIOS_MANA = ArsNouveau.prefix("max_mana_modifier_curio"); + public static final ResourceLocation CURIOS_MANA_REGEN = ArsNouveau.prefix("mana_regen_modifier_curio"); + @Override - public Multimap getAttributeModifiers(SlotContext slotContext, UUID uuid, ItemStack stack) { - Multimap attributes = super.getAttributeModifiers(slotContext, uuid, stack); - attributes.put(PerkAttributes.MAX_MANA.get(), new AttributeModifier(uuid, "max_mana_modifier_curio" ,this.getMaxManaBoost(stack), AttributeModifier.Operation.ADDITION) ); - attributes.put(PerkAttributes.MANA_REGEN_BONUS.get(), new AttributeModifier(uuid, "mana_regen_modifier_curio" ,this.getManaRegenBonus(stack), AttributeModifier.Operation.ADDITION) ); + public ItemAttributeModifiers getDefaultAttributeModifiers(ItemStack stack) { + ItemAttributeModifiers attributes = super.getDefaultAttributeModifiers(stack); + // TODO: fix with curios slot group + for(EquipmentSlotGroup group : EquipmentSlotGroup.values()) { + attributes.withModifierAdded(PerkAttributes.MAX_MANA, new AttributeModifier(CURIOS_MANA, this.getMaxManaBoost(stack), AttributeModifier.Operation.ADD_VALUE), group); + + attributes.withModifierAdded(PerkAttributes.MANA_REGEN_BONUS, new AttributeModifier(CURIOS_MANA_REGEN, this.getManaRegenBonus(stack), AttributeModifier.Operation.ADD_VALUE), group); + } return attributes; } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/BeltOfUnstableGifts.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/BeltOfUnstableGifts.java index 3095c01966..f5585f7d54 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/BeltOfUnstableGifts.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/BeltOfUnstableGifts.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.api.item.ArsNouveauCurio; import com.hollingsworth.arsnouveau.common.lib.PotionEffectTags; +import net.minecraft.core.Holder; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectInstance; @@ -20,7 +21,7 @@ public BeltOfUnstableGifts() { @Override public void curioTick(SlotContext slotContext, ItemStack stack) { - ArrayList effectTable = PotionEffectTags.getEffects(slotContext.entity().level, PotionEffectTags.UNSTABLE_GIFTS); + ArrayList> effectTable = PotionEffectTags.getEffects(slotContext.entity().level, PotionEffectTags.UNSTABLE_GIFTS); if (effectTable == null || effectTable.size() == 0) return; LivingEntity wearer = slotContext.entity(); if (wearer == null) return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/DiscountRing.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/DiscountRing.java index 30f0d86938..13df14ff03 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/DiscountRing.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/DiscountRing.java @@ -4,8 +4,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; import java.util.List; @@ -29,8 +27,8 @@ public int getManaDiscount(ItemStack i, Spell spell) { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); tooltip2.add(Component.translatable("tooltip.discount_item", getManaDiscount(stack))); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/BookwyrmCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/BookwyrmCharm.java index 92421fe037..943431bcd7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/BookwyrmCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/BookwyrmCharm.java @@ -11,7 +11,6 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; import java.util.List; @@ -39,8 +38,8 @@ public InteractionResult useOn(UseOnContext pContext) { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); if(stack.hasTag()){ PersistentFamiliarData data = new PersistentFamiliarData(stack.getOrCreateTag()); if(data.name != null){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/StarbuncleCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/StarbuncleCharm.java index 28ebb6d7c9..d5370927d5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/StarbuncleCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/StarbuncleCharm.java @@ -14,7 +14,6 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; import java.util.List; @@ -41,8 +40,8 @@ public InteractionResult useOnSummonTile(UseOnContext context, Level world, Summ } @Override - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); Starbuncle.StarbuncleData data = new Starbuncle.StarbuncleData(stack.getOrCreateTag()); if (data.name != null) { tooltip2.add(data.name); @@ -53,10 +52,10 @@ public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List, ArrayList> potionEffects = new HashMap<>(); + private static final HashMap, ArrayList>> potionEffects = new HashMap<>(); public static final TagKey UNSTABLE_GIFTS = TagKey.create(Registries.MOB_EFFECT, ArsNouveau.prefix( "unstable_gifts")); public static final TagKey DISPEL_DENY = TagKey.create(Registries.MOB_EFFECT, ArsNouveau.prefix( "deny_dispel")); public static final TagKey DISPEL_ALLOW = TagKey.create(Registries.MOB_EFFECT, ArsNouveau.prefix( "allow_dispel")); public static final TagKey TO_SYNC = TagKey.create(Registries.MOB_EFFECT, ArsNouveau.prefix( "to_sync")); - public static ArrayList getEffects(Level level, TagKey tag) { + public static ArrayList> getEffects(Level level, TagKey tag) { return potionEffects.computeIfAbsent(tag, (_key) -> { Optional> effects = level.registryAccess().registryOrThrow(Registries.MOB_EFFECT).getTag(tag); if (effects.isEmpty()) return null; - ArrayList effectList = new ArrayList<>(); + ArrayList> effectList = new ArrayList<>(); for (Holder mobEffectHolder : effects.get()) { - effectList.add(mobEffectHolder.value()); + effectList.add(mobEffectHolder); } return effectList; }); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFirework.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFirework.java index b038710f13..677ac5a14f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFirework.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFirework.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.common.spell.effect; -import com.google.common.collect.Lists; import com.hollingsworth.arsnouveau.api.item.inv.InteractType; import com.hollingsworth.arsnouveau.api.item.inv.InventoryManager; import com.hollingsworth.arsnouveau.api.item.inv.SlotReference; @@ -10,17 +9,19 @@ import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentExtendTime; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentSplit; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; +import net.minecraft.core.component.DataComponents; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.projectile.FireworkRocketEntity; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.FireworkRocketItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.item.component.FireworkExplosion; +import net.minecraft.world.item.component.Fireworks; import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; @@ -121,7 +122,7 @@ public Set getCompatibleAugments() { } - public static FireworkRocketItem.Shape[] shapes = FireworkRocketItem.Shape.values(); + public static FireworkExplosion.Shape[] shapes = FireworkExplosion.Shape.values(); private static List dyes; public static List getColorfulDyes() { @@ -134,32 +135,23 @@ public static List getColorfulDyes() { public static ItemStack getFirework(int numGunpowder, int numStars) { ItemStack stack = new ItemStack(Items.FIREWORK_ROCKET); - CompoundTag rocketTag = stack.getOrCreateTagElement("Fireworks"); - rocketTag.putByte("Flight", (byte) numGunpowder); - ListTag listnbt = new ListTag(); + List explosions = new ArrayList<>(); for (int i = 0; i < numStars; i++) { - listnbt.add(getRandomStar().getTagElement("Explosion")); - } - if (!listnbt.isEmpty()) { - rocketTag.put("Explosions", listnbt); + explosions.add(getRandomStar()); } + stack.set(DataComponents.FIREWORKS, new Fireworks(numGunpowder, explosions)); return stack; } - public static ItemStack getRandomStar() { - ItemStack star = new ItemStack(Items.FIREWORK_STAR); - CompoundTag starTag = star.getOrCreateTagElement("Explosion"); + public static FireworkExplosion getRandomStar() { + Random random = new Random(); - FireworkRocketItem.Shape fireworkrocketitem$shape = shapes[random.nextInt(shapes.length)]; - List list = Lists.newArrayList(); + FireworkExplosion.Shape fireworkrocketitem$shape = shapes[random.nextInt(shapes.length)]; + IntArrayList list = new IntArrayList(); for (int i = 0; i < random.nextInt(8); i++) { list.add(getColorfulDyes().get(random.nextInt(getColorfulDyes().size())).getFireworkColor()); } - starTag.putBoolean("Flicker", random.nextBoolean()); - starTag.putBoolean("Trail", random.nextBoolean()); - starTag.putIntArray("Colors", list); - starTag.putByte("Type", (byte) fireworkrocketitem$shape.getId()); - return star; + return new FireworkExplosion(fireworkrocketitem$shape, list, IntList.of(), random.nextBoolean(), random.nextBoolean()); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/WorldUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/WorldUtil.java index 9a1315b435..7c4c639e39 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/WorldUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/WorldUtil.java @@ -14,6 +14,7 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.phys.AABB; import org.jetbrains.annotations.NotNull; From 8c06a57f9935dfe700c8cc08e53a8602a3ae3e71 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 26 Jun 2024 21:47:19 -0500 Subject: [PATCH 017/363] i dont even know anymore --- .../arsnouveau/api/perk/StackPerkHolder.java | 3 +- .../arsnouveau/api/spell/IDamageEffect.java | 8 +- .../arsnouveau/client/gui/BookSlider.java | 6 -- .../arsnouveau/client/gui/book/BaseBook.java | 2 +- .../client/gui/buttons/UnlockGlyphButton.java | 11 +-- .../common/armor/AnimatedMagicArmor.java | 7 +- .../common/block/tile/ArcanePedestalTile.java | 2 +- .../common/block/tile/MobJarTile.java | 4 +- .../crafting/recipes/SummonRitualRecipe.java | 30 +++++--- .../datagen/ApparatusRecipeProvider.java | 18 ++--- .../common/entity/WildenGuardian.java | 14 ++-- .../common/entity/WildenHunter.java | 14 ++-- .../common/entity/WildenStalker.java | 16 ++-- .../goal/carbuncle/PotionStoreGoal.java | 4 +- .../entity/goal/carbuncle/PotionTakeGoal.java | 4 +- .../goal/carbuncle/StarbyPotionBehavior.java | 4 +- .../entity/goal/carbuncle/StoreItemGoal.java | 2 +- .../entity/goal/carbuncle/TakeItemGoal.java | 2 +- .../entity/goal/wixie/FindPotionGoal.java | 7 +- .../starbuncle/DepositItemState.java | 2 +- .../starbuncle/TakeItemState.java | 2 +- .../arsnouveau/common/items/DowsingRod.java | 6 +- .../arsnouveau/common/items/ModBlockItem.java | 16 ++-- .../arsnouveau/common/items/PotionFlask.java | 8 +- .../arsnouveau/common/items/RunicChalk.java | 4 +- .../common/ritual/ForestationRitual.java | 4 +- .../common/ritual/RitualAnimalSummoning.java | 6 +- .../common/ritual/RitualMobCapture.java | 6 +- .../common/ritual/RitualPillagerRaid.java | 3 +- .../common/spell/effect/EffectBreak.java | 9 ++- .../common/spell/effect/EffectColdSnap.java | 4 +- .../spell/effect/EffectConjureWater.java | 2 +- .../common/spell/effect/EffectCrush.java | 15 ++-- .../common/spell/effect/EffectDispel.java | 7 +- .../common/spell/effect/EffectExchange.java | 3 +- .../common/spell/effect/EffectFlare.java | 10 +-- .../common/spell/effect/EffectGlide.java | 4 +- .../common/spell/effect/EffectGravity.java | 2 +- .../common/spell/effect/EffectHex.java | 4 +- .../common/spell/effect/EffectIgnite.java | 7 +- .../common/spell/effect/EffectPlaceBlock.java | 5 +- .../common/spell/effect/EffectRedstone.java | 8 +- .../common/spell/effect/EffectSenseMagic.java | 4 +- .../common/spell/effect/EffectSnare.java | 4 +- .../spell/effect/EffectSummonUndead.java | 2 +- .../spell/effect/EffectSummonWolves.java | 4 +- .../common/util/SerializationUtil.java | 77 ------------------- .../arsnouveau/common/util/WorldUtil.java | 1 - .../AbstractSupplierBlockStateProvider.java | 10 +-- .../common/world/tree/MagicTrunkPlacer.java | 6 +- .../tree/SupplierBlockStateProvider.java | 5 +- .../arsnouveau/setup/ModSetup.java | 1 + .../setup/registry/BlockRegistry.java | 3 +- .../setup/registry/EnchantmentRegistry.java | 18 +++-- .../registry/MaterialRegistry.java} | 5 +- .../setup/registry/RegistryHelper.java | 5 -- .../resources/META-INF/accesstransformer.cfg | 4 +- 57 files changed, 177 insertions(+), 267 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/util/SerializationUtil.java rename src/main/java/com/hollingsworth/arsnouveau/{common/armor/Materials.java => setup/registry/MaterialRegistry.java} (96%) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/StackPerkHolder.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/StackPerkHolder.java index 1044aaa013..fe43b37276 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/StackPerkHolder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/StackPerkHolder.java @@ -4,7 +4,6 @@ import com.hollingsworth.arsnouveau.api.nbt.ItemstackData; import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; import com.hollingsworth.arsnouveau.common.perk.StarbunclePerk; -import com.hollingsworth.arsnouveau.common.util.SerializationUtil; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.resources.ResourceLocation; @@ -33,7 +32,7 @@ public StackPerkHolder(ItemStack stack) { tier = tag.getInt("tier"); } if(tag != null && tag.contains("perks")) { - ListTag perkTagList = tag.getList("perks", SerializationUtil.COMPOUND_TAG_TYPE); + ListTag perkTagList = tag.getList("perks", 10); for (int i = 0; i < perkTagList.size(); i++) { CompoundTag perkTag = perkTagList.getCompound(i); String perkName = perkTag.getString("perk"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/IDamageEffect.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/IDamageEffect.java index a0f8ad1212..2a76f9ddf3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/IDamageEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/IDamageEffect.java @@ -8,7 +8,6 @@ import com.hollingsworth.arsnouveau.common.spell.augment.AugmentFortune; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentRandomize; import com.hollingsworth.arsnouveau.setup.registry.DamageTypesRegistry; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; @@ -45,8 +44,8 @@ default boolean attemptDamage(Level world, @NotNull LivingEntity shooter, SpellS if (!canDamage(shooter, stats, spellContext, resolver, entity)) return false; ServerLevel server = (ServerLevel) world; - float totalDamage = (float) (baseDamage + stats.getDamageModifier() + (shooter.getAttributes().hasAttribute(PerkAttributes.SPELL_DAMAGE_BONUS.get()) ? - shooter.getAttributeValue(PerkAttributes.SPELL_DAMAGE_BONUS.get()) : 0)); + float totalDamage = (float) (baseDamage + stats.getDamageModifier() + (shooter.getAttributes().hasAttribute(PerkAttributes.SPELL_DAMAGE_BONUS) ? + shooter.getAttributeValue(PerkAttributes.SPELL_DAMAGE_BONUS) : 0)); //randomize damage buff or debuff if (stats.isRandomized()) @@ -74,8 +73,7 @@ default boolean attemptDamage(Level world, @NotNull LivingEntity shooter, SpellS Player playerContext = shooter instanceof Player player ? player : ANFakePlayer.getPlayer(server); int looting = stats.getBuffCount(AugmentFortune.INSTANCE); LootParams lootContext = LootUtil.getLootingContext(server, shooter, mob, looting, world.damageSources().playerAttack(playerContext)).create(LootContextParamSets.ENTITY); - ResourceLocation lootTable = mob.getLootTable(); - LootTable loottable = server.getServer().getLootData().getLootTable(lootTable); + LootTable loottable = server.getServer().reloadableRegistries().getLootTable( mob.getLootTable()); List items = loottable.getRandomItems(lootContext); items.forEach(mob::spawnAtLocation); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/BookSlider.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/BookSlider.java index 496f16b31f..276e6a07c1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/BookSlider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/BookSlider.java @@ -7,7 +7,6 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.neoforged.neoforge.client.gui.widget.ExtendedSlider; @@ -22,11 +21,6 @@ public BookSlider(int x, int y, int width, int height, Component prefix, Compone super(x, y, width, height, prefix, suffix, minValue, maxValue, currentValue, drawString); } - @Override - public void renderTexture(GuiGraphics p_283546_, ResourceLocation p_281674_, int p_281808_, int p_282444_, int p_283651_, int p_281601_, int p_283472_, int p_282390_, int p_281441_, int p_281711_, int p_281541_) { - super.renderTexture(p_283546_, p_281674_, p_281808_, p_282444_, p_283651_, p_281601_, p_283472_, p_282390_, p_281441_, p_281711_, p_281541_); - } - @Override protected void applyValue() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java index ad8e23a75d..6e0cbf762f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java @@ -68,7 +68,7 @@ public void drawForegroundElements(int mouseX, int mouseY, float partialTicks) { } public void drawScreenAfterScale(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - renderBackground(graphics); + renderBackground(graphics, mouseX, mouseY, partialTicks); PoseStack poseStack = graphics.pose(); poseStack.pushPose(); poseStack.translate(bookLeft, bookTop, 0); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java index bdb3b9c872..648a776c94 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java @@ -2,7 +2,6 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; -import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -10,17 +9,13 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.crafting.Recipe; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.minecraft.world.item.crafting.RecipeHolder; import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModList; import net.neoforged.neoforgespi.language.IModInfo; import java.util.List; -@OnlyIn(Dist.CLIENT) public class UnlockGlyphButton extends ANButton { public boolean isCraftingSlot; public AbstractSpellPart spellPart; @@ -34,8 +29,8 @@ public UnlockGlyphButton(int x, int y, boolean isCraftingSlot, AbstractSpellPart super(x, y, 16, 16, onPress); this.isCraftingSlot = isCraftingSlot; this.spellPart = spellPart; - Recipe recipe = Minecraft.getInstance().level.getRecipeManager().byKey(spellPart.getRegistryName()).orElse(null); - this.recipe = recipe instanceof GlyphRecipe ? (GlyphRecipe) recipe : null; + RecipeHolder recipe = Minecraft.getInstance().level.getRecipeManager().byKey(spellPart.getRegistryName()).orElse(null); + this.recipe = recipe == null || !(recipe.value() instanceof GlyphRecipe glyphRecipe) ? null : glyphRecipe; } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java index 45cf039242..b5a4320236 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java @@ -13,6 +13,7 @@ import com.hollingsworth.arsnouveau.common.crafting.recipes.IDyeable; import com.hollingsworth.arsnouveau.common.perk.RepairingPerk; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import com.hollingsworth.arsnouveau.setup.registry.MaterialRegistry; import net.minecraft.ChatFormatting; import net.minecraft.client.model.HumanoidModel; import net.minecraft.core.Holder; @@ -56,15 +57,15 @@ public AnimatedMagicArmor(Holder materialIn, ArmorItem.Type slot, } public static AnimatedMagicArmor light(ArmorItem.Type slot) { - return new AnimatedMagicArmor(Materials.LIGHT, slot, new GenericModel("light_armor", "item/light_armor").withEmptyAnim()); + return new AnimatedMagicArmor(MaterialRegistry.LIGHT, slot, new GenericModel("light_armor", "item/light_armor").withEmptyAnim()); } public static AnimatedMagicArmor medium(ArmorItem.Type slot) { - return new AnimatedMagicArmor(Materials.MEDIUM, slot, new GenericModel("medium_armor", "item/medium_armor").withEmptyAnim()); + return new AnimatedMagicArmor(MaterialRegistry.MEDIUM, slot, new GenericModel("medium_armor", "item/medium_armor").withEmptyAnim()); } public static AnimatedMagicArmor heavy(ArmorItem.Type slot) { - return new AnimatedMagicArmor(Materials.HEAVY, slot, new GenericModel("heavy_armor", "item/heavy_armor").withEmptyAnim()); + return new AnimatedMagicArmor(MaterialRegistry.HEAVY, slot, new GenericModel("heavy_armor", "item/heavy_armor").withEmptyAnim()); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ArcanePedestalTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ArcanePedestalTile.java index 04193a448f..983243d027 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ArcanePedestalTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ArcanePedestalTile.java @@ -27,7 +27,7 @@ public int getContainerSize() { } @Override - protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); tag.putBoolean("hasSignal", hasSignal); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java index fe18fc247a..aa7b2282cd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java @@ -183,10 +183,10 @@ protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistrie } @Override - public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt) { + public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, HolderLookup.Provider lookupProvider) { this.cachedEntity = null; this.entityTag = null; - super.onDataPacket(net, pkt); + super.onDataPacket(net, pkt, lookupProvider); } public void dispatchBehavior(Consumer> consumer){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SummonRitualRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SummonRitualRecipe.java index 4781c909fa..a90e0bb466 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SummonRitualRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SummonRitualRecipe.java @@ -9,6 +9,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.random.Weight; import net.minecraft.util.random.WeightedEntry; +import net.minecraft.util.random.WeightedRandomList; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; @@ -17,35 +18,40 @@ import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class SummonRitualRecipe implements SpecialSingleInputRecipe { - public final Ingredient catalyst; + public final Ingredient augment; public final MobSource mobSource; public final int count; - public final List mobs; + public final WeightedRandomList mobs; - public SummonRitualRecipe(Ingredient catalyst, MobSource source, int count, List mobs) { - this.catalyst = catalyst; + public SummonRitualRecipe(Ingredient augment, MobSource source, int count, WeightedRandomList mobs) { + this.augment = augment; this.mobSource = source; this.count = count; this.mobs = mobs; } + public SummonRitualRecipe(Ingredient augment, String source, int count, List mobs) { + this.augment = augment; + this.mobSource = MobSource.valueOf(source); + this.count = count; + this.mobs = WeightedRandomList.create(mobs); + } - public SummonRitualRecipe(Ingredient catalyst, String source, int count, List mobs) { - this(catalyst, MobSource.valueOf(source), count, mobs); + public SummonRitualRecipe(Ingredient augment, String source, int count, WeightedRandomList mobs) { + this(augment, MobSource.valueOf(source), count, mobs); } - public SummonRitualRecipe(Ingredient catalyst, MobSource source, int count) { - this(catalyst, source, count, new ArrayList<>()); + public SummonRitualRecipe(Ingredient augment, MobSource source, int count) { + this(augment, source, count, WeightedRandomList.create()); } public boolean matches(List augments) { - return EnchantingApparatusRecipe.doItemsMatch(augments, Arrays.stream(this.catalyst.getItems()).map(Ingredient::of).toList()); + return EnchantingApparatusRecipe.doItemsMatch(augments, Arrays.stream(this.augment.getItems()).map(Ingredient::of).toList()); } @Override @@ -67,10 +73,10 @@ public RecipeType getType() { public static class Serializer implements RecipeSerializer { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - Ingredient.CODEC.fieldOf("augment").forGetter(r -> r.catalyst), + Ingredient.CODEC.fieldOf("augment").forGetter(r -> r.augment), Codec.STRING.fieldOf("mobSource").fieldOf("source").forGetter(r -> r.mobSource.toString()), Codec.INT.fieldOf("count").forGetter(r -> r.count), - Codec.list(WeightedMobType.CODEC.codec()).fieldOf("mobs").forGetter(r -> r.mobs) + Codec.list(WeightedMobType.CODEC.codec()).fieldOf("mobs").forGetter(r -> r.mobs.unwrap()) ).apply(instance, SummonRitualRecipe::new)); public static final StreamCodec STREAM_CODEC = CheatSerializer.create(CODEC); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java index 3c2f21ff60..faab4937ab 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java @@ -224,7 +224,7 @@ public void addEntries() { .withPedestalItem(ItemsRegistry.EARTH_ESSENCE) .withPedestalItem(ItemsRegistry.FIRE_ESSENCE) .withPedestalItem(ItemsRegistry.WATER_ESSENCE) - .buildEnchantmentRecipe(EnchantmentRegistry.REACTIVE_ENCHANTMENT.getKey(), 2, 6000)); + .buildEnchantmentRecipe(EnchantmentRegistry.REACTIVE_ENCHANTMENT, 2, 6000)); addRecipe(builder() .withPedestalItem(4, Ingredient.of(Tags.Items.GEMS_EMERALD)) @@ -232,7 +232,7 @@ public void addEntries() { .withPedestalItem(ItemsRegistry.ABJURATION_ESSENCE) .withPedestalItem(ItemsRegistry.CONJURATION_ESSENCE) .withPedestalItem(ItemsRegistry.MANIPULATION_ESSENCE) - .buildEnchantmentRecipe(EnchantmentRegistry.REACTIVE_ENCHANTMENT.getKey(), 3, 9000)); + .buildEnchantmentRecipe(EnchantmentRegistry.REACTIVE_ENCHANTMENT, 3, 9000)); addRecipe(builder() .withPedestalItem(2, Ingredient.of(Items.SPIDER_EYE)) @@ -736,40 +736,40 @@ public void addEntries() { addRecipe(builder() .withPedestalItem(1, BlockRegistry.SOURCEBERRY_BUSH) .withPedestalItem(4, RecipeDatagen.SOURCE_GEM_BLOCK) - .buildEnchantmentRecipe(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.getKey(), 1, 2000)); + .buildEnchantmentRecipe(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT, 1, 2000)); addRecipe(builder() .withPedestalItem(1, BlockRegistry.SOURCEBERRY_BUSH) .withPedestalItem(1, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(4, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.getKey(), 2, 3500)); + .buildEnchantmentRecipe(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT, 2, 3500)); addRecipe(builder() .withPedestalItem(1, BlockRegistry.SOURCEBERRY_BUSH) .withPedestalItem(2, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(4, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(1, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.getKey(), 3, 5000)); + .buildEnchantmentRecipe(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT, 3, 5000)); addRecipe(builder() .withPedestalItem(2, BlockRegistry.SOURCEBERRY_BUSH) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.getKey(), 1, 2000)); + .buildEnchantmentRecipe(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT, 1, 2000)); addRecipe(builder() .withPedestalItem(2, BlockRegistry.SOURCEBERRY_BUSH) .withPedestalItem(2, ItemsRegistry.ABJURATION_ESSENCE) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.getKey(), 2, 3500)); + .buildEnchantmentRecipe(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT, 2, 3500)); addRecipe(builder() .withPedestalItem(2, BlockRegistry.SOURCEBERRY_BUSH) .withPedestalItem(3, ItemsRegistry.ABJURATION_ESSENCE) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(1, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) - .buildEnchantmentRecipe(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.getKey(), 3, 5000)); + .buildEnchantmentRecipe(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT, 3, 5000)); addRecipe(builder() .withResult(ItemsRegistry.ENCHANTERS_SWORD) @@ -864,7 +864,7 @@ public void addEntries() { .withPedestalItem(4, Ingredient.of(Tags.Items.GEMS_DIAMOND)) .withPedestalItem(1, Ingredient.of(Tags.Items.ENDER_PEARLS)) .withPedestalItem(1, Ingredient.of(ItemsRegistry.WILDEN_TRIBUTE.get())) - .buildEnchantmentRecipe(EnchantmentRegistry.REACTIVE_ENCHANTMENT.getKey(), 4, 9000)); + .buildEnchantmentRecipe(EnchantmentRegistry.REACTIVE_ENCHANTMENT, 4, 9000)); addRecipe(builder() .withResult(BlockRegistry.RELAY_COLLECTOR) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenGuardian.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenGuardian.java index 5d754b6507..a3722e156e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenGuardian.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenGuardian.java @@ -27,14 +27,10 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; -import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; public class WildenGuardian extends Monster implements GeoEntity { @@ -169,9 +165,9 @@ private PlayState idlePredicate(AnimationState tAni } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(IS_ARMORED, false); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(IS_ARMORED, false); } private PlayState defendPredicate(AnimationState event) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenHunter.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenHunter.java index 97d461a0f4..f9e13bab46 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenHunter.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenHunter.java @@ -21,14 +21,10 @@ import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; @@ -65,9 +61,9 @@ protected void registerGoals() { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(ANIM_STATE, Animations.IDLE.name()); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(ANIM_STATE, Animations.IDLE.name()); } protected SoundEvent getHurtSound(DamageSource damageSourceIn) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenStalker.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenStalker.java index 80f51e3c54..eed1c981ef 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenStalker.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenStalker.java @@ -24,15 +24,12 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; -import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; -import software.bernie.geckolib.util.GeckoLibUtil; import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.util.GeckoLibUtil; public class WildenStalker extends Monster implements GeoEntity { int leapCooldown; @@ -217,11 +214,10 @@ public static AttributeSupplier.Builder getModdedAttributes() { .add(Attributes.ATTACK_DAMAGE, 2.5D); } - @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(isFlying, false); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(isFlying, false); } public boolean isFlying() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionStoreGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionStoreGoal.java index 9aea719ddd..f50f09e3ed 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionStoreGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionStoreGoal.java @@ -6,13 +6,13 @@ import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; -import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.item.alchemy.PotionContents; import org.jetbrains.annotations.Nullable; public class PotionStoreGoal extends GoToPosGoal { public PotionStoreGoal(Starbuncle starbuncle, StarbyPotionBehavior behavior) { super(starbuncle, behavior, () -> { - return behavior.getHeldPotion().getPotion() != Potions.EMPTY; + return behavior.getHeldPotion().getPotion() != PotionContents.EMPTY; }); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionTakeGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionTakeGoal.java index 4a2e68d98b..fb22ced3cc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionTakeGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionTakeGoal.java @@ -6,12 +6,12 @@ import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; -import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.item.alchemy.PotionContents; import org.jetbrains.annotations.Nullable; public class PotionTakeGoal extends GoToPosGoal { public PotionTakeGoal(Starbuncle starbuncle, StarbyPotionBehavior behavior) { - super(starbuncle, behavior, () -> behavior.getHeldPotion().getPotion() == Potions.EMPTY); + super(starbuncle, behavior, () -> behavior.getHeldPotion().getPotion() == PotionContents.EMPTY); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java index f91010c9c7..bc4d8eb8ed 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java @@ -14,7 +14,7 @@ import net.minecraft.world.entity.ai.goal.WrappedGoal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.item.alchemy.PotionContents; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -123,7 +123,7 @@ public CompoundTag toTag(CompoundTag tag) { @Override public ItemStack getStackForRender() { - if (heldPotion != null && heldPotion.getPotion() != Potions.EMPTY) { + if (heldPotion != null && heldPotion.getPotion() != PotionContents.EMPTY) { return heldPotion.asPotionStack(); } return super.getStackForRender(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StoreItemGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StoreItemGoal.java index 8a768a4f9f..1d7890b519 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StoreItemGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StoreItemGoal.java @@ -41,7 +41,7 @@ public boolean onDestinationReached() { return true; } - IItemHandler iItemHandler = behavior.getItemCapFromTile(tileEntity, behavior.TO_DIRECTION_MAP.get(targetPos.hashCode())); + IItemHandler iItemHandler = behavior.getItemCapFromTile(this.targetPos, behavior.TO_DIRECTION_MAP.get(targetPos.hashCode())); if (iItemHandler == null) { starbuncle.addGoalDebug(this, new DebugEvent("NoItemHandler", "No item handler at " + targetPos.toString())); return true; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/TakeItemGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/TakeItemGoal.java index c9abcb3273..0b5a56adc4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/TakeItemGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/TakeItemGoal.java @@ -66,7 +66,7 @@ public boolean onDestinationReached() { starbuncle.addGoalDebug(this, new DebugEvent("TakePosBroken", "Take Tile Broken" )); return true; } - IItemHandler iItemHandler = behavior.getItemCapFromTile(tileEntity, behavior.FROM_DIRECTION_MAP.get(targetPos.hashCode())); + IItemHandler iItemHandler = behavior.getItemCapFromTile(targetPos, behavior.FROM_DIRECTION_MAP.get(targetPos.hashCode())); if (iItemHandler == null) { starbuncle.addGoalDebug(this, new DebugEvent("NoItemHandler", "No item handler at " + targetPos.toString())); return true; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindPotionGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindPotionGoal.java index 3615197857..b2c669874a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindPotionGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindPotionGoal.java @@ -9,8 +9,7 @@ import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketAnimEntity; import net.minecraft.core.BlockPos; -import net.minecraft.world.item.alchemy.Potion; -import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -20,7 +19,7 @@ public class FindPotionGoal extends ExtendedRangeGoal { EntityWixie wixie; BlockPos movePos; boolean found; - Potion potionNeeded; + PotionContents potionNeeded; public FindPotionGoal(EntityWixie wixie) { super(15); @@ -106,7 +105,7 @@ public void setPath(double x, double y, double z, double speedIn) { @Override public void stop() { super.stop(); - potionNeeded = Potions.EMPTY; + potionNeeded = PotionContents.EMPTY; found = false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/starbuncle/DepositItemState.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/starbuncle/DepositItemState.java index 2cc7485b6e..96c16eb6a7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/starbuncle/DepositItemState.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/starbuncle/DepositItemState.java @@ -30,7 +30,7 @@ public StarbyState onDestinationReached() { return nextState; } - IItemHandler iItemHandler = behavior.getItemCapFromTile(tileEntity, behavior.TO_DIRECTION_MAP.get(targetPos.hashCode())); + IItemHandler iItemHandler = behavior.getItemCapFromTile(targetPos, behavior.TO_DIRECTION_MAP.get(targetPos.hashCode())); if (iItemHandler == null) { starbuncle.addGoalDebug(this, new DebugEvent("NoItemHandler", "No item handler at " + targetPos.toString())); return nextState; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/starbuncle/TakeItemState.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/starbuncle/TakeItemState.java index baa261c41b..89f113e54d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/starbuncle/TakeItemState.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/starbuncle/TakeItemState.java @@ -28,7 +28,7 @@ public StarbyState onDestinationReached() { starbuncle.addGoalDebug(this, new DebugEvent("TakePosBroken", "Take Tile Broken" )); return nextState; } - IItemHandler iItemHandler = behavior.getItemCapFromTile(tileEntity, behavior.FROM_DIRECTION_MAP.get(targetPos.hashCode())); + IItemHandler iItemHandler = behavior.getItemCapFromTile(targetPos, behavior.FROM_DIRECTION_MAP.get(targetPos.hashCode())); if (iItemHandler == null) { starbuncle.addGoalDebug(this, new DebugEvent("NoItemHandler", "No item handler at " + targetPos.toString())); return nextState; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/DowsingRod.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/DowsingRod.java index ecac3a96ce..1a246633e5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/DowsingRod.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/DowsingRod.java @@ -1,12 +1,11 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.block.IPedestalMachine; -import com.hollingsworth.arsnouveau.api.scrying.SingleBlockScryer; import com.hollingsworth.arsnouveau.api.scrying.TagScryer; import com.hollingsworth.arsnouveau.common.datagen.BlockTagProvider; -import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import com.hollingsworth.arsnouveau.common.ritual.RitualScrying; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -18,7 +17,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Blocks; public class DowsingRod extends ModItem { public DowsingRod(Properties properties) { @@ -47,7 +45,7 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte if (heldStack.getDamageValue() >= getMaxDamage(heldStack)) heldStack.shrink(1); if (!pLevel.isClientSide) { - pPlayer.addEffect(new MobEffectInstance(ModPotions.MAGIC_FIND_EFFECT.get(), 60 * 20)); + pPlayer.addEffect(new MobEffectInstance(ModPotions.MAGIC_FIND_EFFECT, 60 * 20)); TagScryer tagScryer = new TagScryer(BlockTagProvider.DOWSING_ROD); RitualScrying.grantScrying((ServerPlayer) pPlayer, 60 * 20, tagScryer); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ModBlockItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ModBlockItem.java index f2321ff7ff..795691c592 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ModBlockItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ModBlockItem.java @@ -5,11 +5,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import javax.annotation.Nullable; + import java.util.ArrayList; import java.util.List; @@ -31,17 +28,16 @@ public ModBlockItem withRarity(Rarity rarity) { return this; } - @Override - public Rarity getRarity(ItemStack stack) { - return rarity != null ? rarity : super.getRarity(stack); + public Rarity getRarity() { + return rarity; } /** * allows items to add custom lines of information to the mouseover description */ - @OnlyIn(Dist.CLIENT) - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip2, TooltipFlag flagIn) { - super.appendHoverText(stack, worldIn, tooltip2, flagIn); + @Override + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); if (tooltip != null && !tooltip.isEmpty()) { tooltip2.addAll(tooltip); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java index c0c9a4721b..cc290fcc1b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java @@ -78,8 +78,8 @@ public ItemStack finishUsingItem(ItemStack stack, Level worldIn, LivingEntity en FlaskData data = new FlaskData(stack); for (MobEffectInstance effectinstance : data.getPotion().fullEffects()) { effectinstance = getEffectInstance(effectinstance); - if (effectinstance.getEffect().isInstantenous()) { - effectinstance.getEffect().applyInstantenousEffect(playerentity, playerentity, entityLiving, effectinstance.getAmplifier(), 1.0D); + if (effectinstance.getEffect().value().isInstantenous()) { + effectinstance.getEffect().value().applyInstantenousEffect(playerentity, playerentity, entityLiving, effectinstance.getAmplifier(), 1.0D); } else { entityLiving.addEffect(new MobEffectInstance(effectinstance)); } @@ -225,8 +225,8 @@ public void applyEffects(Entity source, Entity inDirectSource, LivingEntity targ } for (MobEffectInstance effectinstance : fullEffects()) { effectinstance = potionFlask.getEffectInstance(effectinstance); - if (effectinstance.getEffect().isInstantenous()) { - effectinstance.getEffect().applyInstantenousEffect(source, inDirectSource, target, effectinstance.getAmplifier(), 1.0D); + if (effectinstance.getEffect().value().isInstantenous()) { + effectinstance.getEffect().value().applyInstantenousEffect(source, inDirectSource, target, effectinstance.getAmplifier(), 1.0D); } else { target.addEffect(new MobEffectInstance(effectinstance), source); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/RunicChalk.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/RunicChalk.java index fc964eaec5..5093892e57 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/RunicChalk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/RunicChalk.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; @@ -27,8 +28,7 @@ public InteractionResult useOn(UseOnContext context) { if (world.getBlockEntity(target) instanceof RuneTile runeTile) { runeTile.uuid = context.getPlayer().getUUID(); } - context.getItemInHand().hurtAndBreak(1, context.getPlayer(), (t) -> { - }); + context.getItemInHand().hurtAndBreak(1, context.getPlayer(), EquipmentSlot.MAINHAND); } return InteractionResult.SUCCESS; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ForestationRitual.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ForestationRitual.java index 35ef765903..c958aa8b3c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ForestationRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ForestationRitual.java @@ -28,13 +28,13 @@ public void addFeatures(List features) { features.add(new ConvertBlockFeature(0, 0.8, state -> state.is(BlockTags.DIRT) || state.getBlock() == Blocks.GRASS_BLOCK, state -> Blocks.PODZOL.defaultBlockState(), new Pair<>(new BlockPos(0,-1,0), BlockPos.ZERO))); features.add(new PlaceBlockFeature(0, 0.1, () -> getWorld().random.nextFloat() < 0.3 ? Blocks.LARGE_FERN.defaultBlockState() : Blocks.FERN.defaultBlockState())); features.add(new PlaceBlockFeature(0, 0.1, Blocks.BROWN_MUSHROOM::defaultBlockState)); - features.add(new PlaceBlockFeature(0, 0.1, Blocks.GRASS::defaultBlockState)); + features.add(new PlaceBlockFeature(0, 0.1, Blocks.GRASS_BLOCK::defaultBlockState)); features.add(new PlaceBlockFeature(0, 0.01, () -> Blocks.SWEET_BERRY_BUSH.defaultBlockState().setValue(SweetBerryBushBlock.AGE, getWorld().random.nextInt(4)))); }else if(isJungle){ features.add(new BigTreeFeature(Blocks.JUNGLE_SAPLING.defaultBlockState(), 12, 0.3)); features.add(new RandomTreeFeature(List.of(Blocks.JUNGLE_SAPLING.defaultBlockState()), 6, 0.95)); features.add(new CocoaFeature(6, 0.4)); - features.add(new PlaceBlockFeature(0, 0.1, Blocks.GRASS::defaultBlockState)); + features.add(new PlaceBlockFeature(0, 0.1, Blocks.GRASS_BLOCK::defaultBlockState)); features.add(new PlaceBlockFeature(0, 0.01, Blocks.MELON::defaultBlockState)); features.add(new PlaceBlockFeature(0, 0.1, Blocks.FERN::defaultBlockState)); } else { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAnimalSummoning.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAnimalSummoning.java index d690c6f7b2..b2b1517b45 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAnimalSummoning.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAnimalSummoning.java @@ -38,7 +38,7 @@ private Optional> getRecipe() { private WeightedRandomList getMobs(Level world) { if (recipe.isPresent()) { SummonRitualRecipe summonRitualRecipe = recipe.get().value(); - return summonRitualRecipe.mobs(); + return summonRitualRecipe.mobs; } return WeightedRandomList.create(world.getBiome(getPos()).value().getMobSettings().getMobs(category).unwrap().stream().filter(mob -> !mob.type.is(EntityTags.ANIMAL_SUMMON_BLACKLIST)).collect(Collectors.toList())); } @@ -79,7 +79,7 @@ protected void tick() { }); recipe.ifPresentOrElse(recipe -> { - if (getProgress() >= recipe.value().count()) { + if (getProgress() >= recipe.value().count) { setFinished(); } }, () -> { @@ -111,7 +111,7 @@ public boolean canStart(@Nullable Player player) { @Override public boolean canConsumeItem(ItemStack stack) { - return getWorld().getRecipeManager().getAllRecipesFor(RecipeRegistry.SUMMON_RITUAL_TYPE.get()).stream().anyMatch(r -> r.value().augment().test(stack)); + return getWorld().getRecipeManager().getAllRecipesFor(RecipeRegistry.SUMMON_RITUAL_TYPE.get()).stream().anyMatch(r -> r.value().augment.test(stack)); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualMobCapture.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualMobCapture.java index 647e677eb4..493e37829c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualMobCapture.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualMobCapture.java @@ -62,13 +62,13 @@ protected void tick() { ParticleUtil.spawnPoof((ServerLevel) level, e.getOnPos().above()); didWorkOnce = true; if(e instanceof Starbuncle starbuncle){ - ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.SHRUNK_STARBY, (ServerLevel) level, starbuncle.blockPosition(), 10); + ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.SHRUNK_STARBY.get(), (ServerLevel) level, starbuncle.blockPosition(), 10); } if(e instanceof LightningBolt bolt){ - ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.CAUGHT_LIGHTNING, (ServerLevel) level, bolt.blockPosition(), 10); + ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.CAUGHT_LIGHTNING.get(), (ServerLevel) level, bolt.blockPosition(), 10); } if(e instanceof ItemEntity item && item.getItem().getItem() == Items.CLOCK){ - ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.TIME_IN_BOTTLE, (ServerLevel) level, item.blockPosition(), 10); + ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.TIME_IN_BOTTLE.get(), (ServerLevel) level, item.blockPosition(), 10); } break; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualPillagerRaid.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualPillagerRaid.java index b538e71f92..f531112b4c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualPillagerRaid.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualPillagerRaid.java @@ -14,6 +14,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.phys.AABB; import net.neoforged.neoforge.common.Tags; + import java.util.List; public class RitualPillagerRaid extends AbstractRitual { @@ -26,7 +27,7 @@ protected void tick() { ServerLevel world = (ServerLevel) getWorld(); List players = world.getEntitiesOfClass(ServerPlayer.class, new AABB(getPos()).inflate(5.0)); if (players.size() > 0) { - Raid raid = world.getRaids().createOrExtendRaid(players.get(0)); + Raid raid = world.getRaids().createOrExtendRaid(players.get(0), getPos()); if (raid != null) { this.setFinished(); if (didConsumeItem(Items.EMERALD)) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBreak.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBreak.java index f5534b292b..063fa91f5d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBreak.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBreak.java @@ -7,6 +7,7 @@ import com.hollingsworth.arsnouveau.common.items.curios.ShapersFocus; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.spell.augment.*; +import com.hollingsworth.arsnouveau.common.util.HolderHelper; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; @@ -63,11 +64,11 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull int numFortune = spellStats.getBuffCount(AugmentFortune.INSTANCE); int numSilkTouch = spellStats.getBuffCount(AugmentExtract.INSTANCE); - if (numFortune > 0 && stack.getEnchantmentLevel(Enchantments.BLOCK_FORTUNE) < numFortune) { - stack.enchant(Enchantments.BLOCK_FORTUNE, numFortune); + if (numFortune > 0 && stack.getEnchantmentLevel(HolderHelper.unwrap(world,Enchantments.FORTUNE)) < numFortune) { + stack.enchant(HolderHelper.unwrap(world,Enchantments.FORTUNE), numFortune); } - if (numSilkTouch > 0 && stack.getEnchantmentLevel(Enchantments.SILK_TOUCH) < numSilkTouch) { - stack.enchant(Enchantments.SILK_TOUCH, numSilkTouch); + if (numSilkTouch > 0 && stack.getEnchantmentLevel(HolderHelper.unwrap(world,Enchantments.SILK_TOUCH)) < numSilkTouch) { + stack.enchant(HolderHelper.unwrap(world,Enchantments.SILK_TOUCH), numSilkTouch); } for (BlockPos pos1 : posList) { if (world.random.nextFloat() < spellStats.getBuffCount(AugmentRandomize.INSTANCE) * 0.25F) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectColdSnap.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectColdSnap.java index 0caca952f1..1d1fe5540c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectColdSnap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectColdSnap.java @@ -51,7 +51,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul return; this.damage(vec, level, shooter, livingEntity, spellStats, spellContext, resolver, snareSec, damage); spawnIce(shooter, level, BlockPos.containing(vec.x, vec.y + (rayTraceResult.getEntity().onGround() ? 1 : 0), vec.z), spellStats, spellContext, resolver); - if(livingEntity.hasEffect(ModPotions.FREEZING_EFFECT.get())){ + if(livingEntity.hasEffect(ModPotions.FREEZING_EFFECT)){ livingEntity.setTicksFrozen(livingEntity.getTicksRequiredToFreeze() + 3); } } @@ -137,7 +137,7 @@ public void damage(Vec3 vec, ServerLevel world, LivingEntity shooter, LivingEnti world.sendParticles(ParticleTypes.SPIT, vec.x, vec.y + 0.5, vec.z, 50, ParticleUtil.inRange(-0.1, 0.1), ParticleUtil.inRange(-0.1, 0.1), ParticleUtil.inRange(-0.1, 0.1), 0.3); - livingEntity.addEffect(new MobEffectInstance(ModPotions.SNARE_EFFECT.get(), 20 * snareTime)); + livingEntity.addEffect(new MobEffectInstance(ModPotions.SNARE_EFFECT, 20 * snareTime)); } } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectConjureWater.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectConjureWater.java index b3cc0da080..e6796aecad 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectConjureWater.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectConjureWater.java @@ -52,7 +52,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull if(!world.isInWorldBounds(pos1)) continue; BlockState hitState = world.getBlockState(pos1); - if (hitState.getBlock() instanceof LiquidBlockContainer liquidBlockContainer && liquidBlockContainer.canPlaceLiquid(world, pos1, world.getBlockState(pos1), Fluids.WATER)) { + if (hitState.getBlock() instanceof LiquidBlockContainer liquidBlockContainer && liquidBlockContainer.canPlaceLiquid(getPlayer(shooter, (ServerLevel) world), world, pos1, world.getBlockState(pos1), Fluids.WATER)) { liquidBlockContainer.placeLiquid(world, pos1, hitState, Fluids.WATER.getSource(true)); ShapersFocus.tryPropagateBlockSpell(new BlockHitResult( new Vec3(pos1.getX(), pos1.getY(), pos1.getZ()), rayTraceResult.getDirection(), pos1, false diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java index dbca2ebb7b..15f845adb6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java @@ -11,13 +11,13 @@ import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; @@ -65,16 +65,16 @@ public DamageSource buildDamageSource(Level world, LivingEntity shooter) { @Override public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { - List recipes = world.getRecipeManager().getAllRecipesFor(RecipeRegistry.CRUSH_TYPE.get()); + List> recipes = world.getRecipeManager().getAllRecipesFor(RecipeRegistry.CRUSH_TYPE.get()); CrushRecipe lastHit = null; // Cache this for AOE hits for (BlockPos p : SpellUtil.calcAOEBlocks(shooter, rayTraceResult.getBlockPos(), rayTraceResult, spellStats.getAoeMultiplier(), spellStats.getBuffCount(AugmentPierce.INSTANCE))) { BlockState state = world.getBlockState(p); Item item = state.getBlock().asItem(); if (lastHit == null || !lastHit.matches(item.getDefaultInstance(), world)) { lastHit = null; - for (CrushRecipe recipe : recipes) { - if (recipe.matches(item.getDefaultInstance(), world)) { - lastHit = recipe; + for (RecipeHolder recipe : recipes) { + if (recipe.value().matches(item.getDefaultInstance(), world)) { + lastHit = recipe.value(); break; } } @@ -109,7 +109,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull public static void crushItems(Level world, List itemEntities, int maxItemCrush) { - List recipes = world.getRecipeManager().getAllRecipesFor(RecipeRegistry.CRUSH_TYPE.get()); + List> recipes = world.getRecipeManager().getAllRecipesFor(RecipeRegistry.CRUSH_TYPE.get()); CrushRecipe lastHit = null; // Cache this for AOE hits int itemsCrushed = 0; for (ItemEntity IE : itemEntities) { @@ -121,7 +121,8 @@ public static void crushItems(Level world, List itemEntities, int ma Item item = stack.getItem(); if (lastHit == null || !lastHit.matches(item.getDefaultInstance(), world)) { - lastHit = recipes.stream().filter(recipe -> recipe.matches(item.getDefaultInstance(), world)).findFirst().orElse(null); + var holder = recipes.stream().filter(recipe -> recipe.value().matches(item.getDefaultInstance(), world)).findFirst().orElse(null); + lastHit = holder == null ? null : holder.value(); } if (lastHit == null) continue; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDispel.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDispel.java index 7fae1af970..296b42f07f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDispel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDispel.java @@ -6,7 +6,6 @@ import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.lib.PotionEffectTags; import net.minecraft.core.HolderSet; -import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectInstance; @@ -51,7 +50,8 @@ public void onResolveEntity(@NotNull EntityHitResult rayTraceResult, Level world //TODO dispel loot table? return; } - if (NeoForge.EVENT_BUS.post(new DispelEvent.Pre(rayTraceResult, world, shooter, spellStats, spellContext))) + var dispelEvent = NeoForge.EVENT_BUS.post(new DispelEvent.Pre(rayTraceResult, world, shooter, spellStats, spellContext)); + if (dispelEvent.isCanceled()) return; if (entity instanceof IDispellable iDispellable) { iDispellable.onDispel(shooter); @@ -62,7 +62,8 @@ public void onResolveEntity(@NotNull EntityHitResult rayTraceResult, Level world @Override public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { - if (NeoForge.EVENT_BUS.post(new DispelEvent.Pre(rayTraceResult, world, shooter, spellStats, spellContext))) + var dispelEvent = NeoForge.EVENT_BUS.post(new DispelEvent.Pre(rayTraceResult, world, shooter, spellStats, spellContext)); + if (dispelEvent.isCanceled()) return; if (world.getBlockState(rayTraceResult.getBlockPos()) instanceof IDispellable dispellable) { dispellable.onDispel(shooter); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExchange.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExchange.java index e2ab12f3c0..9bc7bfba4b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExchange.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExchange.java @@ -11,6 +11,7 @@ import com.hollingsworth.arsnouveau.common.items.curios.ShapersFocus; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.spell.augment.*; +import com.hollingsworth.arsnouveau.common.util.HolderHelper; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; @@ -96,7 +97,7 @@ public void onResolveBlock(BlockHitResult result, Level world, @NotNull LivingEn public void attemptPlace(ItemStack stack, Level world, BlockPos pos1, BlockHitResult result, LivingEntity shooter, Player fakePlayer, SpellContext spellContext, SpellResolver resolver) { BlockItem item = (BlockItem) stack.getItem(); ItemStack tool = LootUtil.getDefaultFakeTool(); - tool.enchant(Enchantments.SILK_TOUCH, 1); + tool.enchant(HolderHelper.unwrap(world, Enchantments.SILK_TOUCH), 1); fakePlayer.setItemInHand(InteractionHand.MAIN_HAND, stack); BlockPlaceContext context = BlockPlaceContext.at(new BlockPlaceContext(new UseOnContext(fakePlayer, InteractionHand.MAIN_HAND, result)), pos1.relative(result.getDirection().getOpposite()), result.getDirection()); BlockState placeState = item.getBlock().getStateForPlacement(context); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFlare.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFlare.java index 4f04a90378..9c5cdcd48c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFlare.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFlare.java @@ -50,9 +50,9 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul this.damage(vec, level, shooter, livingEntity, spellStats, spellContext, resolver, snareSec, damage); spawnCinders(shooter, level,rayTraceResult.getLocation().add(0, (rayTraceResult.getEntity().onGround() ? 1 : 0),0), spellStats, spellContext, resolver); - if(rayTraceResult.getEntity() instanceof LivingEntity living && living.hasEffect(ModPotions.BLAST_EFFECT.get())){ - int amplifier = living.getEffect(ModPotions.BLAST_EFFECT.get()).getAmplifier(); - living.removeEffect(ModPotions.BLAST_EFFECT.get()); + if(rayTraceResult.getEntity() instanceof LivingEntity living && living.hasEffect(ModPotions.BLAST_EFFECT)){ + int amplifier = living.getEffect(ModPotions.BLAST_EFFECT).getAmplifier(); + living.removeEffect(ModPotions.BLAST_EFFECT); BlastEffect.explode(living, amplifier + 1); } } @@ -75,7 +75,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull } public boolean canDamage(LivingEntity livingEntity) { - return livingEntity.isOnFire() || livingEntity.hasEffect(ModPotions.BLAST_EFFECT.get()) || livingEntity.level.getBlockState(livingEntity.blockPosition()).is(BlockTags.FIRE); + return livingEntity.isOnFire() || livingEntity.hasEffect(ModPotions.BLAST_EFFECT) || livingEntity.level.getBlockState(livingEntity.blockPosition()).is(BlockTags.FIRE); } public void spawnCinders(LivingEntity shooter, Level level, Vec3 hit, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver){ @@ -110,7 +110,7 @@ public void damage(Vec3 vec, ServerLevel world, LivingEntity shooter, LivingEnti world.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, vec.x, vec.y + 0.5, vec.z, 50, ParticleUtil.inRange(-0.1, 0.1), ParticleUtil.inRange(-0.1, 0.1), ParticleUtil.inRange(-0.1, 0.1), 0.3); - livingEntity.addEffect(new MobEffectInstance(ModPotions.SNARE_EFFECT.get(), 20 * snareTime)); + livingEntity.addEffect(new MobEffectInstance(ModPotions.SNARE_EFFECT, 20 * snareTime)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGlide.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGlide.java index 31557790ba..b178745fdb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGlide.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGlide.java @@ -26,7 +26,7 @@ private EffectGlide() { @Override public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { if (rayTraceResult.getEntity() instanceof LivingEntity living) { - this.applyConfigPotion(living, ModPotions.GLIDE_EFFECT.get(), spellStats); + this.applyConfigPotion(living, ModPotions.GLIDE_EFFECT, spellStats); } } @@ -65,7 +65,7 @@ public Set getSchools() { } public static boolean canGlide(LivingEntity entity) { - return entity.hasEffect(ModPotions.GLIDE_EFFECT.get()) || PerkUtil.countForPerk(GlidingPerk.INSTANCE, entity) > 0.0; + return entity.hasEffect(ModPotions.GLIDE_EFFECT) || PerkUtil.countForPerk(GlidingPerk.INSTANCE, entity) > 0.0; } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGravity.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGravity.java index dbe2a03646..8326a1c326 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGravity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGravity.java @@ -42,7 +42,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { if (rayTraceResult.getEntity() instanceof LivingEntity living) { if (spellStats.hasBuff(AugmentExtendTime.INSTANCE)) { - this.applyConfigPotion(living, ModPotions.GRAVITY_EFFECT.get(), spellStats); + this.applyConfigPotion(living, ModPotions.GRAVITY_EFFECT, spellStats); } else { Entity entity = rayTraceResult.getEntity(); entity.setDeltaMovement(entity.getDeltaMovement().add(0, -1.0 - spellStats.getDurationMultiplier(), 0)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHex.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHex.java index ce0225c49b..2842699a06 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHex.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHex.java @@ -2,8 +2,8 @@ import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; -import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; +import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; @@ -27,7 +27,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull Entity entity = rayTraceResult.getEntity(); if (!(entity instanceof LivingEntity living)) return; - ((IPotionEffect)this).applyConfigPotion(living, ModPotions.HEX_EFFECT.get(), spellStats); + ((IPotionEffect)this).applyConfigPotion(living, ModPotions.HEX_EFFECT, spellStats); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIgnite.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIgnite.java index 6623cc19a0..cac53de891 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIgnite.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIgnite.java @@ -11,7 +11,10 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.AbstractCandleBlock; +import net.minecraft.world.level.block.BaseFireBlock; +import net.minecraft.world.level.block.CampfireBlock; +import net.minecraft.world.level.block.CandleBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; @@ -30,7 +33,7 @@ private EffectIgnite() { @Override public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { int duration = (int) (POTION_TIME.get() + EXTEND_TIME.get() * spellStats.getDurationMultiplier()); - rayTraceResult.getEntity().setSecondsOnFire(duration); + rayTraceResult.getEntity().setRemainingFireTicks(duration); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java index 7b2533984f..b5064bb7ab 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java @@ -47,7 +47,10 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull continue; pos1 = rayTraceResult.isInside() ? pos1 : pos1.relative(rayTraceResult.getDirection()); boolean notReplaceable = !world.getBlockState(pos1).canBeReplaced(); - if (notReplaceable || NeoForge.EVENT_BUS.post(new BlockEvent.EntityPlaceEvent(BlockSnapshot.create(world.dimension(), world, pos1), world.getBlockState(pos1), fakePlayer))) + if (notReplaceable) + continue; + var event = NeoForge.EVENT_BUS.post(new BlockEvent.EntityPlaceEvent(BlockSnapshot.create(world.dimension(), world, pos1), world.getBlockState(pos1), fakePlayer)); + if (event.isCanceled()) continue; place(new BlockHitResult(new Vec3(pos1.getX(), pos1.getY(), pos1.getZ()), rayTraceResult.getDirection(), pos1, false), world, shooter, spellStats, spellContext, resolver, fakePlayer); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java index 9f88a3ec07..b6a3941bff 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java @@ -17,8 +17,8 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; -import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.ModConfigSpec; +import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.util.BlockSnapshot; import net.neoforged.neoforge.common.util.FakePlayer; import net.neoforged.neoforge.event.level.BlockEvent; @@ -57,8 +57,12 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull if (!world.isInWorldBounds(pos1)) return; boolean notReplaceable = !world.getBlockState(pos1).canBeReplaced(); - if (notReplaceable || NeoForge.EVENT_BUS.post(new BlockEvent.EntityPlaceEvent(BlockSnapshot.create(world.dimension(), world, pos1), world.getBlockState(pos1), fakePlayer))) + if (notReplaceable) continue; + var event = NeoForge.EVENT_BUS.post(new BlockEvent.EntityPlaceEvent(BlockSnapshot.create(world.dimension(), world, pos1), world.getBlockState(pos1), fakePlayer)); + if(event.isCanceled()){ + continue; + } BlockState state1 = BlockRegistry.TEMPORARY_BLOCK.get().defaultBlockState().setValue(TemporaryBlock.POWER, signalModifier); world.setBlockAndUpdate(pos1, state1); if(world.getBlockEntity(pos1) instanceof TemporaryTile tile){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSenseMagic.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSenseMagic.java index 18848ed722..7a5e97b933 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSenseMagic.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSenseMagic.java @@ -3,9 +3,9 @@ import com.hollingsworth.arsnouveau.api.block.IPedestalMachine; import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; -import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDurationDown; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentExtendTime; +import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; @@ -27,7 +27,7 @@ public EffectSenseMagic(String tag, String description) { public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { if (!(rayTraceResult.getEntity() instanceof LivingEntity living)) return; - ((IPotionEffect)this).applyConfigPotion(living, ModPotions.MAGIC_FIND_EFFECT.get(), spellStats); + ((IPotionEffect)this).applyConfigPotion(living, ModPotions.MAGIC_FIND_EFFECT, spellStats); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSnare.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSnare.java index f56897d536..412da6fa9d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSnare.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSnare.java @@ -4,8 +4,8 @@ import com.hollingsworth.arsnouveau.common.entity.EnchantedFallingBlock; import com.hollingsworth.arsnouveau.common.items.curios.ShapersFocus; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; -import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentExtendTime; +import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; @@ -28,7 +28,7 @@ private EffectSnare() { public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { if (rayTraceResult.getEntity() instanceof LivingEntity living) { - ((IPotionEffect)this).applyConfigPotion(living, ModPotions.SNARE_EFFECT.get(), spellStats); + ((IPotionEffect)this).applyConfigPotion(living, ModPotions.SNARE_EFFECT, spellStats); living.setDeltaMovement(0, 0, 0); living.hurtMarked = true; }else if (rayTraceResult.getEntity() instanceof EnchantedFallingBlock fallingBlock) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java index 4881179fa4..51e23441d1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java @@ -59,7 +59,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt } SummonSkeleton undeadentity = new SummonSkeleton(world, shooter, weapon); undeadentity.moveTo(blockpos, 0.0F, 0.0F); - undeadentity.finalizeSpawn((ServerLevelAccessor) world, world.getCurrentDifficultyAt(blockpos), MobSpawnType.MOB_SUMMONED, null, null); + undeadentity.finalizeSpawn((ServerLevelAccessor) world, world.getCurrentDifficultyAt(blockpos), MobSpawnType.MOB_SUMMONED, null); undeadentity.setOwner(shooter); undeadentity.setLimitedLife(ticks); summonLivingEntity(rayTraceResult, world, shooter, spellStats, spellContext, resolver, undeadentity); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonWolves.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonWolves.java index a4a2a74274..6b74536c59 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonWolves.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonWolves.java @@ -1,9 +1,9 @@ package com.hollingsworth.arsnouveau.common.spell.effect; import com.hollingsworth.arsnouveau.api.spell.*; -import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import com.hollingsworth.arsnouveau.common.entity.SummonWolf; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; +import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; @@ -35,7 +35,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt wolf.setPos(hit.x(), hit.y(), hit.z()); wolf.setTarget(shooter.getLastHurtMob()); wolf.setAggressive(true); - wolf.setTame(true); + wolf.setTame(true, false); wolf.tame((Player) shooter); summonLivingEntity(rayTraceResult, world, shooter, spellStats, spellContext, resolver, wolf); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/SerializationUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/SerializationUtil.java deleted file mode 100644 index e82651ce73..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/SerializationUtil.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.hollingsworth.arsnouveau.common.util; - -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.world.item.ItemStack; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Function; - -// yoinked from Ars Instrumentum -public class SerializationUtil { - public static final int COMPOUND_TAG_TYPE = 10; - private static final String X = "x"; - private static final String Y = "y"; - private static final String Z = "z"; - - public static ListTag serializeItemList(List items) { - ListTag itemList = new ListTag(); - items.forEach((itemstack) -> itemList.add(itemstack.serializeNBT())); - return itemList; - } - - public static List deserializeItemList(CompoundTag compoundTag, String tag) { - List itemStacks = new ArrayList<>(); - if (compoundTag.contains(tag)) { - ListTag itemList = compoundTag.getList(tag, COMPOUND_TAG_TYPE); - for (int i = 0; i < itemList.size(); i++) { - itemStacks.add(ItemStack.of(itemList.getCompound(i))); - } - return itemStacks; - } - return itemStacks; - } - - public static ListTag serializeTagList(List tags){ - ListTag tagList = new ListTag(); - tagList.addAll(tags); - return tagList; - } - - public static List mapFromTags(ListTag tagList, Function transformer){ - List list = new ArrayList<>(); - for(int i = 0; i < tagList.size(); i++){ - list.add(transformer.apply(tagList.getCompound(i))); - } - return list; - } - - public static ListTag serializeBlockPosList(List blockPositions) { - ListTag serializedBlockPositions = new ListTag(); - blockPositions.forEach(blockPos -> serializedBlockPositions.add(serializeBlockPos(blockPos))); - return serializedBlockPositions; - } - - public static CompoundTag serializeBlockPos(BlockPos blockPos) { - CompoundTag serializedBlockPos = new CompoundTag(); - serializedBlockPos.putInt(X, blockPos.getX()); - serializedBlockPos.putInt(Y, blockPos.getY()); - serializedBlockPos.putInt(Z, blockPos.getZ()); - return serializedBlockPos; - } - - public static List deserializeBlockPosList(CompoundTag tag, String key) { - ListTag serializedBlockPositions = tag.getList(key, COMPOUND_TAG_TYPE); - List blockPositions = new ArrayList<>(); - for (int i = 0; i < serializedBlockPositions.size(); i++) { - blockPositions.add(deserializeBlockPos(serializedBlockPositions.getCompound(i))); - } - return blockPositions; - } - - public static BlockPos deserializeBlockPos(CompoundTag serializedBlockPosition) { - return new BlockPos(serializedBlockPosition.getInt(X), serializedBlockPosition.getInt(Y), serializedBlockPosition.getInt(Z)); - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/WorldUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/WorldUtil.java index 7c4c639e39..21db30d9ac 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/WorldUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/WorldUtil.java @@ -13,7 +13,6 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.phys.AABB; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/AbstractSupplierBlockStateProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/AbstractSupplierBlockStateProvider.java index a694ae51bc..45fea908ac 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/AbstractSupplierBlockStateProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/AbstractSupplierBlockStateProvider.java @@ -3,10 +3,10 @@ import com.mojang.serialization.Codec; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProviderType; @@ -31,12 +31,8 @@ public AbstractSupplierBlockStateProvider(ResourceLocation key) { @Override public BlockState getState(RandomSource randomIn, BlockPos blockPosIn) { if (state == null) { - Block block = ForgeRegistries.BLOCKS.getValue(key); - if (block == null) { - state = Blocks.AIR.defaultBlockState(); - } else { - state = block.defaultBlockState(); - } + Block block = BuiltInRegistries.BLOCK.get(key); + state = block.defaultBlockState(); } return state; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTrunkPlacer.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTrunkPlacer.java index b0493ddffe..a58aced62d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTrunkPlacer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTrunkPlacer.java @@ -5,9 +5,11 @@ import com.hollingsworth.arsnouveau.common.block.SconceBlock; import com.hollingsworth.arsnouveau.setup.ModSetup; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; import net.minecraft.util.RandomSource; @@ -44,7 +46,7 @@ protected TrunkPlacerType type() { return ModSetup.MAGIC_TRUNK_PLACER.get(); } - public static final Codec CODEC = RecordCodecBuilder.create(builder -> + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(builder -> builder.group(Codec.intRange(0, 32).fieldOf("base_height").forGetter(placer -> placer.baseHeight), Codec.intRange(0, 24).fieldOf("height_rand_a").forGetter(placer -> placer.heightRandA), Codec.intRange(0, 24).fieldOf("height_rand_b").forGetter(placer -> placer.heightRandB), @@ -231,7 +233,7 @@ public void addPod(LevelSimulatedReader world, BlockPos pos, RandomSource random } public BlockState getPodState(){ - return ForgeRegistries.BLOCKS.getValue(podID).defaultBlockState(); + return BuiltInRegistries.BLOCK.get(podID).defaultBlockState(); } public void addBranch(LevelSimulatedReader world, BlockPos pos, int height, Direction d, RandomSource random, TreeConfiguration baseTreeFeatureConfig, BiConsumer consumer) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/SupplierBlockStateProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/SupplierBlockStateProvider.java index 9e05bd707b..3995134043 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/SupplierBlockStateProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/SupplierBlockStateProvider.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProviderType; @@ -16,13 +17,13 @@ public SupplierBlockStateProvider(ResourceLocation path) { super(path); } - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( Codec.STRING.fieldOf("key").forGetter(d -> d.key.getPath())) .apply(instance, SupplierBlockStateProvider::new)); @Override protected BlockStateProviderType type() { - return BlockRegistry.stateProviderType.get(); + return BlockRegistry.stateProviderType.value(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java index d7af994a15..ec553e76dd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java @@ -48,6 +48,7 @@ public static void registers(IEventBus modEventBus) { SoundRegistry.SOUND_REG.register(modEventBus); StructureRegistry.STRUCTURES.register(modEventBus); StructureRegistry.STRUCTURE_PROCESSOR.register(modEventBus); + MaterialRegistry.MATERIALS.register(modEventBus); MenuRegistry.MENU_REG.register(modEventBus); VillagerRegistry.POIs.register(modEventBus); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java index b3cf3c0850..c16f404a5c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java @@ -16,6 +16,7 @@ import net.minecraft.ChatFormatting; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; @@ -52,7 +53,7 @@ public class BlockRegistry { public static final DeferredRegister BLOCKS = DeferredRegister.create(BuiltInRegistries.BLOCK, ArsNouveau.MODID); public static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create(BuiltInRegistries.BLOCK_ENTITY_TYPE, ArsNouveau.MODID); public static final DeferredRegister> BS_PROVIDERS = DeferredRegister.create(BuiltInRegistries.BLOCKSTATE_PROVIDER_TYPE, ArsNouveau.MODID); - public static final DeferredRegister> stateProviderType = BS_PROVIDERS.register(LibBlockNames.STATE_PROVIDER, () -> new BlockStateProviderType<>(SupplierBlockStateProvider.CODEC)); + public static final Holder> stateProviderType = BS_PROVIDERS.register(LibBlockNames.STATE_PROVIDER, () -> new BlockStateProviderType<>(SupplierBlockStateProvider.CODEC)); public static BlockBehaviour.Properties LOG_PROP = BlockBehaviour.Properties.of().mapColor(MapColor.WOOD).strength(2.0F, 3.0F).ignitedByLava().sound(SoundType.WOOD); public static BlockBehaviour.Properties SAP_PROP = BlockBehaviour.Properties.of().noCollission().randomTicks().instabreak().sound(SoundType.GRASS).pushReaction(PushReaction.DESTROY); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/EnchantmentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/EnchantmentRegistry.java index 94134f1b18..a537e2a35f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/EnchantmentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/EnchantmentRegistry.java @@ -1,12 +1,11 @@ package com.hollingsworth.arsnouveau.setup.registry; -import com.hollingsworth.arsnouveau.common.enchantment.ManaBoost; -import com.hollingsworth.arsnouveau.common.enchantment.ManaRegenEnchantment; -import com.hollingsworth.arsnouveau.common.enchantment.ReactiveEnchantment; +import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; import net.minecraft.world.item.enchantment.Enchantment; -import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; @@ -14,8 +13,13 @@ public class EnchantmentRegistry { public static final DeferredRegister> ENCHANTMENTS = DeferredRegister.create(BuiltInRegistries.ENCHANTMENT_EFFECT_COMPONENT_TYPE, MODID); - public static DeferredHolder MANA_REGEN_ENCHANTMENT = ENCHANTMENTS.register("mana_regen", ManaRegenEnchantment::new); - public static DeferredHolder MANA_BOOST_ENCHANTMENT = ENCHANTMENTS.register("mana_boost", ManaBoost::new); - public static DeferredHolder REACTIVE_ENCHANTMENT = ENCHANTMENTS.register("reactive", ReactiveEnchantment::new); + public static ResourceKey MANA_REGEN_ENCHANTMENT = key("mana_regen"); + + public static ResourceKey MANA_BOOST_ENCHANTMENT = key("mana_boost"); + public static ResourceKey REACTIVE_ENCHANTMENT = key("reactive"); + + private static ResourceKey key(String p_345314_) { + return ResourceKey.create(Registries.ENCHANTMENT, ArsNouveau.prefix(p_345314_)); + } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/Materials.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/MaterialRegistry.java similarity index 96% rename from src/main/java/com/hollingsworth/arsnouveau/common/armor/Materials.java rename to src/main/java/com/hollingsworth/arsnouveau/setup/registry/MaterialRegistry.java index 91f0420796..67af6d3485 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/Materials.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/MaterialRegistry.java @@ -1,7 +1,6 @@ -package com.hollingsworth.arsnouveau.common.armor; +package com.hollingsworth.arsnouveau.setup.registry; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.Util; import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; @@ -18,7 +17,7 @@ import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; -public class Materials { +public class MaterialRegistry { public static final DeferredRegister MATERIALS = DeferredRegister.create(BuiltInRegistries.ARMOR_MATERIAL, MODID); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RegistryHelper.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RegistryHelper.java index 3bce86f364..859004c1f4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RegistryHelper.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RegistryHelper.java @@ -5,7 +5,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.Item; -import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.level.block.Block; public class RegistryHelper { @@ -22,10 +21,6 @@ public static ResourceLocation getRegistryName(EntityType i) { return BuiltInRegistries.ENTITY_TYPE.getKey(i); } - public static ResourceLocation getRegistryName(Enchantment e) { - return BuiltInRegistries.ENCHANTMENT_EFFECT_COMPONENT_TYPE.getKey(e); - } - public static ResourceLocation getRegistryName(ParticleType type) { return BuiltInRegistries.PARTICLE_TYPE.getKey(type); } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index fe031d2a79..a6c74f1dfe 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -5,7 +5,7 @@ public net.minecraft.world.entity.projectile.AbstractArrow knockbackStrength # k public net.minecraft.world.item.alchemy.PotionBrewing m_43513_(Lnet/minecraft/world/item/alchemy/Potion;Lnet/minecraft/world/item/Item;Lnet/minecraft/world/item/alchemy/Potion;)V # addMix public net.minecraft.world.level.Explosion * public-f net.minecraft.world.entity.raid.Raid numGroups # numGroups -public net.minecraft.world.entity.monster.ZombieVillager m_34383_(Ljava/util/UUID;I)V # startConverting +public net.minecraft.world.entity.monster.ZombieVillager startConverting(Ljava/util/UUID;I)V # startConverting public net.minecraft.client.gui.components.ChatComponent m_93787_(Lnet/minecraft/network/chat/Component;I)V # addMessage public net.minecraft.world.entity.Mob xpReward #xpReward public net.minecraft.world.effect.MobEffectInstance duration #duration @@ -66,7 +66,7 @@ public net.minecraft.client.gui.components.AbstractWidget x # x public net.minecraft.client.gui.components.AbstractWidget y # y public net.minecraft.world.item.ArmorItem f_265987_ # ARMOR_MODIFIER_UUID_PER_TYPE public net.minecraft.world.entity.Entity maxUpStep # maxUpStep -public net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProviderType +public net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProviderType (Lcom/mojang/serialization/MapCodec;)V # BlockStateProviderType # Geckolib ATs, do not delete public net.minecraft.client.model.geom.ModelPart$Cube From 8afaa117c9b7541666be5bf7fbe22cfb00a2199b Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 27 Jun 2024 09:35:26 -0500 Subject: [PATCH 018/363] more grab bag --- .../api/scrying/SingleBlockScryer.java | 3 +- .../arsnouveau/api/scrying/TagScryer.java | 3 +- .../arsnouveau/api/util/PerkUtil.java | 7 +- .../client/container/TerminalSyncManager.java | 2 +- .../client/events/ClientEvents.java | 3 +- .../arsnouveau/client/gui/GuiManaHUD.java | 5 +- .../client/gui/NoShadowTextField.java | 2 +- .../arsnouveau/client/gui/SpellTooltip.java | 2 +- .../client/gui/book/InfinityGuiSpellBook.java | 9 ++- .../client/gui/buttons/CraftingButton.java | 2 +- .../client/gui/buttons/FamiliarButton.java | 6 +- .../client/gui/buttons/GlyphButton.java | 4 +- .../client/gui/buttons/GuiImageButton.java | 7 +- .../client/gui/buttons/ItemButton.java | 3 +- .../client/gui/buttons/SoundButton.java | 6 +- .../client/gui/radial_menu/GuiRadialMenu.java | 8 +- .../renderer/tile/RedstoneRelayRenderer.java | 2 +- .../client/renderer/tile/RuneRenderer.java | 4 +- .../renderer/tile/SkyBlockRenderer.java | 10 +-- .../arsnouveau/common/block/LavaLily.java | 76 ------------------- .../common/block/RitualBrazierBlock.java | 4 +- .../common/block/tile/GhostWeaveTile.java | 2 +- .../common/block/tile/ItemDetectorTile.java | 6 +- .../common/block/tile/MageBlockTile.java | 9 +-- .../common/block/tile/SpellSensorTile.java | 4 +- .../recipes/ReactiveEnchantmentRecipe.java | 2 +- .../crafting/recipes/SpellWriteRecipe.java | 3 +- .../common/entity/GiftStarbuncle.java | 6 +- .../arsnouveau/common/entity/WealdWalker.java | 21 +++-- .../arsnouveau/common/entity/Whirlisprig.java | 12 +-- .../common/entity/WildenChimera.java | 4 +- .../arsnouveau/common/event/EventHandler.java | 13 +--- .../common/event/ReactiveEvents.java | 5 +- .../arsnouveau/common/items/FlaskCannon.java | 3 +- .../common/light/DynamLightUtil.java | 5 +- .../arsnouveau/common/light/LightManager.java | 6 +- .../common/mob_jar/PiglinBehavior.java | 2 +- .../common/potions/ParticleMobEffect.java | 3 +- .../common/potions/PublicEffect.java | 2 + .../common/potions/ShockedEffect.java | 5 +- .../common/potions/SnareEffect.java | 2 +- .../common/ritual/RitualBinding.java | 2 +- .../common/ritual/RitualDisintegration.java | 2 +- .../common/ritual/RitualHarvest.java | 2 +- .../common/ritual/RitualScrying.java | 5 +- .../common/spell/effect/EffectDispel.java | 9 +-- .../common/spell/effect/EffectHarvest.java | 2 +- .../common/spell/effect/EffectInteract.java | 4 +- .../common/spell/effect/EffectName.java | 3 +- .../common/spell/effect/EffectWololo.java | 18 +++-- .../arsnouveau/common/util/PotionUtil.java | 4 +- .../setup/registry/ItemsRegistry.java | 6 +- .../arsnouveau/setup/registry/ModPotions.java | 2 +- 53 files changed, 129 insertions(+), 213 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/block/LavaLily.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java index 6da5c5779e..66210131cf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/SingleBlockScryer.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.setup.registry.RegistryHelper; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; @@ -29,7 +30,7 @@ public boolean shouldRevealBlock(BlockState state, BlockPos p, Player player) { @Override public IScryer fromTag(CompoundTag tag) { SingleBlockScryer scryer = new SingleBlockScryer(null); - scryer.block = tag.contains("block") ? ForgeRegistries.BLOCKS.getValue(ResourceLocation.tryParse(tag.getString("block"))) : null; + scryer.block = tag.contains("block") ? BuiltInRegistries.BLOCK.get(ResourceLocation.tryParse(tag.getString("block"))) : null; return scryer; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java index fd318465f6..36ee0f736e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; @@ -33,7 +34,7 @@ public boolean shouldRevealBlock(BlockState state, BlockPos p, Player player) { public IScryer fromTag(CompoundTag tag) { TagScryer scryer = new TagScryer(); if (tag.contains("blockTag")) { - scryer.blockTag = ForgeRegistries.BLOCKS.tags().getTag(new TagKey<>(Registries.BLOCK, ResourceLocation.tryParse(tag.getString("blockTag")))).getKey(); + scryer.blockTag = BuiltInRegistries.BLOCK.getTag(new TagKey<>(Registries.BLOCK, ResourceLocation.tryParse(tag.getString("blockTag")))).get().key(); } return scryer; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java index f3219275cb..a030d3138c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java @@ -6,6 +6,7 @@ import com.hollingsworth.arsnouveau.api.perk.PerkInstance; import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; import com.hollingsworth.arsnouveau.common.items.PerkItem; +import net.minecraft.core.Holder; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeInstance; @@ -23,12 +24,12 @@ public class PerkUtil { return holder == null ? null : holder.getPerkHolder(stack); } - public static double perkValue(LivingEntity entity, Attribute attribute){ + public static double perkValue(LivingEntity entity, Holder attribute){ AttributeInstance instance = entity.getAttribute(attribute); - return instance == null ? attribute.getDefaultValue() : instance.getValue(); + return instance == null ? attribute.value().getDefaultValue() : instance.getValue(); } - public static double valueOrZero(LivingEntity entity, Attribute attribute){ + public static double valueOrZero(LivingEntity entity, Holder attribute){ return entity.getAttribute(attribute) == null ? 0 : entity.getAttributeValue(attribute); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java index 61fcef31c9..9a83770d56 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java @@ -188,7 +188,7 @@ public long getAmount(StoredItemStack stack) { } public static ResourceLocation getItemId(Item item) { - return ForgeRegistries.ITEMS.getKey(item); + return BuiltInRegistries.ITEM.getKey(item); } public static void writeItemId(FriendlyByteBuf buf, Item item) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java index 0b37478845..3f20d33b71 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java @@ -9,6 +9,7 @@ import com.hollingsworth.arsnouveau.common.block.tile.GhostWeaveTile; import com.hollingsworth.arsnouveau.common.block.tile.SkyBlockTile; import com.hollingsworth.arsnouveau.common.spell.casters.ReactiveCaster; +import com.hollingsworth.arsnouveau.common.util.HolderHelper; import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; @@ -75,7 +76,7 @@ public static void overlayEvent(RenderGuiLayerEvent.Pre event) { @SubscribeEvent public static void onTooltip(final ItemTooltipEvent event) { ItemStack stack = event.getItemStack(); - int level = stack.getEnchantmentLevel(EnchantmentRegistry.REACTIVE_ENCHANTMENT); + int level = stack.getEnchantmentLevel(HolderHelper.unwrap(event.getEntity().level, EnchantmentRegistry.REACTIVE_ENCHANTMENT)); if (level > 0 && new ReactiveCaster(stack).getSpell().isValid()) { Spell spell = new ReactiveCaster(stack).getSpell(); event.getToolTip().add(Component.literal(spell.getDisplayString())); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java index 8504d65825..74310cc6c2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java @@ -6,6 +6,7 @@ import com.hollingsworth.arsnouveau.api.mana.IManaCap; import com.hollingsworth.arsnouveau.api.util.ManaUtil; import com.hollingsworth.arsnouveau.client.ClientInfo; +import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.setup.config.Config; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.mojang.blaze3d.systems.RenderSystem; @@ -76,7 +77,7 @@ public static void renderRedOverlay(PoseStack ms, int offsetLeft, int yOffset, i int redManaLength = (int) (98F * Mth.clamp(0F,ClientInfo.redOverlayMana / maxMana , 1F)); RenderSystem.setShaderTexture(0, ArsNouveau.prefix( "textures/gui/manabar_gui_grayscale.png")); - RenderUtil.colorBlit(ms, offsetLeft + 8, yOffset - 10, 0, manaOffset, redManaLength, 8, 256, 256, Color.RED.scaleAlpha(ClientInfo.redOverlayTicks/35f)); + RenderUtils.colorBlit(ms, offsetLeft + 8, yOffset - 10, 0, manaOffset, redManaLength, 8, 256, 256, Color.RED.scaleAlpha(ClientInfo.redOverlayTicks/35f)); } @@ -91,7 +92,7 @@ public static void renderReserveOverlay(PoseStack ms, int offsetLeft, int yOffse //invert offsets so it aligns with the right side of the bar int offset = 96 - reserveManaLength; RenderSystem.setShaderTexture(0, ArsNouveau.prefix( "textures/gui/manabar_gui_mana.png")); - RenderUtil.colorBlit(ms, offsetLeft + 10 + offset, yOffset - 10, 0, stillBar ? 0 : manaOffset, reserveManaLength, 8, 256, 256, BLACK); + RenderUtils.colorBlit(ms, offsetLeft + 10 + offset, yOffset - 10, 0, stillBar ? 0 : manaOffset, reserveManaLength, 8, 256, 256, BLACK); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/NoShadowTextField.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/NoShadowTextField.java index 63eb60622c..76dff78ea0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/NoShadowTextField.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/NoShadowTextField.java @@ -92,7 +92,7 @@ public boolean mouseClicked(double clickedX, double clickedY, int mouseButton) { } String s = this.font.plainSubstrByWidth(this.value.substring(this.displayPos), this.getInnerWidth()); - this.moveCursorTo(this.font.plainSubstrByWidth(s, i).length() + this.displayPos); + this.moveCursorTo(this.font.plainSubstrByWidth(s, i).length() + this.displayPos, true); return true; } else if (this.isFocused() && mouseButton == 1) { if (this.value.isEmpty()) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java index e80e73c506..207529e78d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java @@ -52,7 +52,7 @@ public void renderImage(Font pFont, int pX, int pY, GuiGraphics pGuiGraphics) { List recipe = spellCaster.getSpell().recipe; for (int i = 0, recipeSize = recipe.size(); i < recipeSize; i++) { AbstractSpellPart part = recipe.get(i); - RenderUtil.drawSpellPart(part, pGuiGraphics, pX + i * 16, pY + (showName ? 10 : 0), 16, false); + RenderUtils.drawSpellPart(part, pGuiGraphics, pX + i * 16, pY + (showName ? 10 : 0), 16, false); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java index a954c0195c..a84a20928e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java @@ -14,6 +14,7 @@ import com.hollingsworth.arsnouveau.client.gui.GuiUtils; import com.hollingsworth.arsnouveau.client.gui.NoShadowTextField; import com.hollingsworth.arsnouveau.client.gui.buttons.*; +import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; import com.hollingsworth.arsnouveau.common.compat.PatchouliHandler; @@ -384,12 +385,12 @@ public void onPageDec(Button button) { } @Override - public boolean mouseScrolled(double mouseX, double mouseY, double scroll) { + public boolean mouseScrolled(double mouseX, double mouseY, double pScrollX, double pScrollY) { SoundManager manager = Minecraft.getInstance().getSoundManager(); - if (scroll < 0 && nextButton.active) { + if (pScrollY < 0 && nextButton.active) { onPageIncrease(nextButton); manager.play(SimpleSoundInstance.forUI(SoundEvents.BOOK_PAGE_TURN, 1.0F)); - } else if (scroll > 0 && previousButton.active) { + } else if (pScrollY > 0 && previousButton.active) { onPageDec(previousButton); manager.play(SimpleSoundInstance.forUI(SoundEvents.BOOK_PAGE_TURN, 1.0F)); } @@ -628,7 +629,7 @@ public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, } else { //color rainbow if mana cost = max mana, red if mana cost > max mana RenderSystem.setShaderTexture(0, ArsNouveau.prefix( "textures/gui/manabar_gui_grayscale.png")); - RenderUtil.colorBlit(graphics.pose(), offsetLeft + 8, yOffset - 10, 0, manaOffset, 100, 8, 256, 256, manaLength < 0 ? Color.RED : Color.rainbowColor(ClientInfo.ticksInGame)); + RenderUtils.colorBlit(graphics.pose(), offsetLeft + 8, yOffset - 10, 0, manaOffset, 100, 8, 256, 256, manaLength < 0 ? Color.RED : Color.rainbowColor(ClientInfo.ticksInGame)); } if (ArsNouveauAPI.ENABLE_DEBUG_NUMBERS && minecraft != null) { String text = currentCostCache + " / " + maxManaCache; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java index d6f841f2cf..9d177274f0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java @@ -46,7 +46,7 @@ public void render(GuiGraphics graphics, int parX, int parY, float partialTicks) RenderSystem.setShaderColor(1.0F, 0.7F, 0.7F, 1.0F); } if (this.abstractSpellPart != null) { - RenderUtil.drawSpellPart(this.abstractSpellPart, graphics, x + 3, y + 2, 16, !validationErrors.isEmpty(), 0); + RenderUtils.drawSpellPart(this.abstractSpellPart, graphics, x + 3, y + 2, 16, !validationErrors.isEmpty(), 0); } } super.render(graphics, parX, parY, partialTicks); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/FamiliarButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/FamiliarButton.java index 29d0b7af0a..35a3042e5d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/FamiliarButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/FamiliarButton.java @@ -23,10 +23,8 @@ public FamiliarButton(int x, int y, AbstractFamiliarHolder familiar, OnPress onP } @Override - public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - if (visible) { - RenderUtil.drawItemAsIcon(familiarHolder.getOutputItem(), graphics, x, y, 16, false); - } + protected void renderWidget(GuiGraphics graphics, int pMouseX, int pMouseY, float pPartialTick) { + RenderUtils.drawItemAsIcon(familiarHolder.getOutputItem(), graphics, x, y, 16, false); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GlyphButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GlyphButton.java index 6d9260ae7a..8921925b69 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GlyphButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GlyphButton.java @@ -33,11 +33,11 @@ public GlyphButton(int x, int y, AbstractSpellPart abstractSpellPart, OnPress on } @Override - public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + protected void renderWidget(GuiGraphics graphics, int pMouseX, int pMouseY, float pPartialTick) { if(!visible){ return; } - RenderUtil.drawSpellPart(this.abstractSpellPart, graphics, x, y, 16, !validationErrors.isEmpty(), 0); + RenderUtils.drawSpellPart(this.abstractSpellPart, graphics, x, y, 16, !validationErrors.isEmpty(), 0); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiImageButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiImageButton.java index e727a22c47..0045635b36 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiImageButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiImageButton.java @@ -41,11 +41,10 @@ public GuiImageButton withTooltip(Component toolTip) { return this; } + @Override - public void render(GuiGraphics graphics,int parX, int parY, float partialTicks) { - if (visible) { - graphics.blit(image, x, y, u, v, width, height, image_width, image_height); - } + protected void renderWidget(GuiGraphics graphics, int pMouseX, int pMouseY, float pPartialTick) { + graphics.blit(image, x, y, u, v, width, height, image_width, image_height); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ItemButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ItemButton.java index cbc369ac4e..a35da84e58 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ItemButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ItemButton.java @@ -12,6 +12,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.neoforged.neoforge.client.ClientHooks; + import java.util.ArrayList; import java.util.List; @@ -33,7 +34,7 @@ public void render(GuiGraphics graphics, int parX, int parY, float partialTicks) List components = new ArrayList<>(ClientHooks.gatherTooltipComponents(ItemStack.EMPTY, Screen.getTooltipFromItem(Minecraft.getInstance(), stack), parX, width, height, font)); parent.renderTooltipInternal(graphics, components, parX, parY); } - RenderUtil.drawItemAsIcon(stack, graphics, x + 3, y + 2, 16, false); + RenderUtils.drawItemAsIcon(stack, graphics, x + 3, y + 2, 16, false); } } super.render(graphics, parX, parY, partialTicks); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/SoundButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/SoundButton.java index 9c6e4c74f2..91e5a800cb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/SoundButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/SoundButton.java @@ -17,10 +17,8 @@ public SoundButton(int x, int y, SpellSound sound, Button.OnPress onPress) { } @Override - public void render(GuiGraphics ms, int mouseX, int mouseY, float partialTicks) { - if (visible && sound != null) { - ms.blit(sound.getTexturePath(), x, y, 0, 0, 16, 16, 16, 16); - } + protected void renderWidget(GuiGraphics pGuiGraphics, int pMouseX, int pMouseY, float pPartialTick) { + pGuiGraphics.blit(sound.getTexturePath(), x, y, 0, 0, 16, 16, 16, 16); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java index ba8059ddf0..94b0bc8e9b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java @@ -262,10 +262,10 @@ public void drawSlice( float pos2InX = x + radiusIn * (float) Math.cos(angle2); float pos2InY = y + radiusIn * (float) Math.sin(angle2); - buffer.addVertex(pos1OutX, pos1OutY, z).color(r, g, b, a).endVertex(); - buffer.addVertex(pos1InX, pos1InY, z).color(r, g, b, a).endVertex(); - buffer.addVertex(pos2InX, pos2InY, z).color(r, g, b, a).endVertex(); - buffer.addVertex(pos2OutX, pos2OutY, z).color(r, g, b, a).endVertex(); + buffer.addVertex(pos1OutX, pos1OutY, z).setColor(r, g, b, a); + buffer.addVertex(pos1InX, pos1InY, z).setColor(r, g, b, a); + buffer.addVertex(pos2InX, pos2InY, z).setColor(r, g, b, a); + buffer.addVertex(pos2OutX, pos2OutY, z).setColor(r, g, b, a); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RedstoneRelayRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RedstoneRelayRenderer.java index 5ca60ef847..9ea3b2aa03 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RedstoneRelayRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RedstoneRelayRenderer.java @@ -33,7 +33,7 @@ public void renderRecursively(PoseStack poseStack, RedstoneRelayTile animatable, })); if (strings.contains(bone.getName())) { //NOTE: if the bone have a parent, the recursion will get here with the neutral color, making the color getter useless - super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, Color.WHITE.getRed() / 255f, Color.WHITE.argbInt()); + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, Color.WHITE.argbInt()); } else { super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RuneRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RuneRenderer.java index 10a52bcab2..94bdad1d73 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RuneRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RuneRenderer.java @@ -35,7 +35,7 @@ public void renderFinal(PoseStack poseStack, RuneTile animatable, BakedGeoModel @Override public void actuallyRender(PoseStack poseStack, RuneTile animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { - ParticleColor color = animatable.spell.color; + ParticleColor particleColor = animatable.spell.color; poseStack.pushPose(); Direction direction = animatable.getBlockState().getValue(BasicSpellTurret.FACING); if (direction == Direction.UP) { @@ -62,7 +62,7 @@ public void actuallyRender(PoseStack poseStack, RuneTile animatable, BakedGeoMod poseStack.mulPose(Axis.XP.rotationDegrees(-90)); poseStack.mulPose(Axis.ZP.rotationDegrees(-180)); } - super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, animatable.isCharged ? color.getRed() : red, animatable.isCharged ? color.getGreen() : green, animatable.isCharged ? color.getBlue() : blue, alpha); + super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, animatable.isCharged ? particleColor.getColor() : color); poseStack.popPose(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/SkyBlockRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/SkyBlockRenderer.java index 2b8940e6a7..b3622f8ec6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/SkyBlockRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/SkyBlockRenderer.java @@ -30,7 +30,7 @@ public SkyBlockRenderer(BlockEntityRendererProvider.Context rendererDispatcherIn } public void render(SkyBlockTile tileEntityIn, float partialTicks, PoseStack pPoseStack, MultiBufferSource bufferIn, int combinedLightIn, int combinedOverlayIn) { - if(tileEntityIn.showFacade() || Minecraft.getInstance().player != null && Minecraft.getInstance().player.hasEffect(ModPotions.MAGIC_FIND_EFFECT.get())){ + if(tileEntityIn.showFacade() || Minecraft.getInstance().player != null && Minecraft.getInstance().player.hasEffect(ModPotions.MAGIC_FIND_EFFECT)){ BlockState renderState = tileEntityIn.mimicState; if (renderState == null) return; @@ -55,10 +55,10 @@ private void renderCube(SkyBlockTile tileEntityIn, Matrix4f p_228883_4_, VertexC private void renderFace(SkyBlockTile tileEntityIn, Matrix4f matrix, VertexConsumer buffer, float f, float g, float h, float i, float j, float k, float l, float m, Direction direction) { // if (tileEntityIn.shouldRenderFace(direction)) { - buffer.vertex(matrix, f, h, j).endVertex(); - buffer.vertex(matrix, g, h, k).endVertex(); - buffer.vertex(matrix, g, i, l).endVertex(); - buffer.vertex(matrix, f, i, m).endVertex(); + buffer.addVertex(matrix, f, h, j); + buffer.addVertex(matrix, g, h, k); + buffer.addVertex(matrix, g, i, l); + buffer.addVertex(matrix, f, i, m); // } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/LavaLily.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/LavaLily.java deleted file mode 100644 index 97d2a77520..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/LavaLily.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.hollingsworth.arsnouveau.common.block; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.BushBlock; -import net.minecraft.world.level.block.RenderShape; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.VoxelShape; - -public class LavaLily extends BushBlock { - protected static final VoxelShape LILY_PAD_AABB = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 1.5D, 16.0D); - - public LavaLily() { - super(TickableModBlock.defaultProperties().noOcclusion()); - } - - @Override - public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { - return LILY_PAD_AABB; - } - - public static final IntegerProperty LOC = IntegerProperty.create("loc", 0, 2); - - public BlockState getState(Level world, BlockPos pos) { - BlockState state = defaultBlockState(); - if (world.getBlockState(pos.below()).getBlock() == Blocks.STONE) - state = state.setValue(LOC, 0); - if (world.getBlockState(pos.below()).getBlock() == Blocks.MAGMA_BLOCK) - state = state.setValue(LOC, 1); - if (world.getBlockState(pos.below()).getBlock() == Blocks.LAVA) - state = state.setValue(LOC, 2); - return state; - } - - - @Override - public BlockState getStateForPlacement(BlockPlaceContext context) { - return getState(context.getLevel(), context.getClickedPos()); - } - - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(LOC); - } - - @Override - public boolean canSurvive(BlockState state, LevelReader worldIn, BlockPos pos) { - return super.canSurvive(state, worldIn, pos); - } - - @Override - public RenderShape getRenderShape(BlockState p_149645_1_) { - return RenderShape.MODEL; - } - - @Override - public boolean propagatesSkylightDown(BlockState state, BlockGetter reader, BlockPos pos) { - return true; - } - - @Override - protected boolean mayPlaceOn(BlockState state, BlockGetter worldIn, BlockPos pos) { - FluidState fluidstate = worldIn.getFluidState(pos); - FluidState fluidstate1 = worldIn.getFluidState(pos.above()); - return fluidstate1.getType() == Fluids.EMPTY; - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RitualBrazierBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RitualBrazierBlock.java index 65f084e6e4..76427674db 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RitualBrazierBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RitualBrazierBlock.java @@ -5,7 +5,6 @@ import com.hollingsworth.arsnouveau.common.block.tile.RitualBrazierTile; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; @@ -96,7 +95,7 @@ public void neighborChanged(BlockState state, Level world, BlockPos pos, Block b } @Override - public void playerWillDestroy(Level worldIn, BlockPos pos, BlockState state, Player player) { + public BlockState playerWillDestroy(Level worldIn, BlockPos pos, BlockState state, Player player) { super.playerWillDestroy(worldIn, pos, state, player); if (worldIn.getBlockEntity(pos) instanceof RitualBrazierTile tile) { if (tile.ritual != null) { @@ -106,6 +105,7 @@ public void playerWillDestroy(Level worldIn, BlockPos pos, BlockState state, Pla } } } + return state; } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/GhostWeaveTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/GhostWeaveTile.java index d40be41eca..443bbafd63 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/GhostWeaveTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/GhostWeaveTile.java @@ -42,7 +42,7 @@ public boolean isInvisible(){ } @Override - protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); tag.putBoolean("invisible", invisible); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java index 640900fa27..5f91747f11 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java @@ -3,8 +3,8 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.api.item.IWandable; import com.hollingsworth.arsnouveau.api.util.BlockUtil; -import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ColorPos; +import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.items.ItemScroll; import com.hollingsworth.arsnouveau.common.util.PortUtil; @@ -156,7 +156,7 @@ protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries } tag.putInt("neededCount", neededCount); if(!filterStack.isEmpty()){ - tag.put("filterStack", filterStack.save(new CompoundTag())); + tag.put("filterStack", filterStack.save(pRegistries)); } tag.putBoolean("isPowered", isPowered); tag.putBoolean("inverted", inverted); @@ -170,7 +170,7 @@ protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistrie } this.neededCount = pTag.getInt("neededCount"); if(pTag.contains("filterStack")){ - filterStack = ItemStack.of(pTag.getCompound("filterStack")); + filterStack = ItemStack.parseOptional(pRegistries, pTag.getCompound("filterStack")); } isPowered = pTag.getBoolean("isPowered"); inverted = pTag.getBoolean("inverted"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MageBlockTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MageBlockTile.java index c0d55384ec..586678093c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MageBlockTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MageBlockTile.java @@ -12,7 +12,6 @@ import net.minecraft.nbt.IntTag; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.AABB; import org.jetbrains.annotations.NotNull; public class MageBlockTile extends ModdedTile implements ITickable, IDispellable, IWololoable { @@ -50,18 +49,14 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis } @Override - public void saveAdditional(CompoundTag tag) { + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.put("age", IntTag.valueOf(age)); tag.put("lightColor", color.serialize()); tag.putBoolean("permanent", isPermanent); tag.putDouble("modifier", lengthModifier); } - @Override - public AABB getRenderBoundingBox() { - return INFINITE_EXTENT_AABB; - } - @Override public boolean onDispel(@NotNull LivingEntity caster) { level.destroyBlock(this.getBlockPos(), false); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java index ddd9a61cc5..cb5da444aa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java @@ -154,7 +154,7 @@ public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { tag.putInt("outputDuration", outputDuration); tag.putInt("outputStrength", outputStrength); tag.putBoolean("isOnResolve", isOnResolve); - tag.put("parchment", parchment.save(new CompoundTag())); + tag.put("parchment", parchment.save(pRegistries)); } @Override @@ -163,7 +163,7 @@ public void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) this.outputDuration = pTag.getInt("outputDuration"); this.outputStrength = pTag.getInt("outputStrength"); this.isOnResolve = pTag.getBoolean("isOnResolve"); - this.parchment = ItemStack.of(pTag.getCompound("parchment")); + this.parchment = ItemStack.parseOptional(pRegistries, pTag.getCompound("parchment")); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java index 99027f37f0..bdfe9beb71 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java @@ -25,7 +25,7 @@ public class ReactiveEnchantmentRecipe extends EnchantmentRecipe { public ReactiveEnchantmentRecipe(List pedestalItems, int sourceCost) { - super(pedestalItems, EnchantmentRegistry.REACTIVE_ENCHANTMENT.getKey(), 1, sourceCost); + super(pedestalItems, EnchantmentRegistry.REACTIVE_ENCHANTMENT, 1, sourceCost); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java index 3544c97edd..c99e742246 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.common.spell.casters.ReactiveCaster; +import com.hollingsworth.arsnouveau.common.util.HolderHelper; import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import com.mojang.serialization.Codec; @@ -44,7 +45,7 @@ public boolean doesReagentMatch(ApparatusRecipeInput input, Level level, @org.je @Override public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.annotations.Nullable Player player) { ItemEnchantments enchantments = input.catalyst().get(DataComponents.ENCHANTMENTS); - int level1 = enchantments.getLevel(EnchantmentRegistry.REACTIVE_ENCHANTMENT); + int level1 = enchantments.getLevel(HolderHelper.unwrap(level, EnchantmentRegistry.REACTIVE_ENCHANTMENT)); ItemStack parchment = getParchment(input.pedestals()); return !parchment.isEmpty() && !CasterUtil.getCaster(parchment).getSpell().isEmpty() && level1 > 0 && super.matches(input, level, player); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/GiftStarbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/GiftStarbuncle.java index fbfb4462a6..980dcc9cd0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/GiftStarbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/GiftStarbuncle.java @@ -111,9 +111,9 @@ protected void registerGoals() { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(BEING_TAMED, false); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(BEING_TAMED, false); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WealdWalker.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WealdWalker.java index abec5c2f82..4d951ca8d9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WealdWalker.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WealdWalker.java @@ -41,11 +41,8 @@ import net.minecraft.world.level.Level; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -114,8 +111,8 @@ public void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @Nullable Li } @Override - public EntityDimensions getDimensions(Pose p_213305_1_) { - return isBaby() ? new EntityDimensions(1, 1, true) : super.getDimensions(p_213305_1_); + protected EntityDimensions getDefaultDimensions(Pose pPose) { + return isBaby() ? EntityDimensions.fixed(1.0f, 1.0f) : super.getDefaultDimensions(pPose); } @Nullable @@ -205,12 +202,12 @@ public boolean isAlliedTo(Entity pEntity) { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(SMASHING, false); - this.entityData.define(CASTING, false); - this.entityData.define(BABY, false); - this.entityData.define(HOME, Optional.empty()); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(SMASHING, false); + pBuilder.define(CASTING, false); + pBuilder.define(BABY, false); + pBuilder.define(HOME, Optional.empty()); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java index c12789d9f7..f243ec9732 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java @@ -368,7 +368,7 @@ public boolean removeWhenFarAway(double p_213397_1_) { } public static AttributeSupplier.Builder attributes() { - return Mob.createMobAttributes().add(Attributes.FLYING_SPEED, Attributes.FLYING_SPEED.getDefaultValue()) + return Mob.createMobAttributes().add(Attributes.FLYING_SPEED, Attributes.FLYING_SPEED.value().getDefaultValue()) .add(Attributes.MAX_HEALTH, 20.0D) .add(Attributes.MOVEMENT_SPEED, 0.2D); } @@ -421,11 +421,11 @@ public void addAdditionalSaveData(CompoundTag tag) { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(MOOD_SCORE, 0); - this.entityData.define(TAMED, false); - this.entityData.define(COLOR, "summer"); + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(MOOD_SCORE, 0); + pBuilder.define(TAMED, false); + pBuilder.define(COLOR, "summer"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java index d3776482c7..6ebca7e86e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java @@ -105,7 +105,6 @@ public class WildenChimera extends Monster implements GeoEntity { public WildenChimera(EntityType type, Level level) { super(type, level); moveControl = new ChimeraMoveController(this, true); - maxUpStep = 3.0f; setPersistenceRequired(); FlyingPathNavigation flyingpathnavigator = new FlyingPathNavigation(this, level); flyingpathnavigator.setCanOpenDoors(true); @@ -867,7 +866,8 @@ public static AttributeSupplier.Builder getModdedAttributes() { .add(Attributes.ATTACK_DAMAGE, 8D) .add(Attributes.ARMOR, 6D) .add(Attributes.FOLLOW_RANGE, 100D) - .add(Attributes.FLYING_SPEED, 0.4f); + .add(Attributes.FLYING_SPEED, 0.4f) + .add(Attributes.STEP_HEIGHT, 3.0f); } private static class ChimeraMusic extends AbstractTickableSoundInstance { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index 111ec8fc02..ab04faa705 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -18,7 +18,6 @@ import com.hollingsworth.arsnouveau.api.util.PerkUtil; import com.hollingsworth.arsnouveau.client.ClientInfo; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; -import com.hollingsworth.arsnouveau.common.block.LavaLily; import com.hollingsworth.arsnouveau.common.command.*; import com.hollingsworth.arsnouveau.common.compat.CaelusHandler; import com.hollingsworth.arsnouveau.common.crafting.recipes.DispelEntityRecipe; @@ -161,16 +160,6 @@ public static void livingHurtEvent(LivingHurtEvent e) { } } - @SubscribeEvent - public static void livingAttackEvent(LivingAttackEvent e) { - if (e.getSource().is(DamageTypes.HOT_FLOOR) && e.getEntity() != null && !e.getEntity().getCommandSenderWorld().isClientSide) { - Level world = e.getEntity().level; - if (world.getBlockState(e.getEntity().blockPosition()).getBlock() instanceof LavaLily) { - e.setCanceled(true); - } - } - } - @SubscribeEvent public static void livingSpawnEvent(FinalizeSpawnEvent checkSpawn) { if (checkSpawn.getLevel() instanceof Level level && !level.isClientSide) { @@ -306,7 +295,7 @@ public static void entityHeal(LivingHealEvent e) { @SubscribeEvent public static void eatEvent(LivingEntityUseItemEvent.Finish event) { - if (!event.getEntity().level.isClientSide && event.getItem().getItem().getFoodProperties(event.getItem(), event.getEntity()) != null && event.getItem().getItem().isEdible()) { + if (!event.getEntity().level.isClientSide && event.getItem().getItem().getFoodProperties(event.getItem(), event.getEntity()) != null) { if (event.getEntity() instanceof Player player) { FoodData stats = player.getFoodData(); stats.saturationLevel = (float) (stats.saturationLevel * PerkUtil.perkValue(player, PerkAttributes.WHIRLIESPRIG.get())); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java index 59854496c0..62c201c6cc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketReactiveSpell; import com.hollingsworth.arsnouveau.common.spell.casters.ReactiveCaster; +import com.hollingsworth.arsnouveau.common.util.HolderHelper; import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.LivingEntity; @@ -30,7 +31,7 @@ public static void livingHitEvent(LivingHurtEvent e) { } public static void castSpell(LivingEntity playerIn, ItemStack s) { - if (s.getEnchantmentLevel(EnchantmentRegistry.REACTIVE_ENCHANTMENT) * .25 >= Math.random() && new ReactiveCaster(s).getSpell().isValid()) { + if (s.getEnchantmentLevel(HolderHelper.unwrap(playerIn.level, EnchantmentRegistry.REACTIVE_ENCHANTMENT)) * .25 >= Math.random() && new ReactiveCaster(s).getSpell().isValid()) { ReactiveCaster reactiveCaster = new ReactiveCaster(s); reactiveCaster.castSpell(playerIn.getCommandSenderWorld(), playerIn, InteractionHand.MAIN_HAND, null); } @@ -59,7 +60,7 @@ public static void playerAttackEntity(AttackEntityEvent e) { @SubscribeEvent public static void leftClickAir(PlayerInteractEvent.LeftClickEmpty e) { - if (e.getItemStack().getEnchantmentLevel(EnchantmentRegistry.REACTIVE_ENCHANTMENT) > 0) + if (e.getItemStack().getEnchantmentLevel(HolderHelper.unwrap(e.getLevel(), EnchantmentRegistry.REACTIVE_ENCHANTMENT)) > 0) Networking.sendToServer(new PacketReactiveSpell()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java index 8ab2a59530..38b1486613 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java @@ -6,6 +6,7 @@ import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenuSlot; +import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.client.registry.ModKeyBindings; import com.hollingsworth.arsnouveau.client.renderer.item.FlaskCannonRenderer; import com.hollingsworth.arsnouveau.client.renderer.tile.GenericModel; @@ -143,7 +144,7 @@ public void onRadialKeyPressed(ItemStack stack, Player player) { } Minecraft.getInstance().setScreen(new GuiRadialMenu<>(new RadialMenu<>((int index) -> { Networking.sendToServer(new PacketSetLauncher(slots.get(index).primarySlotIcon().getSlot())); - }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtil.drawItemAsIcon(slotData.getStack(), posestack, positionx, posy, size, transparent), 3))); + }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtils.drawItemAsIcon(slotData.getStack(), posestack, positionx, posy, size, transparent), 3))); } public AnimatableInstanceCache factory = GeckoLibUtil.createInstanceCache(this); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/light/DynamLightUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/light/DynamLightUtil.java index 7edc54290f..05a8db213e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/light/DynamLightUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/light/DynamLightUtil.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.common.light; import com.hollingsworth.arsnouveau.setup.config.Config; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -64,11 +65,11 @@ public static int fromItemLike(ItemLike itemLike){ } public static ResourceLocation keyFor(Entity entity){ - return ForgeRegistries.ENTITY_TYPES.getKey(entity.getType()); + return BuiltInRegistries.ENTITY_TYPE.getKey(entity.getType()); } public static ResourceLocation keyFor(ItemLike itemLike){ - return ForgeRegistries.ITEMS.getKey(itemLike.asItem()); + return BuiltInRegistries.ITEM.getKey(itemLike.asItem()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java b/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java index 2817033740..6934e9aef1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java @@ -1,20 +1,20 @@ package com.hollingsworth.arsnouveau.common.light; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import com.hollingsworth.arsnouveau.setup.config.Config; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.LightLayer; - import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -123,7 +123,7 @@ public static int getValue(T entity) } public static boolean containsEntity(EntityType type){ - return LIGHT_REGISTRY.containsKey(type) || Config.ENTITY_LIGHT_MAP.containsKey(ForgeRegistries.ENTITY_TYPES.getKey(type)); + return LIGHT_REGISTRY.containsKey(type) || Config.ENTITY_LIGHT_MAP.containsKey(BuiltInRegistries.ENTITY_TYPE.getKey(type)); } /** diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/PiglinBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/PiglinBehavior.java index 9b8e44f85d..851f8e9e9e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/PiglinBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/PiglinBehavior.java @@ -76,7 +76,7 @@ public void tick(MobJarTile tile) { } private static List getBarterResponseItems(Piglin pPiglin) { - LootTable loottable = pPiglin.level().getServer().getLootData().getLootTable(BuiltInLootTables.PIGLIN_BARTERING); + LootTable loottable = pPiglin.level().getServer().reloadableRegistries().getLootTable(BuiltInLootTables.PIGLIN_BARTERING); List list = loottable.getRandomItems((new LootParams.Builder((ServerLevel)pPiglin.level())).withParameter(LootContextParams.THIS_ENTITY, pPiglin).create(LootContextParamSets.PIGLIN_BARTER)); return list; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/ParticleMobEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/ParticleMobEffect.java index fa3121fb9f..5b29a02a21 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/ParticleMobEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/ParticleMobEffect.java @@ -11,11 +11,12 @@ protected ParticleMobEffect(MobEffectCategory pCategory, int pColor) { } @Override - public void applyEffectTick(LivingEntity living, int amplifier) { + public boolean applyEffectTick(LivingEntity living, int amplifier) { if (living.level.isClientSide) if (living.level.random.nextInt(getChance()) == 0) { living.level.addParticle(getParticle(), living.getRandomX(1.0D), living.getRandomY(), living.getRandomZ(1.0D), 0.0D, 0.0D, 0.0D); } + return false; } public abstract ParticleOptions getParticle(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/PublicEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/PublicEffect.java index e09d218e3d..7e1c26552a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/PublicEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/PublicEffect.java @@ -26,4 +26,6 @@ public PublicEffect(MobEffectCategory type, int color, List curativeI public List getCurativeItems() { return this.curativeItems != null ? curativeItems : super.getCurativeItems(); } + + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/ShockedEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/ShockedEffect.java index b5017c1001..883ed5dc40 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/ShockedEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/ShockedEffect.java @@ -26,10 +26,10 @@ public boolean isDurationEffectTick(int duration, int amp) { } @Override - public void applyEffectTick(LivingEntity entity, int amp) { + public boolean applyEffectTick(LivingEntity entity, int amp) { int multiplier = 0; for (ItemStack i : entity.getArmorSlots()) { - IEnergyStorage energyStorage = i.getCapability(Capabilities.ENERGY).orElse(null); + IEnergyStorage energyStorage = i.getCapability(Capabilities.EnergyStorage.ITEM); if (energyStorage != null) { multiplier++; } @@ -49,5 +49,6 @@ public void applyEffectTick(LivingEntity entity, int amp) { entity.hurt(entity.level.damageSources().lightningBolt(), 20 * multiplier * (amp + 1)); } + return true; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/SnareEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/SnareEffect.java index e84fd5c84e..2b1f39b4fb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/SnareEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/SnareEffect.java @@ -9,7 +9,7 @@ public class SnareEffect extends MobEffect { public SnareEffect() { super(MobEffectCategory.HARMFUL, 2039587); - addAttributeModifier(Attributes.MOVEMENT_SPEED, "0dee8a21-f182-42c8-8361-1ad6186cac30", -1, AttributeModifier.Operation.MULTIPLY_TOTAL); + addAttributeModifier(Attributes.MOVEMENT_SPEED, "0dee8a21-f182-42c8-8361-1ad6186cac30", -1, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualBinding.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualBinding.java index 50970b469d..b19d89a0e5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualBinding.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualBinding.java @@ -49,7 +49,7 @@ protected void tick() { ParticleUtil.spawnPoof((ServerLevel) world, entity.blockPosition()); world.addFreshEntity(new ItemEntity(world, entity.blockPosition().getX(), entity.blockPosition().getY(), entity.blockPosition().getZ(), familiarHolder.getOutputItem())); world.playSound(null, entity.blockPosition(), SoundEvents.BOOK_PUT, SoundSource.NEUTRAL, 1.0f, 1.0f); - ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.FAMILIAR, (ServerLevel) world, entity.blockPosition(), 8); + ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.FAMILIAR.get(), (ServerLevel) world, entity.blockPosition(), 8); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualDisintegration.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualDisintegration.java index 5972b1c508..4cfe1db2f2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualDisintegration.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualDisintegration.java @@ -53,7 +53,7 @@ protected void tick() { ParticleUtil.spawnPoof((ServerLevel) world, m.blockPosition()); if (m.shouldDropExperience()) { - int exp = m.getExperienceReward() * 2; + int exp = m.getExperienceReward((ServerLevel) world, null) * 2; if (exp > 0) { int numGreater = exp / 12; exp -= numGreater * 12; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualHarvest.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualHarvest.java index 182a50b1a4..b769eeecb5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualHarvest.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualHarvest.java @@ -61,7 +61,7 @@ protected void tick() { continue; } - if (state.getBlock() instanceof StemGrownBlock || state.is(BlockTagProvider.HARVEST_STEMS) && state.getBlock() == world.getBlockState(blockpos.below()).getBlock()) { + if (state.is(BlockTagProvider.HARVEST_STEMS) && state.getBlock() == world.getBlockState(blockpos.below()).getBlock()) { processAndSpawnDrops(blockpos, state, world, false); BlockUtil.destroyBlockSafely(world, blockpos, false, null); continue; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java index b289e3f814..fa6f1b08e5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualScrying.java @@ -21,6 +21,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.SingleRecipeInput; import net.minecraft.world.phys.AABB; import org.jetbrains.annotations.Nullable; @@ -42,7 +43,7 @@ protected void tick() { ItemStack item = getConsumedItems().stream().filter(i -> i.getItem() != ItemsRegistry.MANIPULATION_ESSENCE.get()).findFirst().orElse(ItemStack.EMPTY); int modifier = didConsumeItem(ItemsRegistry.MANIPULATION_ESSENCE.get()) ? 3 : 1; for (ServerPlayer playerEntity : players) { - Optional hasRecipe = ScryRitualRegistry.getRecipes().stream().filter(recipe -> recipe.matches(item)).findFirst(); + Optional hasRecipe = ScryRitualRegistry.getRecipes().stream().filter(recipe -> recipe.matches(new SingleRecipeInput(item), getWorld())).findFirst(); IScryer scryer = null; if (hasRecipe.isPresent()) scryer = new TagScryer(hasRecipe.get().highlight()); else if (item.getItem() instanceof BlockItem blockItem) scryer = new SingleBlockScryer(blockItem.getBlock()); @@ -83,7 +84,7 @@ public boolean canConsumeItem(ItemStack stack) { if (stack.getItem() instanceof BlockItem) { return true; } - return ScryRitualRegistry.getRecipes().stream().anyMatch(recipe -> recipe.matches(stack)); + return ScryRitualRegistry.getRecipes().stream().anyMatch(recipe -> recipe.matches(new SingleRecipeInput(stack), getWorld())); } return false; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDispel.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDispel.java index 296b42f07f..ecf49548e8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDispel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDispel.java @@ -10,11 +10,10 @@ import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; +import net.neoforged.neoforge.common.EffectCures; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.NotNull; @@ -38,11 +37,11 @@ public void onResolveEntity(@NotNull EntityHitResult rayTraceResult, Level world Optional> blacklist = world.registryAccess().registryOrThrow(Registries.MOB_EFFECT).getTag(PotionEffectTags.DISPEL_DENY); Optional> whitelist = world.registryAccess().registryOrThrow(Registries.MOB_EFFECT).getTag(PotionEffectTags.DISPEL_ALLOW); for (MobEffectInstance e : array) { - if (e.isCurativeItem(new ItemStack(Items.MILK_BUCKET))) { - if (blacklist.isPresent() && blacklist.get().stream().anyMatch(effect -> effect.get() == e.getEffect())) + if (e.getCures().contains(EffectCures.MILK)) { + if (blacklist.isPresent() && blacklist.get().stream().anyMatch(effect -> effect.value() == e.getEffect())) continue; entity.removeEffect(e.getEffect()); - } else if (whitelist.isPresent() && whitelist.get().stream().anyMatch(effect -> effect.get() == e.getEffect())) { + } else if (whitelist.isPresent() && whitelist.get().stream().anyMatch(effect -> effect.value() == e.getEffect())) { entity.removeEffect(e.getEffect()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHarvest.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHarvest.java index 5658c5ffe5..a69657e0d6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHarvest.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHarvest.java @@ -88,7 +88,7 @@ public void onResolveBlock(BlockHitResult ray, Level world, @NotNull LivingEntit continue; } - if (state.getBlock() instanceof StemGrownBlock || state.is(BlockTagProvider.HARVEST_STEMS) && state.getBlock() == world.getBlockState(blockpos.below()).getBlock()) { + if (state.is(BlockTagProvider.HARVEST_STEMS) && state.getBlock() == world.getBlockState(blockpos.below()).getBlock()) { processAndSpawnDrops(blockpos, state, world, shooter, spellStats, spellContext, false); BlockUtil.destroyBlockSafely(world, blockpos, false, shooter); continue; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java index ecaf55ba40..e3bc866a3e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java @@ -75,7 +75,7 @@ public boolean handleBucket(ItemStack item, BucketItem bucket, Player player, Bl if (!(targetState.getBlock() instanceof BucketPickup bp)) { return false; } - ItemStack pickup = bp.pickupBlock(world, target, targetState); + ItemStack pickup = bp.pickupBlock(player, world, target, targetState); if (!pickup.isEmpty() && !player.getAbilities().instabuild) { bp.getPickupSound(targetState).ifPresent(sound -> player.playSound(sound, 1.0F, 1.0F)); world.gameEvent(player, GameEvent.FLUID_PICKUP, target); @@ -144,7 +144,7 @@ public void useOnBlock(Player player, SpellStats spellStats, BlockPos pos, Block UseOnContext context = new UseOnContext(player, getHand(player), rayTraceResult); item.useOn(context); } else { - state.use(world, player, InteractionHand.MAIN_HAND, rayTraceResult); + state.useItemOn(player.getItemInHand(InteractionHand.MAIN_HAND), world, player, InteractionHand.MAIN_HAND, rayTraceResult); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java index ee927e9dbd..ef557a75c8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java @@ -18,6 +18,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.entity.BaseContainerBlockEntity; import net.minecraft.world.level.block.entity.BlockEntity; @@ -80,7 +81,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull BlockState state = world.getBlockState(pos); BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof SkullBlockEntity head){ - head.setOwner(new GameProfile(null, name.getString())); + head.setOwner(new ResolvableProfile(new GameProfile(null, name.getString()))); world.sendBlockUpdated(pos, state, state, 3); head.setChanged(); return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java index f4fad850ce..91a5232e83 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java @@ -14,6 +14,7 @@ import com.hollingsworth.arsnouveau.common.spell.augment.AugmentRandomize; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentSensitive; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; @@ -28,6 +29,7 @@ import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.inventory.TransientCraftingContainer; import net.minecraft.world.item.*; +import net.minecraft.world.item.component.DyedItemColor; import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; @@ -66,14 +68,14 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul sheep.setColor(dye.getDyeColor()); else if (spellStats.isSensitive() || living instanceof ArmorStand) { for (ItemStack armorStack : living.getArmorSlots()) { - if (!armorStack.isEmpty()) - if (armorStack.getItem() instanceof DyeableLeatherItem) { - var temp = DyeableLeatherItem.dyeArmor(armorStack, List.of(dye)); - //replace the tag with the new tag instead of replacing the stack - armorStack.setTag(temp.getTag()); + if (!armorStack.isEmpty()) { + var dyeComponent = armorStack.get(DataComponents.DYED_COLOR); + if (dyeComponent != null) { + armorStack.set(DataComponents.DYED_COLOR, new DyedItemColor(dye.getDyeColor().getTextureDiffuseColor(), false)); } else if (armorStack.getItem() instanceof IDyeable iDyeable) { iDyeable.onDye(armorStack, dye.getDyeColor()); } + } } } else if (living instanceof Mob mob) { player.setItemInHand(InteractionHand.MAIN_HAND, dyeStack); @@ -138,12 +140,12 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull @NotNull private ItemStack getDyedResult(ServerLevel world, CraftingContainer craftingcontainer) { - Optional recipe = recipeCache.stream().filter(craftingRecipe -> craftingRecipe.matches(craftingcontainer, world)).findFirst(); + Optional recipe = recipeCache.stream().filter(craftingRecipe -> craftingRecipe.matches(craftingcontainer.asCraftInput(), world)).findFirst(); if (recipe.isPresent()) { recipeCache.add(recipe.get()); - return recipe.get().assemble(craftingcontainer, world.registryAccess()); + return recipe.get().assemble(craftingcontainer.asCraftInput(), world.registryAccess()); } - return world.getRecipeManager().getRecipeFor(RecipeType.CRAFTING, craftingcontainer, world).map((craftingRecipe) -> craftingRecipe.assemble(craftingcontainer, world.registryAccess())).orElse(ItemStack.EMPTY); + return world.getRecipeManager().getRecipeFor(RecipeType.CRAFTING, craftingcontainer.asCraftInput(), world).map((craftingRecipe) -> craftingRecipe.value().assemble(craftingcontainer.asCraftInput(), world.registryAccess())).orElse(ItemStack.EMPTY); } private static CraftingContainer makeContainer(DyeItem targetColor, Block blockToDye) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java index 8f47d7378a..c01d1a0d23 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.common.util; -import com.hollingsworth.arsnouveau.api.recipe.PotionIngredient; import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; @@ -10,14 +9,13 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.PotionContents; -import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.item.crafting.Ingredient; import net.neoforged.neoforge.common.crafting.DataComponentIngredient; public class PotionUtil { public static void addPotionToTag(Potion potionIn, CompoundTag tag) { ResourceLocation resourcelocation = BuiltInRegistries.POTION.getKey(potionIn); - if (potionIn == Potions.EMPTY) { + if (potionIn == PotionContents.EMPTY) { if (tag.contains("Potion")) { tag.remove("Potion"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java index ecea0566ed..296212902c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java @@ -212,9 +212,9 @@ public int getValue() { public static final ItemRegistryWrapper SPLASH_LAUNCHER = register(LibItemNames.SPLASH_LAUNCHER, () -> new FlaskCannon.SplashLauncher(defaultItemProperties().stacksTo(1))); public static final ItemRegistryWrapper LINGERING_LAUNCHER = register(LibItemNames.LINGERING_LAUNCHER, () -> new FlaskCannon.LingeringLauncher(defaultItemProperties().stacksTo(1))); // TODO: restore discs -// public static final ItemRegistryWrapper FIREL_DISC = register(LibItemNames.FIREL_DISC, () -> new RecordItem(9, () -> SoundRegistry.ARIA_BIBLIO.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 240)); -// public static final ItemRegistryWrapper SOUND_OF_GLASS = register(LibItemNames.SOUND_OF_GLASS, () -> new RecordItem(9, () -> SoundRegistry.SOUND_OF_GLASS.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 182)); -// public static final ItemRegistryWrapper WILD_HUNT = register(LibItemNames.FIREL_WILD_HUNT, () -> new RecordItem(9, () -> SoundRegistry.WILD_HUNT.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 121)); + public static final ItemRegistryWrapper FIREL_DISC = register(LibItemNames.FIREL_DISC, () -> new RecordItem(9, () -> SoundRegistry.ARIA_BIBLIO.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 240)); + public static final ItemRegistryWrapper SOUND_OF_GLASS = register(LibItemNames.SOUND_OF_GLASS, () -> new RecordItem(9, () -> SoundRegistry.SOUND_OF_GLASS.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 182)); + public static final ItemRegistryWrapper WILD_HUNT = register(LibItemNames.FIREL_WILD_HUNT, () -> new RecordItem(9, () -> SoundRegistry.WILD_HUNT.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 121)); public static final ItemRegistryWrapper STARBY_GIFY = register(LibItemNames.STARBY_GIFT, () -> new Present(defaultItemProperties().rarity(Rarity.EPIC))); public static final ItemRegistryWrapper SPELL_CROSSBOW = register(LibItemNames.SPELL_CROSSBOW, () -> new SpellCrossbow(defaultItemProperties().stacksTo(1))); public static final ItemRegistryWrapper STABLE_WARP_SCROLL = register(LibItemNames.STABLE_WARP_SCROLL, () -> new StableWarpScroll(defaultItemProperties().stacksTo(1))); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java index a784128e81..21dd084dd7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java @@ -41,7 +41,7 @@ public void addAttributeModifiers(AttributeMap pAttributeMap, int pAmplifier) { super.addAttributeModifiers(pAttributeMap, pAmplifier); } }); - public static final DeferredHolder SUMMONING_SICKNESS_EFFECT = EFFECTS.register(SUMMONING_SICKNESS, () -> new PublicEffect(MobEffectCategory.HARMFUL, 2039587, new ArrayList<>())); + public static final DeferredHolder SUMMONING_SICKNESS_EFFECT = EFFECTS.register(SUMMONING_SICKNESS, () -> new SummoningSicknessEffect(MobEffectCategory.HARMFUL, 2039587, new ArrayList<>())); public static final DeferredHolder HEX_EFFECT = EFFECTS.register(HEX, () -> new PublicEffect(MobEffectCategory.HARMFUL, 8080895) { @Override From 7e729d4c85db3413b86f3686388a7b086777c332 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Fri, 28 Jun 2024 09:51:38 -0500 Subject: [PATCH 019/363] guis, move registry classes --- .../api/familiar/PersistentFamiliarData.java | 52 +++++++++++++------ .../arsnouveau/api/item/NBTComponent.java | 16 ++++++ .../arsnouveau/api/spell/ISpellCaster.java | 3 +- .../container/CraftingTerminalMenu.java | 19 ++++--- .../container/CraftingTerminalScreen.java | 3 +- .../client/gui/GuiEntityInfoHUD.java | 12 +++-- .../client/gui/book/GlyphUnlockMenu.java | 8 ++- .../client/gui/book/GuiSpellBook.java | 3 +- .../client/gui/buttons/CraftingButton.java | 20 ++++--- .../client/gui/buttons/CreateSpellButton.java | 14 +++-- .../client/gui/buttons/GuiSpellSlot.java | 12 ++--- .../client/gui/buttons/ItemButton.java | 20 ++++--- .../client/gui/buttons/SelectableButton.java | 5 +- .../client/gui/buttons/UnlockGlyphButton.java | 13 +++-- .../client/gui/radial_menu/GuiRadialMenu.java | 13 +++-- .../client/registry/ClientHandler.java | 2 +- .../common/block/ImbuementBlock.java | 11 ++-- .../arsnouveau/common/block/PotionJar.java | 6 +-- .../common/block/ScryersOculus.java | 3 +- .../common/block/SourceBerryBush.java | 4 +- .../arsnouveau/common/block/SourceJar.java | 5 +- .../common/block/StrippableLog.java | 2 +- .../block/tile/BasicSpellTurretTile.java | 7 +-- .../common/block/tile/MagelightTorchTile.java | 4 +- .../common/block/tile/ModdedTile.java | 3 +- .../common/block/tile/PotionJarTile.java | 7 +-- .../common/block/tile/RelayTile.java | 11 ++-- .../common/block/tile/SconceTile.java | 6 +-- .../common/block/tile/SourceJarTile.java | 1 - .../common/block/tile/SourcelinkTile.java | 9 +--- .../common/camera/CameraController.java | 4 +- .../common/crafting/recipes/IDyeable.java | 4 +- .../common/datagen/DefaultTableProvider.java | 6 +-- .../common/datagen/ItemModelGenerator.java | 2 +- .../entity/familiar/FamiliarEntity.java | 8 +-- .../common/items/AlchemistsCrown.java | 3 +- .../common/items/ExperienceGem.java | 10 ++-- .../arsnouveau/common/items/MobJarItem.java | 3 +- .../common/items/RendererBlockItem.java | 4 +- .../arsnouveau/common/items/SpellBook.java | 18 +++---- .../structure/StructureTemplateMixin.java | 3 +- .../common/network/PotionSyncPacket.java | 6 ++- .../common/potions/FreezingEffect.java | 6 +-- .../common/potions/GravityEffect.java | 9 +--- .../common/potions/MagicFindEffect.java | 8 +-- .../common/potions/ShockedEffect.java | 18 +++---- .../common/potions/SnareEffect.java | 6 ++- .../arsnouveau/setup/ModSetup.java | 2 +- .../BlockEntityTypeRegistryWrapper.java | 2 +- .../setup/registry/BlockRegistry.java | 2 - .../registry/BlockRegistryWrapper.java | 2 +- .../setup/registry/DataComponentRegistry.java | 16 ++++++ .../setup/registry/EnchantmentRegistry.java | 6 --- .../registry/ItemRegistryWrapper.java | 3 +- .../setup/registry/ItemsRegistry.java | 7 ++- .../registry/RegistryWrapper.java | 2 +- .../resources/META-INF/accesstransformer.cfg | 8 +-- 57 files changed, 225 insertions(+), 237 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/item/NBTComponent.java rename src/main/java/com/hollingsworth/arsnouveau/{common/util => setup}/registry/BlockEntityTypeRegistryWrapper.java (88%) rename src/main/java/com/hollingsworth/arsnouveau/{common/util => setup}/registry/BlockRegistryWrapper.java (83%) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java rename src/main/java/com/hollingsworth/arsnouveau/{common/util => setup}/registry/ItemRegistryWrapper.java (73%) rename src/main/java/com/hollingsworth/arsnouveau/{common/util => setup}/registry/RegistryWrapper.java (96%) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/familiar/PersistentFamiliarData.java b/src/main/java/com/hollingsworth/arsnouveau/api/familiar/PersistentFamiliarData.java index cb738968fa..6f42465ab9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/familiar/PersistentFamiliarData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/familiar/PersistentFamiliarData.java @@ -1,30 +1,48 @@ package com.hollingsworth.arsnouveau.api.familiar; -import net.minecraft.nbt.CompoundTag; +import com.hollingsworth.arsnouveau.api.item.NBTComponent; +import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.Entity; +import net.minecraft.network.chat.ComponentSerialization; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.ItemStack; -public class PersistentFamiliarData { +public class PersistentFamiliarData implements NBTComponent { + + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + ComponentSerialization.CODEC.fieldOf("name").forGetter(data -> data.name), + Codec.STRING.fieldOf("color").forGetter(data -> data.color), + ItemStack.CODEC.fieldOf("cosmetic").forGetter(data -> data.cosmetic) + ).apply(instance, PersistentFamiliarData::new)); + + public static StreamCodec STREAM_CODEC = CheatSerializer.create(PersistentFamiliarData.CODEC); + public Component name; public String color; public ItemStack cosmetic; - public PersistentFamiliarData(CompoundTag tag) { - this.name = tag.contains("name") ? Component.Serializer.fromJson(tag.getString("name")) : null; - this.color = tag.contains("color") ? tag.getString("color") : null; - this.cosmetic = tag.contains("cosmetic") ? ItemStack.of(tag.getCompound("cosmetic")) : null; + public PersistentFamiliarData(Component name, String color, ItemStack cosmetic) { + this.name = name; + this.color = color; + this.cosmetic = cosmetic; + } + + public PersistentFamiliarData(){ + this(Component.nullToEmpty(""), "", ItemStack.EMPTY); + } + + public static PersistentFamiliarData fromTag(Tag tag){ + return CODEC.codec().parse(NbtOps.INSTANCE, tag).getOrThrow(); } - public CompoundTag toTag(T entity, CompoundTag tag) { - if (name != null) - tag.putString("name", Component.Serializer.toJson(name)); - if (color != null) { - tag.putString("color", color); - } - if (cosmetic != null) { - tag.put("cosmetic", cosmetic.save(new CompoundTag())); - } - return tag; + @Override + public Codec getCodec() { + return CODEC.codec(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/NBTComponent.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/NBTComponent.java new file mode 100644 index 0000000000..328512e87f --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/NBTComponent.java @@ -0,0 +1,16 @@ +package com.hollingsworth.arsnouveau.api.item; + +import com.mojang.serialization.Codec; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; +import net.minecraft.world.level.Level; + +public interface NBTComponent { + + Codec getCodec(); + + default Tag toTag(Level level){ + return getCodec().encode((T) this, level.registryAccess().createSerializationContext(NbtOps.INSTANCE), new CompoundTag()).getOrThrow(); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCaster.java index d81a35e3f7..b52935f2ca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCaster.java @@ -21,6 +21,7 @@ import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; @@ -137,7 +138,7 @@ default InteractionResultHolder castSpell(Level worldIn, LivingEntity IWrappedCaster wrappedCaster = entity instanceof Player pCaster ? new PlayerCaster(pCaster) : new LivingCaster(entity); SpellResolver resolver = getSpellResolver(new SpellContext(worldIn, spell, entity, wrappedCaster, stack), worldIn, player, handIn); boolean isSensitive = resolver.spell.getBuffsAtIndex(0, entity, AugmentSensitive.INSTANCE) > 0; - HitResult result = SpellUtil.rayTrace(entity, 0.5 + player.getBlockReach(), 0, isSensitive); + HitResult result = SpellUtil.rayTrace(entity, 0.5 + player.getAttribute(Attributes.BLOCK_INTERACTION_RANGE).getValue(), 0, isSensitive); if (result instanceof BlockHitResult blockHit) { BlockEntity tile = worldIn.getBlockEntity(blockHit.getBlockPos()); if (tile instanceof ScribesTile) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java index b4b9192b27..59e7730b8e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java @@ -16,9 +16,10 @@ import net.minecraft.world.inventory.*; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeInput; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; public class CraftingTerminalMenu extends StorageTerminalMenu implements IAutoFillTerminal { @@ -197,8 +198,8 @@ public void clearCraftingContent() { } @Override - public boolean recipeMatches(Recipe recipeIn) { - return recipeIn.matches(this.craftMatrix, this.pinv.player.level); + public boolean recipeMatches(RecipeHolder pRecipe) { + return pRecipe.value().matches(this.craftMatrix.asCraftInput(), this.pinv.player.level); } @Override @@ -236,18 +237,16 @@ public void clear() { } } - @SuppressWarnings({ "unchecked", "rawtypes" }) @Override - public void handlePlacement(boolean p_217056_1_, Recipe p_217056_2_, ServerPlayer p_217056_3_) { - (new ServerPlaceRecipe(this) { + public void handlePlacement(boolean pPlaceAll, RecipeHolder pRecipe, ServerPlayer pPlayer) { + (new ServerPlaceRecipe(this) { { stackedContents = new TerminalRecipeItemHelper(); } - @Override - public void addItemToSlot(Iterator pIngredients, int pSlot, int pMaxAmount, int pY, int pX) { + public void addItemToSlot(Object p_346420_, int pSlot, int pMaxAmount, int p_135418_, int p_135419_) { Slot slot = this.menu.getSlot(pSlot); ItemStack itemstack = StackedContents.fromStackingIndex((Integer) pIngredients.next()); if (!itemstack.isEmpty()) { @@ -294,7 +293,7 @@ protected void clearGrid() { ((CraftingLecternTile) te).clear(selectedTab); this.menu.clearCraftingContent(); } - }).recipeClicked(p_217056_3_, p_217056_2_, p_217056_1_); + }).recipeClicked(pPlaceAll, pRecipe, pPlayer); } @Override @@ -310,7 +309,7 @@ public void receive(CompoundTag message) { stacks[slot] = new ItemStack[l]; for (int j = 0;j < l;j++) { CompoundTag tag = nbttagcompound.getCompound("i" + j); - stacks[slot][j] = ItemStack.of(tag); + stacks[slot][j] = ItemStack.parseOptional(tag); } } ((CraftingLecternTile) te).transferToGrid(pinv.player, stacks, selectedTab); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java index 25cf2fa1e6..d30f9646c5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java @@ -1,7 +1,6 @@ package com.hollingsworth.arsnouveau.client.container; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.client.container.CraftingTerminalMenu.TerminalRecipeItemHelper; import com.hollingsworth.arsnouveau.client.gui.buttons.GuiImageButton; import com.hollingsworth.arsnouveau.setup.config.Config; import net.minecraft.client.gui.GuiGraphics; @@ -147,7 +146,7 @@ public void containerTick() { @Override public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - this.renderBackground(graphics); + this.renderBackground(graphics, mouseX, mouseY, partialTicks); if (this.recipeBookGui.isVisible() && this.widthTooNarrow) { this.renderBg(graphics, partialTicks, mouseX, mouseY); this.recipeBookGui.render(graphics, mouseX, mouseY, partialTicks); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java index 8190ff5f72..ddea176278 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java @@ -4,8 +4,8 @@ import com.hollingsworth.arsnouveau.common.items.ItemScroll; import com.hollingsworth.arsnouveau.setup.config.Config; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.ByteBufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; @@ -96,13 +96,15 @@ public static void renderOverlay(GuiGraphics graphics, DeltaTracker tracker) { tooltipHeight += (tooltip.size() - 1) * 10; } int xOffset = Config.TOOLTIP_X_OFFSET.get(); + int width = Minecraft.getInstance().getWindow().getWidth(); + int height = Minecraft.getInstance().getWindow().getHeight(); int posX = width / 2 + xOffset; int posY = height / 2 + Config.TOOLTIP_Y_OFFSET.get(); posX = Math.min(posX, width - tooltipTextWidth - 20); posY = Math.min(posY, height - tooltipHeight - 20); - float fade = Mth.clamp((hoverTicks + partialTicks) / 12f, 0, 1); + float fade = Mth.clamp((hoverTicks + tracker.getGameTimeDeltaTicks()) / 12f, 0, 1); Color colorBackground = VANILLA_TOOLTIP_BACKGROUND.scaleAlpha(.75f); Color colorBorderTop = VANILLA_TOOLTIP_BORDER_1; Color colorBorderBot = VANILLA_TOOLTIP_BORDER_2; @@ -132,7 +134,8 @@ public static void drawHoveringText(@NotNull final ItemStack stack, GuiGraphics List list = ClientHooks.gatherTooltipComponents(stack, textLines, stack.getTooltipImage(), mouseX, screenWidth, screenHeight, font); RenderTooltipEvent.Pre event = new RenderTooltipEvent.Pre(stack, graphics, mouseX, mouseY, screenWidth, screenHeight, font, list, DefaultTooltipPositioner.INSTANCE); - if (NeoForge.EVENT_BUS.post(event)) + NeoForge.EVENT_BUS.post(event); + if (event.isCanceled()) return; mouseX = event.getX(); @@ -242,8 +245,7 @@ else if (tooltipY + tooltipHeight + 4 > screenHeight) graphics.fillGradient(tooltipX - 3, tooltipY + tooltipHeight + 2, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, borderColorEnd, borderColorEnd); - MultiBufferSource.BufferSource renderType = MultiBufferSource.immediate(Tesselator.getInstance() - .getBuilder()); + MultiBufferSource.BufferSource renderType = MultiBufferSource.immediate(new ByteBufferBuilder(1536)); pStack.translate(0.0D, 0.0D, zLevel); for (int lineNumber = 0; lineNumber < list.size(); ++lineNumber) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java index e8d0a8554a..5fd687de44 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java @@ -384,10 +384,8 @@ public void renderTooltipInternal(GuiGraphics graphics, List max mana RenderSystem.setShaderTexture(0, ArsNouveau.prefix( "textures/gui/manabar_gui_grayscale.png")); - RenderUtil.colorBlit(graphics.pose(), offsetLeft + 8, yOffset - 10, 0, manaOffset, 100, 8, 256, 256, manaLength < 0 ? Color.RED : Color.rainbowColor(ClientInfo.ticksInGame)); + RenderUtils.colorBlit(graphics.pose(), offsetLeft + 8, yOffset - 10, 0, manaOffset, 100, 8, 256, 256, manaLength < 0 ? Color.RED : Color.rainbowColor(ClientInfo.ticksInGame)); } if (ArsNouveauAPI.ENABLE_DEBUG_NUMBERS && minecraft != null) { String text = currentCostCache + " / " + maxManaCache; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java index 9d177274f0..da0f395bd7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java @@ -38,18 +38,16 @@ public void setAbstractSpellPart(AbstractSpellPart abstractSpellPart) { } @Override - public void render(GuiGraphics graphics, int parX, int parY, float partialTicks) { - if (visible) { - if (validationErrors.isEmpty()) { - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - } else { - RenderSystem.setShaderColor(1.0F, 0.7F, 0.7F, 1.0F); - } - if (this.abstractSpellPart != null) { - RenderUtils.drawSpellPart(this.abstractSpellPart, graphics, x + 3, y + 2, 16, !validationErrors.isEmpty(), 0); - } + protected void renderWidget(GuiGraphics graphics, int pMouseX, int pMouseY, float pPartialTick) { + if (validationErrors.isEmpty()) { + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + } else { + RenderSystem.setShaderColor(1.0F, 0.7F, 0.7F, 1.0F); + } + if (this.abstractSpellPart != null) { + RenderUtils.drawSpellPart(this.abstractSpellPart, graphics, x + 3, y + 2, 16, !validationErrors.isEmpty(), 0); } - super.render(graphics, parX, parY, partialTicks); + super.renderWidget(graphics, pMouseX, pMouseY, pPartialTick); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CreateSpellButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CreateSpellButton.java index e3e7907c73..21e4b0175a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CreateSpellButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CreateSpellButton.java @@ -16,14 +16,12 @@ public CreateSpellButton(int x, int y, Button.OnPress onPress, Supplier } @Override - public void render(GuiGraphics graphics, int parX, int parY, float partialTicks) { - if (visible) { - if (!shouldRenderRed.get()) { - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - } else { - RenderSystem.setShaderColor(1.0F, 0.7F, 0.7F, 1.0F); - } - super.render(graphics, parX, parY, partialTicks); + protected void renderWidget(GuiGraphics graphics, int pMouseX, int pMouseY, float pPartialTick) { + if (!shouldRenderRed.get()) { + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + } else { + RenderSystem.setShaderColor(1.0F, 0.7F, 0.7F, 1.0F); } + super.renderWidget(graphics, pMouseX, pMouseY, pPartialTick); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiSpellSlot.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiSpellSlot.java index 9f86540a82..b3ae975704 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiSpellSlot.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiSpellSlot.java @@ -4,7 +4,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import java.util.List; @@ -13,7 +12,6 @@ */ public class GuiSpellSlot extends GuiImageButton { - public int slotNum; public boolean isSelected; public String spellName; @@ -25,12 +23,10 @@ public GuiSpellSlot(int x, int y, int slotNum, String spellName, OnPress onPress } @Override - public void render(GuiGraphics graphics, int parX, int parY, float partialTicks) { - if (visible) { - image = this.isSelected ? ArsNouveau.prefix( "textures/gui/spell_tab_selected.png") : ArsNouveau.prefix( "textures/gui/spell_tab.png"); - super.render(graphics, parX, parY, partialTicks); - graphics.drawCenteredString(Minecraft.getInstance().font, String.valueOf(this.slotNum + 1), x + 8, y + 3, 16777215); // White - } + protected void renderWidget(GuiGraphics graphics, int pMouseX, int pMouseY, float pPartialTick) { + image = this.isSelected ? ArsNouveau.prefix( "textures/gui/spell_tab_selected.png") : ArsNouveau.prefix( "textures/gui/spell_tab.png"); + super.renderWidget(graphics, pMouseX, pMouseY, pPartialTick); + graphics.drawCenteredString(Minecraft.getInstance().font, String.valueOf(this.slotNum + 1), x + 8, y + 3, 16777215); // White } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ItemButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ItemButton.java index a35da84e58..69e64cbfeb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ItemButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ItemButton.java @@ -25,18 +25,16 @@ public ItemButton(GlyphUnlockMenu parent, int x, int y) { } @Override - public void render(GuiGraphics graphics, int parX, int parY, float partialTicks) { - if (visible) { - if (ingredient != null && ingredient.getItems().length != 0) { - ItemStack stack = ingredient.getItems()[(ClientInfo.ticksInGame / 20) % ingredient.getItems().length]; - if (GuiUtils.isMouseInRelativeRange(parX, parY, x, y, width, height)) { - Font font = Minecraft.getInstance().font; - List components = new ArrayList<>(ClientHooks.gatherTooltipComponents(ItemStack.EMPTY, Screen.getTooltipFromItem(Minecraft.getInstance(), stack), parX, width, height, font)); - parent.renderTooltipInternal(graphics, components, parX, parY); - } - RenderUtils.drawItemAsIcon(stack, graphics, x + 3, y + 2, 16, false); + protected void renderWidget(GuiGraphics graphics, int pMouseX, int pMouseY, float pPartialTick) { + if (ingredient != null && ingredient.getItems().length != 0) { + ItemStack stack = ingredient.getItems()[(ClientInfo.ticksInGame / 20) % ingredient.getItems().length]; + if (GuiUtils.isMouseInRelativeRange(pMouseX, pMouseY, x, y, width, height)) { + Font font = Minecraft.getInstance().font; + List components = new ArrayList<>(ClientHooks.gatherTooltipComponents(ItemStack.EMPTY, Screen.getTooltipFromItem(Minecraft.getInstance(), stack), pMouseX, width, height, font)); + parent.renderTooltipInternal(graphics, components, pMouseX, pMouseY); } + RenderUtils.drawItemAsIcon(stack, graphics, x + 3, y + 2, 16, false); } - super.render(graphics, parX, parY, partialTicks); + super.renderWidget(graphics, pMouseX, pMouseY, pPartialTick); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/SelectableButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/SelectableButton.java index 90ce1990d1..54ebed3741 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/SelectableButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/SelectableButton.java @@ -14,9 +14,8 @@ public SelectableButton(int x, int y, int u, int v, int w, int h, int image_widt } @Override - public void render(GuiGraphics graphics, int parX, int parY, float partialTicks) { + protected void renderWidget(GuiGraphics graphics, int pMouseX, int pMouseY, float pPartialTick) { this.image = isSelected ? secondImage : image; - super.render(graphics, parX, parY, partialTicks); + super.renderWidget(graphics, pMouseX, pMouseY, pPartialTick); } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java index 648a776c94..c5e1c50639 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; +import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -34,13 +35,11 @@ public UnlockGlyphButton(int x, int y, boolean isCraftingSlot, AbstractSpellPart } @Override - public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - if (visible) { - if (this.spellPart != null) { - RenderUtil.drawSpellPart(this.spellPart, graphics, x, y, width, !playerKnows, 0); - if (selected) - graphics.blit(ArsNouveau.prefix( "textures/gui/glyph_selected.png"), x, y, 0, 0, 16, 16, 16, 16); - } + protected void renderWidget(GuiGraphics pGuiGraphics, int pMouseX, int pMouseY, float pPartialTick) { + if (this.spellPart != null) { + RenderUtils.drawSpellPart(this.spellPart, pGuiGraphics, x, y, width, !playerKnows, 0); + if (selected) + pGuiGraphics.blit(ArsNouveau.prefix( "textures/gui/glyph_selected.png"), x, y, 0, 0, 16, 16, 16, 16); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java index 94b0bc8e9b..97c407bae8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java @@ -84,7 +84,8 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTi super.render(graphics, mouseX, mouseY, partialTicks); PoseStack ms = graphics.pose(); float openAnimation = closing ? 1.0f - totalTime / OPEN_ANIMATION_LENGTH : totalTime / OPEN_ANIMATION_LENGTH; - float currTick = minecraft.getFrameTime(); + //todo: is getFrameTimeNs() the right method to use here? + float currTick = minecraft.getFrameTimeNs(); totalTime += (currTick + extraTick - prevTick)/20f; extraTick = 0; prevTick = currTick; @@ -114,9 +115,7 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTi RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - Tesselator tessellator = Tesselator.getInstance(); - BufferBuilder buffer = tessellator.getBuilder(); - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + BufferBuilder tessellator = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); boolean hasMouseOver = false; int mousedOverSlot = -1; @@ -137,14 +136,14 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTi float sliceBorderLeft = (((i - 0.5f) / (float) numberOfSlices) + 0.25f) * 360; float sliceBorderRight = (((i + 0.5f) / (float) numberOfSlices) + 0.25f) * 360; if (selectedItem == i) { - drawSlice(buffer, centerOfScreenX, centerOfScreenY, 10, radiusIn, radiusOut, sliceBorderLeft, sliceBorderRight, 63, 161, 191, 60); + drawSlice(tessellator, centerOfScreenX, centerOfScreenY, 10, radiusIn, radiusOut, sliceBorderLeft, sliceBorderRight, 63, 161, 191, 60); hasMouseOver = true; mousedOverSlot = selectedItem; } else - drawSlice(buffer, centerOfScreenX, centerOfScreenY, 10, radiusIn, radiusOut, sliceBorderLeft, sliceBorderRight, 0, 0, 0, 64); + drawSlice(tessellator, centerOfScreenX, centerOfScreenY, 10, radiusIn, radiusOut, sliceBorderLeft, sliceBorderRight, 0, 0, 0, 64); } - tessellator.end(); + BufferUploader.drawWithShader(tessellator.buildOrThrow()); RenderSystem.disableBlend(); if (hasMouseOver && mousedOverSlot != -1) { int adjusted = ((mousedOverSlot + (numberOfSlices / 2 + 1)) % numberOfSlices) - 1; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index 8d9fff7b38..6dd256d019 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -158,7 +158,7 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerEntityRenderer(ModEntities.LILY.get(), LilyRenderer::new); } - public static LayeredDraw.Layer cameraOverlay = new LayeredDraw.Layer(ArsNouveau.prefix( "scry_camera"), (gui, pose, partialTick, width, height) -> { + public static LayeredDraw.Layer cameraOverlay = new LayeredDraw.Layer(ArsNouveau.prefix( "scry_camera"), (gui, pose) -> { Minecraft mc = Minecraft.getInstance(); Level level = mc.level; BlockPos pos = mc.cameraEntity.blockPosition(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ImbuementBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ImbuementBlock.java index e0c48cead3..9cc3c301db 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ImbuementBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ImbuementBlock.java @@ -15,6 +15,7 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.entity.BlockEntity; @@ -50,8 +51,8 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level if (tile.stack.isEmpty() && !player.getItemInHand(handIn).isEmpty()) { tile.stack = player.getItemInHand(handIn).copy(); - ImbuementRecipe recipe = worldIn.getRecipeManager().getAllRecipesFor(RecipeRegistry.IMBUEMENT_TYPE.get()).stream() - .filter(f -> f.matches(tile, worldIn)).findFirst().orElse(null); + RecipeHolder recipe = worldIn.getRecipeManager().getAllRecipesFor(RecipeRegistry.IMBUEMENT_TYPE.get()).stream() + .filter(f -> f.value().matches(tile, worldIn)).findFirst().orElse(null); if (recipe == null) { List colorPos = new ArrayList<>(); for(BlockPos pedPos : tile.getNearbyPedestals()){ @@ -64,7 +65,7 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level tile.stack = ItemStack.EMPTY; } else { tile.stack = player.getInventory().removeItem(player.getInventory().selected, 1); - PortUtil.sendMessageNoSpam(player, Component.translatable("ars_nouveau.imbuement.crafting_started", recipe.output.getHoverName())); + PortUtil.sendMessageNoSpam(player, Component.translatable("ars_nouveau.imbuement.crafting_started", recipe.value().output.getHoverName())); tile.updateBlock(); } } else { @@ -73,8 +74,8 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level worldIn.addFreshEntity(item); tile.stack = ItemStack.EMPTY; tile.stack = player.getInventory().getSelected().copy(); - ImbuementRecipe recipe = worldIn.getRecipeManager().getAllRecipesFor(RecipeRegistry.IMBUEMENT_TYPE.get()).stream() - .filter(f -> f.matches(tile, worldIn)).findFirst().orElse(null); + var recipe = worldIn.getRecipeManager().getAllRecipesFor(RecipeRegistry.IMBUEMENT_TYPE.get()).stream() + .filter(f -> f.value().matches(tile, worldIn)).findFirst().orElse(null); if (recipe != null) { tile.stack = player.getInventory().removeItem(player.getInventory().selected, 1); } else { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java index 1f7fed2ef3..68444bee5c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java @@ -10,7 +10,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; @@ -18,7 +17,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.alchemy.Potion; -import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; @@ -41,7 +40,6 @@ import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; import java.util.List; import java.util.stream.Stream; @@ -80,7 +78,7 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level return super.useItemOn(stack, state, worldIn, pos, player, handIn, hit); Potion potion = PotionUtils.getPotion(stack); - if (stack.getItem() == Items.POTION && potion != Potions.EMPTY) { + if (stack.getItem() == Items.POTION && potion != PotionContents.EMPTY) { if (tile.canAccept(new PotionData(stack),100)) { tile.add(new PotionData(stack), 100); if (!player.isCreative()) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java index 26a3554b94..1a538d8cb2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenuSlot; +import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.common.block.tile.ArcanePedestalTile; import com.hollingsworth.arsnouveau.common.block.tile.ScryersOculusTile; import com.hollingsworth.arsnouveau.common.items.ScryerScroll; @@ -78,7 +79,7 @@ public void openMenu(Level pLevel, BlockPos pPos, Player pPlayer) { return; } Networking.sendToServer(new PacketMountCamera(data.pos)); - }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtil.drawItemAsIcon(slotData.getDefaultInstance(), posestack, positionx, posy, size, transparent), 3))); + }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtils.drawItemAsIcon(slotData.getDefaultInstance(), posestack, positionx, posy, size, transparent), 3))); } @Nullable diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java index 598838980d..030ec2dd19 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java @@ -71,9 +71,9 @@ public boolean isRandomlyTicking(BlockState state) { public void randomTick(BlockState state, ServerLevel worldIn, BlockPos pos, RandomSource random) { super.randomTick(state, worldIn, pos, random); int i = state.getValue(AGE); - if (i < 3 && worldIn.getRawBrightness(pos.above(), 0) >= 9 && net.neoforged.neoforge.common.CommonHooks.onCropsGrowPre(worldIn, pos, state, random.nextInt(5) == 0)) { + if (i < 3 && worldIn.getRawBrightness(pos.above(), 0) >= 9 && net.neoforged.neoforge.common.CommonHooks.canCropGrow(worldIn, pos, state, random.nextInt(5) == 0)) { worldIn.setBlock(pos, state.setValue(AGE, i + 1), 2); - net.neoforged.neoforge.common.CommonHooks.onCropsGrowPost(worldIn, pos, state); + net.neoforged.neoforge.common.CommonHooks.fireCropGrowPost(worldIn, pos, state); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceJar.java index 0a82e4c560..01406e5a9a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceJar.java @@ -8,6 +8,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.BlockPlaceContext; @@ -122,8 +123,8 @@ public int getAnalogOutputSignal(BlockState blockState, Level worldIn, BlockPos } @Override - public void appendHoverText(ItemStack stack, @Nullable BlockGetter worldIn, List tooltip, TooltipFlag flagIn) { - super.appendHoverText(stack, worldIn, tooltip, flagIn); + public void appendHoverText(ItemStack stack, @Nullable Item.TooltipContext context, List tooltip, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip, flagIn); if (stack.getTag() == null) return; int mana = stack.getTag().getCompound("BlockEntityTag").getInt("source"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/StrippableLog.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/StrippableLog.java index e3f9a0d619..e85b58c1fc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/StrippableLog.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/StrippableLog.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.common.block; -import com.hollingsworth.arsnouveau.common.util.registry.BlockRegistryWrapper; +import com.hollingsworth.arsnouveau.setup.registry.BlockRegistryWrapper; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.RotatedPillarBlock; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java index c90fa11ae8..9c79cfdda9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java @@ -5,7 +5,6 @@ import com.hollingsworth.arsnouveau.api.spell.ISpellCasterProvider; import com.hollingsworth.arsnouveau.api.spell.TurretSpellCaster; import com.hollingsworth.arsnouveau.common.block.ITickable; -import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; @@ -15,11 +14,7 @@ import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MagelightTorchTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MagelightTorchTile.java index b7adc975f3..11a0009be7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MagelightTorchTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MagelightTorchTile.java @@ -94,11 +94,11 @@ public boolean isHorizontalFire() { @Override public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); - compound.putBoolean("horizontalFire", horizontalFire); + tag.putBoolean("horizontalFire", horizontalFire); } @Override - protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + public void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.loadAdditional(compound, pRegistries); horizontalFire = compound.getBoolean("horizontalFire"); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ModdedTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ModdedTile.java index b5eb8c31ce..3cbe59ae46 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ModdedTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ModdedTile.java @@ -1,7 +1,6 @@ package com.hollingsworth.arsnouveau.common.block.tile; -import com.hollingsworth.arsnouveau.common.util.registry.BlockEntityTypeRegistryWrapper; -import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; +import com.hollingsworth.arsnouveau.setup.registry.BlockEntityTypeRegistryWrapper; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java index 65fff9a533..42e2b31119 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java @@ -7,16 +7,13 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.PotionContents; -import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; - -import net.neoforged.neoforge.registries.NeoForgeRegistries; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -129,7 +126,7 @@ public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { // Include a sorted list of potion names so quests can check the jar's contents Set potionSet = this.data.getIncludedPotions(); - List potionNames = new ArrayList<>(potionSet.stream().map(potion -> NeoForgeRegistries.POTIONS.getKey(potion).toString()).toList()); + List potionNames = new ArrayList<>(potionSet.stream().map(potion -> BuiltInRegistries.POTION.getKey(potion).toString()).toList()); potionNames.sort(String::compareTo); tag.putString("potionNames", String.join(",", potionNames)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java index c62eeb2b4b..0be2831a52 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java @@ -5,13 +5,12 @@ import com.hollingsworth.arsnouveau.api.source.AbstractSourceMachine; import com.hollingsworth.arsnouveau.api.util.BlockUtil; import com.hollingsworth.arsnouveau.api.util.NBTUtil; +import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; -import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.items.DominionWand; import com.hollingsworth.arsnouveau.common.util.PortUtil; -import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; @@ -21,14 +20,10 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SconceTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SconceTile.java index a4de48b7ce..8696e982f5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SconceTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SconceTile.java @@ -42,7 +42,7 @@ public SconceTile(BlockEntityType type, BlockPos pos, BlockState state) { @Override public void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { - super.loadAdditional(pTag, bpRegistries); + super.loadAdditional(pTag, pRegistries); this.color = ParticleColorRegistry.from(pTag.getCompound("color")); lit = pTag.getBoolean("lit"); } @@ -50,8 +50,8 @@ public void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) @Override public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); - compound.put("color", color.serialize()); - compound.putBoolean("lit", lit); + tag.put("color", color.serialize()); + tag.putBoolean("lit", lit); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java index 87d5be761e..beeaece0c9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java @@ -4,7 +4,6 @@ import com.hollingsworth.arsnouveau.api.source.AbstractSourceMachine; import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.block.SourceJar; -import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java index 1fc6412d5b..5529fcc10a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java @@ -7,7 +7,6 @@ import com.hollingsworth.arsnouveau.api.util.SourceUtil; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.block.ITickable; -import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; @@ -15,14 +14,10 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.bus.api.Event; -import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java index 454a643596..57320aca3c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java @@ -37,7 +37,7 @@ public static void onClientTick(ClientTickEvent event) { Options options = Minecraft.getInstance().options; //up/down/left/right handling is split to prevent players who are viewing a camera from moving around in a boat or on a horse - if (event.phase == TickEvent.Phase.START) { + if (event instanceof ClientTickEvent.Pre) { if (wasUpPressed = options.keyUp.isDown()) options.keyUp.setDown(false); @@ -54,7 +54,7 @@ public static void onClientTick(ClientTickEvent event) { dismount(); options.keyShift.setDown(false); } - } else if (event.phase == TickEvent.Phase.END) { + } else if (event instanceof ClientTickEvent.Post) { if (wasUpPressed) { moveViewUp(cam); options.keyUp.setDown(true); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/IDyeable.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/IDyeable.java index ba02643387..5559405a2a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/IDyeable.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/IDyeable.java @@ -1,12 +1,14 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; +import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.DyedItemColor; public interface IDyeable { default void onDye(ItemStack stack, DyeColor dyeColor){ - stack.getOrCreateTag().putInt("color", dyeColor.getId()); + stack.set(DataComponents.DYED_COLOR, new DyedItemColor(dyeColor.getTextureDiffuseColor(), false)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java index f522cffe69..533b9372e9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java @@ -10,11 +10,7 @@ import com.hollingsworth.arsnouveau.common.block.ScribesBlock; import com.hollingsworth.arsnouveau.common.block.ThreePartBlock; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; -import com.hollingsworth.arsnouveau.common.util.registry.BlockRegistryWrapper; -import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; -import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; -import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; -import com.hollingsworth.arsnouveau.setup.registry.ModEntities; +import com.hollingsworth.arsnouveau.setup.registry.*; import net.minecraft.advancements.critereon.StatePropertiesPredicate; import net.minecraft.core.HolderLookup; import net.minecraft.core.WritableRegistry; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java index fd581ff1a9..1ade00732b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java @@ -11,7 +11,7 @@ import com.hollingsworth.arsnouveau.common.items.PerkItem; import com.hollingsworth.arsnouveau.common.items.RitualTablet; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; -import com.hollingsworth.arsnouveau.common.util.registry.ItemRegistryWrapper; +import com.hollingsworth.arsnouveau.setup.registry.ItemRegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java index 6934f29c0e..79870baea8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java @@ -56,7 +56,7 @@ public class FamiliarEntity extends PathfinderMob implements GeoEntity, IFamilia public boolean terminatedFamiliar; public ResourceLocation holderID; - public PersistentFamiliarData persistentData = new PersistentFamiliarData<>(new CompoundTag()); + public PersistentFamiliarData persistentData = new PersistentFamiliarData(); public FamiliarEntity(EntityType p_i48575_1_, Level p_i48575_2_) { super(p_i48575_1_, p_i48575_2_); @@ -229,7 +229,7 @@ public void addAdditionalSaveData(CompoundTag tag) { if (getOwnerID() != null) tag.putUUID("ownerID", getOwnerID()); tag.putBoolean("terminated", terminatedFamiliar); - tag.put("familiarData", getPersistentFamiliarData().toTag(this, new CompoundTag())); + tag.put("familiarData", getPersistentFamiliarData().toTag(level)); if(holderID != null) { tag.putString("holderID", holderID.toString()); } @@ -294,7 +294,7 @@ public void setTagData(@Nullable CompoundTag tag) { public void syncTag() { IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(getOwner()).orElse(null); if (cap != null && persistentData != null) { - cap.getFamiliarData(getHolderID()).entityTag.put("familiarData", persistentData.toTag(this, new CompoundTag())); + cap.getFamiliarData(getHolderID()).entityTag.put("familiarData", persistentData.toTag(level)); } } @@ -302,7 +302,7 @@ public void syncTag() { * Override and return your own implementation of PersistentData. See FamiliarStarbuncle for an example. */ public PersistentFamiliarData deserializePersistentData(CompoundTag tag) { - return new PersistentFamiliarData<>(tag); + return PersistentFamiliarData.fromTag(tag); } public PersistentFamiliarData getPersistentFamiliarData() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java index 8a9f062823..8b8a0f6004 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenuSlot; +import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.client.registry.ModKeyBindings; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketConsumePotion; @@ -58,7 +59,7 @@ public void onRadialKeyPressed(ItemStack stack, Player player) { } Minecraft.getInstance().setScreen(new GuiRadialMenu<>(new RadialMenu<>((int index) -> { Networking.sendToServer(new PacketConsumePotion(slots.get(index).primarySlotIcon().slot)); - }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtil.drawItemAsIcon(slotData.stack, posestack, positionx, posy, size, transparent), 3))); + }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtils.drawItemAsIcon(slotData.stack, posestack, positionx, posy, size, transparent), 3))); } public record SlotData(int slot, ItemStack stack){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ExperienceGem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ExperienceGem.java index 185a31bcfd..0314e8267e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ExperienceGem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ExperienceGem.java @@ -2,15 +2,13 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantedItemInUse; +import net.minecraft.world.item.enchantment.EnchantmentEffectComponents; import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; -import java.util.Map; - public abstract class ExperienceGem extends ModItem { public ExperienceGem(Properties properties) { @@ -43,9 +41,9 @@ public InteractionResultHolder use(Level world, Player playerEntity, } public int repairPlayerItems(Player p_147093_, int remainingExp, int initialValue) { - Map.Entry entry = EnchantmentHelper.getRandomItemWith(Enchantments.MENDING, p_147093_, ItemStack::isDamaged); + EnchantedItemInUse entry = EnchantmentHelper.getRandomItemWith(EnchantmentEffectComponents.REPAIR_WITH_XP, p_147093_, ItemStack::isDamaged).orElse(null); if (entry != null) { - ItemStack itemstack = entry.getValue(); + ItemStack itemstack = entry.itemStack(); int i = Math.min((int) (initialValue * itemstack.getXpRepairRatio()), itemstack.getDamageValue()); itemstack.setDamageValue(itemstack.getDamageValue() - i); int j = remainingExp - this.durabilityToXp(i); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java index 577e1972bb..ff90980712 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java @@ -15,7 +15,6 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; -import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; @@ -53,7 +52,7 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level pLevel, List pTooltip, TooltipFlag pFlag) { + public void appendHoverText(ItemStack stack, TooltipContext pLevel, List pTooltip, TooltipFlag pFlag) { super.appendHoverText(stack, pLevel, pTooltip, pFlag); if(pLevel == null) return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/RendererBlockItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/RendererBlockItem.java index 2b9a81d20d..aa87fd029d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/RendererBlockItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/RendererBlockItem.java @@ -1,11 +1,9 @@ package com.hollingsworth.arsnouveau.common.items; -import com.hollingsworth.arsnouveau.common.util.registry.BlockRegistryWrapper; -import com.hollingsworth.arsnouveau.common.util.registry.RegistryWrapper; +import com.hollingsworth.arsnouveau.setup.registry.BlockRegistryWrapper; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.world.level.block.Block; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; -import software.bernie.geckolib.animation.AnimatableManager; import java.util.function.Consumer; import java.util.function.Supplier; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java index 16ee6b4717..a46cbc54cc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java @@ -67,16 +67,12 @@ public SpellBook(Properties properties, SpellTier tier) { this.tier = tier; } - @Override - public boolean canBeDepleted() { - return false; - } - @Override public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); if (this != ItemsRegistry.CREATIVE_SPELLBOOK.get()) { - CapabilityRegistry.getMana(playerIn).ifPresent(iMana -> { + var iMana = CapabilityRegistry.getMana(playerIn).orElse(null); + if(iMana != null){ if (iMana.getBookTier() < this.tier.value) { iMana.setBookTier(this.tier.value); } @@ -84,17 +80,15 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In if (iMana.getGlyphBonus() < cap.getKnownGlyphs().size()) { iMana.setGlyphBonus(cap.getKnownGlyphs().size()); } - }); + } } ISpellCaster caster = getSpellCaster(stack); - return caster.castSpell(worldIn, (LivingEntity) playerIn, handIn, Component.translatable("ars_nouveau.invalid_spell")); + return caster.castSpell(worldIn, playerIn, handIn, Component.translatable("ars_nouveau.invalid_spell")); } - /** - * How long it takes to use or consume an item - */ - public int getUseDuration(ItemStack stack) { + @Override + public int getUseDuration(ItemStack pStack, LivingEntity p_344979_) { return 72000; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/structure/StructureTemplateMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/structure/StructureTemplateMixin.java index b9a100f001..366436c804 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/structure/StructureTemplateMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/structure/StructureTemplateMixin.java @@ -4,6 +4,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.LiquidSettings; import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import org.spongepowered.asm.mixin.Mixin; @@ -25,7 +26,7 @@ private void ars_nouveau_preventAutoWaterlogging(ServerLevelAccessor serverLevel if(structurePlaceSettings.getProcessors().stream().anyMatch(processor -> ((StructureProcessorAccessor)processor).callGetType() == StructureRegistry.WATERLOGGING_FIX_PROCESSOR.get())) { - structurePlaceSettings.setKeepLiquids(false); + structurePlaceSettings.setLiquidSettings(LiquidSettings.IGNORE_WATERLOGGING); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PotionSyncPacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PotionSyncPacket.java index f8c4355117..dd60f6e0ae 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PotionSyncPacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PotionSyncPacket.java @@ -2,6 +2,8 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.client.Minecraft; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; @@ -44,7 +46,7 @@ public PotionSyncPacket(RegistryFriendlyByteBuf RegistryFriendlyByteBuf) { @Override public void onClientReceived(Minecraft mc, Player player) { if (mc.level.getEntity(this.entity) instanceof LivingEntity living && living != ArsNouveau.proxy.getPlayer()) { - MobEffect effect = ForgeRegistries.MOB_EFFECTS.getValue(this.effect); + Holder effect = BuiltInRegistries.MOB_EFFECT.getHolder(this.effect).orElse(null); if (effect == null) return; if (duration > 0) { living.addEffect(new MobEffectInstance(effect, duration, 0, false, false, false)); @@ -55,7 +57,7 @@ public void onClientReceived(Minecraft mc, Player player) { } public static ResourceLocation getRegistryName(MobEffect effect) { - return ForgeRegistries.MOB_EFFECTS.getKey(effect); + return BuiltInRegistries.MOB_EFFECT.getKey(effect); } public static final Type TYPE = new Type<>(ArsNouveau.prefix("potion_sync")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/FreezingEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/FreezingEffect.java index 23dfdb9fd2..5d382f835b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/FreezingEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/FreezingEffect.java @@ -12,12 +12,8 @@ public FreezingEffect() { } @Override - public void applyEffectTick(LivingEntity pLivingEntity, int pAmplifier) { + public boolean applyEffectTick(LivingEntity pLivingEntity, int pAmplifier) { pLivingEntity.setTicksFrozen(Math.min(pLivingEntity.getTicksRequiredToFreeze() + 3, pLivingEntity.getTicksFrozen() + 3 + pAmplifier)); - } - - @Override - public boolean isDurationEffectTick(int pDuration, int pAmplifier) { return true; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java index 75b9ddc44c..6c9d16ff01 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java @@ -10,7 +10,6 @@ import net.minecraft.world.level.Level; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; - import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; import net.neoforged.neoforge.event.tick.PlayerTickEvent; @@ -22,12 +21,7 @@ public GravityEffect() { } @Override - public boolean isDurationEffectTick(int p_76397_1_, int p_76397_2_) { - return true; - } - - @Override - public void applyEffectTick(LivingEntity livingEntity, int p_76394_2_) { + public boolean applyEffectTick(LivingEntity livingEntity, int p_76394_2_) { if (!livingEntity.onGround()) { boolean isTooHigh = true; Level world = livingEntity.level; @@ -46,6 +40,7 @@ public void applyEffectTick(LivingEntity livingEntity, int p_76394_2_) { } + return true; } // Disable flight here because items tick after our potions diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/MagicFindEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/MagicFindEffect.java index 9233792ea2..4f84e624e5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/MagicFindEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/MagicFindEffect.java @@ -18,19 +18,15 @@ public MagicFindEffect() { } @Override - public void applyEffectTick(LivingEntity pLivingEntity, int pAmplifier) { + public boolean applyEffectTick(LivingEntity pLivingEntity, int pAmplifier) { Level level = pLivingEntity.level; if (level.isClientSide || level.getGameTime() % 60 != 0) - return; + return false; for (Entity e : level.getEntities(pLivingEntity, new AABB(pLivingEntity.blockPosition()).inflate(75))) { if (e instanceof LivingEntity living && living.getType().is(EntityTags.MAGIC_FIND)) { living.addEffect(new MobEffectInstance(MobEffects.GLOWING, 60 * 20)); } } - } - - @Override - public boolean isDurationEffectTick(int pDuration, int pAmplifier) { return true; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/ShockedEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/ShockedEffect.java index 883ed5dc40..5f28e2ea20 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/ShockedEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/ShockedEffect.java @@ -15,15 +15,15 @@ public ShockedEffect() { super(MobEffectCategory.HARMFUL, 2039587); } - @Override - public boolean isDurationEffectTick(int duration, int amp) { - int j = 25 >> amp; - if (j > 0) { - return duration % j == 0; - } else { - return true; - } - } +// @Override +// public boolean isDurationEffectTick(int duration, int amp) { +// int j = 25 >> amp; +// if (j > 0) { +// return duration % j == 0; +// } else { +// return true; +// } +// } @Override public boolean applyEffectTick(LivingEntity entity, int amp) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/SnareEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/SnareEffect.java index 2b1f39b4fb..9a6e0447b2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/SnareEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/SnareEffect.java @@ -1,15 +1,17 @@ package com.hollingsworth.arsnouveau.common.potions; +import com.hollingsworth.arsnouveau.ArsNouveau; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectCategory; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; public class SnareEffect extends MobEffect { - + public static final ResourceLocation SNARE_ATTR = ArsNouveau.prefix("snare_modifier"); public SnareEffect() { super(MobEffectCategory.HARMFUL, 2039587); - addAttributeModifier(Attributes.MOVEMENT_SPEED, "0dee8a21-f182-42c8-8361-1ad6186cac30", -1, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL); + addAttributeModifier(Attributes.MOVEMENT_SPEED, SNARE_ATTR, -1, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java index ec553e76dd..c25476b4c9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java @@ -37,7 +37,7 @@ public static void registers(IEventBus modEventBus) { ModEntities.ENTITIES.register(modEventBus); ModPotions.EFFECTS.register(modEventBus); ModPotions.POTIONS.register(modEventBus); - EnchantmentRegistry.ENCHANTMENTS.register(modEventBus); + DataComponentRegistry.DATA.register(modEventBus); RecipeRegistry.RECIPE_SERIALIZERS.register(modEventBus); RecipeRegistry.RECIPE_TYPES.register(modEventBus); ModParticles.PARTICLES.register(modEventBus); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/BlockEntityTypeRegistryWrapper.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockEntityTypeRegistryWrapper.java similarity index 88% rename from src/main/java/com/hollingsworth/arsnouveau/common/util/registry/BlockEntityTypeRegistryWrapper.java rename to src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockEntityTypeRegistryWrapper.java index 967ff1cbd2..0f21ae67ca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/BlockEntityTypeRegistryWrapper.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockEntityTypeRegistryWrapper.java @@ -1,4 +1,4 @@ -package com.hollingsworth.arsnouveau.common.util.registry; +package com.hollingsworth.arsnouveau.setup.registry; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java index c16f404a5c..b6595f937e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java @@ -9,8 +9,6 @@ import com.hollingsworth.arsnouveau.common.items.ModBlockItem; import com.hollingsworth.arsnouveau.common.items.RendererBlockItem; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; -import com.hollingsworth.arsnouveau.common.util.registry.BlockEntityTypeRegistryWrapper; -import com.hollingsworth.arsnouveau.common.util.registry.BlockRegistryWrapper; import com.hollingsworth.arsnouveau.common.world.tree.MagicTree; import com.hollingsworth.arsnouveau.common.world.tree.SupplierBlockStateProvider; import net.minecraft.ChatFormatting; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/BlockRegistryWrapper.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistryWrapper.java similarity index 83% rename from src/main/java/com/hollingsworth/arsnouveau/common/util/registry/BlockRegistryWrapper.java rename to src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistryWrapper.java index 1db981666a..132c0ec9da 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/BlockRegistryWrapper.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistryWrapper.java @@ -1,4 +1,4 @@ -package com.hollingsworth.arsnouveau.common.util.registry; +package com.hollingsworth.arsnouveau.setup.registry; import net.minecraft.world.level.block.Block; import net.neoforged.neoforge.registries.DeferredHolder; diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java new file mode 100644 index 0000000000..b8ca205877 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java @@ -0,0 +1,16 @@ +package com.hollingsworth.arsnouveau.setup.registry; + +import com.hollingsworth.arsnouveau.api.familiar.PersistentFamiliarData; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.core.registries.BuiltInRegistries; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; + +import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; + +public class DataComponentRegistry { + + public static final DeferredRegister> DATA = DeferredRegister.create(BuiltInRegistries.DATA_COMPONENT_TYPE, MODID); + + public static final DeferredHolder, DataComponentType> PERSISTENT_FAMILIAR_DATA = DATA.register("persistent_familiar_data", () -> DataComponentType.builder().persistent(PersistentFamiliarData.CODEC.codec()).networkSynchronized(PersistentFamiliarData.STREAM_CODEC).build()); +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/EnchantmentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/EnchantmentRegistry.java index a537e2a35f..70c556c602 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/EnchantmentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/EnchantmentRegistry.java @@ -1,18 +1,12 @@ package com.hollingsworth.arsnouveau.setup.registry; import com.hollingsworth.arsnouveau.ArsNouveau; -import net.minecraft.core.component.DataComponentType; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.world.item.enchantment.Enchantment; -import net.neoforged.neoforge.registries.DeferredRegister; - -import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; public class EnchantmentRegistry { - public static final DeferredRegister> ENCHANTMENTS = DeferredRegister.create(BuiltInRegistries.ENCHANTMENT_EFFECT_COMPONENT_TYPE, MODID); public static ResourceKey MANA_REGEN_ENCHANTMENT = key("mana_regen"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/ItemRegistryWrapper.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemRegistryWrapper.java similarity index 73% rename from src/main/java/com/hollingsworth/arsnouveau/common/util/registry/ItemRegistryWrapper.java rename to src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemRegistryWrapper.java index 41469b5c6d..044b0c63ea 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/ItemRegistryWrapper.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemRegistryWrapper.java @@ -1,7 +1,6 @@ -package com.hollingsworth.arsnouveau.common.util.registry; +package com.hollingsworth.arsnouveau.setup.registry; import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; import net.neoforged.neoforge.registries.DeferredHolder; public class ItemRegistryWrapper extends RegistryWrapper { diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java index 296212902c..4bddbd9bc8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java @@ -21,7 +21,6 @@ import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentPierce; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentSplit; -import com.hollingsworth.arsnouveau.common.util.registry.ItemRegistryWrapper; import com.hollingsworth.arsnouveau.setup.config.Config; import net.minecraft.ChatFormatting; import net.minecraft.core.registries.BuiltInRegistries; @@ -212,9 +211,9 @@ public int getValue() { public static final ItemRegistryWrapper SPLASH_LAUNCHER = register(LibItemNames.SPLASH_LAUNCHER, () -> new FlaskCannon.SplashLauncher(defaultItemProperties().stacksTo(1))); public static final ItemRegistryWrapper LINGERING_LAUNCHER = register(LibItemNames.LINGERING_LAUNCHER, () -> new FlaskCannon.LingeringLauncher(defaultItemProperties().stacksTo(1))); // TODO: restore discs - public static final ItemRegistryWrapper FIREL_DISC = register(LibItemNames.FIREL_DISC, () -> new RecordItem(9, () -> SoundRegistry.ARIA_BIBLIO.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 240)); - public static final ItemRegistryWrapper SOUND_OF_GLASS = register(LibItemNames.SOUND_OF_GLASS, () -> new RecordItem(9, () -> SoundRegistry.SOUND_OF_GLASS.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 182)); - public static final ItemRegistryWrapper WILD_HUNT = register(LibItemNames.FIREL_WILD_HUNT, () -> new RecordItem(9, () -> SoundRegistry.WILD_HUNT.get(), defaultItemProperties().stacksTo(1).rarity(Rarity.RARE), 20 * 121)); + public static final ItemRegistryWrapper FIREL_DISC = register(LibItemNames.FIREL_DISC, () -> new Item(defaultItemProperties().stacksTo(1).rarity(Rarity.RARE))); + public static final ItemRegistryWrapper SOUND_OF_GLASS = register(LibItemNames.SOUND_OF_GLASS, () -> new Item(defaultItemProperties().stacksTo(1).rarity(Rarity.RARE))); + public static final ItemRegistryWrapper WILD_HUNT = register(LibItemNames.FIREL_WILD_HUNT, () -> new Item(defaultItemProperties().stacksTo(1).rarity(Rarity.RARE))); public static final ItemRegistryWrapper STARBY_GIFY = register(LibItemNames.STARBY_GIFT, () -> new Present(defaultItemProperties().rarity(Rarity.EPIC))); public static final ItemRegistryWrapper SPELL_CROSSBOW = register(LibItemNames.SPELL_CROSSBOW, () -> new SpellCrossbow(defaultItemProperties().stacksTo(1))); public static final ItemRegistryWrapper STABLE_WARP_SCROLL = register(LibItemNames.STABLE_WARP_SCROLL, () -> new StableWarpScroll(defaultItemProperties().stacksTo(1))); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/RegistryWrapper.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RegistryWrapper.java similarity index 96% rename from src/main/java/com/hollingsworth/arsnouveau/common/util/registry/RegistryWrapper.java rename to src/main/java/com/hollingsworth/arsnouveau/setup/registry/RegistryWrapper.java index d0b99261f1..c2168e9438 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/registry/RegistryWrapper.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RegistryWrapper.java @@ -1,4 +1,4 @@ -package com.hollingsworth.arsnouveau.common.util.registry; +package com.hollingsworth.arsnouveau.setup.registry; import net.minecraft.core.Holder; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index a6c74f1dfe..653550722c 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -49,13 +49,13 @@ public net.minecraft.world.entity.npc.VillagerTrades$EmeraldForItems public net.minecraft.world.entity.npc.VillagerTrades$ItemsForEmeralds public net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate palettes # palettes public net.minecraft.client.renderer.LevelRenderer renderSnowAndRain(Lnet/minecraft/client/renderer/LightTexture;FDDD)V # renderSnowAndRain -public-f net.minecraft.client.gui.screens.recipebook.RecipeBookComponent f_100285_ -public net.minecraft.client.gui.screens.recipebook.RecipeBookComponent f_100281_ -public net.minecraft.client.gui.screens.recipebook.RecipeBookComponent f_100269_ +public-f net.minecraft.client.gui.screens.recipebook.RecipeBookComponent stackedContents +public net.minecraft.client.gui.screens.recipebook.RecipeBookComponent ghostRecipe # ghostRecipe +public net.minecraft.client.gui.screens.recipebook.RecipeBookComponent searchBox # searchBox public net.minecraft.world.level.block.state.BlockBehaviour properties # properties public net.minecraft.world.level.block.state.BlockBehaviour$Properties hasCollision # hasCollision -public-f net.minecraft.recipebook.ServerPlaceRecipe f_135426_ +public-f net.minecraft.recipebook.ServerPlaceRecipe stackedContents public net.minecraft.world.entity.animal.allay.Allay spinningAnimationTicks # spinningAnimationTicks public net.minecraft.world.entity.animal.allay.Allay spinningAnimationTicks0 # spinningAnimationTicks0 public net.minecraft.world.entity.animal.allay.Allay holdingItemAnimationTicks # holdingItemAnimationTicks From 827f3b89fe02ad206e08e2ac806ff561decdb719 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Fri, 28 Jun 2024 23:16:12 -0500 Subject: [PATCH 020/363] start data components --- .../arsnouveau/api/item/NBTComponent.java | 4 + .../client/gui/GuiEntityInfoHUD.java | 4 +- .../common/block/tile/ItemDetectorTile.java | 3 +- .../common/crafting/recipes/GlyphRecipe.java | 6 +- .../common/entity/EntityBookwyrm.java | 27 ++-- .../arsnouveau/common/entity/Starbuncle.java | 73 ++-------- .../arsnouveau/common/entity/Whirlisprig.java | 4 +- .../entity/familiar/FamiliarEntity.java | 2 +- .../arsnouveau/common/items/ItemScroll.java | 95 +------------ .../common/items/StarbuncleShard.java | 4 +- .../arsnouveau/common/items/VoidJar.java | 83 +++-------- .../common/items/data/ItemScrollData.java | 99 +++++++++++++ .../items/data}/PersistentFamiliarData.java | 38 ++++- .../items/data/StarbuncleCharmData.java | 131 ++++++++++++++++++ .../common/items/data/VoidJarData.java | 48 +++++++ .../items/itemscrolls/AllowItemScroll.java | 4 +- .../items/itemscrolls/DenyItemScroll.java | 4 +- .../items/summon_charms/BookwyrmCharm.java | 18 --- .../items/summon_charms/StarbuncleCharm.java | 41 +----- .../setup/registry/DataComponentRegistry.java | 11 +- 20 files changed, 399 insertions(+), 300 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java rename src/main/java/com/hollingsworth/arsnouveau/{api/familiar => common/items/data}/PersistentFamiliarData.java (62%) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/VoidJarData.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/NBTComponent.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/NBTComponent.java index 328512e87f..1943e316bf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/NBTComponent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/NBTComponent.java @@ -13,4 +13,8 @@ public interface NBTComponent { default Tag toTag(Level level){ return getCodec().encode((T) this, level.registryAccess().createSerializationContext(NbtOps.INSTANCE), new CompoundTag()).getOrThrow(); } + + static T fromTag(Codec codec, Tag tag){ + return codec.parse(NbtOps.INSTANCE, tag).getOrThrow(); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java index ddea176278..a57732147a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.client.gui; import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; -import com.hollingsworth.arsnouveau.common.items.ItemScroll; +import com.hollingsworth.arsnouveau.common.items.data.ItemScrollData; import com.hollingsworth.arsnouveau.setup.config.Config; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.ByteBufferBuilder; @@ -58,7 +58,7 @@ public static void renderOverlay(GuiGraphics graphics, DeltaTracker tracker) { iTooltipProvider.getTooltip(tooltip); } if (result.getEntity() instanceof ItemFrame frame) { - ItemScroll.ItemScrollData data = new ItemScroll.ItemScrollData(frame.getItem()); + ItemScrollData.ItemScrollData data = new ItemScrollData.ItemScrollData(frame.getItem()); for(ItemStack i : data.getItems()){ tooltip.add(i.getHoverName()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java index 5f91747f11..35d9e30993 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java @@ -7,6 +7,7 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.items.ItemScroll; +import com.hollingsworth.arsnouveau.common.items.data.ItemScrollData; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.ChatFormatting; @@ -180,7 +181,7 @@ protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistrie public void getTooltip(List tooltip) { tooltip.add(Component.translatable("ars_nouveau.item_detector.count", (inverted ? "< " : "> ") + neededCount)); if(filterStack.getItem() instanceof ItemScroll && filterStack.hasTag()){ - ItemScroll.ItemScrollData scrollData = new ItemScroll.ItemScrollData(filterStack); + ItemScrollData.ItemScrollData scrollData = new ItemScrollData.ItemScrollData(filterStack); for (ItemStack s : scrollData.getItems()) { tooltip.add(Component.literal(s.getHoverName().getString()).withStyle(ChatFormatting.GOLD)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java index 95819801f8..afe4ad4964 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java @@ -165,6 +165,10 @@ public static GlyphRecipe fromNetwork(RegistryFriendlyByteBuf buffer) { Codec.INT.fieldOf("exp").forGetter(GlyphRecipe::getExp) ).apply(instance, GlyphRecipe::new)); + public static final StreamCodec STREAM_CODEC = StreamCodec.of( + GlyphRecipe.Serializer::toNetwork, GlyphRecipe.Serializer::fromNetwork + ); + @Override public MapCodec codec() { return CODEC; @@ -172,7 +176,7 @@ public MapCodec codec() { @Override public StreamCodec streamCodec() { - return null; + return STREAM_CODEC; } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java index 30af0393a4..a1c9873b88 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java @@ -5,7 +5,6 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.api.client.IVariantColorProvider; import com.hollingsworth.arsnouveau.api.entity.IDispellable; -import com.hollingsworth.arsnouveau.api.familiar.PersistentFamiliarData; import com.hollingsworth.arsnouveau.api.item.IWandable; import com.hollingsworth.arsnouveau.api.util.BlockUtil; import com.hollingsworth.arsnouveau.api.util.SummonUtil; @@ -14,10 +13,13 @@ import com.hollingsworth.arsnouveau.common.entity.goal.bookwyrm.RandomStorageVisitGoal; import com.hollingsworth.arsnouveau.common.entity.goal.bookwyrm.TransferGoal; import com.hollingsworth.arsnouveau.common.entity.goal.bookwyrm.TransferTask; +import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; @@ -48,8 +50,8 @@ import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -218,19 +220,17 @@ public EntityType getType() { public ItemStack toCharm(){ ItemStack stack = new ItemStack(ItemsRegistry.BOOKWYRM_CHARM.get()); - PersistentFamiliarData data = new PersistentFamiliarData<>(new CompoundTag()); - data.color = getColor(this); - data.name = getCustomName(); - stack.setTag(data.toTag(this, new CompoundTag())); + PersistentFamiliarData data = new PersistentFamiliarData(getName(), getColor(this), getHeldStack()); + stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, data); return stack; } public void readCharm(ItemStack stack){ - if(stack.hasTag()) { - PersistentFamiliarData data = new PersistentFamiliarData<>(stack.getOrCreateTag()); - setColor(data.color, this); - setCustomName(data.name); - } + PersistentFamiliarData data = stack.get(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA); + if(data == null) + return; + setColor(data.color, this); + setCustomName(data.name); } @Override @@ -241,8 +241,7 @@ public void addAdditionalSaveData(CompoundTag tag) { } if (!getHeldStack().isEmpty()) { - CompoundTag itemTag = new CompoundTag(); - getHeldStack().save(itemTag); + Tag itemTag = getHeldStack().save(registryAccess()); tag.put("held", itemTag); } tag.putInt("backoff", backoffTicks); @@ -256,7 +255,7 @@ public void readAdditionalSaveData(CompoundTag tag) { lecternPos = BlockPos.of(tag.getLong("lectern")); } if (tag.contains("held")) - setHeldStack(ItemStack.of((CompoundTag) tag.get("held"))); + setHeldStack(ItemStack.parseOptional(registryAccess(), (CompoundTag) tag.get("held"))); this.backoffTicks = tag.getInt("backoff"); if (tag.contains("color")) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 3ffa8b73cd..042b51d3f3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -6,11 +6,10 @@ import com.hollingsworth.arsnouveau.api.entity.ChangeableBehavior; import com.hollingsworth.arsnouveau.api.entity.IDecoratable; import com.hollingsworth.arsnouveau.api.entity.IDispellable; -import com.hollingsworth.arsnouveau.api.familiar.PersistentFamiliarData; import com.hollingsworth.arsnouveau.api.item.IWandable; +import com.hollingsworth.arsnouveau.api.item.NBTComponent; import com.hollingsworth.arsnouveau.api.registry.BehaviorRegistry; import com.hollingsworth.arsnouveau.api.util.BlockUtil; -import com.hollingsworth.arsnouveau.api.util.NBTUtil; import com.hollingsworth.arsnouveau.api.util.SummonUtil; import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; @@ -27,18 +26,19 @@ import com.hollingsworth.arsnouveau.common.entity.pathfinding.MinecoloniesAdvancedPathNavigate; import com.hollingsworth.arsnouveau.common.entity.pathfinding.MovementHandler; import com.hollingsworth.arsnouveau.common.entity.pathfinding.PathingStuckHandler; +import com.hollingsworth.arsnouveau.common.items.data.StarbuncleCharmData; import com.hollingsworth.arsnouveau.common.items.summon_charms.StarbuncleCharm; import com.hollingsworth.arsnouveau.common.network.ITagSyncable; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketSyncTag; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import com.hollingsworth.arsnouveau.setup.reward.Rewards; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; @@ -67,7 +67,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.DirtPathBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.pathfinder.PathType; @@ -86,8 +85,6 @@ import javax.annotation.Nullable; import java.util.*; -import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; - public class Starbuncle extends PathfinderMob implements GeoEntity, IDecoratable, IDispellable, ITooltipProvider, IWandable, IDebuggerProvider, ITagSyncable, IVariantColorProvider { @@ -121,7 +118,7 @@ public enum StarbuncleGoalState { public BlockPos jukeboxPos; public boolean partyCarby; public PathNavigation minecraftPathNav; - public StarbuncleData data = new StarbuncleData(new CompoundTag()); + public StarbuncleCharmData.Mutable data = new StarbuncleCharmData.Mutable(); public ChangeableBehavior dynamicBehavior = new StarbyTransportBehavior(this, new CompoundTag()); public boolean canSleep; public boolean sleeping; @@ -250,7 +247,7 @@ public void attemptTame() { ItemStack stack = new ItemStack(ItemsRegistry.STARBUNCLE_SHARD.get(), 1 + level.random.nextInt(2)); if (this.data.adopter != null) { stack.setCount(1); - stack.setTag(data.toTag(this, new CompoundTag())); + stack.set(DataComponentRegistry.STARBUNCLE_DATA, this.data.immutable()); } level.addFreshEntity(new ItemEntity(level, getX(), getY() + 0.5, getZ(), stack)); level.playSound(null, getX(), getY(), getZ(), SoundEvents.ILLUSIONER_MIRROR_MOVE, SoundSource.NEUTRAL, 1f, 1f); @@ -440,7 +437,7 @@ public void die(DamageSource source) { public void dropData() { ItemStack stack = new ItemStack(ItemsRegistry.STARBUNCLE_CHARM.get()); - stack.setTag(data.toTag(this, new CompoundTag())); + stack.set(DataComponentRegistry.STARBUNCLE_DATA, data.immutable()); level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); if (this.getHeldStack() != null) level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), this.getHeldStack())); @@ -472,8 +469,7 @@ protected InteractionResult mobInteract(Player player, InteractionHand hand) { if(player.getMainHandItem().getItem() instanceof StarbuncleCharm starbuncleCharm){ Starbuncle carbuncle = new Starbuncle(level, true); - Starbuncle.StarbuncleData data = new Starbuncle.StarbuncleData(player.getMainHandItem().getOrCreateTag()); - carbuncle.data = data; + carbuncle.data = player.getMainHandItem().getOrDefault(DataComponentRegistry.STARBUNCLE_DATA, new StarbuncleCharmData()).mutable(); level.addFreshEntity(carbuncle); carbuncle.restoreFromTag(); carbuncle.startRiding(this); @@ -572,7 +568,7 @@ public boolean onDispel(@Nullable LivingEntity caster) { @Override public void readAdditionalSaveData(CompoundTag tag) { super.readAdditionalSaveData(tag); - data = new StarbuncleData(tag.contains("starbuncleData") ? tag.getCompound("starbuncleData") : new CompoundTag()); + data = NBTComponent.fromTag(StarbuncleCharmData.CODEC.codec(), tag.contains("starbuncleData") ? tag.getCompound("starbuncleData") : new CompoundTag()).mutable(); if (tag.contains("held")) setHeldStack(ItemStack.parseOptional(level.registryAccess(), (CompoundTag) tag.get("held"))); @@ -592,7 +588,7 @@ public void readAdditionalSaveData(CompoundTag tag) { @Override public void addAdditionalSaveData(CompoundTag tag) { super.addAdditionalSaveData(tag); - tag.put("starbuncleData", data.toTag(this, new CompoundTag())); + tag.put("starbuncleData", data.immutable().toTag(level)); if (getHeldStack() != null) { Tag itemTag = getHeldStack().save(level.registryAccess()); tag.put("held", itemTag); @@ -752,55 +748,4 @@ public void onTagSync(CompoundTag tag) { } } - public static class StarbuncleData extends PersistentFamiliarData { - public Block pathBlock; - public BlockPos bedPos; - public CompoundTag behaviorTag; - public String adopter; - public String bio; - - public StarbuncleData(CompoundTag tag) { - super(tag); - adopter = null; - bio = null; - - if (tag.contains("path")) { - pathBlock = BuiltInRegistries.BLOCK.get(ResourceLocation.tryParse(tag.getString("path"))); - } - bedPos = NBTUtil.getBlockPos(tag, "bed_"); - if (bedPos.equals(BlockPos.ZERO)) - bedPos = null; - if (tag.contains("behavior")) - behaviorTag = tag.getCompound("behavior"); - if (tag.contains("cosmetic")) { - cosmetic = ItemStack.parseOptional(tag.getCompound("cosmetic")); - } - if (tag.contains("adopter")) { - adopter = tag.getString("adopter"); - } - if (tag.contains("bio")) { - bio = tag.getString("bio"); - } - } - - @Override - public CompoundTag toTag(Starbuncle starbuncle, CompoundTag tag) { - super.toTag(starbuncle, tag); - if (pathBlock != null) - tag.putString("path", getRegistryName(pathBlock).toString()); - if (bedPos != null) - NBTUtil.storeBlockPos(tag, "bed_", bedPos); - if (!starbuncle.getCosmeticItem().isEmpty()) { - tag.put("cosmetic", starbuncle.getCosmeticItem().save(starbuncle.level.registryAccess())); - } - tag.put("behavior", starbuncle.dynamicBehavior.toTag(new CompoundTag())); - if (adopter != null) { - tag.putString("adopter", adopter); - } - if (bio != null) { - tag.putString("bio", bio); - } - return tag; - } - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java index f243ec9732..1f79ef7f09 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java @@ -15,7 +15,7 @@ import com.hollingsworth.arsnouveau.common.entity.goal.whirlisprig.FollowMobGoalBackoff; import com.hollingsworth.arsnouveau.common.entity.goal.whirlisprig.FollowPlayerGoal; import com.hollingsworth.arsnouveau.common.entity.goal.whirlisprig.InspectPlantGoal; -import com.hollingsworth.arsnouveau.common.items.ItemScroll; +import com.hollingsworth.arsnouveau.common.items.data.ItemScrollData; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketANEffect; import com.hollingsworth.arsnouveau.common.util.PortUtil; @@ -113,7 +113,7 @@ protected InteractionResult mobInteract(Player player, InteractionHand hand) { return super.mobInteract(player, hand); ItemStack stack = player.getItemInHand(hand); if (stack.getItem() == ItemsRegistry.DENY_ITEM_SCROLL.asItem() && getTile() != null) { - ItemScroll.ItemScrollData scrollData = new ItemScroll.ItemScrollData(stack); + ItemScrollData.ItemScrollData scrollData = new ItemScrollData.ItemScrollData(stack); getTile().ignoreItems.addAll(scrollData.getItems()); PortUtil.sendMessage(player, Component.translatable("ars_nouveau.whirlisprig.ignore")); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java index 79870baea8..2775e42255 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java @@ -5,12 +5,12 @@ import com.hollingsworth.arsnouveau.api.entity.IDispellable; import com.hollingsworth.arsnouveau.api.event.FamiliarSummonEvent; import com.hollingsworth.arsnouveau.api.familiar.IFamiliar; -import com.hollingsworth.arsnouveau.api.familiar.PersistentFamiliarData; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; import com.hollingsworth.arsnouveau.common.entity.goal.familiar.FamOwnerHurtByTargetGoal; import com.hollingsworth.arsnouveau.common.entity.goal.familiar.FamOwnerHurtTargetGoal; import com.hollingsworth.arsnouveau.common.entity.goal.familiar.FamiliarFollowGoal; +import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java index ada9559c50..5119a1e6c1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java @@ -1,22 +1,16 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.item.IScribeable; -import com.hollingsworth.arsnouveau.api.nbt.ItemstackData; -import com.hollingsworth.arsnouveau.common.util.PortUtil; -import com.hollingsworth.arsnouveau.setup.registry.RegistryHelper; +import com.hollingsworth.arsnouveau.common.items.data.ItemScrollData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.neoforged.neoforge.items.IItemHandler; -import javax.annotation.Nullable; -import java.util.ArrayList; import java.util.List; public abstract class ItemScroll extends ModItem implements IScribeable { @@ -54,85 +48,10 @@ public enum SortPref { @Override public boolean onScribe(Level world, BlockPos pos, Player player, InteractionHand handIn, ItemStack thisStack) { ItemStack stackToWrite = player.getItemInHand(handIn); - ItemScrollData scrollData = new ItemScrollData(thisStack); - return scrollData.writeWithFeedback(player, stackToWrite); - } - - @Override - public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { - if(!stack.hasTag()) - return; - ItemScrollData scrollData = new ItemScrollData(stack); - for (ItemStack s : scrollData.items) { - tooltip2.add(s.getHoverName()); - } - } - - public static class ItemScrollData extends ItemstackData { - private List items = new ArrayList<>(); - - public ItemScrollData(ItemStack stack) { - super(stack); - CompoundTag tag = getItemTag(stack); - if (tag == null || tag.isEmpty()) - return; - for (String s : tag.getAllKeys()) { - if (s.contains("item_")) { - items.add(ItemStack.of(tag.getCompound(s))); - } - } - } - - public boolean writeWithFeedback(Player player, ItemStack stackToWrite) { - if (stackToWrite.isEmpty()) - return false; - if (containsStack(stackToWrite)) { - PortUtil.sendMessage(player, Component.translatable("ars_nouveau.scribe.item_removed")); - return remove(stackToWrite); - } - if(add(stackToWrite)) { - PortUtil.sendMessage(player, Component.translatable("ars_nouveau.scribe.item_added")); - return true; - } - return false; - } - - public boolean containsStack(ItemStack stack){ - return items.stream().anyMatch(s -> ItemStack.isSameItem(s, stack)); - } - - public boolean remove(ItemStack stack){ - boolean didRemove = items.removeIf(s -> ItemStack.isSameItem(s, stack)); - writeItem(); - return didRemove; - } - - public boolean add(ItemStack stack){ - boolean added = items.add(stack.copy()); - writeItem(); - return added; - } - - public List getItems(){ - return items; - } - - public String getItemKey(ItemStack stack) { - return "item_" + RegistryHelper.getRegistryName(stack.getItem()).toString(); - } - - @Override - public void writeToNBT(CompoundTag tag) { - for (ItemStack s : items) { - CompoundTag itemTag = new CompoundTag(); - s.save(itemTag); - tag.put(getItemKey(s), itemTag); - } - } - - @Override - public String getTagString() { - return "an_scrollData"; - } + ItemScrollData existingList = thisStack.getOrDefault(DataComponentRegistry.ITEM_SCROLL_DATA, new ItemScrollData(List.of())); + var mutable = existingList.mutable(); + var success = mutable.writeWithFeedback(player, stackToWrite); + stackToWrite.set(DataComponentRegistry.ITEM_SCROLL_DATA, mutable.toImmutable()); + return success; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java index 2e310fead6..97bbddd202 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.common.items; -import com.hollingsworth.arsnouveau.common.entity.Starbuncle; +import com.hollingsworth.arsnouveau.common.items.data.StarbuncleCharmData; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; @@ -19,7 +19,7 @@ public StarbuncleShard(){ @Override public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { if(stack.hasTag()){ - Starbuncle.StarbuncleData data = new Starbuncle.StarbuncleData(stack.getOrCreateTag()); + StarbuncleCharmData.StarbuncleCharmData data = new StarbuncleCharmData.StarbuncleCharmData(stack.getOrCreateTag()); if (data.name != null) { tooltip2.add(data.name); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java index 3942825652..f34e96974c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java @@ -1,23 +1,20 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.item.IScribeable; +import com.hollingsworth.arsnouveau.common.items.data.VoidJarData; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -import javax.annotation.Nullable; -import java.util.List; - public class VoidJar extends ModItem implements IScribeable { public VoidJar() { @@ -25,9 +22,9 @@ public VoidJar() { } public void toggleStatus(Player playerEntity, ItemStack stack) { - VoidJarData jarData = new VoidJarData(stack); - jarData.setActive(!jarData.isActive()); - if (jarData.isActive()) { + VoidJarData jarData = stack.getOrDefault(DataComponentRegistry.VOID_JAR, new VoidJarData()); + var newData = stack.set(DataComponentRegistry.VOID_JAR, jarData.setActive(!jarData.active())); + if (newData.active()) { PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.on")); } else { PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.off")); @@ -48,8 +45,8 @@ public static boolean tryVoiding(Player player, ItemStack pickingUp) { } public boolean voidStack(Player player, ItemStack jarStack, ItemStack stackToVoid){ - VoidJarData jarData = new VoidJarData(jarStack); - if (jarData.isActive() && jarData.containsStack(stackToVoid)) { + VoidJarData jarData = jarStack.getOrDefault(DataComponentRegistry.VOID_JAR, new VoidJarData()); + if (jarData.active() && jarData.scrollData().containsStack(stackToVoid)) { int amount = stackToVoid.getCount(); preConsume(player, jarStack, stackToVoid, amount); stackToVoid.setCount(0); @@ -59,7 +56,11 @@ public boolean voidStack(Player player, ItemStack jarStack, ItemStack stackToVoi } public void preConsume(Player player, ItemStack jar, ItemStack voided, int amount) { - CapabilityRegistry.getMana(player).ifPresent(iMana -> iMana.addMana(5.0 * amount)); + var mana = CapabilityRegistry.getMana(player).orElse(null); + if(mana == null){ + return; + } + mana.removeMana(5.0 * amount); } @Override @@ -67,7 +68,7 @@ public InteractionResultHolder use(Level worldIn, Player player, Inte if (worldIn.isClientSide) return super.use(worldIn, player, handIn); ItemStack stack = player.getItemInHand(handIn); - VoidJarData data = new VoidJarData(stack); + VoidJarData data = stack.getOrDefault(DataComponentRegistry.VOID_JAR, new VoidJarData()); if (handIn == InteractionHand.MAIN_HAND) { ItemStack stackToWrite = player.getOffhandItem(); @@ -75,62 +76,20 @@ public InteractionResultHolder use(Level worldIn, Player player, Inte toggleStatus(player, stack); return InteractionResultHolder.consume(stack); } - data.writeWithFeedback(player, stackToWrite); + var items = data.scrollData().mutable(); + items.writeWithFeedback(player, stackToWrite); + stack.set(DataComponentRegistry.VOID_JAR, new VoidJarData(items.toImmutable(), data.active())); } return InteractionResultHolder.success(stack); } - @Override - public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { - if(!stack.hasTag()) - return; - VoidJarData data = new VoidJarData(stack); - if (data.isActive()) { - tooltip2.add(Component.translatable("ars_nouveau.on")); - } else { - tooltip2.add(Component.translatable("ars_nouveau.off")); - } - for (ItemStack s : data.getItems()) { - tooltip2.add(s.getHoverName()); - } - - super.appendHoverText(stack, context, tooltip2, flagIn); - } - @Override public boolean onScribe(Level world, BlockPos pos, Player player, InteractionHand handIn, ItemStack thisStack) { - VoidJarData data = new VoidJarData(thisStack); - return data.writeWithFeedback(player, player.getItemInHand(handIn)); + VoidJarData data = thisStack.getOrDefault(DataComponentRegistry.VOID_JAR, new VoidJarData()); + var items = data.scrollData().mutable(); + var written = items.writeWithFeedback(player, player.getItemInHand(handIn)); + thisStack.set(DataComponentRegistry.VOID_JAR, new VoidJarData(items.toImmutable(), data.active())); + return written; } - public static class VoidJarData extends ItemScroll.ItemScrollData{ - private boolean active; - public VoidJarData(ItemStack stack) { - super(stack); - CompoundTag tag = getItemTag(stack); - if(tag == null) - return; - active = tag.getBoolean("on"); - } - - public boolean isActive(){ - return active; - } - - public void setActive(boolean active){ - this.active = active; - writeItem(); - } - - @Override - public void writeToNBT(CompoundTag tag) { - super.writeToNBT(tag); - tag.putBoolean("on", active); - } - - @Override - public String getTagString() { - return "an_voidJar"; - } - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java new file mode 100644 index 0000000000..f656918079 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java @@ -0,0 +1,99 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.hollingsworth.arsnouveau.api.item.NBTComponent; +import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.mojang.serialization.Codec; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.TooltipProvider; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +public class ItemScrollData implements NBTComponent, TooltipProvider { + + public static final Codec CODEC = ItemStack.CODEC.listOf().xmap(ItemScrollData::new, (i) -> i.items); + public static final StreamCodec STREAM_CODEC = StreamCodec.composite(ItemStack.LIST_STREAM_CODEC, (i) -> i.items, ItemScrollData::new); + + private final List items; + + public ItemScrollData(List items) { + this.items = List.copyOf(items); + } + + public ItemScrollData(){ + this(List.of()); + } + + public boolean containsStack(ItemStack stack) { + return contains(items, stack); + } + + public static boolean contains(List list, ItemStack stack) { + return list.stream().anyMatch(s -> ItemStack.isSameItem(s, stack)); + } + + public Iterable getItems() { + return items; + } + + @Override + public Codec getCodec() { + return CODEC; + } + + public Mutable mutable() { + return new Mutable(this); + } + + @Override + public void addToTooltip(Item.TooltipContext pContext, Consumer pTooltipAdder, TooltipFlag pTooltipFlag) { + for (ItemStack s : items) { + pTooltipAdder.accept(s.getHoverName()); + } + } + + public static class Mutable { + private final List list; + + public Mutable(ItemScrollData data) { + this.list = new ArrayList<>(data.items); + } + + public boolean add(ItemStack stack) { + return list.add(stack.copy()); + } + + public boolean remove(ItemStack stack) { + return list.remove(stack.copy()); + } + + public List getItems() { + return list; + } + + public ItemScrollData toImmutable() { + return new ItemScrollData(list); + } + + public boolean writeWithFeedback(Player player, ItemStack stackToWrite) { + if (stackToWrite.isEmpty()) + return false; + if (ItemScrollData.contains(list, stackToWrite)) { + PortUtil.sendMessage(player, Component.translatable("ars_nouveau.scribe.item_removed")); + return remove(stackToWrite); + } + if (add(stackToWrite)) { + PortUtil.sendMessage(player, Component.translatable("ars_nouveau.scribe.item_added")); + return true; + } + return false; + } + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/familiar/PersistentFamiliarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java similarity index 62% rename from src/main/java/com/hollingsworth/arsnouveau/api/familiar/PersistentFamiliarData.java rename to src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java index 6f42465ab9..b19a95dfbe 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/familiar/PersistentFamiliarData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java @@ -1,4 +1,4 @@ -package com.hollingsworth.arsnouveau.api.familiar; +package com.hollingsworth.arsnouveau.common.items.data; import com.hollingsworth.arsnouveau.api.item.NBTComponent; import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; @@ -11,9 +11,14 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.TooltipProvider; -public class PersistentFamiliarData implements NBTComponent { +import java.util.function.Consumer; + +public class PersistentFamiliarData implements NBTComponent, TooltipProvider { public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( ComponentSerialization.CODEC.fieldOf("name").forGetter(data -> data.name), @@ -23,9 +28,9 @@ public class PersistentFamiliarData implements NBTComponent STREAM_CODEC = CheatSerializer.create(PersistentFamiliarData.CODEC); - public Component name; - public String color; - public ItemStack cosmetic; + public final Component name; + public final String color; + public final ItemStack cosmetic; public PersistentFamiliarData(Component name, String color, ItemStack cosmetic) { this.name = name; @@ -45,4 +50,27 @@ public static PersistentFamiliarData fromTag(Tag tag){ public Codec getCodec() { return CODEC.codec(); } + + @Override + public void addToTooltip(Item.TooltipContext pContext, Consumer pTooltipAdder, TooltipFlag pTooltipFlag) { + if(name != null){ + pTooltipAdder.accept(name); + } + } + + public static class Mutable{ + public Component name; + public String color; + public ItemStack cosmetic; + + public Mutable(Component name, String color, ItemStack cosmetic) { + this.name = name; + this.color = color; + this.cosmetic = cosmetic; + } + + public PersistentFamiliarData toImmutable(){ + return new PersistentFamiliarData(name, color, cosmetic); + } + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java new file mode 100644 index 0000000000..e3e916a305 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java @@ -0,0 +1,131 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.entity.ChangeableBehavior; +import com.hollingsworth.arsnouveau.api.item.NBTComponent; +import com.hollingsworth.arsnouveau.api.registry.BehaviorRegistry; +import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; +import com.hollingsworth.arsnouveau.common.entity.Starbuncle; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.ComponentSerialization; +import net.minecraft.network.chat.Style; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.TooltipProvider; +import net.minecraft.world.level.block.Block; + +import java.util.function.Consumer; + +public class StarbuncleCharmData implements NBTComponent, TooltipProvider { + + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + ComponentSerialization.CODEC.fieldOf("name").forGetter(data -> data.name), + Codec.STRING.optionalFieldOf("color", DyeColor.ORANGE.getName()).forGetter(data -> data.color), + Block.CODEC.fieldOf("path").forGetter(data -> data.pathBlock), + BlockPos.CODEC.optionalFieldOf("bed", BlockPos.ZERO).forGetter(data -> data.bedPos == null ? BlockPos.ZERO : data.bedPos), + ItemStack.CODEC.optionalFieldOf("cosmetic", ItemStack.EMPTY).forGetter(data -> data.cosmetic), + CompoundTag.CODEC.optionalFieldOf("behavior", new CompoundTag()).forGetter(data -> data.behaviorTag), + Codec.STRING.optionalFieldOf("adopter", null).forGetter(data -> data.adopter), + Codec.STRING.optionalFieldOf("bio", null).forGetter(data -> data.bio) + ).apply(instance, StarbuncleCharmData::new)); + + public static StreamCodec STREAM_CODEC = CheatSerializer.create(CODEC); + public final Component name; + public final String color; + public final ItemStack cosmetic; + public final Block pathBlock; + public final BlockPos bedPos; + public final CompoundTag behaviorTag; + public final String adopter; + public final String bio; + + public StarbuncleCharmData(Component name, String color, Block pathBlock, BlockPos bedPos, ItemStack cosmetic, CompoundTag behaviorTag, String adopter, String bio) { + this.name = name; + this.color = color; + this.cosmetic = cosmetic; + this.pathBlock = pathBlock; + this.bedPos = bedPos; + this.behaviorTag = behaviorTag; + this.adopter = adopter; + this.bio = bio; + } + + public StarbuncleCharmData() { + this(null, DyeColor.ORANGE.getName(), null, BlockPos.ZERO, ItemStack.EMPTY, new CompoundTag(), null, null); + + } + + @Override + public Codec getCodec() { + return StarbuncleCharmData.CODEC.codec(); + } + + public Mutable mutable() { + return new Mutable(name, color, cosmetic, pathBlock, bedPos, behaviorTag, adopter, bio); + } + + @Override + public void addToTooltip(Item.TooltipContext context, Consumer tooltip2, TooltipFlag pTooltipFlag) { + if (name != null) { + tooltip2.accept(name); + } + if(adopter != null){ + tooltip2.accept(Component.translatable("ars_nouveau.adopter", adopter).withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); + } + if(bio != null){ + tooltip2.accept(Component.literal(bio).withStyle(Style.EMPTY.withColor(ChatFormatting.DARK_PURPLE))); + } + if(behaviorTag != null && context != null){ + // danger zone + try{ + ChangeableBehavior behavior = BehaviorRegistry.create(new Starbuncle(ArsNouveau.proxy.getClientWorld(), true), behaviorTag); + if(behavior != null){ + behavior.getTooltip(tooltip2); + } + }catch (Exception e){ + // :-) + } + } + } + + public static class Mutable { + public Component name; + public String color; + public ItemStack cosmetic; + public Block pathBlock; + public BlockPos bedPos; + public CompoundTag behaviorTag; + public String adopter; + public String bio; + + public Mutable(Component name, String color, ItemStack cosmetic, Block pathBlock, BlockPos bedPos, CompoundTag behaviorTag, String adopter, String bio) { + this.name = name; + this.color = color; + this.cosmetic = cosmetic; + this.pathBlock = pathBlock; + this.bedPos = bedPos; + this.behaviorTag = behaviorTag; + this.adopter = adopter; + this.bio = bio; + } + + public Mutable() { + this(null, DyeColor.ORANGE.getName(), ItemStack.EMPTY, null, BlockPos.ZERO, new CompoundTag(), null, null); + } + + public StarbuncleCharmData immutable() { + return new StarbuncleCharmData(name, color, pathBlock, bedPos, cosmetic, behaviorTag, adopter, bio); + } + } +} + diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/VoidJarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/VoidJarData.java new file mode 100644 index 0000000000..4e7e282910 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/VoidJarData.java @@ -0,0 +1,48 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.hollingsworth.arsnouveau.api.item.NBTComponent; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.TooltipProvider; + +import java.util.function.Consumer; + +public record VoidJarData(ItemScrollData scrollData, boolean active) implements NBTComponent, TooltipProvider { + + public VoidJarData(){ + this(new ItemScrollData(), false); + } + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + ItemScrollData.CODEC.fieldOf("scrollData").forGetter(VoidJarData::scrollData), + Codec.BOOL.fieldOf("active").forGetter(VoidJarData::active) + ).apply(instance, VoidJarData::new)); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite(ItemScrollData.STREAM_CODEC, VoidJarData::scrollData, ByteBufCodecs.BOOL, VoidJarData::active, VoidJarData::new); + + + public VoidJarData setActive(boolean active) { + return new VoidJarData(scrollData, active); + } + + @Override + public Codec getCodec() { + return CODEC; + } + + @Override + public void addToTooltip(Item.TooltipContext pContext, Consumer pTooltipAdder, TooltipFlag pTooltipFlag) { + if (active) { + pTooltipAdder.accept(Component.translatable("ars_nouveau.on")); + } else { + pTooltipAdder.accept(Component.translatable("ars_nouveau.off")); + } + scrollData.addToTooltip(pContext, pTooltipAdder, pTooltipFlag); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/AllowItemScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/AllowItemScroll.java index 6ff8ab7ae2..26625ecd0e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/AllowItemScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/AllowItemScroll.java @@ -1,6 +1,8 @@ package com.hollingsworth.arsnouveau.common.items.itemscrolls; import com.hollingsworth.arsnouveau.common.items.ItemScroll; +import com.hollingsworth.arsnouveau.common.items.data.ItemScrollData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.items.IItemHandler; @@ -16,7 +18,7 @@ public AllowItemScroll(Properties properties) { @Override public SortPref getSortPref(ItemStack stackToStore, ItemStack scrollStack, IItemHandler inventory) { - ItemScrollData data = new ItemScrollData(scrollStack); + ItemScrollData data = scrollStack.getOrDefault(DataComponentRegistry.ITEM_SCROLL_DATA, new ItemScrollData()); return data.containsStack(stackToStore) ? SortPref.HIGH : SortPref.INVALID; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/DenyItemScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/DenyItemScroll.java index 6721b9cfa0..8918209a68 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/DenyItemScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/DenyItemScroll.java @@ -1,6 +1,8 @@ package com.hollingsworth.arsnouveau.common.items.itemscrolls; import com.hollingsworth.arsnouveau.common.items.ItemScroll; +import com.hollingsworth.arsnouveau.common.items.data.ItemScrollData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.items.IItemHandler; @@ -16,7 +18,7 @@ public DenyItemScroll(Properties properties) { @Override public SortPref getSortPref(ItemStack stackToStore, ItemStack scrollStack, IItemHandler inventory) { - ItemScrollData data = new ItemScrollData(scrollStack); + ItemScrollData data = scrollStack.getOrDefault(DataComponentRegistry.ITEM_SCROLL_DATA, new ItemScrollData()); return !data.containsStack(stackToStore) ? SortPref.HIGH : SortPref.INVALID; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/BookwyrmCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/BookwyrmCharm.java index 943431bcd7..bcff191fcb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/BookwyrmCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/BookwyrmCharm.java @@ -1,19 +1,13 @@ package com.hollingsworth.arsnouveau.common.items.summon_charms; -import com.hollingsworth.arsnouveau.api.familiar.PersistentFamiliarData; import com.hollingsworth.arsnouveau.common.block.tile.StorageLecternTile; import com.hollingsworth.arsnouveau.common.entity.EntityBookwyrm; import com.hollingsworth.arsnouveau.common.items.ModItem; import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; -import java.util.List; - public class BookwyrmCharm extends ModItem { public BookwyrmCharm() { super(); @@ -36,16 +30,4 @@ public InteractionResult useOn(UseOnContext pContext) { } return super.useOn(pContext); } - - @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { - super.appendHoverText(stack, context, tooltip2, flagIn); - if(stack.hasTag()){ - PersistentFamiliarData data = new PersistentFamiliarData(stack.getOrCreateTag()); - if(data.name != null){ - tooltip2.add(data.name); - } - } - } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/StarbuncleCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/StarbuncleCharm.java index d5370927d5..65f3a21ff8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/StarbuncleCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/StarbuncleCharm.java @@ -1,22 +1,15 @@ package com.hollingsworth.arsnouveau.common.items.summon_charms; -import com.hollingsworth.arsnouveau.api.entity.ChangeableBehavior; import com.hollingsworth.arsnouveau.api.item.AbstractSummonCharm; -import com.hollingsworth.arsnouveau.api.registry.BehaviorRegistry; import com.hollingsworth.arsnouveau.common.block.tile.SummoningTile; import com.hollingsworth.arsnouveau.common.entity.Starbuncle; -import net.minecraft.ChatFormatting; +import com.hollingsworth.arsnouveau.common.items.data.StarbuncleCharmData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; import net.minecraft.world.InteractionResult; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; -import java.util.List; - public class StarbuncleCharm extends AbstractSummonCharm { public StarbuncleCharm() { super(); @@ -25,10 +18,10 @@ public StarbuncleCharm() { @Override public InteractionResult useOnBlock(UseOnContext context, Level world, BlockPos pos) { Starbuncle carbuncle = new Starbuncle(world, true); - Starbuncle.StarbuncleData data = new Starbuncle.StarbuncleData(context.getItemInHand().getOrCreateTag()); + StarbuncleCharmData data = context.getItemInHand().getOrDefault(DataComponentRegistry.STARBUNCLE_DATA, new StarbuncleCharmData()); pos = pos.relative(context.getClickedFace()); carbuncle.setPos(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); - carbuncle.data = data; + carbuncle.data = data.mutable(); world.addFreshEntity(carbuncle); carbuncle.restoreFromTag(); return InteractionResult.SUCCESS; @@ -38,30 +31,4 @@ public InteractionResult useOnBlock(UseOnContext context, Level world, BlockPos public InteractionResult useOnSummonTile(UseOnContext context, Level world, SummoningTile tile, BlockPos pos) { return useOnBlock(context, world, pos); } - - @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { - super.appendHoverText(stack, context, tooltip2, flagIn); - Starbuncle.StarbuncleData data = new Starbuncle.StarbuncleData(stack.getOrCreateTag()); - if (data.name != null) { - tooltip2.add(data.name); - } - if(data.adopter != null){ - tooltip2.add(Component.translatable("ars_nouveau.adopter", data.adopter).withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); - } - if(data.bio != null){ - tooltip2.add(Component.literal(data.bio).withStyle(Style.EMPTY.withColor(ChatFormatting.DARK_PURPLE))); - } - if(data.behaviorTag != null && context != null){ - // danger zone - try{ - ChangeableBehavior behavior = BehaviorRegistry.create(new Starbuncle(context, true), data.behaviorTag); - if(behavior != null){ - behavior.getTooltip(tooltip2); - } - }catch (Exception e){ - // :-) - } - } - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java index b8ca205877..b9b3cf5541 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java @@ -1,6 +1,9 @@ package com.hollingsworth.arsnouveau.setup.registry; -import com.hollingsworth.arsnouveau.api.familiar.PersistentFamiliarData; +import com.hollingsworth.arsnouveau.common.items.data.ItemScrollData; +import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; +import com.hollingsworth.arsnouveau.common.items.data.StarbuncleCharmData; +import com.hollingsworth.arsnouveau.common.items.data.VoidJarData; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.registries.BuiltInRegistries; import net.neoforged.neoforge.registries.DeferredHolder; @@ -13,4 +16,10 @@ public class DataComponentRegistry { public static final DeferredRegister> DATA = DeferredRegister.create(BuiltInRegistries.DATA_COMPONENT_TYPE, MODID); public static final DeferredHolder, DataComponentType> PERSISTENT_FAMILIAR_DATA = DATA.register("persistent_familiar_data", () -> DataComponentType.builder().persistent(PersistentFamiliarData.CODEC.codec()).networkSynchronized(PersistentFamiliarData.STREAM_CODEC).build()); + + public static final DeferredHolder, DataComponentType> STARBUNCLE_DATA = DATA.register("starbuncle_data", () -> DataComponentType.builder().persistent(StarbuncleCharmData.CODEC.codec()).build()); + + public static final DeferredHolder, DataComponentType> ITEM_SCROLL_DATA = DATA.register("item_scroll_data", () -> DataComponentType.builder().persistent(ItemScrollData.CODEC).networkSynchronized(ItemScrollData.STREAM_CODEC).build()); + + public static final DeferredHolder , DataComponentType> VOID_JAR = DATA.register("void_jar", () -> DataComponentType.builder().persistent(VoidJarData.CODEC).networkSynchronized(VoidJarData.STREAM_CODEC).build()); } From d7391a47a59d691f2b615076220d2586bc5c5da1 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 29 Jun 2024 13:50:50 -0500 Subject: [PATCH 021/363] more component migration --- .../api/entity/ChangeableBehavior.java | 3 +- .../arsnouveau/api/nbt/ItemstackData.java | 30 ---- .../arsnouveau/api/perk/ArmorPerkHolder.java | 47 ------ .../arsnouveau/api/perk/IPerk.java | 4 +- .../arsnouveau/api/perk/IPerkHolder.java | 10 +- .../arsnouveau/api/perk/PerkSlot.java | 23 +-- .../arsnouveau/api/perk/StackPerkHolder.java | 96 ------------ .../api/potion/IPotionProvider.java | 3 +- .../api/recipe/CraftingManager.java | 23 +-- .../api/recipe/PotionCraftingManager.java | 12 +- .../arsnouveau/api/util/NBTUtil.java | 13 +- .../client/gui/GuiEntityInfoHUD.java | 3 +- .../jei/ArmorUpgradeRecipeCategory.java | 2 +- .../client/registry/ClientHandler.java | 4 +- .../renderer/item/FlaskCannonRenderer.java | 3 +- .../tile/AlterationTableRenderer.java | 2 +- .../common/armor/AnimatedMagicArmor.java | 1 + .../common/block/AlterationTable.java | 3 +- .../arsnouveau/common/block/PortalBlock.java | 22 ++- .../arsnouveau/common/block/PotionJar.java | 24 +-- .../common/block/tile/AlterationTile.java | 2 +- .../common/block/tile/PortalTile.java | 10 +- .../common/block/tile/PotionDiffuserTile.java | 2 +- .../common/block/tile/PotionJarTile.java | 2 +- .../common/block/tile/PotionMelderTile.java | 2 +- .../common/block/tile/RuneTile.java | 7 +- .../common/block/tile/WhirlisprigTile.java | 15 +- .../common/block/tile/WixieCauldronTile.java | 3 +- .../crafting/recipes/ArmorUpgradeRecipe.java | 2 +- .../crafting/recipes/CheatSerializer.java | 17 +- .../crafting/recipes/PotionFlaskRecipe.java | 5 +- .../common/entity/familiar/FamiliarWixie.java | 2 +- .../goal/carbuncle/PotionStoreGoal.java | 2 +- .../goal/carbuncle/StarbyPotionBehavior.java | 10 +- .../carbuncle/StarbyTransportBehavior.java | 9 +- .../common/event/timed/BuildPortalEvent.java | 6 +- .../common/items/AlchemistsCrown.java | 7 +- .../arsnouveau/common/items/DominionWand.java | 147 +++++------------- .../arsnouveau/common/items/FlaskCannon.java | 82 +--------- .../arsnouveau/common/items/MobJarItem.java | 3 +- .../arsnouveau/common/items/PotionFlask.java | 140 ++++------------- .../arsnouveau/common/items/Present.java | 64 ++------ .../arsnouveau/common/items/ScryCaster.java | 51 +----- .../arsnouveau/common/items/ScryerScroll.java | 40 +---- .../common/items/StableWarpScroll.java | 46 +----- .../arsnouveau/common/items/WarpScroll.java | 126 +-------------- .../common/items/data/ArmorPerkHolder.java | 69 ++++++++ .../common/items/data/DominionWandData.java | 66 ++++++++ .../items/data/MultiPotionContents.java | 40 +++++ .../items/data}/PotionData.java | 51 +++--- .../common/items/data/PotionLauncherData.java | 86 ++++++++++ .../common/items/data/PresentData.java | 22 +++ .../common/items/data/ScryData.java | 12 ++ .../common/items/data/StackPerkHolder.java | 54 +++++++ .../common/items/data/WarpScrollData.java | 71 +++++++++ .../common/network/PacketConsumePotion.java | 2 +- .../common/network/PacketSetLauncher.java | 2 +- .../common/spell/effect/EffectBlink.java | 14 +- .../common/spell/effect/EffectInfuse.java | 2 +- .../arsnouveau/common/util/ANCodecs.java | 13 ++ .../setup/registry/APIRegistry.java | 3 +- .../setup/registry/DataComponentRegistry.java | 17 +- 62 files changed, 720 insertions(+), 934 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/nbt/ItemstackData.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/perk/ArmorPerkHolder.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/perk/StackPerkHolder.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/MultiPotionContents.java rename src/main/java/com/hollingsworth/arsnouveau/{api/potion => common/items/data}/PotionData.java (82%) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/PresentData.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryData.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/StackPerkHolder.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/entity/ChangeableBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/api/entity/ChangeableBehavior.java index 70644bf579..da66b706d6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/entity/ChangeableBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/entity/ChangeableBehavior.java @@ -15,6 +15,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; public abstract class ChangeableBehavior implements IWandable { public List goals = new ArrayList<>(); @@ -32,7 +33,7 @@ public void tick(){ } - public void getTooltip(List tooltip){} + public void getTooltip(Consumer tooltip){} public CompoundTag toTag(CompoundTag tag) { tag.putString("id", getRegistryName().toString()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/nbt/ItemstackData.java b/src/main/java/com/hollingsworth/arsnouveau/api/nbt/ItemstackData.java deleted file mode 100644 index d592099046..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/api/nbt/ItemstackData.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.hollingsworth.arsnouveau.api.nbt; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.item.ItemStack; - -public abstract class ItemstackData extends AbstractData { - public ItemStack stack; - - public ItemstackData(ItemStack stack) { - super(stack.getOrCreateTag()); - this.stack = stack; - } - - /** - * This must be called to save the tag to the itemstack. Manipulating this object - * only will not save the tag to the itemstack. - */ - public void writeItem() { - CompoundTag tag = new CompoundTag(); - writeToNBT(tag); - stack.getOrCreateTag().put(getTagString(), tag); - } - - public CompoundTag getItemTag(ItemStack stack) { - return stack.getOrCreateTag().getCompound(getTagString()); - } - - public abstract String getTagString(); - -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/ArmorPerkHolder.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/ArmorPerkHolder.java deleted file mode 100644 index 9dc454a311..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/ArmorPerkHolder.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.hollingsworth.arsnouveau.api.perk; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.ItemStack; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - -public class ArmorPerkHolder extends StackPerkHolder { - - private String color; - private List> slotsForTier; - - public ArmorPerkHolder(ItemStack stack, List> slotsForTier) { - super(stack); - CompoundTag tag = getItemTag(stack); - this.slotsForTier = slotsForTier; - if (tag == null) - return; - color = tag.getString("color"); - } - - public String getColor() { - return color == null ? DyeColor.PURPLE.getName() : color; - } - - public void setColor(String color) { - this.color = color; - writeItem(); - } - - @Override - public void writeToNBT(CompoundTag tag) { - super.writeToNBT(tag); - if (color != null) - tag.putString("color", color); - } - - @Override - public List getSlotsForTier() { - List slots = new ArrayList<>(slotsForTier.get(getTier())); - slots.sort(Comparator.comparingInt((a) -> -a.value)); - return slots; - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerk.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerk.java index 6ad41e881f..c48e2d12db 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerk.java @@ -37,8 +37,8 @@ default PerkSlot minimumSlot(){ * @return Whether the perk is valid for the given slot, defaults to check slot level */ default boolean validForSlot(PerkSlot slot, ItemStack stack, Player player){ - if(this.minimumSlot().value > slot.value){ - PortUtil.sendMessage(player, Component.translatable("ars_nouveau.perk.invalid_for_slot", this.minimumSlot().value)); + if(this.minimumSlot().value() > slot.value()){ + PortUtil.sendMessage(player, Component.translatable("ars_nouveau.perk.invalid_for_slot", this.minimumSlot().value())); return false; } return true; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerkHolder.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerkHolder.java index 409c18884d..643e6d27e5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerkHolder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerkHolder.java @@ -29,7 +29,7 @@ default List getPerkInstances(){ List getPerks(); - void setPerks(List perks); + T setPerks(List perks); List getSlotsForTier(); @@ -43,20 +43,20 @@ default void appendPerkTooltip(List tooltip, T obj){ IPerk perk = perkInstance.getPerk(); ResourceLocation location = perk.getRegistryName(); tooltip.add(Component.literal(Component.translatable("item." + location.getNamespace() + "." + location.getPath()).getString() - + " " + RomanNumber.toRoman(perkInstance.getSlot().value))); + + " " + RomanNumber.toRoman(perkInstance.getSlot().value()))); } int missing = getSlotsForTier().size() - getPerkInstances().size(); for(int i = 0; i < missing; i++){ PerkSlot slot = new ArrayList<>(getSlotsForTier()).subList(getPerkInstances().size(), getSlotsForTier().size()).get(i); - tooltip.add(Component.literal(Component.translatable("Empty").getString() + " " + RomanNumber.toRoman(slot.value)).withStyle(ChatFormatting.RED).withStyle(ChatFormatting.ITALIC)); + tooltip.add(Component.literal(Component.translatable("Empty").getString() + " " + RomanNumber.toRoman(slot.value())).withStyle(ChatFormatting.RED).withStyle(ChatFormatting.ITALIC)); } } int getTier(); - void setTier(int tier); + T setTier(int tier); @Nullable CompoundTag getTagForPerk(IPerk perk); - void setTagForPerk(IPerk perk, CompoundTag tag); + T setTagForPerk(IPerk perk, CompoundTag tag); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkSlot.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkSlot.java index 3e8016c391..41713a9930 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkSlot.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkSlot.java @@ -1,28 +1,33 @@ package com.hollingsworth.arsnouveau.api.perk; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.resources.ResourceLocation; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; -public class PerkSlot { +public record PerkSlot(ResourceLocation id, int value) { + + public static final Codec CODEC = RecordCodecBuilder.create((instance) -> instance.group( + ResourceLocation.CODEC.fieldOf("id").forGetter((PerkSlot::id)), + Codec.INT.fieldOf("value").forGetter((PerkSlot::value)) + ).apply(instance, PerkSlot::new)); + + public static Codec> LIST_CODEC = Codec.list(CODEC); + + public static Codec>> TIERED_LIST_CODEC = Codec.list(LIST_CODEC); + public static ConcurrentHashMap PERK_SLOTS = new ConcurrentHashMap<>(); public static final PerkSlot ONE = new PerkSlot(ArsNouveau.prefix( "one"), 1); public static final PerkSlot TWO = new PerkSlot(ArsNouveau.prefix( "two"), 2); public static final PerkSlot THREE = new PerkSlot(ArsNouveau.prefix( "three"), 3); - public final ResourceLocation id; - public final int value; // oneIndexed - public PerkSlot(ResourceLocation id, int value){ - this.value = value; - this.id = id; - } - static { PERK_SLOTS.put(ONE.id, ONE); PERK_SLOTS.put(TWO.id, TWO); PERK_SLOTS.put(THREE.id, THREE); } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/StackPerkHolder.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/StackPerkHolder.java deleted file mode 100644 index fe43b37276..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/StackPerkHolder.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.hollingsworth.arsnouveau.api.perk; - -import com.google.common.collect.ImmutableList; -import com.hollingsworth.arsnouveau.api.nbt.ItemstackData; -import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; -import com.hollingsworth.arsnouveau.common.perk.StarbunclePerk; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Serializes a set of perks from an itemstack. - */ -public abstract class StackPerkHolder extends ItemstackData implements IPerkHolder { - private List perks; - private int tier; - private Map perkTags; - - public StackPerkHolder(ItemStack stack) { - super(stack); - perkTags = new HashMap<>(); - CompoundTag tag = getItemTag(stack); - List perkList = new ArrayList<>(); - if(tag != null){ - tier = tag.getInt("tier"); - } - if(tag != null && tag.contains("perks")) { - ListTag perkTagList = tag.getList("perks", 10); - for (int i = 0; i < perkTagList.size(); i++) { - CompoundTag perkTag = perkTagList.getCompound(i); - String perkName = perkTag.getString("perk"); - CompoundTag perkData = perkTag.getCompound("data"); - IPerk iPerk = PerkRegistry.getPerkMap().getOrDefault(ResourceLocation.tryParse(perkName), StarbunclePerk.INSTANCE); - perkList.add(iPerk); - this.perkTags.put(iPerk, perkData); - } - } - perks = ImmutableList.copyOf(perkList); - } - - @Override - public void writeToNBT(CompoundTag tag) { - ListTag listTag = new ListTag(); - getPerks().forEach((perk) -> { - CompoundTag perkTag = new CompoundTag(); - perkTag.putString("perk", perk.getRegistryName().toString()); - perkTag.put("data", perkTags.getOrDefault(perk, new CompoundTag())); - listTag.add(perkTag); - }); - tag.putInt("tier", tier); - tag.put("perks", listTag); - } - - @Override - public List getPerks() { - return perks; - } - - @Override - public void setPerks(List perks) { - this.perks = new ArrayList<>(perks); - writeItem(); - } - - public int getTier() { - return this.tier; - } - - public void setTier(int tier) { - this.tier = tier; - writeItem(); - } - - @Override - public @Nullable CompoundTag getTagForPerk(IPerk perk) { - return this.perkTags.getOrDefault(perk, null); - } - - @Override - public void setTagForPerk(IPerk perk, CompoundTag tag) { - perkTags.put(perk, tag); - writeItem(); - } - - @Override - public String getTagString() { - return "an_stack_perks"; - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/potion/IPotionProvider.java b/src/main/java/com/hollingsworth/arsnouveau/api/potion/IPotionProvider.java index 25f4c3282d..5b828b8605 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/potion/IPotionProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/potion/IPotionProvider.java @@ -1,8 +1,9 @@ package com.hollingsworth.arsnouveau.api.potion; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.alchemy.PotionContents; public interface IPotionProvider { - PotionData getPotionData(ItemStack stack); + PotionContents getPotionData(ItemStack stack); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/CraftingManager.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/CraftingManager.java index 9c85111c8f..45c3f3a460 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/CraftingManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/CraftingManager.java @@ -3,7 +3,9 @@ import com.hollingsworth.arsnouveau.api.util.NBTUtil; import com.hollingsworth.arsnouveau.common.block.tile.WixieCauldronTile; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -86,24 +88,23 @@ public void completeCraft(WixieCauldronTile tile){ this.craftCompleted = true; } - public void write(CompoundTag tag) { - CompoundTag stack = new CompoundTag(); - outputStack.save(stack); + public void write(HolderLookup.Provider provider, CompoundTag tag) { + Tag stack = outputStack.save(provider); tag.put("output_stack", stack); - NBTUtil.writeItems(tag, "progress", neededItems); - NBTUtil.writeItems(tag, "refund", remainingItems); + NBTUtil.writeItems(provider, tag, "progress", neededItems); + NBTUtil.writeItems(provider, tag, "refund", remainingItems); tag.putBoolean("completed", craftCompleted); } - public void read(CompoundTag tag){ - outputStack = ItemStack.of(tag.getCompound("output_stack")); - neededItems = NBTUtil.readItems(tag, "progress"); - remainingItems = NBTUtil.readItems(tag, "refund"); + public void read(HolderLookup.Provider provider, CompoundTag tag){ + outputStack = ItemStack.parseOptional(provider, tag.getCompound("output_stack")); + neededItems = NBTUtil.readItems(provider, tag, "progress"); + remainingItems = NBTUtil.readItems(provider, tag, "refund"); } - public static CraftingManager fromTag(CompoundTag tag){ + public static CraftingManager fromTag(HolderLookup.Provider provider, CompoundTag tag){ CraftingManager craftingManager = tag.getBoolean("isPotion") ? new PotionCraftingManager() : new CraftingManager(); - craftingManager.read(tag); + craftingManager.read(provider, tag); return craftingManager; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java index 4ca064aaae..868d0a0736 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java @@ -1,15 +1,15 @@ package com.hollingsworth.arsnouveau.api.recipe; -import com.hollingsworth.arsnouveau.api.potion.PotionData; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.common.block.tile.WixieCauldronTile; import com.hollingsworth.arsnouveau.common.entity.EntityFlyingItem; +import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.common.util.PotionUtil; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.Level; @@ -79,8 +79,8 @@ public void completeCraft(WixieCauldronTile tile) { @Override - public void write(CompoundTag tag) { - super.write(tag); + public void write(HolderLookup.Provider provider, CompoundTag tag) { + super.write(provider, tag); CompoundTag outputTag = new CompoundTag(); PotionUtil.addPotionToTag(potionOut, outputTag); tag.put("potionout", outputTag); @@ -91,8 +91,8 @@ public void write(CompoundTag tag) { tag.putBoolean("gotPotion", hasObtainedPotion); } - public void read(CompoundTag tag){ - super.read(tag); + public void read(HolderLookup.Provider provider, CompoundTag tag){ + super.read(provider, tag); potionOut = PotionUtils.getPotion(tag.getCompound("potionout")); potionNeeded = PotionUtils.getPotion(tag.getCompound("potionNeeded")); hasObtainedPotion = tag.getBoolean("gotPotion"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/NBTUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/NBTUtil.java index 4f5b730775..46ad4af104 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/NBTUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/NBTUtil.java @@ -1,7 +1,9 @@ package com.hollingsworth.arsnouveau.api.util; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; @@ -65,7 +67,7 @@ public static boolean hasBlockPos(CompoundTag tag, String prefix) { return tag.contains(prefix + "_x"); } - public static List readItems(CompoundTag tag, String prefix) { + public static List readItems(HolderLookup.Provider pRegistries, CompoundTag tag, String prefix) { List stacks = new ArrayList<>(); if (tag == null) @@ -75,7 +77,7 @@ public static List readItems(CompoundTag tag, String prefix) { int numItems = itemsTag.getInt("itemsSize"); for (int i = 0; i < numItems; i++) { String key = prefix + "_" + i; - stacks.add(ItemStack.of(itemsTag.getCompound(key))); + stacks.add(ItemStack.parseOptional(pRegistries, itemsTag.getCompound(key))); } } catch (Exception e) { e.printStackTrace(); @@ -83,12 +85,11 @@ public static List readItems(CompoundTag tag, String prefix) { return stacks; } - public static void writeItems(CompoundTag tag, String prefix, List items) { + public static void writeItems(HolderLookup.Provider pRegistries, CompoundTag tag, String prefix, List items) { CompoundTag allItemsTag = new CompoundTag(); for (int i = 0; i < items.size(); i++) { ItemStack stack = items.get(i); - CompoundTag itemTag = new CompoundTag(); - stack.save(itemTag); + Tag itemTag = stack.save(pRegistries); allItemsTag.put(prefix + "_" + i, itemTag); } allItemsTag.putInt("itemsSize", items.size()); @@ -122,7 +123,7 @@ public static void writeResourceLocations(CompoundTag tag, String prefix, Collec } public static List readResourceLocations(CompoundTag tag, String prefix) { - return readStrings(tag, prefix).stream().map(ResourceLocation::new).collect(Collectors.toList()); + return readStrings(tag, prefix).stream().map(ResourceLocation::tryParse).collect(Collectors.toList()); } public static String getItemKey(ItemStack stack, String prefix) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java index a57732147a..69dc51b167 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.common.items.data.ItemScrollData; import com.hollingsworth.arsnouveau.setup.config.Config; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.ByteBufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; @@ -58,7 +59,7 @@ public static void renderOverlay(GuiGraphics graphics, DeltaTracker tracker) { iTooltipProvider.getTooltip(tooltip); } if (result.getEntity() instanceof ItemFrame frame) { - ItemScrollData.ItemScrollData data = new ItemScrollData.ItemScrollData(frame.getItem()); + ItemScrollData data = frame.getItem().getOrDefault(DataComponentRegistry.ITEM_SCROLL_DATA, new ItemScrollData(List.of())); for(ItemStack i : data.getItems()){ tooltip.add(i.getHoverName()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ArmorUpgradeRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ArmorUpgradeRecipeCategory.java index a3f1ad8981..23ed98d636 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ArmorUpgradeRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ArmorUpgradeRecipeCategory.java @@ -1,10 +1,10 @@ package com.hollingsworth.arsnouveau.client.jei; -import com.hollingsworth.arsnouveau.api.perk.ArmorPerkHolder; import com.hollingsworth.arsnouveau.api.perk.IPerkProvider; import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; import com.hollingsworth.arsnouveau.common.armor.AnimatedMagicArmor; import com.hollingsworth.arsnouveau.common.crafting.recipes.ArmorUpgradeRecipe; +import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.gui.ingredient.IRecipeSlotsView; import mezz.jei.api.helpers.IGuiHelper; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index 6dd256d019..f6aad5cc98 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -3,9 +3,8 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.camera.ICameraMountable; import com.hollingsworth.arsnouveau.api.item.ICasterTool; -import com.hollingsworth.arsnouveau.api.perk.ArmorPerkHolder; import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; -import com.hollingsworth.arsnouveau.api.potion.PotionData; +import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.api.util.PerkUtil; import com.hollingsworth.arsnouveau.client.gui.GuiEntityInfoHUD; import com.hollingsworth.arsnouveau.client.gui.GuiManaHUD; @@ -19,6 +18,7 @@ import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.common.block.tile.PotionMelderTile; import com.hollingsworth.arsnouveau.common.items.PotionFlask; +import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; import com.hollingsworth.arsnouveau.common.util.CameraUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java index 6ab8868dc8..e1fe613ee1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.items.FlaskCannon; +import com.hollingsworth.arsnouveau.common.items.data.PotionLauncherData; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.model.geom.EntityModelSet; @@ -33,7 +34,7 @@ public void renderRecursively(PoseStack poseStack, FlaskCannon animatable, GeoBo super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, packedColor); return; } - FlaskCannon.PotionLauncherData flask = new FlaskCannon.PotionLauncherData(currentItemStack); + PotionLauncherData flask = new PotionLauncherData(currentItemStack); if(bone == null) return; if(bone.getName().equalsIgnoreCase("full")){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java index 887c3b9fb6..7789db5768 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java @@ -2,13 +2,13 @@ import com.google.common.collect.Maps; import com.hollingsworth.arsnouveau.api.perk.PerkSlot; -import com.hollingsworth.arsnouveau.api.perk.StackPerkHolder; import com.hollingsworth.arsnouveau.api.util.PerkUtil; import com.hollingsworth.arsnouveau.client.ClientInfo; import com.hollingsworth.arsnouveau.client.renderer.item.GenericItemBlockRenderer; import com.hollingsworth.arsnouveau.common.block.AlterationTable; import com.hollingsworth.arsnouveau.common.block.ThreePartBlock; import com.hollingsworth.arsnouveau.common.block.tile.AlterationTile; +import com.hollingsworth.arsnouveau.common.items.data.StackPerkHolder; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java index b5a4320236..77ff1d95f2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java @@ -11,6 +11,7 @@ import com.hollingsworth.arsnouveau.client.renderer.item.ArmorRenderer; import com.hollingsworth.arsnouveau.client.renderer.tile.GenericModel; import com.hollingsworth.arsnouveau.common.crafting.recipes.IDyeable; +import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; import com.hollingsworth.arsnouveau.common.perk.RepairingPerk; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.MaterialRegistry; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/AlterationTable.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/AlterationTable.java index f60c98c1b5..4aef524a4c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/AlterationTable.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/AlterationTable.java @@ -1,16 +1,15 @@ package com.hollingsworth.arsnouveau.common.block; import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; -import com.hollingsworth.arsnouveau.api.perk.StackPerkHolder; import com.hollingsworth.arsnouveau.api.util.PerkUtil; import com.hollingsworth.arsnouveau.common.block.tile.AlterationTile; import com.hollingsworth.arsnouveau.common.items.PerkItem; +import com.hollingsworth.arsnouveau.common.items.data.StackPerkHolder; import com.hollingsworth.arsnouveau.common.util.PortUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java index cbeaaeeaf5..cb0fcc7ba8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java @@ -4,14 +4,13 @@ import com.hollingsworth.arsnouveau.common.block.tile.PortalTile; import com.hollingsworth.arsnouveau.common.datagen.BlockTagProvider; import com.hollingsworth.arsnouveau.common.items.DominionWand; -import com.hollingsworth.arsnouveau.common.items.WarpScroll; +import com.hollingsworth.arsnouveau.common.items.data.WarpScrollData; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; @@ -37,6 +36,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; + import javax.annotation.Nullable; import static com.hollingsworth.arsnouveau.setup.config.ServerConfig.ENABLE_WARP_PORTALS; @@ -131,13 +131,13 @@ public void entityInside(BlockState state, Level worldIn, BlockPos pos, Entity e } } - public boolean trySpawnPortal(Level worldIn, BlockPos stackPos, WarpScroll.WarpScrollData data, String displayName) { + public boolean trySpawnPortal(Level worldIn, BlockPos stackPos, WarpScrollData data, String displayName) { if (!ENABLE_WARP_PORTALS.get()) return false; return trySpawnVerticalPortal(worldIn, stackPos, data, displayName) || trySpawnHorizontalPortal(worldIn, stackPos, data, displayName); } - public boolean trySpawnVerticalPortal(LevelAccessor worldIn, BlockPos stackPos, WarpScroll.WarpScrollData data, String displayName) { + public boolean trySpawnVerticalPortal(LevelAccessor worldIn, BlockPos stackPos, WarpScrollData data, String displayName) { Size portalblock$size = this.isPortal(worldIn, stackPos); if (portalblock$size != null) { portalblock$size.placePortalBlocks(data, displayName); @@ -147,15 +147,15 @@ public boolean trySpawnVerticalPortal(LevelAccessor worldIn, BlockPos stackPos, } } - public boolean trySpawnHorizontalPortal(Level worldIn, BlockPos stackPos, WarpScroll.WarpScrollData data, String displayName) { + public boolean trySpawnHorizontalPortal(Level worldIn, BlockPos stackPos, WarpScrollData data, String displayName) { FlatPortalAreaHelper helper = new FlatPortalAreaHelper().init(worldIn, stackPos, null, (bs) -> bs.is(BlockTagProvider.DECORATIVE_AN)); if (helper.isValidFrame()) { BlockPos.betweenClosed(helper.lowerCorner, helper.lowerCorner.relative(Direction.Axis.X, helper.xSize - 1).relative(Direction.Axis.Z, helper.zSize - 1)).forEach((blockPos) -> { worldIn.setBlock(blockPos, BlockRegistry.PORTAL_BLOCK.defaultBlockState().setValue(PortalBlock.AXIS, Direction.Axis.Y), 18); if (worldIn.getBlockEntity(blockPos) instanceof PortalTile tile) { - tile.warpPos = data.getPos(); - tile.dimID = data.getDimension(); - tile.rotationVec = data.getRotation(); + tile.warpPos = data.pos(); + tile.dimID = data.dimension(); + tile.rotationVec = data.rotation(); tile.displayName = displayName; tile.isHorizontal = true; tile.updateBlock(); @@ -348,16 +348,14 @@ public boolean isValid() { return this.bottomLeft != null && this.width >= 1 && this.width <= 21 && this.height >= 1 && this.height <= 21; } - public void placePortalBlocks(WarpScroll.WarpScrollData data, String displayName) { + public void placePortalBlocks(WarpScrollData data, String displayName) { for (int i = 0; i < this.width; ++i) { BlockPos blockpos = this.bottomLeft.relative(this.rightDir, i); for (int j = 0; j < this.height; ++j) { this.world.setBlock(blockpos.above(j), BlockRegistry.PORTAL_BLOCK.defaultBlockState().setValue(PortalBlock.AXIS, this.axis), 18); if (this.world.getBlockEntity(blockpos.above(j)) instanceof PortalTile tile) { - tile.warpPos = data.getPos(); - tile.dimID = data.getDimension(); - tile.rotationVec = data.getRotation(); + tile.setFromScroll(data); tile.displayName = displayName; tile.updateBlock(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java index 68444bee5c..d5dd0d5e6d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java @@ -1,22 +1,23 @@ package com.hollingsworth.arsnouveau.common.block; -import com.hollingsworth.arsnouveau.api.potion.PotionData; +import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.ItemInteractionResult; +import net.minecraft.world.effect.MobEffectInstance; 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.TooltipFlag; -import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; @@ -76,9 +77,9 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level PotionJarTile tile = (PotionJarTile) worldIn.getBlockEntity(pos); if (tile == null) return super.useItemOn(stack, state, worldIn, pos, player, handIn, hit); - Potion potion = PotionUtils.getPotion(stack); + PotionContents potion = stack.get(DataComponents.POTION_CONTENTS); - if (stack.getItem() == Items.POTION && potion != PotionContents.EMPTY) { + if (stack.getItem() == Items.POTION && potion != null && potion != PotionContents.EMPTY) { if (tile.canAccept(new PotionData(stack),100)) { tile.add(new PotionData(stack), 100); if (!player.isCreative()) { @@ -89,16 +90,22 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level return super.useItemOn(stack, state, worldIn, pos, player, handIn, hit); }else if (stack.getItem() == Items.GLASS_BOTTLE && tile.getAmount() >= 100) { ItemStack potionStack = new ItemStack(Items.POTION); - PotionUtils.setPotion(potionStack, tile.getData().getPotion()); - PotionUtils.setCustomEffects(potionStack, tile.getData().getCustomEffects()); + PotionContents contents = tile.getData().getPotion(); + for(MobEffectInstance instance : tile.getData().getCustomEffects()){ + contents = contents.withEffectAdded(instance); + } + potionStack.set(DataComponents.POTION_CONTENTS, contents); if(player.addItem(potionStack)) { player.getItemInHand(handIn).shrink(1); tile.remove(100); } }else if(stack.getItem() == Items.ARROW && tile.getAmount() >= 10){ ItemStack potionStack = new ItemStack(Items.TIPPED_ARROW); - PotionUtils.setPotion(potionStack, tile.getData().getPotion()); - PotionUtils.setCustomEffects(potionStack, tile.getData().getCustomEffects()); + PotionContents contents = tile.getData().getPotion(); + for(MobEffectInstance instance : tile.getData().getCustomEffects()){ + contents = contents.withEffectAdded(instance); + } + potionStack.set(DataComponents.POTION_CONTENTS, contents); if(player.addItem(potionStack)) { player.getItemInHand(handIn).shrink(1); tile.remove(10); @@ -125,7 +132,6 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { @Override public void appendHoverText(ItemStack stack, Item.TooltipContext pContext, List tooltip, TooltipFlag pTooltipFlag) { - super.appendHoverText(stack, pContext, pTootipComponents, pTooltipFlag); if (stack.getTag() == null) return; int fill = stack.getTag().getCompound("BlockEntityTag").getInt("currentFill"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java index 9f33120863..304c5c4a3d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java @@ -3,12 +3,12 @@ import com.hollingsworth.arsnouveau.api.perk.IPerk; import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; import com.hollingsworth.arsnouveau.api.perk.PerkSlot; -import com.hollingsworth.arsnouveau.api.perk.StackPerkHolder; import com.hollingsworth.arsnouveau.api.util.PerkUtil; import com.hollingsworth.arsnouveau.common.block.AlterationTable; import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.block.ThreePartBlock; import com.hollingsworth.arsnouveau.common.items.PerkItem; +import com.hollingsworth.arsnouveau.common.items.data.StackPerkHolder; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java index 1640772551..974369926a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java @@ -5,7 +5,7 @@ import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.block.PortalBlock; import com.hollingsworth.arsnouveau.common.entity.EntityFollowProjectile; -import com.hollingsworth.arsnouveau.common.items.WarpScroll; +import com.hollingsworth.arsnouveau.common.items.data.WarpScrollData; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketWarpPosition; import net.minecraft.core.BlockPos; @@ -65,10 +65,10 @@ public void warp(Entity e) { } } - public void setFromScroll(WarpScroll.WarpScrollData scrollData){ - this.warpPos = scrollData.getPos(); - this.dimID = scrollData.getDimension(); - this.rotationVec = scrollData.getRotation(); + public void setFromScroll(WarpScrollData scrollData){ + this.warpPos = scrollData.pos(); + this.dimID = scrollData.dimension(); + this.rotationVec = scrollData.rotation(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java index a47220b837..570651d2bf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.api.item.IWandable; -import com.hollingsworth.arsnouveau.api.potion.PotionData; +import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.api.util.NBTUtil; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ColorPos; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java index 42e2b31119..19bf3f586f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.api.item.IWandable; -import com.hollingsworth.arsnouveau.api.potion.PotionData; +import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.common.block.SourceJar; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java index da3b898af5..0efe9f1e28 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.api.item.IWandable; -import com.hollingsworth.arsnouveau.api.potion.PotionData; +import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.api.util.BlockUtil; import com.hollingsworth.arsnouveau.api.util.NBTUtil; import com.hollingsworth.arsnouveau.api.util.SourceUtil; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java index a9e4f1c890..b6241b7c9b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java @@ -88,8 +88,8 @@ public void castSpell(Entity entity) { } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + super.saveAdditional(tag, pRegistries); tag.put("spell", spell.serialize()); tag.putBoolean("charged", isCharged); tag.putBoolean("redstone", disabled); @@ -111,7 +111,6 @@ protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries if (tag.contains("uuid")) this.uuid = tag.getUUID("uuid"); this.isSensitive = tag.getBoolean("sensitive"); - super.load(tag); } @Override @@ -155,7 +154,7 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { @Override public void getTooltip(List tooltip) { - if (ArsNouveau.proxy.getPlayer().hasEffect(ModPotions.MAGIC_FIND_EFFECT.get())) { + if (ArsNouveau.proxy.getPlayer().hasEffect(ModPotions.MAGIC_FIND_EFFECT)) { tooltip.add(Component.literal(spell.getDisplayString())); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java index 0de10827be..f56ab75747 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java @@ -10,12 +10,11 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.entity.EntityFollowProjectile; import com.hollingsworth.arsnouveau.common.entity.Whirlisprig; -import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.config.Config; +import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; @@ -26,14 +25,10 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; -import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.ArrayList; @@ -230,7 +225,7 @@ public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { tag.putInt("progress", progress); tag.putInt("evalTicks", ticksToNextEval); if (ignoreItems != null && !ignoreItems.isEmpty()) - NBTUtil.writeItems(tag, "ignored_", ignoreItems); + NBTUtil.writeItems(pRegistries, tag, "ignored_", ignoreItems); } @Override @@ -240,7 +235,7 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis diversityScore = compound.getInt("diversityScore"); progress = compound.getInt("progress"); ticksToNextEval = compound.getInt("evalTicks"); - ignoreItems = NBTUtil.readItems(compound, "ignored_"); + ignoreItems = NBTUtil.readItems(pRegistries, compound, "ignored_"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java index 9c06db1a21..b25a2a437b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.api.item.IWandable; -import com.hollingsworth.arsnouveau.api.potion.PotionData; +import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.api.recipe.*; import com.hollingsworth.arsnouveau.api.util.SourceUtil; import com.hollingsworth.arsnouveau.client.particle.ColorPos; @@ -28,7 +28,6 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.item.crafting.Ingredient; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java index 6db246724a..726c88cb87 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java @@ -1,8 +1,8 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; -import com.hollingsworth.arsnouveau.api.perk.ArmorPerkHolder; import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; import com.hollingsworth.arsnouveau.api.util.PerkUtil; +import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CheatSerializer.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CheatSerializer.java index 9615bd74d1..bb15ad0843 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CheatSerializer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CheatSerializer.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; +import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; @@ -11,16 +12,28 @@ public class CheatSerializer { public static StreamCodec create(MapCodec codec){ + return create(codec.codec()); + } + + public static StreamCodec create(Codec codec){ return StreamCodec.of( (buf, val) -> CheatSerializer.toNetwork(codec, buf, val), (buf) -> CheatSerializer.fromNetwork(codec, buf) ); } public static T fromNetwork(MapCodec codec, RegistryFriendlyByteBuf friendlyByteBuf) { - return friendlyByteBuf.readJsonWithCodec(codec.codec()); + return fromNetwork(codec.codec(), friendlyByteBuf); } public static void toNetwork(MapCodec codec, RegistryFriendlyByteBuf friendlyByteBuf, T obj) { - friendlyByteBuf.writeJsonWithCodec(codec.codec(), obj); + toNetwork(codec.codec(), friendlyByteBuf, obj); + } + + public static T fromNetwork(Codec codec, RegistryFriendlyByteBuf friendlyByteBuf) { + return friendlyByteBuf.readJsonWithCodec(codec); + } + + public static void toNetwork(Codec codec, RegistryFriendlyByteBuf friendlyByteBuf, T obj) { + friendlyByteBuf.writeJsonWithCodec(codec, obj); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java index 3716af7256..35663fa2d1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java @@ -1,13 +1,10 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; -import com.hollingsworth.arsnouveau.api.potion.PotionData; +import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.common.items.PotionFlask; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -import com.mojang.serialization.MapCodec; import net.minecraft.core.HolderLookup; import net.minecraft.core.NonNullList; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.PotionItem; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java index d4746e723d..11f87350ad 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; -import com.hollingsworth.arsnouveau.api.potion.PotionData; +import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.block.tile.IAnimationListener; import com.hollingsworth.arsnouveau.common.entity.EntityWixie; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionStoreGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionStoreGoal.java index f50f09e3ed..5769a55ace 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionStoreGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionStoreGoal.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.common.entity.goal.carbuncle; -import com.hollingsworth.arsnouveau.api.potion.PotionData; +import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.common.entity.Starbuncle; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java index bc4d8eb8ed..0c7b839882 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.entity.goal.carbuncle; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.potion.PotionData; +import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.common.entity.Starbuncle; import com.hollingsworth.arsnouveau.common.util.PortUtil; @@ -17,7 +17,7 @@ import net.minecraft.world.item.alchemy.PotionContents; import org.jetbrains.annotations.Nullable; -import java.util.List; +import java.util.function.Consumer; public class StarbyPotionBehavior extends StarbyListBehavior { public static final ResourceLocation POTION_ID = ArsNouveau.prefix( "starby_potion"); @@ -106,10 +106,10 @@ public int getAmount() { } @Override - public void getTooltip(List tooltip) { + public void getTooltip(Consumer tooltip) { super.getTooltip(tooltip); - tooltip.add(Component.translatable("ars_nouveau.starbuncle.storing_potions", TO_LIST.size())); - tooltip.add(Component.translatable("ars_nouveau.starbuncle.taking_potions", FROM_LIST.size())); + tooltip.accept(Component.translatable("ars_nouveau.starbuncle.storing_potions", TO_LIST.size())); + tooltip.accept(Component.translatable("ars_nouveau.starbuncle.taking_potions", FROM_LIST.size())); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java index caf658b9cb..7006878fc0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java @@ -34,6 +34,7 @@ import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; public class StarbyTransportBehavior extends StarbyListBehavior { public static Cache> frameCache = CacheBuilder.newBuilder() @@ -278,12 +279,12 @@ public CompoundTag toTag(CompoundTag tag) { } @Override - public void getTooltip(List tooltip) { + public void getTooltip(Consumer tooltip) { super.getTooltip(tooltip); - tooltip.add(Component.translatable("ars_nouveau.starbuncle.storing", TO_LIST.size())); - tooltip.add(Component.translatable("ars_nouveau.starbuncle.taking", FROM_LIST.size())); + tooltip.accept(Component.translatable("ars_nouveau.starbuncle.storing", TO_LIST.size())); + tooltip.accept(Component.translatable("ars_nouveau.starbuncle.taking", FROM_LIST.size())); if (itemScroll != null && !itemScroll.isEmpty()) { - tooltip.add(Component.translatable("ars_nouveau.filtering_with", itemScroll.getHoverName().getString())); + tooltip.accept(Component.translatable("ars_nouveau.filtering_with", itemScroll.getHoverName().getString())); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/timed/BuildPortalEvent.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/timed/BuildPortalEvent.java index 89d578b5c3..6d4a0321d5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/timed/BuildPortalEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/timed/BuildPortalEvent.java @@ -6,7 +6,7 @@ import com.hollingsworth.arsnouveau.common.block.PortalBlock; import com.hollingsworth.arsnouveau.common.block.tile.PortalTile; import com.hollingsworth.arsnouveau.common.block.tile.TemporaryTile; -import com.hollingsworth.arsnouveau.common.items.WarpScroll; +import com.hollingsworth.arsnouveau.common.items.data.WarpScrollData; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.SoundRegistry; @@ -31,9 +31,9 @@ public class BuildPortalEvent implements ITimedEvent { List portalPos = new ArrayList<>(); int ticks; List placedBlocks = new ArrayList<>(); - WarpScroll.WarpScrollData warpScrollData; + WarpScrollData warpScrollData; - public BuildPortalEvent(Level level, BlockPos targetPos, Direction direction, WarpScroll.WarpScrollData warpScrollData) { + public BuildPortalEvent(Level level, BlockPos targetPos, Direction direction, WarpScrollData warpScrollData) { this.level = level; this.targetPos = targetPos; this.direction = direction; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java index 8b8a0f6004..07f61af46f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.item.IRadialProvider; -import com.hollingsworth.arsnouveau.api.potion.PotionData; +import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenuSlot; @@ -17,6 +17,7 @@ import net.minecraft.world.item.ArrowItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.alchemy.PotionContents; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; @@ -48,8 +49,8 @@ public void onRadialKeyPressed(ItemStack stack, Player player) { if(slots.size() >= 9) break; ItemStack item = player.inventory.getItem(i); - PotionData potionData = new PotionData(item); - if(potionData.isEmpty() || item.getItem() instanceof ArrowItem) + PotionContents contents = PotionData.from(item); + if(contents == null || item.getItem() instanceof ArrowItem) continue; slots.add(new RadialMenuSlot<>(item.getHoverName().getString(), new AlchemistsCrown.SlotData(i, item))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java index e2ad92e7dc..f84da6464d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java @@ -2,15 +2,13 @@ import com.hollingsworth.arsnouveau.api.entity.IDecoratable; import com.hollingsworth.arsnouveau.api.item.IWandable; -import com.hollingsworth.arsnouveau.api.nbt.ItemstackData; -import com.hollingsworth.arsnouveau.api.util.NBTUtil; +import com.hollingsworth.arsnouveau.common.items.data.DominionWandData; import com.hollingsworth.arsnouveau.common.network.HighlightAreaPacket; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; @@ -24,7 +22,6 @@ import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; -import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -40,15 +37,15 @@ public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pS if (!pIsSelected || pLevel.isClientSide || pLevel.getGameTime() % 5 != 0) { return; } - DominionData data = new DominionData(pStack); - BlockPos pos = data.storedPos; + DominionWandData data = pStack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()); + BlockPos pos = data.storedPos(); if (pos != null) { if (pLevel.getBlockEntity(pos) instanceof IWandable wandable) { Networking.sendToPlayerClient(new HighlightAreaPacket(wandable.getWandHighlight(new ArrayList<>()), 10), (ServerPlayer) pEntity); } return; } - if (data.getEntity(pLevel) instanceof IWandable wandable) { + if (pLevel.getEntity(data.getStoredEntity()) instanceof IWandable wandable) { Networking.sendToPlayerClient(new HighlightAreaPacket(wandable.getWandHighlight(new ArrayList<>()), 10), (ServerPlayer) pEntity); } } @@ -60,7 +57,7 @@ public InteractionResult interactLivingEntity(ItemStack doNotUseStack, Player pl return InteractionResult.PASS; ItemStack stack = playerEntity.getItemInHand(hand); - DominionData data = new DominionData(stack); + DominionWandData data = stack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()); if (playerEntity.isShiftKeyDown() && target instanceof IWandable wandable) { wandable.onWanded(playerEntity); clear(stack, playerEntity); @@ -68,18 +65,18 @@ public InteractionResult interactLivingEntity(ItemStack doNotUseStack, Player pl } // If the wand has nothing, store it if (!data.hasStoredData()) { - data.setStoredEntityID(target.getId()); + stack.set(DataComponentRegistry.DOMINION_WAND, data.storeEntity(target.getId())); PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.dominion_wand.stored_entity")); return InteractionResult.SUCCESS; } Level world = playerEntity.getCommandSenderWorld(); - if (data.getStoredPos() != null && world.getBlockEntity(data.getStoredPos()) instanceof IWandable wandable) { - wandable.onFinishedConnectionFirst(data.getStoredPos(), data.getFace(), target, playerEntity); + if (data.storedPos() != null && world.getBlockEntity(data.storedPos()) instanceof IWandable wandable) { + wandable.onFinishedConnectionFirst(data.storedPos(), data.face(), target, playerEntity); } if (target instanceof IWandable wandable) { - wandable.onFinishedConnectionLast(data.getStoredPos(), data.getFace(), target, playerEntity); + wandable.onFinishedConnectionLast(data.storedPos(), data.face(), target, playerEntity); clear(stack, playerEntity); } @@ -95,18 +92,20 @@ public boolean doesSneakBypassUse(ItemStack stack, LevelReader world, BlockPos p } public void clear(ItemStack stack, Player player) { - DominionData data = new DominionData(stack); - data.setStoredPos(null); - data.setStoredEntityID(-1); - data.setFacing(null); + DominionWandData data = stack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()) + .setFace(null) + .storeEntity(DominionWandData.NULL_ENTITY) + .storePos(null); + stack.set(DataComponentRegistry.DOMINION_WAND, data); } @Override public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) { ItemStack stack = pPlayer.getItemInHand(pUsedHand); - DominionData data = new DominionData(stack); + DominionWandData data = stack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()); if (pPlayer.isShiftKeyDown() && !data.hasStoredData()) { - data.changeMode(); + data = data.toggleMode(); + stack.set(DataComponentRegistry.DOMINION_WAND, data); } return super.use(pLevel, pPlayer, pUsedHand); } @@ -119,7 +118,7 @@ public InteractionResult useOn(UseOnContext context) { Level world = context.getLevel(); Player playerEntity = context.getPlayer(); ItemStack stack = context.getItemInHand(); - DominionData data = new DominionData(stack); + DominionWandData data = stack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()); if (playerEntity.isShiftKeyDown() && world.getBlockEntity(pos) instanceof IWandable wandable && !data.hasStoredData()) { wandable.onWanded(playerEntity); @@ -128,20 +127,22 @@ public InteractionResult useOn(UseOnContext context) { } if (!data.hasStoredData()) { - data.setStoredPos(pos.immutable()); + stack.set(DataComponentRegistry.DOMINION_WAND, data.storePos(pos.immutable())); PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.dominion_wand.position_set")); return InteractionResult.SUCCESS; } - if (data.facing == null && data.strict) data.setFacing(context.getClickedFace()); + if (data.face() == null && data.strict()){ + stack.set(DataComponentRegistry.DOMINION_WAND, data.setFace(context.getClickedFace())); + } - if (data.getStoredPos() != null && world.getBlockEntity(data.getStoredPos()) instanceof IWandable wandable) { - wandable.onFinishedConnectionFirst(pos, data.getFace(), (LivingEntity) world.getEntity(data.getStoredEntityID()), playerEntity); + if (data.storedPos() != null && world.getBlockEntity(data.storedPos()) instanceof IWandable wandable) { + wandable.onFinishedConnectionFirst(pos, data.face(), (LivingEntity) world.getEntity(data.storedEntityId()), playerEntity); } if (world.getBlockEntity(pos) instanceof IWandable wandable) { - wandable.onFinishedConnectionLast(data.getStoredPos(), data.getFace(), (LivingEntity) world.getEntity(data.getStoredEntityID()), playerEntity); + wandable.onFinishedConnectionLast(data.storedPos(), data.face(), (LivingEntity) world.getEntity(data.storedEntityId()), playerEntity); } - if (data.getStoredEntityID() != -1 && world.getEntity(data.getStoredEntityID()) instanceof IWandable wandable) { - wandable.onFinishedConnectionFirst(pos, data.getFace(), null, playerEntity); + if (data.storedEntityId() != DominionWandData.NULL_ENTITY && world.getEntity(data.storedEntityId()) instanceof IWandable wandable) { + wandable.onFinishedConnectionFirst(pos, data.face(), null, playerEntity); } clear(stack, playerEntity); @@ -150,108 +151,30 @@ public InteractionResult useOn(UseOnContext context) { @Override public String getDescriptionId(ItemStack pStack) { - DominionData data = new DominionData(pStack); - if (data.strict) return super.getDescriptionId(pStack) + ".strict"; + DominionWandData data = pStack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()); + if (data.strict()) return super.getDescriptionId(pStack) + ".strict"; return super.getDescriptionId(pStack); } @Override public void appendHoverText(ItemStack stack, TooltipContext world, List tooltip, TooltipFlag p_77624_4_) { - DominionData data = new DominionData(stack); - if (data.getStoredEntityID() == -1) { + DominionWandData data = stack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()); + if (data.storedEntityId() == DominionWandData.NULL_ENTITY) { tooltip.add(Component.translatable("ars_nouveau.dominion_wand.no_entity")); } else { tooltip.add(Component.translatable("ars_nouveau.dominion_wand.entity_stored")); } - if (data.getStoredPos() == null) { + if (data.storedPos() == null) { tooltip.add(Component.translatable("ars_nouveau.dominion_wand.no_location")); } else { - tooltip.add(Component.translatable("ars_nouveau.dominion_wand.position_stored", getPosString(data.getStoredPos()))); + tooltip.add(Component.translatable("ars_nouveau.dominion_wand.position_stored", getPosString(data.storedPos()))); } - if (data.strict) tooltip.add(Component.literal("Side-Sensitive")); + if (data.strict()) tooltip.add(Component.literal("Side-Sensitive")); } public static String getPosString(BlockPos pos) { return Component.translatable("ars_nouveau.position", pos.getX(), pos.getY(), pos.getZ()).getString(); } - - public static class DominionData extends ItemstackData { - private BlockPos storedPos; - - public @Nullable Direction getFace() { - return facing; - } - - private @Nullable Direction facing = null; - - boolean strict = false; - - private int storedEntityID; - - public DominionData(ItemStack stack) { - super(stack); - CompoundTag tag = getItemTag(stack); - if (tag == null) { - return; - } - storedPos = NBTUtil.getNullablePos(tag, "stored"); - storedEntityID = tag.getInt("entityID"); - facing = tag.contains("facing") ? Direction.from3DDataValue(tag.getInt("facing")) : null; - strict = tag.getBoolean("mode"); - } - - public boolean hasStoredData() { - return getStoredPos() != null || getStoredEntityID() != -1; - } - - public @Nullable BlockPos getStoredPos() { - return storedPos == BlockPos.ZERO || storedPos == null ? null : storedPos.immutable(); - } - - public int getStoredEntityID() { - return storedEntityID == 0 ? -1 : storedEntityID; - } - - public @Nullable Entity getEntity(Level world) { - return world.getEntity(storedEntityID); - } - - public void setStoredPos(@Nullable BlockPos pos) { - storedPos = pos; - writeItem(); - } - - public void setStoredEntityID(int id) { - storedEntityID = id; - writeItem(); - } - - public void setFacing(Direction facing) { - this.facing = facing; - writeItem(); - } - - public void changeMode() { - strict = !strict; - writeItem(); - } - - @Override - public String getTagString() { - return "an_dominion_wand"; - } - - @Override - public void writeToNBT(CompoundTag tag) { - if (storedPos != null) { - NBTUtil.storeBlockPos(tag, "stored", storedPos); - } - if (facing != null) tag.putInt("facing", facing.ordinal()); - tag.putInt("entityID", storedEntityID); - tag.putBoolean("mode", strict); - } - } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java index 38b1486613..bd36103ef0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java @@ -1,8 +1,7 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.item.IRadialProvider; -import com.hollingsworth.arsnouveau.api.nbt.ItemstackData; -import com.hollingsworth.arsnouveau.api.potion.PotionData; +import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenuSlot; @@ -10,13 +9,13 @@ import com.hollingsworth.arsnouveau.client.registry.ModKeyBindings; import com.hollingsworth.arsnouveau.client.renderer.item.FlaskCannonRenderer; import com.hollingsworth.arsnouveau.client.renderer.tile.GenericModel; +import com.hollingsworth.arsnouveau.common.items.data.PotionLauncherData; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketSetLauncher; import com.hollingsworth.arsnouveau.common.util.PortUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; @@ -215,81 +214,4 @@ public BlockEntityWithoutLevelRenderer getCustomRenderer() { } } - public static class PotionLauncherData extends ItemstackData { - private PotionData lastDataForRender; - private int lastSlot; - public int amountLeft; - - public PotionLauncherData(ItemStack stack) { - super(stack); - CompoundTag tag = getItemTag(stack); - if(tag == null) - return; - lastDataForRender = PotionData.fromTag(tag.getCompound("lastDataForRender")); - lastSlot = tag.getInt("lastSlot"); - amountLeft = tag.getInt("amountLeft"); - } - - public PotionData getPotionDataFromSlot(Player player){ - if(lastSlot < 0 || lastSlot >= player.inventory.getContainerSize()) - return new PotionData(); - ItemStack stack = player.inventory.getItem(lastSlot); - return new PotionData(stack); - } - - public PotionData expendPotion(Player player){ - if(lastSlot >= player.inventory.getContainerSize()) - return new PotionData(); - ItemStack item = player.inventory.getItem(lastSlot); - if(item.getItem() instanceof PotionFlask){ - PotionFlask.FlaskData flaskData = new PotionFlask.FlaskData(item); - if(flaskData.getCount() <= 0 || flaskData.getPotion().isEmpty()) - return new PotionData(); - PotionData data = flaskData.getPotion().clone(); - flaskData.setCount(flaskData.getCount() - 1); - setAmountLeft(flaskData.getCount()); - return data; - }else if(item.getItem() instanceof PotionItem){ - PotionData data = new PotionData(item).clone(); - if(data.isEmpty()) - return new PotionData(); - item.shrink(1); - player.inventory.add(new ItemStack(Items.GLASS_BOTTLE)); - setAmountLeft(0); - return data; - } - return new PotionData(); - } - - public void setAmountLeft(int amount){ - amountLeft = amount; - writeItem(); - } - - public void setLastSlot(int lastSlot) { - this.lastSlot = lastSlot; - writeItem(); - } - - public void setLastDataForRender(PotionData lastDataForRender) { - this.lastDataForRender = lastDataForRender; - writeItem(); - } - - @Override - public void writeToNBT(CompoundTag tag) { - tag.putInt("lastSlot", lastSlot); - tag.put("lastDataForRender", lastDataForRender.toTag()); - tag.putInt("amountLeft", amountLeft); - } - - public PotionData getLastDataForRender() { - return lastDataForRender; - } - - @Override - public String getTagString() { - return "potion_launcher"; - } - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java index ff90980712..0e33b93241 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.common.items; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.renderer.item.MobJarItemRenderer; import com.hollingsworth.arsnouveau.common.block.tile.MobJarTile; import com.hollingsworth.arsnouveau.common.lib.EntityTags; @@ -56,7 +57,7 @@ public void appendHoverText(ItemStack stack, TooltipContext pLevel, List 0 && jarTile.getMaxFill() - jarTile.getAmount() >= 0 && jarTile.canAccept(data.getPotion(), 100)) { - jarTile.add(data.getPotion(), 100); - data.setCount(data.getCount() - 1); - } - - if (!playerEntity.isShiftKeyDown() && !isMax(thisStack) && jarTile.getAmount() >= 100) { + if (playerEntity.isShiftKeyDown() && data.charges() > 0 && jarTile.getMaxFill() - jarTile.getAmount() >= 0 && jarTile.canAccept(data.contents(), 100)) { + jarTile.add(data.contents(), 100); + var contents = data.withCharges(data.charges() - 1); + thisStack.set(DataComponentRegistry.MULTI_POTION, contents); + }else if (!playerEntity.isShiftKeyDown() && !isMax(thisStack) && jarTile.getAmount() >= 100) { if (data.potionData.areSameEffects(jarTile.getData())) { - data.setCount(data.getCount() + 1); + var contents = data.withCharges(data.charges() + 1); jarTile.remove(100); - }else if (data.getCount() == 0){ - data.setPotion(jarTile.getData()); - data.setCount(data.getCount() + 1); + thisStack.set(DataComponentRegistry.MULTI_POTION, contents); + }else if (data.charges() == 0){ + var contents = new MultiPotionContents(1, jarTile.getData()); + thisStack.set(DataComponentRegistry.MULTI_POTION, contents); jarTile.remove(100); } } @@ -62,8 +61,8 @@ public InteractionResult useOn(UseOnContext context) { } public boolean isMax(ItemStack stack) { - FlaskData data = new FlaskData(stack); - return data.getCount() >= getMaxCapacity(); + MultiPotionContents data = stack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY)); + return data.charges() >= getMaxCapacity(); } public int getMaxCapacity() { @@ -75,8 +74,8 @@ public ItemStack finishUsingItem(ItemStack stack, Level worldIn, LivingEntity en Player playerentity = entityLiving instanceof Player player ? player : null; if (!worldIn.isClientSide) { - FlaskData data = new FlaskData(stack); - for (MobEffectInstance effectinstance : data.getPotion().fullEffects()) { + MultiPotionContents data = stack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY)); + for (MobEffectInstance effectinstance : data.contents().getAllEffects()) { effectinstance = getEffectInstance(effectinstance); if (effectinstance.getEffect().value().isInstantenous()) { effectinstance.getEffect().value().applyInstantenousEffect(playerentity, playerentity, entityLiving, effectinstance.getAmplifier(), 1.0D); @@ -84,7 +83,7 @@ public ItemStack finishUsingItem(ItemStack stack, Level worldIn, LivingEntity en entityLiving.addEffect(new MobEffectInstance(effectinstance)); } } - data.setCount(data.getCount() - 1); + stack.set(DataComponentRegistry.MULTI_POTION, data.withCharges(data.charges() - 1)); } return stack; } @@ -95,8 +94,8 @@ public ItemStack finishUsingItem(ItemStack stack, Level worldIn, LivingEntity en @Override public int getDamage(ItemStack stack) { - PotionFlask.FlaskData data = new PotionFlask.FlaskData(stack); - return (getMaxDamage(stack) - data.getCount()); + MultiPotionContents data = stack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY)); + return (getMaxDamage(stack) - data.charges()); } @Override @@ -135,102 +134,15 @@ public UseAnim getUseAnimation(ItemStack stack) { public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); - FlaskData data = new FlaskData(stack); - return data.getCount() > 0 ? ItemUtils.startUsingInstantly(worldIn, playerIn, handIn) : InteractionResultHolder.pass(playerIn.getItemInHand(handIn)); + MultiPotionContents data = stack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY)); + return data.charges() > 0 ? ItemUtils.startUsingInstantly(worldIn, playerIn, handIn) : InteractionResultHolder.pass(playerIn.getItemInHand(handIn)); } @Override public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip, TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip, flagIn); - FlaskData data = new FlaskData(stack); - tooltip.add(Component.translatable("ars_nouveau.flask.charges", data.getCount()).withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); - data.potionData.appendHoverText(tooltip); - } - - @Override - public PotionData getPotionData(ItemStack stack) { - FlaskData data = new FlaskData(stack); - return new EnchantedPotionData(data.potionData, data.stack.getItem()); - } - - public static class FlaskData extends ItemstackData { - private EnchantedPotionData potionData; - private int count; - - public FlaskData(ItemStack stack) { - super(stack); - CompoundTag tag = getItemTag(stack); - potionData = new EnchantedPotionData(); - if(tag == null) - return; - potionData = new EnchantedPotionData(PotionData.fromTag(tag.getCompound("PotionData")), stack.getItem()); - this.count = tag.getInt("count"); - } - - public void setCount(int count) { - this.count = Math.max(count, 0); - if(count <= 0){ - potionData = new EnchantedPotionData(); - } - writeItem(); - } - - public int getCount() { - return count; - } - - public void setPotion(PotionData potion) { - potionData = new EnchantedPotionData(potion, stack.getItem()); - writeItem(); - } - - public PotionData getPotion() { - return this.getCount() <= 0 ? new PotionData() : new EnchantedPotionData(potionData, stack.getItem()); - } - - @Override - public void writeToNBT(CompoundTag tag) { - tag.put("PotionData", potionData.toTag()); - tag.putInt("count", count); - } - - @Override - public String getTagString() { - return "an_potion_flask"; - } - } - - public static class EnchantedPotionData extends PotionData{ - public Item flaskPotion; - - public EnchantedPotionData(ItemStack stack) { - super(stack); - flaskPotion = stack.getItem(); - } - - public EnchantedPotionData(){ - super(); - } - - public EnchantedPotionData(PotionData potionData, Item item) { - super(potionData); - flaskPotion = item; - } - - @Override - public void applyEffects(Entity source, Entity inDirectSource, LivingEntity target) { - if(!(flaskPotion instanceof PotionFlask potionFlask)) { - super.applyEffects(source, inDirectSource, target); - return; - } - for (MobEffectInstance effectinstance : fullEffects()) { - effectinstance = potionFlask.getEffectInstance(effectinstance); - if (effectinstance.getEffect().value().isInstantenous()) { - effectinstance.getEffect().value().applyInstantenousEffect(source, inDirectSource, target, effectinstance.getAmplifier(), 1.0D); - } else { - target.addEffect(new MobEffectInstance(effectinstance), source); - } - } - } + MultiPotionContents data = stack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY)); + tooltip.add(Component.translatable("ars_nouveau.flask.charges", data.charges()).withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); + PotionContents.addPotionTooltip(data.contents().getAllEffects(), tooltip::add, 1.0F, context.tickRate()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Present.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Present.java index b3892eaa51..93ef5315b6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Present.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Present.java @@ -3,10 +3,10 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.loot.DungeonLootEnhancerModifier; import com.hollingsworth.arsnouveau.api.loot.DungeonLootTables; -import com.hollingsworth.arsnouveau.api.nbt.ItemstackData; import com.hollingsworth.arsnouveau.common.entity.Starbuncle; +import com.hollingsworth.arsnouveau.common.items.data.PresentData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.ChatFormatting; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; @@ -19,7 +19,6 @@ import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import java.util.List; -import java.util.UUID; public class Present extends ModItem{ @@ -32,10 +31,8 @@ public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pS super.inventoryTick(pStack, pLevel, pEntity, pSlotId, pIsSelected); if(pLevel.isClientSide) return; - PresentData data = new PresentData(pStack); - if(data.uuid == null && pEntity instanceof Player player){ - data.setName(player.getName().getString()); - data.setUUID(player.getUUID()); + if(pEntity instanceof Player player && !pStack.has(DataComponentRegistry.PRESENT)){ + pStack.set(DataComponentRegistry.PRESENT, new PresentData(player.getName().getString(), player.getUUID())); } } @@ -43,8 +40,10 @@ public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pS public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) { if(pLevel.isClientSide) return super.use(pLevel, pPlayer, pUsedHand); - PresentData presentData = new PresentData(pPlayer.getItemInHand(pUsedHand)); - int bonusRolls = presentData.uuid != null && !presentData.uuid.equals(pPlayer.getUUID()) ? 2 : 0; + PresentData presentData = pPlayer.getItemInHand(pUsedHand).get(DataComponentRegistry.PRESENT); + if(presentData == null) + return super.use(pLevel, pPlayer, pUsedHand); + int bonusRolls = presentData.uuid() != null && !presentData.uuid().equals(pPlayer.getUUID()) ? 2 : 0; DungeonLootEnhancerModifier modifier = new DungeonLootEnhancerModifier(new LootItemCondition[]{}, 0.5, 0.2, 0.1,3 + bonusRolls, 1 + bonusRolls, 1 + bonusRolls); List stacks = DungeonLootTables.getRandomRoll(modifier); @@ -64,52 +63,13 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte @Override public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); - PresentData data = new PresentData(stack); - if(data.uuid != null){ - if(data.uuid.equals(ArsNouveau.proxy.getPlayer().getUUID())){ + PresentData data = stack.get(DataComponentRegistry.PRESENT); + if(data != null && data.uuid() != null){ + if(data.uuid().equals(ArsNouveau.proxy.getPlayer().getUUID())){ tooltip2.add(Component.translatable("ars_nouveau.present.give")); }else { - tooltip2.add(Component.translatable("ars_nouveau.present.from", data.name).withStyle(ChatFormatting.GOLD)); + tooltip2.add(Component.translatable("ars_nouveau.present.from", data.name()).withStyle(ChatFormatting.GOLD)); } } } - - public static class PresentData extends ItemstackData{ - String name; - UUID uuid; - - public PresentData(ItemStack stack) { - super(stack); - CompoundTag tag = getItemTag(stack); - if(tag == null) - return; - this.name = tag.getString("name"); - if(tag.contains("uuid")) - this.uuid = tag.getUUID("uuid"); - } - - public void setName(String name){ - this.name = name; - writeItem(); - } - - public void setUUID(UUID uuid){ - this.uuid = uuid; - writeItem(); - } - - - @Override - public void writeToNBT(CompoundTag tag) { - if(name != null) - tag.putString("name", name); - if(uuid != null) - tag.putUUID("uuid", uuid); - } - - @Override - public String getTagString() { - return "an_present_data"; - } - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java index 65f9419298..85caaa859b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java @@ -2,7 +2,6 @@ import com.hollingsworth.arsnouveau.api.ANFakePlayer; import com.hollingsworth.arsnouveau.api.item.ICasterTool; -import com.hollingsworth.arsnouveau.api.nbt.ItemstackData; import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.IWrappedCaster; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.LivingCaster; @@ -10,8 +9,10 @@ import com.hollingsworth.arsnouveau.client.renderer.item.ScryCasterRenderer; import com.hollingsworth.arsnouveau.common.block.BasicSpellTurret; import com.hollingsworth.arsnouveau.common.block.ScryerCrystal; +import com.hollingsworth.arsnouveau.common.items.data.ScryData; import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -55,7 +56,7 @@ public ScryCaster() { public InteractionResult useOn(UseOnContext pContext) { BlockPos pos = pContext.getClickedPos(); ItemStack stack = pContext.getItemInHand(); - ScryCaster.Data data = new Data(stack); + ScryData.Data data = new ScryData(stack); if(pContext.getLevel().getBlockState(pos).getBlock() instanceof ScryerCrystal){ if(!pContext.getLevel().isClientSide) { data.setScryPos(pos); @@ -86,11 +87,11 @@ public ISpellCaster getSpellCaster(CompoundTag tag) { @Override public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { getInformation(stack, context, tooltip2, flagIn); - Data data = new Data(stack); - if(data.scryPos == null){ + ScryData data = stack.get(DataComponentRegistry.SCRY_DATA); + if(data == null || data.pos() == null){ tooltip2.add(Component.translatable("ars_nouveau.scry_caster.no_pos")); }else{ - tooltip2.add(Component.translatable("ars_nouveau.scryer_scroll.bound", data.getScryPos().getX() + ", " + data.getScryPos().getY() + ", " + data.getScryPos().getZ())); + tooltip2.add(Component.translatable("ars_nouveau.scryer_scroll.bound", data.pos().getX() + ", " + data.pos().getY() + ", " + data.pos().getZ())); } super.appendHoverText(stack, context, tooltip2, flagIn); } @@ -146,9 +147,9 @@ public InteractionResultHolder castSpell(Level worldIn, LivingEntity return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); } - ScryCaster.Data data = new Data(stack); + ScryData data = stack.get(DataComponentRegistry.SCRY_DATA); boolean playerHoldingScroll = entity.getItemInHand(InteractionHand.OFF_HAND).getItem() instanceof ScryerScroll; - BlockPos scryPos = playerHoldingScroll ? new ScryerScroll.ScryerScrollData(player.getItemInHand(InteractionHand.OFF_HAND)).pos : data.getScryPos(); + BlockPos scryPos = playerHoldingScroll ? new ScryerScroll.ScryerScrollData(player.getItemInHand(InteractionHand.OFF_HAND)).pos : data.pos(); if(scryPos == null){ PortUtil.sendMessage(entity, Component.translatable("ars_nouveau.scry_caster.no_pos")); return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); @@ -184,40 +185,4 @@ public InteractionResultHolder castSpell(Level worldIn, LivingEntity return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); } } - - - public static class Data extends ItemstackData{ - private BlockPos scryPos; - - public Data(ItemStack stack) { - super(stack); - CompoundTag tag1 = getItemTag(stack); - if (tag1 == null || tag1.isEmpty()) - return; - if(tag1.contains("scryPos")){ - scryPos = BlockPos.of(tag1.getLong("scryPos")); - } - } - - public void setScryPos(BlockPos pos){ - this.scryPos = pos; - writeItem(); - } - - public @Nullable BlockPos getScryPos(){ - return scryPos; - } - - @Override - public String getTagString() { - return "an_scry_data"; - } - - @Override - public void writeToNBT(CompoundTag tag) { - if(scryPos != null){ - tag.putLong("scryPos", scryPos.asLong()); - } - } - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java index 660c68a31e..c16b994fb9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java @@ -1,17 +1,15 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.camera.ICameraMountable; -import com.hollingsworth.arsnouveau.api.util.NBTUtil; +import com.hollingsworth.arsnouveau.common.items.data.ScryData; import com.hollingsworth.arsnouveau.common.util.PortUtil; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; -import javax.annotation.Nullable; import java.util.List; public class ScryerScroll extends ModItem { @@ -26,8 +24,8 @@ public InteractionResult useOn(UseOnContext pContext) { if (pContext.getLevel().isClientSide) return super.useOn(pContext); if (pContext.getLevel().getBlockEntity(pContext.getClickedPos()) instanceof ICameraMountable) { - ScryerScrollData data = new ScryerScrollData(pContext.getItemInHand()); - data.setPos(pContext.getClickedPos(), pContext.getItemInHand()); + ScryData data = new ScryData(pContext.getClickedPos()); + pContext.getItemInHand().set(DataComponentRegistry.SCRY_DATA, data); PortUtil.sendMessage(pContext.getPlayer(), Component.translatable("ars_nouveau.scryer_scroll.bound", pContext.getClickedPos().getX() + ", " + pContext.getClickedPos().getY() + ", " + pContext.getClickedPos().getZ())); } return super.useOn(pContext); @@ -36,36 +34,12 @@ public InteractionResult useOn(UseOnContext pContext) { @Override public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { - ScryerScrollData data = new ScryerScrollData(stack); - if (data.pos != null) { - tooltip2.add(Component.translatable("ars_nouveau.scryer_scroll.bound", data.pos.getX() + ", " + data.pos.getY() + ", " + data.pos.getZ())); + ScryData data = stack.getOrDefault(DataComponentRegistry.SCRY_DATA, new ScryData(null)); + if (data.pos() != null) { + tooltip2.add(Component.translatable("ars_nouveau.scryer_scroll.bound", data.pos().getX() + ", " + data.pos().getY() + ", " + data.pos().getZ())); } else { tooltip2.add(Component.translatable("ars_nouveau.scryer_scroll.craft")); } super.appendHoverText(stack, context, tooltip2, flagIn); } - - public static class ScryerScrollData { - @Nullable - public BlockPos pos; - - public ScryerScrollData(CompoundTag tag) { - pos = NBTUtil.hasBlockPos(tag, "pos") ? NBTUtil.getBlockPos(tag, "pos") : null; - } - - public ScryerScrollData(ItemStack stack) { - this(stack.getOrCreateTag().getCompound("scryer_scroll_data")); - } - - public CompoundTag toTag() { - CompoundTag tag = new CompoundTag(); - NBTUtil.storeBlockPos(tag, "pos", pos); - return tag; - } - - public void setPos(BlockPos pos, ItemStack stack) { - this.pos = pos; - stack.getOrCreateTag().put("scryer_scroll_data", toTag()); - } - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java index 5f086f76aa..d34af2a023 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java @@ -2,10 +2,10 @@ import com.hollingsworth.arsnouveau.api.event.EventQueue; import com.hollingsworth.arsnouveau.common.event.timed.BuildPortalEvent; +import com.hollingsworth.arsnouveau.common.items.data.WarpScrollData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; -import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.InteractionHand; @@ -15,12 +15,9 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; -import java.util.List; - public class StableWarpScroll extends ModItem{ public StableWarpScroll(Item.Properties properties) { @@ -35,7 +32,7 @@ public boolean onEntityItemUpdate(ItemStack stack, ItemEntity entity) { @Override public InteractionResult useOn(UseOnContext context) { if (!context.getLevel().isClientSide) { - WarpScroll.WarpScrollData scrollData = WarpScroll.WarpScrollData.get(context.getItemInHand()); + WarpScrollData scrollData = context.getItemInHand().getOrDefault(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(null, null, null, true)); if(!scrollData.isValid()) return InteractionResult.FAIL; EventQueue.getServerInstance().addEvent(new BuildPortalEvent(context.getLevel(), context.getClickedPos(), context.getPlayer().getDirection().getClockWise(), scrollData)); @@ -49,49 +46,16 @@ public InteractionResultHolder use(Level pLevel, Player player, Inter if(pUsedHand != InteractionHand.MAIN_HAND) return InteractionResultHolder.success(player.getItemInHand(pUsedHand)); ItemStack stack = player.getItemInHand(InteractionHand.MAIN_HAND); - WarpScroll.WarpScrollData data = WarpScroll.WarpScrollData.get(stack); + WarpScrollData data = stack.getOrDefault(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(null, null, null, true)); if (!(pLevel instanceof ServerLevel serverLevel)) return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); if (player.isShiftKeyDown() && !data.isValid()) { - data.setData(player.blockPosition(), player.getCommandSenderWorld().dimension().location().toString(), player.getRotationVector()); + stack.set(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(player.blockPosition(), player.getCommandSenderWorld().dimension().location().toString(), player.getRotationVector(), true)); player.sendSystemMessage(Component.translatable("ars_nouveau.warp_scroll.recorded")); }else if(player.isShiftKeyDown() && data.isValid()){ player.sendSystemMessage(Component.translatable("ars_nouveau.warp_scroll.already_recorded")); } return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); } - - @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { - super.appendHoverText(stack, context, tooltip2, flagIn); - WarpScroll.WarpScrollData data = WarpScroll.WarpScrollData.get(stack); - if (!data.isValid()) { - tooltip2.add(Component.translatable("ars_nouveau.warp_scroll.no_location")); - return; - } - BlockPos pos = data.getPos(); - tooltip2.add(Component.translatable("ars_nouveau.position", pos.getX(), pos.getY(), pos.getZ())); - String dimId = data.getDimension(); - if(dimId != null) { - ResourceLocation resourceLocation = ResourceLocation.tryParse(dimId); - tooltip2.add(Component.translatable(resourceLocation.getPath() + "." + resourceLocation.getNamespace() + ".name")); - } - } - - public static class StableScrollData extends WarpScroll.WarpScrollData{ - public StableScrollData(ItemStack stack) { - super(stack); - } - - @Override - public boolean canTeleportWithDim(String dim) { - return true; - } - - @Override - public boolean canTeleportWithDim(Level level) { - return true; - } - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java index 3045a638cf..6b8adce329 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java @@ -1,17 +1,14 @@ package com.hollingsworth.arsnouveau.common.items; -import com.hollingsworth.arsnouveau.api.nbt.ItemstackData; import com.hollingsworth.arsnouveau.api.util.SourceUtil; import com.hollingsworth.arsnouveau.common.advancement.ANCriteriaTriggers; +import com.hollingsworth.arsnouveau.common.items.data.WarpScrollData; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketWarpPosition; -import com.hollingsworth.arsnouveau.setup.config.ServerConfig; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; -import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; @@ -22,13 +19,9 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec2; -import javax.annotation.Nullable; -import java.util.List; - public class WarpScroll extends ModItem { public WarpScroll() { super(ItemsRegistry.defaultItemProperties()); @@ -73,9 +66,9 @@ public InteractionResultHolder use(Level world, Player player, Intera player.sendSystemMessage(Component.translatable("ars_nouveau.warp_scroll.wrong_dim")); return InteractionResultHolder.fail(stack); } - BlockPos pos = data.getPos(); + BlockPos pos = data.pos(); player.teleportToWithTicket(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); - Vec2 rotation = data.getRotation(); + Vec2 rotation = data.rotation(); player.setXRot(rotation.x); player.setYRot(rotation.y); Networking.sendToNearbyClient(world, player, new PacketWarpPosition(player.getId(),pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, rotation.x, rotation.y)); @@ -107,117 +100,4 @@ public InteractionResultHolder use(Level world, Player player, Intera } return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); } - - @Override - public void appendHoverText(ItemStack stack, @Nullable TooltipContext world, List tooltip, TooltipFlag p_77624_4_) { - WarpScrollData data = new WarpScrollData(stack); - if (!data.isValid()) { - tooltip.add(Component.translatable("ars_nouveau.warp_scroll.no_location")); - return; - } - BlockPos pos = data.pos; - tooltip.add(Component.translatable("ars_nouveau.position", pos.getX(), pos.getY(), pos.getZ())); - if (!ServerConfig.ENABLE_WARP_PORTALS.get()) { - tooltip.add(Component.translatable("ars_nouveau.warp_scroll.disabled_warp_portal").withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC)); - } - } - - public static class WarpScrollData extends ItemstackData { - @Nullable - private BlockPos pos; - private String dimension; - private Vec2 rotation; - - public WarpScrollData(ItemStack stack) { - super(stack); - CompoundTag tag1 = getItemTag(stack); - if (tag1 == null || tag1.isEmpty()) - return; - pos = tag1.contains("x") ? new BlockPos(tag1.getInt("x"), tag1.getInt("y"), tag1.getInt("z")) : null; - dimension = tag1.getString("dim"); - rotation = new Vec2(tag1.getFloat("xRot"), tag1.getFloat("yRot")); - } - - public static WarpScrollData get(ItemStack stack) { - if(stack.getItem() instanceof StableWarpScroll){ - return new StableWarpScroll.StableScrollData(stack); - } - return new WarpScrollData(stack); - } - - public boolean isValid() { - return pos != null && dimension != null && rotation != null; - } - - public boolean canTeleportWithDim(String dim) { - return dimension != null && dimension.equals(dim); - } - - public boolean canTeleportWithDim(Level level) { - return canTeleportWithDim(level.dimension().location().toString()); - } - - public void setData(BlockPos pos, String dimension, Vec2 rotation) { - this.pos = pos; - this.dimension = dimension; - this.rotation = rotation; - writeItem(); - } - - @Override - public void writeToNBT(CompoundTag tag) { - if (pos != null) { - tag.putInt("x", pos.getX()); - tag.putInt("y", pos.getY()); - tag.putInt("z", pos.getZ()); - } - if (dimension != null) { - tag.putString("dim", dimension); - } - if (rotation != null) { - tag.putFloat("xRot", rotation.x); - tag.putFloat("yRot", rotation.y); - } - } - - @Override - public String getTagString() { - return "an_warp_scroll"; - } - - public String getDimension() { - return dimension; - } - - public void setDimension(String dimension) { - this.dimension = dimension; - writeItem(); - } - - @Nullable - public BlockPos getPos() { - return pos; - } - - public void setPos(@Nullable BlockPos pos) { - this.pos = pos; - writeItem(); - } - - public Vec2 getRotation() { - return rotation; - } - - public void setRotation(Vec2 rotation) { - this.rotation = rotation; - writeItem(); - } - - public void copyFrom(WarpScrollData warpScrollData) { - this.pos = warpScrollData.pos; - this.dimension = warpScrollData.dimension; - this.rotation = warpScrollData.rotation; - writeItem(); - } - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java new file mode 100644 index 0000000000..78e52ed933 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java @@ -0,0 +1,69 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.hollingsworth.arsnouveau.api.perk.IPerk; +import com.hollingsworth.arsnouveau.api.perk.PerkSlot; +import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.Util; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.DyeColor; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + +public class ArmorPerkHolder extends StackPerkHolder { + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.STRING.fieldOf("color").forGetter(ArmorPerkHolder::getColor), + PerkSlot.TIERED_LIST_CODEC.fieldOf("slotsForTier").forGetter(i -> i.slotsForTier), + StackPerkHolder.PERK_CODEC.listOf().fieldOf("perks").forGetter(ArmorPerkHolder::getPerks), + Codec.INT.fieldOf("tier").forGetter(ArmorPerkHolder::getTier), + StackPerkHolder.PERK_TAG_CODEC.fieldOf("perkTags").forGetter(ArmorPerkHolder::getPerkTags) + ).apply(instance, ArmorPerkHolder::new)); + + public static final StreamCodec STREAM_CODEC = CheatSerializer.create(CODEC); + + private String color; + private List> slotsForTier; + + public ArmorPerkHolder(String color, List> slotsForTier, List perks, int tier, Map perkTags) { + super(perks, tier, perkTags); + this.color = color; + this.slotsForTier = List.copyOf(slotsForTier); + } + + public String getColor() { + return color == null ? DyeColor.PURPLE.getName() : color; + } + + public void setColor(String color) { + this.color = color; + } + + @Override + public ArmorPerkHolder setPerks(List perks) { + return new ArmorPerkHolder(color, slotsForTier, perks, getTier(), getPerkTags()); + } + + @Override + public List getSlotsForTier() { + List slots = new ArrayList<>(slotsForTier.get(getTier())); + slots.sort(Comparator.comparingInt((a) -> -a.value())); + return slots; + } + + @Override + public ArmorPerkHolder setTier(int tier) { + return new ArmorPerkHolder(color, slotsForTier, getPerks(), tier, getPerkTags()); + } + + @Override + public ArmorPerkHolder setTagForPerk(IPerk perk, CompoundTag tag) { + return new ArmorPerkHolder(color, slotsForTier, getPerks(), getTier(), Util.copyAndPut(getPerkTags(), perk, tag)); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java new file mode 100644 index 0000000000..5eb8856a56 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java @@ -0,0 +1,66 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; + +import javax.annotation.Nullable; + +public record DominionWandData(BlockPos storedPos, Direction face, boolean strict, int storedEntityId) { + + public DominionWandData(BlockPos storedPos, Direction face, boolean strict){ + this(storedPos, face, strict, NULL_ENTITY); + } + + public DominionWandData(int storedEntityId){ + this(BlockPos.ZERO, Direction.DOWN, false, storedEntityId); + } + + public DominionWandData(){ + this(null, null, false, NULL_ENTITY); + } + + public static final int NULL_ENTITY = -1; + + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockPos.CODEC.fieldOf("pos").forGetter(DominionWandData::storedPos), + Direction.CODEC.fieldOf("face").forGetter(DominionWandData::face), + Codec.BOOL.fieldOf("strict").forGetter(DominionWandData::strict), + Codec.INT.fieldOf("entityId").forGetter(DominionWandData::storedEntityId) + ).apply(instance, DominionWandData::new)); + + public static StreamCodec STREAM = CheatSerializer.create(DominionWandData.CODEC); + + public boolean hasStoredData(){ + return storedPos != null || storedEntityId != -1; + } + + public @Nullable BlockPos getValidPos(){ + return storedPos == BlockPos.ZERO || storedPos == null ? null : storedPos; + } + + public int getStoredEntity(){ + return storedEntityId == 0 || storedEntityId == NULL_ENTITY ? NULL_ENTITY : storedEntityId; + } + + public DominionWandData storePos(@Nullable BlockPos pos){ + return new DominionWandData(pos == null ? null : pos.immutable(), face, strict, storedEntityId); + } + + public DominionWandData storeEntity(int entityId){ + return new DominionWandData(storedPos, face, strict, entityId); + } + + public DominionWandData setFace(Direction face){ + return new DominionWandData(storedPos, face, strict, storedEntityId); + } + + public DominionWandData toggleMode(){ + return new DominionWandData(storedPos, face, !strict, storedEntityId); + } + +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MultiPotionContents.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MultiPotionContents.java new file mode 100644 index 0000000000..3463f3be11 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MultiPotionContents.java @@ -0,0 +1,40 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.hollingsworth.arsnouveau.common.items.PotionFlask; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.alchemy.PotionContents; + +public record MultiPotionContents(int charges, PotionContents contents){ + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.INT.fieldOf("charges").forGetter(MultiPotionContents::charges), + PotionContents.CODEC.fieldOf("contents").forGetter(MultiPotionContents::contents) + ).apply(instance, MultiPotionContents::new)); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite(ByteBufCodecs.INT, MultiPotionContents::charges, PotionContents.STREAM_CODEC, MultiPotionContents::contents, MultiPotionContents::new); + + public MultiPotionContents withCharges(int charges){ + return new MultiPotionContents(charges, contents); + } + + public void applyEffects(ItemStack stack, Entity source, Entity inDirectSource, LivingEntity target) { + Item item = stack.getItem(); + + for (MobEffectInstance effectinstance : contents.getAllEffects()) { + effectinstance = item instanceof PotionFlask flask ? flask.getEffectInstance(effectinstance) : effectinstance; + if (effectinstance.getEffect().value().isInstantenous()) { + effectinstance.getEffect().value().applyInstantenousEffect(source, inDirectSource, target, effectinstance.getAmplifier(), 1.0D); + } else { + target.addEffect(new MobEffectInstance(effectinstance), source); + } + } + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionData.java similarity index 82% rename from src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionData.java rename to src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionData.java index a6e1bfb151..00c0d7b125 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionData.java @@ -1,6 +1,9 @@ -package com.hollingsworth.arsnouveau.api.potion; +package com.hollingsworth.arsnouveau.common.items.data; +import com.hollingsworth.arsnouveau.api.potion.IPotionProvider; +import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.StringTag; @@ -15,28 +18,33 @@ import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.alchemy.Potions; +import javax.annotation.Nullable; import java.util.*; import java.util.stream.Collectors; -public class PotionData implements Cloneable{ - private PotionContents potion; +public class PotionData{ + private Holder potion; private List customEffects = new ArrayList<>(); private Set includedPotions = new HashSet<>(); - public PotionData(PotionContents potion, List customEffects, Set includedPotions) { + public PotionData(Holder potion, List customEffects, Set includedPotions) { this.potion = potion; this.includedPotions = includedPotions; setCustomEffects(customEffects); } - public PotionData(){ - this(PotionContents.EMPTY, new ArrayList<>(), new HashSet<>()); + public static @Nullable PotionContents from(ItemStack stack){ + if(stack.getItem() instanceof IPotionProvider provider) { + return provider.getPotionData(stack); + }else{ + return stack.get(DataComponents.POTION_CONTENTS); + } } public PotionData(ItemStack stack){ if(stack.getItem() instanceof IPotionProvider provider){ - PotionData data = provider.getPotionData(stack).clone(); + PotionContents data = provider.getPotionData(stack); this.potion = data.potion; this.customEffects = data.getCustomEffects(); }else{ @@ -47,11 +55,11 @@ public PotionData(ItemStack stack){ } public PotionData(PotionContents potion){ - this(potion, new ArrayList<>(), new HashSet<>(Collections.singletonList(potion))); + this(potion.potion().get(), new ArrayList<>(), new HashSet<>(Collections.singletonList(potion))); } public PotionData(PotionData data){ - this(data.getPotion(), new ArrayList<>(data.getCustomEffects()), new HashSet<>(data.getIncludedPotions())); + this(data.potion, new ArrayList<>(data.getCustomEffects()), new HashSet<>(data.getIncludedPotions())); } public ItemStack asPotionStack(){ @@ -59,10 +67,10 @@ public ItemStack asPotionStack(){ } public ItemStack asPotionStack(Item item){ - ItemStack potionStack = new ItemStack(item); - if(this.getPotion() == Potions.EMPTY) - return potionStack; - PotionUtils.setPotion(potionStack, this.getPotion()); + if(this.getPotion() == PotionContents.EMPTY) + return new ItemStack(item); + + PotionContents.setPotion(potionStack, this.getPotion()); PotionUtils.setCustomEffects(potionStack, getCustomEffects()); return potionStack; } @@ -92,7 +100,7 @@ public CompoundTag toTag(){ tag.put("CustomPotionEffects", listnbt); } ListTag potionTagList = new ListTag(); - List potionNames = new ArrayList<>(getIncludedPotions().stream().map(potion -> ForgeRegistries.POTIONS.getKey(potion).toString()).toList()); + List potionNames = new ArrayList<>(getIncludedPotions().stream().map(potion -> BuiltInRegistries.POTION.getKey(potion).toString()).toList()); for(String potion : potionNames){ potionTagList.add(StringTag.valueOf(potion)); } @@ -160,19 +168,6 @@ public boolean equals(Object obj) { return obj instanceof PotionData other && areSameEffects(other); } - @Override - public PotionData clone() { - try { - PotionData clone = (PotionData) super.clone(); - clone.setPotion(getPotion()); - clone.setCustomEffects(new ArrayList<>(getCustomEffects())); - clone.setIncludedPotions(new HashSet<>(getIncludedPotions())); - return clone; - } catch (CloneNotSupportedException e) { - throw new AssertionError(); - } - } - public PotionContents getPotion() { return potion; } @@ -189,7 +184,7 @@ public void setCustomEffects(List customEffects) { this.customEffects = customEffects.stream().filter(e -> !potion.getAllEffects().contains(e)).collect(Collectors.toList()); } - public Set getIncludedPotions() { + public Set> getIncludedPotions() { includedPotions.add(getPotion()); includedPotions.removeIf(potion -> potion == PotionContents.EMPTY); return includedPotions; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java new file mode 100644 index 0000000000..707ed166e6 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java @@ -0,0 +1,86 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.hollingsworth.arsnouveau.common.items.PotionFlask; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.PotionItem; + +public class PotionLauncherData { + private PotionData lastDataForRender; + private int lastSlot; + public int amountLeft; + + public PotionLauncherData(ItemStack stack) { + super(stack); + CompoundTag tag = getItemTag(stack); + if(tag == null) + return; + lastDataForRender = PotionData.fromTag(tag.getCompound("lastDataForRender")); + lastSlot = tag.getInt("lastSlot"); + amountLeft = tag.getInt("amountLeft"); + } + + public PotionData getPotionDataFromSlot(Player player){ + if(lastSlot < 0 || lastSlot >= player.inventory.getContainerSize()) + return new PotionData(); + ItemStack stack = player.inventory.getItem(lastSlot); + return new PotionData(stack); + } + + public PotionData expendPotion(Player player){ + if(lastSlot >= player.inventory.getContainerSize()) + return new PotionData(); + ItemStack item = player.inventory.getItem(lastSlot); + if(item.getItem() instanceof PotionFlask){ + PotionFlask.FlaskData flaskData = new PotionFlask.FlaskData(item); + if(flaskData.getCount() <= 0 || flaskData.getPotion().isEmpty()) + return new PotionData(); + PotionData data = flaskData.getPotion().clone(); + flaskData.setCount(flaskData.getCount() - 1); + setAmountLeft(flaskData.getCount()); + return data; + }else if(item.getItem() instanceof PotionItem){ + PotionData data = new PotionData(item).clone(); + if(data.isEmpty()) + return new PotionData(); + item.shrink(1); + player.inventory.add(new ItemStack(Items.GLASS_BOTTLE)); + setAmountLeft(0); + return data; + } + return new PotionData(); + } + + public void setAmountLeft(int amount){ + amountLeft = amount; + writeItem(); + } + + public void setLastSlot(int lastSlot) { + this.lastSlot = lastSlot; + writeItem(); + } + + public void setLastDataForRender(PotionData lastDataForRender) { + this.lastDataForRender = lastDataForRender; + writeItem(); + } + + @Override + public void writeToNBT(CompoundTag tag) { + tag.putInt("lastSlot", lastSlot); + tag.put("lastDataForRender", lastDataForRender.toTag()); + tag.putInt("amountLeft", amountLeft); + } + + public PotionData getLastDataForRender() { + return lastDataForRender; + } + + @Override + public String getTagString() { + return "potion_launcher"; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PresentData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PresentData.java new file mode 100644 index 0000000000..84439087cd --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PresentData.java @@ -0,0 +1,22 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; + +import java.util.UUID; + +public record PresentData(String name, UUID uuid) { + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.STRING.fieldOf("name").forGetter(PresentData::name), + Codec.STRING.xmap(UUID::fromString, UUID::toString).fieldOf("uuid").forGetter(PresentData::uuid) + ).apply(instance, PresentData::new)); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite(ByteBufCodecs.STRING_UTF8, PresentData::name, ByteBufCodecs.STRING_UTF8, p -> p.uuid().toString(), PresentData::new); + + public PresentData(String name, String uuid){ + this(name, UUID.fromString(uuid)); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryData.java new file mode 100644 index 0000000000..b939f2ff67 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryData.java @@ -0,0 +1,12 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; + +public record ScryData(BlockPos pos) { + public static Codec CODEC = BlockPos.CODEC.xmap(ScryData::new, ScryData::pos); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite(BlockPos.STREAM_CODEC, ScryData::pos, ScryData::new); +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StackPerkHolder.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StackPerkHolder.java new file mode 100644 index 0000000000..0716831c7d --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StackPerkHolder.java @@ -0,0 +1,54 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.hollingsworth.arsnouveau.api.perk.IPerk; +import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; +import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; +import com.hollingsworth.arsnouveau.common.perk.StarbunclePerk; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; + +import javax.annotation.Nullable; +import java.util.List; +import java.util.Map; + +/** + * Serializes a set of perks from an itemstack. + */ +public abstract class StackPerkHolder implements IPerkHolder { + + public static Codec PERK_CODEC = RecordCodecBuilder.create((instance) -> instance.group( + ResourceLocation.CODEC.fieldOf("perk").forGetter(IPerk::getRegistryName) + ).apply(instance, (name) -> PerkRegistry.getPerkMap().getOrDefault(name, StarbunclePerk.INSTANCE))); + + public static Codec> PERK_TAG_CODEC = Codec.unboundedMap(PERK_CODEC, CompoundTag.CODEC); + + private List perks; + private int tier; + private Map perkTags; + + public StackPerkHolder(List perks, int tier, Map perkTags) { + this.perks = List.copyOf(perks); + this.tier = tier; + this.perkTags = Map.copyOf(perkTags); + } + + @Override + public List getPerks() { + return perks; + } + + public int getTier() { + return this.tier; + } + + protected Map getPerkTags() { + return this.perkTags; + } + + @Override + public @Nullable CompoundTag getTagForPerk(IPerk perk) { + return this.perkTags.getOrDefault(perk, null); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java new file mode 100644 index 0000000000..9b9229a7d1 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java @@ -0,0 +1,71 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; +import com.hollingsworth.arsnouveau.setup.config.ServerConfig; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.TooltipProvider; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec2; + +import javax.annotation.Nullable; +import java.util.function.Consumer; + +public record WarpScrollData(BlockPos pos, String dimension, Vec2 rotation, boolean crossDim) implements TooltipProvider { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockPos.CODEC.fieldOf("pos").forGetter(WarpScrollData::pos), + Codec.STRING.optionalFieldOf("dimension", null).forGetter(WarpScrollData::dimension), + ANCodecs.VEC2.fieldOf("rotation").forGetter(WarpScrollData::rotation), + Codec.BOOL.optionalFieldOf("crossDim", false).forGetter(WarpScrollData::crossDim) + ).apply(instance, WarpScrollData::new)); + + public static final StreamCodec STREAM_CODEC = CheatSerializer.create(WarpScrollData.CODEC); + + public WarpScrollData setPos(@Nullable BlockPos pos, @Nullable String dimension) { + return new WarpScrollData(pos, dimension, rotation, crossDim); + } + + public WarpScrollData setRotation(Vec2 rotation) { + return new WarpScrollData(pos, dimension, rotation, crossDim); + } + + public boolean canTeleportWithDim(String dimension) { + return this.dimension.equals(dimension) || crossDim; + } + + public boolean canTeleportWithDim(Level level){ + return canTeleportWithDim(level.dimension().location().toString()); + } + + public boolean isValid() { + return pos != null && dimension != null && rotation != null; + } + + @Override + public void addToTooltip(Item.TooltipContext pContext, Consumer pTooltipAdder, TooltipFlag pTooltipFlag) { + if (!isValid()) { + pTooltipAdder.accept(Component.translatable("ars_nouveau.warp_scroll.no_location")); + return; + } + pTooltipAdder.accept(Component.translatable("ars_nouveau.position", pos.getX(), pos.getY(), pos.getZ())); + if(crossDim) { + String dimId = dimension(); + if (dimId != null) { + ResourceLocation resourceLocation = ResourceLocation.tryParse(dimId); + pTooltipAdder.accept(Component.translatable(resourceLocation.getPath() + "." + resourceLocation.getNamespace() + ".name")); + } + } + if (!ServerConfig.ENABLE_WARP_PORTALS.get()) { + pTooltipAdder.accept(Component.translatable("ars_nouveau.warp_scroll.disabled_warp_portal").withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC)); + } + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java index 2426086fcc..5546ad101a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.network; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.potion.PotionData; +import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.common.items.PotionFlask; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java index f0f2f49aca..484a96087b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.network; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.potion.PotionData; +import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.common.items.FlaskCannon; import com.hollingsworth.arsnouveau.common.items.PotionFlask; import net.minecraft.network.RegistryFriendlyByteBuf; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java index fbf3904658..65a72f31bd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java @@ -6,7 +6,7 @@ import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.TileCaster; import com.hollingsworth.arsnouveau.common.block.tile.PortalTile; -import com.hollingsworth.arsnouveau.common.items.WarpScroll; +import com.hollingsworth.arsnouveau.common.items.data.WarpScrollData; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketWarpPosition; @@ -49,7 +49,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull SlotReference reference = manager.findItem(i -> (i.getItem() == ItemsRegistry.WARP_SCROLL.asItem() || i.getItem() == ItemsRegistry.STABLE_WARP_SCROLL.asItem()), InteractType.EXTRACT); if (!reference.isEmpty()) { ItemStack stack = reference.getHandler().getStackInSlot(reference.getSlot()); - WarpScroll.WarpScrollData data = WarpScroll.WarpScrollData.get(stack); + WarpScrollData data = WarpScrollData.get(stack); if (data.isValid() && data.canTeleportWithDim(world)) { warpEntity(rayTraceResult.getEntity(), data); return; @@ -63,7 +63,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull } if (isRealPlayer(shooter)) { - WarpScroll.WarpScrollData scrollData = WarpScroll.WarpScrollData.get(shooter.getOffhandItem()); + WarpScrollData scrollData = WarpScrollData.get(shooter.getOffhandItem()); if (scrollData.isValid()) { if (scrollData.isValid() && scrollData.canTeleportWithDim(world)) { warpEntity(rayTraceResult.getEntity(), scrollData); @@ -76,17 +76,17 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull } } - public static void warpEntity(Entity entity, WarpScroll.WarpScrollData warpScrollData){ + public static void warpEntity(Entity entity, WarpScrollData warpScrollData){ if (entity == null) return; if (entity instanceof LivingEntity living){ - EntityTeleportEvent. EnderEntity event = EventHooks.onEnderTeleport(living, warpScrollData.getPos().getX(), warpScrollData.getPos().getY(), warpScrollData.getPos().getZ()); + EntityTeleportEvent. EnderEntity event = EventHooks.onEnderTeleport(living, warpScrollData.pos().getX(), warpScrollData.pos().getY(), warpScrollData.pos().getZ()); if (event.isCanceled()) return; } - ServerLevel dimension = PortalTile.getServerLevel(warpScrollData.getDimension(), (ServerLevel) entity.level); + ServerLevel dimension = PortalTile.getServerLevel(warpScrollData.dimension(), (ServerLevel) entity.level); if(dimension == null) return; - PortalTile.teleportEntityTo(entity, dimension, warpScrollData.getPos(), warpScrollData.getRotation()); + PortalTile.teleportEntityTo(entity, dimension, warpScrollData.pos(), warpScrollData.rotation()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java index 20faccd2d6..6beba9b7cd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.api.item.inv.ExtractedStack; import com.hollingsworth.arsnouveau.api.item.inv.InventoryManager; -import com.hollingsworth.arsnouveau.api.potion.PotionData; +import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.common.items.PotionFlask; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java new file mode 100644 index 0000000000..a39a4158eb --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java @@ -0,0 +1,13 @@ +package com.hollingsworth.arsnouveau.common.util; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.world.phys.Vec2; + +public class ANCodecs { + + public static Codec VEC2 = RecordCodecBuilder.create(instance -> instance.group( + Codec.FLOAT.fieldOf("x").forGetter(v -> v.x), + Codec.FLOAT.fieldOf("y").forGetter(v -> v.y) + ).apply(instance, Vec2::new)); +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java index a72d748ce1..c0b5d4b43c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java @@ -4,7 +4,6 @@ import com.hollingsworth.arsnouveau.api.familiar.AbstractFamiliarHolder; import com.hollingsworth.arsnouveau.api.mob_jar.JarBehavior; import com.hollingsworth.arsnouveau.api.mob_jar.JarBehaviorRegistry; -import com.hollingsworth.arsnouveau.api.perk.ArmorPerkHolder; import com.hollingsworth.arsnouveau.api.perk.IPerk; import com.hollingsworth.arsnouveau.api.perk.PerkSlot; import com.hollingsworth.arsnouveau.api.registry.*; @@ -17,6 +16,7 @@ import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import com.hollingsworth.arsnouveau.common.block.tile.MobJarTile; import com.hollingsworth.arsnouveau.common.familiars.*; +import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; import com.hollingsworth.arsnouveau.common.mob_jar.*; import com.hollingsworth.arsnouveau.common.perk.*; import com.hollingsworth.arsnouveau.common.ritual.*; @@ -35,6 +35,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.neoforged.fml.loading.FMLEnvironment; + import java.util.Arrays; import java.util.List; diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java index b9b3cf5541..083fbcfc69 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java @@ -1,9 +1,6 @@ package com.hollingsworth.arsnouveau.setup.registry; -import com.hollingsworth.arsnouveau.common.items.data.ItemScrollData; -import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; -import com.hollingsworth.arsnouveau.common.items.data.StarbuncleCharmData; -import com.hollingsworth.arsnouveau.common.items.data.VoidJarData; +import com.hollingsworth.arsnouveau.common.items.data.*; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.registries.BuiltInRegistries; import net.neoforged.neoforge.registries.DeferredHolder; @@ -22,4 +19,16 @@ public class DataComponentRegistry { public static final DeferredHolder, DataComponentType> ITEM_SCROLL_DATA = DATA.register("item_scroll_data", () -> DataComponentType.builder().persistent(ItemScrollData.CODEC).networkSynchronized(ItemScrollData.STREAM_CODEC).build()); public static final DeferredHolder , DataComponentType> VOID_JAR = DATA.register("void_jar", () -> DataComponentType.builder().persistent(VoidJarData.CODEC).networkSynchronized(VoidJarData.STREAM_CODEC).build()); + + public static final DeferredHolder , DataComponentType> ARMOR_PERKS = DATA.register("armor_perks", () -> DataComponentType.builder().persistent(ArmorPerkHolder.CODEC).networkSynchronized(ArmorPerkHolder.STREAM_CODEC).build()); + + public static final DeferredHolder , DataComponentType> DOMINION_WAND = DATA.register("dominion_wand", () -> DataComponentType.builder().persistent(DominionWandData.CODEC).networkSynchronized(DominionWandData.STREAM).build()); + + public static final DeferredHolder , DataComponentType> PRESENT = DATA.register("present", () -> DataComponentType.builder().persistent(PresentData.CODEC).networkSynchronized(PresentData.STREAM_CODEC).build()); + + public static final DeferredHolder , DataComponentType> SCRY_DATA = DATA.register("scry_data", () -> DataComponentType.builder().persistent(ScryData.CODEC).networkSynchronized(ScryData.STREAM_CODEC).build()); + + public static final DeferredHolder , DataComponentType> WARP_SCROLL = DATA.register("warp_scroll", () -> DataComponentType.builder().persistent(WarpScrollData.CODEC).networkSynchronized(WarpScrollData.STREAM_CODEC).build()); + + public static final DeferredHolder, DataComponentType> MULTI_POTION = DATA.register("multi_potion", () -> DataComponentType.builder().persistent(MultiPotionContents.CODEC).networkSynchronized(MultiPotionContents.STREAM_CODEC).build()); } From 4c3a2c3a855c4c1189f87aff2317ae9645a99faf Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 29 Jun 2024 21:39:19 -0500 Subject: [PATCH 022/363] perk data --- .../arsnouveau/api/perk/IPerkHolder.java | 15 +-- .../arsnouveau/api/perk/IPerkProvider.java | 6 +- .../arsnouveau/api/registry/PerkRegistry.java | 14 ++- .../arsnouveau/api/util/ANEventBus.java | 15 +++ .../arsnouveau/api/util/BlockUtil.java | 7 +- .../arsnouveau/api/util/PerkUtil.java | 57 ++++------ .../client/container/StoredItemStack.java | 43 ++++--- .../client/gui/book/GuiSpellBook.java | 2 +- .../client/gui/book/InfinityGuiSpellBook.java | 2 +- .../jei/ArmorUpgradeRecipeCategory.java | 16 +-- .../tile/AlterationTableRenderer.java | 5 +- .../common/armor/AnimatedMagicArmor.java | 25 +++-- .../common/block/AlterationTable.java | 3 +- .../arsnouveau/common/block/MagicFire.java | 17 ++- .../common/block/RotatingSpellTurret.java | 26 +---- .../common/block/ScryersOculus.java | 9 +- .../common/block/tile/AlterationTile.java | 49 ++++---- .../common/block/tile/ItemDetectorTile.java | 5 +- .../common/block/tile/ScribesTile.java | 4 +- .../common/command/ResetCommand.java | 12 +- .../crafting/recipes/ArmorUpgradeRecipe.java | 4 +- .../common/crafting/recipes/GlyphRecipe.java | 7 -- .../common/datagen/GlyphRecipeProvider.java | 5 +- .../common/datagen/ItemTagProvider.java | 2 +- .../common/datagen/SummonRitualProvider.java | 3 +- .../common/datagen/WorldgenProvider.java | 2 +- .../common/entity/EnchantedFallingBlock.java | 8 -- .../common/entity/EnchantedSkull.java | 3 +- .../common/entity/LightningEntity.java | 13 ++- .../arsnouveau/common/entity/Whirlisprig.java | 5 +- .../arsnouveau/common/event/PerkEvents.java | 7 +- .../common/items/BlankParchmentItem.java | 5 +- .../common/items/EnchantersSword.java | 3 +- .../arsnouveau/common/items/JarOfLight.java | 105 ++++++------------ .../arsnouveau/common/items/SpellArrow.java | 19 ++-- .../common/items/StarbuncleShard.java | 5 +- .../arsnouveau/common/items/WarpScroll.java | 15 +-- .../common/items/data/ArmorPerkHolder.java | 21 ++-- .../common/items/data/ItemScrollData.java | 3 +- .../common/items/data/LightJarData.java | 17 +++ .../common/network/PacketUpdateBookGUI.java | 4 +- .../arsnouveau/common/perk/ChillingPerk.java | 2 +- .../arsnouveau/common/perk/IgnitePerk.java | 2 +- .../common/potions/BlastEffect.java | 8 +- .../common/potions/FlightEffect.java | 14 +-- .../arsnouveau/common/ritual/RitualWarp.java | 10 +- .../common/spell/effect/EffectBlink.java | 13 +-- .../common/spell/effect/EffectInteract.java | 2 +- .../setup/registry/APIRegistry.java | 49 ++++---- .../setup/registry/DataComponentRegistry.java | 2 + .../arsnouveau/setup/registry/ModPotions.java | 4 +- 51 files changed, 334 insertions(+), 360 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/util/ANEventBus.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/LightJarData.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerkHolder.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerkHolder.java index 643e6d27e5..9b9df905b0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerkHolder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerkHolder.java @@ -5,6 +5,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import javax.annotation.Nullable; import java.util.ArrayList; @@ -15,9 +16,9 @@ */ public interface IPerkHolder { - default List getPerkInstances(){ + default List getPerkInstances(ItemStack stack){ List perkInstances = new ArrayList<>(); - List slots = new ArrayList<>(getSlotsForTier()); + List slots = new ArrayList<>(getSlotsForTier(stack)); List perks = getPerks(); for(int i = 0; i < slots.size(); i++){ if(i < perks.size()) { @@ -31,23 +32,23 @@ default List getPerkInstances(){ T setPerks(List perks); - List getSlotsForTier(); + List getSlotsForTier(ItemStack stack); default boolean isEmpty(){ return getPerks().isEmpty(); } - default void appendPerkTooltip(List tooltip, T obj){ + default void appendPerkTooltip(List tooltip, ItemStack stack){ - for(PerkInstance perkInstance : getPerkInstances()){ + for(PerkInstance perkInstance : getPerkInstances(stack)){ IPerk perk = perkInstance.getPerk(); ResourceLocation location = perk.getRegistryName(); tooltip.add(Component.literal(Component.translatable("item." + location.getNamespace() + "." + location.getPath()).getString() + " " + RomanNumber.toRoman(perkInstance.getSlot().value()))); } - int missing = getSlotsForTier().size() - getPerkInstances().size(); + int missing = getSlotsForTier(stack).size() - getPerkInstances(stack).size(); for(int i = 0; i < missing; i++){ - PerkSlot slot = new ArrayList<>(getSlotsForTier()).subList(getPerkInstances().size(), getSlotsForTier().size()).get(i); + PerkSlot slot = new ArrayList<>(getSlotsForTier(stack)).subList(getPerkInstances(stack).size(), getSlotsForTier(stack).size()).get(i); tooltip.add(Component.literal(Component.translatable("Empty").getString() + " " + RomanNumber.toRoman(slot.value())).withStyle(ChatFormatting.RED).withStyle(ChatFormatting.ITALIC)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerkProvider.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerkProvider.java index 65ed00941f..379c5bcdab 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerkProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerkProvider.java @@ -1,12 +1,14 @@ package com.hollingsworth.arsnouveau.api.perk; +import net.minecraft.world.item.ItemStack; + /** * Returns a perk holder serialized from T * You should not implement this interface directly. Use a non-generic child interface. */ @FunctionalInterface -public interface IPerkProvider { +public interface IPerkProvider { - IPerkHolder getPerkHolder(T obj); + IPerkHolder getPerkHolder(ItemStack obj); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/PerkRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/PerkRegistry.java index 275823987e..8120169f69 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/PerkRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/PerkRegistry.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.api.registry; import com.hollingsworth.arsnouveau.api.perk.IPerk; -import com.hollingsworth.arsnouveau.api.perk.IPerkProvider; +import com.hollingsworth.arsnouveau.api.perk.PerkSlot; import com.hollingsworth.arsnouveau.common.items.PerkItem; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; @@ -21,7 +21,7 @@ public class PerkRegistry { private static ConcurrentHashMap perkItemMap = new ConcurrentHashMap<>(); - private static ConcurrentHashMap> itemPerkProviderMap = new ConcurrentHashMap<>(); + private static ConcurrentHashMap>> itemPerkProviderMap = new ConcurrentHashMap<>(); public static Map getPerkMap() { return perkMap; @@ -36,15 +36,19 @@ public static boolean registerPerk(IPerk perk){ return true; } - public static boolean registerPerkProvider(ItemLike item, IPerkProvider provider){ - itemPerkProviderMap.put(item.asItem(), provider); + public static boolean registerPerkProvider(ItemLike item, List> tierList){ + itemPerkProviderMap.put(item.asItem(), tierList); return true; } - public static @Nullable IPerkProvider getPerkProvider(Item item){ + public static @Nullable List> getPerkProvider(Item item){ return itemPerkProviderMap.get(item); } + public static @Nullable List> getPerkProvider(ItemStack item){ + return getPerkProvider(item.getItem()); + } + public static @NotNull List getPerkProviderItems(){ List list = new ArrayList<>(); for (Iterator it = itemPerkProviderMap.keys().asIterator(); it.hasNext(); ) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/ANEventBus.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/ANEventBus.java new file mode 100644 index 0000000000..8547bb4f0c --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/ANEventBus.java @@ -0,0 +1,15 @@ +package com.hollingsworth.arsnouveau.api.util; + +import net.neoforged.bus.api.Event; +import net.neoforged.bus.api.ICancellableEvent; +import net.neoforged.neoforge.common.NeoForge; + +public class ANEventBus { + + /** + * Returns true if the event is canceled + */ + public static boolean post(T cancellableEvent){ + return NeoForge.EVENT_BUS.post(cancellableEvent).isCanceled(); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java index d0e4888dc2..55416e82dd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java @@ -22,7 +22,6 @@ import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.capabilities.Capabilities; -import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.UsernameCache; import net.neoforged.neoforge.common.util.FakePlayer; import net.neoforged.neoforge.common.util.FakePlayerFactory; @@ -88,7 +87,7 @@ public static boolean destroyBlockSafely(Level world, BlockPos pos, boolean drop if (!(world instanceof ServerLevel)) return false; Player playerEntity = caster instanceof Player ? (Player) caster : ANFakePlayer.getPlayer((ServerLevel) world); - if (NeoForge.EVENT_BUS.post(new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), playerEntity))) + if (ANEventBus.post(new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), playerEntity))) return false; world.getBlockState(pos).getBlock().playerWillDestroy(world, pos, world.getBlockState(pos), playerEntity); return world.destroyBlock(pos, dropBlock); @@ -102,7 +101,7 @@ public static boolean destroyRespectsClaim(LivingEntity caster, Level world, Blo public static boolean destroyRespectsClaim(Entity caster, Level world, BlockPos pos) { Player playerEntity = caster instanceof Player ? (Player) caster : ANFakePlayer.getPlayer((ServerLevel) world); - return !NeoForge.EVENT_BUS.post(new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), playerEntity)); + return !ANEventBus.post(new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), playerEntity)); } public static void safelyUpdateState(Level world, BlockPos pos, BlockState state) { @@ -123,7 +122,7 @@ public static boolean destroyBlockSafelyWithoutSound(Level world, BlockPos pos, return false; Player playerEntity = caster instanceof Player ? (Player) caster : ANFakePlayer.getPlayer((ServerLevel) world); - if (NeoForge.EVENT_BUS.post(new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), playerEntity))) + if (ANEventBus.post(new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), playerEntity))) return false; return destroyBlockWithoutSound(world, pos, dropBlock); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java index a030d3138c..8cbb9df07f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java @@ -2,15 +2,15 @@ import com.hollingsworth.arsnouveau.api.perk.IPerk; import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; -import com.hollingsworth.arsnouveau.api.perk.IPerkProvider; import com.hollingsworth.arsnouveau.api.perk.PerkInstance; import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; import com.hollingsworth.arsnouveau.common.items.PerkItem; +import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.core.Holder; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeInstance; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import javax.annotation.Nullable; @@ -19,9 +19,8 @@ public class PerkUtil { - public static @Nullable IPerkHolder getPerkHolder(ItemStack stack){ - IPerkProvider holder = PerkRegistry.getPerkProvider(stack.getItem()); - return holder == null ? null : holder.getPerkHolder(stack); + public static @Nullable IPerkHolder getPerkHolder(ItemStack stack){ + return stack.get(DataComponentRegistry.ARMOR_PERKS); } public static double perkValue(LivingEntity entity, Holder attribute){ @@ -34,7 +33,7 @@ public static double valueOrZero(LivingEntity entity, Holder attribut } public static List getPerksAsItems(ItemStack stack){ - IPerkHolder holder = getPerkHolder(stack); + ArmorPerkHolder holder = stack.get(DataComponentRegistry.ARMOR_PERKS); List perkItems = new ArrayList<>(); if(holder == null){ return perkItems; @@ -50,18 +49,14 @@ public static List getPerksAsItems(ItemStack stack){ public static List getPerksFromItem(ItemStack stack){ List perkInstances = new ArrayList<>(); - IPerkHolder holder = getPerkHolder(stack); - if(holder == null) + var data = stack.get(DataComponentRegistry.ARMOR_PERKS); + if(data == null){ return perkInstances; - perkInstances.addAll(holder.getPerkInstances()); + } + perkInstances.addAll(data.getPerkInstances(stack)); return perkInstances; } - @Deprecated - public static List getPerksFromPlayer(Player player){ - return getPerksFromLiving(player); - } - public static List getPerksFromLiving(LivingEntity player){ List perkInstances = new ArrayList<>(); for(ItemStack stack : player.getArmorSlots()){ @@ -73,42 +68,34 @@ public static List getPerksFromLiving(LivingEntity player){ public static int countForPerk(IPerk perk, LivingEntity player){ int maxCount = 0; for(ItemStack stack : player.getArmorSlots()){ - IPerkHolder holder = getPerkHolder(stack); - if(holder == null) + var data = stack.get(DataComponentRegistry.ARMOR_PERKS); + if(data == null){ continue; - for(PerkInstance instance : holder.getPerkInstances()){ + } + for(PerkInstance instance : data.getPerkInstances(stack)){ if(instance.getPerk() == perk){ - maxCount = Math.max(maxCount, instance.getSlot().value); + maxCount = Math.max(maxCount, instance.getSlot().value()); } } } return maxCount; } - @Deprecated(forRemoval = true) - public static int countForPerk(IPerk perk, Player player){ - return countForPerk(perk, (LivingEntity) player); - } - - public static @Nullable IPerkHolder getHolderForPerk(IPerk perk, LivingEntity entity){ - IPerkHolder highestHolder = null; + public static @Nullable ArmorPerkHolder getHolderForPerk(IPerk perk, LivingEntity entity){ + ArmorPerkHolder highestHolder = null; int maxCount = 0; for(ItemStack stack : entity.getArmorSlots()){ - IPerkHolder holder = getPerkHolder(stack); - if(holder == null) + var data = stack.get(DataComponentRegistry.ARMOR_PERKS); + if(data == null){ continue; - for(PerkInstance instance : holder.getPerkInstances()){ + } + for(PerkInstance instance : data.getPerkInstances(stack)){ if(instance.getPerk() == perk){ - maxCount = Math.max(maxCount, instance.getSlot().value); - highestHolder = holder; + maxCount = Math.max(maxCount, instance.getSlot().value()); + highestHolder = data; } } } return highestHolder; } - - @Deprecated(forRemoval = true) - public static @Nullable IPerkHolder getHolderForPerk(IPerk perk, Player player){ - return getHolderForPerk(perk, (LivingEntity) player); - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/StoredItemStack.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/StoredItemStack.java index 7dc4c7dd6b..21dbafeb1c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/StoredItemStack.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/StoredItemStack.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.client.container; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import java.util.Comparator; @@ -36,27 +35,27 @@ public ItemStack getActualStack() { s.setCount((int) count); return s; } - - public CompoundTag writeToNBT(CompoundTag tag) { - tag.putLong(ITEM_COUNT_NAME, getQuantity()); - tag.put(ITEMSTACK_NAME, stack.save(new CompoundTag())); - tag.getCompound(ITEMSTACK_NAME).remove("Count"); - return tag; - } - - public CompoundTag writeToNBT(CompoundTag tag, long q) { - tag.putLong(ITEM_COUNT_NAME, q); - tag.put(ITEMSTACK_NAME, stack.save(new CompoundTag())); - tag.getCompound(ITEMSTACK_NAME).remove("Count"); - return tag; - } - - public static StoredItemStack readFromNBT(CompoundTag tag) { - ItemStack cheat = ItemStack.of(tag); - tag.getCompound(ITEMSTACK_NAME).putByte("Count", (byte) 1); - StoredItemStack stack = new StoredItemStack(!cheat.isEmpty() ? cheat : ItemStack.of(tag.getCompound(ITEMSTACK_NAME)), !cheat.isEmpty() ? cheat.getCount() : tag.getLong(ITEM_COUNT_NAME)); - return !stack.stack.isEmpty() ? stack : null; - } +// +// public CompoundTag writeToNBT(CompoundTag tag) { +// tag.putLong(ITEM_COUNT_NAME, getQuantity()); +// tag.put(ITEMSTACK_NAME, stack.save(new CompoundTag())); +// tag.getCompound(ITEMSTACK_NAME).remove("Count"); +// return tag; +// } +// +// public CompoundTag writeToNBT(CompoundTag tag, long q) { +// tag.putLong(ITEM_COUNT_NAME, q); +// tag.put(ITEMSTACK_NAME, stack.save(new CompoundTag())); +// tag.getCompound(ITEMSTACK_NAME).remove("Count"); +// return tag; +// } +// +// public static StoredItemStack readFromNBT(CompoundTag tag) { +// ItemStack cheat = ItemStack.of(tag); +// tag.getCompound(ITEMSTACK_NAME).putByte("Count", (byte) 1); +// StoredItemStack stack = new StoredItemStack(!cheat.isEmpty() ? cheat : ItemStack.of(tag.getCompound(ITEMSTACK_NAME)), !cheat.isEmpty() ? cheat.getCount() : tag.getLong(ITEM_COUNT_NAME)); +// return !stack.stack.isEmpty() ? stack : null; +// } public static class ComparatorAmount implements IStoredItemStackComparator { public boolean reversed; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index b75a7adcab..29b9e1ab26 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -524,7 +524,7 @@ public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, } else { // Color code chosen to match GL11.glColor4f(1.0F, 0.7F, 0.7F, 1.0F); Component textComponent = Component.translatable("ars_nouveau.spell_book_gui.create") - .withStyle(s -> s.withStrikethrough(true).withColor(TextColor.parseColor("#FFB2B2"))); + .withStyle(s -> s.withStrikethrough(true).withColor(TextColor.parseColor("#FFB2B2").getOrThrow())); // The final argument to draw desaturates the above color from the text component graphics.drawString(font, textComponent, 233, 183, -8355712, false); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java index a84a20928e..edc7b5ec5b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java @@ -598,7 +598,7 @@ public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, } else { // Color code chosen to match GL11.glColor4f(1.0F, 0.7F, 0.7F, 1.0F); Component textComponent = Component.translatable("ars_nouveau.spell_book_gui.create") - .withStyle(s -> s.withStrikethrough(true).withColor(TextColor.parseColor("#FFB2B2"))); + .withStyle(s -> s.withStrikethrough(true).withColor(TextColor.parseColor("#FFB2B2").getOrThrow())); // The final argument to draw desaturates the above color from the text component graphics.drawString(font, textComponent, 233, 183, -8355712, false); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ArmorUpgradeRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ArmorUpgradeRecipeCategory.java index 23ed98d636..a0a0f43541 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ArmorUpgradeRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ArmorUpgradeRecipeCategory.java @@ -1,10 +1,11 @@ package com.hollingsworth.arsnouveau.client.jei; -import com.hollingsworth.arsnouveau.api.perk.IPerkProvider; +import com.hollingsworth.arsnouveau.api.perk.PerkSlot; import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; import com.hollingsworth.arsnouveau.common.armor.AnimatedMagicArmor; import com.hollingsworth.arsnouveau.common.crafting.recipes.ArmorUpgradeRecipe; import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.gui.ingredient.IRecipeSlotsView; import mezz.jei.api.helpers.IGuiHelper; @@ -21,6 +22,7 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public class ArmorUpgradeRecipeCategory extends EnchantingApparatusRecipeCategory { @@ -50,14 +52,12 @@ public void setRecipe(IRecipeLayoutBuilder builder, ArmorUpgradeRecipe recipe, I } for (ItemStack stack: stacks){ ItemStack copy = stack.copy(); - IPerkProvider perkProvider = PerkRegistry.getPerkProvider(stack.getItem()); + List> perkProvider = PerkRegistry.getPerkProvider(stack.getItem()); if (perkProvider != null) { - if (perkProvider.getPerkHolder(stack) instanceof ArmorPerkHolder armorPerkHolder) { - armorPerkHolder.setTier(recipe.tier-1); - } - if (perkProvider.getPerkHolder(copy) instanceof ArmorPerkHolder armorPerkHolder) { - armorPerkHolder.setTier(recipe.tier); - } + ArmorPerkHolder perkHolder = stack.getOrDefault(DataComponentRegistry.ARMOR_PERKS, new ArmorPerkHolder(null, List.of(), 0, new HashMap<>())); + stack.set(DataComponentRegistry.ARMOR_PERKS, perkHolder.setTier(recipe.tier-1)); + ArmorPerkHolder copyHolder = copy.getOrDefault(DataComponentRegistry.ARMOR_PERKS, new ArmorPerkHolder(null, List.of(), 0, new HashMap<>())); + copy.set(DataComponentRegistry.ARMOR_PERKS, copyHolder.setTier(recipe.tier)); } outputs.add(copy); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java index 7789db5768..91abcee612 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java @@ -292,10 +292,11 @@ public void renderSlate(BakedGeoModel model, AlterationTile tile) { if (!(PerkUtil.getPerkHolder(tile.armorStack) instanceof StackPerkHolder armorPerkHolder)) { return; } - List perks = armorPerkHolder.getSlotsForTier(); + List perks = armorPerkHolder.getSlotsForTier(tile.armorStack); + for (int i = 0; i < Math.min(perks.size(), rowNames.length); i++) { PerkSlot perkSlot = perks.get(i); - setSlateRow(model, rowNames[i], perkSlot.value); + setSlateRow(model, rowNames[i], perkSlot.value()); } List remainingRows = List.of(rowNames); remainingRows.subList(perks.size(), remainingRows.size()).forEach(s -> setSlateRow(model, s, 0)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java index 77ff1d95f2..70d7e22df2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java @@ -6,13 +6,13 @@ import com.hollingsworth.arsnouveau.api.client.IVariantColorProvider; import com.hollingsworth.arsnouveau.api.mana.IManaEquipment; import com.hollingsworth.arsnouveau.api.perk.*; -import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; import com.hollingsworth.arsnouveau.api.util.PerkUtil; import com.hollingsworth.arsnouveau.client.renderer.item.ArmorRenderer; import com.hollingsworth.arsnouveau.client.renderer.tile.GenericModel; import com.hollingsworth.arsnouveau.common.crafting.recipes.IDyeable; import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; import com.hollingsworth.arsnouveau.common.perk.RepairingPerk; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.MaterialRegistry; import net.minecraft.ChatFormatting; @@ -105,7 +105,7 @@ public Multimap getAttributeModifiers(EquipmentSlo attributes.put(PerkAttributes.MANA_REGEN_BONUS.get(), new AttributeModifier(uuid, "mana_regen_armor", perkHolder.getTier() + 1, AttributeModifier.Operation.ADD_VALUE)); for (PerkInstance perkInstance : perkHolder.getPerkInstances()) { IPerk perk = perkInstance.getPerk(); - attributes.putAll(perk.getModifiers(this.type.getSlot(), stack, perkInstance.getSlot().value)); + attributes.putAll(perk.getModifiers(this.type.getSlot(), stack, perkInstance.getSlot().value())); } } @@ -117,21 +117,22 @@ public Multimap getAttributeModifiers(EquipmentSlo @OnlyIn(Dist.CLIENT) public void appendHoverText(ItemStack stack, TooltipContext world, List tooltip, TooltipFlag flag) { super.appendHoverText(stack, world, tooltip, flag); - IPerkProvider perkProvider = PerkRegistry.getPerkProvider(stack.getItem()); - if (perkProvider != null) { - if (perkProvider.getPerkHolder(stack) instanceof ArmorPerkHolder armorPerkHolder) { - tooltip.add(Component.translatable("ars_nouveau.tier", armorPerkHolder.getTier() + 1).withStyle(ChatFormatting.GOLD)); - } - perkProvider.getPerkHolder(stack).appendPerkTooltip(tooltip, stack); + var data = stack.get(DataComponentRegistry.ARMOR_PERKS); + if (data != null) { + tooltip.add(Component.translatable("ars_nouveau.tier", data.getTier() + 1).withStyle(ChatFormatting.GOLD)); + data.appendPerkTooltip(tooltip, stack); } } @Override public void onDye(ItemStack stack, DyeColor dyeColor) { - IPerkHolder perkHolder = PerkUtil.getPerkHolder(stack); - if (perkHolder instanceof ArmorPerkHolder armorPerkHolder) { - armorPerkHolder.setColor(dyeColor.getName()); + + var data = stack.get(DataComponentRegistry.ARMOR_PERKS); + if(data == null){ + return; } + stack.set(DataComponentRegistry.ARMOR_PERKS, data.setColor(dyeColor.getName())); + } @Override @@ -184,7 +185,7 @@ public void setColor(String color, ItemStack armor) { @Override public String getColor(ItemStack object) { - IPerkHolder perkHolder = PerkUtil.getPerkHolder(object); + var perkHolder = PerkUtil.getPerkHolder(object); if(!(perkHolder instanceof ArmorPerkHolder data)){ return "purple"; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/AlterationTable.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/AlterationTable.java index 4aef524a4c..54656fc26f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/AlterationTable.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/AlterationTable.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.common.block; -import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; import com.hollingsworth.arsnouveau.api.util.PerkUtil; import com.hollingsworth.arsnouveau.common.block.tile.AlterationTile; import com.hollingsworth.arsnouveau.common.items.PerkItem; @@ -44,7 +43,7 @@ protected ItemInteractionResult useItemOn(ItemStack pStack, BlockState state, Le ItemStack stack = player.getMainHandItem(); // Attempt to put armor and remove perks if(tile.isMasterTile()){ - IPerkHolder holder = PerkUtil.getPerkHolder(stack); + var holder = PerkUtil.getPerkHolder(stack); if (holder instanceof StackPerkHolder) { if(tile.armorStack.isEmpty()){ tile.setArmorStack(stack, player); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/MagicFire.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/MagicFire.java index 6ef016344e..2da30e15e9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/MagicFire.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/MagicFire.java @@ -2,6 +2,7 @@ import com.google.common.collect.ImmutableMap; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.mojang.serialization.MapCodec; import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -9,7 +10,10 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.*; -import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.BaseFireBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.PipeBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -24,7 +28,7 @@ import java.util.stream.Collectors; public class MagicFire extends BaseFireBlock { - + public static final MapCodec CODEC = simpleCodec(MagicFire::new); public static final int MAX_AGE = 7; public static final IntegerProperty AGE = BlockStateProperties.AGE_7; public static final BooleanProperty NORTH = PipeBlock.NORTH; @@ -42,6 +46,10 @@ public class MagicFire extends BaseFireBlock { private static final VoxelShape SOUTH_AABB = Block.box(0.0D, 0.0D, 15.0D, 16.0D, 16.0D, 16.0D); private final Map shapesCache; + public MagicFire(Properties pProperties) { + this(pProperties, 1.0F); + } + public MagicFire(Properties pProperties, float pFireDamage) { super(pProperties, pFireDamage); this.registerDefaultState(this.stateDefinition.any().setValue(AGE, 0).setValue(NORTH, Boolean.FALSE).setValue(EAST, Boolean.FALSE).setValue(SOUTH, Boolean.FALSE).setValue(WEST, Boolean.FALSE).setValue(UP, Boolean.FALSE)); @@ -50,6 +58,11 @@ public MagicFire(Properties pProperties, float pFireDamage) { }).collect(Collectors.toMap(Function.identity(), MagicFire::calculateShape))); } + @Override + protected MapCodec codec() { + return CODEC; + } + private static VoxelShape calculateShape(BlockState p_53491_) { VoxelShape voxelshape = Shapes.empty(); if (p_53491_.getValue(UP)) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java index 176142eca9..05d29aeeca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java @@ -6,7 +6,6 @@ import com.hollingsworth.arsnouveau.api.util.SourceUtil; import com.hollingsworth.arsnouveau.common.block.tile.RotatingTurretTile; import com.hollingsworth.arsnouveau.common.entity.EntityProjectileSpell; -import com.hollingsworth.arsnouveau.common.items.WarpScroll; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketOneShotAnimation; import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; @@ -14,12 +13,10 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Position; -import net.minecraft.core.dispenser.BlockSource; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; -import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -41,17 +38,6 @@ public class RotatingSpellTurret extends BasicSpellTurret { public static HashMap ROT_TURRET_BEHAVIOR_MAP = new HashMap<>(); - @Override - public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { - if (player.getItemInHand(handIn).getItem() instanceof WarpScroll) { - BlockPos aimPos = WarpScroll.WarpScrollData.get(player.getItemInHand(handIn)).getPos(); - if (player.level().getBlockEntity(pos) instanceof RotatingTurretTile tile) { - tile.aim(aimPos, player); - } - } - return super.useItemOn(stack, state, worldIn, pos, player, handIn, hit); - } - //Direction Adjustments public void shootSpell(ServerLevel world, BlockPos pos) { if (!(world.getBlockEntity(pos) instanceof RotatingTurretTile tile)) return; @@ -62,7 +48,7 @@ public void shootSpell(ServerLevel world, BlockPos pos) { if (manaCost > 0 && SourceUtil.takeSourceWithParticles(pos, world, 10, manaCost) == null) return; Networking.sendToNearbyClient(world, pos, new PacketOneShotAnimation(pos)); - Position iposition = getDispensePosition(new BlockSourceImpl(world, pos), tile); + Position iposition = getDispensePosition(pos, tile); FakePlayer fakePlayer = ANFakePlayer.getPlayer(world); fakePlayer.setPos(pos.getX(), pos.getY(), pos.getZ()); EntitySpellResolver resolver = new EntitySpellResolver(new SpellContext(world, caster.getSpell(), fakePlayer, new TileCaster(tile, SpellContext.CasterType.TURRET))); @@ -75,12 +61,12 @@ public void shootSpell(ServerLevel world, BlockPos pos) { /** * Get the position where the dispenser at the given Coordinates should dispense to. */ - public static Position getDispensePosition(BlockSource coords, RotatingTurretTile tile) { + public static Position getDispensePosition(BlockPos coords, RotatingTurretTile tile) { Vec3 direction = tile.getShootAngle().normalize(); - double d0 = coords.x() + 0.5D * direction.x(); - double d1 = coords.y() + 0.5D * direction.y(); - double d2 = coords.z() + 0.5D * direction.z(); - return new PositionImpl(d0, d1, d2); + double d0 = coords.getX() + 0.5D * direction.x(); + double d1 = coords.getY() + 0.5D * direction.y(); + double d2 = coords.getZ() + 0.5D * direction.z(); + return new Vec3(d0, d1, d2); } public static Direction[] orderedByNearest(RotatingTurretTile pEntity) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java index 1a538d8cb2..870a349f36 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java @@ -6,10 +6,11 @@ import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.common.block.tile.ArcanePedestalTile; import com.hollingsworth.arsnouveau.common.block.tile.ScryersOculusTile; -import com.hollingsworth.arsnouveau.common.items.ScryerScroll; +import com.hollingsworth.arsnouveau.common.items.data.ScryData; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketMountCamera; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -73,12 +74,12 @@ public void openMenu(Level pLevel, BlockPos pPos, Player pPlayer) { return; } Minecraft.getInstance().setScreen(new GuiRadialMenu<>(new RadialMenu<>((int scroll) -> { - ScryerScroll.ScryerScrollData data = new ScryerScroll.ScryerScrollData(stackList.get(scroll)); - if (data.pos == null) { + ScryData data = stackList.get(scroll).get(DataComponentRegistry.SCRY_DATA); + if (data == null || data.pos() == null) { PortUtil.sendMessage(pPlayer, Component.translatable("ars_nouveau.scryers_eye.no_pos")); return; } - Networking.sendToServer(new PacketMountCamera(data.pos)); + Networking.sendToServer(new PacketMountCamera(data.pos())); }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtils.drawItemAsIcon(slotData.getDefaultInstance(), posestack, positionx, posy, size, transparent), 3))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java index 304c5c4a3d..2415b0b0c0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java @@ -8,12 +8,15 @@ import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.block.ThreePartBlock; import com.hollingsworth.arsnouveau.common.items.PerkItem; +import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; import com.hollingsworth.arsnouveau.common.items.data.StackPerkHolder; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; @@ -23,7 +26,6 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.AABB; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; @@ -31,6 +33,7 @@ import javax.annotation.Nullable; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Objects; @@ -74,15 +77,14 @@ public boolean isMasterTile() { } public void setArmorStack(ItemStack stack, Player player){ - IPerkHolder holder = PerkUtil.getPerkHolder(stack); - if (holder instanceof StackPerkHolder armorPerkHolder) { - this.perkList = new ArrayList<>(PerkUtil.getPerksAsItems(stack).stream().map(Item::getDefaultInstance).toList()); - armorPerkHolder.setPerks(new ArrayList<>()); - this.armorStack = stack.copy(); - stack.shrink(1); - this.newPerkTimer = 0; - updateBlock(); - } + ArmorPerkHolder holder = stack.getOrDefault(DataComponentRegistry.ARMOR_PERKS, new ArmorPerkHolder(null, List.of(), 0, new HashMap<>())); + this.perkList = new ArrayList<>(PerkUtil.getPerksAsItems(stack).stream().map(Item::getDefaultInstance).toList()); + stack.set(DataComponentRegistry.ARMOR_PERKS, holder.setPerks(new ArrayList<>())); + this.armorStack = stack.copy(); + stack.shrink(1); + this.newPerkTimer = 0; + updateBlock(); + } public void removePerk(Player player) { @@ -97,7 +99,7 @@ public void removePerk(Player player) { } public void removeArmorStack(Player player){ - IPerkHolder perkHolder = PerkUtil.getPerkHolder(armorStack); + IPerkHolder perkHolder = PerkUtil.getPerkHolder(armorStack); if (perkHolder instanceof StackPerkHolder armorPerkHolder) { armorPerkHolder.setPerks(perkList.stream().map(i ->{ if(i.getItem() instanceof PerkItem perkItem){ @@ -120,11 +122,11 @@ public void addPerkStack(ItemStack stack, Player player){ PortUtil.sendMessage(player, Component.translatable("ars_nouveau.perk.set_armor")); return; } - if(this.perkList.size() >= 3 || this.perkList.size() >= armorPerkHolder.getSlotsForTier().size()){ + if(this.perkList.size() >= 3 || this.perkList.size() >= armorPerkHolder.getSlotsForTier(stack).size()){ PortUtil.sendMessage(player, Component.translatable("ars_nouveau.perk.max_perks")); return; } - PerkSlot foundSlot = getAvailableSlot(perkHolder); + PerkSlot foundSlot = getAvailableSlot(perkHolder, stack); if(stack.getItem() instanceof PerkItem perkItem) { IPerk perk = perkItem.perk; if (foundSlot != null && perk.validForSlot(foundSlot, armorStack, player)) { @@ -137,11 +139,11 @@ public void addPerkStack(ItemStack stack, Player player){ } } - private PerkSlot getAvailableSlot(IPerkHolder perkHolder){ - if(this.perkList.size() >= perkHolder.getSlotsForTier().size()){ + private PerkSlot getAvailableSlot(IPerkHolder perkHolder, ItemStack stack){ + if(this.perkList.size() >= perkHolder.getSlotsForTier(stack).size()){ return null; }else{ - return perkHolder.getSlotsForTier().get(this.perkList.size()); + return perkHolder.getSlotsForTier(stack).get(this.perkList.size()); } } @@ -157,14 +159,12 @@ public void dropItems(){ @Override protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); - CompoundTag armorTag = new CompoundTag(); - armorStack.save(armorTag); + Tag armorTag = armorStack.save(pRegistries); tag.put("armorStack", armorTag); tag.putInt("numPerks", perkList.size()); int count = 0; for(ItemStack i : perkList){ - CompoundTag perkTag = new CompoundTag(); - i.save(perkTag); + Tag perkTag = i.save(pRegistries); tag.put("perk" + count, perkTag); count++; } @@ -174,22 +174,17 @@ protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries @Override protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.loadAdditional(compound, pRegistries); - this.armorStack = ItemStack.of(compound.getCompound("armorStack")); + this.armorStack = ItemStack.parseOptional(pRegistries, compound.getCompound("armorStack")); int count = compound.getInt("numPerks"); perkList = new ArrayList<>(); for(int i = 0; i < count; i++){ CompoundTag perkTag = compound.getCompound("perk" + i); - ItemStack perk = ItemStack.of(perkTag); + ItemStack perk = ItemStack.parseOptional(pRegistries, perkTag); perkList.add(perk); } this.newPerkTimer = compound.getInt("newPerkTimer"); } - @Override - public AABB getRenderBoundingBox() { - return super.getRenderBoundingBox().inflate(2); - } - @Override public void tick(Level level, BlockState state, BlockPos pos) { if (level.isClientSide) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java index 35d9e30993..753c2a6df5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java @@ -10,6 +10,7 @@ import com.hollingsworth.arsnouveau.common.items.data.ItemScrollData; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; @@ -180,8 +181,8 @@ protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistrie @Override public void getTooltip(List tooltip) { tooltip.add(Component.translatable("ars_nouveau.item_detector.count", (inverted ? "< " : "> ") + neededCount)); - if(filterStack.getItem() instanceof ItemScroll && filterStack.hasTag()){ - ItemScrollData.ItemScrollData scrollData = new ItemScrollData.ItemScrollData(filterStack); + if(filterStack.getItem() instanceof ItemScroll){ + ItemScrollData scrollData = filterStack.getOrDefault(DataComponentRegistry.ITEM_SCROLL_DATA, new ItemScrollData(List.of())); for (ItemStack s : scrollData.getItems()) { tooltip.add(Component.literal(s.getHoverName().getString()).withStyle(ChatFormatting.GOLD)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java index 80c8748117..da83b466f1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java @@ -269,7 +269,7 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis } CompoundTag itemsTag = new CompoundTag(); itemsTag.putInt("numStacks", consumedStacks.size()); - this.consumedStacks = NBTUtil.readItems(compound, "consumed"); + this.consumedStacks = NBTUtil.readItems(pRegistries, compound, "consumed"); this.craftingTicks = compound.getInt("craftingTicks"); this.crafting = compound.getBoolean("crafting"); this.autoYoink = !compound.contains("autoYoink") || compound.getBoolean("autoYoink"); @@ -288,7 +288,7 @@ public void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistri } else { compound.putString("recipe", ""); } - NBTUtil.writeItems(compound, "consumed", consumedStacks); + NBTUtil.writeItems(pRegistries, compound, "consumed", consumedStacks); compound.putInt("craftingTicks", craftingTicks); compound.putBoolean("crafting", crafting); compound.putBoolean("autoYoink", autoYoink); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/command/ResetCommand.java b/src/main/java/com/hollingsworth/arsnouveau/common/command/ResetCommand.java index 9ba164bfe8..74f6ae13c3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/command/ResetCommand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/command/ResetCommand.java @@ -27,12 +27,16 @@ private static int resetPlayers(CommandSourceStack source, Collection { + var iMana = CapabilityRegistry.getMana((LivingEntity) e).orElse(null); + if (iMana != null) { iMana.setBookTier(0); iMana.setGlyphBonus(0); - }); - CapabilityRegistry.getPlayerDataCap((LivingEntity) e).ifPresent(iPlayerCap -> iPlayerCap.setKnownGlyphs(new ArrayList<>())); - CapabilityRegistry.getPlayerDataCap((LivingEntity) e).ifPresent(ifam -> ifam.setUnlockedFamiliars(new ArrayList<>())); + } + var playerCap = CapabilityRegistry.getPlayerDataCap((LivingEntity) e).orElse(null); + if (playerCap != null) { + playerCap.setKnownGlyphs(new ArrayList<>()); + playerCap.setUnlockedFamiliars(new ArrayList<>()); + } } source.sendSuccess(() -> Component.translatable("ars_nouveau.reset.cleared"), true); return 1; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java index 726c88cb87..3a18908ec9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java @@ -49,7 +49,7 @@ public boolean doesReagentMatch(ApparatusRecipeInput input, Level level, @org.je @Override public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.annotations.Nullable Player player) { - IPerkHolder perkHolder = PerkUtil.getPerkHolder(input.catalyst()); + IPerkHolder perkHolder = PerkUtil.getPerkHolder(input.catalyst()); if(!(perkHolder instanceof ArmorPerkHolder armorPerkHolder)){ return false; } @@ -64,7 +64,7 @@ public ItemStack getResultItem(HolderLookup.Provider pRegistries) { @Override public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider p_346030_) { ItemStack reagent = input.catalyst(); - IPerkHolder perkHolder = PerkUtil.getPerkHolder(reagent); + IPerkHolder perkHolder = PerkUtil.getPerkHolder(reagent); if(!(perkHolder instanceof ArmorPerkHolder armorPerkHolder)){ return reagent.copy(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java index afe4ad4964..e53b64587f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java @@ -10,7 +10,6 @@ import net.minecraft.core.HolderLookup; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -28,14 +27,8 @@ public class GlyphRecipe implements Recipe { public final ItemStack output; public final List inputs; - public ResourceLocation id; public final int exp; - public GlyphRecipe(ResourceLocation id, ItemStack output, List inputs, int exp) { - this(output, inputs, exp); - this.id = id; - } - public GlyphRecipe(ItemStack output, List inputs, int exp) { this.output = output; this.inputs = inputs; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java index 716e4b083b..60fe3c29e2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java @@ -10,6 +10,7 @@ import com.hollingsworth.arsnouveau.common.spell.method.MethodUnderfoot; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import com.mojang.serialization.JsonOps; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; import net.minecraft.tags.ItemTags; @@ -127,7 +128,7 @@ public void collectJsons(CachedOutput pOutput) { add(get(EffectRewind.INSTANCE).withItem(ItemsRegistry.MANIPULATION_ESSENCE).withItem(Items.CLOCK, 3)); for (GlyphRecipe recipe : recipes) { Path path = getScribeGlyphPath(output, recipe.output.getItem()); - saveStable(pOutput, recipe.asRecipe(), path); + saveStable(pOutput, GlyphRecipe.CODEC.encodeStart(JsonOps.INSTANCE, recipe).getOrThrow(), path); } } @@ -136,7 +137,7 @@ public void add(GlyphRecipe recipe) { } public GlyphRecipe get(AbstractSpellPart spellPart) { - return new GlyphRecipe(spellPart.getRegistryName(), spellPart.glyphItem.getDefaultInstance(), new ArrayList<>(), getExpFromTier(spellPart)); + return new GlyphRecipe(spellPart.glyphItem.getDefaultInstance(), new ArrayList<>(), getExpFromTier(spellPart)); } public int getExpFromTier(AbstractSpellPart spellPart) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java index 5ae98a1fdc..df66ce7838 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java @@ -48,7 +48,7 @@ protected void addTags(HolderLookup.Provider pProvider) { this.tag(BERRY_TAG).add(BlockRegistry.SOURCEBERRY_BUSH.asItem()); - this.tag(ItemTags.MUSIC_DISCS).add(ItemsRegistry.FIREL_DISC.get(), ItemsRegistry.WILD_HUNT.get(), ItemsRegistry.SOUND_OF_GLASS.get()); + this.tag(Tags.Items.MUSIC_DISCS).add(ItemsRegistry.FIREL_DISC.get(), ItemsRegistry.WILD_HUNT.get(), ItemsRegistry.SOUND_OF_GLASS.get()); this.tag(MAGIC_FOOD) .add(ItemsRegistry.SOURCE_BERRY_PIE.get(), ItemsRegistry.SOURCE_BERRY_ROLL.get()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java index bc47c33501..4d8c385c1f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java @@ -7,6 +7,7 @@ import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.random.WeightedRandomList; import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; @@ -35,7 +36,7 @@ public void collectJsons(CachedOutput pOutput) { protected void addEntries() { ArrayList bats = new ArrayList<>(); bats.add(new SummonRitualRecipe.WeightedMobType(EntityType.getKey(EntityType.BAT))); - recipes.add(new SummonRitualRecipeWrapper(ArsNouveau.prefix( "bats"), new SummonRitualRecipe(Ingredient.of(Items.AMETHYST_SHARD), SummonRitualRecipe.MobSource.MOB_LIST, 5, bats))); + recipes.add(new SummonRitualRecipeWrapper(ArsNouveau.prefix( "bats"), new SummonRitualRecipe(Ingredient.of(Items.AMETHYST_SHARD), SummonRitualRecipe.MobSource.MOB_LIST, 5, WeightedRandomList.create(bats)))); } protected static Path getRecipePath(Path path, String id) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java index 51dd563fd3..56a37c5d3d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java @@ -33,7 +33,7 @@ public class WorldgenProvider extends DatapackBuiltinEntriesProvider { .add(Registries.CONFIGURED_FEATURE, WorldgenRegistry::bootstrapConfiguredFeatures) .add(Registries.PLACED_FEATURE, WorldgenRegistry::bootstrapPlacedFeatures) .add(NeoForgeRegistries.Keys.BIOME_MODIFIERS, BiomeModifierRegistry::bootstrap) - .add(NeoForgeRegistries.Keys.BIOMES, BiomeRegistry::bootstrap); + .add(Registries.BIOME, BiomeRegistry::bootstrap); public WorldgenProvider(PackOutput output, CompletableFuture registries) { super(output, registries, BUILDER, Set.of(ArsNouveau.MODID)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java index e68a6b8403..316d299f5c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java @@ -21,8 +21,6 @@ import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; import net.minecraft.network.syncher.EntityDataAccessor; @@ -37,7 +35,6 @@ import net.minecraft.world.entity.item.FallingBlockEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.DirectionalPlaceContext; -import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.GameRules; import net.minecraft.world.level.Level; @@ -355,11 +352,6 @@ protected void onHitEntity(EntityHitResult pResult) { } } - if (!this.level.isClientSide && owner instanceof LivingEntity) { - EnchantmentHelper.doPostHurtEffects(livingentity, owner); - EnchantmentHelper.doPostDamageEffects((LivingEntity) owner, livingentity); - } - this.doPostHurtEffects(livingentity); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java index 6fac8d3463..22977c138f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java @@ -3,8 +3,6 @@ import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.Item; @@ -46,6 +44,7 @@ public ItemStack getStack() { ItemStack stack = item.getDefaultInstance(); if (item instanceof PlayerHeadItem){ stack.setTag(this.blockData); + } return stack; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/LightningEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/LightningEntity.java index dfc64083a9..08b1d1f465 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/LightningEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/LightningEntity.java @@ -146,13 +146,14 @@ private void igniteBlocks(int extraIgnitions) { public float getDamage(Entity entity) { float baseDamage = getDamage() + ampScalar * amps + (entity.isInWaterOrRain() ? wetBonus : 0.0f); int multiplier = 1; - for (ItemStack i : entity.getArmorSlots()) { - IEnergyStorage energyStorage = i.getCapability(Capabilities.EnergyStorage.ITEM); - if (energyStorage != null) { - multiplier++; + + if (entity instanceof LivingEntity livingEntity) { + for (ItemStack i : livingEntity.getArmorSlots()) { + IEnergyStorage energyStorage = i.getCapability(Capabilities.EnergyStorage.ITEM); + if (energyStorage != null) { + multiplier++; + } } - } - if (entity instanceof LivingEntity) { IEnergyStorage energyStorage = ((LivingEntity) entity).getMainHandItem().getCapability(Capabilities.EnergyStorage.ITEM); if (energyStorage != null) multiplier++; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java index 1f79ef7f09..af74d55d9d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java @@ -19,6 +19,7 @@ import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketANEffect; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.core.BlockPos; @@ -113,8 +114,8 @@ protected InteractionResult mobInteract(Player player, InteractionHand hand) { return super.mobInteract(player, hand); ItemStack stack = player.getItemInHand(hand); if (stack.getItem() == ItemsRegistry.DENY_ITEM_SCROLL.asItem() && getTile() != null) { - ItemScrollData.ItemScrollData scrollData = new ItemScrollData.ItemScrollData(stack); - getTile().ignoreItems.addAll(scrollData.getItems()); + ItemScrollData scrollData = stack.getOrDefault(DataComponentRegistry.ITEM_SCROLL_DATA, new ItemScrollData()); + getTile().ignoreItems.addAll(scrollData.mutable().getItems()); PortUtil.sendMessage(player, Component.translatable("ars_nouveau.whirlisprig.ignore")); } return super.mobInteract(player, hand); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java index eeef68116c..c29b8ecf2e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java @@ -7,9 +7,9 @@ import com.hollingsworth.arsnouveau.api.event.SpellResolveEvent; import com.hollingsworth.arsnouveau.api.perk.IEffectResolvePerk; import com.hollingsworth.arsnouveau.api.perk.IPerk; -import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; import com.hollingsworth.arsnouveau.api.perk.PerkInstance; import com.hollingsworth.arsnouveau.api.util.PerkUtil; +import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; import com.hollingsworth.arsnouveau.common.perk.TotemPerk; import com.hollingsworth.arsnouveau.common.util.PortUtil; import net.minecraft.network.chat.Component; @@ -18,7 +18,6 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.living.LivingDeathEvent; @@ -131,7 +130,7 @@ public static void postSpellDamageEvent(final SpellDamageEvent.Post event) { @SubscribeEvent public static void totemEvent(final LivingDeathEvent event) { LivingEntity entity = event.getEntity(); - IPerkHolder holder = PerkUtil.getHolderForPerk(TotemPerk.INSTANCE, entity); + ArmorPerkHolder holder = PerkUtil.getHolderForPerk(TotemPerk.INSTANCE, entity); if (holder == null) return; TotemPerk.Data perkData = new TotemPerk.Data(holder); @@ -151,7 +150,7 @@ public static void totemEvent(final LivingDeathEvent event) { @SubscribeEvent public static void sleepEvent(final SleepFinishedTimeEvent event) { for (Player p : event.getLevel().players()) { - IPerkHolder holder = PerkUtil.getHolderForPerk(TotemPerk.INSTANCE, (LivingEntity) p); + ArmorPerkHolder holder = PerkUtil.getHolderForPerk(TotemPerk.INSTANCE, p); if (holder == null) continue; TotemPerk.Data perkData = new TotemPerk.Data(holder); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/BlankParchmentItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/BlankParchmentItem.java index 4f96fddc84..cd1ea17c0b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/BlankParchmentItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/BlankParchmentItem.java @@ -3,6 +3,8 @@ import com.hollingsworth.arsnouveau.api.camera.ICameraMountable; import com.hollingsworth.arsnouveau.api.item.IScribeable; import com.hollingsworth.arsnouveau.common.block.tile.ScribesTile; +import com.hollingsworth.arsnouveau.common.items.data.ScryData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; @@ -29,8 +31,7 @@ public InteractionResult useOn(UseOnContext pContext) { return super.useOn(pContext); if (pContext.getLevel().getBlockEntity(pContext.getClickedPos()) instanceof ICameraMountable) { ItemStack stack = new ItemStack(ItemsRegistry.SCRYER_SCROLL.get()); - ScryerScroll.ScryerScrollData data = new ScryerScroll.ScryerScrollData(stack); - data.setPos(pContext.getClickedPos(), stack); + stack.set(DataComponentRegistry.SCRY_DATA, new ScryData(pContext.getClickedPos())); if (!pContext.getPlayer().addItem(stack)) { pContext.getLevel().addFreshEntity(new ItemEntity(pContext.getLevel(), pContext.getPlayer().getX(), pContext.getPlayer().getY(), pContext.getPlayer().getZ(), stack)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java index 35562d9c7c..fa26dd36b6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java @@ -12,6 +12,7 @@ import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; import com.hollingsworth.arsnouveau.common.util.PortUtil; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; @@ -42,7 +43,7 @@ public EnchantersSword(Tier iItemTier, int baseDamage, float baseAttackSpeed) { } public EnchantersSword(Tier iItemTier, int baseDamage, float baseAttackSpeed, Properties properties) { - super(iItemTier, baseDamage, baseAttackSpeed, properties); + super(iItemTier, properties.component(DataComponents.TOOL, createToolProperties()).attributes(SwordItem.createAttributes(iItemTier, baseDamage, baseAttackSpeed))); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/JarOfLight.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/JarOfLight.java index 34e0b7df3e..b3a84ad19d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/JarOfLight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/JarOfLight.java @@ -2,10 +2,11 @@ import com.hollingsworth.arsnouveau.api.util.BlockUtil; import com.hollingsworth.arsnouveau.common.block.LightBlock; +import com.hollingsworth.arsnouveau.common.items.data.LightJarData; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; @@ -30,36 +31,31 @@ public void inventoryTick(ItemStack stack, Level worldIn, Entity entityIn, int i if (worldIn.isClientSide) return; - CompoundTag tag = stack.getTag(); - if (tag == null) - stack.setTag(new CompoundTag()); - tag = stack.getTag(); - if (lightExists(tag)) { + LightJarData data = stack.getOrDefault(DataComponentRegistry.LIGHT_JAR, new LightJarData(null, false)); + if (!data.enabled()) { + return; + } + BlockPos lightLocation = data.pos(); + BlockState state = worldIn.getBlockState(lightLocation); + // The previous light block was destroyed. + if (!(state.getBlock() instanceof LightBlock)) { + stack.set(DataComponentRegistry.LIGHT_JAR, new LightJarData(null, true)); + } - //This shouldn't happen but catch it anyway - if (getLightLocation(tag) == null) { - setLightExists(tag, false); - return; + if (BlockUtil.distanceFrom(lightLocation, entityIn.blockPosition()) > 7) { + Direction opposite = entityIn.getDirection().getOpposite(); + BlockPos preferredLightPos = entityIn.blockPosition().relative(opposite, 1); + if (worldIn.getBlockState(lightLocation).getBlock() instanceof LightBlock) { + worldIn.setBlockAndUpdate(lightLocation, Blocks.AIR.defaultBlockState()); } - - BlockPos lightLocation = getLightLocation(tag); - - BlockState state = worldIn.getBlockState(lightLocation); - // The previous light block was destroyed. - if (!(state.getBlock() instanceof LightBlock)) { - setLightExists(tag, false); - setLightLocation(tag, null); - } - - if (BlockUtil.distanceFrom(lightLocation, entityIn.blockPosition()) > 7) { - Direction opposite = entityIn.getDirection().getOpposite(); - BlockPos preferredLightPos = entityIn.blockPosition().relative(opposite, 1); - removeLight(worldIn, tag); - if (!placeLight(worldIn, preferredLightPos, tag)) - placeLight(worldIn, preferredLightPos.above(2), tag); - + if (!placeLight(worldIn, preferredLightPos)) { + placeLight(worldIn, preferredLightPos.above(2)); + stack.set(DataComponentRegistry.LIGHT_JAR, new LightJarData(preferredLightPos.above(2), true)); + }else { + stack.set(DataComponentRegistry.LIGHT_JAR, new LightJarData(preferredLightPos, true)); } } + } @Override @@ -68,65 +64,32 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In if (worldIn.isClientSide) return new InteractionResultHolder<>(InteractionResult.SUCCESS, itemstack); - CompoundTag tag = playerIn.getItemInHand(handIn).getTag(); - - if (tag == null) - return new InteractionResultHolder<>(InteractionResult.SUCCESS, itemstack); - //Remove light - if (lightExists(tag)) { + LightJarData tag = itemstack.getOrDefault(DataComponentRegistry.LIGHT_JAR, new LightJarData(null, false)); + if (tag.pos() != null) { removeLight(worldIn, tag); + itemstack.set(DataComponentRegistry.LIGHT_JAR, new LightJarData(null, false)); return new InteractionResultHolder<>(InteractionResult.SUCCESS, itemstack); } // No light exists. Place a new one. - placeLight(worldIn, playerIn.blockPosition(), tag); + placeLight(worldIn, playerIn.blockPosition()); + return new InteractionResultHolder<>(InteractionResult.SUCCESS, itemstack); } - public boolean placeLight(Level world, BlockPos pos, CompoundTag tag) { + public boolean placeLight(Level world, BlockPos pos) { if (world.getBlockState(pos).isAir()) { world.setBlockAndUpdate(pos, BlockRegistry.LIGHT_BLOCK.get().defaultBlockState()); - setLightExists(tag, true); - setLightLocation(tag, pos); return true; } return false; } - public void removeLight(Level world, CompoundTag tag) { - if (getLightLocation(tag) == null) - return; - - if (world.getBlockState(getLightLocation(tag)).getBlock() instanceof LightBlock) - world.setBlockAndUpdate(getLightLocation(tag), Blocks.AIR.defaultBlockState()); - - setLightExists(tag, false); - } - - - public boolean lightExists(CompoundTag tag) { - return tag.contains("light_exists") && tag.getBoolean("light_exists"); - } - - public void setLightExists(CompoundTag tag, boolean lightExists) { - tag.putBoolean("light_exists", lightExists); - } - - public BlockPos getLightLocation(CompoundTag tag) { - if (!tag.contains("x") || !tag.contains("y") || !tag.contains("z")) - return null; - return new BlockPos(tag.getInt("x"), tag.getInt("y"), tag.getInt("z")); - } - - public void setLightLocation(CompoundTag tag, BlockPos pos) { - if (pos == null) { - tag.remove("x"); - tag.remove("y"); - tag.remove("z"); + public void removeLight(Level world, LightJarData lightJarData) { + BlockPos pos = lightJarData.pos(); + if(pos == null){ return; } - tag.putInt("x", pos.getX()); - tag.putInt("y", pos.getY()); - tag.putInt("z", pos.getZ()); + if (world.getBlockState(pos).getBlock() instanceof LightBlock) + world.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState()); } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellArrow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellArrow.java index 8eb18a3edc..66d844bd9c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellArrow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellArrow.java @@ -4,9 +4,9 @@ import com.hollingsworth.arsnouveau.api.mana.IManaCap; import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.PlayerCaster; -import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.hollingsworth.arsnouveau.common.entity.EntitySpellArrow; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentPierce; +import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.LivingEntity; @@ -15,8 +15,10 @@ import net.minecraft.world.entity.projectile.Arrow; import net.minecraft.world.item.ArrowItem; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -38,13 +40,13 @@ public void modifySpell(Spell spell) { } @Override - public AbstractArrow createArrow(Level world, ItemStack stack, LivingEntity shooter) { + public AbstractArrow createArrow(Level world, ItemStack stack, LivingEntity shooter, @Nullable ItemStack bowStack) { IManaCap mana = CapabilityRegistry.getMana(shooter).orElse(null); if (mana == null) - return new Arrow(world, shooter); - EntitySpellArrow spellArrow = new EntitySpellArrow(world, shooter); + return new Arrow(world, shooter, new ItemStack(Items.ARROW), bowStack); + EntitySpellArrow spellArrow = new EntitySpellArrow(world, shooter, ItemStack.EMPTY, bowStack); if (!(shooter instanceof Player entity) || !((shooter).getMainHandItem().getItem() instanceof ICasterTool caster)) - return super.createArrow(world, stack, shooter); + return super.createArrow(world, stack, shooter, bowStack); ISpellCaster spellCaster = caster.getSpellCaster(entity.getMainHandItem()); Spell spell = spellCaster.getSpell(); modifySpell(spell); @@ -53,14 +55,13 @@ public AbstractArrow createArrow(Level world, ItemStack stack, LivingEntity shoo return spellArrow; } - @Override - public void appendHoverText(ItemStack stack, Level worldIn, List tooltip, TooltipFlag flagIn) { - tooltip.add(Component.translatable("ars_nouveau.spell_arrow.desc")); + public void appendHoverText(ItemStack pStack, TooltipContext pContext, List pTooltipComponents, TooltipFlag pTooltipFlag) { + pTooltipComponents.add(Component.translatable("ars_nouveau.spell_arrow.desc")); Spell spell = new Spell(); for (int i = 0; i < numParts; i++) { spell.recipe.add(part); } - tooltip.add(Component.literal(spell.getDisplayString())); + pTooltipComponents.add(Component.literal(spell.getDisplayString())); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java index 97bbddd202..983fa29a3e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.common.items.data.StarbuncleCharmData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; @@ -18,8 +19,8 @@ public StarbuncleShard(){ @Override public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { - if(stack.hasTag()){ - StarbuncleCharmData.StarbuncleCharmData data = new StarbuncleCharmData.StarbuncleCharmData(stack.getOrCreateTag()); + StarbuncleCharmData data = stack.get(DataComponentRegistry.STARBUNCLE_DATA); + if(data != null){ if (data.name != null) { tooltip2.add(data.name); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java index 6b8adce329..bdf36c1145 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java @@ -6,8 +6,10 @@ import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketWarpPosition; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; @@ -32,8 +34,8 @@ public boolean onEntityItemUpdate(ItemStack stack, ItemEntity entity) { if (entity.getCommandSenderWorld().isClientSide) return false; - String displayName = stack.hasCustomHoverName() ? stack.getHoverName().getString() : ""; - WarpScrollData data = WarpScrollData.get(stack); + String displayName = stack.get(DataComponents.CUSTOM_NAME) != null ? stack.getHoverName().getString() : ""; + WarpScrollData data = stack.getOrDefault(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(null, null, null, false)); if (data.isValid() && data.canTeleportWithDim(entity.getCommandSenderWorld().dimension().location().toString()) && SourceUtil.hasSourceNearby(entity.blockPosition(), entity.getCommandSenderWorld(), 10, 9000) @@ -44,7 +46,7 @@ public boolean onEntityItemUpdate(ItemStack stack, ItemEntity entity) { world.sendParticles(ParticleTypes.PORTAL, pos.getX(), pos.getY() + 1.0, pos.getZ(), 10, (world.random.nextDouble() - 0.5D) * 2.0D, -world.random.nextDouble(), (world.random.nextDouble() - 0.5D) * 2.0D, 0.1f); world.playSound(null, pos, SoundEvents.ILLUSIONER_CAST_SPELL, SoundSource.NEUTRAL, 1.0f, 1.0f); - ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.CREATE_PORTAL, world, pos, 4); + ANCriteriaTriggers.rewardNearbyPlayers(ANCriteriaTriggers.CREATE_PORTAL.get(), world, pos, 4); stack.shrink(1); return true; } @@ -54,7 +56,7 @@ public boolean onEntityItemUpdate(ItemStack stack, ItemEntity entity) { @Override public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { ItemStack stack = player.getItemInHand(hand); - WarpScrollData data = WarpScrollData.get(stack); + WarpScrollData data = stack.getOrDefault(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(null, null, null, false)); if (hand == InteractionHand.OFF_HAND) return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); @@ -67,7 +69,7 @@ public InteractionResultHolder use(Level world, Player player, Intera return InteractionResultHolder.fail(stack); } BlockPos pos = data.pos(); - player.teleportToWithTicket(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); + player.teleportTo(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); Vec2 rotation = data.rotation(); player.setXRot(rotation.x); player.setYRot(rotation.y); @@ -80,8 +82,7 @@ public InteractionResultHolder use(Level world, Player player, Intera } if (player.isShiftKeyDown()) { ItemStack newWarpStack = new ItemStack(ItemsRegistry.WARP_SCROLL.get()); - WarpScrollData newData = new WarpScrollData(newWarpStack); - newData.setData(player.blockPosition(), player.getCommandSenderWorld().dimension().location().toString(), player.getRotationVector()); + newWarpStack.set(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(player.blockPosition(), player.getCommandSenderWorld().dimension().location().toString(), player.getRotationVector(), false)); boolean didAdd; if (stack.getCount() == 1) { stack = newWarpStack; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java index 78e52ed933..d86bf660cb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.api.perk.IPerk; import com.hollingsworth.arsnouveau.api.perk.PerkSlot; +import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -10,6 +11,7 @@ import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; import java.util.ArrayList; import java.util.Comparator; @@ -20,7 +22,6 @@ public class ArmorPerkHolder extends StackPerkHolder { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.STRING.fieldOf("color").forGetter(ArmorPerkHolder::getColor), - PerkSlot.TIERED_LIST_CODEC.fieldOf("slotsForTier").forGetter(i -> i.slotsForTier), StackPerkHolder.PERK_CODEC.listOf().fieldOf("perks").forGetter(ArmorPerkHolder::getPerks), Codec.INT.fieldOf("tier").forGetter(ArmorPerkHolder::getTier), StackPerkHolder.PERK_TAG_CODEC.fieldOf("perkTags").forGetter(ArmorPerkHolder::getPerkTags) @@ -29,29 +30,29 @@ public class ArmorPerkHolder extends StackPerkHolder { public static final StreamCodec STREAM_CODEC = CheatSerializer.create(CODEC); private String color; - private List> slotsForTier; - public ArmorPerkHolder(String color, List> slotsForTier, List perks, int tier, Map perkTags) { + + public ArmorPerkHolder(String color, List perks, int tier, Map perkTags) { super(perks, tier, perkTags); this.color = color; - this.slotsForTier = List.copyOf(slotsForTier); } public String getColor() { return color == null ? DyeColor.PURPLE.getName() : color; } - public void setColor(String color) { - this.color = color; + public ArmorPerkHolder setColor(String color) { + return new ArmorPerkHolder(color, getPerks(), getTier(), getPerkTags()); } @Override public ArmorPerkHolder setPerks(List perks) { - return new ArmorPerkHolder(color, slotsForTier, perks, getTier(), getPerkTags()); + return new ArmorPerkHolder(color, perks, getTier(), getPerkTags()); } @Override - public List getSlotsForTier() { + public List getSlotsForTier(ItemStack stack) { + List> slotsForTier = PerkRegistry.getPerkProvider(stack.getItem()); List slots = new ArrayList<>(slotsForTier.get(getTier())); slots.sort(Comparator.comparingInt((a) -> -a.value())); return slots; @@ -59,11 +60,11 @@ public List getSlotsForTier() { @Override public ArmorPerkHolder setTier(int tier) { - return new ArmorPerkHolder(color, slotsForTier, getPerks(), tier, getPerkTags()); + return new ArmorPerkHolder(color, getPerks(), tier, getPerkTags()); } @Override public ArmorPerkHolder setTagForPerk(IPerk perk, CompoundTag tag) { - return new ArmorPerkHolder(color, slotsForTier, getPerks(), getTier(), Util.copyAndPut(getPerkTags(), perk, tag)); + return new ArmorPerkHolder(color, getPerks(), getTier(), Util.copyAndPut(getPerkTags(), perk, tag)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java index f656918079..906675e276 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java @@ -15,6 +15,7 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; +import java.util.stream.Collectors; public class ItemScrollData implements NBTComponent, TooltipProvider { @@ -63,7 +64,7 @@ public static class Mutable { private final List list; public Mutable(ItemScrollData data) { - this.list = new ArrayList<>(data.items); + this.list = data.items.stream().map(ItemStack::copy).collect(Collectors.toCollection(ArrayList::new)); } public boolean add(ItemStack stack) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/LightJarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/LightJarData.java new file mode 100644 index 0000000000..2d7c24edd0 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/LightJarData.java @@ -0,0 +1,17 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; + +public record LightJarData(BlockPos pos, boolean enabled) { + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockPos.CODEC.fieldOf("pos").forGetter(LightJarData::pos), + Codec.BOOL.fieldOf("enabled").forGetter(LightJarData::enabled) + ).apply(instance, LightJarData::new)); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite(BlockPos.STREAM_CODEC, LightJarData::pos, ByteBufCodecs.BOOL,LightJarData::enabled, LightJarData::new); +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateBookGUI.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateBookGUI.java index 7c1cb01d47..b8d4c274ce 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateBookGUI.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateBookGUI.java @@ -16,12 +16,12 @@ public class PacketUpdateBookGUI extends AbstractPacket{ //Decoder public PacketUpdateBookGUI(RegistryFriendlyByteBuf buf) { - bookStack = buf.readItem(); + bookStack = ItemStack.STREAM_CODEC.decode(buf); } //Encoder public void toBytes(RegistryFriendlyByteBuf buf) { - buf.writeItem(bookStack); + ItemStack.STREAM_CODEC.encode(buf, bookStack); } public PacketUpdateBookGUI(ItemStack stack) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ChillingPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ChillingPerk.java index 7e2306a9f3..3bdd859fe9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ChillingPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ChillingPerk.java @@ -36,7 +36,7 @@ public void onPreResolve(HitResult rayTraceResult, Level world, @NotNull LivingE if(effect instanceof IDamageEffect damageEffect && rayTraceResult instanceof EntityHitResult entityHitResult && entityHitResult.getEntity() instanceof LivingEntity livingEntity){ if(damageEffect.canDamage(shooter, spellStats, spellContext, resolver, entityHitResult.getEntity()) && shooter != entityHitResult.getEntity()){ livingEntity.setTicksFrozen(livingEntity.getTicksFrozen() + 1); - livingEntity.addEffect(new MobEffectInstance(ModPotions.FREEZING_EFFECT, perkInstance.getSlot().value * 10 * 20, perkInstance.getSlot().value >= 3 ? 2 : 1)); + livingEntity.addEffect(new MobEffectInstance(ModPotions.FREEZING_EFFECT, perkInstance.getSlot().value() * 10 * 20, perkInstance.getSlot().value() >= 3 ? 2 : 1)); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/IgnitePerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/IgnitePerk.java index 8c80fb3e87..a70bc76861 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/IgnitePerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/IgnitePerk.java @@ -33,7 +33,7 @@ public String getLangName() { public void onPreResolve(HitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver, AbstractEffect effect, PerkInstance perkInstance) { if(effect instanceof IDamageEffect damageEffect && rayTraceResult instanceof EntityHitResult entityHitResult){ if(damageEffect.canDamage(shooter, spellStats, spellContext, resolver, entityHitResult.getEntity()) && shooter != entityHitResult.getEntity()){ - entityHitResult.getEntity().setRemainingFireTicks(20 * 5 * perkInstance.getSlot().value); + entityHitResult.getEntity().setRemainingFireTicks(20 * 5 * perkInstance.getSlot().value()); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/BlastEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/BlastEffect.java index 5f6b201b6f..4842fa984a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/BlastEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/BlastEffect.java @@ -12,16 +12,12 @@ public BlastEffect() { } @Override - public void applyEffectTick(LivingEntity pLivingEntity, int pAmplifier) { + public boolean applyEffectTick(LivingEntity pLivingEntity, int pAmplifier) { explode(pLivingEntity, pAmplifier); + return true; } public static void explode(LivingEntity pLivingEntity, int pAmplifier) { pLivingEntity.level.explode(null, pLivingEntity.getX(), pLivingEntity.getY() + 1, pLivingEntity.getZ(), 2.0f + pAmplifier, false, Level.ExplosionInteraction.NONE); } - - @Override - public boolean isDurationEffectTick(int pDuration, int pAmplifier) { - return pDuration == 1; - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/FlightEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/FlightEffect.java index 0e59e107b9..174d70aafd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/FlightEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/FlightEffect.java @@ -18,20 +18,16 @@ public FlightEffect() { } @Override - public boolean isDurationEffectTick(int p_76397_1_, int p_76397_2_) { - return true; - } - - @Override - public void applyEffectTick(LivingEntity entity, int p_76394_2_) { + public boolean applyEffectTick(LivingEntity entity, int p_76394_2_) { if (entity instanceof Player player) { player.abilities.mayfly = player.isCreative() || entity.isSpectator() || getFlightDuration(entity) > 2; } + return true; } @Override - public void removeAttributeModifiers(LivingEntity entity, AttributeMap p_111187_2_, int p_111187_3_) { - super.removeAttributeModifiers(entity, p_111187_2_, p_111187_3_); + public void removeAttributeModifiers(AttributeMap pAttributeMap) { + super.removeAttributeModifiers(pAttributeMap); if (entity instanceof Player player) { // check for effect duration because this is also called from LivingEntity::onEffectUpdated boolean canFly = player.isCreative() || entity.isSpectator() || getFlightDuration(entity) > 2; @@ -43,7 +39,7 @@ public void removeAttributeModifiers(LivingEntity entity, AttributeMap p_111187_ } public int getFlightDuration(LivingEntity entity) { - MobEffectInstance effect = entity.getEffect(ModPotions.FLIGHT_EFFECT.get()); + MobEffectInstance effect = entity.getEffect(ModPotions.FLIGHT_EFFECT); return effect != null ? effect.getDuration() : 0; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWarp.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWarp.java index b6439ee109..f8808d17d6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWarp.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWarp.java @@ -5,7 +5,9 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleLineData; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.items.WarpScroll; +import com.hollingsworth.arsnouveau.common.items.data.WarpScrollData; import com.hollingsworth.arsnouveau.common.lib.RitualLib; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvents; @@ -41,8 +43,8 @@ protected void tick() { List entities = getWorld().getEntitiesOfClass(Entity.class, new AABB(getPos()).inflate(5)); ItemStack i = getConsumedItems().get(0); - WarpScroll.WarpScrollData data = WarpScroll.WarpScrollData.get(i); - BlockPos b = data.getPos(); + WarpScrollData data = i.get(DataComponentRegistry.WARP_SCROLL); + BlockPos b = data.pos(); for (Entity a : entities) { if (b != null) a.teleportTo(b.getX(), b.getY(), b.getZ()); @@ -68,8 +70,8 @@ public String getLangDescription() { public boolean canConsumeItem(ItemStack stack) { if (!(stack.getItem() instanceof WarpScroll) || !getConsumedItems().isEmpty()) return false; - WarpScroll.WarpScrollData data = WarpScroll.WarpScrollData.get(stack); - return data.isValid() && data.canTeleportWithDim(tile.getLevel()); + WarpScrollData data = stack.get(DataComponentRegistry.WARP_SCROLL); + return data != null && data.isValid() && data.canTeleportWithDim(tile.getLevel()); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java index 65a72f31bd..bfed7a01cf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java @@ -12,6 +12,7 @@ import com.hollingsworth.arsnouveau.common.network.PacketWarpPosition; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDampen; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; @@ -49,8 +50,8 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull SlotReference reference = manager.findItem(i -> (i.getItem() == ItemsRegistry.WARP_SCROLL.asItem() || i.getItem() == ItemsRegistry.STABLE_WARP_SCROLL.asItem()), InteractType.EXTRACT); if (!reference.isEmpty()) { ItemStack stack = reference.getHandler().getStackInSlot(reference.getSlot()); - WarpScrollData data = WarpScrollData.get(stack); - if (data.isValid() && data.canTeleportWithDim(world)) { + WarpScrollData data = stack.get(DataComponentRegistry.WARP_SCROLL); + if (data != null && data.isValid() && data.canTeleportWithDim(world)) { warpEntity(rayTraceResult.getEntity(), data); return; } @@ -63,11 +64,9 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull } if (isRealPlayer(shooter)) { - WarpScrollData scrollData = WarpScrollData.get(shooter.getOffhandItem()); - if (scrollData.isValid()) { - if (scrollData.isValid() && scrollData.canTeleportWithDim(world)) { - warpEntity(rayTraceResult.getEntity(), scrollData); - } + WarpScrollData scrollData = shooter.getOffhandItem().get(DataComponentRegistry.WARP_SCROLL); + if (scrollData != null && scrollData.isValid() && scrollData.canTeleportWithDim(world)) { + warpEntity(rayTraceResult.getEntity(), scrollData); } else { shooter.teleportTo(vec.x(), vec.y(), vec.z()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java index e3bc866a3e..95ab6e3c61 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java @@ -65,7 +65,7 @@ public InteractionHand getHand(Player player) { } public boolean handleBucket(ItemStack item, BucketItem bucket, Player player, BlockState state, Level world, BlockPos pos, BlockHitResult rayTraceResult, InteractionHand hand) { - if (bucket.getFluid() == Fluids.EMPTY) { + if (bucket.content == Fluids.EMPTY) { boolean isBucketPickup = state.getBlock() instanceof BucketPickup && world.getFluidState(pos) != Fluids.EMPTY.defaultFluidState(); BlockPos target = isBucketPickup ? pos : pos.relative(rayTraceResult.getDirection()); if (world.getFluidState(target) == Fluids.EMPTY.defaultFluidState()) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java index c0b5d4b43c..ef20e76bb3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java @@ -16,7 +16,6 @@ import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import com.hollingsworth.arsnouveau.common.block.tile.MobJarTile; import com.hollingsworth.arsnouveau.common.familiars.*; -import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; import com.hollingsworth.arsnouveau.common.mob_jar.*; import com.hollingsworth.arsnouveau.common.perk.*; import com.hollingsworth.arsnouveau.common.ritual.*; @@ -196,74 +195,74 @@ public static void postInit() { api.getEnchantingRecipeTypes().add(RecipeRegistry.REACTIVE_TYPE.get()); api.getEnchantingRecipeTypes().add(RecipeRegistry.SPELL_WRITE_TYPE.get()); api.getEnchantingRecipeTypes().add(RecipeRegistry.ARMOR_UPGRADE_TYPE.get()); - PerkRegistry.registerPerkProvider(ItemsRegistry.BATTLEMAGE_BOOTS, stack -> new ArmorPerkHolder(stack, Arrays.asList( + PerkRegistry.registerPerkProvider(ItemsRegistry.BATTLEMAGE_BOOTS, Arrays.asList( Arrays.asList(PerkSlot.ONE), Arrays.asList(PerkSlot.ONE, PerkSlot.ONE), Arrays.asList(PerkSlot.ONE, PerkSlot.ONE, PerkSlot.TWO) - ))); - PerkRegistry.registerPerkProvider(ItemsRegistry.BATTLEMAGE_HOOD, stack -> new ArmorPerkHolder(stack, Arrays.asList( + )); + PerkRegistry.registerPerkProvider(ItemsRegistry.BATTLEMAGE_HOOD, Arrays.asList( Arrays.asList(PerkSlot.ONE), Arrays.asList(PerkSlot.ONE, PerkSlot.ONE), Arrays.asList(PerkSlot.ONE, PerkSlot.ONE, PerkSlot.TWO) - ))); - PerkRegistry.registerPerkProvider(ItemsRegistry.BATTLEMAGE_LEGGINGS, stack -> new ArmorPerkHolder(stack, Arrays.asList( + )); + PerkRegistry.registerPerkProvider(ItemsRegistry.BATTLEMAGE_LEGGINGS, Arrays.asList( Arrays.asList(PerkSlot.ONE), Arrays.asList(PerkSlot.ONE, PerkSlot.TWO), Arrays.asList(PerkSlot.ONE, PerkSlot.ONE, PerkSlot.THREE) - ))); - PerkRegistry.registerPerkProvider(ItemsRegistry.BATTLEMAGE_ROBES, stack -> new ArmorPerkHolder(stack, Arrays.asList( + )); + PerkRegistry.registerPerkProvider(ItemsRegistry.BATTLEMAGE_ROBES, Arrays.asList( List.of(PerkSlot.ONE), Arrays.asList(PerkSlot.ONE, PerkSlot.TWO), Arrays.asList(PerkSlot.ONE, PerkSlot.ONE, PerkSlot.THREE) - ))); + )); - PerkRegistry.registerPerkProvider(ItemsRegistry.ARCANIST_HOOD, stack -> new ArmorPerkHolder(stack, Arrays.asList( + PerkRegistry.registerPerkProvider(ItemsRegistry.ARCANIST_HOOD, Arrays.asList( Arrays.asList(PerkSlot.ONE), Arrays.asList(PerkSlot.ONE, PerkSlot.TWO), Arrays.asList(PerkSlot.ONE, PerkSlot.ONE, PerkSlot.THREE) - ))); - PerkRegistry.registerPerkProvider(ItemsRegistry.ARCANIST_BOOTS, stack -> new ArmorPerkHolder(stack, Arrays.asList( + )); + PerkRegistry.registerPerkProvider(ItemsRegistry.ARCANIST_BOOTS, Arrays.asList( Arrays.asList(PerkSlot.ONE), Arrays.asList(PerkSlot.ONE, PerkSlot.TWO), Arrays.asList(PerkSlot.ONE, PerkSlot.TWO, PerkSlot.TWO) - ))); + )); - PerkRegistry.registerPerkProvider(ItemsRegistry.ARCANIST_LEGGINGS, stack -> new ArmorPerkHolder(stack, Arrays.asList( + PerkRegistry.registerPerkProvider(ItemsRegistry.ARCANIST_LEGGINGS, Arrays.asList( Arrays.asList(PerkSlot.ONE), Arrays.asList(PerkSlot.ONE, PerkSlot.THREE), Arrays.asList(PerkSlot.ONE, PerkSlot.TWO, PerkSlot.THREE) - ))); + )); - PerkRegistry.registerPerkProvider(ItemsRegistry.ARCANIST_ROBES, stack -> new ArmorPerkHolder(stack, Arrays.asList( + PerkRegistry.registerPerkProvider(ItemsRegistry.ARCANIST_ROBES, Arrays.asList( Arrays.asList(PerkSlot.ONE), Arrays.asList(PerkSlot.ONE, PerkSlot.THREE), Arrays.asList(PerkSlot.ONE, PerkSlot.TWO, PerkSlot.THREE) - ))); + )); - PerkRegistry.registerPerkProvider(ItemsRegistry.SORCERER_BOOTS, stack -> new ArmorPerkHolder(stack, Arrays.asList( + PerkRegistry.registerPerkProvider(ItemsRegistry.SORCERER_BOOTS, Arrays.asList( Arrays.asList(PerkSlot.ONE), Arrays.asList(PerkSlot.ONE, PerkSlot.TWO), Arrays.asList(PerkSlot.ONE, PerkSlot.TWO, PerkSlot.THREE) - ))); + )); - PerkRegistry.registerPerkProvider(ItemsRegistry.SORCERER_ROBES, stack -> new ArmorPerkHolder(stack, Arrays.asList( + PerkRegistry.registerPerkProvider(ItemsRegistry.SORCERER_ROBES,Arrays.asList( Arrays.asList(PerkSlot.TWO), Arrays.asList(PerkSlot.TWO, PerkSlot.THREE), Arrays.asList(PerkSlot.TWO, PerkSlot.TWO, PerkSlot.THREE) - ))); + )); - PerkRegistry.registerPerkProvider(ItemsRegistry.SORCERER_LEGGINGS, stack -> new ArmorPerkHolder(stack, Arrays.asList( + PerkRegistry.registerPerkProvider(ItemsRegistry.SORCERER_LEGGINGS, Arrays.asList( Arrays.asList(PerkSlot.TWO), Arrays.asList(PerkSlot.TWO, PerkSlot.THREE), Arrays.asList(PerkSlot.TWO, PerkSlot.TWO, PerkSlot.THREE) - ))); + )); - PerkRegistry.registerPerkProvider(ItemsRegistry.SORCERER_HOOD, stack -> new ArmorPerkHolder(stack, Arrays.asList( + PerkRegistry.registerPerkProvider(ItemsRegistry.SORCERER_HOOD, Arrays.asList( Arrays.asList(PerkSlot.ONE), Arrays.asList(PerkSlot.ONE, PerkSlot.TWO), Arrays.asList(PerkSlot.ONE, PerkSlot.TWO, PerkSlot.THREE) - ))); + )); SoundRegistry.DEFAULT_SPELL_SOUND = new SpellSound(SoundRegistry.DEFAULT_FAMILY.get(), Component.translatable("ars_nouveau.sound.default_family")); SoundRegistry.EMPTY_SPELL_SOUND = new SpellSound(SoundRegistry.EMPTY_SOUND_FAMILY.get(), Component.translatable("ars_nouveau.sound.empty")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java index 083fbcfc69..9c68c47f69 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java @@ -31,4 +31,6 @@ public class DataComponentRegistry { public static final DeferredHolder , DataComponentType> WARP_SCROLL = DATA.register("warp_scroll", () -> DataComponentType.builder().persistent(WarpScrollData.CODEC).networkSynchronized(WarpScrollData.STREAM_CODEC).build()); public static final DeferredHolder, DataComponentType> MULTI_POTION = DATA.register("multi_potion", () -> DataComponentType.builder().persistent(MultiPotionContents.CODEC).networkSynchronized(MultiPotionContents.STREAM_CODEC).build()); + + public static final DeferredHolder, DataComponentType> LIGHT_JAR = DATA.register("light_jar", () -> DataComponentType.builder().persistent(LightJarData.CODEC).networkSynchronized(LightJarData.STREAM_CODEC).build()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java index 21dd084dd7..4b1f563469 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java @@ -20,8 +20,6 @@ import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import java.util.ArrayList; - import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; import static com.hollingsworth.arsnouveau.common.lib.LibPotions.*; @@ -41,7 +39,7 @@ public void addAttributeModifiers(AttributeMap pAttributeMap, int pAmplifier) { super.addAttributeModifiers(pAttributeMap, pAmplifier); } }); - public static final DeferredHolder SUMMONING_SICKNESS_EFFECT = EFFECTS.register(SUMMONING_SICKNESS, () -> new SummoningSicknessEffect(MobEffectCategory.HARMFUL, 2039587, new ArrayList<>())); + public static final DeferredHolder SUMMONING_SICKNESS_EFFECT = EFFECTS.register(SUMMONING_SICKNESS, SummoningSicknessEffect::new); public static final DeferredHolder HEX_EFFECT = EFFECTS.register(HEX, () -> new PublicEffect(MobEffectCategory.HARMFUL, 8080895) { @Override From 2521b39eed3cf15ee6ad6eea88faeec3b1a55a2c Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 30 Jun 2024 21:53:18 -0500 Subject: [PATCH 023/363] bulk of potion data --- .../hollingsworth/arsnouveau/ArsNouveau.java | 23 +- .../api/particle/IParticleProvider.java | 10 + .../api/particle/ParticleColorRegistry.java | 37 +++- .../api/potion/IPotionProvider.java | 42 +++- .../api/potion/PotionProviderRegistry.java | 72 +++++++ .../api/recipe/PotionCraftingManager.java | 16 +- .../api/registry/CasterTomeRegistry.java | 8 +- .../arsnouveau/api/ritual/AbstractRitual.java | 11 +- .../api/ritual/ConjureBiomeRitual.java | 9 +- .../api/ritual/FeaturePlacementRitual.java | 9 +- .../arsnouveau/api/ritual/RitualContext.java | 9 +- .../api/ritual/StructureRitual.java | 13 +- .../api/sound/ConfiguredSpellSound.java | 22 +- .../arsnouveau/api/sound/SpellSound.java | 22 +- .../api/spell/AbstractSpellPart.java | 4 +- .../arsnouveau/api/spell/Spell.java | 17 ++ .../arsnouveau/api/spell/SpellCaster.java | 88 ++------ .../arsnouveau/client/gui/GuiSpellHUD.java | 2 +- .../client/gui/book/GlyphUnlockMenu.java | 44 ++-- .../client/gui/book/GuiSpellBook.java | 8 +- .../client/gui/book/InfinityGuiSpellBook.java | 2 +- .../client/gui/book/SoundScreen.java | 2 +- .../client/gui/buttons/UnlockGlyphButton.java | 7 +- .../client/gui/utils/RenderUtils.java | 45 ++-- .../client/particle/ParticleColor.java | 32 ++- .../client/particle/RainbowParticleColor.java | 7 - .../client/registry/ClientHandler.java | 23 +- .../renderer/entity/StarbuncleRenderer.java | 4 +- .../renderer/item/FlaskCannonRenderer.java | 17 +- .../renderer/item/SpellBookRenderer.java | 5 +- .../client/renderer/tile/ScribesRenderer.java | 2 +- .../arsnouveau/common/block/PotionJar.java | 40 ++-- .../common/block/RepositoryBlock.java | 8 +- .../common/block/SourceBerryBush.java | 8 + .../block/tile/AlchemicalSourcelinkTile.java | 2 +- .../common/block/tile/DrygmyTile.java | 4 +- .../block/tile/MycelialSourcelinkTile.java | 35 ++-- .../common/block/tile/PotionDiffuserTile.java | 29 ++- .../common/block/tile/PotionJarTile.java | 40 ++-- .../common/block/tile/PotionMelderTile.java | 33 ++- .../common/block/tile/RitualBrazierTile.java | 9 +- .../common/block/tile/ScribesTile.java | 28 +-- .../common/block/tile/SpellSensorTile.java | 3 +- .../common/block/tile/WixieCauldronTile.java | 39 ++-- .../common/command/AddTomeCommand.java | 7 +- .../common/crafting/recipes/IDyeable.java | 3 +- .../crafting/recipes/PotionFlaskRecipe.java | 5 +- .../arsnouveau/common/entity/Starbuncle.java | 2 +- .../common/entity/WildenChimera.java | 11 +- .../common/entity/familiar/FamiliarWixie.java | 14 +- .../goal/carbuncle/PotionStoreGoal.java | 5 +- .../entity/goal/carbuncle/PotionTakeGoal.java | 2 +- .../goal/carbuncle/StarbyPotionBehavior.java | 26 ++- .../entity/goal/chimera/ChimeraMeleeGoal.java | 18 -- .../arsnouveau/common/event/ArsEvents.java | 21 +- .../common/event/timed/BuildPortalEvent.java | 4 +- .../common/items/AlchemistsCrown.java | 6 +- .../common/items/AnnotatedCodex.java | 83 ++------ .../arsnouveau/common/items/FlaskCannon.java | 43 ++-- .../arsnouveau/common/items/PotionFlask.java | 53 +++-- .../common/items/data/CodexData.java | 28 +++ .../items/data/MultiPotionContents.java | 59 ++++-- .../common/items/data/PotionData.java | 196 ------------------ .../common/items/data/PotionLauncherData.java | 113 ++++------ .../common/mob_jar/AllayBehavior.java | 3 +- .../common/network/PacketConsumePotion.java | 21 +- .../network/PacketNoSpamChatMessage.java | 5 +- .../common/network/PacketSetLauncher.java | 29 +-- .../common/network/PacketSetScribeRecipe.java | 9 +- .../common/potions/PublicEffect.java | 20 +- .../potions/SummoningSicknessEffect.java | 9 - .../common/ritual/ConjureDesertRitual.java | 5 +- .../common/ritual/ConjurePlainsRitual.java | 9 +- .../common/ritual/DenySpawnRitual.java | 9 +- .../common/spell/effect/EffectInfuse.java | 17 +- .../arsnouveau/common/util/ANCodecs.java | 14 ++ .../arsnouveau/common/util/PotionUtil.java | 77 +++++-- .../setup/registry/APIRegistry.java | 10 +- .../setup/registry/CreativeTabRegistry.java | 13 +- .../setup/registry/DataComponentRegistry.java | 7 + .../resources/META-INF/accesstransformer.cfg | 2 +- 81 files changed, 929 insertions(+), 919 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/particle/IParticleProvider.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionProviderRegistry.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraMeleeGoal.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/CodexData.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionData.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java index a109acda5c..31ad87f807 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java +++ b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java @@ -6,7 +6,6 @@ import com.hollingsworth.arsnouveau.api.registry.RitualRegistry; import com.hollingsworth.arsnouveau.api.registry.ScryRitualRegistry; import com.hollingsworth.arsnouveau.api.ritual.DispenserRitualBehavior; -import com.hollingsworth.arsnouveau.client.container.CraftingTerminalScreen; import com.hollingsworth.arsnouveau.client.registry.ClientHandler; import com.hollingsworth.arsnouveau.common.advancement.ANCriteriaTriggers; import com.hollingsworth.arsnouveau.common.entity.pathfinding.ClientEventHandler; @@ -22,9 +21,11 @@ import com.hollingsworth.arsnouveau.setup.proxy.ClientProxy; import com.hollingsworth.arsnouveau.setup.proxy.IProxy; import com.hollingsworth.arsnouveau.setup.proxy.ServerProxy; -import com.hollingsworth.arsnouveau.setup.registry.*; +import com.hollingsworth.arsnouveau.setup.registry.APIRegistry; +import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import com.hollingsworth.arsnouveau.setup.reward.Rewards; -import net.minecraft.client.gui.screens.MenuScreens; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; @@ -48,6 +49,7 @@ import net.neoforged.neoforge.event.server.ServerStartedEvent; import net.neoforged.neoforge.event.server.ServerStoppingEvent; +import java.util.function.Supplier; @Mod(ArsNouveau.MODID) @@ -55,7 +57,7 @@ public class ArsNouveau { public static final String MODID = "ars_nouveau"; @SuppressWarnings("deprecation") // Has to be runForDist, SafeRunForDist will throw a sided crash - public static IProxy proxy = DistExecutor.runForDist(() -> ClientProxy::new, () -> ServerProxy::new); + public static IProxy proxy; public static boolean caelusLoaded = false; public static boolean terrablenderLoaded = false; public static boolean optifineLoaded = false; @@ -94,6 +96,16 @@ public ArsNouveau(IEventBus modEventBus, ModContainer modContainer){ }catch (Exception e){ e.printStackTrace(); } + if(FMLEnvironment.dist.isClient()){ + ArsNouveau.proxy = new Supplier() { + @Override + public IProxy get() { + return new ClientProxy(); + } + }.get(); + }else{ + ArsNouveau.proxy = new ServerProxy(); + } } public void setup(final FMLCommonSetupEvent event) { @@ -142,9 +154,6 @@ public void postModLoadEvent(final FMLLoadCompleteEvent event) { public void clientSetup(final FMLClientSetupEvent event) { ModLoadingContext.get().getActiveContainer().getEventBus().addListener(ClientHandler::init); - event.enqueueWork(() ->{ - MenuScreens.register(MenuRegistry.STORAGE.get(), CraftingTerminalScreen::new); - }); try { Class.forName("net.optifine.Config"); optifineLoaded = true; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/particle/IParticleProvider.java b/src/main/java/com/hollingsworth/arsnouveau/api/particle/IParticleProvider.java new file mode 100644 index 0000000000..82314b4df6 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/api/particle/IParticleProvider.java @@ -0,0 +1,10 @@ +package com.hollingsworth.arsnouveau.api.particle; + +import com.hollingsworth.arsnouveau.client.particle.ParticleColor; +import net.minecraft.nbt.CompoundTag; + +public interface IParticleProvider { + ParticleColor create(CompoundTag tag); + + ParticleColor create(int r, int g, int b); +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/particle/ParticleColorRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/particle/ParticleColorRegistry.java index 741d82327d..8393b02dec 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/particle/ParticleColorRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/particle/ParticleColorRegistry.java @@ -7,18 +7,39 @@ import javax.annotation.Nullable; import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Function; public class ParticleColorRegistry { - private static ConcurrentHashMap> MAP = new ConcurrentHashMap<>(); + private static ConcurrentHashMap MAP = new ConcurrentHashMap<>(); + + static IParticleProvider DEFAULT = new IParticleProvider() { + @Override + public ParticleColor create(CompoundTag tag) { + return new ParticleColor(tag); + } + + @Override + public ParticleColor create(int r, int g, int b) { + return new ParticleColor(r, g, b); + } + }; static{ - MAP.put(ParticleColor.ID, ParticleColor::new); - MAP.put(RainbowParticleColor.ID, RainbowParticleColor::new); + MAP.put(ParticleColor.ID, DEFAULT); + MAP.put(RainbowParticleColor.ID, new IParticleProvider() { + @Override + public ParticleColor create(CompoundTag tag) { + return new RainbowParticleColor(tag); + } + + @Override + public ParticleColor create(int r, int g, int b) { + return new RainbowParticleColor(r, g, b); + } + }); } - public static void register(ResourceLocation id, Function factory){ + public static void register(ResourceLocation id, IParticleProvider factory){ MAP.put(id, factory); } @@ -26,6 +47,10 @@ public static ParticleColor from(@Nullable CompoundTag compoundTag){ if(compoundTag == null){ return new ParticleColor(0,0,0); } - return MAP.getOrDefault(ResourceLocation.tryParse(compoundTag.getString("type")), ParticleColor::new).apply(compoundTag); + return MAP.getOrDefault(ResourceLocation.tryParse(compoundTag.getString("type")), DEFAULT).create(compoundTag); + } + + public static ParticleColor from(ResourceLocation location, int r, int g, int b){ + return MAP.getOrDefault(location, DEFAULT).create(r, g, b); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/potion/IPotionProvider.java b/src/main/java/com/hollingsworth/arsnouveau/api/potion/IPotionProvider.java index 5b828b8605..27f0a366d6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/potion/IPotionProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/potion/IPotionProvider.java @@ -1,9 +1,49 @@ package com.hollingsworth.arsnouveau.api.potion; +import net.minecraft.network.chat.Component; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.alchemy.PotionContents; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.util.List; public interface IPotionProvider { - PotionContents getPotionData(ItemStack stack); + @NotNull PotionContents getPotionData(ItemStack stack); + + int usesRemaining(ItemStack stack); + + int maxUses(ItemStack stack); + + void consumeUses(ItemStack stack, int amount, @Nullable Player player); + + void addUse(ItemStack stack, int amount, @Nullable Player player); + + /** + * Modify the effect instance before applying it to the target + */ + default MobEffectInstance getEffectInstance(MobEffectInstance effectinstance) { + return effectinstance; + } + + default void applyEffects(ItemStack stack, Entity source, Entity inDirectSource, LivingEntity target) { + for (MobEffectInstance effectinstance : getPotionData(stack).getAllEffects()) { + effectinstance = getEffectInstance(effectinstance); + if (effectinstance.getEffect().value().isInstantenous()) { + effectinstance.getEffect().value().applyInstantenousEffect(source, inDirectSource, target, effectinstance.getAmplifier(), 1.0D); + } else { + target.addEffect(new MobEffectInstance(effectinstance), source); + } + } + } + + default void addTooltip(ItemStack stack, List tooltips){ + PotionContents potionStack = getPotionData(stack); + potionStack.addPotionTooltip(tooltips::add, 1.0F, 20.0f); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionProviderRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionProviderRegistry.java new file mode 100644 index 0000000000..ef5f755354 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionProviderRegistry.java @@ -0,0 +1,72 @@ +package com.hollingsworth.arsnouveau.api.potion; + +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import net.minecraft.core.component.DataComponents; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.*; +import net.minecraft.world.item.alchemy.PotionContents; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; + +public class PotionProviderRegistry { + + private static final ConcurrentHashMap> MAP = new ConcurrentHashMap<>(); + + private static final IPotionProvider DEFAULT = new IPotionProvider(){ + + @Override + @NotNull + public PotionContents getPotionData(ItemStack stack) { + return stack.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY); + } + + @Override + public int usesRemaining(ItemStack stack) { + PotionContents contents = stack.get(DataComponents.POTION_CONTENTS); + if(contents == null){ + return 0; + } + return contents == PotionContents.EMPTY ? 0 : 1; + } + + @Override + public int maxUses(ItemStack stack) { + return 1; + } + + @Override + public void consumeUses(ItemStack stack, int amount, @Nullable Player player) { + if(stack.getItem() instanceof PotionItem potionItem){ + stack.shrink(1); + if(player != null){ + player.inventory.add(new ItemStack(Items.GLASS_BOTTLE)); + } + } + } + + @Override + public void addUse(ItemStack stack, int amount, @Nullable Player player) { + if(stack.getItem() instanceof BottleItem bottleItem){ + ItemStack bottle = new ItemStack(Items.GLASS_BOTTLE); + bottle.set(DataComponents.POTION_CONTENTS, stack.get(DataComponents.POTION_CONTENTS)); + if(player != null){ + stack.shrink(1); + player.inventory.add(bottle); + } + } + } + }; + + static{ + MAP.put(ItemsRegistry.POTION_FLASK.asItem(), (stack) -> stack.get(DataComponentRegistry.MULTI_POTION)); + MAP.put(Items.POTION, (stack) -> DEFAULT); + } + + public static @Nullable IPotionProvider from(ItemStack stack){ + return MAP.getOrDefault(stack.getItem(), (item) -> null).apply(stack); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java index 868d0a0736..296b949c79 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java @@ -4,8 +4,7 @@ import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.common.block.tile.WixieCauldronTile; import com.hollingsworth.arsnouveau.common.entity.EntityFlyingItem; -import com.hollingsworth.arsnouveau.common.items.data.PotionData; -import com.hollingsworth.arsnouveau.common.util.PotionUtil; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; @@ -66,7 +65,7 @@ public void completeCraft(WixieCauldronTile tile) { return; }else if (level.getBlockEntity(jarPos) instanceof PotionJarTile jar) { tile.setNeedsPotionStorage(false); - jar.add(new PotionData(potionOut),300); + jar.add(potionOut,300); ParticleColor color2 = ParticleColor.fromInt(jar.getColor()); EntityFlyingItem flying = new EntityFlyingItem(level, new Vec3(worldPosition.getX() + 0.5, worldPosition.getY() + 1.0, worldPosition.getZ()+ 0.5), new Vec3(jarPos.getX() + 0.5, jarPos.getY(), jarPos.getZ() + 0.5), @@ -81,20 +80,17 @@ public void completeCraft(WixieCauldronTile tile) { @Override public void write(HolderLookup.Provider provider, CompoundTag tag) { super.write(provider, tag); - CompoundTag outputTag = new CompoundTag(); - PotionUtil.addPotionToTag(potionOut, outputTag); - tag.put("potionout", outputTag); + tag.put("potionout", ANCodecs.encode(PotionContents.CODEC, potionOut)); CompoundTag neededTag = new CompoundTag(); - PotionUtil.addPotionToTag(getPotionNeeded(), neededTag); - tag.put("potionNeeded", neededTag); + tag.put("potionNeeded", ANCodecs.encode(PotionContents.CODEC, getPotionNeeded())); tag.putBoolean("gotPotion", hasObtainedPotion); } public void read(HolderLookup.Provider provider, CompoundTag tag){ super.read(provider, tag); - potionOut = PotionUtils.getPotion(tag.getCompound("potionout")); - potionNeeded = PotionUtils.getPotion(tag.getCompound("potionNeeded")); + potionOut = ANCodecs.decode(PotionContents.CODEC, tag.getCompound("potionout")); + potionNeeded = ANCodecs.decode(PotionContents.CODEC, tag.getCompound("potionNeeded")); hasObtainedPotion = tag.getBoolean("gotPotion"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java index 5e99a467b2..6116b0ceed 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java @@ -13,17 +13,17 @@ public class CasterTomeRegistry { - private static List TOME_DATA = new ArrayList<>(); + private static List> TOME_DATA = new ArrayList<>(); - public static List getTomeData(){ + public static List> getTomeData(){ return Collections.unmodifiableList(TOME_DATA); } - public static List reloadTomeData(RecipeManager recipeManager, Level level){ + public static List> reloadTomeData(RecipeManager recipeManager, Level level){ var recipes = recipeManager.getAllRecipesFor(RecipeRegistry.CASTER_TOME_TYPE.get()); DungeonLootTables.CASTER_TOMES = new ArrayList<>(); TOME_DATA = new ArrayList<>(); - TOME_DATA.addAll(recipes.stream().map(RecipeHolder::value).toList()); + TOME_DATA.addAll(recipes); recipes.forEach(tome -> DungeonLootTables.CASTER_TOMES.add(() -> tome.value().getResultItem(level.registryAccess()))); return TOME_DATA; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/AbstractRitual.java b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/AbstractRitual.java index ceb783ca7c..b24b573608 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/AbstractRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/AbstractRitual.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.block.tile.RitualBrazierTile; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -179,18 +180,18 @@ public boolean takeSourceNow(){ return tile.takeSource(); } - public void write(CompoundTag tag) { + public void write(HolderLookup.Provider provider, CompoundTag tag) { CompoundTag contextTag = new CompoundTag(); - getContext().write(contextTag); + getContext().write(provider, contextTag); tag.put("context", contextTag); } // Called once the ritual tile has created a new instance of this ritual - public void read(CompoundTag tag) { - this.setContext(RitualContext.read(tag.getCompound("context"))); + public void read(HolderLookup.Provider provider, CompoundTag tag) { + this.setContext(RitualContext.read(provider, tag.getCompound("context"))); } - public@NotNull RitualContext getContext() { + public @NotNull RitualContext getContext() { if (context == null) context = new RitualContext(); return context; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/ConjureBiomeRitual.java b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/ConjureBiomeRitual.java index e185ffbd5e..7047b7104f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/ConjureBiomeRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/ConjureBiomeRitual.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.api.util.BlockUtil; import com.hollingsworth.arsnouveau.common.datagen.ItemTagProvider; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceKey; import net.minecraft.sounds.SoundSource; @@ -87,8 +88,8 @@ public void setState(BlockPos pos, BlockState state){ } @Override - public void read(CompoundTag tag) { - super.read(tag); + public void read(HolderLookup.Provider provider, CompoundTag tag) { + super.read(provider, tag); if(tag.contains("tracker")){ tracker = new ManhattenTracker(tag.getCompound("tracker")); } @@ -96,8 +97,8 @@ public void read(CompoundTag tag) { } @Override - public void write(CompoundTag tag) { - super.write(tag); + public void write(HolderLookup.Provider provider, CompoundTag tag) { + super.write(provider, tag); if(tracker != null){ tag.put("tracker", tracker.serialize(new CompoundTag())); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/FeaturePlacementRitual.java b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/FeaturePlacementRitual.java index 8e3de4a2b2..2d504a9ff8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/FeaturePlacementRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/FeaturePlacementRitual.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.api.util.BlockUtil; import com.hollingsworth.arsnouveau.common.datagen.ItemTagProvider; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -115,8 +116,8 @@ public boolean canConsumeItem(ItemStack stack) { } @Override - public void read(CompoundTag tag) { - super.read(tag); + public void read(HolderLookup.Provider provider, CompoundTag tag) { + super.read(provider, tag); featureIndex = tag.getInt("featureIndex"); positionIndex = tag.getInt("positionIndex"); checkRadius = tag.getInt("checkRadius"); @@ -124,8 +125,8 @@ public void read(CompoundTag tag) { } @Override - public void write(CompoundTag tag) { - super.write(tag); + public void write(HolderLookup.Provider provider, CompoundTag tag) { + super.write(provider, tag); tag.putInt("featureIndex", featureIndex); tag.putInt("positionIndex", positionIndex); tag.putInt("checkRadius", checkRadius); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/RitualContext.java b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/RitualContext.java index 8dff4b87e8..c05c142420 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/RitualContext.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/RitualContext.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.api.ritual; import com.hollingsworth.arsnouveau.api.util.NBTUtil; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; @@ -23,20 +24,20 @@ public RitualContext() { } - public void write(CompoundTag tag) { + public void write(HolderLookup.Provider provider, CompoundTag tag) { tag.putInt("progress", progress); tag.putBoolean("complete", isDone); tag.putBoolean("started", isStarted); tag.putBoolean("needsMana", needsSourceToRun); - NBTUtil.writeItems(tag, "item_", consumedItems); + NBTUtil.writeItems(provider, tag, "item_", consumedItems); } - public static RitualContext read(CompoundTag tag) { + public static RitualContext read(HolderLookup.Provider provider, CompoundTag tag) { RitualContext context = new RitualContext(); context.progress = tag.getInt("progress"); context.isDone = tag.getBoolean("complete"); context.isStarted = tag.getBoolean("started"); - context.consumedItems = NBTUtil.readItems(tag, "item_"); + context.consumedItems = NBTUtil.readItems(provider, tag, "item_"); context.needsSourceToRun = tag.getBoolean("needsMana"); return context; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/StructureRitual.java b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/StructureRitual.java index e6830de371..dbc782f911 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/StructureRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/StructureRitual.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.common.mixin.structure.StructureTemplateAccessor; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; @@ -96,7 +97,9 @@ protected void tick() { blockInfo.nbt().putLong("LootTableSeed", getWorld().random.nextLong()); } - blockentity1.load(blockInfo.nbt()); + if(blockInfo.nbt() != null) { + blockentity1.loadWithComponents(blockInfo.nbt(), getWorld().registryAccess()); + } } getWorld().playSound(null, translatedPos, blockInfo.state().getSoundType().getPlaceSound(), SoundSource.BLOCKS, 1.0F, 1.0F); placeCount++; @@ -117,16 +120,16 @@ public void setNeedsSource(boolean needMana) { } @Override - public void read(CompoundTag tag) { - super.read(tag); + public void read(HolderLookup.Provider provider, CompoundTag tag) { + super.read(provider, tag); index = tag.getInt("index"); hasConsumed = tag.getBoolean("hasConsumed"); setup(); } @Override - public void write(CompoundTag tag) { - super.write(tag); + public void write(HolderLookup.Provider provider, CompoundTag tag) { + super.write(provider, tag); tag.putInt("index", index); tag.putBoolean("hasConsumed", hasConsumed); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/sound/ConfiguredSpellSound.java b/src/main/java/com/hollingsworth/arsnouveau/api/sound/ConfiguredSpellSound.java index 0ad991e34a..11af63250b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/sound/ConfiguredSpellSound.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/sound/ConfiguredSpellSound.java @@ -1,27 +1,37 @@ package com.hollingsworth.arsnouveau.api.sound; import com.hollingsworth.arsnouveau.setup.registry.SoundRegistry; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.nbt.CompoundTag; import javax.annotation.Nullable; import java.util.Objects; public class ConfiguredSpellSound { + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + SpellSound.CODEC.codec().fieldOf("sound").forGetter(s -> s.sound), + Codec.FLOAT.optionalFieldOf("volume", 1.0f).forGetter(s -> s.volume), + Codec.FLOAT.optionalFieldOf("pitch", 1.0f).forGetter(s -> s.pitch) + ).apply(instance, ConfiguredSpellSound::new)); + public static ConfiguredSpellSound EMPTY = new ConfiguredSpellSound(SoundRegistry.EMPTY_SPELL_SOUND, 1, 1); // If the user wants no sound, make it empty. public static ConfiguredSpellSound DEFAULT = new ConfiguredSpellSound(SoundRegistry.DEFAULT_SPELL_SOUND, 1, 1); // The default sound to be returned for null casters. - public @Nullable SpellSound sound; + public SpellSound sound; public float volume; public float pitch; - public ConfiguredSpellSound(@Nullable SpellSound sound) { + public ConfiguredSpellSound(SpellSound sound) { this(sound, 1, 1); } - public ConfiguredSpellSound(@Nullable SpellSound sound, float volume, float pitch) { - this.sound = sound; - this.volume = volume; - this.pitch = pitch; + public ConfiguredSpellSound(@Nullable SpellSound spellSound, float aFloat, float aFloat1) { + this.sound = spellSound; + this.volume = aFloat; + this.pitch = aFloat1; } public CompoundTag serialize() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java b/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java index c2472d6394..b268f3b509 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java @@ -1,8 +1,12 @@ package com.hollingsworth.arsnouveau.api.sound; import com.hollingsworth.arsnouveau.api.registry.SpellSoundRegistry; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; @@ -11,20 +15,26 @@ public class SpellSound { + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + ResourceLocation.CODEC.fieldOf("id").forGetter(s -> s.id), + SoundEvent.CODEC.fieldOf("soundEvent").forGetter(s -> s.soundEvent), + ComponentSerialization.CODEC.fieldOf("soundName").forGetter(s -> s.soundName) + ).apply(instance, SpellSound::new)); + private ResourceLocation id; - private SoundEvent soundEvent; + private Holder soundEvent; private Component soundName; - public SpellSound(ResourceLocation id, SoundEvent soundEvent, Component soundName) { + public SpellSound(ResourceLocation id, Holder soundEvent, Component soundName) { this.id = id; this.soundEvent = soundEvent; this.soundName = soundName; } - public SpellSound(SoundEvent soundEvent, Component soundName) { - this(soundEvent.getLocation(), soundEvent, soundName); + public SpellSound(Holder soundEvent, Component soundName) { + this(soundEvent.unwrapKey().get().location(), soundEvent, soundName); } public ResourceLocation getId() { @@ -35,11 +45,11 @@ public void setId(ResourceLocation id) { this.id = id; } - public SoundEvent getSoundEvent() { + public Holder getSoundEvent() { return soundEvent; } - public void setSoundEvent(SoundEvent soundEvent) { + public void setSoundEvent(Holder soundEvent) { this.soundEvent = soundEvent; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java index 7dd3c5d009..5fac9287c1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java @@ -1,8 +1,10 @@ package com.hollingsworth.arsnouveau.api.spell; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; import com.hollingsworth.arsnouveau.common.items.Glyph; import com.hollingsworth.arsnouveau.common.util.SpellPartConfigUtil; +import com.mojang.serialization.Codec; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.neoforged.neoforge.common.ModConfigSpec; @@ -16,7 +18,7 @@ import java.util.concurrent.CopyOnWriteArrayList; public abstract class AbstractSpellPart implements Comparable { - + public static final Codec CODEC = ResourceLocation.CODEC.xmap(GlyphRegistry::getSpellPart, AbstractSpellPart::getRegistryName); private final ResourceLocation registryName; public String name; public Glyph glyphItem; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java index 7ed78969cf..0e444df215 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java @@ -4,6 +4,9 @@ import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; @@ -15,6 +18,13 @@ public class Spell implements Cloneable { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Codec.STRING.fieldOf("name").forGetter(s -> s.name), + ParticleColor.CODEC.fieldOf("color").forGetter(s -> s.color), + ConfiguredSpellSound.CODEC.fieldOf("sound").forGetter(s -> s.sound), + Codec.list(AbstractSpellPart.CODEC).fieldOf("recipe").forGetter(s -> s.recipe) + ).apply(instance, Spell::new)); + public List recipe = new ArrayList<>(); public String name = ""; public ParticleColor color = ParticleColor.defaultParticleColor(); @@ -32,6 +42,13 @@ public Spell(AbstractSpellPart... spellParts) { add(spellParts); } + public Spell(String s, ParticleColor color, ConfiguredSpellSound configuredSpellSound, List abstractSpellParts) { + this.name = s; + this.color = color; + this.sound = configuredSpellSound; + this.recipe = abstractSpellParts; + } + public Spell add(AbstractSpellPart spellPart) { recipe.add(spellPart); return this; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java index 91092d0586..6268a619b1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java @@ -3,7 +3,12 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; -import net.minecraft.nbt.CompoundTag; +import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; @@ -13,6 +18,15 @@ public class SpellCaster implements ISpellCaster { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Codec.INT.optionalFieldOf("current_slot", 0).forGetter(s -> s.slot), + Codec.STRING.optionalFieldOf("flavor_text", "").forGetter(s -> s.flavorText), + Codec.BOOL.optionalFieldOf("is_hidden", false).forGetter(s -> s.isHidden), + Codec.STRING.optionalFieldOf("hidden_text", "").forGetter(s -> s.hiddenText) + ).apply(instance, SpellCaster::new)); + + public static final StreamCodec STREAM = CheatSerializer.create(SpellCaster.CODEC); + private Map spells = new HashMap<>(); private int slot; public ItemStack stack = ItemStack.EMPTY; @@ -20,9 +34,12 @@ public class SpellCaster implements ISpellCaster { public boolean isHidden; public String hiddenText = ""; - public SpellCaster(ItemStack stack) { - this(stack.getOrCreateTag()); - this.stack = stack; + + public SpellCaster(Integer slot, String flavorText, Boolean isHidden, String hiddenText) { + this.slot = slot; + this.flavorText = flavorText; + this.isHidden = isHidden; + this.hiddenText = hiddenText; } @NotNull @@ -32,7 +49,7 @@ public Spell getSpell() { } @Override - public@NotNull Spell getSpell(int slot) { + public @NotNull Spell getSpell(int slot) { return spells.getOrDefault(slot, new Spell()); } @@ -49,13 +66,11 @@ public int getCurrentSlot() { @Override public void setCurrentSlot(int slot) { this.slot = slot; - writeItem(stack); } @Override public void setSpell(Spell spell, int slot) { this.spells.put(slot, spell); - writeItem(stack); } @Override @@ -71,7 +86,6 @@ public ParticleColor getColor(int slot) { @Override public void setFlavorText(String str) { this.flavorText = str; - writeItem(stack); } @Override @@ -92,13 +106,11 @@ public void setSpellName(String name) { @Override public void setSpellName(String name, int slot) { this.getSpell(slot).name = name; - writeItem(stack); } @Override public void setSpellHidden(boolean hidden) { this.isHidden = hidden; - writeItem(stack); } @Override @@ -109,7 +121,6 @@ public boolean isSpellHidden() { @Override public void setHiddenRecipe(String recipe) { this.hiddenText = recipe; - writeItem(stack); } @Override @@ -130,7 +141,6 @@ public void setColor(ParticleColor color) { @Override public void setColor(ParticleColor color, int slot) { this.getSpell(slot).color = color; - writeItem(stack); } @NotNull @@ -147,7 +157,6 @@ public void setSound(ConfiguredSpellSound sound) { @Override public void setSound(ConfiguredSpellSound sound, int slot) { this.getSpell(slot).sound = sound; - writeItem(stack); } @NotNull @@ -161,59 +170,6 @@ public Map getSpells() { return spells; } - public CompoundTag writeTag(CompoundTag tag) { - tag.putInt("current_slot", getCurrentSlot()); - tag.putString("flavor", getFlavorText()); - CompoundTag spellTag = new CompoundTag(); - - for (int i = 0; i < getMaxSlots(); i++) { - Spell spell = getSpell(i); - spellTag.put("spell" + i, spell.serialize()); - } - tag.put("spells", spellTag); - tag.putInt("spell_count", getSpells().size()); - tag.putBoolean("is_hidden", isSpellHidden()); - tag.putString("hidden_recipe", getHiddenRecipe()); - return tag; - } - - public SpellCaster(CompoundTag itemTag) { - CompoundTag tag = itemTag.getCompound(getTagID().toString()); - - this.slot = tag.getInt("current_slot"); - this.flavorText = tag.getString("flavor"); - this.isHidden = tag.getBoolean("is_hidden"); - this.hiddenText = tag.getString("hidden_recipe"); - CompoundTag spellTag = tag.getCompound("spells"); - for (int i = 0; i < getMaxSlots(); i++) { - if (spellTag.contains("spell" + i)) { - Spell spell = Spell.fromTag(spellTag.getCompound("spell" + i)); - spells.put(i, spell); - } - } - } - - public void writeItem(ItemStack stack) { - if (stack == null || stack.isEmpty()) { - return; - } - CompoundTag tag = stack.getOrCreateTag(); - CompoundTag casterTag = new CompoundTag(); // Nest our tags so we dont cause conflicts - writeTag(casterTag); - tag.put(getTagID().toString(), casterTag); - stack.setTag(tag); - } - - /** - * Writes this compound data to the provided tag, stored with the caster ID. - * - * @param tag The tag to add this serialized tag to. - */ - public void serializeOnTag(CompoundTag tag) { - CompoundTag thisData = writeTag(new CompoundTag()); - tag.put(getTagID().toString(), thisData); - } - @Override public ResourceLocation getTagID() { return ArsNouveau.prefix( "caster"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java index 7fec514ced..9a26af31c8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java @@ -18,7 +18,7 @@ public class GuiSpellHUD { public static void renderOverlay(GuiGraphics graphics, DeltaTracker deltaTracker) { ItemStack stack = StackUtil.getHeldSpellbook(minecraft.player); - if (stack != ItemStack.EMPTY && stack.getItem() instanceof SpellBook && stack.getTag() != null) { + if (stack != ItemStack.EMPTY && stack.getItem() instanceof SpellBook) { int offsetLeft = 10; ISpellCaster caster = CasterUtil.getCaster(stack); String renderString = caster.getCurrentSlot() + 1 + " " + caster.getSpellName(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java index 5fd687de44..f59df45379 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java @@ -13,6 +13,7 @@ import com.hollingsworth.arsnouveau.common.network.PacketSetScribeRecipe; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.hollingsworth.arsnouveau.setup.registry.CreativeTabRegistry; +import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import net.minecraft.ChatFormatting; @@ -31,6 +32,7 @@ import net.minecraft.network.chat.Style; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeHolder; import org.joml.Matrix4f; import java.util.ArrayList; @@ -40,8 +42,8 @@ public class GlyphUnlockMenu extends BaseBook { - public List displayedGlyphs = new ArrayList<>(); - public List allParts = new ArrayList<>(); + public List> displayedGlyphs = new ArrayList<>(); + public List> allParts = new ArrayList<>(); public int page = 0; public PageButton nextButton; public PageButton previousButton; @@ -54,8 +56,8 @@ public class GlyphUnlockMenu extends BaseBook { int tier3Row = 0; BlockPos scribesPos; Filter filterSelected = Filter.ALL; - public GlyphRecipe hoveredRecipe; - public GlyphRecipe selectedRecipe; + public RecipeHolder hoveredRecipe; + public RecipeHolder selectedRecipe; enum Filter { ALL, @@ -71,7 +73,7 @@ enum Filter { public GlyphUnlockMenu(BlockPos pos) { super(); - allParts = new ArrayList<>(GlyphRegistry.getSpellpartMap().values().stream().filter(AbstractSpellPart::shouldShowInUnlock).toList()); + allParts = Minecraft.getInstance().level.getRecipeManager().getAllRecipesFor(RecipeRegistry.GLYPH_TYPE.get()); this.displayedGlyphs = new ArrayList<>(allParts); this.scribesPos = pos; } @@ -151,7 +153,7 @@ public void setFilter(Filter filter, SelectableButton button, String displayTitl private void onSelectClick(Button button) { if (selectedRecipe != null) { - Networking.sendToServer(new PacketSetScribeRecipe(scribesPos, selectedRecipe.id)); + Networking.sendToServer(new PacketSetScribeRecipe(scribesPos, selectedRecipe.id())); Minecraft.getInstance().setScreen(null); } } @@ -172,8 +174,8 @@ public void onSearchChanged(String str) { searchBar.setSuggestion(""); displayedGlyphs = new ArrayList<>(); - for (AbstractSpellPart spellPart : allParts) { - if (spellPart.getLocaleName().toLowerCase().contains(searchBar.value.toLowerCase())) { + for (RecipeHolder spellPart : allParts) { + if (spellPart.value().getSpellPart().getLocaleName().toLowerCase().contains(searchBar.value.toLowerCase())) { displayedGlyphs.add(spellPart); } } @@ -223,15 +225,15 @@ public void layoutAllGlyphs(int page) { int xStart = nextPage ? bookLeft + 154 : bookLeft + 20; int adjustedRowsPlaced = 0; int yStart = bookTop + 20; - List sorted = new ArrayList<>(displayedGlyphs); + List> sorted = new ArrayList<>(displayedGlyphs); sorted.sort(CreativeTabRegistry.COMPARE_TIER_THEN_NAME); sorted = sorted.subList(maxPerPage * page, Math.min(sorted.size(), maxPerPage * (page + 1))); int adjustedXPlaced = 0; tier1Row = 0; adjustedRowsPlaced++; for (int i = 0; i < sorted.size(); i++) { - AbstractSpellPart part = sorted.get(i); - + var holder = sorted.get(i); + var spellPart = holder.value().getSpellPart(); if (adjustedXPlaced >= PER_ROW) { adjustedRowsPlaced++; @@ -248,10 +250,10 @@ public void layoutAllGlyphs(int page) { } int xOffset = 20 * ((adjustedXPlaced) % PER_ROW) + (nextPage ? 134 : 0); int yPlace = adjustedRowsPlaced * 18 + yStart; - UnlockGlyphButton cell = new UnlockGlyphButton(xStart + xOffset, yPlace, false, part, this::onGlyphClick); + UnlockGlyphButton cell = new UnlockGlyphButton(xStart + xOffset, yPlace, false, holder, this::onGlyphClick); IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(Minecraft.getInstance().player).orElse(null); if (cap != null) { - if (cap.knowsGlyph(part) || GlyphRegistry.getDefaultStartingSpells().contains(part)) { + if (cap.knowsGlyph(spellPart) || GlyphRegistry.getDefaultStartingSpells().contains(spellPart)) { cell.playerKnows = true; } } @@ -261,16 +263,16 @@ public void layoutAllGlyphs(int page) { } } - public List applyFilter(List spellParts) { + public List> applyFilter(List> spellParts) { if (filterSelected == Filter.ALL) return spellParts; if (filterSelected == Filter.TIER1) { - return spellParts.stream().filter(a -> a.getConfigTier().value == 1).collect(Collectors.toList()); + return spellParts.stream().filter(a -> a.value().getSpellPart().getConfigTier().value == 1).collect(Collectors.toList()); } if (filterSelected == Filter.TIER2) { - return spellParts.stream().filter(a -> a.getConfigTier().value == 2).collect(Collectors.toList()); + return spellParts.stream().filter(a -> a.value().getSpellPart().getConfigTier().value == 2).collect(Collectors.toList()); } - return spellParts.stream().filter(a -> a.getConfigTier().value == 3).collect(Collectors.toList()); + return spellParts.stream().filter(a -> a.value().getSpellPart().getConfigTier().value == 3).collect(Collectors.toList()); } public void onGlyphClick(Button button) { @@ -286,11 +288,11 @@ public void onGlyphClick(Button button) { unlockGlyphButton.selected = true; if (selectedRecipe == null) return; - for (int i = 0; i < selectedRecipe.inputs.size(); i++) { + for (int i = 0; i < selectedRecipe.value().inputs.size(); i++) { if (i > itemButtons.size()) break; itemButtons.get(i).visible = true; - itemButtons.get(i).ingredient = selectedRecipe.inputs.get(i); + itemButtons.get(i).ingredient = selectedRecipe.value().inputs.get(i); } } @@ -346,12 +348,12 @@ public void drawTooltip(GuiGraphics stack, int mouseX, int mouseY) { List tooltip = new ArrayList<>(); super.collectTooltips(stack, mouseX, mouseY, tooltip); if (hoveredRecipe != null) { - MutableComponent component = Component.translatable("ars_nouveau.levels_required", ScribesTile.getLevelsFromExp(hoveredRecipe.exp)).withStyle(Style.EMPTY.withColor(ChatFormatting.GREEN)); + MutableComponent component = Component.translatable("ars_nouveau.levels_required", ScribesTile.getLevelsFromExp(hoveredRecipe.value().exp)).withStyle(Style.EMPTY.withColor(ChatFormatting.GREEN)); tooltip.add(component); } List components = new ArrayList<>(net.neoforged.neoforge.client.ClientHooks.gatherTooltipComponents(ItemStack.EMPTY, tooltip, mouseX, width, height, this.font)); if (hoveredRecipe != null) - components.add(new GlyphRecipeTooltip(hoveredRecipe.inputs)); + components.add(new GlyphRecipeTooltip(hoveredRecipe.value().inputs)); renderTooltipInternal(stack, components, mouseX, mouseY); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index 29b9e1ab26..4e05dd7656 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -221,7 +221,7 @@ private void layoutAllGlyphs(int page) { sorted.addAll(displayedGlyphs.stream().filter(s -> s instanceof AbstractCastMethod).toList()); sorted.addAll(displayedGlyphs.stream().filter(s -> s instanceof AbstractAugment).toList()); sorted.addAll(displayedGlyphs.stream().filter(s -> s instanceof AbstractEffect).toList()); - sorted.sort(CreativeTabRegistry.COMPARE_TYPE_THEN_NAME); + sorted.sort(CreativeTabRegistry.COMPARE_SPELL_TYPE_NAME); sorted = sorted.subList(glyphsPerPage * page, Math.min(sorted.size(), glyphsPerPage * (page + 1))); int adjustedXPlaced = 0; int totalRowsPlaced = 0; @@ -367,12 +367,12 @@ public void onPageDec(Button button) { } @Override - public boolean mouseScrolled(double mouseX, double mouseY, double scroll) { + public boolean mouseScrolled(double pMouseX, double pMouseY, double pScrollX, double pScrollY) { SoundManager manager = Minecraft.getInstance().getSoundManager(); - if (scroll < 0 && nextButton.active) { + if (pScrollX < 0 && nextButton.active) { onPageIncrease(nextButton); manager.play(SimpleSoundInstance.forUI(SoundEvents.BOOK_PAGE_TURN, 1.0F)); - } else if (scroll > 0 && previousButton.active) { + } else if (pScrollX > 0 && previousButton.active) { onPageDec(previousButton); manager.play(SimpleSoundInstance.forUI(SoundEvents.BOOK_PAGE_TURN, 1.0F)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java index edc7b5ec5b..1a02b0b6ae 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java @@ -240,7 +240,7 @@ private void layoutAllGlyphs(int page) { sorted.addAll(displayedGlyphs.stream().filter(s -> s instanceof AbstractCastMethod).toList()); sorted.addAll(displayedGlyphs.stream().filter(s -> s instanceof AbstractAugment).toList()); sorted.addAll(displayedGlyphs.stream().filter(s -> s instanceof AbstractEffect).toList()); - sorted.sort(CreativeTabRegistry.COMPARE_TYPE_THEN_NAME); + sorted.sort(CreativeTabRegistry.COMPARE_SPELL_TYPE_NAME); sorted = sorted.subList(glyphsPerPage * page, Math.min(sorted.size(), glyphsPerPage * (page + 1))); int adjustedXPlaced = 0; int totalRowsPlaced = 0; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java index d8168770bd..505d3e6025 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java @@ -113,7 +113,7 @@ public void onTestClick(Button button) { return; LocalPlayer localPlayer = Minecraft.getInstance().player; BlockPos pos = localPlayer.getOnPos().above(2); - localPlayer.level.playLocalSound(pos.getX(), pos.getY(), pos.getZ(), selectedSound.getSoundEvent(), SoundSource.PLAYERS, (float) volumeSlider.getValue() / 100f, (float) pitchSlider.getValue() / 100f, false); + localPlayer.level.playLocalSound(pos.getX(), pos.getY(), pos.getZ(), selectedSound.getSoundEvent().value(), SoundSource.PLAYERS, (float) volumeSlider.getValue() / 100f, (float) pitchSlider.getValue() / 100f, false); } public void onSaveClick(Button button) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java index c5e1c50639..0e172b4e1b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java @@ -22,16 +22,15 @@ public class UnlockGlyphButton extends ANButton { public AbstractSpellPart spellPart; public String tooltip = ""; - public GlyphRecipe recipe; + public RecipeHolder recipe; public boolean playerKnows; public boolean selected; - public UnlockGlyphButton(int x, int y, boolean isCraftingSlot, AbstractSpellPart spellPart, OnPress onPress) { + public UnlockGlyphButton(int x, int y, boolean isCraftingSlot, RecipeHolder spellRecipe, OnPress onPress) { super(x, y, 16, 16, onPress); this.isCraftingSlot = isCraftingSlot; this.spellPart = spellPart; - RecipeHolder recipe = Minecraft.getInstance().level.getRecipeManager().byKey(spellPart.getRegistryName()).orElse(null); - this.recipe = recipe == null || !(recipe.value() instanceof GlyphRecipe glyphRecipe) ? null : glyphRecipe; + this.recipe = spellRecipe; } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/RenderUtils.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/RenderUtils.java index a660fb2805..fcb050fe7b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/RenderUtils.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/RenderUtils.java @@ -1,12 +1,14 @@ package com.hollingsworth.arsnouveau.client.gui.utils; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; +import com.hollingsworth.arsnouveau.client.gui.Color; import com.hollingsworth.arsnouveau.setup.config.Config; import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.*; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -85,26 +87,25 @@ private static MultiBufferSource transparentBuffer(MultiBufferSource buffer) { return renderType -> new TintedVertexConsumer(buffer.getBuffer(TRANSLUCENT), 1.0f, 1.0f, 1.0f, 0.25f); } -// /* -// * Adapted from Eidolon, Elucent -// */ -// public static void colorBlit(PoseStack mStack, int x, int y, int uOffset, int vOffset, int width, int height, int textureWidth, int textureHeight, Color color) { -// RenderSystem.enableBlend(); -// RenderSystem.defaultBlendFunc(); -// RenderSystem.setShader(GameRenderer::getPositionTexColorShader); -// Matrix4f matrix = mStack.last().pose(); -// int maxX = x + width, maxY = y + height; -// float minU = (float) uOffset / textureWidth, minV = (float) vOffset / textureHeight; -// float maxU = minU + (float) width / textureWidth, maxV = minV + (float) height / textureHeight; -// int r = color.getRed(), g = color.getGreen(), b = color.getBlue(), alpha = color.getAlpha(); -// BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); -// bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); -// bufferbuilder.addVertex(matrix, (float) x, (float) maxY, 0).uv(minU, maxV).color(r, g, b, alpha).endVertex(); -// bufferbuilder.addVertex(matrix, (float) maxX, (float) maxY, 0).uv(maxU, maxV).color(r, g, b, alpha).endVertex(); -// bufferbuilder.addVertex(matrix, (float) maxX, (float) y, 0).uv(maxU, minV).color(r, g, b, alpha).endVertex(); -// bufferbuilder.addVertex(matrix, (float) x, (float) y, 0).uv(minU, minV).color(r, g, b, alpha).endVertex(); -// BufferUploader.drawWithShader(bufferbuilder.end()); -// RenderSystem.disableBlend(); -// } + /* + * Adapted from Eidolon, Elucent + */ + public static void colorBlit(PoseStack mStack, int x, int y, int uOffset, int vOffset, int width, int height, int textureWidth, int textureHeight, Color color) { + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.setShader(GameRenderer::getPositionTexColorShader); + Matrix4f matrix = mStack.last().pose(); + int maxX = x + width, maxY = y + height; + float minU = (float) uOffset / textureWidth, minV = (float) vOffset / textureHeight; + float maxU = minU + (float) width / textureWidth, maxV = minV + (float) height / textureHeight; + int r = color.getRed(), g = color.getGreen(), b = color.getBlue(), alpha = color.getAlpha(); + BufferBuilder bufferbuilder = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + bufferbuilder.addVertex(matrix, (float) x, (float) maxY, 0).setUv(minU, maxV).setColor(r, g, b, alpha); + bufferbuilder.addVertex(matrix, (float) maxX, (float) maxY, 0).setUv(maxU, maxV).setColor(r, g, b, alpha); + bufferbuilder.addVertex(matrix, (float) maxX, (float) y, 0).setUv(maxU, minV).setColor(r, g, b, alpha); + bufferbuilder.addVertex(matrix, (float) x, (float) y, 0).setUv(minU, minV).setColor(r, g, b, alpha); + BufferUploader.drawWithShader(bufferbuilder.buildOrThrow()); + RenderSystem.disableBlend(); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java index 5910e7df4e..3c72912a1c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java @@ -2,6 +2,10 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.particle.IParticleColor; +import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; @@ -12,6 +16,14 @@ * Modified class of ElementType: https://github.com/Sirttas/ElementalCraft/blob/b91ca42b3d139904d9754d882a595406bad1bd18/src/main/java/sirttas/elementalcraft/ElementType.java */ public class ParticleColor implements IParticleColor, Cloneable { + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + ResourceLocation.CODEC.fieldOf("id").forGetter(ParticleColor::getRegistryName), + Codec.INT.fieldOf("r").forGetter(ParticleColor::getRedInt), + Codec.INT.fieldOf("g").forGetter(ParticleColor::getGreenInt), + Codec.INT.fieldOf("b").forGetter(ParticleColor::getBlueInt) + ).apply(instance, ParticleColorRegistry::from)); + public static final ResourceLocation ID = ArsNouveau.prefix( "constant"); public static final ParticleColor DEFAULT = new ParticleColor(255, 25, 180); @@ -81,14 +93,26 @@ public float getRed() { return r; } + public int getRedInt() { + return (int) (r * 255.0); + } + public float getGreen() { return g; } + public int getGreenInt() { + return (int) (g * 255.0); + } + public float getBlue() { return b; } + public int getBlueInt() { + return (int) (b * 255.0); + } + public int getColor() { return color; } @@ -131,14 +155,6 @@ public ParticleColor transition(int ticks) { return new ParticleColor(random.nextInt(wrapper.r), random.nextInt(wrapper.g), random.nextInt(wrapper.b)); } - // Needed because particles can be created over commands - public static ParticleColor fromString(String string) { - if (string == null || string.isEmpty()) - return defaultParticleColor(); - String[] arr = string.split(","); - return new ParticleColor(Integer.parseInt(arr[0].trim()), Integer.parseInt(arr[1].trim()), Integer.parseInt(arr[2].trim())); - } - public double euclideanDistance(ParticleColor color) { return Math.sqrt(Math.pow(this.r - color.getRed(), 2) + Math.pow(this.g - color.getGreen(), 2) + Math.pow(this.b - color.getBlue(), 2)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/RainbowParticleColor.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/RainbowParticleColor.java index e634ace488..d618a79ce0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/RainbowParticleColor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/RainbowParticleColor.java @@ -11,22 +11,15 @@ public class RainbowParticleColor extends ParticleColor{ public static final ResourceLocation ID = ArsNouveau.prefix( "rainbow"); public final int tickOffset; - public int transitionSpeed; public RainbowParticleColor(int r, int g, int b){ super(r, g, b); this.tickOffset = random.nextInt(1536); } - public RainbowParticleColor(int r, int g, int b, int transitionSpeed){ - this(r, g, b); - this.transitionSpeed = transitionSpeed; - } - public RainbowParticleColor(CompoundTag compoundTag){ super(compoundTag); tickOffset = compoundTag.getInt("tickOffset"); - transitionSpeed = compoundTag.getInt("transitionSpeed"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index f6aad5cc98..101d2d2281 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -4,8 +4,8 @@ import com.hollingsworth.arsnouveau.api.camera.ICameraMountable; import com.hollingsworth.arsnouveau.api.item.ICasterTool; import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; -import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.api.util.PerkUtil; +import com.hollingsworth.arsnouveau.client.container.CraftingTerminalScreen; import com.hollingsworth.arsnouveau.client.gui.GuiEntityInfoHUD; import com.hollingsworth.arsnouveau.client.gui.GuiManaHUD; import com.hollingsworth.arsnouveau.client.gui.GuiSpellHUD; @@ -17,12 +17,14 @@ import com.hollingsworth.arsnouveau.common.block.tile.MageBlockTile; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.common.block.tile.PotionMelderTile; -import com.hollingsworth.arsnouveau.common.items.PotionFlask; import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.hollingsworth.arsnouveau.common.util.CameraUtil; +import com.hollingsworth.arsnouveau.common.util.PotionUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import com.hollingsworth.arsnouveau.setup.registry.MenuRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.client.Minecraft; import net.minecraft.client.Options; @@ -33,6 +35,7 @@ import net.minecraft.client.renderer.item.ClampedItemPropertyFunction; import net.minecraft.client.renderer.item.ItemProperties; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.LivingEntity; @@ -49,6 +52,7 @@ import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; import net.neoforged.neoforge.client.event.RegisterGuiLayersEvent; +import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; import net.neoforged.neoforge.client.gui.VanillaGuiLayers; import org.jetbrains.annotations.Nullable; @@ -178,6 +182,11 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer } }); + @SubscribeEvent + public static void registerMenu(final RegisterMenuScreensEvent event){ + event.register(MenuRegistry.STORAGE.get(), CraftingTerminalScreen::new); + } + @SubscribeEvent public static void registerOverlays(final RegisterGuiLayersEvent event) { event.registerAboveAll(ArsNouveau.prefix("scry_camera"), cameraOverlay); @@ -246,7 +255,7 @@ public static void initItemColors(final RegisterColorHandlersEvent.Item event) { event.register((stack, color) -> color > 0 ? -1 : new ParticleColor(200, 0, 200).getColor(), - ForgeRegistries.ITEMS.getValue(ArsNouveau.prefix( LibBlockNames.POTION_MELDER_BLOCK))); + BuiltInRegistries.ITEM.get(ArsNouveau.prefix( LibBlockNames.POTION_MELDER_BLOCK))); event.register((stack, color) -> color > 0 ? -1 : colorFromArmor(stack), @@ -312,8 +321,8 @@ public static void initItemColors(final RegisterColorHandlersEvent.Item event) { } CompoundTag blockTag = stack.getOrCreateTag().getCompound("BlockEntityTag"); if (blockTag.contains("potionData")) { - PotionData data = PotionData.fromTag(blockTag.getCompound("potionData")); - return PotionUtils.getColor(data.fullEffects()); + PotionContents data = ANCodecs.decode(PotionContents.CODEC, blockTag.getCompound("potionData")); + return data.getColor(); } return -1; }, BlockRegistry.POTION_JAR); @@ -328,7 +337,7 @@ public static int colorFromArmor(ItemStack stack) { } public static int colorFromFlask(ItemStack stack) { - PotionFlask.FlaskData data = new PotionFlask.FlaskData(stack); - return data.getPotion().getPotion() == PotionContents.EMPTY ? -1 : data.getPotion().getPotion().getColor(); + PotionContents contents = PotionUtil.getContents(stack); + return contents == PotionContents.EMPTY ? -1 : contents.getColor(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleRenderer.java index 729883e8c8..50b87a128c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleRenderer.java @@ -5,7 +5,7 @@ import com.hollingsworth.arsnouveau.api.item.ICosmeticItem; import com.hollingsworth.arsnouveau.client.registry.ShaderRegistry; import com.hollingsworth.arsnouveau.common.entity.Starbuncle; -import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.ByteBufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.Minecraft; @@ -21,7 +21,7 @@ import software.bernie.geckolib.util.RenderUtil; public class StarbuncleRenderer extends GeoEntityRenderer { - public static MultiBufferSource.BufferSource cosmeticBuffer = MultiBufferSource.immediate(new BufferBuilder(256)); + public static MultiBufferSource.BufferSource cosmeticBuffer = MultiBufferSource.immediate(new ByteBufferBuilder(1536)); public StarbuncleRenderer(EntityRendererProvider.Context manager) { super(manager, new StarbuncleModel()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java index e1fe613ee1..5a281058ff 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.items.FlaskCannon; import com.hollingsworth.arsnouveau.common.items.data.PotionLauncherData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.model.geom.EntityModelSet; @@ -10,7 +11,6 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.alchemy.PotionContents; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.model.GeoModel; @@ -34,23 +34,24 @@ public void renderRecursively(PoseStack poseStack, FlaskCannon animatable, GeoBo super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, packedColor); return; } - PotionLauncherData flask = new PotionLauncherData(currentItemStack); + PotionLauncherData flask = currentItemStack.getOrDefault(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData()); + int amountLeft = flask.amountLeft(); if(bone == null) return; if(bone.getName().equalsIgnoreCase("full")){ - bone.setHidden(flask.amountLeft < 8); + bone.setHidden(amountLeft < 8); }else if(bone.getName().equalsIgnoreCase("75")){ - bone.setHidden(!(flask.amountLeft == 7 || flask.amountLeft == 6)); + bone.setHidden(!(amountLeft == 7 || amountLeft == 6)); }else if(bone.getName().equalsIgnoreCase("50")){ - bone.setHidden(!(flask.amountLeft == 5 || flask.amountLeft == 4)); + bone.setHidden(!(amountLeft == 5 || amountLeft == 4)); }else if(bone.getName().equalsIgnoreCase("25")){ - bone.setHidden(!(flask.amountLeft == 3 || flask.amountLeft == 2)); + bone.setHidden(!(amountLeft == 3 || amountLeft == 2)); }else if(bone.getName().equalsIgnoreCase("1")){ - bone.setHidden(flask.amountLeft != 1); + bone.setHidden(amountLeft != 1); } if(bone.getName().equals("potion_levels") || (bone.getParent() != null && bone.getParent().getName().equals("potion_levels"))) { - ParticleColor color = ParticleColor.fromInt(PotionContents.getColor(flask.getLastDataForRender().asPotionStack())); + ParticleColor color = ParticleColor.fromInt(flask.renderData().getColor()); super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color.getColor()); }else{ super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, packedColor); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java index 63e89a949d..5d3accfaa6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java @@ -10,8 +10,8 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.core.component.DataComponents; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemDisplayContext; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.model.GeoModel; @@ -102,7 +102,8 @@ public void defaultRenderGui(PoseStack poseStack, SpellBook animatable, MultiBuf @Override public ResourceLocation getTextureLocation(SpellBook o) { String base = "textures/item/spellbook_"; - String color = !currentItemStack.hasTag() || !currentItemStack.getTag().contains("color") ? "purple" : DyeColor.byId(currentItemStack.getOrCreateTag().getInt("color")).getName(); + var dyeColor = currentItemStack.get(DataComponents.BASE_COLOR); + String color = dyeColor == null ? "purple" : dyeColor.getName(); return ArsNouveau.prefix( base + color + ".png"); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScribesRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScribesRenderer.java index 3d2bf47d5d..ed6b1ca4f6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScribesRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScribesRenderer.java @@ -109,7 +109,7 @@ public void renderFinal(PoseStack stack, ScribesTile tile, BakedGeoModel model, if (tile.getLevel().getBlockState(tile.getBlockPos()).getValue(ScribesBlock.PART) != ThreePartBlock.HEAD) return; - renderPressedItem(tile, tile.crafting ? tile.craftingTicks < 40 ? tile.recipe.output.getItem().getDefaultInstance() : ItemsRegistry.BLANK_GLYPH.get().getDefaultInstance() : tile.getStack(), stack, bufferSource, packedLight, packedOverlay, ClientInfo.ticksInGame + partialTick); + renderPressedItem(tile, tile.crafting ? tile.craftingTicks < 40 ? tile.recipe.value().output.getItem().getDefaultInstance() : ItemsRegistry.BLANK_GLYPH.get().getDefaultInstance() : tile.getStack(), stack, bufferSource, packedLight, packedOverlay, ClientInfo.ticksInGame + partialTick); } public void renderPressedItem(ScribesTile tile, ItemStack itemToRender, PoseStack matrixStack, MultiBufferSource iRenderTypeBuffer, int packedLight, int packedOverlay, float partialTicks) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java index d5dd0d5e6d..09d16bde12 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java @@ -1,18 +1,15 @@ package com.hollingsworth.arsnouveau.common.block; -import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.component.DataComponents; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.ItemInteractionResult; -import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -80,8 +77,8 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level PotionContents potion = stack.get(DataComponents.POTION_CONTENTS); if (stack.getItem() == Items.POTION && potion != null && potion != PotionContents.EMPTY) { - if (tile.canAccept(new PotionData(stack),100)) { - tile.add(new PotionData(stack), 100); + if (tile.canAccept(potion,100)) { + tile.add(potion, 100); if (!player.isCreative()) { stack.shrink(1); player.addItem(new ItemStack(Items.GLASS_BOTTLE)); @@ -90,22 +87,16 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level return super.useItemOn(stack, state, worldIn, pos, player, handIn, hit); }else if (stack.getItem() == Items.GLASS_BOTTLE && tile.getAmount() >= 100) { ItemStack potionStack = new ItemStack(Items.POTION); - PotionContents contents = tile.getData().getPotion(); - for(MobEffectInstance instance : tile.getData().getCustomEffects()){ - contents = contents.withEffectAdded(instance); - } - potionStack.set(DataComponents.POTION_CONTENTS, contents); + PotionContents contents = tile.getData(); + potionStack.set(DataComponents.POTION_CONTENTS, new PotionContents(contents.potion(), contents.customColor(), contents.customEffects())); if(player.addItem(potionStack)) { player.getItemInHand(handIn).shrink(1); tile.remove(100); } }else if(stack.getItem() == Items.ARROW && tile.getAmount() >= 10){ ItemStack potionStack = new ItemStack(Items.TIPPED_ARROW); - PotionContents contents = tile.getData().getPotion(); - for(MobEffectInstance instance : tile.getData().getCustomEffects()){ - contents = contents.withEffectAdded(instance); - } - potionStack.set(DataComponents.POTION_CONTENTS, contents); + PotionContents contents = tile.getData(); + potionStack.set(DataComponents.POTION_CONTENTS, new PotionContents(contents.potion(), contents.customColor(), contents.customEffects())); if(player.addItem(potionStack)) { player.getItemInHand(handIn).shrink(1); tile.remove(10); @@ -132,15 +123,16 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { @Override public void appendHoverText(ItemStack stack, Item.TooltipContext pContext, List tooltip, TooltipFlag pTooltipFlag) { - if (stack.getTag() == null) - return; - int fill = stack.getTag().getCompound("BlockEntityTag").getInt("currentFill"); - tooltip.add(Component.literal((fill * 100) / 10000 + "% full")); - CompoundTag blockTag = stack.getTag().getCompound("BlockEntityTag"); - if(blockTag.contains("potionData")){ - PotionData data = PotionData.fromTag(blockTag.getCompound("potionData")); - data.appendHoverText(tooltip); - } + //todo: restore potion jar item tooltip +// if (stack.getTag() == null) +// return; +// int fill = stack.getTag().getCompound("BlockEntityTag").getInt("currentFill"); +// tooltip.add(Component.literal((fill * 100) / 10000 + "% full")); +// CompoundTag blockTag = stack.getTag().getCompound("BlockEntityTag"); +// if(blockTag.contains("potionData")){ +// PotionData data = PotionData.fromTag(blockTag.getCompound("potionData")); +// data.appendHoverText(tooltip); +// } } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RepositoryBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RepositoryBlock.java index de56a40404..dcb1ad0378 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RepositoryBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RepositoryBlock.java @@ -3,7 +3,10 @@ import com.hollingsworth.arsnouveau.common.block.tile.RepositoryTile; import net.minecraft.core.BlockPos; import net.minecraft.stats.Stats; -import net.minecraft.world.*; +import net.minecraft.world.Container; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.monster.piglin.PiglinAi; import net.minecraft.world.entity.player.Player; @@ -28,9 +31,6 @@ public RepositoryBlock() { public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, @javax.annotation.Nullable LivingEntity pPlacer, ItemStack pStack) { BlockEntity blockentity = pLevel.getBlockEntity(pPos); if (blockentity instanceof RepositoryTile tile) { - if (pStack.hasCustomHoverName()) { - tile.setCustomName(pStack.getHoverName()); - } tile.configuration = pLevel.random.nextInt(RepositoryTile.CONFIGURATIONS.length); tile.updateBlock(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java index 030ec2dd19..f1267d827f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceBerryBush.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.common.entity.Starbuncle; import com.hollingsworth.arsnouveau.common.lib.EntityTags; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; @@ -45,6 +46,13 @@ public SourceBerryBush(BlockBehaviour.Properties properties) { this.registerDefaultState(this.stateDefinition.any().setValue(AGE, 0)); } + public static final MapCodec CODEC = simpleCodec(SourceBerryBush::new); + + @Override + protected MapCodec codec() { + return CODEC; + } + @Override public ItemStack getCloneItemStack(BlockState state, HitResult target, LevelReader level, BlockPos pos, Player player) { return new ItemStack(BlockRegistry.SOURCEBERRY_BUSH); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlchemicalSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlchemicalSourcelinkTile.java index 261249db9e..a2ce8d80ef 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlchemicalSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlchemicalSourcelinkTile.java @@ -36,7 +36,7 @@ public void tick() { if (potionPos != null && level.getBlockEntity(potionPos) instanceof PotionJarTile tile) { int source = 75; Set effectTypes = new HashSet<>(); - for (MobEffectInstance e : tile.getData().fullEffects()) { + for (MobEffectInstance e : tile.getData().getAllEffects()) { source += (e.getDuration() / 50); source += e.getAmplifier() * 250; source += 150; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java index 479020e9d5..ae7c5bd31e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java @@ -10,8 +10,8 @@ import com.hollingsworth.arsnouveau.common.entity.EntityDrygmy; import com.hollingsworth.arsnouveau.common.entity.EntityFollowProjectile; import com.hollingsworth.arsnouveau.common.lib.EntityTags; -import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.config.Config; +import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; @@ -132,7 +132,7 @@ public void convertedEffect() { public void refreshEntitiesAndBonus() { Set uniqueEntities; - this.nearbyEntities = level.getEntitiesOfClass(LivingEntity.class, new AABB(getBlockPos().north(10).west(10).below(6), getBlockPos().south(10).east(10).above(6))); + this.nearbyEntities = level.getEntitiesOfClass(LivingEntity.class, new AABB(getBlockPos().north(10).west(10).below(6).getBottomCenter(), getBlockPos().south(10).east(10).above(6).getBottomCenter())); for(BlockPos b : BlockPos.withinManhattan(getBlockPos(), 10, 10, 10)){ if(level.getBlockEntity(b) instanceof MobJarTile mobJarTile && mobJarTile.getEntity() instanceof LivingEntity livingEntity){ nearbyEntities.add(livingEntity); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MycelialSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MycelialSourcelinkTile.java index dd20d8ebd5..d9bc53b0a0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MycelialSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MycelialSourcelinkTile.java @@ -8,7 +8,6 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; @@ -36,7 +35,7 @@ public void tick() { return; if (level.getGameTime() % 40 == 0 && this.canAcceptSource()) { for (ItemEntity i : level.getEntitiesOfClass(ItemEntity.class, new AABB(worldPosition).inflate(1.0))) { - if (i.getItem().getItem().isEdible()) { + if (i.getItem().getItem().getFoodProperties(i.getItem(), null) != null) { int source = getSourceValue(i.getItem()); this.addSource(source); ItemStack containerItem = i.getItem().getCraftingRemainingItem(); @@ -63,23 +62,23 @@ public void tick() { } public int getSourceValue(ItemStack i) { - if (i.getItem().isEdible()) { - int mana = 0; - FoodProperties food = i.getItem().getFoodProperties(i, null); - if(food == null) - return 0; - mana += 11 * food.getNutrition(); - mana += 30 * food.getSaturationModifier(); - progress += 1; - - if (i.is(ItemTagProvider.MAGIC_FOOD) || (i.getItem() instanceof BlockItem blockItem && blockItem.getBlock().defaultBlockState().is(BlockTagProvider.MAGIC_PLANTS))) { - progress += 4; - mana += 10; - mana *= 2; - } - return mana; + var food = i.getItem().getFoodProperties(i, null); + if(food == null){ + return 0; } - return 0; + + int mana = 0; + mana += 11 * food.nutrition(); + mana += 30 * food.saturation(); + progress += 1; + + if (i.is(ItemTagProvider.MAGIC_FOOD) || (i.getItem() instanceof BlockItem blockItem && blockItem.getBlock().defaultBlockState().is(BlockTagProvider.MAGIC_PLANTS))) { + progress += 4; + mana += 10; + mana *= 2; + } + return mana; + } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java index 570651d2bf..4bd5923a8d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java @@ -2,13 +2,14 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.api.item.IWandable; -import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.api.util.NBTUtil; -import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ColorPos; +import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.entity.EntityFlyingItem; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.common.util.PotionUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; @@ -16,8 +17,10 @@ import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import org.jetbrains.annotations.Nullable; @@ -26,7 +29,7 @@ public class PotionDiffuserTile extends ModdedTile implements ITickable, IWandable, ITooltipProvider { - public PotionData lastConsumedPotion = new PotionData(); + public PotionContents lastConsumedPotion = PotionContents.EMPTY; public int ticksToConsume; public BlockPos boundPos; public boolean isOff; @@ -39,7 +42,7 @@ public PotionDiffuserTile(BlockPos pos, BlockState state) { public void tick() { if(isOff) return; - if(level.isClientSide && !isOff && ticksToConsume > 0 && !lastConsumedPotion.isEmpty() && level.getGameTime() % 8 == 0) { + if(level.isClientSide && !isOff && ticksToConsume > 0 && !PotionUtil.isEmpty(lastConsumedPotion) && level.getGameTime() % 8 == 0) { level.addParticle(ParticleTypes.SMOKE, getX() + 0.5, getY() + 1, getZ() + 0.5, 0, 0, 0); return; } @@ -51,7 +54,13 @@ public void tick() { ticksToConsume--; if(level.getGameTime() % (15 * 20) == 0){ for(LivingEntity entity : level.getEntitiesOfClass(LivingEntity.class, new AABB(getBlockPos()).inflate(10))){ - lastConsumedPotion.applyEffects(null, null, entity); + lastConsumedPotion.forEachEffect(effectinstance -> { + if (effectinstance.getEffect().value().isInstantenous()) { + effectinstance.getEffect().value().applyInstantenousEffect(null, null, entity, effectinstance.getAmplifier(), 1.0D); + } else { + entity.addEffect(new MobEffectInstance(effectinstance), null); + } + }); } } } @@ -59,7 +68,7 @@ public void tick() { public void obtainPotion(){ if(level.isLoaded(boundPos) && level.getBlockEntity(boundPos) instanceof PotionJarTile jar){ - if(!jar.getData().isEmpty() && jar.getAmount() >= 100){ + if(!PotionUtil.isEmpty(jar.getData()) && jar.getAmount() >= 100){ lastConsumedPotion = jar.getData(); ticksToConsume = 20 * 60 * 10; // 10 mins jar.remove(100); @@ -79,7 +88,7 @@ public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable Liv if(storedPos != null && level.getBlockEntity(storedPos) instanceof PotionJarTile jar){ boundPos = storedPos.immutable(); PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.potion_diffuser.set_pos")); - if(this.lastConsumedPotion != null && !this.lastConsumedPotion.isEmpty() && !lastConsumedPotion.areSameEffects(jar.getData())){ + if(this.lastConsumedPotion != null && !PotionUtil.isEmpty(lastConsumedPotion) && !PotionUtil.arePotionContentsEqual(lastConsumedPotion, jar.getData())){ obtainPotion(); } updateBlock(); @@ -97,7 +106,7 @@ protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistrie isOff = pTag.getBoolean("isOff"); ticksToConsume = pTag.getInt("ticksToConsume"); if(pTag.contains("lastConsumedPotion")){ - lastConsumedPotion = PotionData.fromTag(pTag.getCompound("lastConsumedPotion")); + lastConsumedPotion = ANCodecs.decode(PotionContents.CODEC, pTag.getCompound("lastConsumedPotion")); } } @@ -110,7 +119,7 @@ public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { tag.putBoolean("isOff", isOff); tag.putInt("ticksToConsume", ticksToConsume); if(lastConsumedPotion != null){ - tag.put("lastConsumedPotion", lastConsumedPotion.toTag()); + tag.put("lastConsumedPotion", ANCodecs.encode(PotionContents.CODEC, lastConsumedPotion)); } } @@ -123,7 +132,7 @@ public void getTooltip(List tooltip) { tooltip.add(Component.translatable("ars_nouveau.potion_diffuser.off").withStyle(ChatFormatting.GOLD)); } if(lastConsumedPotion != null){ - lastConsumedPotion.appendHoverText(tooltip); + lastConsumedPotion.addPotionTooltip(tooltip::add, 1.0f, 20f); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java index 19bf3f586f..39a16236be 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java @@ -2,12 +2,12 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.api.item.IWandable; -import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.common.block.SourceJar; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; +import com.hollingsworth.arsnouveau.common.util.PotionUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; @@ -16,14 +16,12 @@ import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; import java.util.List; -import java.util.Set; public class PotionJarTile extends ModdedTile implements ITooltipProvider, IWandable { public boolean isLocked; - private PotionData data = new PotionData(); + private PotionContents data = PotionContents.EMPTY; int currentFill; public PotionJarTile(BlockEntityType tileEntityTypeIn, BlockPos pos, BlockState state) { @@ -65,23 +63,23 @@ public void handleUpdateTag(CompoundTag tag, HolderLookup.Provider lookupProvide level.sendBlockUpdated(worldPosition, level.getBlockState(worldPosition), level.getBlockState(worldPosition), 8); } - public@NotNull PotionData getData() { + public @NotNull PotionContents getData() { return data; } public int getColor() { - return this.data.getPotion() == null ? 16253176 : PotionContents.getColor(this.data.fullEffects()); + return this.data == PotionContents.EMPTY ? 16253176 : this.data.getColor(); } - public boolean canAccept(PotionData otherData, int amount){ - if(otherData == null || otherData.getPotion() == PotionContents.EMPTY) + public boolean canAccept(PotionContents otherData, int amount){ + if(otherData == null || PotionUtil.isEmpty(otherData)) return false; - return (!this.isLocked && this.getAmount() <= 0) || (amount <= (this.getMaxFill() - this.getAmount()) && otherData.areSameEffects(this.data)); + return (!this.isLocked && this.getAmount() <= 0) || (amount <= (this.getMaxFill() - this.getAmount()) && PotionUtil.arePotionContentsEqual(otherData, this.data)); } - public void add(PotionData other, int amount){ + public void add(PotionContents other, int amount){ if(this.currentFill == 0){ - if(!this.data.equals(other) || (this.data.getPotion() == PotionContents.EMPTY)) { + if(!this.data.equals(other) || (this.data == PotionContents.EMPTY)) { this.data = other; } currentFill += amount; @@ -95,14 +93,14 @@ public void add(PotionData other, int amount){ public void remove(int amount){ currentFill = Math.max(currentFill - amount, 0); if(currentFill == 0 && !isLocked){ - this.data = new PotionData(); + this.data = PotionContents.EMPTY; } updateBlock(); } @Override public void getTooltip(List tooltip) { - data.appendHoverText(tooltip); + PotionContents.addPotionTooltip(data.getAllEffects(), tooltip::add, 1.0F, 20.0f); tooltip.add(Component.translatable("ars_nouveau.source_jar.fullness", (getAmount() * 100) / this.getMaxFill())); if (isLocked) tooltip.add(Component.translatable("ars_nouveau.locked")); @@ -112,7 +110,7 @@ public void getTooltip(List tooltip) { protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.loadAdditional(tag, pRegistries); if(tag.contains("potionData")) - this.data = PotionData.fromTag(tag.getCompound("potionData")); + this.data = ANCodecs.decode(PotionContents.CODEC, tag.get("potionData")); this.isLocked = tag.getBoolean("locked"); this.currentFill = tag.getInt("currentFill"); } @@ -120,15 +118,17 @@ protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries @Override public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); - tag.put("potionData", this.data.toTag()); + tag.put("potionData", ANCodecs.encode(PotionContents.CODEC, this.data)); tag.putBoolean("locked", this.isLocked); tag.putInt("currentFill", this.currentFill); + //TODO: restore string list of serialized potions + // Include a sorted list of potion names so quests can check the jar's contents - Set potionSet = this.data.getIncludedPotions(); - List potionNames = new ArrayList<>(potionSet.stream().map(potion -> BuiltInRegistries.POTION.getKey(potion).toString()).toList()); - potionNames.sort(String::compareTo); - tag.putString("potionNames", String.join(",", potionNames)); +// Set potionSet = this.data.getIncludedPotions(); +// List potionNames = new ArrayList<>(potionSet.stream().map(potion -> BuiltInRegistries.POTION.getKey(potion).toString()).toList()); +// potionNames.sort(String::compareTo); +// tag.putString("potionNames", String.join(",", potionNames)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java index 0efe9f1e28..e164f44685 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java @@ -2,19 +2,19 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.api.item.IWandable; -import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.api.util.BlockUtil; import com.hollingsworth.arsnouveau.api.util.NBTUtil; import com.hollingsworth.arsnouveau.api.util.SourceUtil; +import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.client.particle.GlowParticleData; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; -import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.entity.EntityFlyingItem; import com.hollingsworth.arsnouveau.common.util.PortUtil; -import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.common.util.PotionUtil; import com.hollingsworth.arsnouveau.setup.config.Config; +import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; @@ -24,19 +24,15 @@ import net.minecraft.network.chat.Style; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; - +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; -import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.ArrayList; @@ -88,7 +84,7 @@ public void tick() { PotionJarTile tile1 = (PotionJarTile) level.getBlockEntity(fromJars.get(0)); PotionJarTile tile2 = (PotionJarTile) level.getBlockEntity(fromJars.get(1)); - PotionData data = tile1.getData().mergeEffects(tile2.getData()); + PotionContents data = PotionUtil.merge(tile1.getData(), tile2.getData()); if (!combJar.canAccept(data, Config.MELDER_OUTPUT.get())) { isMixing = false; timeMixing = 0; @@ -108,13 +104,13 @@ public void tick() { double d1 = worldPosition.getY() + 1 + ParticleUtil.inRange(-0.1, 0.4); double d2 = worldPosition.getZ() + .5 + ParticleUtil.inRange(-0.25, 0.25); level.addParticle(GlowParticleData.createData( - ParticleColor.fromInt(PotionUtils.getColor(data.fullEffects()))), + ParticleColor.fromInt(PotionContents.getColor(data.getAllEffects()))), d0, d1, d2, 0, 0.01f, 0); } - lastMixedColor = PotionUtils.getColor(data.fullEffects()); + lastMixedColor = PotionContents.getColor(data.getAllEffects()); } if (timeMixing >= 160) timeMixing = 0; @@ -138,8 +134,9 @@ public void tick() { } } - public void mergePotions(PotionJarTile combJar, PotionJarTile take1, PotionJarTile take2, PotionData data){ - combJar.add(data, Config.MELDER_OUTPUT.get()); + public void mergePotions(PotionJarTile combJar, PotionJarTile take1, PotionJarTile take2, PotionContents data){ + combJar.add( + data, Config.MELDER_OUTPUT.get()); take1.remove(Config.MELDER_INPUT_COST.get()); take2.remove(Config.MELDER_INPUT_COST.get()); hasSource = false; @@ -165,8 +162,8 @@ public boolean takeJarsValid(){ return true; } - public PotionData getCombinedResult(PotionJarTile jar1, PotionJarTile jar2) { - return jar1.getData().mergeEffects(jar2.getData()); + public PotionContents getCombinedResult(PotionJarTile jar1, PotionJarTile jar2) { + return PotionUtil.merge(jar1.getData(), jar2.getData()); } @Override @@ -294,7 +291,7 @@ public void getTooltip(List tooltip) { if(tile1 == null || tile1.getAmount() < inputCost || tile2 == null || tile2.getAmount() < inputCost) { return; } - PotionData data = getCombinedResult(tile1, tile2); + PotionContents data = getCombinedResult(tile1, tile2); if(!combJar.canAccept(data, Config.MELDER_OUTPUT.get())){ tooltip.add(Component.translatable("ars_nouveau.melder.destination_invalid").setStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java index 22ba3fbbb4..3c813d921d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java @@ -14,16 +14,15 @@ import com.hollingsworth.arsnouveau.api.spell.SpellStats; import com.hollingsworth.arsnouveau.api.util.BlockUtil; import com.hollingsworth.arsnouveau.api.util.SourceUtil; +import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.client.particle.GlowParticleData; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; -import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.block.RitualBrazierBlock; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; @@ -41,8 +40,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.HitResult; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -224,7 +221,7 @@ protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries ritual = RitualRegistry.getRitual(ritualID); if (ritual != null) { ritual.tile = this; - ritual.read(tag); + ritual.read(pRegistries, tag); } } else { ritual = null; @@ -243,7 +240,7 @@ protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries super.saveAdditional(tag, pRegistries); if (ritual != null) { tag.putString("ritualID", ritual.getRegistryName().toString()); - ritual.write(tag); + ritual.write(pRegistries, tag); } else { tag.remove("ritualID"); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java index da83b466f1..27463dda97 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java @@ -14,6 +14,7 @@ import com.hollingsworth.arsnouveau.common.network.PacketOneShotAnimation; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; @@ -28,6 +29,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeInput; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -50,7 +52,7 @@ public class ScribesTile extends ModdedTile implements GeoBlockEntity, ITickable private ItemStack stack = ItemStack.EMPTY; boolean synced; public List consumedStacks = new ArrayList<>(); - public GlyphRecipe recipe; + public RecipeHolder recipe; ResourceLocation recipeID; // Cached for after load public boolean crafting; public int craftingTicks; @@ -75,8 +77,8 @@ public void tick() { recipe = null; // Used on client to remove recipe since for some forsaken reason world is missing during load. } - if (recipeID != null && !recipeID.toString().isEmpty() && (recipe == null || !recipe.id.equals(recipeID))) { - recipe = (GlyphRecipe) level.getRecipeManager().byKey(recipeID).orElse(null); + if (recipeID != null && !recipeID.toString().isEmpty() && (recipe == null || !recipe.id().equals(recipeID))) { + recipe = level.getRecipeManager().byKeyTyped(RecipeRegistry.GLYPH_TYPE.get(), recipeID); setChanged(); } if (!level.isClientSide && level.getGameTime() % 5 == 0 && recipe != null) { @@ -110,7 +112,7 @@ public void tick() { setChanged(); } if (!level.isClientSide && crafting && craftingTicks == 0 && recipe != null) { - level.addFreshEntity(new ItemEntity(level, getX() + 0.5, getY() + 1.1, getZ() + 0.5, recipe.output.copy())); + level.addFreshEntity(new ItemEntity(level, getX() + 0.5, getY() + 1.1, getZ() + 0.5, recipe.value().output.copy())); recipe = null; recipeID = ResourceLocation.withDefaultNamespace(""); crafting = false; @@ -157,7 +159,7 @@ public void refundConsumed() { consumedStacks = new ArrayList<>(); } if (recipe != null) { - int exp = recipe.exp; + int exp = recipe.value().getExp(); if (level instanceof ServerLevel serverLevel) ExperienceOrb.award(serverLevel, new Vec3(getX(), getY(), getZ()), exp); } @@ -168,19 +170,19 @@ public void refundConsumed() { updateBlock(); } - public void setRecipe(GlyphRecipe recipe, Player player) { - if (ScribesTile.getTotalPlayerExperience(player) < recipe.exp && !player.isCreative()) { + public void setRecipe(RecipeHolder recipe, Player player) { + if (ScribesTile.getTotalPlayerExperience(player) < recipe.value().exp && !player.isCreative()) { PortUtil.sendMessage(player, Component.translatable("ars_nouveau.not_enough_exp").withStyle(ChatFormatting.GOLD)); return; } else if (!player.isCreative()) { - player.giveExperiencePoints(-recipe.exp); + player.giveExperiencePoints(-recipe.value().exp); } ScribesTile tile = getLogicTile(); if (tile == null) return; tile.refundConsumed(); tile.recipe = recipe; - tile.recipeID = recipe.getId(); + tile.recipeID = recipe.id(); PortUtil.sendMessage(player, Component.translatable("ars_nouveau.scribes_table.started_crafting").withStyle(ChatFormatting.GOLD)); tile.updateBlock(); } @@ -230,13 +232,13 @@ public boolean canConsumeItemstack(ItemStack stack) { public List getRemainingRequired() { if (consumedStacks.isEmpty()) - return recipe.inputs; + return recipe.value().inputs; List unaccountedIngredients = new ArrayList<>(); List remainingItems = new ArrayList<>(); for (ItemStack stack : consumedStacks) { remainingItems.add(stack.copy()); } - for (Ingredient ingred : recipe.inputs) { + for (Ingredient ingred : recipe.value().inputs) { ItemStack matchingStack = null; for (ItemStack item : remainingItems) { @@ -284,7 +286,7 @@ public void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistri compound.put("itemStack", reagentTag); } if (recipe != null) { - compound.putString("recipe", recipe.getId().toString()); + compound.putString("recipe", recipe.id().toString()); } else { compound.putString("recipe", ""); } @@ -384,7 +386,7 @@ public void getTooltip(List tooltip) { return; } if(recipe != null){ - tooltip.add(Component.translatable("ars_nouveau.crafting", recipe.output.getHoverName())); + tooltip.add(Component.translatable("ars_nouveau.crafting", recipe.value().output.getHoverName())); tooltip.add(Component.translatable("ars_nouveau.scribes_table.throw_items").withStyle(ChatFormatting.GOLD)); } if(!autoYoink){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java index cb5da444aa..77ba1608c1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java @@ -20,6 +20,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.ClipBlockStateContext; @@ -174,7 +175,7 @@ public void getTooltip(List tooltip) { tooltip.add(Component.translatable("ars_nouveau.sensor.on_cast")); } if(!this.parchment.isEmpty() && parchment.getItem() instanceof SpellParchment spellParchment){ - spellParchment.getInformation(parchment, level, tooltip, TooltipFlag.Default.NORMAL); + spellParchment.getInformation(parchment, Item.TooltipContext.of(level), tooltip, TooltipFlag.Default.NORMAL); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java index b25a2a437b..446000617e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java @@ -2,7 +2,6 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.api.item.IWandable; -import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.api.recipe.*; import com.hollingsworth.arsnouveau.api.util.SourceUtil; import com.hollingsworth.arsnouveau.client.particle.ColorPos; @@ -12,12 +11,15 @@ import com.hollingsworth.arsnouveau.common.entity.EntityFollowProjectile; import com.hollingsworth.arsnouveau.common.entity.EntityWixie; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.common.util.PotionUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; @@ -169,8 +171,8 @@ public void rotateCraft(){ Ingredient itemIngred = instructions.recipe().recipeIngredients.get(1); List needed = new ArrayList<>(Arrays.asList(itemIngred.getItems())); - PotionContents potionNeeded = PotionUtils.getPotion(potionIngred.getStack()); - PotionContents potionOutput = PotionUtils.getPotion(instructions.recipe().outputStack); + PotionContents potionNeeded = PotionUtil.getContents(potionIngred.getStack()); + PotionContents potionOutput = PotionUtil.getContents(instructions.recipe().outputStack); boolean foundInput = potionNeeded.is(Potions.WATER) || findNeededPotion(potionNeeded, 300, level, worldPosition) != null; boolean foundRoomForOutput = findPotionStorage(level, worldPosition, potionOutput) != null; if(!foundRoomForOutput || !foundInput){ @@ -249,7 +251,7 @@ public void updateInventories() { public static @Nullable BlockPos findPotionStorage(Level level, BlockPos worldPosition, PotionContents passedPot) { for(BlockPos bPos : BlockPos.withinManhattan(worldPosition.below(2), 4, 3, 4)){ - if (level.getBlockEntity(bPos) instanceof PotionJarTile tile && tile.canAccept(new PotionData(passedPot), 300)) { + if (level.getBlockEntity(bPos) instanceof PotionJarTile tile && tile.canAccept(passedPot, 300)) { return bPos.immutable(); } } @@ -260,7 +262,7 @@ public void updateInventories() { for(BlockPos bPos : BlockPos.withinManhattan(worldPosition.below(2), 4, 3, 4)){ if (level.getBlockEntity(bPos) instanceof PotionJarTile tile && tile.getAmount() >= amount && - tile.getData().areSameEffects(new PotionData(passedPot))) { + PotionUtil.arePotionContentsEqual(tile.getData(), passedPot)) { return bPos.immutable(); } } @@ -338,12 +340,12 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis setStack = ItemStack.EMPTY; stackBeingCrafted = ItemStack.EMPTY; if (compound.contains("crafting")) { - this.setStack = ItemStack.of(compound.getCompound("crafting")); + this.setStack = ItemStack.parseOptional(pRegistries, compound.getCompound("crafting")); } if (compound.contains("currentCraft")) { - this.stackBeingCrafted = ItemStack.of(compound.getCompound("currentCraft")); + this.stackBeingCrafted = ItemStack.parseOptional(pRegistries, compound.getCompound("currentCraft")); } - craftManager = CraftingManager.fromTag(compound); + craftManager = CraftingManager.fromTag(pRegistries, compound); this.entityID = compound.getInt("entityid"); this.hasSource = compound.getBoolean("hasmana"); this.isCraftingPotion = compound.getBoolean("isPotion"); @@ -363,20 +365,18 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis @Override public void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { - super.saveAdditional(tag, pRegistries); + super.saveAdditional(compound, pRegistries); if (setStack != null) { - CompoundTag itemTag = new CompoundTag(); - setStack.save(itemTag); + Tag itemTag = setStack.save(pRegistries); compound.put("crafting", itemTag); } if (stackBeingCrafted != null) { - CompoundTag itemTag = new CompoundTag(); - stackBeingCrafted.save(itemTag); + Tag itemTag = stackBeingCrafted.save(pRegistries); compound.put("currentCraft", itemTag); } if (craftManager != null) - craftManager.write(compound); + craftManager.write(pRegistries, compound); compound.putInt("entityid", entityID); compound.putBoolean("hasmana", hasSource); @@ -418,13 +418,13 @@ public void getTooltip(List tooltip) { Component.translatable(stackBeingCrafted.getDescriptionId()).getString()) ); if(stackBeingCrafted.getItem() == Items.POTION){ - PotionUtils.addPotionTooltip(stackBeingCrafted, tooltip, 1.0F); + PotionUtil.getContents(stackBeingCrafted).addPotionTooltip(tooltip::add, 1.0f, 20f); } } else if (this.craftManager instanceof PotionCraftingManager potionCraftingManager) { ItemStack potionStack = new ItemStack(Items.POTION); - PotionUtils.setPotion(potionStack, potionCraftingManager.potionOut); + potionStack.set(DataComponents.POTION_CONTENTS, potionCraftingManager.potionOut); tooltip.add(Component.literal(Component.translatable("ars_nouveau.wixie.crafting").getString() + potionStack.getHoverName().getString())); - PotionUtils.addPotionTooltip(potionStack, tooltip, 1.0F); + potionCraftingManager.potionOut.addPotionTooltip(tooltip::add, 1.0f, 20f); } if (!hasSource) { @@ -436,12 +436,13 @@ public void getTooltip(List tooltip) { Component.translatable("ars_nouveau.wixie.needs").getString() + Component.translatable(neededStack.getDescriptionId()).getString()).withStyle(ChatFormatting.GOLD)); if(neededStack.getItem() == Items.POTION){ - PotionUtils.addPotionTooltip(neededStack, tooltip, 1.0F); + PotionContents contents = PotionUtil.getContents(neededStack); + contents.addPotionTooltip(tooltip::add, 1.0f, 20f); } } if (this.craftManager instanceof PotionCraftingManager potionCraftingManager && potionCraftingManager.needsPotion()) { ItemStack potionStack = new ItemStack(Items.POTION); - PotionUtils.setPotion(potionStack, potionCraftingManager.getPotionNeeded()); + potionStack.set(DataComponents.POTION_CONTENTS, potionCraftingManager.getPotionNeeded()); tooltip.add(Component.literal(Component.translatable("ars_nouveau.wixie.needs").getString() + potionStack.getHoverName().getString()).withStyle(ChatFormatting.GOLD)); } if (this.needsPotionStorage) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/command/AddTomeCommand.java b/src/main/java/com/hollingsworth/arsnouveau/common/command/AddTomeCommand.java index 6beec83ace..0296a1b411 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/command/AddTomeCommand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/command/AddTomeCommand.java @@ -8,11 +8,12 @@ import net.minecraft.commands.Commands; import net.minecraft.commands.SharedSuggestionProvider; import net.minecraft.commands.arguments.ResourceLocationArgument; +import net.minecraft.world.item.crafting.RecipeHolder; import java.util.Optional; public class AddTomeCommand { - private static final SuggestionProvider sugg = (ctx, builder) -> SharedSuggestionProvider.suggestResource(CasterTomeRegistry.getTomeData().stream().map(CasterTomeData::getId), builder); + private static final SuggestionProvider sugg = (ctx, builder) -> SharedSuggestionProvider.suggestResource(CasterTomeRegistry.getTomeData().stream().map(RecipeHolder::id), builder); public static void register(CommandDispatcher dispatcher) { dispatcher.register(Commands.literal("ars-tome"). @@ -23,9 +24,9 @@ public static void register(CommandDispatcher dispatcher) { } private static int spawnTome(CommandSourceStack source, String tome) { - Optional data = CasterTomeRegistry.getTomeData().stream().filter(t -> t.getId().toString().equals(tome)).findFirst(); + Optional> data = CasterTomeRegistry.getTomeData().stream().filter(t -> t.id().toString().equals(tome)).findFirst(); if (data.isPresent() && source.getPlayer() != null){ - source.getPlayer().addItem(data.get().getResultItem(source.getLevel().registryAccess()).copy()); + source.getPlayer().addItem(data.get().value().getResultItem(source.getLevel().registryAccess()).copy()); } return 1; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/IDyeable.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/IDyeable.java index 5559405a2a..a924b72701 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/IDyeable.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/IDyeable.java @@ -3,12 +3,11 @@ import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.component.DyedItemColor; public interface IDyeable { default void onDye(ItemStack stack, DyeColor dyeColor){ - stack.set(DataComponents.DYED_COLOR, new DyedItemColor(dyeColor.getTextureDiffuseColor(), false)); + stack.set(DataComponents.BASE_COLOR, dyeColor); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java index 35663fa2d1..72d8958eb6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java @@ -1,13 +1,14 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; -import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.common.items.PotionFlask; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import net.minecraft.core.HolderLookup; import net.minecraft.core.NonNullList; +import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.PotionItem; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.crafting.*; public class PotionFlaskRecipe extends ShapelessRecipe { @@ -37,7 +38,7 @@ public ItemStack assemble(final CraftingInput inv, HolderLookup.Provider p_26679 if(flaskPotionStack.isEmpty() || potionStack.isEmpty()) return ItemStack.EMPTY; PotionFlask.FlaskData flaskData = new PotionFlask.FlaskData(flaskPotionStack); - PotionData potionData = new PotionData(potionStack); + PotionContents potionData = potionStack.get(DataComponents.POTION_CONTENTS); if(flaskData.getCount() <= 0){ flaskData.setPotion(potionData); flaskData.setCount(1); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 042b51d3f3..01cdccdbd3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -653,7 +653,7 @@ public void getTooltip(List tooltip) { } if (dynamicBehavior != null) - dynamicBehavior.getTooltip(tooltip); + dynamicBehavior.getTooltip(tooltip::add); if (pathBlockDesc() != null && !pathBlockDesc().isEmpty()) { tooltip.add(Component.translatable("ars_nouveau.starbuncle.pathing", this.entityData.get(PATH_BLOCK))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java index 6ebca7e86e..db6b1c9f36 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/WildenChimera.java @@ -9,6 +9,7 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleLineData; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; +import com.hollingsworth.arsnouveau.common.entity.goal.ConditionalMeleeGoal; import com.hollingsworth.arsnouveau.common.entity.goal.chimera.*; import com.hollingsworth.arsnouveau.common.potions.SnareEffect; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; @@ -126,7 +127,7 @@ public WildenChimera(Level level) { protected void registerGoals() { super.registerGoals(); - this.goalSelector.addGoal(5, new ChimeraMeleeGoal(this, 1.2d, true, ()-> !this.isHowling() && !this.isFlying() && !this.isDefensive() && !this.isDiving() && !this.getPhaseSwapping() && !isRamming() && !isRamPrep())); + this.goalSelector.addGoal(5, new ConditionalMeleeGoal(this, 1.2d, true, ()-> !this.isHowling() && !this.isFlying() && !this.isDefensive() && !this.isDiving() && !this.getPhaseSwapping() && !isRamming() && !isRamPrep())); this.goalSelector.addGoal(3, new ChimeraSummonGoal(this)); this.targetSelector.addGoal(0, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.goalSelector.addGoal(1, new ChimeraRageGoal(this)); @@ -867,7 +868,13 @@ public static AttributeSupplier.Builder getModdedAttributes() { .add(Attributes.ARMOR, 6D) .add(Attributes.FOLLOW_RANGE, 100D) .add(Attributes.FLYING_SPEED, 0.4f) - .add(Attributes.STEP_HEIGHT, 3.0f); + .add(Attributes.STEP_HEIGHT, 3.0f) + .add(Attributes.ENTITY_INTERACTION_RANGE, 10.0f); + } + + @Override + public boolean isWithinMeleeAttackRange(LivingEntity pEntity) { + return super.isWithinMeleeAttackRange(pEntity); } private static class ChimeraMusic extends AbstractTickableSoundInstance { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java index 11f87350ad..dd80158ec8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java @@ -2,7 +2,6 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; -import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.block.tile.IAnimationListener; import com.hollingsworth.arsnouveau.common.entity.EntityWixie; @@ -12,6 +11,7 @@ import com.hollingsworth.arsnouveau.common.util.PotionUtil; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; @@ -27,6 +27,8 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.Tags; @@ -68,11 +70,13 @@ protected InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack awkward = PotionUtil.getPotion(Potions.AWKWARD); if(r.isIngredient(stack) && (r.getInput().test(awkward) || r.getInput().test(water))){ - PotionData data = new PotionData(r.getOutput().copy()); + PotionContents contents = PotionUtil.getContents(r.getOutput()); - if(!data.isEmpty()){ - data.applyEffects(player, player, player); - PortUtil.sendMessage(player, Component.translatable("ars_nouveau.wixie_familiar.applied",data.asPotionStack().getHoverName().getString())); + if(!PotionUtil.isEmpty(contents)){ + PotionUtil.applyContents(contents, player, player, player); + ItemStack potionStack = new ItemStack(Items.POTION); + potionStack.set(DataComponents.POTION_CONTENTS, contents); + PortUtil.sendMessage(player, Component.translatable("ars_nouveau.wixie_familiar.applied", potionStack.getHoverName().getString())); Networking.sendToNearbyClient(level(), this, new PacketAnimEntity(this.getId(), EntityWixie.Animations.CAST.ordinal())); ParticleUtil.spawnPoof((ServerLevel) level(), player.blockPosition().above()); stack.shrink(1); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionStoreGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionStoreGoal.java index 5769a55ace..e79c6fec58 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionStoreGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionStoreGoal.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.common.entity.goal.carbuncle; -import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.common.entity.Starbuncle; import net.minecraft.core.BlockPos; @@ -12,7 +11,7 @@ public class PotionStoreGoal extends GoToPosGoal { public PotionStoreGoal(Starbuncle starbuncle, StarbyPotionBehavior behavior) { super(starbuncle, behavior, () -> { - return behavior.getHeldPotion().getPotion() != PotionContents.EMPTY; + return behavior.getHeldPotion() != PotionContents.EMPTY; }); } @@ -39,7 +38,7 @@ public boolean onDestinationReached() { int room = jarTile.getMaxFill() - jarTile.getAmount(); int diff = Math.min(room, behavior.getAmount()); jarTile.add(behavior.getHeldPotion(), diff); - behavior.setHeldPotion(new PotionData()); + behavior.setHeldPotion(PotionContents.EMPTY); starbuncle.level.playSound(null, targetPos, SoundEvents.BUCKET_EMPTY, SoundSource.NEUTRAL, 0.5f, 1.3f); behavior.setAmount(behavior.getAmount() - diff); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionTakeGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionTakeGoal.java index fb22ced3cc..a8e193db52 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionTakeGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/PotionTakeGoal.java @@ -11,7 +11,7 @@ public class PotionTakeGoal extends GoToPosGoal { public PotionTakeGoal(Starbuncle starbuncle, StarbyPotionBehavior behavior) { - super(starbuncle, behavior, () -> behavior.getHeldPotion().getPotion() == PotionContents.EMPTY); + super(starbuncle, behavior, () -> behavior.getHeldPotion() == PotionContents.EMPTY); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java index 0c7b839882..7b731f5e36 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java @@ -1,12 +1,13 @@ package com.hollingsworth.arsnouveau.common.entity.goal.carbuncle; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.common.entity.Starbuncle; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.hollingsworth.arsnouveau.common.util.PortUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -14,6 +15,7 @@ import net.minecraft.world.entity.ai.goal.WrappedGoal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.PotionContents; import org.jetbrains.annotations.Nullable; @@ -22,12 +24,12 @@ public class StarbyPotionBehavior extends StarbyListBehavior { public static final ResourceLocation POTION_ID = ArsNouveau.prefix( "starby_potion"); - private @Nullable PotionData heldPotion = null; + private @Nullable PotionContents heldPotion = PotionContents.EMPTY; private int amount; public StarbyPotionBehavior(Starbuncle entity, CompoundTag tag) { super(entity, tag); - heldPotion = PotionData.fromTag(tag.getCompound("potionData")); + heldPotion = ANCodecs.decode(PotionContents.CODEC, tag.get("potionData")); amount = tag.getInt("amount"); goals.add(new WrappedGoal(4, new GoToBedGoal(starbuncle, this))); goals.add(new WrappedGoal(3, new PotionTakeGoal(entity, this))); @@ -73,7 +75,7 @@ public boolean isPositionValidTake(BlockPos p) { return false; } - public @Nullable BlockPos getJarForStorage(PotionData data) { + public @Nullable BlockPos getJarForStorage(PotionContents data) { for (BlockPos pos : TO_LIST) { if (level.getBlockEntity(pos) instanceof PotionJarTile && isPositionValidStore(pos, data)) { return pos; @@ -82,17 +84,17 @@ public boolean isPositionValidTake(BlockPos p) { return null; } - public boolean isPositionValidStore(BlockPos p, PotionData data) { + public boolean isPositionValidStore(BlockPos p, PotionContents data) { if (p == null || data == null) return false; return level.getBlockEntity(p) instanceof PotionJarTile jar && jar.canAccept(data, 100); } - public PotionData getHeldPotion() { - return heldPotion == null ? new PotionData() : heldPotion; + public PotionContents getHeldPotion() { + return heldPotion == null ? PotionContents.EMPTY : heldPotion; } - public void setHeldPotion(PotionData data) { + public void setHeldPotion(PotionContents data) { heldPotion = data; syncTag(); } @@ -115,7 +117,7 @@ public void getTooltip(Consumer tooltip) { @Override public CompoundTag toTag(CompoundTag tag) { if (heldPotion != null) { - tag.put("potionData", heldPotion.toTag()); + tag.put("potionData", ANCodecs.encode(PotionContents.CODEC, heldPotion)); } tag.putInt("amount", amount); return super.toTag(tag); @@ -123,8 +125,10 @@ public CompoundTag toTag(CompoundTag tag) { @Override public ItemStack getStackForRender() { - if (heldPotion != null && heldPotion.getPotion() != PotionContents.EMPTY) { - return heldPotion.asPotionStack(); + if (heldPotion != null && heldPotion != PotionContents.EMPTY) { + ItemStack render = new ItemStack(Items.POTION); + render.set(DataComponents.POTION_CONTENTS, heldPotion); + return render; } return super.getStackForRender(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraMeleeGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraMeleeGoal.java deleted file mode 100644 index 79fa4c7717..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/chimera/ChimeraMeleeGoal.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.hollingsworth.arsnouveau.common.entity.goal.chimera; - -import com.hollingsworth.arsnouveau.common.entity.goal.ConditionalMeleeGoal; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.PathfinderMob; - -import java.util.function.Supplier; - -public class ChimeraMeleeGoal extends ConditionalMeleeGoal { - public ChimeraMeleeGoal(PathfinderMob pMob, double pSpeedModifier, boolean pFollowingTargetEvenIfNotSeen, Supplier canUse) { - super(pMob, pSpeedModifier, pFollowingTargetEvenIfNotSeen, canUse); - } - - @Override - protected double getAttackReachSqr(LivingEntity pAttackTarget) { - return 10; - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java index 36dc27bfad..2000867de6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java @@ -2,20 +2,16 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.event.*; -import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.PlayerCaster; import com.hollingsworth.arsnouveau.api.util.ManaUtil; import com.hollingsworth.arsnouveau.common.block.tile.GhostWeaveTile; import com.hollingsworth.arsnouveau.common.block.tile.SpellSensorTile; import com.hollingsworth.arsnouveau.common.spell.effect.EffectInvisibility; -import com.hollingsworth.arsnouveau.setup.config.ServerConfig; -import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.DamageTypeTags; import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ShieldItem; @@ -94,15 +90,16 @@ public static void modifyItemAttributes(ItemAttributeModifierEvent event) { return; } else if (itemStack.getItem() instanceof ShieldItem && !(event.getSlotType() == EquipmentSlot.OFFHAND)) return; + //TODO: reimplement manaboost/regen attributes - if (itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT) > 0) { - ResourceLocation uuid = getEnchantBoostBySlot(event.getSlotType()); - event.addModifier(PerkAttributes.MAX_MANA, new AttributeModifier(uuid, ServerConfig.MANA_BOOST_BONUS.get() * itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT), AttributeModifier.Operation.ADD_VALUE)); - } - if (itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT) > 0) { - ResourceLocation uuid = getEnchantBoostBySlot(event.getSlotType()); - event.addModifier(PerkAttributes.MANA_REGEN_BONUS, new AttributeModifier(uuid, ServerConfig.MANA_REGEN_ENCHANT_BONUS.get() * itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT), AttributeModifier.Operation.ADD_VALUE)); - } +// if (itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT) > 0) { +// ResourceLocation uuid = getEnchantBoostBySlot(event.getSlotType()); +// event.addModifier(PerkAttributes.MAX_MANA, new AttributeModifier(uuid, ServerConfig.MANA_BOOST_BONUS.get() * itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT), AttributeModifier.Operation.ADD_VALUE)); +// } +// if (itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT) > 0) { +// ResourceLocation uuid = getEnchantBoostBySlot(event.getSlotType()); +// event.addModifier(PerkAttributes.MANA_REGEN_BONUS, new AttributeModifier(uuid, ServerConfig.MANA_REGEN_ENCHANT_BONUS.get() * itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT), AttributeModifier.Operation.ADD_VALUE)); +// } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/timed/BuildPortalEvent.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/timed/BuildPortalEvent.java index 6d4a0321d5..ad99dfcdd4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/timed/BuildPortalEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/timed/BuildPortalEvent.java @@ -120,13 +120,13 @@ public void tick(boolean serverSide) { for(BlockPos pos : placedBlocks){ level.destroyBlock(pos, false); } - level.playSound(null, targetPos, SoundRegistry.GAIA_SPELL_SOUND.getSoundEvent(), SoundSource.BLOCKS, 1.0F, 1.0F); + level.playSound(null, targetPos, SoundRegistry.GAIA_SPELL_SOUND.getSoundEvent().value(), SoundSource.BLOCKS, 1.0F, 1.0F); portalPos.clear(); framePos.clear(); return; } if(portalPos.isEmpty()){ - level.playSound(null, targetPos.above(2), SoundRegistry.TEMPESTRY_SPELL_SOUND.getSoundEvent(), SoundSource.BLOCKS, 1.0F, 1.0F); + level.playSound(null, targetPos.above(2), SoundRegistry.TEMPESTRY_SPELL_SOUND.getSoundEvent().value(), SoundSource.BLOCKS, 1.0F, 1.0F); for(BlockPos pos : placedBlocks){ if(level.getBlockEntity(pos) instanceof PortalTile portalTile){ portalTile.setFromScroll(warpScrollData); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java index 07f61af46f..d0bc0c9fe6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java @@ -1,7 +1,6 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.item.IRadialProvider; -import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenuSlot; @@ -10,6 +9,7 @@ import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketConsumePotion; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.common.util.PotionUtil; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; @@ -49,8 +49,8 @@ public void onRadialKeyPressed(ItemStack stack, Player player) { if(slots.size() >= 9) break; ItemStack item = player.inventory.getItem(i); - PotionContents contents = PotionData.from(item); - if(contents == null || item.getItem() instanceof ArrowItem) + PotionContents contents = PotionUtil.getContents(item); + if(contents == PotionContents.EMPTY || item.getItem() instanceof ArrowItem) continue; slots.add(new RadialMenuSlot<>(item.getHoverName().getString(), new AlchemistsCrown.SlotData(i, item))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java index abe6180f1e..e4de17700c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java @@ -2,16 +2,15 @@ import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; -import com.hollingsworth.arsnouveau.api.util.NBTUtil; import com.hollingsworth.arsnouveau.common.block.tile.ScribesTile; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; +import com.hollingsworth.arsnouveau.common.items.data.CodexData; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.config.ServerConfig; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; @@ -22,8 +21,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.UUID; -import java.util.stream.Collectors; public class AnnotatedCodex extends ModItem { @@ -45,26 +42,26 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte if (pPlayer.level.isClientSide) return super.use(pLevel, pPlayer, pUsedHand); ItemStack stack = pPlayer.getItemInHand(pUsedHand); - CodexData data = new CodexData(stack); + CodexData data = stack.getOrDefault(DataComponentRegistry.CODEX_DATA, new CodexData((String) null, null, List.of())); IPlayerCap playerCap = CapabilityRegistry.getPlayerDataCap(pPlayer).orElse(null); if (playerCap == null) return super.use(pLevel, pPlayer, pUsedHand); Collection known = playerCap.getKnownGlyphs(); - Collection storedGlyphs = data.getGlyphs(); + Collection storedGlyphs = data.glyphIds().stream().map(GlyphRegistry::getSpellPart).toList(); - if (data.getPlayerID() == null) { // Player writing to codex + if (data.uuid() == null) { // Player writing to codex int levelCost = getUnlockLevelCost(playerCap.getKnownGlyphs()); int expCost = ScribesTile.getExperienceForLevel(levelCost); if (expCost > ScribesTile.getTotalPlayerExperience(pPlayer)) { PortUtil.sendMessageNoSpam(pPlayer, Component.translatable("ars_nouveau.codex_not_enough_exp", levelCost)); } else { - data.setGlyphs(playerCap.getKnownGlyphs()); - data.setPlayer(pPlayer); + var newData = new CodexData(pPlayer.getUUID(), pPlayer.getName().getString(), playerCap.getKnownGlyphs().stream().map(AbstractSpellPart::getRegistryName).toList()); + stack.set(DataComponentRegistry.CODEX_DATA, newData); PortUtil.sendMessageNoSpam(pPlayer, Component.translatable("ars_nouveau.recorded_codex")); pPlayer.giveExperiencePoints(-expCost); } - } else if (pPlayer.getUUID().equals(data.getPlayerID())) { // Player updating codex + } else if (pPlayer.getUUID().equals(data.uuid())) { // Player updating codex Collection difference = new ArrayList<>(); for (AbstractSpellPart spellPart : known) { if (!storedGlyphs.contains(spellPart)) { @@ -78,7 +75,9 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte PortUtil.sendMessageNoSpam(pPlayer, Component.translatable("ars_nouveau.codex_not_enough_exp", levelCost)); } else { pPlayer.giveExperiencePoints(-expCost); - data.setGlyphs(playerCap.getKnownGlyphs()); + var newData = new CodexData(pPlayer.getUUID(), pPlayer.getName().getString(), playerCap.getKnownGlyphs().stream().map(AbstractSpellPart::getRegistryName).toList()); + stack.set(DataComponentRegistry.CODEX_DATA, newData); + PortUtil.sendMessageNoSpam(pPlayer, Component.translatable("ars_nouveau.updated_codex")); } } else { @@ -107,63 +106,13 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte @Override public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); - CodexData data = new CodexData(stack); - if (data.glyphs.isEmpty()) { + CodexData data = stack.getOrDefault(DataComponentRegistry.CODEX_DATA, new CodexData((String) null, null, List.of())); + if (data.glyphIds().isEmpty()) { tooltip2.add(Component.translatable("ars_nouveau.codex_tooltip")); } else { - tooltip2.add(Component.translatable("ars_nouveau.contains_glyphs", data.glyphs.size())); - } - if (data.playerName != null) - tooltip2.add(Component.translatable("ars_nouveau.recorded_by", data.playerName)); - } - - public static class CodexData { - ItemStack stack; - private List glyphs = new ArrayList<>(); - private UUID playerID; - public String playerName; - - public CodexData(ItemStack stack) { - this.stack = stack; - CompoundTag tag = stack.getOrCreateTag(); - for (ResourceLocation s : NBTUtil.readResourceLocations(tag, "glyph_")) { - if (GlyphRegistry.getSpellpartMap().containsKey(s)) { - glyphs.add(GlyphRegistry.getSpellpartMap().get(s)); - } - } - playerName = tag.contains("playerName") ? tag.getString("playerName") : null; - playerID = tag.hasUUID("player") ? tag.getUUID("player") : null; - } - - public void setPlayer(Player player) { - this.playerID = player.getUUID(); - this.playerName = player.getName().getString(); - write(); - } - - public void setGlyphs(Collection glyphs) { - this.glyphs = new ArrayList<>(glyphs); - write(); - } - - public UUID getPlayerID() { - return playerID; - } - - public List getGlyphs() { - return glyphs; - } - - public void write() { - CompoundTag tag = new CompoundTag(); - NBTUtil.writeResourceLocations(tag, "glyph_", glyphs.stream().map(AbstractSpellPart::getRegistryName).collect(Collectors.toList())); - if (playerID != null) { - tag.putUUID("player", playerID); - } - if (playerName != null) { - tag.putString("playerName", playerName); - } - stack.setTag(tag); + tooltip2.add(Component.translatable("ars_nouveau.contains_glyphs", data.glyphIds().size())); } + if (data.playerName() != null) + tooltip2.add(Component.translatable("ars_nouveau.recorded_by", data.playerName())); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java index bd36103ef0..cd59e9a566 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.item.IRadialProvider; -import com.hollingsworth.arsnouveau.common.items.data.PotionData; +import com.hollingsworth.arsnouveau.api.potion.PotionProviderRegistry; import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenuSlot; @@ -13,9 +13,12 @@ import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketSetLauncher; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.common.util.PotionUtil; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; @@ -26,6 +29,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.ThrownPotion; import net.minecraft.world.item.*; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.neoforged.api.distmarker.Dist; @@ -59,36 +63,37 @@ public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pS if(!(pEntity instanceof ServerPlayer player)){ return; } - PotionLauncherData potionLauncherData = new PotionLauncherData(pStack); - int lastSlot = potionLauncherData.lastSlot; + PotionLauncherData potionLauncherData = pStack.getOrDefault(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData()); + int lastSlot = potionLauncherData.lastSlot(); if(lastSlot < 0 || lastSlot >= player.inventory.getContainerSize()) return; ItemStack item = player.inventory.getItem(lastSlot); - if (!(item.getItem() instanceof PotionFlask) && !(item.getItem() instanceof PotionItem)) { - potionLauncherData.setAmountLeft(0); + if (potionLauncherData.amountLeft() > 0 && PotionProviderRegistry.from(item) == null && !(item.getItem() instanceof PotionItem)) { + pStack.set(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData(potionLauncherData.renderData(), 0, lastSlot)); } } public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pHand) { ItemStack itemstack = pPlayer.getItemInHand(pHand); - PotionLauncherData potionLauncherData = new PotionLauncherData(itemstack); + PotionLauncherData potionLauncherData = itemstack.getOrDefault(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData()); if(pLevel.isClientSide) return InteractionResultHolder.consume(itemstack); - PotionData potionData = potionLauncherData.getPotionDataFromSlot(pPlayer); - if(potionData.isEmpty()){ + PotionContents potionData = potionLauncherData.getPotionDataFromSlot(pPlayer); + if(PotionUtil.isEmpty(potionData)){ PortUtil.sendMessage(pPlayer, Component.translatable("ars_nouveau.flask_cannon.no_potion")); return InteractionResultHolder.sidedSuccess(itemstack, pLevel.isClientSide()); } ThrownPotion thrownpotion = new ThrownPotion(pLevel, pPlayer); ItemStack stckToThrow = getThrownStack(pLevel, pPlayer, pHand, itemstack); - if(new PotionData(stckToThrow).isEmpty()) + PotionContents contents = stckToThrow.get(DataComponents.POTION_CONTENTS); + if(contents == PotionContents.EMPTY) return InteractionResultHolder.success(itemstack); thrownpotion.setItem(stckToThrow); thrownpotion.shootFromRotation(pPlayer, pPlayer.getXRot(), pPlayer.getYRot(), -20.0F, 0.5F, 1.0F); pLevel.addFreshEntity(thrownpotion); pPlayer.getCooldowns().addCooldown(this, 10); - potionLauncherData.setLastDataForRender(new PotionData(stckToThrow)); + itemstack.set(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData(contents, potionLauncherData.amountLeft(), potionLauncherData.lastSlot())); return new InteractionResultHolder<>(InteractionResult.CONSUME, itemstack); } @@ -132,8 +137,8 @@ public void onRadialKeyPressed(ItemStack stack, Player player) { if(slots.size() >= 9) break; ItemStack item = player.inventory.getItem(i); - PotionData potionData = new PotionData(item); - if(potionData.isEmpty() || item.getItem() instanceof ArrowItem) + PotionContents contents = PotionUtil.getContents(item); + if(PotionUtil.isEmpty(contents) || item.getItem() instanceof ArrowItem) continue; slots.add(new RadialMenuSlot<>(item.getHoverName().getString(), new AlchemistsCrown.SlotData(i, item))); } @@ -164,11 +169,10 @@ public SplashLauncher(Properties properties) { @Override public ItemStack getThrownStack(Level pLevel, Player pPlayer, InteractionHand pHand, ItemStack launcherStack) { - PotionLauncherData data = new PotionLauncherData(launcherStack); + PotionLauncherData data = launcherStack.getOrDefault(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData()); ItemStack splashStack = new ItemStack(Items.SPLASH_POTION); - PotionData potionData = data.expendPotion(pPlayer); - PotionUtils.setPotion(splashStack, potionData.getPotion()); - PotionUtils.setCustomEffects(splashStack, potionData.getCustomEffects()); + PotionContents potionData = data.expendPotion(pPlayer, launcherStack); + splashStack.set(DataComponents.POTION_CONTENTS, potionData); return splashStack; } @@ -193,11 +197,10 @@ public LingeringLauncher(Properties properties) { @Override public ItemStack getThrownStack(Level pLevel, Player pPlayer, InteractionHand pHand, ItemStack launcherStack) { - PotionLauncherData data = new PotionLauncherData(launcherStack); + PotionLauncherData data = launcherStack.getOrDefault(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData()); ItemStack splashStack = new ItemStack(Items.LINGERING_POTION); - PotionData potionData = data.expendPotion(pPlayer); - PotionUtils.setPotion(splashStack, potionData.getPotion()); - PotionUtils.setCustomEffects(splashStack, potionData.getCustomEffects()); + PotionContents potionData = data.expendPotion(pPlayer, launcherStack); + splashStack.set(DataComponents.POTION_CONTENTS, potionData); return splashStack; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java index 00a654ad17..e157c1e119 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java @@ -1,8 +1,10 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.potion.IPotionProvider; +import com.hollingsworth.arsnouveau.api.potion.PotionProviderRegistry; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.common.items.data.MultiPotionContents; +import com.hollingsworth.arsnouveau.common.util.PotionUtil; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.ChatFormatting; @@ -23,10 +25,13 @@ import javax.annotation.Nullable; import java.util.List; -public abstract class PotionFlask extends ModItem implements IPotionProvider { +public abstract class PotionFlask extends ModItem { public PotionFlask() { - this(ItemsRegistry.defaultItemProperties().stacksTo(1).durability(8)); + this(ItemsRegistry.defaultItemProperties() + .stacksTo(1) + .durability(8) + .component(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY, 8))); } public PotionFlask(Item.Properties props) { @@ -39,32 +44,34 @@ public InteractionResult useOn(UseOnContext context) { !(context.getLevel().getBlockEntity(context.getClickedPos()) instanceof PotionJarTile jarTile)) return super.useOn(context); ItemStack thisStack = context.getItemInHand(); - MultiPotionContents data = thisStack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY)); + IPotionProvider data = PotionProviderRegistry.from(thisStack); Player playerEntity = context.getPlayer(); - if (playerEntity.isShiftKeyDown() && data.charges() > 0 && jarTile.getMaxFill() - jarTile.getAmount() >= 0 && jarTile.canAccept(data.contents(), 100)) { - jarTile.add(data.contents(), 100); - var contents = data.withCharges(data.charges() - 1); - thisStack.set(DataComponentRegistry.MULTI_POTION, contents); - }else if (!playerEntity.isShiftKeyDown() && !isMax(thisStack) && jarTile.getAmount() >= 100) { - if (data.potionData.areSameEffects(jarTile.getData())) { - var contents = data.withCharges(data.charges() + 1); + if(data == null || playerEntity == null) + return super.useOn(context); + + PotionContents contents = data.getPotionData(thisStack); + int usesRemaining = data.usesRemaining(thisStack); + int maxUses = data.maxUses(thisStack); + + if (playerEntity.isShiftKeyDown() && usesRemaining > 0 && jarTile.getMaxFill() - jarTile.getAmount() >= 0 && jarTile.canAccept(contents, 100)) { + jarTile.add(contents, 100); + var newContents = new MultiPotionContents(usesRemaining - 1, contents, maxUses); + thisStack.set(DataComponentRegistry.MULTI_POTION, newContents); + }else if (!playerEntity.isShiftKeyDown() && usesRemaining < maxUses && jarTile.getAmount() >= 100) { + if (PotionUtil.arePotionContentsEqual(contents, jarTile.getData())) { + var newContents = new MultiPotionContents(usesRemaining + 1, contents, maxUses); jarTile.remove(100); - thisStack.set(DataComponentRegistry.MULTI_POTION, contents); - }else if (data.charges() == 0){ - var contents = new MultiPotionContents(1, jarTile.getData()); - thisStack.set(DataComponentRegistry.MULTI_POTION, contents); + thisStack.set(DataComponentRegistry.MULTI_POTION, newContents); + }else if (usesRemaining == 0){ + var newContents = new MultiPotionContents(1, jarTile.getData(), maxUses); + thisStack.set(DataComponentRegistry.MULTI_POTION, newContents); jarTile.remove(100); } } return super.useOn(context); } - public boolean isMax(ItemStack stack) { - MultiPotionContents data = stack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY)); - return data.charges() >= getMaxCapacity(); - } - public int getMaxCapacity() { return 8; } @@ -74,7 +81,7 @@ public ItemStack finishUsingItem(ItemStack stack, Level worldIn, LivingEntity en Player playerentity = entityLiving instanceof Player player ? player : null; if (!worldIn.isClientSide) { - MultiPotionContents data = stack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY)); + MultiPotionContents data = stack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY, 8)); for (MobEffectInstance effectinstance : data.contents().getAllEffects()) { effectinstance = getEffectInstance(effectinstance); if (effectinstance.getEffect().value().isInstantenous()) { @@ -94,7 +101,7 @@ public ItemStack finishUsingItem(ItemStack stack, Level worldIn, LivingEntity en @Override public int getDamage(ItemStack stack) { - MultiPotionContents data = stack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY)); + MultiPotionContents data = stack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY, 8)); return (getMaxDamage(stack) - data.charges()); } @@ -134,14 +141,14 @@ public UseAnim getUseAnimation(ItemStack stack) { public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); - MultiPotionContents data = stack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY)); + MultiPotionContents data = stack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY, 8)); return data.charges() > 0 ? ItemUtils.startUsingInstantly(worldIn, playerIn, handIn) : InteractionResultHolder.pass(playerIn.getItemInHand(handIn)); } @Override public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip, TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip, flagIn); - MultiPotionContents data = stack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY)); + MultiPotionContents data = stack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY, 8)); tooltip.add(Component.translatable("ars_nouveau.flask.charges", data.charges()).withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); PotionContents.addPotionTooltip(data.contents().getAllEffects(), tooltip::add, 1.0F, context.tickRate()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/CodexData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/CodexData.java new file mode 100644 index 0000000000..432ebe88fa --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/CodexData.java @@ -0,0 +1,28 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.NonNullList; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; +import java.util.UUID; + +public record CodexData(UUID uuid, String playerName, List glyphIds) { + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.STRING.optionalFieldOf("uuid", "").forGetter(i -> i.uuid.toString()), + Codec.STRING.fieldOf("playerName").forGetter(CodexData::playerName), + Codec.list(ResourceLocation.CODEC).fieldOf("glyphIds").forGetter(CodexData::glyphIds) + ).apply(instance, CodexData::new)); + + public static StreamCodec STREAM = StreamCodec.composite(ByteBufCodecs.STRING_UTF8, i-> i.uuid().toString(), ByteBufCodecs.STRING_UTF8, CodexData::playerName, ResourceLocation.STREAM_CODEC.apply( + ByteBufCodecs.collection(NonNullList::createWithCapacity) + ), CodexData::glyphIds, CodexData::new); + + public CodexData(String uuid, String playerName, List glyphIds) { + this(UUID.fromString(uuid), playerName, glyphIds); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MultiPotionContents.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MultiPotionContents.java index 3463f3be11..1159e7ebfb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MultiPotionContents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MultiPotionContents.java @@ -1,40 +1,61 @@ package com.hollingsworth.arsnouveau.common.items.data; -import com.hollingsworth.arsnouveau.common.items.PotionFlask; +import com.hollingsworth.arsnouveau.api.potion.IPotionProvider; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.Item; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.alchemy.PotionContents; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -public record MultiPotionContents(int charges, PotionContents contents){ +public record MultiPotionContents(int charges, PotionContents contents, int maxUses) implements IPotionProvider { public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.INT.fieldOf("charges").forGetter(MultiPotionContents::charges), - PotionContents.CODEC.fieldOf("contents").forGetter(MultiPotionContents::contents) + PotionContents.CODEC.fieldOf("contents").forGetter(MultiPotionContents::contents), + Codec.INT.fieldOf("maxUses").forGetter(MultiPotionContents::maxUses) ).apply(instance, MultiPotionContents::new)); - public static StreamCodec STREAM_CODEC = StreamCodec.composite(ByteBufCodecs.INT, MultiPotionContents::charges, PotionContents.STREAM_CODEC, MultiPotionContents::contents, MultiPotionContents::new); + public static StreamCodec STREAM_CODEC = StreamCodec.composite(ByteBufCodecs.INT, MultiPotionContents::charges, PotionContents.STREAM_CODEC, MultiPotionContents::contents,ByteBufCodecs.INT, MultiPotionContents::maxUses, MultiPotionContents::new); public MultiPotionContents withCharges(int charges){ - return new MultiPotionContents(charges, contents); + return new MultiPotionContents(charges, contents, maxUses); } - public void applyEffects(ItemStack stack, Entity source, Entity inDirectSource, LivingEntity target) { - Item item = stack.getItem(); + public MultiPotionContents withMaxUses(int maxUses){ + return new MultiPotionContents(charges, contents, maxUses); + } + + public MultiPotionContents withContents(PotionContents contents){ + return new MultiPotionContents(charges, contents, maxUses); + } + + @Override + public @NotNull PotionContents getPotionData(ItemStack stack) { + return contents; + } + + @Override + public int usesRemaining(ItemStack stack) { + return charges; + } + + @Override + public int maxUses(ItemStack stack) { + return maxUses; + } + + @Override + public void consumeUses(ItemStack stack, int amount, Player player) { + stack.set(DataComponentRegistry.MULTI_POTION, withCharges(charges - amount)); + } - for (MobEffectInstance effectinstance : contents.getAllEffects()) { - effectinstance = item instanceof PotionFlask flask ? flask.getEffectInstance(effectinstance) : effectinstance; - if (effectinstance.getEffect().value().isInstantenous()) { - effectinstance.getEffect().value().applyInstantenousEffect(source, inDirectSource, target, effectinstance.getAmplifier(), 1.0D); - } else { - target.addEffect(new MobEffectInstance(effectinstance), source); - } - } + @Override + public void addUse(ItemStack stack, int amount, @Nullable Player player) { + stack.set(DataComponentRegistry.MULTI_POTION, withCharges(charges + amount)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionData.java deleted file mode 100644 index 00c0d7b125..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionData.java +++ /dev/null @@ -1,196 +0,0 @@ -package com.hollingsworth.arsnouveau.common.items.data; - -import com.hollingsworth.arsnouveau.api.potion.IPotionProvider; -import net.minecraft.core.Holder; -import net.minecraft.core.component.DataComponents; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.StringTag; -import net.minecraft.network.chat.Component; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.alchemy.Potion; -import net.minecraft.world.item.alchemy.PotionContents; -import net.minecraft.world.item.alchemy.Potions; - -import javax.annotation.Nullable; -import java.util.*; -import java.util.stream.Collectors; - -public class PotionData{ - private Holder potion; - private List customEffects = new ArrayList<>(); - private Set includedPotions = new HashSet<>(); - - public PotionData(Holder potion, List customEffects, Set includedPotions) { - this.potion = potion; - this.includedPotions = includedPotions; - setCustomEffects(customEffects); - } - - public static @Nullable PotionContents from(ItemStack stack){ - if(stack.getItem() instanceof IPotionProvider provider) { - return provider.getPotionData(stack); - }else{ - return stack.get(DataComponents.POTION_CONTENTS); - } - } - - public PotionData(ItemStack stack){ - - if(stack.getItem() instanceof IPotionProvider provider){ - PotionContents data = provider.getPotionData(stack); - this.potion = data.potion; - this.customEffects = data.getCustomEffects(); - }else{ - this.potion = stack.get(DataComponents.POTION_CONTENTS); - customEffects = new ArrayList<>(); - setCustomEffects(potion.customEffects()); - } - } - - public PotionData(PotionContents potion){ - this(potion.potion().get(), new ArrayList<>(), new HashSet<>(Collections.singletonList(potion))); - } - - public PotionData(PotionData data){ - this(data.potion, new ArrayList<>(data.getCustomEffects()), new HashSet<>(data.getIncludedPotions())); - } - - public ItemStack asPotionStack(){ - return asPotionStack(Items.POTION); - } - - public ItemStack asPotionStack(Item item){ - if(this.getPotion() == PotionContents.EMPTY) - return new ItemStack(item); - - PotionContents.setPotion(potionStack, this.getPotion()); - PotionUtils.setCustomEffects(potionStack, getCustomEffects()); - return potionStack; - } - - public static PotionData fromTag(CompoundTag tag){ - PotionData instance = new PotionData(); - instance.setPotion(PotionUtils.getPotion(tag)); - instance.getCustomEffects().addAll(PotionUtils.getCustomEffects(tag)); - ListTag potionTagList = tag.getList("includedPotions", 8); - Set potions = instance.includedPotions; - for(int i = 0; i < potionTagList.size(); i++){ - potions.add(Potion.byName(potionTagList.getString(i))); - } - return instance; - } - - public CompoundTag toTag(){ - CompoundTag tag = new CompoundTag(); - tag.putString("Potion", ForgeRegistries.POTIONS.getKey(getPotion()).toString()); - if (!getCustomEffects().isEmpty()) { - ListTag listnbt = new ListTag(); - - for (MobEffectInstance effectinstance : getCustomEffects()) { - listnbt.add(effectinstance.save(new CompoundTag())); - } - - tag.put("CustomPotionEffects", listnbt); - } - ListTag potionTagList = new ListTag(); - List potionNames = new ArrayList<>(getIncludedPotions().stream().map(potion -> BuiltInRegistries.POTION.getKey(potion).toString()).toList()); - for(String potion : potionNames){ - potionTagList.add(StringTag.valueOf(potion)); - } - tag.put("includedPotions", potionTagList); - return tag; - } - - public List fullEffects(){ - List thisEffects = new ArrayList<>(getCustomEffects()); - thisEffects.addAll(getPotion().getAllEffects()); - return thisEffects; - } - - public void applyEffects(Entity source, Entity inDirectSource, LivingEntity target){ - for (MobEffectInstance effectinstance : fullEffects()) { - if (effectinstance.getEffect().value().isInstantenous()) { - effectinstance.getEffect().value().applyInstantenousEffect(source, inDirectSource, target, effectinstance.getAmplifier(), 1.0D); - } else { - target.addEffect(new MobEffectInstance(effectinstance), source); - } - } - } - - public boolean areSameEffects(List effects){ - List thisEffects = fullEffects(); - if(thisEffects.size() != effects.size()) - return false; - effects.sort(Comparator.comparing(MobEffectInstance::toString)); - thisEffects.sort(Comparator.comparing(MobEffectInstance::toString)); - return thisEffects.equals(effects); - } - - public boolean isEmpty(){ - return getPotion() == PotionContents.EMPTY || getPotion().is( Potions.WATER) || getPotion().is(Potions.MUNDANE) || fullEffects().isEmpty(); - } - - public boolean areSameEffects(PotionData other){ - return areSameEffects(other.fullEffects()); - } - - public PotionData mergeEffects(PotionData other){ - if(areSameEffects(other)) - return new PotionData(getPotion(), getCustomEffects(), getIncludedPotions()); - Set set = new HashSet<>(); - set.addAll(this.fullEffects()); - set.addAll(other.fullEffects()); - - Set potions = new HashSet<>(); - potions.addAll(this.getIncludedPotions()); - potions.addAll(other.getIncludedPotions()); - return new PotionData(getPotion(), new ArrayList<>(set), potions); - } - - // TODO: fix ticksPerSecond? - public void appendHoverText(List tooltip) { - if(getPotion() == PotionContents.EMPTY) - return; - ItemStack potionStack = asPotionStack(); - tooltip.add(potionStack.getHoverName()); - PotionContents.addPotionTooltip(getPotion().getAllEffects(), tooltip::add, 1.0F, 20.0f); - } - - @Override - public boolean equals(Object obj) { - return obj instanceof PotionData other && areSameEffects(other); - } - - public PotionContents getPotion() { - return potion; - } - - public void setPotion(PotionContents potion) { - this.potion = potion; - } - - public List getCustomEffects() { - return customEffects; - } - - public void setCustomEffects(List customEffects) { - this.customEffects = customEffects.stream().filter(e -> !potion.getAllEffects().contains(e)).collect(Collectors.toList()); - } - - public Set> getIncludedPotions() { - includedPotions.add(getPotion()); - includedPotions.removeIf(potion -> potion == PotionContents.EMPTY); - return includedPotions; - } - - public void setIncludedPotions(Set includedPotions) { - this.includedPotions = includedPotions; - } -} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java index 707ed166e6..88e354c512 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java @@ -1,86 +1,61 @@ package com.hollingsworth.arsnouveau.common.items.data; -import com.hollingsworth.arsnouveau.common.items.PotionFlask; -import net.minecraft.nbt.CompoundTag; +import com.hollingsworth.arsnouveau.api.potion.PotionProviderRegistry; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.PotionItem; +import net.minecraft.world.item.alchemy.PotionContents; -public class PotionLauncherData { - private PotionData lastDataForRender; - private int lastSlot; - public int amountLeft; +public record PotionLauncherData(PotionContents renderData, int amountLeft, int lastSlot) { - public PotionLauncherData(ItemStack stack) { - super(stack); - CompoundTag tag = getItemTag(stack); - if(tag == null) - return; - lastDataForRender = PotionData.fromTag(tag.getCompound("lastDataForRender")); - lastSlot = tag.getInt("lastSlot"); - amountLeft = tag.getInt("amountLeft"); + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + PotionContents.CODEC.fieldOf("lastDataForRender").forGetter(PotionLauncherData::renderData), + Codec.INT.fieldOf("amountLeft").forGetter(PotionLauncherData::amountLeft), + Codec.INT.fieldOf("lastSlot").forGetter(PotionLauncherData::lastSlot) + ).apply(instance, PotionLauncherData::new)); + + public static StreamCodec STREAM = StreamCodec.composite( + PotionContents.STREAM_CODEC, + PotionLauncherData::renderData, + ByteBufCodecs.INT, + PotionLauncherData::amountLeft, + ByteBufCodecs.INT, + PotionLauncherData::lastSlot, + PotionLauncherData::new + ); + + public PotionLauncherData(){ + this(PotionContents.EMPTY, 0, -1); } - public PotionData getPotionDataFromSlot(Player player){ + public PotionContents getPotionDataFromSlot(Player player){ if(lastSlot < 0 || lastSlot >= player.inventory.getContainerSize()) - return new PotionData(); + return PotionContents.EMPTY; ItemStack stack = player.inventory.getItem(lastSlot); - return new PotionData(stack); + var provider = PotionProviderRegistry.from(stack); + return provider == null ? PotionContents.EMPTY : provider.getPotionData(stack); } - public PotionData expendPotion(Player player){ + public PotionContents expendPotion(Player player, ItemStack launcherStack){ if(lastSlot >= player.inventory.getContainerSize()) - return new PotionData(); + return PotionContents.EMPTY; ItemStack item = player.inventory.getItem(lastSlot); - if(item.getItem() instanceof PotionFlask){ - PotionFlask.FlaskData flaskData = new PotionFlask.FlaskData(item); - if(flaskData.getCount() <= 0 || flaskData.getPotion().isEmpty()) - return new PotionData(); - PotionData data = flaskData.getPotion().clone(); - flaskData.setCount(flaskData.getCount() - 1); - setAmountLeft(flaskData.getCount()); - return data; - }else if(item.getItem() instanceof PotionItem){ - PotionData data = new PotionData(item).clone(); - if(data.isEmpty()) - return new PotionData(); - item.shrink(1); - player.inventory.add(new ItemStack(Items.GLASS_BOTTLE)); - setAmountLeft(0); - return data; + var provider = PotionProviderRegistry.from(item); + if(provider == null){ + return PotionContents.EMPTY; } - return new PotionData(); - } - - public void setAmountLeft(int amount){ - amountLeft = amount; - writeItem(); - } - - public void setLastSlot(int lastSlot) { - this.lastSlot = lastSlot; - writeItem(); - } - - public void setLastDataForRender(PotionData lastDataForRender) { - this.lastDataForRender = lastDataForRender; - writeItem(); - } - - @Override - public void writeToNBT(CompoundTag tag) { - tag.putInt("lastSlot", lastSlot); - tag.put("lastDataForRender", lastDataForRender.toTag()); - tag.putInt("amountLeft", amountLeft); - } - - public PotionData getLastDataForRender() { - return lastDataForRender; - } - - @Override - public String getTagString() { - return "potion_launcher"; + if(provider.usesRemaining(item) <= 0){ + return PotionContents.EMPTY; + } + PotionContents contents = provider.getPotionData(item); + provider.consumeUses(item, 1, player); + launcherStack.set(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData(provider.getPotionData(item), provider.usesRemaining(item), lastSlot)); + return contents; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/AllayBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/AllayBehavior.java index bde44ec58e..075ce2952b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/AllayBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/AllayBehavior.java @@ -16,6 +16,7 @@ import net.minecraft.world.entity.animal.allay.Allay; 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.TooltipFlag; import net.minecraft.world.level.Level; @@ -109,7 +110,7 @@ public void getTooltip(MobJarTile tile, List tooltips) { super.getTooltip(tile, tooltips); Allay allay = entityFromJar(tile); if(allay.getMainHandItem().getItem() instanceof ItemScroll scroll){ - scroll.appendHoverText(allay.getMainHandItem(), tile.getLevel(), tooltips, TooltipFlag.Default.NORMAL); + scroll.appendHoverText(allay.getMainHandItem(), Item.TooltipContext.of(tile.getLevel()), tooltips, TooltipFlag.Default.NORMAL); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java index 5546ad101a..9cee732738 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java @@ -1,8 +1,11 @@ package com.hollingsworth.arsnouveau.common.network; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.common.items.data.PotionData; +import com.hollingsworth.arsnouveau.api.potion.IPotionProvider; +import com.hollingsworth.arsnouveau.api.potion.PotionProviderRegistry; import com.hollingsworth.arsnouveau.common.items.PotionFlask; +import com.hollingsworth.arsnouveau.common.util.PotionUtil; +import net.minecraft.core.component.DataComponents; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; @@ -13,6 +16,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.PotionItem; +import net.minecraft.world.item.alchemy.PotionContents; public class PacketConsumePotion extends AbstractPacket{ public static final Type TYPE = new Type<>(ArsNouveau.prefix("consume_potion")); @@ -42,17 +46,20 @@ public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer playe return; ItemStack stack = player.inventory.getItem(inventorySlot); if(stack.getItem() instanceof PotionItem){ - PotionData data = new PotionData(stack); - data.applyEffects(player, player, player); + PotionContents contents = stack.get(DataComponents.POTION_CONTENTS); + if(contents == null){ + return; + } + PotionUtil.applyContents(contents, player, player, player); stack.shrink(1); player.inventory.add(new ItemStack(Items.GLASS_BOTTLE)); player.level.playSound(null, player.blockPosition(), SoundEvents.GENERIC_DRINK, SoundSource.PLAYERS, 0.5f, player.level.random.nextFloat() * 0.1F + 0.9F); }else if(stack.getItem() instanceof PotionFlask){ - PotionFlask.FlaskData data = new PotionFlask.FlaskData(stack); - if(data.getPotion().isEmpty() || data.getCount() <= 0) + IPotionProvider data = PotionProviderRegistry.from(stack); + if(data == null || data.getPotionData(stack) == PotionContents.EMPTY || data.usesRemaining(stack) <= 0) return; - data.getPotion().applyEffects(player, player, player); - data.setCount(data.getCount() - 1); + data.applyEffects(stack, player, player, player); + data.consumeUses(stack, 1, player); player.level.playSound(null, player.blockPosition(), SoundEvents.GENERIC_DRINK, SoundSource.PLAYERS, 0.5f, player.level.random.nextFloat() * 0.1F + 0.9F); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketNoSpamChatMessage.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketNoSpamChatMessage.java index f9cd180516..377820c741 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketNoSpamChatMessage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketNoSpamChatMessage.java @@ -8,6 +8,7 @@ import net.minecraft.client.gui.components.ChatComponent; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.network.chat.MessageSignature; import net.minecraft.network.chat.Style; import net.minecraft.network.codec.StreamCodec; @@ -60,14 +61,14 @@ public PacketNoSpamChatMessage(Component message, int messageChannelId, boolean // Decoder public PacketNoSpamChatMessage(RegistryFriendlyByteBuf buf) { - this.message = buf.readComponent(); + this.message = ComponentSerialization.STREAM_CODEC.decode(buf); this.messageChannelId = buf.readInt(); this.overlayMessage = buf.readBoolean(); } // Encoder public void toBytes(RegistryFriendlyByteBuf buf) { - buf.writeComponent(message); + ComponentSerialization.STREAM_CODEC.encode(buf, message); buf.writeInt(messageChannelId); buf.writeBoolean(overlayMessage); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java index 484a96087b..3f87d2af7c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java @@ -1,16 +1,19 @@ package com.hollingsworth.arsnouveau.common.network; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.common.items.data.PotionData; +import com.hollingsworth.arsnouveau.api.potion.IPotionProvider; +import com.hollingsworth.arsnouveau.api.potion.PotionProviderRegistry; import com.hollingsworth.arsnouveau.common.items.FlaskCannon; -import com.hollingsworth.arsnouveau.common.items.PotionFlask; +import com.hollingsworth.arsnouveau.common.items.data.PotionLauncherData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import net.minecraft.core.component.DataComponents; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.PotionItem; +import net.minecraft.world.item.alchemy.PotionContents; public class PacketSetLauncher extends AbstractPacket{ public static final Type TYPE = new Type<>(ArsNouveau.prefix("set_launcher")); @@ -45,17 +48,15 @@ public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer playe if(launcherStack.isEmpty()){ return; } - FlaskCannon.PotionLauncherData data = new FlaskCannon.PotionLauncherData(launcherStack); - if (stack.getItem() instanceof PotionFlask ) { - PotionFlask.FlaskData flaskData = new PotionFlask.FlaskData(stack); - data.setLastDataForRender(flaskData.getPotion()); - data.setLastSlot(inventorySlot); - data.setAmountLeft(flaskData.getCount()); - }else if(stack.getItem() instanceof PotionItem){ - PotionData potionData = new PotionData(stack); - data.setLastDataForRender(potionData); - data.setLastSlot(inventorySlot); - data.setAmountLeft(stack.getCount()); + IPotionProvider provider = PotionProviderRegistry.from(stack); + if (provider != null) { + stack.set(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData(provider.getPotionData(stack), provider.usesRemaining(stack), inventorySlot)); + }else { + PotionContents contents = stack.get(DataComponents.POTION_CONTENTS); + if(contents == null){ + return; + } + stack.set(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData(contents, stack.getCount(), inventorySlot)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetScribeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetScribeRecipe.java index 6cdbe9003f..1b53bd6466 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetScribeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetScribeRecipe.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.block.tile.ScribesTile; import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; +import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import net.minecraft.core.BlockPos; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; @@ -10,7 +11,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeHolder; public class PacketSetScribeRecipe extends AbstractPacket{ public static final Type TYPE = new Type<>(ArsNouveau.prefix("set_scribe_recipe")); @@ -37,10 +38,8 @@ public PacketSetScribeRecipe(BlockPos scribesPos, ResourceLocation resourceLocat @Override public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { if (player.level.getBlockEntity(scribePos) instanceof ScribesTile scribesTile) { - Recipe recipe = player.level.getRecipeManager().byKey(recipeID).orElse(null); - if (recipe instanceof GlyphRecipe glyphRecipe) { - scribesTile.setRecipe(glyphRecipe, player); - } + RecipeHolder recipe = player.level.getRecipeManager().byKeyTyped(RecipeRegistry.GLYPH_TYPE.get(), recipeID); + scribesTile.setRecipe(recipe, player); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/PublicEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/PublicEffect.java index 7e1c26552a..a6abd9e579 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/PublicEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/PublicEffect.java @@ -2,30 +2,12 @@ import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectCategory; -import net.minecraft.world.item.ItemStack; -import java.util.List; -/** - * GOD HAVE MERCY ON OUR PROTECTED SOULS - */ public class PublicEffect extends MobEffect { - public final List curativeItems; - - public PublicEffect(MobEffectCategory p_i50391_1_, int p_i50391_2_) { - this(p_i50391_1_, p_i50391_2_, null); - } - - public PublicEffect(MobEffectCategory type, int color, List curativeItems) { + public PublicEffect(MobEffectCategory type, int color) { super(type, color); - this.curativeItems = curativeItems; } - @Override - public List getCurativeItems() { - return this.curativeItems != null ? curativeItems : super.getCurativeItems(); - } - - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/SummoningSicknessEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/SummoningSicknessEffect.java index 7f937d6dc0..009c232e37 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/SummoningSicknessEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/SummoningSicknessEffect.java @@ -2,18 +2,9 @@ import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectCategory; -import net.minecraft.world.item.ItemStack; - -import java.util.ArrayList; -import java.util.List; public class SummoningSicknessEffect extends MobEffect { public SummoningSicknessEffect() { super(MobEffectCategory.HARMFUL, 2039587); } - - @Override - public List getCurativeItems() { - return new ArrayList<>(); - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ConjureDesertRitual.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ConjureDesertRitual.java index caf1968c90..3f9e2834d4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ConjureDesertRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ConjureDesertRitual.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.api.ritual.ConjureBiomeRitual; import com.hollingsworth.arsnouveau.common.lib.RitualLib; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; @@ -66,8 +67,8 @@ public ResourceLocation getRegistryName() { } @Override - public void read(CompoundTag tag) { - super.read(tag); + public void read(HolderLookup.Provider provider, CompoundTag tag) { + super.read(provider, tag); boolean isBadlands = getConsumedItems().stream().anyMatch(i -> i.is(ItemTags.TERRACOTTA)); if(isBadlands){ biome = Biomes.BADLANDS; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ConjurePlainsRitual.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ConjurePlainsRitual.java index a9184a0502..74f019c0df 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ConjurePlainsRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/ConjurePlainsRitual.java @@ -6,6 +6,7 @@ import com.hollingsworth.arsnouveau.common.lib.RitualLib; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; @@ -63,14 +64,14 @@ public ParticleColor getCenterColor() { } @Override - public void write(CompoundTag tag) { - super.write(tag); + public void write(HolderLookup.Provider provider, CompoundTag tag) { + super.write(provider, tag); tag.putBoolean("isSnowy", isSnowy); } @Override - public void read(CompoundTag tag) { - super.read(tag); + public void read(HolderLookup.Provider provider, CompoundTag tag) { + super.read(provider, tag); isSnowy = tag.getBoolean("isSnowy"); if(isSnowy){ biome = Biomes.SNOWY_PLAINS; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java index 6c8685c6b6..7a7e7f236e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.ritual.RangeRitual; import com.hollingsworth.arsnouveau.common.lib.RitualLib; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.MobSpawnType; @@ -79,15 +80,15 @@ public String getLangDescription() { } @Override - public void read(CompoundTag tag) { - super.read(tag); + public void read(HolderLookup.Provider provider, CompoundTag tag) { + super.read(provider, tag); radius = tag.getInt("radius"); deniedSpawn = tag.getBoolean("deniedSpawn"); } @Override - public void write(CompoundTag tag) { - super.write(tag); + public void write(HolderLookup.Provider provider, CompoundTag tag) { + super.write(provider, tag); tag.putInt("radius", radius); tag.putBoolean("deniedSpawn", deniedSpawn); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java index 6beba9b7cd..9e0cfa15cb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java @@ -2,13 +2,14 @@ import com.hollingsworth.arsnouveau.api.item.inv.ExtractedStack; import com.hollingsworth.arsnouveau.api.item.inv.InventoryManager; -import com.hollingsworth.arsnouveau.common.items.data.PotionData; import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.common.items.PotionFlask; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAOE; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentExtendTime; +import com.hollingsworth.arsnouveau.common.util.PotionUtil; +import net.minecraft.core.component.DataComponents; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.projectile.ThrownPotion; @@ -16,6 +17,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.PotionItem; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.EntityHitResult; @@ -43,7 +45,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @NotNull LivingEnti } public void spawnPotionEntity(HitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver){ - PotionData potionData = getPotionData(world, shooter, spellContext); + PotionContents potionData = getPotionData(world, shooter, spellContext); if(potionData == null){ return; } @@ -59,16 +61,15 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul if(!(rayTraceResult.getEntity() instanceof LivingEntity livingEntity)){ return; } - PotionData potionData = getPotionData(world, shooter, spellContext); + PotionContents potionData = getPotionData(world, shooter, spellContext); if(potionData == null){ return; } - potionData.applyEffects(shooter, shooter, livingEntity); - + PotionUtil.applyContents(potionData, shooter, shooter, livingEntity); } - public @Nullable PotionData getPotionData(Level world, @NotNull LivingEntity shooter, SpellContext spellContext){ - PotionData potionData = null; + public @Nullable PotionContents getPotionData(Level world, @NotNull LivingEntity shooter, SpellContext spellContext){ + PotionContents potionData = null; InventoryManager manager = spellContext.getCaster().getInvManager(); ExtractedStack extractedFlask = manager.extractItem(i -> { PotionFlask.FlaskData data = new PotionFlask.FlaskData(i); @@ -83,7 +84,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul ExtractedStack potion = manager.extractItem(i -> i.getItem() instanceof PotionItem, 1); if (!potion.isEmpty()) { ItemStack stack = potion.getStack(); - potionData = new PotionData(stack.copy()); + potionData = stack.get(DataComponents.POTION_CONTENTS); stack.shrink(1); potion.replaceAndReturnOrDrop(new ItemStack(Items.GLASS_BOTTLE), world, shooter.getOnPos()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java index a39a4158eb..b75a6a2af6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java @@ -2,12 +2,26 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; import net.minecraft.world.phys.Vec2; +import java.util.UUID; + public class ANCodecs { public static Codec VEC2 = RecordCodecBuilder.create(instance -> instance.group( Codec.FLOAT.fieldOf("x").forGetter(v -> v.x), Codec.FLOAT.fieldOf("y").forGetter(v -> v.y) ).apply(instance, Vec2::new)); + + public static Codec UUID_CODEC = Codec.STRING.xmap(UUID::fromString, UUID::toString); + + public static Tag encode(Codec codec, T value){ + return codec.encodeStart(NbtOps.INSTANCE, value).getOrThrow(); + } + + public static T decode(Codec codec, Tag tag){ + return codec.parse(NbtOps.INSTANCE, tag).getOrThrow(); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java index c01d1a0d23..fc7d796305 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java @@ -1,29 +1,22 @@ package com.hollingsworth.arsnouveau.common.util; +import com.hollingsworth.arsnouveau.api.potion.IPotionProvider; +import com.hollingsworth.arsnouveau.api.potion.PotionProviderRegistry; import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponents; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.PotionContents; -import net.minecraft.world.item.crafting.Ingredient; -import net.neoforged.neoforge.common.crafting.DataComponentIngredient; +import net.minecraft.world.item.alchemy.Potions; +import org.jetbrains.annotations.NotNull; -public class PotionUtil { - public static void addPotionToTag(Potion potionIn, CompoundTag tag) { - ResourceLocation resourcelocation = BuiltInRegistries.POTION.getKey(potionIn); - if (potionIn == PotionContents.EMPTY) { - if (tag.contains("Potion")) { - tag.remove("Potion"); +import javax.annotation.Nullable; +import java.util.*; - } - } else { - tag.putString("Potion", resourcelocation.toString()); - } - } +public class PotionUtil { public static ItemStack getPotion(Holder potion) { ItemStack stack = new ItemStack(Items.POTION); @@ -31,12 +24,54 @@ public static ItemStack getPotion(Holder potion) { return stack; } - public static Ingredient getIngredient(Holder potion) { - ItemStack stack = getPotion(potion); - return PotionUtil.getIngredient(stack); + public static boolean arePotionContentsEqual(PotionContents pot1, PotionContents pot2){ + List pot1Effects = new ArrayList<>(); + List pot2Effects = new ArrayList<>(); + pot1.getAllEffects().forEach(pot1Effects::add); + pot2.getAllEffects().forEach(pot2Effects::add); + if(pot1Effects.size() != pot2Effects.size()) + return false; + pot2Effects.sort(Comparator.comparing(MobEffectInstance::toString)); + pot1Effects.sort(Comparator.comparing(MobEffectInstance::toString)); + return pot1Effects.equals(pot2Effects); + } + + public static boolean isEmpty(@Nullable PotionContents potionContents) { + return potionContents == null || + !potionContents.hasEffects() && (potionContents == PotionContents.EMPTY + || potionContents.is(Potions.WATER) + || potionContents.is(Potions.MUNDANE) + || potionContents.is(Potions.AWKWARD)); } - public static Ingredient getIngredient(ItemStack input) { - return DataComponentIngredient.of(false, input); + public static @NotNull PotionContents getContents(ItemStack stack){ + IPotionProvider provider = PotionProviderRegistry.from(stack); + if(provider != null){ + return provider.getPotionData(stack); + } + return stack.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY); + } + + public static void applyContents(PotionContents contents, @NotNull LivingEntity target, @Nullable LivingEntity source, @Nullable LivingEntity indirect){ + contents.forEachEffect(instance -> { + if (instance.getEffect().value().isInstantenous()) { + instance.getEffect().value().applyInstantenousEffect(source, indirect, target, instance.getAmplifier(), 1.0); + } else { + target.addEffect(instance); + } + }); + } + + public static PotionContents merge(PotionContents contents1, PotionContents contents2){ + if(arePotionContentsEqual(contents1, contents2)) + return new PotionContents(contents1.potion(), contents1.customColor(), contents1.customEffects()); + Set set = new HashSet<>(); + for(MobEffectInstance effect : contents1.getAllEffects()){ + set.add(new MobEffectInstance(effect)); + } + for(MobEffectInstance effect : contents2.getAllEffects()){ + set.add(new MobEffectInstance(effect)); + } + return new PotionContents(contents1.potion(), contents1.customColor(), new ArrayList<>(set)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java index ef20e76bb3..def1d1c65d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java @@ -264,11 +264,11 @@ public static void postInit() { Arrays.asList(PerkSlot.ONE, PerkSlot.TWO, PerkSlot.THREE) )); - SoundRegistry.DEFAULT_SPELL_SOUND = new SpellSound(SoundRegistry.DEFAULT_FAMILY.get(), Component.translatable("ars_nouveau.sound.default_family")); - SoundRegistry.EMPTY_SPELL_SOUND = new SpellSound(SoundRegistry.EMPTY_SOUND_FAMILY.get(), Component.translatable("ars_nouveau.sound.empty")); - SoundRegistry.GAIA_SPELL_SOUND = new SpellSound(SoundRegistry.GAIA_FAMILY.get(), Component.translatable("ars_nouveau.sound.gaia_family")); - SoundRegistry.TEMPESTRY_SPELL_SOUND = new SpellSound(SoundRegistry.TEMPESTRY_FAMILY.get(), Component.translatable("ars_nouveau.sound.tempestry_family")); - SoundRegistry.FIRE_SPELL_SOUND = new SpellSound(SoundRegistry.FIRE_FAMILY.get(), Component.translatable("ars_nouveau.sound.fire_family")); + SoundRegistry.DEFAULT_SPELL_SOUND = new SpellSound(SoundRegistry.DEFAULT_FAMILY, Component.translatable("ars_nouveau.sound.default_family")); + SoundRegistry.EMPTY_SPELL_SOUND = new SpellSound(SoundRegistry.EMPTY_SOUND_FAMILY, Component.translatable("ars_nouveau.sound.empty")); + SoundRegistry.GAIA_SPELL_SOUND = new SpellSound(SoundRegistry.GAIA_FAMILY, Component.translatable("ars_nouveau.sound.gaia_family")); + SoundRegistry.TEMPESTRY_SPELL_SOUND = new SpellSound(SoundRegistry.TEMPESTRY_FAMILY, Component.translatable("ars_nouveau.sound.tempestry_family")); + SoundRegistry.FIRE_SPELL_SOUND = new SpellSound(SoundRegistry.FIRE_FAMILY, Component.translatable("ars_nouveau.sound.fire_family")); SpellSoundRegistry.registerSpellSound(SoundRegistry.DEFAULT_SPELL_SOUND); SpellSoundRegistry.registerSpellSound(SoundRegistry.EMPTY_SPELL_SOUND); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CreativeTabRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CreativeTabRegistry.java index 2dc12b79f7..39c8b75b54 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CreativeTabRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CreativeTabRegistry.java @@ -6,6 +6,7 @@ import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; import com.hollingsworth.arsnouveau.api.registry.RitualRegistry; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; +import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; import com.hollingsworth.arsnouveau.common.items.FamiliarScript; import com.hollingsworth.arsnouveau.common.items.Glyph; import com.hollingsworth.arsnouveau.common.items.PerkItem; @@ -16,17 +17,21 @@ import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.CreativeModeTabs; import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.RecipeHolder; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; + import java.util.Comparator; import static com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry.ITEMS; public class CreativeTabRegistry { - public static Comparator COMPARE_GLYPH_BY_TYPE = Comparator.comparingInt(AbstractSpellPart::getTypeIndex); + public static Comparator> COMPARE_GLYPH_BY_TYPE = Comparator.comparingInt(holder -> holder.value().getSpellPart().getTypeIndex()); + + public static Comparator> COMPARE_TYPE_THEN_NAME = COMPARE_GLYPH_BY_TYPE.thenComparing(holder -> holder.value().getSpellPart().getLocaleName()); + public static Comparator> COMPARE_TIER_THEN_NAME = COMPARE_GLYPH_BY_TYPE.thenComparingInt(o -> o.value().getSpellPart().getConfigTier().value).thenComparing(holder -> holder.value().getSpellPart().getLocaleName()); - public static Comparator COMPARE_TYPE_THEN_NAME = COMPARE_GLYPH_BY_TYPE.thenComparing(AbstractSpellPart::getLocaleName); - public static Comparator COMPARE_TIER_THEN_NAME = COMPARE_GLYPH_BY_TYPE.thenComparingInt(o -> o.getConfigTier().value).thenComparing(AbstractSpellPart::getLocaleName); + public static Comparator COMPARE_SPELL_TYPE_NAME = Comparator.comparingInt(AbstractSpellPart::getTypeIndex).thenComparing(AbstractSpellPart::getLocaleName); public static final DeferredRegister TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, ArsNouveau.MODID); @@ -58,7 +63,7 @@ public class CreativeTabRegistry { .displayItems((params, output) -> { for (var glyph : GlyphRegistry.getSpellpartMap().values().stream() - .sorted(COMPARE_TYPE_THEN_NAME).toList()) { + .sorted(COMPARE_SPELL_TYPE_NAME).toList()) { output.accept(glyph.getGlyph().getDefaultInstance()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java index 9c68c47f69..098adb50c0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.setup.registry; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.common.items.data.*; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.registries.BuiltInRegistries; @@ -33,4 +34,10 @@ public class DataComponentRegistry { public static final DeferredHolder, DataComponentType> MULTI_POTION = DATA.register("multi_potion", () -> DataComponentType.builder().persistent(MultiPotionContents.CODEC).networkSynchronized(MultiPotionContents.STREAM_CODEC).build()); public static final DeferredHolder, DataComponentType> LIGHT_JAR = DATA.register("light_jar", () -> DataComponentType.builder().persistent(LightJarData.CODEC).networkSynchronized(LightJarData.STREAM_CODEC).build()); + + public static final DeferredHolder, DataComponentType> CODEX_DATA = DATA.register("codex_data", () -> DataComponentType.builder().persistent(CodexData.CODEC).networkSynchronized(CodexData.STREAM).build()); + + public static final DeferredHolder, DataComponentType> SPELL_CASTER = DATA.register("spell_caster", () -> DataComponentType.builder().persistent(SpellCaster.CODEC.codec()).networkSynchronized(SpellCaster.STREAM).build()); + + public static final DeferredHolder, DataComponentType> POTION_LAUNCHER = DATA.register("potion_launcher", () -> DataComponentType.builder().persistent(PotionLauncherData.CODEC.codec()).networkSynchronized(PotionLauncherData.STREAM).build()); } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 653550722c..39a1c14eaa 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -67,7 +67,7 @@ public net.minecraft.client.gui.components.AbstractWidget y # y public net.minecraft.world.item.ArmorItem f_265987_ # ARMOR_MODIFIER_UUID_PER_TYPE public net.minecraft.world.entity.Entity maxUpStep # maxUpStep public net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProviderType (Lcom/mojang/serialization/MapCodec;)V # BlockStateProviderType - +public net.minecraft.world.item.crafting.RecipeManager byKeyTyped(Lnet/minecraft/world/item/crafting/RecipeType;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/world/item/crafting/RecipeHolder; # byKeyTyped # Geckolib ATs, do not delete public net.minecraft.client.model.geom.ModelPart$Cube public net.minecraft.client.model.geom.ModelPart cubes # cubes From 22f7a6fb9544a86dea0c6d1ebdb5def28506d0b9 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 2 Jul 2024 09:27:01 -0500 Subject: [PATCH 024/363] wip caster rewrite --- .../arsnouveau/api/event/EventQueue.java | 15 +- .../arsnouveau/api/event/ITimedEvent.java | 5 + .../arsnouveau/api/item/ICasterTool.java | 58 ++++---- .../api/item/ISpellHotkeyListener.java | 8 +- .../api/potion/IPotionProvider.java | 16 +- .../api/registry/CasterProvider.java | 23 +++ .../JarBehaviorRegistry.java | 3 +- .../ParticleColorRegistry.java | 3 +- .../PotionProviderRegistry.java | 17 ++- .../api/registry/SpellCasterRegistry.java | 36 +++++ .../api/sound/ConfiguredSpellSound.java | 31 +++- .../arsnouveau/api/spell/ISpellCaster.java | 73 ++++++---- .../api/spell/ISpellCasterProvider.java | 10 +- .../arsnouveau/api/spell/Spell.java | 137 +++++++++++++----- .../arsnouveau/api/spell/SpellCaster.java | 118 +++++++-------- .../arsnouveau/api/spell/SpellContext.java | 19 +-- .../arsnouveau/api/spell/SpellResolver.java | 2 +- .../api/spell/TurretSpellCaster.java | 22 --- .../arsnouveau/api/util/CasterUtil.java | 16 -- .../AbstractStorageTerminalScreen.java | 4 +- .../arsnouveau/client/gui/GuiSpellHUD.java | 4 +- .../arsnouveau/client/gui/SpellTooltip.java | 10 +- .../client/gui/book/GuiSpellBook.java | 16 +- .../client/gui/book/InfinityGuiSpellBook.java | 16 +- .../client/gui/book/SoundScreen.java | 6 +- .../arsnouveau/client/particle/ColorPos.java | 2 +- .../client/particle/ParticleColor.java | 3 +- .../client/registry/ClientHandler.java | 2 +- .../renderer/item/ScryCasterRenderer.java | 9 +- .../renderer/item/SpellBowRenderer.java | 9 +- .../renderer/item/SpellCrossbowRenderer.java | 11 +- .../client/renderer/item/SwordRenderer.java | 9 +- .../client/renderer/item/WandRenderer.java | 6 +- .../client/renderer/tile/MobJarRenderer.java | 2 +- .../client/renderer/tile/RuneRenderer.java | 2 +- .../common/armor/AnimatedMagicArmor.java | 2 +- .../common/block/BasicSpellTurret.java | 6 +- .../arsnouveau/common/block/MobJar.java | 3 +- .../arsnouveau/common/block/RuneBlock.java | 9 +- .../block/tile/BasicSpellTurretTile.java | 14 +- .../block/tile/CraftingLecternTile.java | 4 +- .../common/block/tile/LightTile.java | 2 +- .../common/block/tile/MageBlockTile.java | 2 +- .../common/block/tile/MobJarTile.java | 2 +- .../common/block/tile/RitualBrazierTile.java | 2 +- .../common/block/tile/RuneTile.java | 8 +- .../common/block/tile/SconceTile.java | 2 +- .../common/block/tile/SpellSensorTile.java | 9 +- .../common/block/tile/WixieCauldronTile.java | 11 +- .../crafting/recipes/CasterTomeData.java | 128 ++++------------ .../crafting/recipes/PotionFlaskRecipe.java | 26 ++-- .../recipes/ReactiveEnchantmentRecipe.java | 16 +- .../crafting/recipes/SpellWriteRecipe.java | 6 +- .../common/datagen/CasterTomeProvider.java | 9 +- .../common/datagen/PatchouliProvider.java | 16 +- .../common/entity/AnimHeadSummon.java | 54 ++++--- .../common/entity/ColoredProjectile.java | 2 +- .../common/entity/EnchantedFallingBlock.java | 21 +-- .../common/entity/EnchantedSkull.java | 58 ++++---- .../common/entity/EntitySpellArrow.java | 6 - .../entity/familiar/FamiliarEntity.java | 6 +- .../entity/familiar/FamiliarWhirlisprig.java | 2 +- .../arsnouveau/common/event/ArsEvents.java | 2 +- .../arsnouveau/common/event/EventHandler.java | 20 ++- .../arsnouveau/common/items/CasterTome.java | 6 - .../common/items/EnchantersMirror.java | 7 +- .../common/items/EnchantersSword.java | 7 +- .../arsnouveau/common/items/FlaskCannon.java | 2 +- .../common/items/FormSpellArrow.java | 4 +- .../arsnouveau/common/items/PotionFlask.java | 2 +- .../arsnouveau/common/items/ScryCaster.java | 28 +--- .../arsnouveau/common/items/SpellArrow.java | 16 +- .../arsnouveau/common/items/SpellBook.java | 43 +----- .../arsnouveau/common/items/SpellBow.java | 15 +- .../common/items/SpellCrossbow.java | 15 +- .../arsnouveau/common/items/Wand.java | 12 +- .../items/data/MultiPotionContents.java | 11 +- .../items/data/PersistentFamiliarData.java | 16 ++ .../common/items/data/PotionLauncherData.java | 2 +- .../common/network/PacketANEffect.java | 2 +- .../common/network/PacketConsumePotion.java | 2 +- .../common/network/PacketSetBookMode.java | 16 +- .../common/network/PacketSetLauncher.java | 2 +- .../common/network/PacketSetSound.java | 6 +- .../common/network/PacketSyncPlayerCap.java | 2 +- .../common/network/PacketUpdateCaster.java | 10 +- .../network/PacketUpdateSpellColorAll.java | 10 +- .../network/PacketUpdateSpellColors.java | 11 +- .../network/PacketUpdateSpellSoundAll.java | 9 +- .../common/spell/casters/ReactiveCaster.java | 12 -- .../common/spell/effect/EffectDelay.java | 2 +- .../common/spell/effect/EffectInfuse.java | 19 ++- .../common/spell/effect/EffectLinger.java | 2 +- .../common/spell/effect/EffectName.java | 3 +- .../common/spell/effect/EffectOrbit.java | 7 +- .../common/spell/effect/EffectReset.java | 6 +- .../common/spell/effect/EffectRune.java | 5 +- .../common/spell/effect/EffectWall.java | 2 +- .../common/spell/effect/EffectWololo.java | 6 +- .../arsnouveau/common/util/PotionUtil.java | 5 +- .../setup/registry/APIRegistry.java | 1 - 101 files changed, 748 insertions(+), 749 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterProvider.java rename src/main/java/com/hollingsworth/arsnouveau/api/{mob_jar => registry}/JarBehaviorRegistry.java (91%) rename src/main/java/com/hollingsworth/arsnouveau/api/{particle => registry}/ParticleColorRegistry.java (93%) rename src/main/java/com/hollingsworth/arsnouveau/api/{potion => registry}/PotionProviderRegistry.java (82%) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellCasterRegistry.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/spell/TurretSpellCaster.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/util/CasterUtil.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/EventQueue.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/EventQueue.java index 0819072da5..a4c1884bb8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/EventQueue.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/EventQueue.java @@ -1,15 +1,15 @@ package com.hollingsworth.arsnouveau.api.event; import com.hollingsworth.arsnouveau.ArsNouveau; +import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.event.tick.ServerTickEvent; import org.jetbrains.annotations.NotNull; - +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; -import net.neoforged.bus.api.SubscribeEvent; /** * For queuing deferred or over-time tasks. Tick refers to the Server or Client Tick event. @@ -19,7 +19,7 @@ public class EventQueue { @NotNull List events = new ArrayList<>();; - public void tick(boolean serverSide) { + public void tick(@Nullable ServerTickEvent.Post e) { if (events.isEmpty()) { return; } @@ -31,7 +31,10 @@ public void tick(boolean serverSide) { if (event.isExpired()) { stale.add(event); } else { - event.tick(serverSide); + if(e == null) + event.tick(false); + else + event.tick(e); } } this.events.removeAll(stale); @@ -72,12 +75,12 @@ private EventQueue() { @SubscribeEvent public static void serverTick(ServerTickEvent.Post e) { - EventQueue.getServerInstance().tick(true); + EventQueue.getServerInstance().tick(e); } @SubscribeEvent public static void clientTickEvent(ClientTickEvent.Post e) { - EventQueue.getClientQueue().tick(false); + EventQueue.getClientQueue().tick(null); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/ITimedEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/ITimedEvent.java index 1d3497f3ee..70414028ff 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/ITimedEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/ITimedEvent.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.api.event; import net.minecraft.nbt.CompoundTag; +import net.neoforged.neoforge.event.tick.ServerTickEvent; /** * A basic timed event for the EventQueue. @@ -9,6 +10,10 @@ public interface ITimedEvent { void tick(boolean serverSide); + default void tick(ServerTickEvent serverTickEvent){ + tick(true); + } + /** * If this event should be removed from the queue */ diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java index 32f479a283..47b92ce738 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java @@ -1,18 +1,17 @@ package com.hollingsworth.arsnouveau.api.item; import com.hollingsworth.arsnouveau.api.client.IDisplayMana; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.spell.ISpellCasterProvider; import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.api.spell.SpellCaster; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.common.items.SpellBook; import com.hollingsworth.arsnouveau.common.items.SpellParchment; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; @@ -34,19 +33,24 @@ public interface ICasterTool extends IScribeable, IDisplayMana, ISpellHotkeyList @Override default boolean onScribe(Level world, BlockPos pos, Player player, InteractionHand handIn, ItemStack tableStack) { ItemStack heldStack = player.getItemInHand(handIn); - ISpellCaster thisCaster = CasterUtil.getCaster(tableStack); + SpellCaster tableCaster = SpellCasterRegistry.from(tableStack); if (!((heldStack.getItem() instanceof SpellBook) || (heldStack.getItem() instanceof SpellParchment) || (heldStack.getItem() == ItemsRegistry.MANIPULATION_ESSENCE.asItem()))) return false; + if(tableCaster == null){ + return false; + } boolean success; + SpellCaster heldCaster = SpellCasterRegistry.from(heldStack); Spell spell = new Spell(); - if (heldStack.getItem() instanceof ICasterTool) { - ISpellCaster heldCaster = CasterUtil.getCaster(heldStack); + if (heldCaster != null) { spell = heldCaster.getSpell(); - thisCaster.setColor(heldCaster.getColor()); - thisCaster.setFlavorText(heldCaster.getFlavorText()); - thisCaster.setSpellName(heldCaster.getSpellName()); - thisCaster.setSound(heldCaster.getCurrentSound()); + tableCaster.setColor(heldCaster.getColor()) + .setFlavorText(heldCaster.getFlavorText()) + .setSpellName(heldCaster.getSpellName()) + .setSound(heldCaster.getCurrentSound()) + .saveToStack(tableStack); + } else if (heldStack.getItem() == ItemsRegistry.MANIPULATION_ESSENCE.asItem()) { // Thanks mojang String[] words = new String[]{"the", "elder", "scrolls", "klaatu", "berata", "niktu", "xyzzy", "bless", "curse", "light", "darkness", "fire", "air", "earth", "water", "hot", "dry", "cold", "wet", "ignite", "snuff", "embiggen", "twist", "shorten", "stretch", "fiddle", "destroy", "imbue", "galvanize", "enchant", "free", "limited", "range", "of", "towards", "inside", "sphere", "cube", "self", "other", "ball", "mental", "physical", "grow", "shrink", "demon", "elemental", "spirit", "animal", "creature", "beast", "humanoid", "undead", "fresh", "stale", "phnglui", "mglwnafh", "cthulhu", "rlyeh", "wgahnagl", "fhtagn", "baguette"}; @@ -56,17 +60,17 @@ default boolean onScribe(Level world, BlockPos pos, Player player, InteractionHa for (int i = 0; i < numWords; i++) { sb.append(words[world.random.nextInt(words.length)]).append(" "); } - thisCaster.setSpellHidden(true); - thisCaster.setHiddenRecipe(sb.toString()); + tableCaster.setHidden(true) + .setHiddenRecipe(sb.toString()) + .saveToStack(tableStack); PortUtil.sendMessageNoSpam(player, Component.translatable("ars_nouveau.spell_hidden")); return true; } - if (isScribedSpellValid(thisCaster, player, handIn, tableStack, spell)) { - success = setSpell(thisCaster, player, handIn, tableStack, spell); - if (success) { - sendSetMessage(player); - return true; - } + if (isScribedSpellValid(tableCaster, player, handIn, tableStack, spell)) { + var mutableSpell = spell.mutable(); + scribeModifiedSpell(tableCaster, player, handIn, tableStack, mutableSpell); + tableCaster.setSpell(mutableSpell.immutable()).saveToStack(tableStack); + sendSetMessage(player); } else { sendInvalidMessage(player); } @@ -81,26 +85,14 @@ default void sendInvalidMessage(Player player) { PortUtil.sendMessageNoSpam(player, Component.translatable("ars_nouveau.invalid_spell")); } - default @NotNull ISpellCaster getSpellCaster(ItemStack stack) { - return new SpellCaster(stack); - } - @Override - default ISpellCaster getSpellCaster() { - return getSpellCaster(new CompoundTag()); + default @NotNull SpellCaster getSpellCaster(ItemStack stack) { + return SpellCasterRegistry.from(stack); } - @Override - default ISpellCaster getSpellCaster(CompoundTag tag) { - return new SpellCaster(tag); - } - - default boolean setSpell(ISpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { - caster.setSpell(spell); - return true; - } + default void scribeModifiedSpell(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell){} - default boolean isScribedSpellValid(ISpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { + default boolean isScribedSpellValid(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { return spell.isValid(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/ISpellHotkeyListener.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/ISpellHotkeyListener.java index 5efb42e703..d9f6f248f0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/ISpellHotkeyListener.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/ISpellHotkeyListener.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.api.item; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; @@ -12,17 +12,17 @@ public interface ISpellHotkeyListener { default void onNextKeyPressed(ItemStack stack, ServerPlayer player) { - ISpellCaster iSpellCaster = CasterUtil.getCaster(stack); + ISpellCaster iSpellCaster = SpellCasterRegistry.from(stack); iSpellCaster.setNextSlot(); } default void onPreviousKeyPressed(ItemStack stack, ServerPlayer player) { - ISpellCaster iSpellCaster = CasterUtil.getCaster(stack); + ISpellCaster iSpellCaster = SpellCasterRegistry.from(stack); iSpellCaster.setPreviousSlot(); } default void onQuickCast(ItemStack stack, ServerPlayer player, InteractionHand hand, int slot){ - ISpellCaster iSpellCaster = CasterUtil.getCaster(stack); + ISpellCaster iSpellCaster = SpellCasterRegistry.from(stack); iSpellCaster.castSpell(player.level, player, hand, null, iSpellCaster.getSpell(slot)); } //TODO: 1.20 Remove this and have onQuickCast return a boolean diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/potion/IPotionProvider.java b/src/main/java/com/hollingsworth/arsnouveau/api/potion/IPotionProvider.java index 27f0a366d6..518e406da1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/potion/IPotionProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/potion/IPotionProvider.java @@ -1,10 +1,10 @@ package com.hollingsworth.arsnouveau.api.potion; +import com.hollingsworth.arsnouveau.common.util.PotionUtil; import net.minecraft.network.chat.Component; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.alchemy.PotionContents; import org.jetbrains.annotations.NotNull; @@ -20,9 +20,15 @@ public interface IPotionProvider { int maxUses(ItemStack stack); - void consumeUses(ItemStack stack, int amount, @Nullable Player player); + default int roomLeft(ItemStack stack){ + return maxUses(stack) - usesRemaining(stack); + } + + void consumeUses(ItemStack stack, int amount, @Nullable LivingEntity player); + + void addUse(ItemStack stack, int amount, @Nullable LivingEntity player); - void addUse(ItemStack stack, int amount, @Nullable Player player); + void setData(PotionContents contents, int usesRemaining, int maxUses, ItemStack stack); /** * Modify the effect instance before applying it to the target @@ -46,4 +52,8 @@ default void addTooltip(ItemStack stack, List tooltips){ PotionContents potionStack = getPotionData(stack); potionStack.addPotionTooltip(tooltips::add, 1.0F, 20.0f); } + + default boolean isEmpty(ItemStack stack){ + return PotionUtil.isEmpty(getPotionData(stack)) || usesRemaining(stack) <= 0; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterProvider.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterProvider.java new file mode 100644 index 0000000000..c6aa18c4d1 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterProvider.java @@ -0,0 +1,23 @@ +package com.hollingsworth.arsnouveau.api.registry; + +import com.hollingsworth.arsnouveau.api.spell.ISpellCasterProvider; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; +import net.minecraft.world.item.ItemStack; + +import java.util.function.Function; + +public class CasterProvider implements ISpellCasterProvider { + + ItemStack stack; + Function casterGetter; + + public CasterProvider(ItemStack stack, Function casterGetter) { + this.stack = stack; + this.casterGetter = casterGetter; + } + + @Override + public SpellCaster getSpellCaster(ItemStack stack) { + return casterGetter.apply(stack); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/mob_jar/JarBehaviorRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/JarBehaviorRegistry.java similarity index 91% rename from src/main/java/com/hollingsworth/arsnouveau/api/mob_jar/JarBehaviorRegistry.java rename to src/main/java/com/hollingsworth/arsnouveau/api/registry/JarBehaviorRegistry.java index 8d5c2ca652..d4fd745318 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/mob_jar/JarBehaviorRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/JarBehaviorRegistry.java @@ -1,5 +1,6 @@ -package com.hollingsworth.arsnouveau.api.mob_jar; +package com.hollingsworth.arsnouveau.api.registry; +import com.hollingsworth.arsnouveau.api.mob_jar.JarBehavior; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/particle/ParticleColorRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/ParticleColorRegistry.java similarity index 93% rename from src/main/java/com/hollingsworth/arsnouveau/api/particle/ParticleColorRegistry.java rename to src/main/java/com/hollingsworth/arsnouveau/api/registry/ParticleColorRegistry.java index 8393b02dec..8bdaf66627 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/particle/ParticleColorRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/ParticleColorRegistry.java @@ -1,5 +1,6 @@ -package com.hollingsworth.arsnouveau.api.particle; +package com.hollingsworth.arsnouveau.api.registry; +import com.hollingsworth.arsnouveau.api.particle.IParticleProvider; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.RainbowParticleColor; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionProviderRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/PotionProviderRegistry.java similarity index 82% rename from src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionProviderRegistry.java rename to src/main/java/com/hollingsworth/arsnouveau/api/registry/PotionProviderRegistry.java index ef5f755354..13db10ffb1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/potion/PotionProviderRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/PotionProviderRegistry.java @@ -1,8 +1,10 @@ -package com.hollingsworth.arsnouveau.api.potion; +package com.hollingsworth.arsnouveau.api.registry; +import com.hollingsworth.arsnouveau.api.potion.IPotionProvider; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.component.DataComponents; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.*; import net.minecraft.world.item.alchemy.PotionContents; @@ -39,26 +41,31 @@ public int maxUses(ItemStack stack) { } @Override - public void consumeUses(ItemStack stack, int amount, @Nullable Player player) { + public void consumeUses(ItemStack stack, int amount, @Nullable LivingEntity entity) { if(stack.getItem() instanceof PotionItem potionItem){ stack.shrink(1); - if(player != null){ + if(entity instanceof Player player){ player.inventory.add(new ItemStack(Items.GLASS_BOTTLE)); } } } @Override - public void addUse(ItemStack stack, int amount, @Nullable Player player) { + public void addUse(ItemStack stack, int amount, @Nullable LivingEntity entity) { if(stack.getItem() instanceof BottleItem bottleItem){ ItemStack bottle = new ItemStack(Items.GLASS_BOTTLE); bottle.set(DataComponents.POTION_CONTENTS, stack.get(DataComponents.POTION_CONTENTS)); - if(player != null){ + if(entity instanceof Player player){ stack.shrink(1); player.inventory.add(bottle); } } } + + @Override + public void setData(PotionContents contents, int usesRemaining, int maxUses, ItemStack stack) { + stack.set(DataComponents.POTION_CONTENTS, contents); + } }; static{ diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellCasterRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellCasterRegistry.java new file mode 100644 index 0000000000..97ed257805 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellCasterRegistry.java @@ -0,0 +1,36 @@ +package com.hollingsworth.arsnouveau.api.registry; + +import com.hollingsworth.arsnouveau.api.spell.ISpellCasterProvider; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ItemLike; + +import javax.annotation.Nullable; +import java.util.concurrent.ConcurrentHashMap; + +public class SpellCasterRegistry { + private static final ConcurrentHashMap MAP = new ConcurrentHashMap<>(); + + static{ + register(ItemsRegistry.NOVICE_SPELLBOOK, (stack) -> stack.get(DataComponentRegistry.SPELL_CASTER)); + register(ItemsRegistry.APPRENTICE_SPELLBOOK, (stack) -> stack.get(DataComponentRegistry.SPELL_CASTER)); + register(ItemsRegistry.ARCHMAGE_SPELLBOOK, (stack) -> stack.get(DataComponentRegistry.SPELL_CASTER)); + register(ItemsRegistry.CREATIVE_SPELLBOOK, (stack) -> stack.get(DataComponentRegistry.SPELL_CASTER)); + + } + + public static @Nullable SpellCaster from(ItemStack stack){ + return MAP.getOrDefault(stack.getItem().builtInRegistryHolder().key().location(), (s) -> s.get(DataComponentRegistry.SPELL_CASTER)).getSpellCaster(stack); + } + + public static void register(ItemLike itemLike, ISpellCasterProvider provider){ + MAP.put(itemLike.asItem().builtInRegistryHolder().key().location(), provider); + } + + public static void register(ResourceLocation location, ISpellCasterProvider provider){ + MAP.put(location, provider); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/sound/ConfiguredSpellSound.java b/src/main/java/com/hollingsworth/arsnouveau/api/sound/ConfiguredSpellSound.java index 11af63250b..e309574aa2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/sound/ConfiguredSpellSound.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/sound/ConfiguredSpellSound.java @@ -9,7 +9,7 @@ import javax.annotation.Nullable; import java.util.Objects; -public class ConfiguredSpellSound { +public class ConfiguredSpellSound implements Cloneable{ public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( SpellSound.CODEC.codec().fieldOf("sound").forGetter(s -> s.sound), @@ -20,9 +20,9 @@ public class ConfiguredSpellSound { public static ConfiguredSpellSound EMPTY = new ConfiguredSpellSound(SoundRegistry.EMPTY_SPELL_SOUND, 1, 1); // If the user wants no sound, make it empty. public static ConfiguredSpellSound DEFAULT = new ConfiguredSpellSound(SoundRegistry.DEFAULT_SPELL_SOUND, 1, 1); // The default sound to be returned for null casters. - public SpellSound sound; - public float volume; - public float pitch; + private final SpellSound sound; + private final float volume; + private final float pitch; public ConfiguredSpellSound(SpellSound sound) { this(sound, 1, 1); @@ -70,4 +70,27 @@ public String toString() { ", pitch=" + pitch + '}'; } + + @Override + public ConfiguredSpellSound clone() { + try { + ConfiguredSpellSound clone = (ConfiguredSpellSound) super.clone(); + // TODO: copy mutable state here, so the clone can't change the internals of the original + return clone; + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } + } + + public SpellSound getSound() { + return sound; + } + + public float getVolume() { + return volume; + } + + public float getPitch() { + return pitch; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCaster.java index b52935f2ca..8ed85005c0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCaster.java @@ -13,7 +13,6 @@ import com.hollingsworth.arsnouveau.common.util.PortUtil; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; @@ -39,75 +38,91 @@ * An interface for handling NBT as it relates to items that may cast spells. * See SpellCaster for implementation. */ -public interface ISpellCaster { +public interface ISpellCaster> { @NotNull - Spell getSpell(); + default Spell getSpell(){ + return getSpell(getCurrentSlot()); + } @NotNull Spell getSpell(int slot); int getMaxSlots(); + T setMaxSlots(int slots); + int getCurrentSlot(); - void setCurrentSlot(int slot); + T setCurrentSlot(int slot); - default void setNextSlot() { + default T setNextSlot() { int slot = getCurrentSlot() + 1; if (slot >= getMaxSlots()) { slot = 0; } - setCurrentSlot(slot); + return setCurrentSlot(slot); } - default void setPreviousSlot() { + default T setPreviousSlot() { int slot = getCurrentSlot() - 1; if (slot < 0) slot = getMaxSlots() - 1; - setCurrentSlot(slot); + return setCurrentSlot(slot); } - void setSpell(Spell spell, int slot); + T setSpell(Spell spell, int slot); - void setSpell(Spell spell); + default T setSpell(Spell spell){ + return setSpell(spell, getCurrentSlot()); + } @NotNull ParticleColor getColor(int slot); @NotNull - ParticleColor getColor(); + default ParticleColor getColor(){ + return getColor(getCurrentSlot()); + } - void setColor(ParticleColor color); + default T setColor(ParticleColor color){ + return setColor(color, getCurrentSlot()); + } - void setColor(ParticleColor color, int slot); + T setColor(ParticleColor color, int slot); @NotNull ConfiguredSpellSound getSound(int slot); - void setSound(ConfiguredSpellSound sound); + default T setSound(ConfiguredSpellSound sound){ + return setSound(sound, getCurrentSlot()); + } - void setSound(ConfiguredSpellSound sound, int slot); + T setSound(ConfiguredSpellSound sound, int slot); default ConfiguredSpellSound getCurrentSound() { return getSound(getCurrentSlot()); } - void setFlavorText(String str); + T setFlavorText(String str); String getSpellName(int slot); - String getSpellName(); - - void setSpellName(String name); + default String getSpellName(){ + return getSpellName(getCurrentSlot()); + } - void setSpellName(String name, int slot); + default T setSpellName(String name){ + return setSpellName(name, getCurrentSlot()); + } - void setSpellHidden(boolean hidden); + T setSpellName(String name, int slot); boolean isSpellHidden(); - void setHiddenRecipe(String recipe); + T setHidden(boolean hidden); + + T setHiddenRecipe(String recipe); String getHiddenRecipe(); @@ -175,11 +190,13 @@ default InteractionResultHolder castSpell(Level worldIn, LivingEntity return castSpell(worldIn, playerIn, handIn, invalidMessage, getSpell(worldIn, playerIn, handIn, this)); } - default void copyFromCaster(ISpellCaster other) { + default T copyFromCaster(ISpellCaster other) { + T self = (T) this; for (int i = 0; i < getMaxSlots() && i < other.getMaxSlots(); i++) { - setSpell(other.getSpell(i), i); - setFlavorText(other.getFlavorText()); + self = self.setSpell(other.getSpell(i), i); + self = self.setFlavorText(other.getFlavorText()); } + return self; } default SpellResolver getSpellResolver(SpellContext context, Level worldIn, LivingEntity playerIn, InteractionHand handIn) { @@ -187,10 +204,8 @@ default SpellResolver getSpellResolver(SpellContext context, Level worldIn, Livi } default void playSound(BlockPos pos, Level worldIn, @Nullable Entity playerIn, ConfiguredSpellSound configuredSound, SoundSource source) { - if (configuredSound == null || configuredSound.sound == null || configuredSound.sound.getSoundEvent() == null || configuredSound.equals(ConfiguredSpellSound.EMPTY)) + if (configuredSound == null || configuredSound.getSound() == null || configuredSound.getSound().getSoundEvent() == null || configuredSound.equals(ConfiguredSpellSound.EMPTY)) return; - worldIn.playSound(null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, configuredSound.sound.getSoundEvent(), source, configuredSound.volume, configuredSound.pitch); + worldIn.playSound(null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, configuredSound.getSound().getSoundEvent(), source, configuredSound.getVolume(), configuredSound.getPitch()); } - - ResourceLocation getTagID(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCasterProvider.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCasterProvider.java index eef887a9c8..2fa5828335 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCasterProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCasterProvider.java @@ -1,16 +1,8 @@ package com.hollingsworth.arsnouveau.api.spell; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; public interface ISpellCasterProvider { - ISpellCaster getSpellCaster(); - - default ISpellCaster getSpellCaster(ItemStack stack) { - return getSpellCaster(stack.getOrCreateTag()); - } - - ISpellCaster getSpellCaster(CompoundTag tag); - + SpellCaster getSpellCaster(ItemStack stack); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java index 0e444df215..9cafcbd618 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java @@ -1,12 +1,12 @@ package com.hollingsworth.arsnouveau.api.spell; -import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; -import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.Util; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; @@ -14,6 +14,7 @@ import javax.annotation.Nullable; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class Spell implements Cloneable { @@ -25,10 +26,10 @@ public class Spell implements Cloneable { Codec.list(AbstractSpellPart.CODEC).fieldOf("recipe").forGetter(s -> s.recipe) ).apply(instance, Spell::new)); - public List recipe = new ArrayList<>(); - public String name = ""; - public ParticleColor color = ParticleColor.defaultParticleColor(); - public ConfiguredSpellSound sound = ConfiguredSpellSound.DEFAULT; + private List recipe = new ArrayList<>(); + private String name = ""; + private ParticleColor color = ParticleColor.defaultParticleColor(); + private ConfiguredSpellSound sound = ConfiguredSpellSound.DEFAULT; public Spell(List recipe) { this.recipe = recipe == null ? new ArrayList<>() : new ArrayList<>(recipe); // Safe check for tiles initializing a null @@ -39,41 +40,71 @@ public Spell() { public Spell(AbstractSpellPart... spellParts) { super(); - add(spellParts); + recipe.addAll(Arrays.asList(spellParts)); } - public Spell(String s, ParticleColor color, ConfiguredSpellSound configuredSpellSound, List abstractSpellParts) { - this.name = s; + + + public Spell(String name, ParticleColor color, ConfiguredSpellSound configuredSpellSound, List abstractSpellParts) { + this.name = name; this.color = color; this.sound = configuredSpellSound; this.recipe = abstractSpellParts; } + public ConfiguredSpellSound sound(){ + return sound; + } + + public Iterable recipe(){ + return recipe; + } + + /** + * DO NOT MUTATE. + * See {@link Spell#mutable()} for a mutable version. + */ + public List unsafeList(){ + return recipe; + } + + public AbstractSpellPart get(int index){ + return recipe.get(index); + } + + public int size(){ + return recipe.size(); + } + + public int indexOf(AbstractSpellPart part){ + return recipe.indexOf(part); + } + public Spell add(AbstractSpellPart spellPart) { - recipe.add(spellPart); - return this; + return new Spell(name, color, sound, Util.copyAndAdd(recipe, spellPart)); } public Spell add(AbstractSpellPart... spellParts) { + var spell = this; for (AbstractSpellPart part : spellParts) - add(part); - return this; + spell = spell.add(part); + return spell; } public Spell add(AbstractSpellPart spellPart, int count) { - for (int i = 0; i < count; i++) - recipe.add(spellPart); - return this; + var spell = this; + for (int i = 0; i < count; i++) { + spell = spell.add(spellPart); + } + return spell; } public Spell setRecipe(@NotNull List recipe) { - this.recipe = recipe; - return this; + return new Spell(name, color, sound, new ArrayList<>(recipe)); } public Spell withColor(@NotNull ParticleColor color) { - this.color = color; - return this; + return new Spell(name, color, sound, recipe); } public Spell withSound(@NotNull ConfiguredSpellSound sound){ @@ -81,8 +112,12 @@ public Spell withSound(@NotNull ConfiguredSpellSound sound){ return this; } - public int getSpellSize() { - return recipe.size(); + public ParticleColor color(){ + return color; + } + + public String name(){ + return name; } public @Nullable AbstractCastMethod getCastMethod() { @@ -158,21 +193,7 @@ public CompoundTag serialize() { } public static Spell fromTag(@Nullable CompoundTag tag) { - if (tag == null) - return new Spell(); - Spell spell = new Spell(); - spell.name = tag.getString("name"); - spell.color = ParticleColorRegistry.from(tag.getCompound("spellColor")); - spell.sound = ConfiguredSpellSound.fromTag(tag.getCompound("sound")); - CompoundTag recipeTag = tag.getCompound("recipe"); - int size = recipeTag.getInt("size"); - for (int i = 0; i < size; i++) { - ResourceLocation registryName = ResourceLocation.tryParse(recipeTag.getString("part" + i)); - AbstractSpellPart part = GlyphRegistry.getSpellpartMap().get(registryName); - if (part != null) - spell.recipe.add(part); - } - return spell; + return tag == null ? new Spell() : ANCodecs.decode(Spell.CODEC.codec(), tag); } public String getDisplayString() { @@ -227,4 +248,46 @@ public Spell clone() { throw new AssertionError(); } } + + public Mutable mutable(){ + return new Mutable(new ArrayList<>(recipe), name, color, sound); + } + + public static class Mutable{ + public List recipe; + public String name; + public ParticleColor color; + public ConfiguredSpellSound sound; + + public Mutable(List recipe, String name, ParticleColor color, ConfiguredSpellSound spellSound) { + this.recipe = recipe; + this.name = name; + this.color = color; + this.sound = spellSound; + } + + public Mutable add(AbstractSpellPart spellPart) { + recipe.add(spellPart); + return this; + } + + public Mutable add(AbstractSpellPart... spellParts) { + recipe.addAll(Arrays.asList(spellParts)); + return this; + } + + public Mutable add(int index, AbstractSpellPart spellPart) { + recipe.add(index, spellPart); + return this; + } + + public Mutable setRecipe(@NotNull List recipe) { + this.recipe = recipe; + return this; + } + + public Spell immutable(){ + return new Spell(name, color, sound, recipe); + } + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java index 6268a619b1..728cf4c60d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java @@ -1,45 +1,53 @@ package com.hollingsworth.arsnouveau.api.spell; -import com.hollingsworth.arsnouveau.ArsNouveau; +import com.google.common.collect.ImmutableMap; import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.Util; +import net.minecraft.core.component.DataComponentType; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; -import java.util.HashMap; +import java.util.ArrayList; import java.util.Map; -public class SpellCaster implements ISpellCaster { +public class SpellCaster implements ISpellCaster { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( Codec.INT.optionalFieldOf("current_slot", 0).forGetter(s -> s.slot), Codec.STRING.optionalFieldOf("flavor_text", "").forGetter(s -> s.flavorText), Codec.BOOL.optionalFieldOf("is_hidden", false).forGetter(s -> s.isHidden), - Codec.STRING.optionalFieldOf("hidden_text", "").forGetter(s -> s.hiddenText) + Codec.STRING.optionalFieldOf("hidden_text", "").forGetter(s -> s.hiddenText), + Codec.INT.optionalFieldOf("max_slots", 1).forGetter(s -> s.maxSlots) ).apply(instance, SpellCaster::new)); public static final StreamCodec STREAM = CheatSerializer.create(SpellCaster.CODEC); - private Map spells = new HashMap<>(); - private int slot; - public ItemStack stack = ItemStack.EMPTY; - public String flavorText = ""; - public boolean isHidden; - public String hiddenText = ""; + private final Map spells; + private final int slot; + private final String flavorText; + private final boolean isHidden; + private final String hiddenText; + private final int maxSlots; + public SpellCaster(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots) { + this(slot, flavorText, isHidden, hiddenText, maxSlots, ImmutableMap.of()); + } - public SpellCaster(Integer slot, String flavorText, Boolean isHidden, String hiddenText) { + public SpellCaster(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, Map spells){ this.slot = slot; this.flavorText = flavorText; this.isHidden = isHidden; this.hiddenText = hiddenText; + this.spells = ImmutableMap.copyOf(spells); + this.maxSlots = maxSlots; } @NotNull @@ -55,72 +63,63 @@ public Spell getSpell() { @Override public int getMaxSlots() { - return 1; + return maxSlots; } @Override - public int getCurrentSlot() { - return slot; + public SpellCaster setMaxSlots(int slots) { + return new SpellCaster(slot, flavorText, isHidden, hiddenText, slots, spells); } @Override - public void setCurrentSlot(int slot) { - this.slot = slot; + public int getCurrentSlot() { + return slot; } @Override - public void setSpell(Spell spell, int slot) { - this.spells.put(slot, spell); + public SpellCaster setCurrentSlot(int slot) { + return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, spells); } @Override - public void setSpell(Spell spell) { - setSpell(spell, getCurrentSlot()); + public SpellCaster setSpell(Spell spell, int slot) { + return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, Util.copyAndPut(this.spells, slot, spell)); } @Override public ParticleColor getColor(int slot) { - return this.getSpell(slot).color; + return this.getSpell(slot).color(); } @Override - public void setFlavorText(String str) { - this.flavorText = str; + public SpellCaster setFlavorText(String str) { + return new SpellCaster(slot, str, isHidden, hiddenText, maxSlots, spells); } @Override public String getSpellName(int slot) { - return this.getSpell(slot).name; + return this.getSpell(slot).name(); } @Override - public String getSpellName() { - return this.getSpellName(getCurrentSlot()); + public SpellCaster setSpellName(String name, int slot) { + var spell = this.getSpell(slot); + return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, Util.copyAndPut(this.spells, slot, new Spell(name, spell.color(), spell.sound(), new ArrayList<>(spell.unsafeList())))); } @Override - public void setSpellName(String name) { - setSpellName(name, getCurrentSlot()); - } - - @Override - public void setSpellName(String name, int slot) { - this.getSpell(slot).name = name; - } - - @Override - public void setSpellHidden(boolean hidden) { - this.isHidden = hidden; + public boolean isSpellHidden() { + return isHidden; } @Override - public boolean isSpellHidden() { - return isHidden; + public SpellCaster setHidden(boolean hidden) { + return new SpellCaster(slot, flavorText, hidden, hiddenText, maxSlots, spells); } @Override - public void setHiddenRecipe(String recipe) { - this.hiddenText = recipe; + public SpellCaster setHiddenRecipe(String recipe) { + return new SpellCaster(slot, flavorText, isHidden, recipe, maxSlots, spells); } @Override @@ -134,35 +133,27 @@ public String getFlavorText() { } @Override - public void setColor(ParticleColor color) { - setColor(color, getCurrentSlot()); - } - - @Override - public void setColor(ParticleColor color, int slot) { - this.getSpell(slot).color = color; + public SpellCaster setColor(ParticleColor color, int slot) { + var spell = this.getSpell(slot); + return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, Util.copyAndPut(this.spells, slot, new Spell(spell.name(), color, spell.sound(), new ArrayList<>(spell.unsafeList())))); } @NotNull @Override public ConfiguredSpellSound getSound(int slot) { - return this.getSpell(slot).sound; + return this.getSpell(slot).sound(); } @Override - public void setSound(ConfiguredSpellSound sound) { - this.setSound(sound, getCurrentSlot()); - } - - @Override - public void setSound(ConfiguredSpellSound sound, int slot) { - this.getSpell(slot).sound = sound; + public SpellCaster setSound(ConfiguredSpellSound sound, int slot) { + var spell = this.getSpell(slot); + return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, Util.copyAndPut(this.spells, slot, new Spell(spell.name(), spell.color(), sound, new ArrayList<>(spell.unsafeList())))); } @NotNull @Override public ParticleColor getColor() { - return this.getSpell().color; + return this.getSpell().color(); } @Override @@ -170,8 +161,11 @@ public Map getSpells() { return spells; } - @Override - public ResourceLocation getTagID() { - return ArsNouveau.prefix( "caster"); + public DataComponentType getComponentType() { + return DataComponentRegistry.SPELL_CASTER.get(); + } + + public void saveToStack(ItemStack stack){ + stack.set(this.getComponentType(), this); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java index 0c3e6d5067..2d12e38d8d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java @@ -50,7 +50,7 @@ public SpellContext(Level level,@NotNull Spell spell, @Nullable LivingEntity cas this.level = level; this.spell = spell; this.caster = caster; - this.colors = spell.color.clone(); + this.colors = spell.color().clone(); this.wrappedCaster = wrappedCaster; } @@ -88,7 +88,7 @@ public T getOrCreateAttachment(ResourceLocation i this.currentIndex++; AbstractSpellPart part = null; try { - part = getSpell().recipe.get(currentIndex - 1); + part = getSpell().get(currentIndex - 1); } catch (Throwable e) { // This can happen if a new spell context is created but does not reset the bounds. System.out.println("======="); System.out.println("Invalid spell cast found! This is a bug and should be reported!"); @@ -110,7 +110,7 @@ public T getOrCreateAttachment(ResourceLocation i */ public @NotNull SpellContext makeChildContext(){ Spell remainder = getRemainingSpell(); - for(AbstractSpellPart spellPart : remainder.recipe){ + for(AbstractSpellPart spellPart : remainder.recipe()){ if(spellPart instanceof IContextManipulator manipulator){ boolean shouldPush = manipulator.shouldPushContext(this); SpellContext newContext = manipulator.manipulate(this); @@ -128,7 +128,7 @@ public T getOrCreateAttachment(ResourceLocation i } public boolean hasNextPart() { - return spell.isValid() && !isCanceled() && !this.isDelayed() && currentIndex < spell.recipe.size(); + return spell.isValid() && !isCanceled() && !this.isDelayed() && currentIndex < spell.unsafeList().size(); } public SpellContext resetCastCounter() { @@ -203,7 +203,7 @@ public boolean setCanceled(boolean canceled, @Nullable CancelReason cancelReason this.cancelReason = cancelReason; if(isCanceled) { Spell remainder = getRemainingSpell(); - for (AbstractSpellPart spellPart : remainder.recipe) { + for (AbstractSpellPart spellPart : remainder.recipe()) { boolean keepChecking = spellPart.contextCanceled(this); if (!keepChecking) { break; @@ -242,11 +242,12 @@ public boolean isDelayed(){ * Returns a new copy of the spell with the recipe set to the remainder of the unresolved spell. */ public @NotNull Spell getRemainingSpell() { - Spell remainder = getSpell().clone(); - if (getCurrentIndex() >= getSpell().recipe.size()) - return remainder.setRecipe(new ArrayList<>()); + Spell.Mutable remainder = getSpell().clone().mutable(); + var spell = getSpell().mutable(); + if (getCurrentIndex() >= spell.recipe.size()) + return remainder.setRecipe(new ArrayList<>()).immutable(); - return remainder.setRecipe(new ArrayList<>(getSpell().recipe.subList(getCurrentIndex(), getSpell().recipe.size()))); + return remainder.setRecipe(new ArrayList<>(spell.recipe.subList(getCurrentIndex(), spell.recipe.size()))).immutable(); } public @Nullable SpellContext getPreviousContext(){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java index e20d40fb05..ea7491eed1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java @@ -56,7 +56,7 @@ public SpellResolver withSilent(boolean isSilent) { public boolean canCast(LivingEntity entity) { // Validate the spell - List validationErrors = spellValidator.validate(spell.recipe); + List validationErrors = spellValidator.validate(spell.unsafeList()); if (validationErrors.isEmpty()) { // Validation successful. We can check the player's mana now. diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/TurretSpellCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/TurretSpellCaster.java deleted file mode 100644 index 822c4d9c0d..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/TurretSpellCaster.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.hollingsworth.arsnouveau.api.spell; - -import com.hollingsworth.arsnouveau.ArsNouveau; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; - -public class TurretSpellCaster extends SpellCaster { - - public TurretSpellCaster(ItemStack stack) { - super(stack); - } - - public TurretSpellCaster(CompoundTag itemTag) { - super(itemTag); - } - - @Override - public ResourceLocation getTagID() { - return ArsNouveau.prefix( "turret_caster"); - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/CasterUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/CasterUtil.java deleted file mode 100644 index a8f489e5b1..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/CasterUtil.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.hollingsworth.arsnouveau.api.util; - -import com.hollingsworth.arsnouveau.api.item.ICasterTool; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; -import net.minecraft.world.item.ItemStack; - -public class CasterUtil { - - public static ISpellCaster getCaster(ItemStack stack) { - if (stack.getItem() instanceof ICasterTool casterTool) { - return casterTool.getSpellCaster(stack); - } - return new SpellCaster(stack); - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java index 14b665deb6..229a59c1cd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java @@ -24,9 +24,11 @@ import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import org.lwjgl.glfw.GLFW; + import java.util.*; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; @@ -40,7 +42,7 @@ public abstract class AbstractStorageTerminalScreen load(StoredItemStack key) { - return key.getStack().getTooltipLines(Minecraft.getInstance().player, getTooltipFlag()).stream().map(Component::getString).collect(Collectors.toList()); + return key.getStack().getTooltipLines(Item.TooltipContext.EMPTY, Minecraft.getInstance().player, getTooltipFlag()).stream().map(Component::getString).collect(Collectors.toList()); } }); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java index 9a26af31c8..f75b70b7ab 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.client.gui; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.api.util.StackUtil; import com.hollingsworth.arsnouveau.common.items.SpellBook; import net.minecraft.client.DeltaTracker; @@ -20,7 +20,7 @@ public static void renderOverlay(GuiGraphics graphics, DeltaTracker deltaTracker ItemStack stack = StackUtil.getHeldSpellbook(minecraft.player); if (stack != ItemStack.EMPTY && stack.getItem() instanceof SpellBook) { int offsetLeft = 10; - ISpellCaster caster = CasterUtil.getCaster(stack); + ISpellCaster caster = SpellCasterRegistry.from(stack); String renderString = caster.getCurrentSlot() + 1 + " " + caster.getSpellName(); graphics.drawString(Minecraft.getInstance().font, renderString, offsetLeft, minecraft.getWindow().getGuiScaledHeight() - 30, 0xFFFFFF); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java index 207529e78d..bb7e647b15 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java @@ -11,8 +11,6 @@ import net.minecraft.world.inventory.tooltip.TooltipComponent; import org.joml.Matrix4f; -import java.util.List; - public record SpellTooltip(ISpellCaster spellcaster, boolean showName) implements TooltipComponent { public SpellTooltip(ISpellCaster spellcaster) { @@ -35,7 +33,7 @@ public int getHeight() { @Override public int getWidth(Font pFont) { - return 4 + spellCaster.getSpell().recipe.size() * 16; + return 4 + spellCaster.getSpell().size() * 16; } @Override @@ -49,9 +47,9 @@ public void renderText(Font pFont, int pX, int pY, Matrix4f pMatrix, MultiBuffer @Override public void renderImage(Font pFont, int pX, int pY, GuiGraphics pGuiGraphics) { - List recipe = spellCaster.getSpell().recipe; - for (int i = 0, recipeSize = recipe.size(); i < recipeSize; i++) { - AbstractSpellPart part = recipe.get(i); + var spell = spellCaster.getSpell(); + for (int i = 0, recipeSize = spell.size(); i < recipeSize; i++) { + AbstractSpellPart part = spell.get(i); RenderUtils.drawSpellPart(part, pGuiGraphics, pX + i * 16, pY + (showName ? 10 : 0), 16, false); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index 4e05dd7656..83b93e24c2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -4,9 +4,9 @@ import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; import com.hollingsworth.arsnouveau.api.registry.FamiliarRegistry; import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; import com.hollingsworth.arsnouveau.api.spell.*; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.api.util.ManaUtil; import com.hollingsworth.arsnouveau.client.ClientInfo; import com.hollingsworth.arsnouveau.client.gui.Color; @@ -118,7 +118,7 @@ public GuiSpellBook(InteractionHand hand){ @Override public void init() { super.init(); - ISpellCaster caster = CasterUtil.getCaster(bookStack); + ISpellCaster caster = SpellCasterRegistry.from(bookStack); int selectedSlot = caster.getCurrentSlot(); //Crafting slots for (int i = 0; i < numLinks; i++) { @@ -393,12 +393,12 @@ public void onDocumentationClick(Button button) { } public void onColorClick(Button button) { - ParticleColor.IntWrapper color = CasterUtil.getCaster(bookStack).getColor(selectedSpellSlot).toWrapper(); + ParticleColor.IntWrapper color = SpellCasterRegistry.from(bookStack).getColor(selectedSpellSlot).toWrapper(); Minecraft.getInstance().setScreen(new GuiColorScreen(color.r, color.g, color.b, selectedSpellSlot, this.hand)); } public void onSoundsClick(Button button) { - ConfiguredSpellSound spellSound = CasterUtil.getCaster(bookStack).getSound(selectedSpellSlot); + ConfiguredSpellSound spellSound = SpellCasterRegistry.from(bookStack).getSound(selectedSpellSlot); Minecraft.getInstance().setScreen(new SoundScreen(spellSound, selectedSpellSlot, this.hand)); } @@ -437,7 +437,7 @@ public void onSlotChange(Button button) { this.selected_slot.isSelected = true; this.selectedSpellSlot = this.selected_slot.slotNum; updateCraftingSlots(this.selectedSpellSlot); - spell_name.setValue(CasterUtil.getCaster(bookStack).getSpellName(selectedSpellSlot)); + spell_name.setValue(SpellCasterRegistry.from(bookStack).getSpellName(selectedSpellSlot)); validate(); } @@ -461,11 +461,11 @@ public boolean charTyped(char pCodePoint, int pModifiers) { public void updateCraftingSlots(int bookSlot) { //Crafting slots - List recipe = CasterUtil.getCaster(bookStack).getSpell(bookSlot).recipe; + Spell recipe = SpellCasterRegistry.from(bookStack).getSpell(bookSlot); for (int i = 0; i < craftingCells.size(); i++) { CraftingButton slot = craftingCells.get(i); slot.clear(); - if (recipe != null && i < recipe.size()) { + if (i < recipe.size()) { slot.setAbstractSpellPart(recipe.get(i)); } } @@ -574,7 +574,7 @@ private int getCurrentManaCost() { for (CraftingButton button : craftingCells) { AbstractSpellPart part = button.getAbstractSpellPart(); if (part != null) { - spell.add(part); + spell = spell.add(part); } } int cost = spell.getCost() - getPlayerDiscounts(Minecraft.getInstance().player, spell, bookStack); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java index 1a02b0b6ae..91ee7a9975 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java @@ -5,9 +5,9 @@ import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; import com.hollingsworth.arsnouveau.api.registry.FamiliarRegistry; import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; import com.hollingsworth.arsnouveau.api.spell.*; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.api.util.ManaUtil; import com.hollingsworth.arsnouveau.client.ClientInfo; import com.hollingsworth.arsnouveau.client.gui.Color; @@ -126,7 +126,7 @@ public InfinityGuiSpellBook(InteractionHand hand) { @Override public void init() { super.init(); - ISpellCaster caster = CasterUtil.getCaster(bookStack); + ISpellCaster caster = SpellCasterRegistry.from(bookStack); int selectedSlot = caster.getCurrentSlot(); //Crafting slots for (int i = 0; i < numLinks; i++) { @@ -206,7 +206,7 @@ public void init() { validate(); - List recipe = CasterUtil.getCaster(bookStack).getSpell(selectedSlot).recipe; + List recipe = SpellCasterRegistry.from(bookStack).getSpell(selectedSlot).unsafeList(); spell = new ArrayList<>(recipe); //infinite spells @@ -411,12 +411,12 @@ public void onDocumentationClick(Button button) { } public void onColorClick(Button button) { - ParticleColor.IntWrapper color = CasterUtil.getCaster(bookStack).getColor(selectedSpellSlot).toWrapper(); + ParticleColor.IntWrapper color = SpellCasterRegistry.from(bookStack).getColor(selectedSpellSlot).toWrapper(); Minecraft.getInstance().setScreen(new GuiColorScreen(color.r, color.g, color.b, selectedSpellSlot, this.hand)); } public void onSoundsClick(Button button) { - ConfiguredSpellSound spellSound = CasterUtil.getCaster(bookStack).getSound(selectedSpellSlot); + ConfiguredSpellSound spellSound = SpellCasterRegistry.from(bookStack).getSound(selectedSpellSlot); Minecraft.getInstance().setScreen(new SoundScreen(spellSound, selectedSpellSlot, this.hand)); } @@ -482,8 +482,8 @@ public void onSlotChange(Button button) { this.selected_slot.isSelected = true; this.selectedSpellSlot = this.selected_slot.slotNum; updateCraftingSlots(this.selectedSpellSlot); - spell_name.setValue(CasterUtil.getCaster(bookStack).getSpellName(selectedSpellSlot)); - this.spell = CasterUtil.getCaster(bookStack).getSpell(selectedSpellSlot).recipe; + spell_name.setValue(SpellCasterRegistry.from(bookStack).getSpellName(selectedSpellSlot)); + this.spell = SpellCasterRegistry.from(bookStack).getSpell(selectedSpellSlot).recipe; updateWindowOffset(0); //includes validation } @@ -507,7 +507,7 @@ public boolean charTyped(char pCodePoint, int pModifiers) { public void updateCraftingSlots(int bookSlot) { //Crafting slots - List recipe = CasterUtil.getCaster(bookStack).getSpell(bookSlot).recipe; + List recipe = SpellCasterRegistry.from(bookStack).getSpell(bookSlot).recipe; for (int i = 0; i < craftingCells.size(); i++) { InfinityCraftingButton slot = craftingCells.get(i); slot.clear(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java index 505d3e6025..27e8c3c35d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java @@ -29,9 +29,9 @@ public class SoundScreen extends BaseBook { public SoundScreen(ConfiguredSpellSound configuredSpellSound, int slot, InteractionHand stackHand) { super(); - volume = configuredSpellSound.volume * 100; - pitch = configuredSpellSound.pitch * 100; - selectedSound = configuredSpellSound.sound; + volume = configuredSpellSound.getVolume() * 100; + pitch = configuredSpellSound.getPitch() * 100; + selectedSound = configuredSpellSound.getSound(); casterSlot = slot; this.stackHand = stackHand; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ColorPos.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ColorPos.java index 45ebd4a190..a5b3a865a1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ColorPos.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ColorPos.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.client.particle; -import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; +import com.hollingsworth.arsnouveau.api.registry.ParticleColorRegistry; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java index 3c72912a1c..1a545e8ac9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.particle.IParticleColor; -import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; +import com.hollingsworth.arsnouveau.api.registry.ParticleColorRegistry; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -163,6 +163,7 @@ public double euclideanDistance(ParticleColor color) { public ParticleColor clone() { try { ParticleColor clone = (ParticleColor) super.clone(); + return clone; } catch (CloneNotSupportedException e) { throw new AssertionError(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index 101d2d2281..95232efc67 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -330,7 +330,7 @@ public static void initItemColors(final RegisterColorHandlersEvent.Item event) { } public static int colorFromArmor(ItemStack stack) { - IPerkHolder holder = PerkUtil.getPerkHolder(stack); + IPerkHolder holder = PerkUtil.getPerkHolder(stack); if (!(holder instanceof ArmorPerkHolder armorPerkHolder)) return DyeColor.PURPLE.getTextColor(); return DyeColor.byName(armorPerkHolder.getColor(), DyeColor.PURPLE).getTextColor(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java index f0ff726442..58fc82974f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.client.renderer.item; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.items.ScryCaster; import com.mojang.blaze3d.vertex.PoseStack; @@ -46,10 +47,10 @@ public void renderRecursively(PoseStack poseStack, ScryCaster animatable, GeoBon @Override public Color getRenderColor(ScryCaster animatable, float partialTick, int packedLight) { ParticleColor color = ParticleColor.defaultParticleColor(); - if (currentItemStack.hasTag()) - if (currentItemStack.getOrCreateTag().contains("ars_nouveau:caster")) { - color = animatable.getSpellCaster(currentItemStack).getColor(); - } + var caster = SpellCasterRegistry.from(currentItemStack); + if (caster != null){ + color = caster.getColor(); + } return Color.ofRGBA(color.getRed(), color.getGreen(), color.getBlue(), 0.85f).brighter(1.2f); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java index fb1562c5c8..a864ae2529 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.client.renderer.item; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleLineData; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; @@ -39,8 +39,9 @@ public void renderRecursively(PoseStack poseStack, SpellBow animatable, GeoBone @Override public Color getRenderColor(SpellBow animatable, float partialTick, int packedLight) { ParticleColor color = ParticleColor.defaultParticleColor(); - if (currentItemStack.hasTag()) { - color = animatable.getSpellCaster(currentItemStack).getColor(); + var caster = SpellCasterRegistry.from(currentItemStack); + if (caster != null){ + color = caster.getColor(); } return Color.ofRGBA(color.getRed(), color.getGreen(), color.getBlue(), 0.75f); } @@ -63,7 +64,7 @@ public void renderByItem(ItemStack itemStack, ItemDisplayContext transformType, Vec3 laserPos = playerPos.add(right); laserPos = laserPos.add(forward); laserPos = laserPos.add(down); - ISpellCaster tool = CasterUtil.getCaster(itemStack); + ISpellCaster tool = SpellCasterRegistry.from(itemStack); int timeHeld = 72000 - Minecraft.getInstance().player.getUseItemRemainingTicks(); if (timeHeld > 0 && timeHeld != 72000) { float scaleAge = (float) ParticleUtil.inRange(0.05, 0.1); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java index 71b7b4c02e..23c4d4f2aa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.client.renderer.item; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleLineData; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; @@ -92,7 +92,7 @@ public void renderByItem(ItemStack itemStack, ItemDisplayContext transformType, Vec3 laserPos = playerPos.add(right); laserPos = laserPos.add(forward); laserPos = laserPos.add(down); - ISpellCaster tool = CasterUtil.getCaster(itemStack); + SpellCaster tool = SpellCasterRegistry.from(itemStack); if (timeHeld > 0 && timeHeld != 72000 || SpellCrossbow.isCharged(itemStack)) { @@ -114,8 +114,9 @@ public void renderByItem(ItemStack itemStack, ItemDisplayContext transformType, @Override public Color getRenderColor(SpellCrossbow animatable, float partialTick, int packedLight) { ParticleColor color = ParticleColor.defaultParticleColor(); - if (currentItemStack.hasTag()) { - color = animatable.getSpellCaster(currentItemStack).getColor(); + var caster = SpellCasterRegistry.from(currentItemStack); + if (caster != null){ + color = caster.getColor(); } return Color.ofRGBA(color.getRed(), color.getGreen(), color.getBlue(), 0.75f); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java index a174d3a642..8b2ab70871 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.client.renderer.item; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.items.EnchantersSword; import com.mojang.blaze3d.vertex.PoseStack; @@ -45,10 +46,10 @@ public void renderRecursively(PoseStack poseStack, EnchantersSword animatable, G @Override public Color getRenderColor(EnchantersSword animatable, float partialTick, int packedLight) { ParticleColor color = ParticleColor.defaultParticleColor(); - if (currentItemStack.hasTag()) - if (currentItemStack.getOrCreateTag().contains("ars_nouveau:caster")) { - color = animatable.getSpellCaster(currentItemStack).getColor(); - } + var caster = SpellCasterRegistry.from(currentItemStack); + if (caster != null){ + color = caster.getColor(); + } return Color.ofRGBA(color.getRed(), color.getGreen(), color.getBlue(), 0.75f); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java index 58ded7d076..d229b2dc70 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.client.renderer.item; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.items.Wand; import com.mojang.blaze3d.vertex.PoseStack; @@ -28,8 +29,9 @@ public void renderRecursively(PoseStack poseStack, Wand animatable, GeoBone bone @Override public Color getRenderColor(Wand animatable, float partialTick, int packedLight) { ParticleColor color = ParticleColor.defaultParticleColor(); - if (currentItemStack.hasTag()) { - color = animatable.getSpellCaster(currentItemStack).getColor(); + var caster = SpellCasterRegistry.from(currentItemStack); + if (caster != null){ + color = caster.getColor(); } return Color.ofRGBA(color.getRed(), color.getGreen(), color.getBlue(), 0.75f); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/MobJarRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/MobJarRenderer.java index ffe237c5a3..c6a99fa278 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/MobJarRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/MobJarRenderer.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.client.renderer.tile; -import com.hollingsworth.arsnouveau.api.mob_jar.JarBehaviorRegistry; +import com.hollingsworth.arsnouveau.api.registry.JarBehaviorRegistry; import com.hollingsworth.arsnouveau.client.ClientInfo; import com.hollingsworth.arsnouveau.common.block.MobJar; import com.hollingsworth.arsnouveau.common.block.tile.MobJarTile; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RuneRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RuneRenderer.java index 94bdad1d73..2c8558fa95 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RuneRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RuneRenderer.java @@ -35,7 +35,7 @@ public void renderFinal(PoseStack poseStack, RuneTile animatable, BakedGeoModel @Override public void actuallyRender(PoseStack poseStack, RuneTile animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { - ParticleColor particleColor = animatable.spell.color; + ParticleColor particleColor = animatable.spell.color(); poseStack.pushPose(); Direction direction = animatable.getBlockState().getValue(BasicSpellTurret.FACING); if (direction == Direction.UP) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java index 70d7e22df2..7aff7ac6d4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java @@ -81,7 +81,7 @@ public void onArmorTick(ItemStack stack, Level world, Player player) { IPerkHolder perkHolder = PerkUtil.getPerkHolder(stack); if (perkHolder == null) return; - for (PerkInstance instance : perkHolder.getPerkInstances()) { + for (PerkInstance instance : perkHolder.getPerkInstances(stack)) { if (instance.getPerk() instanceof ITickablePerk tickablePerk) { tickablePerk.tick(stack, world, player, instance); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java index f8b576919f..657017823f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java @@ -1,9 +1,9 @@ package com.hollingsworth.arsnouveau.common.block; import com.hollingsworth.arsnouveau.api.ANFakePlayer; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.TileCaster; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.api.util.SourceUtil; import com.hollingsworth.arsnouveau.common.block.tile.BasicSpellTurretTile; import com.hollingsworth.arsnouveau.common.block.tile.RotatingTurretTile; @@ -185,7 +185,7 @@ protected ItemInteractionResult useItemOn(ItemStack pStack, BlockState state, Le if (worldIn.isClientSide) return ItemInteractionResult.SUCCESS; ItemStack stack = player.getItemInHand(handIn); - Spell spell = CasterUtil.getCaster(stack).getSpell(); + Spell spell = SpellCasterRegistry.from(stack).getSpell(); if (!spell.isEmpty()) { if(spell.getCastMethod() == null){ PortUtil.sendMessage(player, Component.translatable("ars_nouveau.alert.turret_needs_form")); @@ -196,7 +196,7 @@ protected ItemInteractionResult useItemOn(ItemStack pStack, BlockState state, Le return ItemInteractionResult.SUCCESS; } if (worldIn.getBlockEntity(pos) instanceof BasicSpellTurretTile tile) { - tile.spellCaster.copyFromCaster(CasterUtil.getCaster(stack)); + tile.spellCaster.copyFromCaster(SpellCasterRegistry.from(stack)); tile.spellCaster.setSpell(spell.clone()); tile.updateBlock(); PortUtil.sendMessage(player, Component.translatable("ars_nouveau.alert.spell_set")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/MobJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/MobJar.java index 9f45ca5022..1e0e0cce19 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/MobJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/MobJar.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.common.block; -import com.hollingsworth.arsnouveau.api.mob_jar.JarBehaviorRegistry; +import com.hollingsworth.arsnouveau.api.registry.JarBehaviorRegistry; import com.hollingsworth.arsnouveau.common.block.tile.MobJarTile; import com.hollingsworth.arsnouveau.common.datagen.ItemTagProvider; import com.hollingsworth.arsnouveau.common.items.MobJarItem; @@ -9,7 +9,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RuneBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RuneBlock.java index 9ed1a3cb48..338ed6b6af 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RuneBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RuneBlock.java @@ -1,9 +1,9 @@ package com.hollingsworth.arsnouveau.common.block; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import com.hollingsworth.arsnouveau.api.spell.IFilter; import com.hollingsworth.arsnouveau.api.spell.Spell; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.common.block.tile.RuneTile; import com.hollingsworth.arsnouveau.common.items.RunicChalk; import com.hollingsworth.arsnouveau.common.items.SpellParchment; @@ -16,7 +16,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntitySelector; @@ -84,11 +83,11 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level } if (!(stack.getItem() instanceof SpellParchment) || worldIn.isClientSide) return ItemInteractionResult.SUCCESS; - Spell spell = CasterUtil.getCaster(stack).getSpell(); + Spell spell = SpellCasterRegistry.from(stack).getSpell(); if (spell.isEmpty()) return ItemInteractionResult.SUCCESS; - if (!(spell.recipe.get(0) instanceof MethodTouch)) { + if (!(spell.get(0) instanceof MethodTouch)) { PortUtil.sendMessage(player, Component.translatable("ars_nouveau.rune.touch")); return ItemInteractionResult.SUCCESS; } @@ -124,7 +123,7 @@ public void entityInside(BlockState state, Level worldIn, BlockPos pos, Entity e })); if (!entities.isEmpty() && worldIn.getBlockEntity(pos) instanceof RuneTile rune) { if (rune.spell != null) { - for (AbstractSpellPart part : rune.spell.recipe) { + for (AbstractSpellPart part : rune.spell.recipe()) { if ( part instanceof IFilter filter) { if (!filter.shouldResolveOnEntity(entityIn,worldIn)) { return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java index 9c79cfdda9..5edbe2404a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java @@ -1,9 +1,8 @@ package com.hollingsworth.arsnouveau.common.block.tile; import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.spell.ISpellCasterProvider; -import com.hollingsworth.arsnouveau.api.spell.TurretSpellCaster; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; @@ -22,7 +21,7 @@ public class BasicSpellTurretTile extends ModdedTile implements ITooltipProvider, GeoBlockEntity, IAnimationListener, ITickable, ISpellCasterProvider { boolean playRecoil; - public TurretSpellCaster spellCaster = new TurretSpellCaster(new CompoundTag()); + public SpellCaster spellCaster = new SpellCaster(new CompoundTag()); public BasicSpellTurretTile(BlockEntityType p_i48289_1_, BlockPos pos, BlockState state) { super(p_i48289_1_, pos, state); @@ -84,13 +83,4 @@ public void startAnimation(int arg) { this.playRecoil = true; } - @Override - public ISpellCaster getSpellCaster() { - return spellCaster; - } - - @Override - public ISpellCaster getSpellCaster(CompoundTag tag) { - return spellCaster; - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java index b426654968..907e098674 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java @@ -79,7 +79,7 @@ public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { if (!itemstack.isEmpty()) { CompoundTag compoundnbt = new CompoundTag(); compoundnbt.putInt("Slot", i); - itemstack.save(compoundnbt); + compoundnbt.put("item", itemstack.save(pRegistries)); listnbt.add(compoundnbt); } } @@ -98,7 +98,7 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis CompoundTag compoundnbt = listnbt.getCompound(i); int j = compoundnbt.getInt("Slot"); if (j >= 0 && j < craftMatrix.getContainerSize()) { - craftMatrix.setItem(j, ItemStack.parseOptional(pRegistries, compoundnbt)); + craftMatrix.setItem(j, ItemStack.parse(pRegistries, compoundnbt.get("item")).orElse(ItemStack.EMPTY)); } } reading = false; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/LightTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/LightTile.java index 21cad69c61..a35997018f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/LightTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/LightTile.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.common.block.tile; -import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; +import com.hollingsworth.arsnouveau.api.registry.ParticleColorRegistry; import com.hollingsworth.arsnouveau.api.util.IWololoable; import com.hollingsworth.arsnouveau.client.particle.GlowParticleData; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MageBlockTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MageBlockTile.java index 586678093c..2fd228205a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MageBlockTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MageBlockTile.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.block.tile; import com.hollingsworth.arsnouveau.api.entity.IDispellable; -import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; +import com.hollingsworth.arsnouveau.api.registry.ParticleColorRegistry; import com.hollingsworth.arsnouveau.api.util.IWololoable; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.block.ITickable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java index aa7b2282cd..d8bb950603 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java @@ -3,7 +3,7 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.api.entity.IDispellable; import com.hollingsworth.arsnouveau.api.mob_jar.JarBehavior; -import com.hollingsworth.arsnouveau.api.mob_jar.JarBehaviorRegistry; +import com.hollingsworth.arsnouveau.api.registry.JarBehaviorRegistry; import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.block.MobJar; import com.hollingsworth.arsnouveau.common.lib.EntityTags; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java index 3c813d921d..8f7a889d23 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java @@ -6,7 +6,7 @@ import com.hollingsworth.arsnouveau.api.item.IWandable; import com.hollingsworth.arsnouveau.api.item.inv.IInvProvider; import com.hollingsworth.arsnouveau.api.item.inv.InventoryManager; -import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; +import com.hollingsworth.arsnouveau.api.registry.ParticleColorRegistry; import com.hollingsworth.arsnouveau.api.registry.RitualRegistry; import com.hollingsworth.arsnouveau.api.ritual.AbstractRitual; import com.hollingsworth.arsnouveau.api.spell.ILightable; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java index b6241b7c9b..fda54cf431 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java @@ -55,14 +55,14 @@ public RuneTile(BlockPos pos, BlockState state) { } public void setSpell(Spell spell) { - this.spell = spell; + this.spell = spell.clone(); updateBlock(); } public void castSpell(Entity entity) { if (entity == null) return; - if (!this.isCharged || spell.isEmpty() || !(level instanceof ServerLevel) || !(spell.recipe.get(0) instanceof MethodTouch)) + if (!this.isCharged || spell.isEmpty() || !(level instanceof ServerLevel) || !(spell.get(0) instanceof MethodTouch)) return; if (!this.isTemporary && this.disabled) return; try { @@ -161,12 +161,12 @@ public void getTooltip(List tooltip) { @Override public void setColor(ParticleColor color) { - spell.withColor(color); + this.spell = spell.withColor(color); updateBlock(); } @Override public ParticleColor getColor() { - return spell.color; + return spell.color(); } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SconceTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SconceTile.java index 8696e982f5..136b6c544a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SconceTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SconceTile.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.block.tile; import com.hollingsworth.arsnouveau.api.entity.IDispellable; -import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; +import com.hollingsworth.arsnouveau.api.registry.ParticleColorRegistry; import com.hollingsworth.arsnouveau.api.spell.ILightable; import com.hollingsworth.arsnouveau.api.spell.SpellContext; import com.hollingsworth.arsnouveau.api.spell.SpellStats; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java index 77ba1608c1..bb23dd055b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.api.event.SpellCastEvent; import com.hollingsworth.arsnouveau.api.event.SpellResolveEvent; import com.hollingsworth.arsnouveau.api.item.IWandable; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.api.util.BlockUtil; @@ -93,16 +94,16 @@ public void onSignal(Vec3 pos, Spell spell){ if(!this.parchment.isEmpty()){ // Compare spell to parchment if(this.parchment.getItem() instanceof SpellParchment spellParchment){ - Spell listeningSpell = spellParchment.getSpellCaster(parchment.getOrCreateTag()).getSpell(); - List spellParts = listeningSpell.recipe.stream().filter(Objects::nonNull).toList(); - List spellParts1 = spell.recipe.stream().filter(Objects::nonNull).toList(); + Spell listeningSpell = SpellCasterRegistry.from(parchment).getSpell(); + List spellParts = listeningSpell.unsafeList().stream().filter(Objects::nonNull).toList(); + List spellParts1 = spell.unsafeList().stream().filter(Objects::nonNull).toList(); if(!spellParts.equals(spellParts1)){ return; } } str = 15; }else{ - str = spell.recipe.size(); + str = spell.size(); } outputDuration = 40; this.outputStrength = str; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java index 446000617e..074b1ed511 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java @@ -2,7 +2,10 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.api.item.IWandable; -import com.hollingsworth.arsnouveau.api.recipe.*; +import com.hollingsworth.arsnouveau.api.recipe.CraftingManager; +import com.hollingsworth.arsnouveau.api.recipe.IRecipeWrapper; +import com.hollingsworth.arsnouveau.api.recipe.MultiRecipeWrapper; +import com.hollingsworth.arsnouveau.api.recipe.PotionCraftingManager; import com.hollingsworth.arsnouveau.api.util.SourceUtil; import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; @@ -38,6 +41,7 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.common.crafting.DataComponentIngredient; import net.neoforged.neoforge.items.IItemHandler; import org.jetbrains.annotations.Nullable; @@ -167,11 +171,10 @@ public void rotateCraft(){ IRecipeWrapper.InstructionsForRecipe instructions = recipeWrapper.canCraft(count, level, worldPosition); if(instructions == null) return; - if (!recipeWrapper.isEmpty() && instructions.recipe().recipeIngredients.get(0) instanceof PotionIngredient potionIngred) { - + if (!recipeWrapper.isEmpty() && instructions.recipe().recipeIngredients.get(0).getCustomIngredient() instanceof DataComponentIngredient custom) { Ingredient itemIngred = instructions.recipe().recipeIngredients.get(1); List needed = new ArrayList<>(Arrays.asList(itemIngred.getItems())); - PotionContents potionNeeded = PotionUtil.getContents(potionIngred.getStack()); + PotionContents potionNeeded = custom.getItems().toList().get(0).get(DataComponents.POTION_CONTENTS); PotionContents potionOutput = PotionUtil.getContents(instructions.recipe().outputStack); boolean foundInput = potionNeeded.is(Potions.WATER) || findNeededPotion(potionNeeded, 300, level, worldPosition) != null; boolean foundRoomForOutput = findPotionStorage(level, worldPosition, potionOutput) != null; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java index d4d298b772..36579c5a9a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java @@ -1,30 +1,28 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; -import com.hollingsworth.arsnouveau.api.registry.SpellSoundRegistry; +import com.hollingsworth.arsnouveau.api.registry.ParticleColorRegistry; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; -import com.hollingsworth.arsnouveau.api.sound.SpellSound; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.spell.Spell; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.ChatFormatting; import net.minecraft.core.HolderLookup; import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -33,34 +31,10 @@ import net.minecraft.world.item.crafting.SingleRecipeInput; import net.minecraft.world.level.Level; -import javax.annotation.Nullable; -import java.util.ArrayList; import java.util.List; -import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; +public record CasterTomeData(String name, List spell, ResourceLocation tomeType, String flavorText, ParticleColor particleColor, ConfiguredSpellSound sound) implements SpecialSingleInputRecipe { -public class CasterTomeData implements SpecialSingleInputRecipe { - - String name; - List spell; - ResourceLocation type; - String flavorText; - public ParticleColor particleColor; - ConfiguredSpellSound sound; - - public CasterTomeData(String name, - List spell, - ResourceLocation type, - String flavorText, - ConfiguredSpellSound sound, - ParticleColor color) { - this.name = name; - this.spell = spell; - this.type = type; - this.flavorText = flavorText; - this.particleColor = color; - this.sound = sound; - } public CasterTomeData(String name, @@ -68,12 +42,12 @@ public CasterTomeData(String name, ResourceLocation type, String flavorText, CompoundTag particleColor, ConfiguredSpellSound sound) { - this(name, spell, type, flavorText, sound, ParticleColorRegistry.from(particleColor)); + this(name, spell, type, flavorText, ParticleColorRegistry.from(particleColor), sound); } public static ItemStack makeTome(Item tome, String name, Spell spell, String flavorText) { ItemStack stack = tome.getDefaultInstance(); - ISpellCaster spellCaster = CasterUtil.getCaster(stack); + SpellCaster spellCaster = SpellCasterRegistry.from(stack); spellCaster.setSpell(spell); stack.set(DataComponents.CUSTOM_NAME, Component.literal(name).setStyle(Style.EMPTY.withColor(ChatFormatting.DARK_PURPLE).withItalic(true))); spellCaster.setFlavorText(flavorText); @@ -87,10 +61,10 @@ public boolean matches(SingleRecipeInput p_346065_, Level p_345375_) { @Override public ItemStack getResultItem(HolderLookup.Provider p_267052_) { - Item tomeType = BuiltInRegistries.ITEM.get(this.type); + Item tomeType = BuiltInRegistries.ITEM.get(this.tomeType); if (tomeType == Items.AIR) tomeType = ItemsRegistry.CASTER_TOME.asItem(); - Spell spell = new Spell(); + var spell = new Spell().mutable(); spell.name = this.name; if (this.particleColor != null) spell.color = this.particleColor; @@ -100,7 +74,7 @@ public ItemStack getResultItem(HolderLookup.Provider p_267052_) { spell.recipe.add(part); } spell.sound = sound; - return makeTome(tomeType, name, spell, flavorText); + return makeTome(tomeType, name, spell.immutable(), flavorText); } @Override @@ -113,74 +87,26 @@ public RecipeType getType() { return RecipeRegistry.CASTER_TOME_TYPE.get(); } - - public JsonElement toJson() { - JsonObject jsonobject = new JsonObject(); - jsonobject.addProperty("type", "ars_nouveau:caster_tome"); - jsonobject.addProperty("tome_type", type.toString()); - jsonobject.addProperty("name", name); - jsonobject.addProperty("flavour_text", flavorText); - JsonObject color = new JsonObject(); - CompoundTag colorData = particleColor.serialize(); - color.addProperty("type", colorData.getString("type")); - color.addProperty("red", colorData.getInt("r")); - color.addProperty("green", colorData.getInt("g")); - color.addProperty("blue", colorData.getInt("b")); - jsonobject.add("color", color); - JsonArray array = new JsonArray(); - for (ResourceLocation part : spell) { - array.add(part.toString()); - } - jsonobject.add("spell", array); - JsonObject object = new JsonObject(); - object.addProperty("family", sound.sound == null ? "default" : sound.sound.getId().toString()); - object.addProperty("pitch", sound.pitch); - object.addProperty("volume", sound.volume); - jsonobject.add("sound", object); - return jsonobject; - } - public static class Serializer implements RecipeSerializer { - @Override - public CasterTomeData fromJson(ResourceLocation recipeId, JsonObject json) { - ResourceLocation type = json.has("tome_type") ? ResourceLocation.tryParse(json.get("tome_type").getAsString()) : ItemsRegistry.CASTER_TOME.registryObject.getId(); - String name = json.get("name").getAsString(); - String flavourText = json.has("flavour_text") ? json.get("flavour_text").getAsString() : ""; - JsonObject color = json.has("color") ? json.get("color").getAsJsonObject() : null; - CompoundTag colorData = new CompoundTag(); - if (color != null) { - colorData.putString("type", color.get("type").getAsString()); - colorData.putInt("r", color.get("red").getAsInt()); - colorData.putInt("g", color.get("green").getAsInt()); - colorData.putInt("b", color.get("blue").getAsInt()); - } - JsonArray spell = GsonHelper.getAsJsonArray(json, "spell"); - List parsedSpell = new ArrayList<>(); - for (JsonElement e : spell) { - ResourceLocation part = ResourceLocation.tryParse(e.getAsString()); - parsedSpell.add(part); - } - ConfiguredSpellSound sound = ConfiguredSpellSound.DEFAULT; - if (json.has("sound")){ - JsonObject object = json.getAsJsonObject("sound"); - SpellSound family = SpellSoundRegistry.getSpellSoundsRegistry().get(ResourceLocation.tryParse(object.get("family").getAsString())); - sound = new ConfiguredSpellSound(family, object.get("volume").getAsFloat(), object.get("pitch").getAsFloat()); - } - return new CasterTomeData(recipeId, name, parsedSpell, type, flavourText, colorData, sound); - } + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Codec.STRING.fieldOf("name").forGetter(CasterTomeData::name), + Codec.list(ResourceLocation.CODEC).fieldOf("spell").forGetter(CasterTomeData::spell), + ResourceLocation.CODEC.fieldOf("tome_type").forGetter(CasterTomeData::tomeType), + Codec.STRING.fieldOf("flavour_text").forGetter(CasterTomeData::flavorText), + ParticleColor.CODEC.fieldOf("color").forGetter(CasterTomeData::particleColor), + ConfiguredSpellSound.CODEC.fieldOf("sound").forGetter(CasterTomeData::sound) + ).apply(instance, CasterTomeData::new)); + public static StreamCodec STREAM = CheatSerializer.create(CODEC); @Override - public void toNetwork(FriendlyByteBuf buf, CasterTomeData recipe) { - buf.writeItemStack(recipe.getResultItem(null), false); + public MapCodec codec() { + return CODEC; } - @Nullable @Override - public CasterTomeData fromNetwork(ResourceLocation recipeId, FriendlyByteBuf buffer) { - ItemStack itemStack = buffer.readItem(); - ISpellCaster caster = CasterUtil.getCaster(itemStack); - return new CasterTomeData(recipeId, caster.getSpellName(), caster.getSpell().recipe.stream().map(AbstractSpellPart::getRegistryName).toList(), getRegistryName(itemStack.getItem()), caster.getFlavorText(), caster.getColor().serialize(), caster.getCurrentSound()); + public StreamCodec streamCodec() { + return STREAM; } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java index 72d8958eb6..04a341dfd0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java @@ -1,6 +1,9 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; +import com.hollingsworth.arsnouveau.api.potion.IPotionProvider; +import com.hollingsworth.arsnouveau.api.registry.PotionProviderRegistry; import com.hollingsworth.arsnouveau.common.items.PotionFlask; +import com.hollingsworth.arsnouveau.common.util.PotionUtil; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import net.minecraft.core.HolderLookup; import net.minecraft.core.NonNullList; @@ -28,7 +31,8 @@ public ItemStack assemble(final CraftingInput inv, HolderLookup.Provider p_26679 final ItemStack stack = inv.getItem(i); if (stack.getItem() instanceof PotionFlask flask) { flaskPotionStack = stack.copy(); - if(flask.isMax(stack)) + IPotionProvider provider = PotionProviderRegistry.from(flaskPotionStack); + if(provider == null || provider.roomLeft(flaskPotionStack) <= 0) return ItemStack.EMPTY; } if(stack.getItem() instanceof PotionItem){ @@ -37,16 +41,18 @@ public ItemStack assemble(final CraftingInput inv, HolderLookup.Provider p_26679 } if(flaskPotionStack.isEmpty() || potionStack.isEmpty()) return ItemStack.EMPTY; - PotionFlask.FlaskData flaskData = new PotionFlask.FlaskData(flaskPotionStack); + IPotionProvider provider = PotionProviderRegistry.from(flaskPotionStack); PotionContents potionData = potionStack.get(DataComponents.POTION_CONTENTS); - if(flaskData.getCount() <= 0){ - flaskData.setPotion(potionData); - flaskData.setCount(1); - return flaskPotionStack.copy(); - } - if(flaskData.getPotion().areSameEffects(potionData)){ - flaskData.setCount(flaskData.getCount() + 1); - return flaskPotionStack.copy(); + if(provider == null) + return ItemStack.EMPTY; + int count = provider.usesRemaining(flaskPotionStack); + ItemStack copyStack = flaskPotionStack.copy(); + if(count <= 0){ + provider.setData(potionData, 1, provider.maxUses(flaskPotionStack), copyStack); + return copyStack; + }else if(PotionUtil.arePotionContentsEqual(potionData, provider.getPotionData(potionStack))){ + provider.setData(potionData, count + 1, provider.maxUses(flaskPotionStack), copyStack); + return copyStack; } return ItemStack.EMPTY; // Return the modified output } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java index bdfe9beb71..159af6062a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java @@ -1,9 +1,9 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.common.items.SpellParchment; -import com.hollingsworth.arsnouveau.common.spell.casters.ReactiveCaster; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import com.mojang.serialization.Codec; @@ -32,17 +32,17 @@ public ReactiveEnchantmentRecipe(List pedestalItems, int sourceCost) public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider lookup) { ItemStack result = super.assemble(input, lookup); ItemStack parchment = getParchment(input.pedestals()); - ISpellCaster parchmentCaster = CasterUtil.getCaster(parchment); - ReactiveCaster reactiveCaster = new ReactiveCaster(result); - reactiveCaster.setColor(parchmentCaster.getColor()); - reactiveCaster.setSpell(parchmentCaster.getSpell()); + SpellCaster parchmentCaster = SpellCasterRegistry.from(parchment); + result.set(DataComponentRegistry.SPELL_CASTER, new SpellCaster(0, null, false, null, 1) + .setColor(parchmentCaster.getColor()) + .setSpell(parchmentCaster.getSpell())); return result; } @Override public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.annotations.Nullable Player player) { ItemStack parchment = getParchment(input.pedestals()); - return super.matches(input, level, player) && !parchment.isEmpty() && !CasterUtil.getCaster(parchment).getSpell().isEmpty(); + return super.matches(input, level, player) && !parchment.isEmpty() && !SpellCasterRegistry.from(parchment).getSpell().isEmpty(); } public static@NotNull ItemStack getParchment(List pedestalItems) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java index c99e742246..ff4866697c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.common.spell.casters.ReactiveCaster; import com.hollingsworth.arsnouveau.common.util.HolderHelper; import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; @@ -47,14 +47,14 @@ public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.a ItemEnchantments enchantments = input.catalyst().get(DataComponents.ENCHANTMENTS); int level1 = enchantments.getLevel(HolderHelper.unwrap(level, EnchantmentRegistry.REACTIVE_ENCHANTMENT)); ItemStack parchment = getParchment(input.pedestals()); - return !parchment.isEmpty() && !CasterUtil.getCaster(parchment).getSpell().isEmpty() && level1 > 0 && super.matches(input, level, player); + return !parchment.isEmpty() && !SpellCasterRegistry.from(parchment).getSpell().isEmpty() && level1 > 0 && super.matches(input, level, player); } @Override public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider p_346030_) { ItemStack parchment = getParchment(input.pedestals()); - ISpellCaster caster = CasterUtil.getCaster(parchment); + ISpellCaster caster = SpellCasterRegistry.from(parchment); ItemStack result = input.catalyst().copy(); ReactiveCaster reactiveCaster = new ReactiveCaster(result); reactiveCaster.setSpell(caster.getSpell()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java index cfa6936acc..7ce269b08f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java @@ -13,6 +13,7 @@ import com.hollingsworth.arsnouveau.common.spell.method.MethodUnderfoot; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.SoundRegistry; +import com.mojang.serialization.JsonOps; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; import net.minecraft.nbt.CompoundTag; @@ -256,7 +257,7 @@ public void collectJsons(CachedOutput pOutput) { for (CasterRecipeWrapper g : tomes) { Path path = getRecipePath(output, g.id().getPath()); - saveStable(pOutput, g.toJson(), path); + saveStable(pOutput, CasterTomeData.Serializer.CODEC.codec().encodeStart(JsonOps.INSTANCE, g.toData()).getOrThrow(), path); } } @@ -270,7 +271,7 @@ public CasterRecipeWrapper buildTome(String id, String name, Spell spell, String spell.serializeRecipe(), ItemsRegistry.CASTER_TOME.registryObject.getId(), flavorText, - spell.color.serialize(), spell.sound); + spell.color().serialize(), spell.sound()); } public CasterRecipeWrapper buildTome(String id, String name, Spell spell, String flavorText, ParticleColor color) { @@ -279,7 +280,7 @@ public CasterRecipeWrapper buildTome(String id, String name, Spell spell, String spell.serializeRecipe(), ItemsRegistry.CASTER_TOME.registryObject.getId(), flavorText, - color.serialize(), spell.sound); + color.serialize(), spell.sound()); } /** @@ -290,7 +291,7 @@ public String getName() { return "Ars Nouveau Caster Tomes Datagen"; } - public static record CasterRecipeWrapper(ResourceLocation id, String name, List spell, ResourceLocation tomeType, String flavorText, CompoundTag particleColor, ConfiguredSpellSound sound) { + public record CasterRecipeWrapper(ResourceLocation id, String name, List spell, ResourceLocation tomeType, String flavorText, CompoundTag particleColor, ConfiguredSpellSound sound) { public CasterTomeData toData() { return new CasterTomeData(name, spell, tomeType, flavorText, particleColor, sound); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java index 320aab56c6..96ee85a63d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java @@ -213,11 +213,11 @@ public void addEntries() { addPage(new PatchouliBuilder(EQUIPMENT, "reactive_enchantment") .withIcon(Items.ENCHANTED_BOOK) .withLocalizedText() - .withPage(new EnchantingPage("ars_nouveau:" + getRegistryName(EnchantmentRegistry.REACTIVE_ENCHANTMENT.get()).getPath() + "_" + 1)) + .withPage(new EnchantingPage("ars_nouveau:" + EnchantmentRegistry.REACTIVE_ENCHANTMENT.location().getPath() + "_" + 1)) .withLocalizedText() - .withPage(new EnchantingPage("ars_nouveau:" + getRegistryName(EnchantmentRegistry.REACTIVE_ENCHANTMENT.get()).getPath() + "_" + 2)) - .withPage(new EnchantingPage("ars_nouveau:" + getRegistryName(EnchantmentRegistry.REACTIVE_ENCHANTMENT.get()).getPath() + "_" + 3)) - .withPage(new EnchantingPage("ars_nouveau:" + getRegistryName(EnchantmentRegistry.REACTIVE_ENCHANTMENT.get()).getPath() + "_" + 4)) + .withPage(new EnchantingPage("ars_nouveau:" + EnchantmentRegistry.REACTIVE_ENCHANTMENT.location().getPath() + "_" + 2)) + .withPage(new EnchantingPage("ars_nouveau:" + EnchantmentRegistry.REACTIVE_ENCHANTMENT.location().getPath() + "_" + 3)) + .withPage(new EnchantingPage("ars_nouveau:" + EnchantmentRegistry.REACTIVE_ENCHANTMENT.location().getPath() + "_" + 4)) .withLocalizedText() .withPage(new ApparatusTextPage("ars_nouveau:spell_write")), getPath(EQUIPMENT, "reactive_enchantment")); @@ -750,9 +750,9 @@ public void addEnchantmentPage(ResourceKey enchantment) { PatchouliBuilder builder = new PatchouliBuilder(ENCHANTMENTS, enchantment.getDescriptionId()) .withIcon(getRegistryName(Items.ENCHANTED_BOOK).toString()); for (int i = enchantment.getMinLevel(); i <= enchantment.getMaxLevel(); i++) { - builder.withPage(new EnchantingPage("ars_nouveau:" + getRegistryName(enchantment).getPath() + "_" + i)); + builder.withPage(new EnchantingPage("ars_nouveau:" + enchantment.location().getPath() + "_" + i)); } - this.pages.add(new PatchouliPage(builder, this.output.resolve("assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/" + getRegistryName(enchantment).getPath() + ".json"))); + this.pages.add(new PatchouliPage(builder, this.output.resolve("assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/" + enchantment.location().getPath() + ".json"))); } public void addPerkPage(IPerk perk){ @@ -792,8 +792,8 @@ public void addPerkPage(IPerk perk){ Enchantments.SWEEPING_EDGE, Enchantments.THORNS, Enchantments.UNBREAKING, - EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.getKey(), - EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.getKey() + EnchantmentRegistry.MANA_BOOST_ENCHANTMENT, + EnchantmentRegistry.MANA_REGEN_ENCHANTMENT ); @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimHeadSummon.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimHeadSummon.java index 1b409d02bc..dcfb450ac8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimHeadSummon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimHeadSummon.java @@ -2,16 +2,12 @@ import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.TamableAnimal; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.PlayerHeadItem; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; @@ -63,8 +59,9 @@ public void readAdditionalSaveData(CompoundTag pCompound) { public ItemStack getStack() { Item item = getBlockState().getBlock().asItem(); ItemStack stack = item.getDefaultInstance(); + //TODO: fix head getStack if (item instanceof PlayerHeadItem) { - stack.setTag(this.head_data); +// stack.set(DataComponents.PROFILE, head_data); } return stack; } @@ -75,27 +72,28 @@ public static CompoundTag getHeadTagFromName(String playerName){ return compoundtag; } - /** - * Called by the server when constructing the spawn packet. - * Data should be added to the provided stream. - * - * @param buffer The packet data stream - */ - @Override - public void writeSpawnData(FriendlyByteBuf buffer) { - buffer.writeInt(Block.getId(blockState)); - buffer.writeNbt(head_data); - } - - /** - * Called by the client when it receives a Entity spawn packet. - * Data should be read out of the stream in the same way as it was written. - * - * @param additionalData The packet data stream - */ - @Override - public void readSpawnData(FriendlyByteBuf additionalData) { - blockState = Block.stateById(additionalData.readInt()); - head_data = additionalData.readNbt(); - } + // TODO: restore head data sync +// /** +// * Called by the server when constructing the spawn packet. +// * Data should be added to the provided stream. +// * +// * @param buffer The packet data stream +// */ +// @Override +// public void writeSpawnData(FriendlyByteBuf buffer) { +// buffer.writeInt(Block.getId(blockState)); +// buffer.writeNbt(head_data); +// } +// +// /** +// * Called by the client when it receives a Entity spawn packet. +// * Data should be read out of the stream in the same way as it was written. +// * +// * @param additionalData The packet data stream +// */ +// @Override +// public void readSpawnData(FriendlyByteBuf additionalData) { +// blockState = Block.stateById(additionalData.readInt()); +// head_data = additionalData.readNbt(); +// } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/ColoredProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/ColoredProjectile.java index 218571974b..3823b10d7c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/ColoredProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/ColoredProjectile.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.common.entity; -import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; +import com.hollingsworth.arsnouveau.api.registry.ParticleColorRegistry; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.RainbowParticleColor; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java index 316d299f5c..43b2f98d41 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java @@ -11,9 +11,9 @@ import com.hollingsworth.arsnouveau.common.spell.rewind.BlockToEntityRewind; import com.hollingsworth.arsnouveau.common.spell.rewind.EntityToBlockRewind; import com.hollingsworth.arsnouveau.common.spell.rewind.RewindAttachment; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; -import com.mojang.authlib.GameProfile; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import net.minecraft.CrashReportCategory; import net.minecraft.core.BlockPos; @@ -34,6 +34,7 @@ import net.minecraft.world.entity.*; import net.minecraft.world.entity.item.FallingBlockEntity; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ResolvableProfile; import net.minecraft.world.item.context.DirectionalPlaceContext; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.GameRules; @@ -258,9 +259,9 @@ public BlockPos groundBlock(boolean ignoreAir) { if (blockentity != null) { try { - blockentity.load(this.blockData); + blockentity.loadWithComponents(this.blockData, level.registryAccess()); if(blockentity instanceof SkullBlockEntity sk && this.blockData != null && this.blockData.contains("SkullOwner")){ - sk.setOwner(new GameProfile(null, this.blockData.getString("SkullOwner"))); + sk.setOwner(ANCodecs.decode(ResolvableProfile.CODEC, this.blockData.getCompound("SkullOwner"))); } } catch (Exception exception) { exception.printStackTrace(); @@ -279,9 +280,10 @@ public BlockPos groundBlock(boolean ignoreAir) { this.discard(); this.callOnBrokenAfterFall(block, blockpos); ItemStack itemstack = new ItemStack(block); - if(this.blockData != null && !itemstack.hasTag() && this.getBlockState().is(Blocks.PLAYER_HEAD)){ - itemstack.setTag(this.blockData); - } + //todo: restore player head +// if(this.blockData != null && !itemstack.hasTag() && this.getBlockState().is(Blocks.PLAYER_HEAD)){ +// itemstack.setTag(this.blockData); +// } this.spawnAtLocation(itemstack); return null; } @@ -290,9 +292,10 @@ public BlockPos groundBlock(boolean ignoreAir) { if (this.dropItem && this.level.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { this.callOnBrokenAfterFall(block, blockpos); ItemStack itemstack = new ItemStack(block); - if(this.blockData != null && !itemstack.hasTag() && this.getBlockState().is(Blocks.PLAYER_HEAD)){ - itemstack.setTag(this.blockData); - } + //todo: restore player head +// if(this.blockData != null && !itemstack.hasTag() && this.getBlockState().is(Blocks.PLAYER_HEAD)){ +// itemstack.setTag(this.blockData); +// } this.spawnAtLocation(itemstack); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java index 22977c138f..446d858be1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java @@ -2,14 +2,12 @@ import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.PlayerHeadItem; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.Nullable; @@ -31,11 +29,13 @@ public EntityType getType() { return ModEntities.ENCHANTED_HEAD_BLOCK.get(); } + //todo: restore player data packet @Nullable @Override public ItemEntity spawnAtLocation(ItemStack pStack) { - if (pStack.getItem() instanceof PlayerHeadItem) - pStack.setTag(blockData); + if (pStack.getItem() instanceof PlayerHeadItem) { +// pStack.setTag(blockData); + } return this.spawnAtLocation(pStack, 0.0F); } @@ -43,34 +43,34 @@ public ItemStack getStack() { Item item = getBlockState().getBlock().asItem(); ItemStack stack = item.getDefaultInstance(); if (item instanceof PlayerHeadItem){ - stack.setTag(this.blockData); +// stack.setTag(this.blockData); } return stack; } - - /** - * Called by the server when constructing the spawn packet. - * Data should be added to the provided stream. - * - * @param buffer The packet data stream - */ - @Override - public void writeSpawnData(FriendlyByteBuf buffer) { - buffer.writeInt(Block.getId(blockState)); - buffer.writeNbt(blockData); - } - - /** - * Called by the client when it receives a Entity spawn packet. - * Data should be read out of the stream in the same way as it was written. - * - * @param additionalData The packet data stream - */ - @Override - public void readSpawnData(FriendlyByteBuf additionalData) { - blockState = Block.stateById(additionalData.readInt()); - blockData = additionalData.readNbt(); - } +// +// /** +// * Called by the server when constructing the spawn packet. +// * Data should be added to the provided stream. +// * +// * @param buffer The packet data stream +// */ +// @Override +// public void writeSpawnData(FriendlyByteBuf buffer) { +// buffer.writeInt(Block.getId(blockState)); +// buffer.writeNbt(blockData); +// } +// +// /** +// * Called by the client when it receives a Entity spawn packet. +// * Data should be read out of the stream in the same way as it was written. +// * +// * @param additionalData The packet data stream +// */ +// @Override +// public void readSpawnData(FriendlyByteBuf additionalData) { +// blockState = Block.stateById(additionalData.readInt()); +// blockData = additionalData.readNbt(); +// } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java index 5ca2806505..849d1c4173 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java @@ -18,7 +18,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.Arrow; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; @@ -250,11 +249,6 @@ protected void onHitEntity(EntityHitResult p_213868_1_) { } } - if (!this.level.isClientSide && entity1 instanceof LivingEntity) { - EnchantmentHelper.doPostHurtEffects(livingentity, entity1); - EnchantmentHelper.doPostDamageEffects((LivingEntity) entity1, livingentity); - } - this.doPostHurtEffects(livingentity); } } else { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java index 2775e42255..9c6d74280b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java @@ -76,7 +76,7 @@ public double getManaReserveModifier() { @Override public void setCustomName(@Nullable Component pName) { super.setCustomName(pName); - persistentData.name = pName; + persistentData = persistentData.setName(pName); syncTag(); } @@ -189,7 +189,7 @@ public void setCosmeticItem(ItemStack stack, boolean shouldDrop) { if (!this.entityData.get(COSMETIC).isEmpty() && shouldDrop) this.level().addFreshEntity(new ItemEntity(this.level(), this.getX(), this.getY(), this.getZ(), this.entityData.get(COSMETIC))); this.entityData.set(COSMETIC, stack); - this.persistentData.cosmetic = stack; + this.persistentData = persistentData.setCosmetic(stack); syncTag(); } @@ -273,7 +273,7 @@ public void setColor(DyeColor color) { public void setColor(String color) { this.entityData.set(COLOR, color); - this.getPersistentFamiliarData().color = color; + persistentData = persistentData.setColor(color); syncTag(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java index 5631e621e9..038c3c4491 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java @@ -53,7 +53,7 @@ public void onCostCalc(SpellCostCalcEvent event) { if (getOwner() != null && getOwner().equals(event.context.getUnwrappedCaster())) { int discount = 0; Spell spell = event.context.getSpell(); - for (AbstractSpellPart part : spell.recipe) { + for (AbstractSpellPart part : spell.recipe()) { if (SpellSchools.ELEMENTAL_EARTH.isPartOfSchool(part)) { discount += part.getCastingCost() * .5; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java index 2000867de6..583c64da1a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java @@ -57,7 +57,7 @@ public static void regenCalc(ManaRegenCalcEvent e) { @SubscribeEvent public static void spellResolve(SpellResolveEvent.Post e) { SpellSensorTile.onSpellResolve(e); - if (e.spell.recipe.contains(EffectInvisibility.INSTANCE) && e.rayTraceResult instanceof BlockHitResult blockHitResult) { + if (e.spell.unsafeList().contains(EffectInvisibility.INSTANCE) && e.rayTraceResult instanceof BlockHitResult blockHitResult) { if (e.world.getBlockEntity(blockHitResult.getBlockPos()) instanceof GhostWeaveTile ghostWeaveTile) { ghostWeaveTile.setVisibility(true); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index ab04faa705..3917a21247 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -107,12 +107,10 @@ protected void apply(Object pObject, ResourceManager pResourceManager, ProfilerF boolean expired; @Override - public void tickEvent(ServerTickEvent serverTickEvent) { - - CasterTomeRegistry.reloadTomeData(serverTickEvent.getServer().getRecipeManager(), serverTickEvent.getServer().getLevel(Level.OVERWORLD)); - BuddingConversionRegistry.reloadBuddingConversionRecipes(serverTickEvent.getServer().getRecipeManager()); - ScryRitualRegistry.reloadScryRitualRecipes(serverTickEvent.getServer().getRecipeManager()); - + public void tick(ServerTickEvent serverTickEvent) { + CasterTomeRegistry.reloadTomeData(serverTickEvent.getServer().getRecipeManager(), serverTickEvent.getServer().getLevel(Level.OVERWORLD)); + BuddingConversionRegistry.reloadBuddingConversionRecipes(serverTickEvent.getServer().getRecipeManager()); + ScryRitualRegistry.reloadScryRitualRecipes(serverTickEvent.getServer().getRecipeManager()); expired = true; } @@ -261,8 +259,8 @@ public static void entityHurt(LivingHurtEvent e) { || entity.getTicksFrozen() >= entity.getTicksRequiredToFreeze())) { e.setAmount(e.getAmount() + 0.5f + 0.33f * entity.getEffect(ModPotions.HEX_EFFECT).getAmplifier()); } - double warding = PerkUtil.valueOrZero(entity, PerkAttributes.WARDING.get()); - double feather = PerkUtil.valueOrZero(entity, PerkAttributes.FEATHER.get()); + double warding = PerkUtil.valueOrZero(entity, PerkAttributes.WARDING); + double feather = PerkUtil.valueOrZero(entity, PerkAttributes.FEATHER); if (e.getSource().is(DamageTypes.MAGIC)) { e.setAmount((float) (e.getAmount() - warding)); } @@ -298,7 +296,7 @@ public static void eatEvent(LivingEntityUseItemEvent.Finish event) { if (!event.getEntity().level.isClientSide && event.getItem().getItem().getFoodProperties(event.getItem(), event.getEntity()) != null) { if (event.getEntity() instanceof Player player) { FoodData stats = player.getFoodData(); - stats.saturationLevel = (float) (stats.saturationLevel * PerkUtil.perkValue(player, PerkAttributes.WHIRLIESPRIG.get())); + stats.saturationLevel = (float) (stats.saturationLevel * PerkUtil.perkValue(player, PerkAttributes.WHIRLIESPRIG)); } } } @@ -418,9 +416,9 @@ public static void onPotionAdd(MobEffectEvent.Added event) { Holder holder = event.getEffectInstance().getEffect(); MobEffect effect = holder.value(); if (effect.isBeneficial()) { - bonus = PerkUtil.valueOrZero(target, PerkAttributes.WIXIE.get()); + bonus = PerkUtil.valueOrZero(target, PerkAttributes.WIXIE); } else if (applier instanceof LivingEntity living) { - bonus = PerkUtil.valueOrZero(living, PerkAttributes.WIXIE.get()); + bonus = PerkUtil.valueOrZero(living, PerkAttributes.WIXIE); } if (bonus > 0.0) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java index d599753c7f..abcf14f342 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java @@ -25,7 +25,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.List; @@ -54,11 +53,6 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In return caster.castSpell(worldIn, playerIn, handIn, Component.empty(), spell); } - @Override - public @NotNull ISpellCaster getSpellCaster(ItemStack stack) { - return new TomeSpellCaster(stack); - } - @Override public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { if (context == null) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java index 46436d2d64..1982bb7d7a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java @@ -62,8 +62,8 @@ public int getManaDiscount(ItemStack i, Spell spell) { } @Override - public boolean isScribedSpellValid(ISpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { - return spell.recipe.stream().noneMatch(s -> s instanceof AbstractCastMethod); + public boolean isScribedSpellValid(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { + return spell.unsafeList().stream().noneMatch(s -> s instanceof AbstractCastMethod); } @Override @@ -72,12 +72,11 @@ public void sendInvalidMessage(Player player) { } @Override - public boolean setSpell(ISpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { + public void scribeModifiedSpell(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell) { ArrayList recipe = new ArrayList<>(); recipe.add(MethodSelf.INSTANCE); recipe.addAll(spell.recipe); spell.recipe = recipe; - return ICasterTool.super.setSpell(caster, player, hand, stack, spell); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java index fa26dd36b6..bbeca25945 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java @@ -54,8 +54,8 @@ public void inventoryTick(ItemStack stack, Level world, Entity entity, int p_776 } @Override - public boolean isScribedSpellValid(ISpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { - return spell.recipe.stream().noneMatch(s -> s instanceof AbstractCastMethod); + public boolean isScribedSpellValid(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { + return spell.unsafeList().stream().noneMatch(s -> s instanceof AbstractCastMethod); } @Override @@ -64,13 +64,12 @@ public void sendInvalidMessage(Player player) { } @Override - public boolean setSpell(ISpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { + public void scribeModifiedSpell(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell) { ArrayList recipe = new ArrayList<>(); recipe.add(MethodTouch.INSTANCE); recipe.addAll(spell.recipe); recipe.add(AugmentAmplify.INSTANCE); spell.recipe = recipe; - return ICasterTool.super.setSpell(caster, player, hand, stack, spell); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java index cd59e9a566..41ba431568 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.item.IRadialProvider; -import com.hollingsworth.arsnouveau.api.potion.PotionProviderRegistry; +import com.hollingsworth.arsnouveau.api.registry.PotionProviderRegistry; import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenuSlot; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FormSpellArrow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FormSpellArrow.java index 6702742475..b5767c80a5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FormSpellArrow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FormSpellArrow.java @@ -9,8 +9,8 @@ public FormSpellArrow(AbstractAugment augment, int numParts) { } @Override - public void modifySpell(Spell spell) { - if(spell.isEmpty()) + public void modifySpell(Spell.Mutable spell) { + if(spell.recipe.isEmpty()) return; for (int i = 0; i < numParts; i++) { spell.recipe.add(1, this.part); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java index e157c1e119..35fc7fe797 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.potion.IPotionProvider; -import com.hollingsworth.arsnouveau.api.potion.PotionProviderRegistry; +import com.hollingsworth.arsnouveau.api.registry.PotionProviderRegistry; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.common.items.data.MultiPotionContents; import com.hollingsworth.arsnouveau.common.util.PotionUtil; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java index 85caaa859b..0517cd3bb1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java @@ -17,7 +17,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Position; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundSource; @@ -56,10 +55,9 @@ public ScryCaster() { public InteractionResult useOn(UseOnContext pContext) { BlockPos pos = pContext.getClickedPos(); ItemStack stack = pContext.getItemInHand(); - ScryData.Data data = new ScryData(stack); if(pContext.getLevel().getBlockState(pos).getBlock() instanceof ScryerCrystal){ if(!pContext.getLevel().isClientSide) { - data.setScryPos(pos); + stack.set(DataComponentRegistry.SCRY_DATA, new ScryData(pos)); PortUtil.sendMessage(pContext.getPlayer(), Component.translatable("ars_nouveau.dominion_wand.position_set")); } return InteractionResult.SUCCESS; @@ -70,18 +68,8 @@ public InteractionResult useOn(UseOnContext pContext) { @Override public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) { ItemStack stack = pPlayer.getItemInHand(pUsedHand); - ISpellCaster caster = getSpellCaster(stack); - return caster.castSpell(pLevel, (LivingEntity) pPlayer, pUsedHand, Component.translatable("ars_nouveau.invalid_spell")); - } - - @Override - public ISpellCaster getSpellCaster(CompoundTag tag) { - return new ScryCasterType(tag); - } - - @Override - public @NotNull ISpellCaster getSpellCaster(ItemStack stack) { - return new ScryCasterType(stack); + SpellCaster caster = getSpellCaster(stack); + return caster.castSpell(pLevel, pPlayer, pUsedHand, Component.translatable("ars_nouveau.invalid_spell")); } @Override @@ -119,14 +107,6 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { public static class ScryCasterType extends SpellCaster{ - public ScryCasterType(ItemStack stack) { - super(stack); - } - - public ScryCasterType(CompoundTag itemTag) { - super(itemTag); - } - @Override public InteractionResultHolder castSpell(Level worldIn, LivingEntity entity, InteractionHand handIn, @org.jetbrains.annotations.Nullable Component invalidMessage, @NotNull Spell spell) { ItemStack stack = entity.getItemInHand(handIn); @@ -149,7 +129,7 @@ public InteractionResultHolder castSpell(Level worldIn, LivingEntity ScryData data = stack.get(DataComponentRegistry.SCRY_DATA); boolean playerHoldingScroll = entity.getItemInHand(InteractionHand.OFF_HAND).getItem() instanceof ScryerScroll; - BlockPos scryPos = playerHoldingScroll ? new ScryerScroll.ScryerScrollData(player.getItemInHand(InteractionHand.OFF_HAND)).pos : data.pos(); + BlockPos scryPos = playerHoldingScroll ? player.getItemInHand(InteractionHand.OFF_HAND).getOrDefault(DataComponentRegistry.SCRY_DATA, new ScryData(null)).pos() : data.pos(); if(scryPos == null){ PortUtil.sendMessage(entity, Component.translatable("ars_nouveau.scry_caster.no_pos")); return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellArrow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellArrow.java index 66d844bd9c..538f981bca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellArrow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellArrow.java @@ -33,7 +33,7 @@ public SpellArrow(AbstractAugment augment, int numParts) { this.numParts = numParts; } - public void modifySpell(Spell spell) { + public void modifySpell(Spell.Mutable spell) { for (int i = 0; i < numParts; i++) { spell.recipe.add(part); } @@ -47,21 +47,21 @@ public AbstractArrow createArrow(Level world, ItemStack stack, LivingEntity shoo EntitySpellArrow spellArrow = new EntitySpellArrow(world, shooter, ItemStack.EMPTY, bowStack); if (!(shooter instanceof Player entity) || !((shooter).getMainHandItem().getItem() instanceof ICasterTool caster)) return super.createArrow(world, stack, shooter, bowStack); - ISpellCaster spellCaster = caster.getSpellCaster(entity.getMainHandItem()); - Spell spell = spellCaster.getSpell(); - modifySpell(spell); - spellArrow.spellResolver = new SpellResolver(new SpellContext(world, spell, entity, new PlayerCaster(entity), shooter.getMainHandItem())).withSilent(true); - spellArrow.pierceLeft = spell.getBuffsAtIndex(0, shooter, AugmentPierce.INSTANCE); + SpellCaster spellCaster = caster.getSpellCaster(entity.getMainHandItem()); + var mutableSpell = spellCaster.getSpell().mutable(); + modifySpell(mutableSpell); + spellArrow.spellResolver = new SpellResolver(new SpellContext(world, mutableSpell.immutable(), entity, new PlayerCaster(entity), shooter.getMainHandItem())).withSilent(true); + spellArrow.pierceLeft = mutableSpell.immutable().getBuffsAtIndex(0, shooter, AugmentPierce.INSTANCE); return spellArrow; } @Override public void appendHoverText(ItemStack pStack, TooltipContext pContext, List pTooltipComponents, TooltipFlag pTooltipFlag) { pTooltipComponents.add(Component.translatable("ars_nouveau.spell_arrow.desc")); - Spell spell = new Spell(); + var spell = new Spell().mutable(); for (int i = 0; i < numParts; i++) { spell.recipe.add(part); } - pTooltipComponents.add(Component.literal(spell.getDisplayString())); + pTooltipComponents.add(Component.literal(spell.immutable().getDisplayString())); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java index a46cbc54cc..0ccd86c61b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.api.item.ICasterTool; import com.hollingsworth.arsnouveau.api.item.IRadialProvider; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.api.util.StackUtil; import com.hollingsworth.arsnouveau.client.gui.book.GuiSpellBook; @@ -25,7 +26,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; import net.minecraft.world.InteractionHand; @@ -41,7 +41,6 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; -import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; @@ -126,22 +125,6 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { return factory; } - @NotNull - @Override - public ISpellCaster getSpellCaster(ItemStack stack) { - return new BookCaster(stack); - } - - @Override - public ISpellCaster getSpellCaster() { - return new BookCaster(new CompoundTag()); - } - - @Override - public ISpellCaster getSpellCaster(CompoundTag tag) { - return new BookCaster(tag); - } - @Override public void initializeClient(Consumer consumer) { super.initializeClient(consumer); @@ -173,9 +156,9 @@ public void onRadialKeyPressed(ItemStack stack, Player player) { public RadialMenu getRadialMenuProviderForSpellpart(ItemStack itemStack) { return new RadialMenu<>((int slot) -> { - BookCaster caster = new BookCaster(itemStack); + SpellCaster caster = SpellCasterRegistry.from(itemStack); caster.setCurrentSlot(slot); - Networking.sendToServer(new PacketSetBookMode(itemStack.getTag())); + Networking.sendToServer(new PacketSetBookMode(caster)); }, getRadialMenuSlotsForSpellpart(itemStack), RenderUtils::drawSpellPart, @@ -183,13 +166,13 @@ public RadialMenu getRadialMenuProviderForSpellpart(ItemStack } public List> getRadialMenuSlotsForSpellpart(ItemStack itemStack) { - BookCaster spellCaster = new BookCaster(itemStack); + SpellCaster spellCaster = SpellCasterRegistry.from(itemStack); List> radialMenuSlots = new ArrayList<>(); for (int i = 0; i < spellCaster.getMaxSlots(); i++) { Spell spell = spellCaster.getSpell(i); AbstractSpellPart primaryIcon = null; List secondaryIcons = new ArrayList<>(); - for (AbstractSpellPart p : spell.recipe) { + for (AbstractSpellPart p : spell.recipe()) { if (p instanceof AbstractCastMethod) { secondaryIcons.add(p); } @@ -208,20 +191,4 @@ public List> getRadialMenuSlotsForSpellpart(It public boolean canQuickCast() { return true; } - - public static class BookCaster extends SpellCaster { - - public BookCaster(ItemStack stack) { - super(stack); - } - - public BookCaster(CompoundTag tag) { - super(tag); - } - - @Override - public int getMaxSlots() { - return 10; - } - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java index 3e5045663b..d637ef29a7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java @@ -100,7 +100,7 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In } public EntitySpellArrow buildSpellArrow(Level worldIn, Player playerentity, ISpellCaster caster, boolean isSpellArrow, ItemStack bowStack) { - EntitySpellArrow spellArrow = new EntitySpellArrow(worldIn, playerentity); + EntitySpellArrow spellArrow = new EntitySpellArrow(worldIn, playerentity, ItemStack.EMPTY, bowStack); spellArrow.spellResolver = new SpellResolver(new SpellContext(worldIn, caster.getSpell(), playerentity, new PlayerCaster(playerentity), bowStack)).withSilent(true); spellArrow.setColors(caster.getColor()); if (isSpellArrow) @@ -194,16 +194,12 @@ public void releaseUsing(ItemStack bowStack, Level worldIn, LivingEntity entityL } public void addArrow(AbstractArrow abstractarrowentity, ItemStack bowStack, ItemStack arrowStack, boolean isArrowInfinite, Player playerentity) { + // TODO: verify if enchant checking is needed here int power = bowStack.getEnchantmentLevel(HolderHelper.unwrap(playerentity.level, Enchantments.POWER)); if (power > 0) { abstractarrowentity.setBaseDamage(abstractarrowentity.getBaseDamage() + power * 0.5D + 0.5D); } - int punch = bowStack.getEnchantmentLevel(HolderHelper.unwrap(playerentity.level, Enchantments.PUNCH)); - if (punch > 0) { - abstractarrowentity.setKnockback(punch); - } - if (bowStack.getEnchantmentLevel(HolderHelper.unwrap(playerentity.level, Enchantments.FLAME)) > 0) { abstractarrowentity.setRemainingFireTicks(100); } @@ -239,8 +235,8 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List s instanceof AbstractCastMethod); + public boolean isScribedSpellValid(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { + return spell.unsafeList().stream().noneMatch(s -> s instanceof AbstractCastMethod); } @Override @@ -249,12 +245,11 @@ public void sendInvalidMessage(Player player) { } @Override - public boolean setSpell(ISpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { + public void scribeModifiedSpell(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell) { ArrayList recipe = new ArrayList<>(); recipe.add(MethodProjectile.INSTANCE); recipe.addAll(spell.recipe); spell.recipe = recipe; - return ICasterTool.super.setSpell(caster, player, hand, stack, spell); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java index 6f77f069a7..5333fa048d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java @@ -208,11 +208,11 @@ public void shootOne(Level worldIn, LivingEntity pShooter, InteractionHand pHand ISpellCaster caster = getSpellCaster(pCrossbowStack); SpellResolver resolver = new SpellResolver(new SpellContext(worldIn, caster.modifySpellBeforeCasting(worldIn, pShooter, InteractionHand.MAIN_HAND, caster.getSpell()), pShooter, livingCaster, pCrossbowStack)); if (pAmmoStack.getItem() == Items.ARROW && isSpell) { - projectile = buildSpellArrow(worldIn, pShooter, caster); + projectile = buildSpellArrow(worldIn, pShooter, caster, pCrossbowStack); ((EntitySpellArrow) projectile).pierceLeft += EnchantmentHelper.getTagEnchantmentLevel(Enchantments.PIERCING, pCrossbowStack); }else if(pAmmoStack.getItem() instanceof SpellArrow && projectile instanceof EntitySpellArrow spellArrow){ spellArrow.pierceLeft += EnchantmentHelper.getTagEnchantmentLevel(Enchantments.PIERCING, pCrossbowStack); - spellArrow.setColors(resolver.spell.color); + spellArrow.setColors(resolver.spell.color()); } if (pShooter instanceof CrossbowAttackMob crossbowattackmob) { @@ -292,8 +292,8 @@ public Predicate getAllSupportedProjectiles() { return super.getAllSupportedProjectiles().or(i -> i.getItem() instanceof SpellArrow); } - public EntitySpellArrow buildSpellArrow(Level worldIn, LivingEntity playerentity, ISpellCaster caster) { - EntitySpellArrow spellArrow = new EntitySpellArrow(worldIn, playerentity); + public EntitySpellArrow buildSpellArrow(Level worldIn, LivingEntity playerentity, ISpellCaster caster, ItemStack bowStack) { + EntitySpellArrow spellArrow = new EntitySpellArrow(worldIn, playerentity, ItemStack.EMPTY, bowStack); spellArrow.spellResolver = new SpellResolver(new SpellContext(worldIn, caster.getSpell(), playerentity, LivingCaster.from(playerentity), playerentity.getMainHandItem())).withSilent(true); spellArrow.setColors(caster.getColor()); return spellArrow; @@ -306,8 +306,8 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List s instanceof AbstractCastMethod); + public boolean isScribedSpellValid(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { + return spell.unsafeList().stream().noneMatch(s -> s instanceof AbstractCastMethod); } @Override @@ -316,12 +316,11 @@ public void sendInvalidMessage(Player player) { } @Override - public boolean setSpell(ISpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { + public void scribeModifiedSpell(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell) { ArrayList recipe = new ArrayList<>(); recipe.add(MethodProjectile.INSTANCE); recipe.addAll(spell.recipe); spell.recipe = recipe; - return ICasterTool.super.setSpell(caster, player, hand, stack, spell); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java index ba9e53c373..04eb3e336f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java @@ -1,10 +1,7 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.item.ICasterTool; -import com.hollingsworth.arsnouveau.api.spell.AbstractCastMethod; -import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; -import com.hollingsworth.arsnouveau.api.spell.Spell; +import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.client.renderer.item.WandRenderer; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAccelerate; import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; @@ -65,8 +62,8 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public boolean isScribedSpellValid(ISpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { - return spell.recipe.stream().noneMatch(s -> s instanceof AbstractCastMethod); + public boolean isScribedSpellValid(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { + return spell.mutable().recipe.stream().noneMatch(s -> s instanceof AbstractCastMethod); } @Override @@ -75,13 +72,12 @@ public void sendInvalidMessage(Player player) { } @Override - public boolean setSpell(ISpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { + public void scribeModifiedSpell(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell) { ArrayList recipe = new ArrayList<>(); recipe.add(MethodProjectile.INSTANCE); recipe.add(AugmentAccelerate.INSTANCE); recipe.addAll(spell.recipe); spell.recipe = recipe; - return ICasterTool.super.setSpell(caster, player, hand, stack, spell); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MultiPotionContents.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MultiPotionContents.java index 1159e7ebfb..fee2be347c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MultiPotionContents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MultiPotionContents.java @@ -7,7 +7,7 @@ import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; -import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.alchemy.PotionContents; import org.jetbrains.annotations.NotNull; @@ -50,12 +50,17 @@ public int maxUses(ItemStack stack) { } @Override - public void consumeUses(ItemStack stack, int amount, Player player) { + public void consumeUses(ItemStack stack, int amount, @Nullable LivingEntity player) { stack.set(DataComponentRegistry.MULTI_POTION, withCharges(charges - amount)); } @Override - public void addUse(ItemStack stack, int amount, @Nullable Player player) { + public void addUse(ItemStack stack, int amount, @Nullable LivingEntity player) { stack.set(DataComponentRegistry.MULTI_POTION, withCharges(charges + amount)); } + + @Override + public void setData(PotionContents contents, int usesRemaining, int maxUses, ItemStack stack) { + stack.set(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(usesRemaining, contents, maxUses)); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java index b19a95dfbe..b6882d536e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java @@ -42,6 +42,18 @@ public PersistentFamiliarData(){ this(Component.nullToEmpty(""), "", ItemStack.EMPTY); } + public PersistentFamiliarData setName(Component name){ + return new PersistentFamiliarData(name, color, cosmetic); + } + + public PersistentFamiliarData setColor(String color){ + return new PersistentFamiliarData(name, color, cosmetic); + } + + public PersistentFamiliarData setCosmetic(ItemStack cosmetic){ + return new PersistentFamiliarData(name, color, cosmetic); + } + public static PersistentFamiliarData fromTag(Tag tag){ return CODEC.codec().parse(NbtOps.INSTANCE, tag).getOrThrow(); } @@ -58,6 +70,10 @@ public void addToTooltip(Item.TooltipContext pContext, Consumer pTool } } + public Mutable mutable(){ + return new Mutable(name, color, cosmetic); + } + public static class Mutable{ public Component name; public String color; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java index 88e354c512..cbbb4d1e77 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.common.items.data; -import com.hollingsworth.arsnouveau.api.potion.PotionProviderRegistry; +import com.hollingsworth.arsnouveau.api.registry.PotionProviderRegistry; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketANEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketANEffect.java index 810bc55717..6d7f305365 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketANEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketANEffect.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.network; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; +import com.hollingsworth.arsnouveau.api.registry.ParticleColorRegistry; import com.hollingsworth.arsnouveau.client.particle.GlowParticleData; import com.hollingsworth.arsnouveau.client.particle.HelixParticleData; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java index 9cee732738..cd0ad20edd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketConsumePotion.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.potion.IPotionProvider; -import com.hollingsworth.arsnouveau.api.potion.PotionProviderRegistry; +import com.hollingsworth.arsnouveau.api.registry.PotionProviderRegistry; import com.hollingsworth.arsnouveau.common.items.PotionFlask; import com.hollingsworth.arsnouveau.common.util.PotionUtil; import net.minecraft.core.component.DataComponents; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java index a4146a39ea..4e980b3ce3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java @@ -1,9 +1,11 @@ package com.hollingsworth.arsnouveau.common.network; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.api.util.StackUtil; import com.hollingsworth.arsnouveau.common.items.SpellBook; -import net.minecraft.nbt.CompoundTag; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; @@ -14,27 +16,27 @@ public class PacketSetBookMode extends AbstractPacket{ public static final Type TYPE = new Type<>(ArsNouveau.prefix("set_book_mode")); public static final StreamCodec CODEC = StreamCodec.ofMember(PacketSetBookMode::toBytes, PacketSetBookMode::new); - public CompoundTag tag; + public SpellCaster spellCaster; //Decoder public PacketSetBookMode(RegistryFriendlyByteBuf buf) { - tag = buf.readNbt(); + spellCaster = ANCodecs.decode(SpellCaster.CODEC.codec(), buf.readNbt()); } //Encoder public void toBytes(RegistryFriendlyByteBuf buf) { - buf.writeNbt(tag); + buf.writeNbt(ANCodecs.encode(SpellCaster.CODEC.codec(), spellCaster)); } - public PacketSetBookMode(CompoundTag tag) { - this.tag = tag; + public PacketSetBookMode(SpellCaster spellCaster) { + this.spellCaster = spellCaster; } @Override public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { ItemStack stack = StackUtil.getHeldSpellbook(player); if (stack.getItem() instanceof SpellBook) { - stack.setTag(tag); + stack.set(DataComponentRegistry.SPELL_CASTER, spellCaster); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java index 3f87d2af7c..97f72f5767 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.potion.IPotionProvider; -import com.hollingsworth.arsnouveau.api.potion.PotionProviderRegistry; +import com.hollingsworth.arsnouveau.api.registry.PotionProviderRegistry; import com.hollingsworth.arsnouveau.common.items.FlaskCannon; import com.hollingsworth.arsnouveau.common.items.data.PotionLauncherData; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java index 57c1e04add..15e29f1df1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java @@ -1,9 +1,9 @@ package com.hollingsworth.arsnouveau.common.network; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.common.items.SpellBook; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.RegistryFriendlyByteBuf; @@ -45,7 +45,7 @@ public void toBytes(RegistryFriendlyByteBuf buf) { public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { ItemStack stack = player.getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); if (stack.getItem() instanceof SpellBook) { - ISpellCaster caster = CasterUtil.getCaster(stack); + SpellCaster caster = SpellCasterRegistry.from(stack); caster.setSound(sound, castSlot); Networking.sendToPlayerClient(new PacketUpdateBookGUI(stack), player); Networking.sendToPlayerClient(new PacketOpenSpellBook(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND), player); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java index 60a1e37f8c..d3614912e7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java @@ -33,7 +33,7 @@ public void onClientReceived(Minecraft minecraft, Player playerEntity) { IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(playerEntity).orElse(new ANPlayerDataCap()); if (cap != null) { - cap.deserializeNBT(tag); + cap.deserializeNBT(minecraft.level.registryAccess(), tag); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java index 9a79eb4b8b..2455595a99 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java @@ -2,9 +2,9 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.item.ICasterTool; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.spell.Spell; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; @@ -13,6 +13,8 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; +import java.util.ArrayList; + public class PacketUpdateCaster extends AbstractPacket{ Spell spellRecipe; @@ -50,11 +52,11 @@ public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer playe if(!(stack.getItem() instanceof ICasterTool)) return; if (spellRecipe != null) { - ISpellCaster caster = CasterUtil.getCaster(stack); + ISpellCaster caster = SpellCasterRegistry.from(stack); caster.setCurrentSlot(cast_slot); // Update just the recipe, don't overwrite the entire spell. - Spell spell = caster.getSpell(cast_slot).setRecipe(spellRecipe.recipe); - caster.setSpell(spell, cast_slot); + var spell = caster.getSpell(cast_slot).mutable().setRecipe(new ArrayList<>(spellRecipe.unsafeList())); + caster.setSpell(spell.immutable(), cast_slot); caster.setSpellName(spellName, cast_slot); Networking.sendToPlayerClient(new PacketUpdateBookGUI(stack), player); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColorAll.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColorAll.java index f38ca2d02e..90a52a24b6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColorAll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColorAll.java @@ -1,8 +1,8 @@ package com.hollingsworth.arsnouveau.common.network; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.items.SpellBook; import net.minecraft.network.RegistryFriendlyByteBuf; @@ -30,11 +30,11 @@ public void toBytes(RegistryFriendlyByteBuf buf) { public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { ItemStack stack = player.getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); if (stack.getItem() instanceof SpellBook) { - ISpellCaster caster = CasterUtil.getCaster(stack); + SpellCaster caster = SpellCasterRegistry.from(stack); for (int i = 0; i < caster.getMaxSlots(); i++) { - caster.setColor(color, i); + caster = caster.setColor(color, i); } - caster.setCurrentSlot(castSlot); + caster.setCurrentSlot(castSlot).saveToStack(stack); Networking.sendToPlayerClient(new PacketUpdateBookGUI(stack), player); Networking.sendToPlayerClient(new PacketOpenSpellBook(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND), player); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColors.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColors.java index fce8ffa1e0..a2c23ede5d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColors.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColors.java @@ -1,9 +1,9 @@ package com.hollingsworth.arsnouveau.common.network; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.particle.ParticleColorRegistry; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; +import com.hollingsworth.arsnouveau.api.registry.ParticleColorRegistry; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.items.SpellBook; import net.minecraft.network.RegistryFriendlyByteBuf; @@ -44,9 +44,8 @@ public void toBytes(RegistryFriendlyByteBuf buf) { public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { ItemStack stack = player.getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); if (stack.getItem() instanceof SpellBook) { - ISpellCaster caster = CasterUtil.getCaster(stack); - caster.setColor(color, castSlot); - caster.setCurrentSlot(castSlot); + SpellCaster caster = SpellCasterRegistry.from(stack); + caster.setColor(color, castSlot).setCurrentSlot(castSlot).saveToStack(stack); Networking.sendToPlayerClient(new PacketUpdateBookGUI(stack), player); Networking.sendToPlayerClient( new PacketOpenSpellBook(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND), player); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java index 02023d0ef9..322cc4b52f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java @@ -1,9 +1,9 @@ package com.hollingsworth.arsnouveau.common.network; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.common.items.SpellBook; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; @@ -34,10 +34,11 @@ public void toBytes(RegistryFriendlyByteBuf buf) { public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { ItemStack stack = player.getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); if (stack.getItem() instanceof SpellBook) { - ISpellCaster caster = CasterUtil.getCaster(stack); + SpellCaster caster = SpellCasterRegistry.from(stack); for (int i = 0; i < caster.getMaxSlots(); i++) { - caster.setSound(sound, i); + caster = caster.setSound(sound, i); } + caster.saveToStack(stack); Networking.sendToPlayerClient(new PacketUpdateBookGUI(stack), player); Networking.sendToPlayerClient(new PacketOpenSpellBook(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND), player); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/casters/ReactiveCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/casters/ReactiveCaster.java index 20d360de04..434b105ef5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/casters/ReactiveCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/casters/ReactiveCaster.java @@ -1,12 +1,9 @@ package com.hollingsworth.arsnouveau.common.spell.casters; -import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.spell.EntitySpellResolver; import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.api.spell.SpellContext; import com.hollingsworth.arsnouveau.api.spell.SpellResolver; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -19,10 +16,6 @@ public ReactiveCaster(ItemStack stack) { super(stack); } - public ReactiveCaster(CompoundTag tag) { - super(tag); - } - @Override public SpellResolver getSpellResolver(SpellContext context, Level worldIn, LivingEntity playerIn, InteractionHand handIn) { if(!(playerIn instanceof Player) || playerIn instanceof FakePlayer){ @@ -30,9 +23,4 @@ public SpellResolver getSpellResolver(SpellContext context, Level worldIn, Livin } return super.getSpellResolver(context, worldIn, playerIn, handIn); } - - @Override - public ResourceLocation getTagID() { - return ArsNouveau.prefix( "reactive_caster"); - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDelay.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDelay.java index d9da56f63f..b29badb2ed 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDelay.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDelay.java @@ -30,7 +30,7 @@ private EffectDelay() { } public void sendPacket(Level world, HitResult rayTraceResult, @Nullable LivingEntity shooter, SpellContext spellContext, SpellStats spellStats, BlockHitResult blockResult, Entity hitEntity, SpellResolver spellResolver) { - if (spellContext.getCurrentIndex() >= spellContext.getSpell().recipe.size()) + if (spellContext.getCurrentIndex() >= spellContext.getSpell().size()) return; int duration = GENERIC_INT.get() + EXTEND_TIME.get() * spellStats.getBuffCount(AugmentExtendTime.INSTANCE) * 20; int decreasedTime = EXTEND_TIME.get() * 10 * spellStats.getBuffCount(AugmentDurationDown.INSTANCE); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java index 9e0cfa15cb..f4d00b0fd0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java @@ -2,9 +2,10 @@ import com.hollingsworth.arsnouveau.api.item.inv.ExtractedStack; import com.hollingsworth.arsnouveau.api.item.inv.InventoryManager; +import com.hollingsworth.arsnouveau.api.potion.IPotionProvider; +import com.hollingsworth.arsnouveau.api.registry.PotionProviderRegistry; import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; -import com.hollingsworth.arsnouveau.common.items.PotionFlask; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAOE; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentExtendTime; @@ -51,7 +52,9 @@ public void spawnPotionEntity(HitResult rayTraceResult, Level world, @NotNull Li } Item potionItem = spellStats.getAoeMultiplier() > 0 ? Items.SPLASH_POTION : Items.LINGERING_POTION; ThrownPotion potion = new ThrownPotion(world, shooter); - potion.setItem(potionData.asPotionStack(potionItem)); + ItemStack stack = new ItemStack(potionItem); + stack.set(DataComponents.POTION_CONTENTS, potionData); + potion.setItem(stack); potion.setPos(rayTraceResult.getLocation()); world.addFreshEntity(potion); } @@ -72,13 +75,13 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul PotionContents potionData = null; InventoryManager manager = spellContext.getCaster().getInvManager(); ExtractedStack extractedFlask = manager.extractItem(i -> { - PotionFlask.FlaskData data = new PotionFlask.FlaskData(i); - return !data.getPotion().isEmpty() && data.getCount() > 0; + IPotionProvider provider = PotionProviderRegistry.from(i); + return provider != null && !provider.isEmpty(i); }, 1); if (!extractedFlask.isEmpty()) { - PotionFlask.FlaskData data = new PotionFlask.FlaskData(extractedFlask.getStack()); - potionData = data.getPotion().clone(); - data.setCount(data.getCount() - 1); + IPotionProvider provider = PotionProviderRegistry.from(extractedFlask.stack); + potionData = provider.getPotionData(extractedFlask.stack); + provider.consumeUses(extractedFlask.stack, 1, shooter); extractedFlask.returnOrDrop(world, shooter.getOnPos()); } else { ExtractedStack potion = manager.extractItem(i -> i.getItem() instanceof PotionItem, 1); @@ -93,7 +96,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul if(potionData == null){ BlockEntity jarEntity = spellContext.getCaster().getNearbyBlockEntity(i -> i instanceof PotionJarTile jar && jar.getAmount() > 100); if(jarEntity instanceof PotionJarTile jar){ - potionData = jar.getData().clone(); + potionData = jar.getData(); jar.remove(100); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLinger.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLinger.java index e2424f5254..fdae72aa19 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLinger.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLinger.java @@ -26,7 +26,7 @@ public void onResolve(HitResult rayTraceResult, Level world,@NotNull LivingEntit super.onResolve(rayTraceResult, world, shooter, spellStats, spellContext, resolver); Vec3 hit = safelyGetHitPos(rayTraceResult); EntityLingeringSpell entityLingeringSpell = new EntityLingeringSpell(world, shooter); - if (spellContext.getCurrentIndex() >= spellContext.getSpell().recipe.size()) + if (spellContext.getCurrentIndex() >= spellContext.getSpell().size()) return; SpellContext newContext = spellContext.makeChildContext(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java index ef557a75c8..de82a4e2e6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java @@ -4,7 +4,6 @@ import com.hollingsworth.arsnouveau.api.item.inv.InventoryManager; import com.hollingsworth.arsnouveau.api.item.inv.SlotReference; import com.hollingsworth.arsnouveau.api.spell.*; -import com.hollingsworth.arsnouveau.api.util.CasterUtil; import com.hollingsworth.arsnouveau.api.util.StackUtil; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.mojang.authlib.GameProfile; @@ -67,7 +66,7 @@ public Component getName(Level world, @NotNull LivingEntity shooter, SpellStats if (newName == null && isRealPlayer(shooter) && shooter instanceof Player player) { ItemStack stack = StackUtil.getHeldCasterToolOrEmpty(player); if (stack != ItemStack.EMPTY) { - ISpellCaster caster = CasterUtil.getCaster(stack); + ISpellCaster caster = SpellCasterRegistry.from(stack); newName = Component.literal(caster.getSpellName()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectOrbit.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectOrbit.java index 083a33f908..6df7b757d4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectOrbit.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectOrbit.java @@ -25,8 +25,8 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull if (spellContext.getRemainingSpell().isEmpty()) return; int total = 3 + stats.getBuffCount(AugmentSplit.INSTANCE); SpellContext newContext = resolver.spellContext.makeChildContext(); - Spell spell = newContext.getSpell(); - spell.recipe.add(0, MethodProjectile.INSTANCE); + var spell = newContext.getSpell().mutable().add(0, MethodProjectile.INSTANCE); + newContext.withSpell(spell.immutable()); spellContext.setCanceled(true); for (int i = 0; i < total; i++) { EntityOrbitProjectile wardProjectile = new EntityOrbitProjectile(world, resolver.getNewResolver(newContext), rayTraceResult.getLocation()); @@ -45,8 +45,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul if (spellContext.getRemainingSpell().isEmpty()) return; int total = 3 + stats.getBuffCount(AugmentSplit.INSTANCE); Spell newSpell = spellContext.getRemainingSpell(); - newSpell.recipe.add(0, MethodProjectile.INSTANCE); - SpellContext newContext = resolver.spellContext.makeChildContext().withSpell(newSpell); + SpellContext newContext = resolver.spellContext.makeChildContext().withSpell(newSpell.mutable().add(0, MethodProjectile.INSTANCE).immutable()); spellContext.setCanceled(true); for (int i = 0; i < total; i++) { EntityOrbitProjectile wardProjectile = new EntityOrbitProjectile(world, resolver.getNewResolver(newContext), rayTraceResult.getEntity()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectReset.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectReset.java index 3a59b27f9a..ce31f1663f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectReset.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectReset.java @@ -29,9 +29,9 @@ protected int getDefaultManaCost() { @Override public SpellContext manipulate(SpellContext context) { - Spell remainder = context.getRemainingSpell(); + var remainder = context.getRemainingSpell().mutable(); int index = remainder.recipe.indexOf(EffectReset.INSTANCE); - SpellContext newContext = context.clone().withSpell(remainder.setRecipe(new ArrayList<>(remainder.recipe.subList(0, index)))); + SpellContext newContext = context.clone().withSpell(remainder.setRecipe(new ArrayList<>(remainder.recipe.subList(0, index))).immutable()); context.setCurrentIndex(context.getCurrentIndex() + index); return newContext; } @@ -41,7 +41,7 @@ public boolean contextCanceled(SpellContext context) { if(context.getCancelReason() == CancelReason.NEW_CONTEXT) { context.setCanceled(false); Spell remainder = context.getRemainingSpell(); - int index = remainder.recipe.indexOf(EffectReset.INSTANCE); + int index = remainder.indexOf(EffectReset.INSTANCE); context.setCurrentIndex(context.getCurrentIndex() + index); return false; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRune.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRune.java index 04ff120e5e..588b79e40f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRune.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRune.java @@ -45,8 +45,9 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull } runeTile.isTemporary = true; Spell newSpell = newContext.getSpell().clone(); - newSpell.recipe.add(0, MethodTouch.INSTANCE); - runeTile.spell = newSpell; + var mutable = newSpell.mutable(); + mutable.recipe.add(0, MethodTouch.INSTANCE); + runeTile.spell = mutable.immutable(); runeTile.isSensitive = spellStats.isSensitive(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWall.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWall.java index dd422580df..fa7925f752 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWall.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWall.java @@ -30,7 +30,7 @@ private EffectWall() { public void onResolve(HitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { Vec3 hit = safelyGetHitPos(rayTraceResult); EntityWallSpell entityWallSpell = new EntityWallSpell(world, shooter); - if (spellContext.getCurrentIndex() >= spellContext.getSpell().recipe.size()) + if (spellContext.getCurrentIndex() >= spellContext.getSpell().size()) return; SpellContext newContext = spellContext.makeChildContext(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java index 91a5232e83..e6cd7e380b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java @@ -82,7 +82,7 @@ else if (spellStats.isSensitive() || living instanceof ArmorStand) { ((MobAccessor) mob).callMobInteract(player, InteractionHand.MAIN_HAND); player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); } - world.playSound(null, living.getX(), living.getY(), living.getZ(), SoundEvents.EVOKER_PREPARE_WOLOLO, SoundSource.PLAYERS, spellContext.getSpell().sound.volume, spellContext.getSpell().sound.pitch); + world.playSound(null, living.getX(), living.getY(), living.getZ(), SoundEvents.EVOKER_PREPARE_WOLOLO, SoundSource.PLAYERS, spellContext.getSpell().sound().getVolume(), spellContext.getSpell().sound().getPitch()); } @NotNull @@ -111,7 +111,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull BlockPos blockPos = rayTraceResult.getBlockPos(); BlockEntity blockEntity = world.getBlockEntity(blockPos); if (blockEntity instanceof IWololoable tileToDye) { - ParticleColor color = spellStats.isRandomized() ? ParticleColor.makeRandomColor(255, 255, 255, shooter.getRandom()) : spellContext.getSpell().color; + ParticleColor color = spellStats.isRandomized() ? ParticleColor.makeRandomColor(255, 255, 255, shooter.getRandom()) : spellContext.getSpell().color(); tileToDye.setColor(color); } else { ItemStack dyeStack = getDye(shooter, spellStats, spellContext, ANFakePlayer.getPlayer((ServerLevel) world)); @@ -198,7 +198,7 @@ private DyeItem getRandomDye(RandomSource random) { } private static DyeItem getDyeItemFromSpell(SpellContext spellContext) { - ParticleColor spellColor = spellContext.getSpell().color; + ParticleColor spellColor = spellContext.getSpell().color(); ParticleColor targetColor = vanillaColors.keySet().stream().min(Comparator.comparingDouble(d -> d.euclideanDistance(spellColor))).orElse(ParticleColor.WHITE); return (DyeItem) vanillaColors.get(targetColor); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java index fc7d796305..650e9b4040 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.util; import com.hollingsworth.arsnouveau.api.potion.IPotionProvider; -import com.hollingsworth.arsnouveau.api.potion.PotionProviderRegistry; +import com.hollingsworth.arsnouveau.api.registry.PotionProviderRegistry; import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponents; import net.minecraft.world.effect.MobEffectInstance; @@ -25,6 +25,9 @@ public static ItemStack getPotion(Holder potion) { } public static boolean arePotionContentsEqual(PotionContents pot1, PotionContents pot2){ + if(pot1 == null || pot2 == null){ + return false; + } List pot1Effects = new ArrayList<>(); List pot2Effects = new ArrayList<>(); pot1.getAllEffects().forEach(pot1Effects::add); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java index def1d1c65d..436e08a4c2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java @@ -3,7 +3,6 @@ import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; import com.hollingsworth.arsnouveau.api.familiar.AbstractFamiliarHolder; import com.hollingsworth.arsnouveau.api.mob_jar.JarBehavior; -import com.hollingsworth.arsnouveau.api.mob_jar.JarBehaviorRegistry; import com.hollingsworth.arsnouveau.api.perk.IPerk; import com.hollingsworth.arsnouveau.api.perk.PerkSlot; import com.hollingsworth.arsnouveau.api.registry.*; From 9313b94836b59e48a309d7e80c65b32c4c7612f0 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 2 Jul 2024 20:57:27 -0500 Subject: [PATCH 025/363] more caps, misc tweaks --- .../arsnouveau/api/perk/ITickablePerk.java | 4 +- .../arsnouveau/api/util/PerkUtil.java | 4 +- .../arsnouveau/api/util/StackUtil.java | 15 ++- .../AbstractStorageTerminalScreen.java | 2 +- .../container/CraftingTerminalMenu.java | 121 +++++++++--------- .../client/container/StorageTerminalMenu.java | 11 +- .../client/container/StoredItemStack.java | 7 +- .../client/container/TerminalSyncManager.java | 6 +- .../client/gui/book/InfinityGuiSpellBook.java | 6 +- .../client/registry/ClientHandler.java | 60 ++++----- .../common/armor/AnimatedMagicArmor.java | 65 ++++------ .../arsnouveau/common/block/SourceJar.java | 5 +- .../arsnouveau/common/block/SummonBlock.java | 16 +-- .../block/tile/CraftingLecternTile.java | 5 +- .../common/block/tile/WhirlisprigTile.java | 3 +- .../common/crafting/recipes/DyeRecipe.java | 1 + .../datagen/ApparatusRecipeProvider.java | 14 +- .../common/datagen/AtlasProvider.java | 6 +- .../common/datagen/DyeRecipeDatagen.java | 9 +- .../arsnouveau/common/datagen/ModDatagen.java | 2 +- .../common/datagen/PatchouliProvider.java | 12 +- .../arsnouveau/common/entity/EntityDummy.java | 4 +- .../carbuncle/StarbyTransportBehavior.java | 3 +- .../arsnouveau/common/items/MobJarItem.java | 7 +- .../common/items/data/BlockFillContents.java | 17 +++ .../common/items/data/MobJarData.java | 13 ++ .../common/mixin/DamageSourceMixin.java | 6 +- .../network/ClientToServerStoragePacket.java | 2 +- .../common/network/PacketHotkeyPressed.java | 2 +- .../arsnouveau/common/perk/RepairingPerk.java | 4 +- .../common/potions/FlightEffect.java | 45 ------- .../common/spell/effect/EffectName.java | 5 +- .../common/spell/effect/EffectToss.java | 3 +- .../arsnouveau/common/util/ItemUtil.java | 14 ++ .../setup/registry/DataComponentRegistry.java | 4 + .../arsnouveau/setup/registry/ModPotions.java | 3 +- .../resources/META-INF/accesstransformer.cfg | 2 +- 37 files changed, 258 insertions(+), 250 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/BlockFillContents.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/MobJarData.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/potions/FlightEffect.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/util/ItemUtil.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/ITickablePerk.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/ITickablePerk.java index 1ce9968d9a..57b3a7427d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/ITickablePerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/ITickablePerk.java @@ -1,11 +1,11 @@ package com.hollingsworth.arsnouveau.api.perk; -import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; public interface ITickablePerk { - void tick(ItemStack stack, Level world, Player player, PerkInstance strength); + void tick(ItemStack stack, Level world, LivingEntity player, PerkInstance strength); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java index 8cbb9df07f..5ba3f25f0f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java @@ -65,9 +65,9 @@ public static List getPerksFromLiving(LivingEntity player){ return perkInstances; } - public static int countForPerk(IPerk perk, LivingEntity player){ + public static int countForPerk(IPerk perk, LivingEntity entity){ int maxCount = 0; - for(ItemStack stack : player.getArmorSlots()){ + for(ItemStack stack : entity.getArmorSlots()){ var data = stack.get(DataComponentRegistry.ARMOR_PERKS); if(data == null){ continue; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/StackUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/StackUtil.java index fbf99834c2..a7b42c6212 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/StackUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/StackUtil.java @@ -3,6 +3,8 @@ import com.hollingsworth.arsnouveau.api.item.ICasterTool; import com.hollingsworth.arsnouveau.api.item.IRadialProvider; import com.hollingsworth.arsnouveau.api.item.ISpellHotkeyListener; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.common.items.SpellBook; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; @@ -31,14 +33,17 @@ public class StackUtil { } public static @Nullable InteractionHand getHeldCasterTool(Player player) { - InteractionHand casterTool = player.getMainHandItem().getItem() instanceof ICasterTool ? InteractionHand.MAIN_HAND : null; - return casterTool == null ? (player.getOffhandItem().getItem() instanceof ICasterTool ? InteractionHand.OFF_HAND : null) : casterTool; + return getHeldCasterTool(player, (tool) -> true); } - public static @Nullable InteractionHand getHeldCasterTool(Player player, Predicate filter){ - if(player.getMainHandItem().getItem() instanceof ICasterTool casterTool && filter.test(casterTool)) + public static @Nullable InteractionHand getHeldCasterTool(Player player, Predicate filter){ + var mainStack = player.getMainHandItem(); + var offStack = player.getOffhandItem(); + var mainCaster = SpellCasterRegistry.from(mainStack); + var offCaster = SpellCasterRegistry.from(offStack); + if(mainCaster != null && filter.test(mainCaster)) return InteractionHand.MAIN_HAND; - if(player.getOffhandItem().getItem() instanceof ICasterTool casterTool && filter.test(casterTool)) + if(offCaster != null && filter.test(offCaster)) return InteractionHand.OFF_HAND; return null; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java index 229a59c1cd..c660ee4262 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java @@ -501,7 +501,7 @@ public boolean charTyped(char p_charTyped_1_, int p_charTyped_2_) { } @Override - public boolean mouseScrolled(double p_mouseScrolled_1_, double p_mouseScrolled_3_, double p_mouseScrolled_5_) { + public boolean mouseScrolled(double p_mouseScrolled_1_, double p_mouseScrolled_3_, double p_mouseScrolled_5_, double scrollY) { if (!this.needsScrollBars()) { return false; } else { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java index 59e7730b8e..0108039375 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java @@ -4,10 +4,10 @@ import com.hollingsworth.arsnouveau.common.block.tile.CraftingLecternTile; import com.hollingsworth.arsnouveau.setup.registry.MenuRegistry; import net.minecraft.client.RecipeBookCategories; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; -import net.minecraft.recipebook.ServerPlaceRecipe; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Inventory; @@ -15,9 +15,7 @@ import net.minecraft.world.entity.player.StackedContents; import net.minecraft.world.inventory.*; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeHolder; -import net.minecraft.world.item.crafting.RecipeInput; import java.util.ArrayList; import java.util.List; @@ -239,66 +237,67 @@ public void clear() { @Override public void handlePlacement(boolean pPlaceAll, RecipeHolder pRecipe, ServerPlayer pPlayer) { - (new ServerPlaceRecipe(this) { - { - stackedContents = new TerminalRecipeItemHelper(); - } - - - @Override - public void addItemToSlot(Object p_346420_, int pSlot, int pMaxAmount, int p_135418_, int p_135419_) { - Slot slot = this.menu.getSlot(pSlot); - ItemStack itemstack = StackedContents.fromStackingIndex((Integer) pIngredients.next()); - if (!itemstack.isEmpty()) { - for(int i = 0; i < pMaxAmount; ++i) { - this.moveItemToGrid(slot, itemstack); - } - } - } - - @Override - protected void moveItemToGrid(Slot slotToFill, ItemStack ingredientIn) { - int i = this.inventory.findSlotMatchingUnusedItem(ingredientIn); - if (i != -1) { - ItemStack itemstack = this.inventory.getItem(i).copy(); - if (!itemstack.isEmpty()) { - if (itemstack.getCount() > 1) { - this.inventory.removeItem(i, 1); - } else { - this.inventory.removeItemNoUpdate(i); - } - - itemstack.setCount(1); - if (slotToFill.getItem().isEmpty()) { - slotToFill.set(itemstack); - } else { - slotToFill.getItem().grow(1); - } - - } - } else if(te != null) { - StoredItemStack st = te.pullStack(new StoredItemStack(ingredientIn), 1, selectedTab); - if(st != null) { - if (slotToFill.getItem().isEmpty()) { - slotToFill.set(st.getActualStack()); - } else { - slotToFill.getItem().grow(1); - } - } - } - } - - @Override - protected void clearGrid() { - ((CraftingLecternTile) te).clear(selectedTab); - this.menu.clearCraftingContent(); - } - }).recipeClicked(pPlaceAll, pRecipe, pPlayer); + //todo: reenable recipe placement +// (new ServerPlaceRecipe(this) { +// { +// stackedContents = new TerminalRecipeItemHelper(); +// } +// +// +// @Override +// public void addItemToSlot(Object p_346420_, int pSlot, int pMaxAmount, int p_135418_, int p_135419_) { +// Slot slot = this.menu.getSlot(pSlot); +// ItemStack itemstack = StackedContents.fromStackingIndex((Integer) pIngredients.next()); +// if (!itemstack.isEmpty()) { +// for(int i = 0; i < pMaxAmount; ++i) { +// this.moveItemToGrid(slot, itemstack); +// } +// } +// } +// +// @Override +// protected void moveItemToGrid(Slot slotToFill, ItemStack ingredientIn) { +// int i = this.inventory.findSlotMatchingUnusedItem(ingredientIn); +// if (i != -1) { +// ItemStack itemstack = this.inventory.getItem(i).copy(); +// if (!itemstack.isEmpty()) { +// if (itemstack.getCount() > 1) { +// this.inventory.removeItem(i, 1); +// } else { +// this.inventory.removeItemNoUpdate(i); +// } +// +// itemstack.setCount(1); +// if (slotToFill.getItem().isEmpty()) { +// slotToFill.set(itemstack); +// } else { +// slotToFill.getItem().grow(1); +// } +// +// } +// } else if(te != null) { +// StoredItemStack st = te.pullStack(new StoredItemStack(ingredientIn), 1, selectedTab); +// if(st != null) { +// if (slotToFill.getItem().isEmpty()) { +// slotToFill.set(st.getActualStack()); +// } else { +// slotToFill.getItem().grow(1); +// } +// } +// } +// } +// +// @Override +// protected void clearGrid() { +// ((CraftingLecternTile) te).clear(selectedTab); +// this.menu.clearCraftingContent(); +// } +// }).recipeClicked(pPlaceAll, pRecipe, pPlayer); } @Override - public void receive(CompoundTag message) { - super.receive(message); + public void receive(HolderLookup.Provider reg, CompoundTag message) { + super.receive(reg, message); if(message.contains("i")) { ItemStack[][] stacks = new ItemStack[9][]; ListTag list = message.getList("i", 10); @@ -309,7 +308,7 @@ public void receive(CompoundTag message) { stacks[slot] = new ItemStack[l]; for (int j = 0;j < l;j++) { CompoundTag tag = nbttagcompound.getCompound("i" + j); - stacks[slot][j] = ItemStack.parseOptional(tag); + stacks[slot][j] = ItemStack.parseOptional(reg, tag); } } ((CraftingLecternTile) te).transferToGrid(pinv.player, stacks, selectedTab); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java index b34bcca534..32744ce4ad 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java @@ -1,20 +1,23 @@ package com.hollingsworth.arsnouveau.client.container; import com.hollingsworth.arsnouveau.common.block.tile.StorageLecternTile; -import com.hollingsworth.arsnouveau.setup.registry.MenuRegistry; import com.hollingsworth.arsnouveau.common.network.ClientToServerStoragePacket; import com.hollingsworth.arsnouveau.common.network.Networking; +import com.hollingsworth.arsnouveau.setup.registry.MenuRegistry; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.StackedContents; -import net.minecraft.world.inventory.*; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.RecipeBookMenu; +import net.minecraft.world.inventory.RecipeBookType; +import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.CraftingRecipe; -import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeHolder; import java.util.ArrayList; @@ -241,7 +244,7 @@ public final void receiveClientNBTPacket(CompoundTag message) { if(onPacket != null)onPacket.run(); } - public void receive(CompoundTag message) { + public void receive(HolderLookup.Provider reg, CompoundTag message) { if(pinv.player.isSpectator())return; if(message.contains("search")) { te.setLastSearch(message.getString("search")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/StoredItemStack.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/StoredItemStack.java index 21dbafeb1c..49d8238fb8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/StoredItemStack.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/StoredItemStack.java @@ -139,12 +139,7 @@ public IStoredItemStackComparator create(boolean rev) { @Override public int hashCode() { if(hash == 0) { - final int prime = 31; - int result = 1; - result = prime * result + ((stack == null) ? 0 : stack.getItem().hashCode()); - result = prime * result + ((stack == null || !stack.hasTag()) ? 0 : stack.getTag().hashCode()); - hash = result; - return result; + hash = ItemStack.hashItemAndComponents(stack); } return hash; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java index 9a83770d56..f8b99a1b8a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java @@ -192,11 +192,13 @@ public static ResourceLocation getItemId(Item item) { } public static void writeItemId(FriendlyByteBuf buf, Item item) { - buf.writeId(BuiltInRegistries.ITEM, item); + var key = item.builtInRegistryHolder().key().location(); + buf.writeResourceLocation(key); } public static Item readItemId(FriendlyByteBuf buf) { - return buf.readById(BuiltInRegistries.ITEM); + var loc = buf.readResourceLocation(); + return BuiltInRegistries.ITEM.get(loc); } public static CompoundTag getSyncTag(ItemStack stack) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java index 91ee7a9975..306e0598ce 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java @@ -483,7 +483,7 @@ public void onSlotChange(Button button) { this.selectedSpellSlot = this.selected_slot.slotNum; updateCraftingSlots(this.selectedSpellSlot); spell_name.setValue(SpellCasterRegistry.from(bookStack).getSpellName(selectedSpellSlot)); - this.spell = SpellCasterRegistry.from(bookStack).getSpell(selectedSpellSlot).recipe; + this.spell = new ArrayList<>(SpellCasterRegistry.from(bookStack).getSpell(selectedSpellSlot).unsafeList()); updateWindowOffset(0); //includes validation } @@ -507,11 +507,11 @@ public boolean charTyped(char pCodePoint, int pModifiers) { public void updateCraftingSlots(int bookSlot) { //Crafting slots - List recipe = SpellCasterRegistry.from(bookStack).getSpell(bookSlot).recipe; + var recipe = SpellCasterRegistry.from(bookStack).getSpell(bookSlot); for (int i = 0; i < craftingCells.size(); i++) { InfinityCraftingButton slot = craftingCells.get(i); slot.clear(); - if (recipe != null && i < recipe.size()) { + if (i < recipe.size()) { slot.setAbstractSpellPart(recipe.get(i)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index 95232efc67..64bbcde8f2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.api.camera.ICameraMountable; import com.hollingsworth.arsnouveau.api.item.ICasterTool; import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; +import com.hollingsworth.arsnouveau.api.registry.PotionProviderRegistry; import com.hollingsworth.arsnouveau.api.util.PerkUtil; import com.hollingsworth.arsnouveau.client.container.CraftingTerminalScreen; import com.hollingsworth.arsnouveau.client.gui.GuiEntityInfoHUD; @@ -18,8 +19,8 @@ import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.common.block.tile.PotionMelderTile; import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; +import com.hollingsworth.arsnouveau.common.items.data.BlockFillContents; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; -import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.hollingsworth.arsnouveau.common.util.CameraUtil; import com.hollingsworth.arsnouveau.common.util.PotionUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; @@ -36,7 +37,6 @@ import net.minecraft.client.renderer.item.ItemProperties; import net.minecraft.core.BlockPos; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.DyeColor; @@ -99,14 +99,14 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerBlockEntityRenderer(BlockRegistry.REDSTONE_RELAY_TILE.get(), RedstoneRelayRenderer::new); event.registerEntityRenderer(ModEntities.SPELL_PROJ.get(), - renderManager -> new RenderSpell(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); + renderManager -> new RenderSpell(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.SPELL_PROJ_ARC.get(), - renderManager -> new RenderSpell(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); + renderManager -> new RenderSpell(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.SPELL_PROJ_HOM.get(), - renderManager -> new RenderSpell(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); + renderManager -> new RenderSpell(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.ENTITY_FOLLOW_PROJ.get(), - renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); + renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.SUMMON_SKELETON.get(), RenderSummonSkeleton::new); event.registerEntityRenderer(ModEntities.ENTITY_EVOKER_FANGS_ENTITY_TYPE.get(), EvokerFangsRenderer::new); @@ -125,12 +125,12 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer RenderFlyingItem::new); event.registerEntityRenderer(ModEntities.ENTITY_RITUAL.get(), - renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); + renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.ENTITY_SPELL_ARROW.get(), TippableArrowRenderer::new); event.registerEntityRenderer(ModEntities.ENTITY_WIXIE_TYPE.get(), (t) -> new TextureVariantRenderer<>(t, new WixieModel<>())); event.registerEntityRenderer(ModEntities.ENTITY_DUMMY.get(), DummyRenderer::new); event.registerEntityRenderer(ModEntities.ENTITY_DRYGMY.get(), (t) -> new TextureVariantRenderer<>(t, new DrygmyModel<>())); - event.registerEntityRenderer(ModEntities.ORBIT_SPELL.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); + event.registerEntityRenderer(ModEntities.ORBIT_SPELL.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.WILDEN_BOSS.get(), WildenChimeraRenderer::new); event.registerEntityRenderer(ModEntities.ENTITY_CHIMERA_SPIKE.get(), ChimeraProjectileRenderer::new); event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_STARBUNCLE.get(), (t) -> new GenericFamiliarRenderer<>(t, new FamiliarStarbyModel<>())); @@ -141,14 +141,14 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerEntityRenderer(ModEntities.FAMILIAR_AMETHYST_GOLEM.get(), (t) -> new GenericFamiliarRenderer<>(t, new AmethystGolemModel<>())); event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_BOOKWYRM.get(), FamiliarBookwyrmRenderer::new); event.registerEntityRenderer(ModEntities.LINGER_SPELL.get(), - renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); + renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.ENTITY_CASCADING_WEALD.get(), (v) -> new WealdWalkerRenderer<>(v, "cascading_weald")); event.registerEntityRenderer(ModEntities.ENTITY_BLAZING_WEALD.get(), (v) -> new WealdWalkerRenderer<>(v, "blazing_weald")); event.registerEntityRenderer(ModEntities.ENTITY_FLOURISHING_WEALD.get(), (v) -> new WealdWalkerRenderer<>(v, "flourishing_weald")); event.registerEntityRenderer(ModEntities.ENTITY_VEXING_WEALD.get(), (v) -> new WealdWalkerRenderer<>(v, "vexing_weald")); event.registerEntityRenderer(ModEntities.AMETHYST_GOLEM.get(), AmethystGolemRenderer::new); - event.registerEntityRenderer(ModEntities.SCRYER_CAMERA.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); + event.registerEntityRenderer(ModEntities.SCRYER_CAMERA.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.ENCHANTED_FALLING_BLOCK.get(), EnchantedFallingBlockRenderer::new); event.registerEntityRenderer(ModEntities.ICE_SHARD.get(), EnchantedFallingBlockRenderer::new); event.registerEntityRenderer(ModEntities.ENCHANTED_MAGE_BLOCK.get(), MageBlockRenderer::new); @@ -158,11 +158,11 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerEntityRenderer(ModEntities.ANIMATED_HEAD.get(), AnimSkullRenderer::new); event.registerEntityRenderer(ModEntities.CINDER.get(), CinderRenderer::new); event.registerEntityRenderer(ModEntities.WALL_SPELL.get(), - renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix( "textures/entity/spell_proj.png"))); + renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.LILY.get(), LilyRenderer::new); } - public static LayeredDraw.Layer cameraOverlay = new LayeredDraw.Layer(ArsNouveau.prefix( "scry_camera"), (gui, pose) -> { + public static LayeredDraw.Layer cameraOverlay = (gui, tracker) -> { Minecraft mc = Minecraft.getInstance(); Level level = mc.level; BlockPos pos = mc.cameraEntity.blockPosition(); @@ -176,14 +176,14 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer Options settings = Minecraft.getInstance().options; Component lookAround = localize("ars_nouveau.camera.move", settings.keyUp.getTranslatedKeyMessage(), settings.keyLeft.getTranslatedKeyMessage(), settings.keyDown.getTranslatedKeyMessage(), settings.keyRight.getTranslatedKeyMessage()); Component exit = Component.translatable("ars_nouveau.camera.exit", settings.keyShift.getTranslatedKeyMessage().getString()); - pose.drawString(font, lookAround, 10, mc.getWindow().getGuiScaledHeight() - 40, 0xFFFFFF); - pose.drawString(font, exit, 10, mc.getWindow().getGuiScaledHeight() - 30, 0xFFFFFF); + gui.drawString(font, lookAround, 10, mc.getWindow().getGuiScaledHeight() - 40, 0xFFFFFF); + gui.drawString(font, exit, 10, mc.getWindow().getGuiScaledHeight() - 30, 0xFFFFFF); } } - }); + }; @SubscribeEvent - public static void registerMenu(final RegisterMenuScreensEvent event){ + public static void registerMenu(final RegisterMenuScreensEvent event) { event.register(MenuRegistry.STORAGE.get(), CraftingTerminalScreen::new); } @@ -200,10 +200,10 @@ public static void registerOverlays(final RegisterGuiLayersEvent event) { public static void init(final FMLClientSetupEvent evt) { evt.enqueueWork(() -> { - ItemProperties.register(ItemsRegistry.ENCHANTERS_SHIELD.get(), ArsNouveau.prefix( "blocking"), (item, resourceLocation, livingEntity, arg4) -> { + ItemProperties.register(ItemsRegistry.ENCHANTERS_SHIELD.get(), ArsNouveau.prefix("blocking"), (item, resourceLocation, livingEntity, arg4) -> { return livingEntity != null && livingEntity.isUsingItem() && livingEntity.getUseItem() == item ? 1.0F : 0.0F; }); - ItemProperties.register(ItemsRegistry.DOWSING_ROD.get(), ArsNouveau.prefix( "uses"), new ClampedItemPropertyFunction() { + ItemProperties.register(ItemsRegistry.DOWSING_ROD.get(), ArsNouveau.prefix("uses"), new ClampedItemPropertyFunction() { @Override public float unclampedCall(ItemStack pStack, @Nullable ClientLevel pLevel, @Nullable LivingEntity pEntity, int pSeed) { return switch (pStack.getDamageValue()) { @@ -214,13 +214,13 @@ public float unclampedCall(ItemStack pStack, @Nullable ClientLevel pLevel, @Null }; } }); - ItemProperties.register(BlockRegistry.POTION_JAR.asItem(), ArsNouveau.prefix( "amount"), (stack, level, entity, seed) -> { - CompoundTag tag = stack.getTag(); - return tag != null ? (tag.getCompound("BlockEntityTag").getInt("currentFill") / 10000.0F) : 0.0F; + ItemProperties.register(BlockRegistry.POTION_JAR.asItem(), ArsNouveau.prefix("amount"), (stack, level, entity, seed) -> { + int amount = BlockFillContents.get(stack); + return amount / 10000.0f; }); - ItemProperties.register(BlockRegistry.SOURCE_JAR.asItem(), ArsNouveau.prefix( "source"), (stack, level, entity, seed) -> { - CompoundTag tag = stack.getTag(); - return tag != null ? (tag.getCompound("BlockEntityTag").getInt("source") / 10000.0F) : 0.0F; + ItemProperties.register(BlockRegistry.SOURCE_JAR.asItem(), ArsNouveau.prefix("source"), (stack, level, entity, seed) -> { + int amount = BlockFillContents.get(stack); + return amount / 10000.0F; }); }); } @@ -255,7 +255,7 @@ public static void initItemColors(final RegisterColorHandlersEvent.Item event) { event.register((stack, color) -> color > 0 ? -1 : new ParticleColor(200, 0, 200).getColor(), - BuiltInRegistries.ITEM.get(ArsNouveau.prefix( LibBlockNames.POTION_MELDER_BLOCK))); + BuiltInRegistries.ITEM.get(ArsNouveau.prefix(LibBlockNames.POTION_MELDER_BLOCK))); event.register((stack, color) -> color > 0 ? -1 : colorFromArmor(stack), @@ -316,15 +316,11 @@ public static void initItemColors(final RegisterColorHandlersEvent.Item event) { }, ItemsRegistry.SPELL_PARCHMENT); event.register((stack, color) -> { - if (color > 0 || !stack.hasTag()) { + var contents = PotionProviderRegistry.from(stack); + if (contents == null) { return -1; } - CompoundTag blockTag = stack.getOrCreateTag().getCompound("BlockEntityTag"); - if (blockTag.contains("potionData")) { - PotionContents data = ANCodecs.decode(PotionContents.CODEC, blockTag.getCompound("potionData")); - return data.getColor(); - } - return -1; + return contents.getPotionData(stack).getColor(); }, BlockRegistry.POTION_JAR); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java index 7aff7ac6d4..de7b8a6daa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java @@ -1,11 +1,12 @@ package com.hollingsworth.arsnouveau.common.armor; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.client.IVariantColorProvider; import com.hollingsworth.arsnouveau.api.mana.IManaEquipment; -import com.hollingsworth.arsnouveau.api.perk.*; +import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; +import com.hollingsworth.arsnouveau.api.perk.ITickablePerk; +import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; +import com.hollingsworth.arsnouveau.api.perk.PerkInstance; import com.hollingsworth.arsnouveau.api.util.PerkUtil; import com.hollingsworth.arsnouveau.client.renderer.item.ArmorRenderer; import com.hollingsworth.arsnouveau.client.renderer.tile.GenericModel; @@ -22,10 +23,10 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; -import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.*; import net.minecraft.world.item.component.ItemAttributeModifiers; import net.minecraft.world.level.Level; @@ -42,7 +43,6 @@ import software.bernie.geckolib.util.GeckoLibUtil; import java.util.List; -import java.util.UUID; import java.util.function.Consumer; public class AnimatedMagicArmor extends ArmorItem implements IManaEquipment, IDyeable, GeoItem, IVariantColorProvider { @@ -74,43 +74,36 @@ public void registerControllers(AnimatableManager.ControllerRegistrar data) { } @Override - public void onArmorTick(ItemStack stack, Level world, Player player) { - if (world.isClientSide()) - return; - RepairingPerk.attemptRepair(stack, player); - IPerkHolder perkHolder = PerkUtil.getPerkHolder(stack); - if (perkHolder == null) - return; - for (PerkInstance instance : perkHolder.getPerkInstances(stack)) { - if (instance.getPerk() instanceof ITickablePerk tickablePerk) { - tickablePerk.tick(stack, world, player, instance); + public void inventoryTick(ItemStack stack, Level world, Entity player, int slotId, boolean pIsSelected) { + super.inventoryTick(stack, world, player, slotId, pIsSelected); + if(slotId >= Inventory.INVENTORY_SIZE && slotId < Inventory.INVENTORY_SIZE + 4){ + if (world.isClientSide()) + return; + if(player instanceof LivingEntity livingEntity) { + RepairingPerk.attemptRepair(stack, livingEntity); + IPerkHolder perkHolder = PerkUtil.getPerkHolder(stack); + if (perkHolder == null) + return; + for (PerkInstance instance : perkHolder.getPerkInstances(stack)) { + if (instance.getPerk() instanceof ITickablePerk tickablePerk) { + tickablePerk.tick(stack, world, livingEntity, instance); + } + } } } } @Override public ItemAttributeModifiers getDefaultAttributeModifiers(ItemStack stack) { - return super.getDefaultAttributeModifiers(stack); - } + var modifiers = super.getDefaultAttributeModifiers(stack); + IPerkHolder perkHolder = PerkUtil.getPerkHolder(stack); + if(perkHolder == null) + return modifiers; + modifiers.withModifierAdded(PerkAttributes.MAX_MANA, new AttributeModifier(ArsNouveau.prefix("max_mana_armor"), 30 * (perkHolder.getTier() + 1), AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.bySlot(this.type.getSlot())); - @Override - public Multimap getAttributeModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack) { - ImmutableMultimap.Builder attributes = new ImmutableMultimap.Builder<>(); - attributes.putAll(super.getDefaultAttributeModifiers(pEquipmentSlot)); - if (this.type.getSlot() == pEquipmentSlot) { - UUID uuid = ARMOR_MODIFIER_UUID_PER_TYPE.get(type); - IPerkHolder perkHolder = PerkUtil.getPerkHolder(stack); - if (perkHolder != null) { - attributes.put(PerkAttributes.MAX_MANA.get(), new AttributeModifier(uuid, "max_mana_armor", 30 * (perkHolder.getTier() + 1), AttributeModifier.Operation.ADD_VALUE)); - attributes.put(PerkAttributes.MANA_REGEN_BONUS.get(), new AttributeModifier(uuid, "mana_regen_armor", perkHolder.getTier() + 1, AttributeModifier.Operation.ADD_VALUE)); - for (PerkInstance perkInstance : perkHolder.getPerkInstances()) { - IPerk perk = perkInstance.getPerk(); - attributes.putAll(perk.getModifiers(this.type.getSlot(), stack, perkInstance.getSlot().value())); - } + modifiers.withModifierAdded(PerkAttributes.MANA_REGEN_BONUS, new AttributeModifier(ArsNouveau.prefix("mana_regen_armor"), perkHolder.getTier() + 1, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.bySlot(this.type.getSlot())); - } - } - return attributes.build(); + return modifiers; } @Override @@ -126,13 +119,11 @@ public void appendHoverText(ItemStack stack, TooltipContext world, List tooltip, TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip, flagIn); - if (stack.getTag() == null) - return; - int mana = stack.getTag().getCompound("BlockEntityTag").getInt("source"); + int mana = BlockFillContents.get(stack); tooltip.add(Component.literal((mana * 100) / 10000 + "% full")); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/SummonBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/SummonBlock.java index 8e1db84139..e8856cea49 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/SummonBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/SummonBlock.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.common.block; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; @@ -21,13 +20,14 @@ public SummonBlock(Properties properties) { @Override public BlockState getStateForPlacement(BlockPlaceContext context) { BlockState state = super.getStateForPlacement(context); - CompoundTag tag = context.getItemInHand().getTag(); - if (tag != null && tag.contains("BlockEntityTag")) { - tag = tag.getCompound("BlockEntityTag"); - if (tag.contains("converted") && tag.getBoolean("converted")) { - state = state.setValue(CONVERTED, true); - } - } + //todo: check if needed? +// CompoundTag tag = context.getItemInHand().getTag(); +// if (tag != null && tag.contains("BlockEntityTag")) { +// tag = tag.getCompound("BlockEntityTag"); +// if (tag.contains("converted") && tag.getBoolean("converted")) { +// state = state.setValue(CONVERTED, true); +// } +// } return state; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java index 907e098674..22d7dcbc03 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java @@ -22,7 +22,6 @@ import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.event.EventHooks; -import net.neoforged.neoforge.items.ItemHandlerHelper; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -132,7 +131,9 @@ public void craftShift(Player player, @Nullable String tab) { } crafted.onCraftedBy(player.level, player, amountCrafted); - EventHooks.firePlayerCraftingEvent(player, ItemHandlerHelper.copyStackWithSize(crafted, amountCrafted), craftMatrix); + var copyStack = crafted.copy(); + copyStack.setCount(amountCrafted); + EventHooks.firePlayerCraftingEvent(player, copyStack, craftMatrix); } public void craft(Player thePlayer, @Nullable String tab) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java index f56ab75747..6b09a5469f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java @@ -8,6 +8,7 @@ import com.hollingsworth.arsnouveau.client.particle.GlowParticleData; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; +import com.hollingsworth.arsnouveau.common.datagen.BlockTagProvider; import com.hollingsworth.arsnouveau.common.entity.EntityFollowProjectile; import com.hollingsworth.arsnouveau.common.entity.Whirlisprig; import com.hollingsworth.arsnouveau.setup.config.Config; @@ -171,7 +172,7 @@ public static int getScore(BlockState state) { return 2; - if (state.getBlock() instanceof StemGrownBlock) + if (state.is(BlockTagProvider.HARVEST_STEMS)) return 2; if (state.is(BlockTags.LOGS)) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java index ffe6144719..5478096334 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java @@ -40,4 +40,5 @@ public ItemStack assemble(CraftingInput inv, HolderLookup.Provider p_266797_) { public RecipeSerializer getSerializer() { return RecipeRegistry.DYE_RECIPE.get(); } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java index faab4937ab..c1d6160613 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java @@ -854,11 +854,13 @@ public void addEntries() { reactiveIngredients.add(Ingredient.of(ItemsRegistry.SPELL_PARCHMENT.get())); reactiveIngredients.add(Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)); reactiveIngredients.add(RecipeDatagen.SOURCE_GEM_BLOCK); - addRecipe(new ReactiveEnchantmentRecipe(reactiveIngredients, 3000)); + addRecipe(new ApparatusRecipeBuilder.RecipeWrapper<>(ArsNouveau.prefix("reactive"), + new ReactiveEnchantmentRecipe(reactiveIngredients, 3000), + ReactiveEnchantmentRecipe.Serializer.CODEC)); List spellWriteList = new ArrayList<>(); spellWriteList.add(Ingredient.of(ItemsRegistry.SPELL_PARCHMENT.get())); - addRecipe(new SpellWriteRecipe(spellWriteList)); + addRecipe(new ApparatusRecipeBuilder.RecipeWrapper<>(ArsNouveau.prefix("spell_write"), new SpellWriteRecipe(spellWriteList, 3000), SpellWriteRecipe.Serializer.CODEC)); addRecipe(builder() .withPedestalItem(4, Ingredient.of(Tags.Items.GEMS_DIAMOND)) @@ -904,8 +906,12 @@ public void addEntries() { .withPedestalItem(2, ItemsRegistry.AIR_ESSENCE) .build()); - addRecipe(new ArmorUpgradeRecipe(List.of(Ingredient.of(Tags.Items.RODS_BLAZE), Ingredient.of(Tags.Items.RODS_BLAZE)), 2500, 1)); - addRecipe(new ArmorUpgradeRecipe(List.of(Ingredient.of(Tags.Items.ENDER_PEARLS), Ingredient.of(Tags.Items.ENDER_PEARLS), Ingredient.of(Items.CHORUS_FRUIT)), 5000, 2)); + addRecipe(new ApparatusRecipeBuilder.RecipeWrapper<>(ArsNouveau.prefix("first_armor_upgrade"), + new ArmorUpgradeRecipe(List.of(Ingredient.of(Tags.Items.RODS_BLAZE), Ingredient.of(Tags.Items.RODS_BLAZE)), 2500, 1), + ArmorUpgradeRecipe.Serializer.CODEC)); + addRecipe(new ApparatusRecipeBuilder.RecipeWrapper<>(ArsNouveau.prefix("second_armor_upgrade"), + new ArmorUpgradeRecipe(List.of(Ingredient.of(Tags.Items.ENDER_PEARLS), Ingredient.of(Tags.Items.ENDER_PEARLS), Ingredient.of(Items.CHORUS_FRUIT)), 5000, 2), + ArmorUpgradeRecipe.Serializer.CODEC)); addRecipe(builder().withResult(getPerkItem(StarbunclePerk.INSTANCE.getRegistryName())) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AtlasProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AtlasProvider.java index 7dc342c171..5f31eab8d3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AtlasProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AtlasProvider.java @@ -6,6 +6,7 @@ import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.texture.atlas.sources.SingleFile; import net.minecraft.client.resources.model.Material; +import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.properties.ChestType; @@ -15,6 +16,7 @@ import java.util.EnumMap; import java.util.Map; import java.util.Optional; +import java.util.concurrent.CompletableFuture; public class AtlasProvider extends SpriteSourceProvider { public static final Map> MATERIALS; @@ -25,8 +27,8 @@ public class AtlasProvider extends SpriteSourceProvider { builder.put(BlockRegistry.ARCHWOOD_CHEST.get(), chestMaterial("archwood")); MATERIALS = builder.build(); } - public AtlasProvider(PackOutput output, ExistingFileHelper helper) { - super(output, helper, ArsNouveau.MODID); + public AtlasProvider(PackOutput output, CompletableFuture provider, ExistingFileHelper helper) { + super(output, provider, ArsNouveau.MODID, helper); } private static EnumMap chestMaterial(String type) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DyeRecipeDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DyeRecipeDatagen.java index 28f03f558b..0213adfcb4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DyeRecipeDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DyeRecipeDatagen.java @@ -1,7 +1,6 @@ package com.hollingsworth.arsnouveau.common.datagen; import com.google.gson.JsonElement; -import com.hollingsworth.arsnouveau.common.crafting.recipes.DyeRecipe; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; @@ -11,8 +10,6 @@ import java.util.ArrayList; import java.util.List; -import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; - public class DyeRecipeDatagen extends SimpleDataProvider { List files = new ArrayList<>(); @@ -48,8 +45,10 @@ public void add(FileObj fileObj){ } public void addDyeRecipe(ItemLike inputItem){ - JsonElement dyeRecipe = DyeRecipe.asRecipe(inputItem.asItem()); - add(new FileObj(output.resolve("data/ars_nouveau/recipes/dye_" + getRegistryName(inputItem.asItem()).getPath() + ".json"), dyeRecipe)); + //todo: restore dye serializer +// var dyeRecipe = new DyeRecipe("", CraftingBookCategory.MISC, inputItem, List.of()) +// RecipeRegistry.DYE_RECIPE.get().codec().codec().encode(new DyeRecipe()) +// add(new FileObj(output.resolve("data/ars_nouveau/recipes/dye_" + getRegistryName(inputItem.asItem()).getPath() + ".json"), DyeRecipe.)); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java index 7476761d59..5e57421535 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java @@ -46,7 +46,7 @@ public static void datagen(GatherDataEvent event) { event.getGenerator().addProvider(event.includeServer(), new ScryRitualProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new DispelEntityProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new StructureTagProvider(output, provider, fileHelper)); - event.getGenerator().addProvider(event.includeClient(), new AtlasProvider(output, fileHelper)); + event.getGenerator().addProvider(event.includeClient(), new AtlasProvider(output, provider, fileHelper)); event.getGenerator().addProvider(event.includeServer(), new DamageTypesProvider(output, provider)); event.getGenerator().addProvider(event.includeServer(), new DamageTypesProvider.DamageTypesTagsProvider(output, provider, fileHelper)); event.getGenerator().addProvider(event.includeServer(), new CompostablesProvider(output, provider)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java index 96ee85a63d..e4ad716fd5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java @@ -747,12 +747,12 @@ public void addRitualPage(AbstractRitual ritual) { } public void addEnchantmentPage(ResourceKey enchantment) { - PatchouliBuilder builder = new PatchouliBuilder(ENCHANTMENTS, enchantment.getDescriptionId()) - .withIcon(getRegistryName(Items.ENCHANTED_BOOK).toString()); - for (int i = enchantment.getMinLevel(); i <= enchantment.getMaxLevel(); i++) { - builder.withPage(new EnchantingPage("ars_nouveau:" + enchantment.location().getPath() + "_" + i)); - } - this.pages.add(new PatchouliPage(builder, this.output.resolve("assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/" + enchantment.location().getPath() + ".json"))); +// PatchouliBuilder builder = new PatchouliBuilder(ENCHANTMENTS, enchantment.getDescriptionId()) +// .withIcon(getRegistryName(Items.ENCHANTED_BOOK).toString()); +// for (int i = enchantment.getMinLevel(); i <= enchantment.getMaxLevel(); i++) { +// builder.withPage(new EnchantingPage("ars_nouveau:" + enchantment.location().getPath() + "_" + i)); +// } +// this.pages.add(new PatchouliPage(builder, this.output.resolve("assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/" + enchantment.location().getPath() + ".json"))); } public void addPerkPage(IPerk perk){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDummy.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDummy.java index 726a097e67..c8c4abbe1e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDummy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDummy.java @@ -8,6 +8,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.PlayerInfo; import net.minecraft.client.resources.DefaultPlayerSkin; +import net.minecraft.client.resources.PlayerSkin; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; @@ -31,6 +32,7 @@ import net.minecraft.world.scores.PlayerTeam; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; + import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Optional; @@ -191,7 +193,7 @@ public void setOwnerID(UUID uuid) { @OnlyIn(Dist.CLIENT) public boolean isSlim() { if (this.playerInfo != null) { - return playerInfo.getModelName().equals("slim"); + return playerInfo.getSkin().model() == PlayerSkin.Model.SLIM; }else return false; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java index 7006878fc0..254349bd00 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java @@ -9,6 +9,7 @@ import com.hollingsworth.arsnouveau.common.entity.statemachine.starbuncle.DecideStarbyActionState; import com.hollingsworth.arsnouveau.common.entity.statemachine.starbuncle.StarbyState; import com.hollingsworth.arsnouveau.common.items.ItemScroll; +import com.hollingsworth.arsnouveau.common.util.ItemUtil; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; @@ -188,7 +189,7 @@ public int getMaxTake(ItemStack stack) { ItemStack handlerStack = handler.getStackInSlot(i); if (handlerStack.isEmpty()) { return handler.getSlotLimit(i); - } else if (ItemHandlerHelper.canItemStacksStack(handler.getStackInSlot(i), stack)) { + } else if (ItemUtil.canStack(handler.getStackInSlot(i), stack)) { int originalCount = stack.getCount(); ItemStack simStack = handler.insertItem(i, stack, true); int maxRoom = originalCount - simStack.getCount(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java index 0e33b93241..1cc2673edb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.client.renderer.item.MobJarItemRenderer; import com.hollingsworth.arsnouveau.common.block.tile.MobJarTile; import com.hollingsworth.arsnouveau.common.lib.EntityTags; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.ChatFormatting; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.nbt.CompoundTag; @@ -73,10 +74,10 @@ public void appendHoverText(ItemStack stack, TooltipContext pLevel, List CODEC = Codec.INT.xmap(BlockFillContents::new, BlockFillContents::amount); + public static final StreamCodec STREAM_CODEC = StreamCodec.composite(ByteBufCodecs.INT, BlockFillContents::amount, BlockFillContents::new); + + public static int get(ItemStack stack){ + return stack.getOrDefault(DataComponentRegistry.BLOCK_FILL_CONTENTS, new BlockFillContents(0)).amount; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MobJarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MobJarData.java new file mode 100644 index 0000000000..a167044754 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MobJarData.java @@ -0,0 +1,13 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; +import com.mojang.serialization.Codec; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; + +public record MobJarData(CompoundTag entityTag) { + + public static final Codec CODEC = CompoundTag.CODEC.xmap(MobJarData::new, MobJarData::entityTag); + public static final StreamCodec STREAM = CheatSerializer.create(CODEC); +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/DamageSourceMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/DamageSourceMixin.java index 981d3e8443..26d6d1a57c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/DamageSourceMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/DamageSourceMixin.java @@ -2,7 +2,6 @@ import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.common.items.SpellBook; -import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.*; @@ -12,7 +11,6 @@ import net.minecraft.world.item.ItemStack; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -33,9 +31,9 @@ private void spellDeathMessage(LivingEntity pLivingEntity, CallbackInfoReturnabl if (!(mainHand.getItem() instanceof SpellBook spellBook)) return; Spell spell = spellBook.getSpellCaster(mainHand).getSpell(); - if (spell.name.isBlank()) return; + if (spell.name().isBlank()) return; - MutableComponent spellName = ComponentUtils.wrapInSquareBrackets(Component.empty().append(spell.name).withStyle(Style.EMPTY.withColor(spell.color.getColor())) + MutableComponent spellName = ComponentUtils.wrapInSquareBrackets(Component.empty().append(spell.name()).withStyle(Style.EMPTY.withColor(spell.color().getColor())) .withStyle(ChatFormatting.ITALIC)) .withStyle(mainHand.getRarity().getStyleModifier()) .withStyle((comp) -> comp.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_ITEM, new HoverEvent.ItemStackInfo(mainHand)))); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/ClientToServerStoragePacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/ClientToServerStoragePacket.java index 463500d2f5..3a01d60221 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/ClientToServerStoragePacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/ClientToServerStoragePacket.java @@ -31,7 +31,7 @@ public void toBytes(RegistryFriendlyByteBuf pb) { @Override public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer sender) { if (sender.containerMenu instanceof StorageTerminalMenu terminalScreen){ - terminalScreen.receive(tag); + terminalScreen.receive(minecraftServer.registryAccess(), tag); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketHotkeyPressed.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketHotkeyPressed.java index e5d1de6f8d..a4662db98b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketHotkeyPressed.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketHotkeyPressed.java @@ -39,7 +39,7 @@ public void toBytes(RegistryFriendlyByteBuf buf) { @Override public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { // Returns the hand holding an item with slots > 1, this only checks for NEXT/PREVIOUS slots for hotkeys. - InteractionHand hand = StackUtil.getHeldCasterTool(player, (tool) -> tool.getSpellCaster().getMaxSlots() > 1); + InteractionHand hand = StackUtil.getHeldCasterTool(player, (tool) -> tool.getMaxSlots() > 1); if (hand == null) return; ItemStack stack = player.getItemInHand(hand); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/RepairingPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/RepairingPerk.java index e062e558b1..ba99dd6ff3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/RepairingPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/RepairingPerk.java @@ -5,7 +5,7 @@ import com.hollingsworth.arsnouveau.api.util.PerkUtil; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; public class RepairingPerk extends Perk { @@ -16,7 +16,7 @@ public RepairingPerk(ResourceLocation key) { super(key); } - public static void attemptRepair(ItemStack stack, Player entity){ + public static void attemptRepair(ItemStack stack, LivingEntity entity){ if(entity.level.getGameTime() % 200 != 0 || stack.getDamageValue() <= 0) return; double repairLevel = PerkUtil.countForPerk(RepairingPerk.INSTANCE, entity); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/FlightEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/FlightEffect.java deleted file mode 100644 index 174d70aafd..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/FlightEffect.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.hollingsworth.arsnouveau.common.potions; - -import com.hollingsworth.arsnouveau.common.network.Networking; -import com.hollingsworth.arsnouveau.common.network.PacketUpdateFlight; -import com.hollingsworth.arsnouveau.setup.registry.ModPotions; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.effect.MobEffect; -import net.minecraft.world.effect.MobEffectCategory; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.attributes.AttributeMap; -import net.minecraft.world.entity.player.Player; - -public class FlightEffect extends MobEffect { - - public FlightEffect() { - super(MobEffectCategory.BENEFICIAL, 2039587); - } - - @Override - public boolean applyEffectTick(LivingEntity entity, int p_76394_2_) { - if (entity instanceof Player player) { - player.abilities.mayfly = player.isCreative() || entity.isSpectator() || getFlightDuration(entity) > 2; - } - return true; - } - - @Override - public void removeAttributeModifiers(AttributeMap pAttributeMap) { - super.removeAttributeModifiers(pAttributeMap); - if (entity instanceof Player player) { - // check for effect duration because this is also called from LivingEntity::onEffectUpdated - boolean canFly = player.isCreative() || entity.isSpectator() || getFlightDuration(entity) > 2; - boolean wasFlying = canFly && player.abilities.flying; - player.abilities.mayfly = canFly; - player.abilities.flying = wasFlying; - Networking.sendToPlayerClient(new PacketUpdateFlight(canFly, wasFlying), (ServerPlayer) player); - } - } - - public int getFlightDuration(LivingEntity entity) { - MobEffectInstance effect = entity.getEffect(ModPotions.FLIGHT_EFFECT); - return effect != null ? effect.getDuration() : 0; - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java index de82a4e2e6..3f649fbc5e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.api.item.inv.InteractType; import com.hollingsworth.arsnouveau.api.item.inv.InventoryManager; import com.hollingsworth.arsnouveau.api.item.inv.SlotReference; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.api.util.StackUtil; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; @@ -66,7 +67,7 @@ public Component getName(Level world, @NotNull LivingEntity shooter, SpellStats if (newName == null && isRealPlayer(shooter) && shooter instanceof Player player) { ItemStack stack = StackUtil.getHeldCasterToolOrEmpty(player); if (stack != ItemStack.EMPTY) { - ISpellCaster caster = SpellCasterRegistry.from(stack); + SpellCaster caster = SpellCasterRegistry.from(stack); newName = Component.literal(caster.getSpellName()); } } @@ -86,7 +87,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull return; } if(blockEntity instanceof BaseContainerBlockEntity nameable){ - nameable.setCustomName(name); + nameable.name = name; world.sendBlockUpdated(pos, state, state, 3); nameable.setChanged(); return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java index ba90d4edbd..5e8cc282ce 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.TileCaster; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; +import com.hollingsworth.arsnouveau.common.util.ItemUtil; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.item.ItemEntity; @@ -73,7 +74,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull ItemStack stackInTarget = targetInv.getStackInSlot(i); if(stackInTarget.isEmpty()){ return targetInv.getSlotLimit(i); - }else if (ItemHandlerHelper.canItemStacksStack(stackInTarget, stackToExtract)) { + }else if (ItemUtil.canStack(stackInTarget, stackToExtract)) { int origSize = stackToExtract.getCount(); ItemStack simReturn = targetInv.insertItem(i, stackToExtract, true); int maxRoom = origSize - simReturn.getCount(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/ItemUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/ItemUtil.java new file mode 100644 index 0000000000..8850e40e12 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/ItemUtil.java @@ -0,0 +1,14 @@ +package com.hollingsworth.arsnouveau.common.util; + +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; + +public class ItemUtil { + + public static boolean canStack(ItemStack a, ItemStack b) { + ItemStack singleA = a.copyWithCount(1); + ItemStack singleB = b.copyWithCount(1); + return ItemEntity.areMergable(singleA, singleB); + } + +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java index 098adb50c0..631a377a93 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java @@ -40,4 +40,8 @@ public class DataComponentRegistry { public static final DeferredHolder, DataComponentType> SPELL_CASTER = DATA.register("spell_caster", () -> DataComponentType.builder().persistent(SpellCaster.CODEC.codec()).networkSynchronized(SpellCaster.STREAM).build()); public static final DeferredHolder, DataComponentType> POTION_LAUNCHER = DATA.register("potion_launcher", () -> DataComponentType.builder().persistent(PotionLauncherData.CODEC.codec()).networkSynchronized(PotionLauncherData.STREAM).build()); + + public static final DeferredHolder, DataComponentType> BLOCK_FILL_CONTENTS = DATA.register("block_fill_contents", () -> DataComponentType.builder().persistent(BlockFillContents.CODEC).networkSynchronized(BlockFillContents.STREAM_CODEC).build()); + + public static final DeferredHolder, DataComponentType> MOB_JAR = DATA.register("mob_jar", () -> DataComponentType.builder().persistent(MobJarData.CODEC).networkSynchronized(MobJarData.STREAM).build()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java index 4b1f563469..bcc16101f1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java @@ -16,6 +16,7 @@ import net.minecraft.world.item.alchemy.PotionBrewing; import net.minecraft.world.item.alchemy.Potions; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.common.NeoForgeMod; import net.neoforged.neoforge.event.brewing.RegisterBrewingRecipesEvent; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; @@ -51,7 +52,7 @@ public void addAttributeModifiers(AttributeMap pAttributeMap, int pAmplifier) { public static final DeferredHolder SCRYING_EFFECT = EFFECTS.register(SCRYING, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 2039587)); public static final DeferredHolder GLIDE_EFFECT = EFFECTS.register(GLIDE, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 8080895)); public static final DeferredHolder SNARE_EFFECT = EFFECTS.register(SNARE, SnareEffect::new); - public static final DeferredHolder FLIGHT_EFFECT = EFFECTS.register(FLIGHT, FlightEffect::new); + public static final DeferredHolder FLIGHT_EFFECT = EFFECTS.register(FLIGHT, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 2039587).addAttributeModifier(NeoForgeMod.CREATIVE_FLIGHT, ArsNouveau.prefix("flight"), 1.0, AttributeModifier.Operation.ADD_VALUE)); public static final DeferredHolder GRAVITY_EFFECT = EFFECTS.register(GRAVITY, GravityEffect::new); public static final DeferredHolder SPELL_DAMAGE_EFFECT = EFFECTS.register(SPELL_DAMAGE, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, new ParticleColor(30, 200, 200).getColor())); public static final DeferredHolder IMMOLATE_EFFECT = EFFECTS.register(IMMOLATE, ImmolateEffect::new); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 39a1c14eaa..0b68280c90 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -31,7 +31,7 @@ public net.minecraft.client.multiplayer.ClientChunkCache$Storage viewCenterZ # v public net.minecraft.client.multiplayer.ClientChunkCache$Storage *() # wildcard for all methods public net.minecraft.world.entity.item.FallingBlockEntity (Lnet/minecraft/world/level/Level;DDDLnet/minecraft/world/level/block/state/BlockState;)V # FallingBlockEntity public net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType (Lcom/mojang/serialization/MapCodec;)V # TrunkPlacerType - +public net.minecraft.world.level.block.entity.BaseContainerBlockEntity name # name public net.minecraft.world.entity.Entity eyeHeight # eyeHeight public net.minecraft.world.entity.npc.Villager increaseMerchantCareer()V # increaseMerchantCareer public net.minecraft.world.entity.npc.Villager increaseProfessionLevelOnUpdate # increaseProfessionLevelOnUpdate From 4ac4bb0f9e96b6dbc62786a35c2057169d59c219 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 3 Jul 2024 23:32:12 -0500 Subject: [PATCH 026/363] latest neofroge, fix rest of item casters --- gradle.properties | 2 +- .../arsnouveau/api/item/ICasterTool.java | 4 +- .../api/registry/CasterProvider.java | 4 +- .../api/registry/SpellCasterRegistry.java | 13 +- .../api/spell/CasterCapability.java | 29 + ...rProvider.java => ItemCasterProvider.java} | 2 +- .../arsnouveau/api/spell/SpellCaster.java | 27 +- .../client/events/ClientEvents.java | 11 +- .../client/gui/NoShadowTextField.java | 3 +- .../common/block/ScryersOculus.java | 4 +- .../common/block/StrippableLog.java | 10 +- .../block/tile/BasicSpellTurretTile.java | 4 +- .../common/camera/CameraEvents.java | 5 +- .../recipes/BuddingConversionRecipe.java | 4 +- .../crafting/recipes/SpellWriteRecipe.java | 13 +- .../datagen/BuddingConversionProvider.java | 16 +- .../common/datagen/DefaultTableProvider.java | 762 +++++++++--------- .../common/datagen/DispelEntityProvider.java | 18 +- .../arsnouveau/common/datagen/ModDatagen.java | 2 +- .../common/entity/EntitySpellArrow.java | 50 +- .../arsnouveau/common/event/ArsEvents.java | 18 +- .../arsnouveau/common/event/EventHandler.java | 31 +- .../common/event/FamiliarEvents.java | 4 +- .../common/event/OpenChestEvent.java | 2 +- .../common/event/ReactiveEvents.java | 13 +- .../common/items/BlankParchmentItem.java | 4 +- .../arsnouveau/common/items/CasterTome.java | 41 +- .../arsnouveau/common/items/ScryCaster.java | 82 +- .../arsnouveau/common/items/ScryerScroll.java | 6 +- .../common/items/SpellCrossbow.java | 212 ++--- .../common/items/data/ReactiveCasterData.java | 36 + .../common/items/data/ScryCasterData.java | 107 +++ .../common/items/data/ScryData.java | 12 - .../common/items/data/ScryPosData.java | 12 + .../common/items/data/TomeCasterData.java | 59 ++ .../common/mixin/CrossbowMixin.java | 26 - .../common/network/PacketSetBookMode.java | 4 +- .../common/potions/BounceEffect.java | 11 +- .../common/potions/GravityEffect.java | 11 +- .../common/spell/casters/ReactiveCaster.java | 26 - .../common/spell/effect/EffectLight.java | 2 +- .../arsnouveau/common/util/ANCodecs.java | 6 + .../setup/registry/DataComponentRegistry.java | 10 +- .../resources/META-INF/accesstransformer.cfg | 2 + src/main/resources/ars_nouveau.mixins.json | 1 - 45 files changed, 857 insertions(+), 864 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/spell/CasterCapability.java rename src/main/java/com/hollingsworth/arsnouveau/api/spell/{ISpellCasterProvider.java => ItemCasterProvider.java} (78%) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/ReactiveCasterData.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryData.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryPosData.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/mixin/CrossbowMixin.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/spell/casters/ReactiveCaster.java diff --git a/gradle.properties b/gradle.properties index fe31396499..2c6258496e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ neogradle.subsystems.parchment.mappingsVersion=2024.05.01 minecraft_version=1.21.0 parchment_version=2024.05.01 minecraft_version_range=[1.20.6,1.21) -neo_version=21.0.21-beta +neo_version=21.0.52-beta neo_version_range=[20.6,) loader_version_range=[2,) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java index 47b92ce738..97ef9bb6ca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java @@ -3,7 +3,7 @@ import com.hollingsworth.arsnouveau.api.client.IDisplayMana; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; -import com.hollingsworth.arsnouveau.api.spell.ISpellCasterProvider; +import com.hollingsworth.arsnouveau.api.spell.ItemCasterProvider; import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.common.items.SpellBook; @@ -29,7 +29,7 @@ * An interface for caster items that provides default behavior for scribing, displaying mana, and tooltips */ // TODO 1.20: Split ISpellHotkeyListener out -public interface ICasterTool extends IScribeable, IDisplayMana, ISpellHotkeyListener, ISpellCasterProvider { +public interface ICasterTool extends IScribeable, IDisplayMana, ISpellHotkeyListener, ItemCasterProvider { @Override default boolean onScribe(Level world, BlockPos pos, Player player, InteractionHand handIn, ItemStack tableStack) { ItemStack heldStack = player.getItemInHand(handIn); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterProvider.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterProvider.java index c6aa18c4d1..5939f16ddb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterProvider.java @@ -1,12 +1,12 @@ package com.hollingsworth.arsnouveau.api.registry; -import com.hollingsworth.arsnouveau.api.spell.ISpellCasterProvider; +import com.hollingsworth.arsnouveau.api.spell.ItemCasterProvider; import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import net.minecraft.world.item.ItemStack; import java.util.function.Function; -public class CasterProvider implements ISpellCasterProvider { +public class CasterProvider implements ItemCasterProvider { ItemStack stack; Function casterGetter; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellCasterRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellCasterRegistry.java index 97ed257805..0d55162de8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellCasterRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellCasterRegistry.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.api.registry; -import com.hollingsworth.arsnouveau.api.spell.ISpellCasterProvider; +import com.hollingsworth.arsnouveau.api.spell.ItemCasterProvider; import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; @@ -12,25 +12,28 @@ import java.util.concurrent.ConcurrentHashMap; public class SpellCasterRegistry { - private static final ConcurrentHashMap MAP = new ConcurrentHashMap<>(); + + private static final ConcurrentHashMap MAP = new ConcurrentHashMap<>(); static{ register(ItemsRegistry.NOVICE_SPELLBOOK, (stack) -> stack.get(DataComponentRegistry.SPELL_CASTER)); register(ItemsRegistry.APPRENTICE_SPELLBOOK, (stack) -> stack.get(DataComponentRegistry.SPELL_CASTER)); register(ItemsRegistry.ARCHMAGE_SPELLBOOK, (stack) -> stack.get(DataComponentRegistry.SPELL_CASTER)); register(ItemsRegistry.CREATIVE_SPELLBOOK, (stack) -> stack.get(DataComponentRegistry.SPELL_CASTER)); - + register(ItemsRegistry.SCRY_CASTER, (stack) -> stack.get(DataComponentRegistry.SCRY_CASTER)); + register(ItemsRegistry.CASTER_TOME, (stack) -> stack.get(DataComponentRegistry.TOME_CASTER)); + register(ItemsRegistry.SPELL_PARCHMENT, (stack) -> stack.get(DataComponentRegistry.SPELL_CASTER)); } public static @Nullable SpellCaster from(ItemStack stack){ return MAP.getOrDefault(stack.getItem().builtInRegistryHolder().key().location(), (s) -> s.get(DataComponentRegistry.SPELL_CASTER)).getSpellCaster(stack); } - public static void register(ItemLike itemLike, ISpellCasterProvider provider){ + public static void register(ItemLike itemLike, ItemCasterProvider provider){ MAP.put(itemLike.asItem().builtInRegistryHolder().key().location(), provider); } - public static void register(ResourceLocation location, ISpellCasterProvider provider){ + public static void register(ResourceLocation location, ItemCasterProvider provider){ MAP.put(location, provider); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/CasterCapability.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/CasterCapability.java new file mode 100644 index 0000000000..ff50a6a59a --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/CasterCapability.java @@ -0,0 +1,29 @@ +package com.hollingsworth.arsnouveau.api.spell; + +import com.hollingsworth.arsnouveau.common.util.ANCodecs; +import com.mojang.serialization.Codec; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.neoforged.neoforge.common.util.INBTSerializable; + +public interface CasterCapability extends INBTSerializable { + + T getSpellCaster(); + + void setSpellCaster(T caster); + + default T getSpellCaster(CompoundTag tag){ + Tag casterTag = tag.get("caster"); + if(casterTag == null){ + return getSpellCaster(); + } + return ANCodecs.decode(getCodec(), casterTag); + } + + Codec getCodec(); + + + default Tag encode(){ + return ANCodecs.encode(getCodec(), getSpellCaster()); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCasterProvider.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/ItemCasterProvider.java similarity index 78% rename from src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCasterProvider.java rename to src/main/java/com/hollingsworth/arsnouveau/api/spell/ItemCasterProvider.java index 2fa5828335..e7adec002a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCasterProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/ItemCasterProvider.java @@ -2,7 +2,7 @@ import net.minecraft.world.item.ItemStack; -public interface ISpellCasterProvider { +public interface ItemCasterProvider { SpellCaster getSpellCaster(ItemStack stack); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java index 728cf4c60d..ae9616ce12 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import com.mojang.datafixers.util.Function5; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -20,7 +21,7 @@ public class SpellCaster implements ISpellCaster { - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + public static final MapCodec DEFAULT_CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( Codec.INT.optionalFieldOf("current_slot", 0).forGetter(s -> s.slot), Codec.STRING.optionalFieldOf("flavor_text", "").forGetter(s -> s.flavorText), Codec.BOOL.optionalFieldOf("is_hidden", false).forGetter(s -> s.isHidden), @@ -28,14 +29,24 @@ public class SpellCaster implements ISpellCaster { Codec.INT.optionalFieldOf("max_slots", 1).forGetter(s -> s.maxSlots) ).apply(instance, SpellCaster::new)); - public static final StreamCodec STREAM = CheatSerializer.create(SpellCaster.CODEC); + public static final StreamCodec DEFAULT_STREAM = CheatSerializer.create(SpellCaster.DEFAULT_CODEC); - private final Map spells; - private final int slot; - private final String flavorText; - private final boolean isHidden; - private final String hiddenText; - private final int maxSlots; + public static MapCodec createCodec(Function5 constructor) { + return RecordCodecBuilder.mapCodec(instance -> instance.group( + Codec.INT.optionalFieldOf("current_slot", 0).forGetter(s -> s.slot), + Codec.STRING.optionalFieldOf("flavor_text", "").forGetter(s -> s.flavorText), + Codec.BOOL.optionalFieldOf("is_hidden", false).forGetter(s -> s.isHidden), + Codec.STRING.optionalFieldOf("hidden_text", "").forGetter(s -> s.hiddenText), + Codec.INT.optionalFieldOf("max_slots", 1).forGetter(s -> s.maxSlots) + ).apply(instance, constructor)); + } + + protected final Map spells; + protected final int slot; + protected final String flavorText; + protected final boolean isHidden; + protected final String hiddenText; + protected final int maxSlots; public SpellCaster(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots) { this(slot, flavorText, isHidden, hiddenText, maxSlots, ImmutableMap.of()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java index 3f20d33b71..0cdaabbeb9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java @@ -8,8 +8,7 @@ import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; import com.hollingsworth.arsnouveau.common.block.tile.GhostWeaveTile; import com.hollingsworth.arsnouveau.common.block.tile.SkyBlockTile; -import com.hollingsworth.arsnouveau.common.spell.casters.ReactiveCaster; -import com.hollingsworth.arsnouveau.common.util.HolderHelper; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; @@ -76,9 +75,11 @@ public static void overlayEvent(RenderGuiLayerEvent.Pre event) { @SubscribeEvent public static void onTooltip(final ItemTooltipEvent event) { ItemStack stack = event.getItemStack(); - int level = stack.getEnchantmentLevel(HolderHelper.unwrap(event.getEntity().level, EnchantmentRegistry.REACTIVE_ENCHANTMENT)); - if (level > 0 && new ReactiveCaster(stack).getSpell().isValid()) { - Spell spell = new ReactiveCaster(stack).getSpell(); + int level = stack.getEnchantmentLevel(event.getEntity().level.holderOrThrow(EnchantmentRegistry.REACTIVE_ENCHANTMENT)); + var reactiveCaster = stack.get(DataComponentRegistry.REACTIVE_CASTER); + + if (reactiveCaster != null && level > 0 && reactiveCaster.getSpell().isValid()) { + Spell spell = reactiveCaster.getSpell(); event.getToolTip().add(Component.literal(spell.getDisplayString())); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/NoShadowTextField.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/NoShadowTextField.java index 76dff78ea0..66b410b1e0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/NoShadowTextField.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/NoShadowTextField.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.client.gui; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.Util; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; @@ -34,7 +35,7 @@ public void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float par int k = this.highlightPos - this.displayPos; String s = this.font.plainSubstrByWidth(this.value.substring(this.displayPos), this.getInnerWidth()); boolean flag = j >= 0 && j <= s.length(); - boolean flag1 = this.isFocused() && this.frame / 6 % 2 == 0 && flag; + boolean flag1 = this.isFocused() && (Util.getMillis() - this.focusedTime) / 300L % 2L == 0L && flag; int l = this.bordered ? this.x + 4 : this.x; int i1 = this.bordered ? this.y + (this.height - 8) / 2 : this.y; int j1 = l; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java index 870a349f36..ca085781df 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java @@ -6,7 +6,7 @@ import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.common.block.tile.ArcanePedestalTile; import com.hollingsworth.arsnouveau.common.block.tile.ScryersOculusTile; -import com.hollingsworth.arsnouveau.common.items.data.ScryData; +import com.hollingsworth.arsnouveau.common.items.data.ScryPosData; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketMountCamera; import com.hollingsworth.arsnouveau.common.util.PortUtil; @@ -74,7 +74,7 @@ public void openMenu(Level pLevel, BlockPos pPos, Player pPlayer) { return; } Minecraft.getInstance().setScreen(new GuiRadialMenu<>(new RadialMenu<>((int scroll) -> { - ScryData data = stackList.get(scroll).get(DataComponentRegistry.SCRY_DATA); + ScryPosData data = stackList.get(scroll).get(DataComponentRegistry.SCRY_DATA); if (data == null || data.pos() == null) { PortUtil.sendMessage(pPlayer, Component.translatable("ars_nouveau.scryers_eye.no_pos")); return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/StrippableLog.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/StrippableLog.java index e85b58c1fc..5700253e6d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/StrippableLog.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/StrippableLog.java @@ -5,8 +5,8 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.RotatedPillarBlock; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.common.ToolAction; -import net.neoforged.neoforge.common.ToolActions; +import net.neoforged.neoforge.common.ItemAbilities; +import net.neoforged.neoforge.common.ItemAbility; import org.jetbrains.annotations.Nullable; import java.util.function.Supplier; @@ -24,10 +24,8 @@ public StrippableLog(Properties properties, BlockRegistryWrapper ro.get(); } - @Nullable @Override - public BlockState getToolModifiedState(BlockState state, UseOnContext context, ToolAction toolAction, boolean simulate) { - return toolAction == ToolActions.AXE_STRIP ? strippedState.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, state.getValue(RotatedPillarBlock.AXIS)) : null; + public @Nullable BlockState getToolModifiedState(BlockState state, UseOnContext context, ItemAbility itemAbility, boolean simulate) { + return itemAbility == ItemAbilities.AXE_STRIP ? strippedState.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, state.getValue(RotatedPillarBlock.AXIS)) : null; } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java index 5edbe2404a..5dbc1b057e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.block.tile; import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; -import com.hollingsworth.arsnouveau.api.spell.ISpellCasterProvider; +import com.hollingsworth.arsnouveau.api.spell.ItemCasterProvider; import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; @@ -18,7 +18,7 @@ import java.util.List; -public class BasicSpellTurretTile extends ModdedTile implements ITooltipProvider, GeoBlockEntity, IAnimationListener, ITickable, ISpellCasterProvider { +public class BasicSpellTurretTile extends ModdedTile implements ITooltipProvider, GeoBlockEntity, IAnimationListener, ITickable, ItemCasterProvider { boolean playRecoil; public SpellCaster spellCaster = new SpellCaster(new CompoundTag()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraEvents.java index e95513fc84..08a9592349 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraEvents.java @@ -9,8 +9,7 @@ import net.minecraft.world.level.Level; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.fml.common.Mod; -import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; +import net.neoforged.neoforge.event.entity.living.LivingDamageEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent.LeftClickBlock; @@ -32,7 +31,7 @@ public static void onPlayerLoggedOut(PlayerLoggedOutEvent event) { } @SubscribeEvent - public static void onDamageTaken(LivingHurtEvent event) { + public static void onDamageTaken(LivingDamageEvent event) { LivingEntity entity = event.getEntity(); Level level = entity.level; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BuddingConversionRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BuddingConversionRecipe.java index 494b92ae08..d9ce53a0db 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BuddingConversionRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BuddingConversionRecipe.java @@ -6,7 +6,6 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.SingleRecipeInput; @@ -14,7 +13,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -public record BuddingConversionRecipe(ResourceLocation id, Block input, Block result) implements SpecialSingleInputRecipe { +public record BuddingConversionRecipe(Block input, Block result) implements SpecialSingleInputRecipe { public boolean matches(BlockState block) { @@ -39,7 +38,6 @@ public RecipeType getType() { public static class Serializer implements RecipeSerializer { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - ResourceLocation.CODEC.fieldOf("id").forGetter(BuddingConversionRecipe::id), BuiltInRegistries.BLOCK.byNameCodec().fieldOf("input").forGetter(BuddingConversionRecipe::input), BuiltInRegistries.BLOCK.byNameCodec().fieldOf("result").forGetter(BuddingConversionRecipe::result) ).apply(instance, BuddingConversionRecipe::new)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java index ff4866697c..3bf131b3b2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java @@ -1,9 +1,10 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; -import com.hollingsworth.arsnouveau.common.spell.casters.ReactiveCaster; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; +import com.hollingsworth.arsnouveau.common.items.data.ReactiveCasterData; import com.hollingsworth.arsnouveau.common.util.HolderHelper; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import com.mojang.serialization.Codec; @@ -54,11 +55,11 @@ public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.a @Override public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider p_346030_) { ItemStack parchment = getParchment(input.pedestals()); - ISpellCaster caster = SpellCasterRegistry.from(parchment); + SpellCaster caster = SpellCasterRegistry.from(parchment); ItemStack result = input.catalyst().copy(); - ReactiveCaster reactiveCaster = new ReactiveCaster(result); - reactiveCaster.setSpell(caster.getSpell()); - reactiveCaster.setColor(caster.getColor()); + ReactiveCasterData data = (ReactiveCasterData) new ReactiveCasterData(0, null, false, null, 1, caster.getSpells()) + .setColor(caster.getColor(), 0); + result.set(DataComponentRegistry.REACTIVE_CASTER, data); return result; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java index ab7e6d5559..31eb381e2e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java @@ -3,8 +3,10 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.crafting.recipes.BuddingConversionRecipe; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Blocks; import java.nio.file.Path; @@ -13,7 +15,7 @@ public class BuddingConversionProvider extends SimpleDataProvider{ - public List recipes = new ArrayList<>(); + public List recipes = new ArrayList<>(); public BuddingConversionProvider(DataGenerator generatorIn) { super(generatorIn); @@ -22,14 +24,18 @@ public BuddingConversionProvider(DataGenerator generatorIn) { @Override public void collectJsons(CachedOutput pOutput) { addEntries(); - for (BuddingConversionRecipe recipe : recipes) { - Path path = getRecipePath(output, recipe.getId().getPath()); - saveStable(pOutput, recipe.asRecipe(), path); + for (Wrapper recipe : recipes) { + Path path = getRecipePath(output, recipe.location().getPath()); + saveStable(pOutput, ANCodecs.toJson(BuddingConversionRecipe.Serializer.CODEC.codec(), recipe.recipe), path); } } protected void addEntries() { - recipes.add(new BuddingConversionRecipe(ArsNouveau.prefix( "budding_amethyst"), Blocks.AMETHYST_BLOCK, Blocks.BUDDING_AMETHYST)); + recipes.add(new Wrapper(ArsNouveau.prefix( "budding_amethyst"), new BuddingConversionRecipe(Blocks.AMETHYST_BLOCK, Blocks.BUDDING_AMETHYST))); + } + + public record Wrapper(ResourceLocation location, BuddingConversionRecipe recipe){ + } protected static Path getRecipePath(Path path, String id) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java index 533b9372e9..1cdd85e842 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java @@ -1,414 +1,376 @@ package com.hollingsworth.arsnouveau.common.datagen; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.common.block.AlterationTable; -import com.hollingsworth.arsnouveau.common.block.ArchfruitPod; -import com.hollingsworth.arsnouveau.common.block.ScribesBlock; -import com.hollingsworth.arsnouveau.common.block.ThreePartBlock; -import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; -import com.hollingsworth.arsnouveau.setup.registry.*; -import net.minecraft.advancements.critereon.StatePropertiesPredicate; import net.minecraft.core.HolderLookup; -import net.minecraft.core.WritableRegistry; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.PackOutput; -import net.minecraft.data.loot.BlockLootSubProvider; -import net.minecraft.data.loot.EntityLootSubProvider; import net.minecraft.data.loot.LootTableProvider; import net.minecraft.resources.ResourceKey; -import net.minecraft.util.ProblemReporter; -import net.minecraft.util.StringRepresentable; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.flag.FeatureFlags; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.Items; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.FlowerPotBlock; -import net.minecraft.world.level.block.SlabBlock; -import net.minecraft.world.level.block.state.properties.Property; -import net.minecraft.world.level.block.state.properties.SlabType; -import net.minecraft.world.level.storage.loot.BuiltInLootTables; -import net.minecraft.world.level.storage.loot.LootPool; import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraft.world.level.storage.loot.ValidationContext; -import net.minecraft.world.level.storage.loot.entries.LootItem; -import net.minecraft.world.level.storage.loot.functions.CopyCustomDataFunction; -import net.minecraft.world.level.storage.loot.functions.CopyNameFunction; -import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; -import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; -import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition; -import net.minecraft.world.level.storage.loot.providers.nbt.ContextNbtProvider; -import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; -import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; -import java.util.*; +import java.util.List; +import java.util.Set; import java.util.concurrent.CompletableFuture; -import java.util.function.BiConsumer; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; public class DefaultTableProvider extends LootTableProvider { - public DefaultTableProvider(PackOutput pOutput, CompletableFuture pRegistries) { - super(pOutput, new HashSet<>(), List.of(new LootTableProvider.SubProviderEntry(BlockLootTable::new, LootContextParamSets.BLOCK), new LootTableProvider.SubProviderEntry(EntityLootTable::new, LootContextParamSets.ENTITY)), pRegistries); - } - - private static final float[] DEFAULT_SAPLING_DROP_RATES = new float[]{0.05F, 0.0625F, 0.083333336F, 0.1F}; - - public static class BlockLootTable extends BlockLootSubProvider { - public List list = new ArrayList<>(); - - protected BlockLootTable() { - super(Set.of(), FeatureFlags.REGISTRY.allFlags(), new HashMap<>()); - } - - @Override - protected void generate() { - registerDropSelf(BlockRegistry.ENCHANTED_SPELL_TURRET); - - registerDropSelf(BlockRegistry.BLAZING_LOG); - registerDropSelf(BlockRegistry.VEXING_LOG); - registerDropSelf(BlockRegistry.CASCADING_LOG); - registerDropSelf(BlockRegistry.FLOURISHING_LOG); - - registerDropSelf(BlockRegistry.BLAZING_SAPLING); - registerDropSelf(BlockRegistry.VEXING_SAPLING); - registerDropSelf(BlockRegistry.CASCADING_SAPLING); - registerDropSelf(BlockRegistry.FLOURISHING_SAPLING); - registerDropSelf(BlockRegistry.ARCHWOOD_PLANK); - - registerDrop(BlockRegistry.WIXIE_CAULDRON.get(), Items.CAULDRON); - for (FlowerPotBlock pot : BlockRegistry.flowerPots.values()) { - list.add(pot); - dropPottedContents(pot); - } - - registerLeavesAndSticks(BlockRegistry.BLAZING_LEAVES.get(), BlockRegistry.BLAZING_SAPLING.get()); - registerLeavesAndSticks(BlockRegistry.CASCADING_LEAVE.get(), BlockRegistry.CASCADING_SAPLING.get()); - registerLeavesAndSticks(BlockRegistry.FLOURISHING_LEAVES.get(), BlockRegistry.FLOURISHING_SAPLING.get()); - registerLeavesAndSticks(BlockRegistry.VEXING_LEAVES.get(), BlockRegistry.VEXING_SAPLING.get()); - - - registerDropSelf(BlockRegistry.BLAZING_WOOD); - registerDropSelf(BlockRegistry.VEXING_WOOD); - registerDropSelf(BlockRegistry.CASCADING_WOOD); - registerDropSelf(BlockRegistry.FLOURISHING_WOOD); - - registerDropSelf(BlockRegistry.ARCHWOOD_BUTTON); - registerDropSelf(BlockRegistry.ARCHWOOD_STAIRS); - registerSlabItemTable(BlockRegistry.ARCHWOOD_SLABS.get()); - registerDropSelf(BlockRegistry.MAGELIGHT_TORCH); - - // registerDropSelf(BlockRegistry.ARCHWOOD_SIGN); - registerDropSelf(BlockRegistry.ARCHWOOD_FENCE_GATE); - registerDropSelf(BlockRegistry.ARCHWOOD_TRAPDOOR); - registerDropSelf(BlockRegistry.ARCHWOOD_PPlate); - registerDropSelf(BlockRegistry.ARCHWOOD_FENCE); - registerDropSelf(BlockRegistry.STRIPPED_AWLOG_BLUE); - registerDropSelf(BlockRegistry.STRIPPED_AWWOOD_BLUE); - registerDropSelf(BlockRegistry.STRIPPED_AWLOG_GREEN); - registerDropSelf(BlockRegistry.STRIPPED_AWWOOD_GREEN); - registerDropSelf(BlockRegistry.STRIPPED_AWLOG_RED); - registerDropSelf(BlockRegistry.STRIPPED_AWWOOD_RED); - registerDropSelf(BlockRegistry.STRIPPED_AWLOG_PURPLE); - registerDropSelf(BlockRegistry.STRIPPED_AWWOOD_PURPLE); - registerDropDoor(BlockRegistry.ARCHWOOD_DOOR.get()); - registerDropSelf(BlockRegistry.SOURCE_GEM_BLOCK); - - registerDropSelf(BlockRegistry.POTION_MELDER); - registerDropSelf(BlockRegistry.RITUAL_BLOCK); - registerDropSelf(BlockRegistry.GOLD_SCONCE_BLOCK); - registerBedCondition(BlockRegistry.SCRIBES_BLOCK.get(), ScribesBlock.PART, ThreePartBlock.HEAD); - registerDrop(BlockRegistry.DRYGMY_BLOCK.get(), Items.MOSSY_COBBLESTONE); - - registerDropSelf(BlockRegistry.VITALIC_BLOCK); - registerDropSelf(BlockRegistry.ALCHEMICAL_BLOCK); - registerDropSelf(BlockRegistry.MYCELIAL_BLOCK); - registerDropSelf(BlockRegistry.TIMER_SPELL_TURRET); - registerDropSelf(BlockRegistry.BASIC_SPELL_TURRET); - - registerDropSelf(BlockRegistry.ARCHWOOD_CHEST); - registerDropSelf(BlockRegistry.SPELL_PRISM); - - registerDropSelf(BlockRegistry.AGRONOMIC_SOURCELINK); - registerDropSelf(BlockRegistry.ENCHANTING_APP_BLOCK); - registerDropSelf(BlockRegistry.ARCANE_PEDESTAL); - registerDropSelf(BlockRegistry.ARCANE_PLATFORM); - registerDropSelf(BlockRegistry.RELAY); - registerDropSelf(BlockRegistry.RELAY_SPLITTER); - registerDropSelf(BlockRegistry.ARCANE_CORE_BLOCK); - registerDropSelf(BlockRegistry.IMBUEMENT_BLOCK); - registerDropSelf(BlockRegistry.VOLCANIC_BLOCK); - registerDropSelf(BlockRegistry.BRAZIER_RELAY); - - registerDropSelf(BlockRegistry.RELAY_WARP); - registerDropSelf(BlockRegistry.RELAY_DEPOSIT); - registerDropSelf(BlockRegistry.RELAY_COLLECTOR); - registerDropSelf(BlockRegistry.CRAFTING_LECTERN.get()); - registerDropSelf(BlockRegistry.RED_SBED); - registerDropSelf(BlockRegistry.YELLOW_SBED); - registerDropSelf(BlockRegistry.GREEN_SBED); - registerDropSelf(BlockRegistry.PURPLE_SBED); - registerDropSelf(BlockRegistry.BLUE_SBED); - registerDropSelf(BlockRegistry.ORANGE_SBED); - registerDropSelf(BlockRegistry.SCRYERS_CRYSTAL); - registerDropSelf(BlockRegistry.SCRYERS_OCULUS); - registerDropSelf(BlockRegistry.POTION_DIFFUSER); - for (String s : LibBlockNames.DECORATIVE_SOURCESTONE) { - registerDropSelf(BlockRegistry.getBlock(s)); - Block block = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s + "_stairs")); - registerDropSelf(block); - Block slab = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s + "_slab")); - registerDropSelf(slab); - - } - registerBedCondition(BlockRegistry.ALTERATION_TABLE.get(), AlterationTable.PART, ThreePartBlock.HEAD); - registerDropSelf(BlockRegistry.VOID_PRISM); - registerDropSelf(BlockRegistry.MAGEBLOOM_BLOCK); - registerDropSelf(BlockRegistry.GHOST_WEAVE); - registerDropSelf(BlockRegistry.FALSE_WEAVE); - registerDropSelf(BlockRegistry.MIRROR_WEAVE); - registerDropSelf(BlockRegistry.ITEM_DETECTOR); - registerDropSelf(BlockRegistry.SKY_WEAVE); - registerDropSelf(BlockRegistry.ROTATING_TURRET); - registerDropSelf(BlockRegistry.SPELL_SENSOR); - - add(BlockRegistry.SOURCE_JAR.get(), createManaManchineTable(BlockRegistry.SOURCE_JAR.get())); - - LootPool.Builder potionJarBuilder = LootPool.lootPool() - .setRolls(ConstantValue.exactly(1)) - .add(LootItem.lootTableItem(BlockRegistry.POTION_JAR) - .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) - .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) - .copy("potionData", "BlockEntityTag.potionData", CopyCustomDataFunction.MergeStrategy.REPLACE) - .copy("currentFill", "BlockEntityTag.currentFill", CopyCustomDataFunction.MergeStrategy.REPLACE) - .copy("locked", "BlockEntityTag.locked", CopyCustomDataFunction.MergeStrategy.REPLACE) - .copy("potionNames", "potionNames", CopyCustomDataFunction.MergeStrategy.REPLACE) - .copy("currentFill", "fill", CopyCustomDataFunction.MergeStrategy.REPLACE)) - ); - add(BlockRegistry.POTION_JAR.get(), LootTable.lootTable().withPool(potionJarBuilder)); - add(BlockRegistry.BASTION_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.BASTION_POD.asItem(), BlockRegistry.BASTION_POD.get()))); - add(BlockRegistry.MENDOSTEEN_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.MENDOSTEEN_POD.asItem(), BlockRegistry.MENDOSTEEN_POD.get()))); - add(BlockRegistry.FROSTAYA_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.FROSTAYA_POD.asItem(), BlockRegistry.FROSTAYA_POD.get()))); - add(BlockRegistry.BOMBEGRANTE_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.BOMBEGRANTE_POD.asItem(), BlockRegistry.BOMBEGRANTE_POD.get()))); - - LootPool.Builder mobJarBuilder = LootPool.lootPool() - .setRolls(ConstantValue.exactly(1)) - .add(LootItem.lootTableItem(BlockRegistry.MOB_JAR) - .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) - .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) - .copy("entityTag", "BlockEntityTag.entityTag", CopyCustomDataFunction.MergeStrategy.REPLACE) - .copy("entityId", "entityId", CopyCustomDataFunction.MergeStrategy.REPLACE)) - ); - add(BlockRegistry.MOB_JAR.get(), LootTable.lootTable().withPool(mobJarBuilder)); - //CustomName - LootPool.Builder repository = LootPool.lootPool() - .setRolls(ConstantValue.exactly(1)) - .add(LootItem.lootTableItem(BlockRegistry.REPOSITORY) - .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY))); - add(BlockRegistry.REPOSITORY.get(), LootTable.lootTable().withPool(repository)); - registerDropSelf(BlockRegistry.SOURCESTONE_SCONCE_BLOCK.get()); - registerDropSelf(BlockRegistry.POLISHED_SCONCE_BLOCK.get()); - registerDropSelf(BlockRegistry.ARCHWOOD_SCONCE_BLOCK.get()); - registerDropSelf(BlockRegistry.REDSTONE_RELAY.get()); - registerDropSelf(BlockRegistry.SOURCEBERRY_SACK.get()); - } - - @Override - protected void add(Block pBlock, LootTable.Builder pBuilder) { - list.add(pBlock); - super.add(pBlock, pBuilder); - } - - @Override - protected void add(Block pBlock, Function pFactory) { - list.add(pBlock); - super.add(pBlock, pFactory); - } - - - protected void add(RegistryWrapper pBlock, LootTable.Builder pBuilder) { - add(pBlock.get(), pBuilder); - } - - - protected void add(RegistryWrapper pBlock, Function pFactory) { - add(pBlock.get(), pFactory); - } - - public LootPool.Builder POD_BUILDER(Item item, Block block) { - return LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) - .add(LootItem.lootTableItem(item) - .apply(SetItemCountFunction.setCount(ConstantValue.exactly(3.0F)) - .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(block) - .setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(ArchfruitPod.AGE, 2))))); - } - - public LootTable.Builder createManaManchineTable(Block block) { - LootPool.Builder builder = LootPool.lootPool() - .setRolls(ConstantValue.exactly(1)) - .add(LootItem.lootTableItem(block) - .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) - .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) - .copy("inv", "BlockEntityTag.inv", CopyCustomDataFunction.MergeStrategy.REPLACE) //addOperation - .copy("source", "BlockEntityTag.source", CopyCustomDataFunction.MergeStrategy.REPLACE)) - ); - return LootTable.lootTable().withPool(builder); - } - - protected void registerSlabItemTable(Block p_124291_) { - list.add(p_124291_); - this.add(p_124291_, LootTable.lootTable().withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) - .add(applyExplosionDecay(p_124291_, LootItem.lootTableItem(p_124291_).apply(SetItemCountFunction.setCount(ConstantValue.exactly(2.0F)) - .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(p_124291_).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(SlabBlock.TYPE, SlabType.DOUBLE)))))))); - - } - - // Override and ignore the missing loot table error - - - @Override - public void generate(BiConsumer, LootTable.Builder> pGenerator) { - this.generate(); - Set> set = new HashSet<>(); - - for (Block block : list) { - if (block.isEnabled(this.enabledFeatures)) { - ResourceKey resourcelocation = block.getLootTable(); - if (resourcelocation != BuiltInLootTables.EMPTY && set.add(resourcelocation)) { - LootTable.Builder loottable$builder = this.map.remove(resourcelocation); - if (loottable$builder == null) { - continue; - } - - pGenerator.accept(resourcelocation, loottable$builder); - } - } - } - } - - protected & StringRepresentable> void registerBedCondition(Block block, Property prop, T isValue) { - list.add(block); - this.add(block, LootTable.lootTable().withPool(applyExplosionCondition(block, LootPool.lootPool().setRolls(ConstantValue.exactly(1)) - .add(LootItem.lootTableItem(block).when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(block).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(prop, isValue))))))); - } - - public void registerLeavesAndSticks(Block leaves, Block sapling) { - list.add(leaves); - this.add(leaves, l_state -> createLeavesDrops(l_state, sapling, DEFAULT_SAPLING_DROP_RATES)); - } - - public void registerDropDoor(Block block) { - list.add(block); - this.add(block, createDoorTable(block)); - } - - private void registerDropSelf(BlockRegistryWrapper block) { - registerDropSelf(block.get()); - } - - public void registerDropSelf(Block block) { - list.add(block); - dropSelf(block); - } - - public void registerDrop(Block input, ItemLike output) { - list.add(input); - dropOther(input, output); - } - - @Override - protected Iterable getKnownBlocks() { - return BuiltInRegistries.BLOCK.stream().filter(block -> BuiltInRegistries.BLOCK.getKey(block).getNamespace().equals(ArsNouveau.MODID)).collect(Collectors.toList()); - } - - } - - - public static class EntityLootTable extends EntityLootSubProvider { - private final Map, Map, LootTable.Builder>> map = Maps.newHashMap(); - - protected EntityLootTable() { - super(FeatureFlags.REGISTRY.allFlags()); - } - - @Override - public void generate() { - add(ModEntities.WILDEN_STALKER.get(), LootTable.lootTable() - .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)) - .add(LootItem.lootTableItem(ItemsRegistry.WILDEN_WING.get()) - .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))) - .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) - ); - add(ModEntities.WILDEN_GUARDIAN.get(), LootTable.lootTable() - .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)) - .add(LootItem.lootTableItem(ItemsRegistry.WILDEN_SPIKE.get()) - .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))) - .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) - ); - add(ModEntities.WILDEN_HUNTER.get(), LootTable.lootTable() - .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)) - .add(LootItem.lootTableItem(ItemsRegistry.WILDEN_HORN.get()) - .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))) - .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) - ); - } - - @Override - protected void add(EntityType pEntityType, LootTable.Builder pBuilder) { - super.add(pEntityType, pBuilder); - this.map.put(pEntityType, ImmutableMap.of(pEntityType.getDefaultLootTable(), pBuilder)); - } - - @Override - protected void add(EntityType pEntityType, ResourceKey pLootTableLocation, LootTable.Builder pBuilder) { - super.add(pEntityType, pLootTableLocation, pBuilder); - this.map.computeIfAbsent(pEntityType, (p_249004_) -> { - return Maps.newHashMap(); - }).put(pLootTableLocation, pBuilder); - } - - @Override - public void generate(BiConsumer, LootTable.Builder> pGenerator) { - this.generate(); - Set> set = Sets.newHashSet(); - this.getKnownEntityTypes().map(EntityType::builtInRegistryHolder).forEach((p_249003_) -> { - EntityType entitytype = p_249003_.value(); - if (canHaveLootTable(entitytype)) { - Map, LootTable.Builder> map = this.map.remove(entitytype); - ResourceKey resourcelocation = entitytype.getDefaultLootTable(); - if (map != null) { - map.forEach((p_250376_, p_250972_) -> { - if (!set.add(p_250376_)) { - throw new IllegalStateException(String.format(Locale.ROOT, "Duplicate loottable '%s' for '%s'", p_250376_, p_249003_.key().location())); - } else { - pGenerator.accept(p_250376_, p_250972_); - } - }); - } - } else { - Map, LootTable.Builder> map1 = this.map.remove(entitytype); - if (map1 != null) { - throw new IllegalStateException(String.format(Locale.ROOT, "Weird loottables '%s' for '%s', not a LivingEntity so should not have loot", map1.keySet().stream().map(ResourceKey::toString).collect(Collectors.joining(",")), p_249003_.key().location())); - } - } - - }); - } - - @Override - protected Stream> getKnownEntityTypes() { - return BuiltInRegistries.ENTITY_TYPE.stream().filter(block -> BuiltInRegistries.ENTITY_TYPE.getKey(block).getNamespace().equals(ArsNouveau.MODID)).toList().stream(); - } - } - - @Override - protected void validate(WritableRegistry writableregistry, ValidationContext validationcontext, ProblemReporter.Collector problemreporter$collector) { - + //todo: reenable loot tables + public DefaultTableProvider(PackOutput pOutput, Set> pRequiredTables, List pSubProviders, CompletableFuture pRegistries) { + super(pOutput, pRequiredTables, pSubProviders, pRegistries); } +// public DefaultTableProvider(PackOutput pOutput, CompletableFuture pRegistries) { +// super(pOutput, new HashSet<>(), List.of(new LootTableProvider.SubProviderEntry(BlockLootTable::new, LootContextParamSets.BLOCK), new LootTableProvider.SubProviderEntry(EntityLootTable::new, LootContextParamSets.ENTITY)), pRegistries); +// } +// +// private static final float[] DEFAULT_SAPLING_DROP_RATES = new float[]{0.05F, 0.0625F, 0.083333336F, 0.1F}; +// +// public static class BlockLootTable extends BlockLootSubProvider { +// public List list = new ArrayList<>(); +// +// protected BlockLootTable() { +// super(Set.of(), FeatureFlags.REGISTRY.allFlags(), new HashMap<>()); +// } +// +// @Override +// protected void generate() { +// registerDropSelf(BlockRegistry.ENCHANTED_SPELL_TURRET); +// +// registerDropSelf(BlockRegistry.BLAZING_LOG); +// registerDropSelf(BlockRegistry.VEXING_LOG); +// registerDropSelf(BlockRegistry.CASCADING_LOG); +// registerDropSelf(BlockRegistry.FLOURISHING_LOG); +// +// registerDropSelf(BlockRegistry.BLAZING_SAPLING); +// registerDropSelf(BlockRegistry.VEXING_SAPLING); +// registerDropSelf(BlockRegistry.CASCADING_SAPLING); +// registerDropSelf(BlockRegistry.FLOURISHING_SAPLING); +// registerDropSelf(BlockRegistry.ARCHWOOD_PLANK); +// +// registerDrop(BlockRegistry.WIXIE_CAULDRON.get(), Items.CAULDRON); +// for (FlowerPotBlock pot : BlockRegistry.flowerPots.values()) { +// list.add(pot); +// dropPottedContents(pot); +// } +// +// registerLeavesAndSticks(BlockRegistry.BLAZING_LEAVES.get(), BlockRegistry.BLAZING_SAPLING.get()); +// registerLeavesAndSticks(BlockRegistry.CASCADING_LEAVE.get(), BlockRegistry.CASCADING_SAPLING.get()); +// registerLeavesAndSticks(BlockRegistry.FLOURISHING_LEAVES.get(), BlockRegistry.FLOURISHING_SAPLING.get()); +// registerLeavesAndSticks(BlockRegistry.VEXING_LEAVES.get(), BlockRegistry.VEXING_SAPLING.get()); +// +// +// registerDropSelf(BlockRegistry.BLAZING_WOOD); +// registerDropSelf(BlockRegistry.VEXING_WOOD); +// registerDropSelf(BlockRegistry.CASCADING_WOOD); +// registerDropSelf(BlockRegistry.FLOURISHING_WOOD); +// +// registerDropSelf(BlockRegistry.ARCHWOOD_BUTTON); +// registerDropSelf(BlockRegistry.ARCHWOOD_STAIRS); +// registerSlabItemTable(BlockRegistry.ARCHWOOD_SLABS.get()); +// registerDropSelf(BlockRegistry.MAGELIGHT_TORCH); +// +// // registerDropSelf(BlockRegistry.ARCHWOOD_SIGN); +// registerDropSelf(BlockRegistry.ARCHWOOD_FENCE_GATE); +// registerDropSelf(BlockRegistry.ARCHWOOD_TRAPDOOR); +// registerDropSelf(BlockRegistry.ARCHWOOD_PPlate); +// registerDropSelf(BlockRegistry.ARCHWOOD_FENCE); +// registerDropSelf(BlockRegistry.STRIPPED_AWLOG_BLUE); +// registerDropSelf(BlockRegistry.STRIPPED_AWWOOD_BLUE); +// registerDropSelf(BlockRegistry.STRIPPED_AWLOG_GREEN); +// registerDropSelf(BlockRegistry.STRIPPED_AWWOOD_GREEN); +// registerDropSelf(BlockRegistry.STRIPPED_AWLOG_RED); +// registerDropSelf(BlockRegistry.STRIPPED_AWWOOD_RED); +// registerDropSelf(BlockRegistry.STRIPPED_AWLOG_PURPLE); +// registerDropSelf(BlockRegistry.STRIPPED_AWWOOD_PURPLE); +// registerDropDoor(BlockRegistry.ARCHWOOD_DOOR.get()); +// registerDropSelf(BlockRegistry.SOURCE_GEM_BLOCK); +// +// registerDropSelf(BlockRegistry.POTION_MELDER); +// registerDropSelf(BlockRegistry.RITUAL_BLOCK); +// registerDropSelf(BlockRegistry.GOLD_SCONCE_BLOCK); +// registerBedCondition(BlockRegistry.SCRIBES_BLOCK.get(), ScribesBlock.PART, ThreePartBlock.HEAD); +// registerDrop(BlockRegistry.DRYGMY_BLOCK.get(), Items.MOSSY_COBBLESTONE); +// +// registerDropSelf(BlockRegistry.VITALIC_BLOCK); +// registerDropSelf(BlockRegistry.ALCHEMICAL_BLOCK); +// registerDropSelf(BlockRegistry.MYCELIAL_BLOCK); +// registerDropSelf(BlockRegistry.TIMER_SPELL_TURRET); +// registerDropSelf(BlockRegistry.BASIC_SPELL_TURRET); +// +// registerDropSelf(BlockRegistry.ARCHWOOD_CHEST); +// registerDropSelf(BlockRegistry.SPELL_PRISM); +// +// registerDropSelf(BlockRegistry.AGRONOMIC_SOURCELINK); +// registerDropSelf(BlockRegistry.ENCHANTING_APP_BLOCK); +// registerDropSelf(BlockRegistry.ARCANE_PEDESTAL); +// registerDropSelf(BlockRegistry.ARCANE_PLATFORM); +// registerDropSelf(BlockRegistry.RELAY); +// registerDropSelf(BlockRegistry.RELAY_SPLITTER); +// registerDropSelf(BlockRegistry.ARCANE_CORE_BLOCK); +// registerDropSelf(BlockRegistry.IMBUEMENT_BLOCK); +// registerDropSelf(BlockRegistry.VOLCANIC_BLOCK); +// registerDropSelf(BlockRegistry.BRAZIER_RELAY); +// +// registerDropSelf(BlockRegistry.RELAY_WARP); +// registerDropSelf(BlockRegistry.RELAY_DEPOSIT); +// registerDropSelf(BlockRegistry.RELAY_COLLECTOR); +// registerDropSelf(BlockRegistry.CRAFTING_LECTERN.get()); +// registerDropSelf(BlockRegistry.RED_SBED); +// registerDropSelf(BlockRegistry.YELLOW_SBED); +// registerDropSelf(BlockRegistry.GREEN_SBED); +// registerDropSelf(BlockRegistry.PURPLE_SBED); +// registerDropSelf(BlockRegistry.BLUE_SBED); +// registerDropSelf(BlockRegistry.ORANGE_SBED); +// registerDropSelf(BlockRegistry.SCRYERS_CRYSTAL); +// registerDropSelf(BlockRegistry.SCRYERS_OCULUS); +// registerDropSelf(BlockRegistry.POTION_DIFFUSER); +// for (String s : LibBlockNames.DECORATIVE_SOURCESTONE) { +// registerDropSelf(BlockRegistry.getBlock(s)); +// Block block = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s + "_stairs")); +// registerDropSelf(block); +// Block slab = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s + "_slab")); +// registerDropSelf(slab); +// +// } +// registerBedCondition(BlockRegistry.ALTERATION_TABLE.get(), AlterationTable.PART, ThreePartBlock.HEAD); +// registerDropSelf(BlockRegistry.VOID_PRISM); +// registerDropSelf(BlockRegistry.MAGEBLOOM_BLOCK); +// registerDropSelf(BlockRegistry.GHOST_WEAVE); +// registerDropSelf(BlockRegistry.FALSE_WEAVE); +// registerDropSelf(BlockRegistry.MIRROR_WEAVE); +// registerDropSelf(BlockRegistry.ITEM_DETECTOR); +// registerDropSelf(BlockRegistry.SKY_WEAVE); +// registerDropSelf(BlockRegistry.ROTATING_TURRET); +// registerDropSelf(BlockRegistry.SPELL_SENSOR); +// +// add(BlockRegistry.SOURCE_JAR.get(), createManaManchineTable(BlockRegistry.SOURCE_JAR.get())); +// +// LootPool.Builder potionJarBuilder = LootPool.lootPool() +// .setRolls(ConstantValue.exactly(1)) +// .add(LootItem.lootTableItem(BlockRegistry.POTION_JAR) +// .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) +// .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) +// .copy("potionData", "BlockEntityTag.potionData", CopyCustomDataFunction.MergeStrategy.REPLACE) +// .copy("currentFill", "BlockEntityTag.currentFill", CopyCustomDataFunction.MergeStrategy.REPLACE) +// .copy("locked", "BlockEntityTag.locked", CopyCustomDataFunction.MergeStrategy.REPLACE) +// .copy("potionNames", "potionNames", CopyCustomDataFunction.MergeStrategy.REPLACE) +// .copy("currentFill", "fill", CopyCustomDataFunction.MergeStrategy.REPLACE)) +// ); +// add(BlockRegistry.POTION_JAR.get(), LootTable.lootTable().withPool(potionJarBuilder)); +// add(BlockRegistry.BASTION_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.BASTION_POD.asItem(), BlockRegistry.BASTION_POD.get()))); +// add(BlockRegistry.MENDOSTEEN_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.MENDOSTEEN_POD.asItem(), BlockRegistry.MENDOSTEEN_POD.get()))); +// add(BlockRegistry.FROSTAYA_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.FROSTAYA_POD.asItem(), BlockRegistry.FROSTAYA_POD.get()))); +// add(BlockRegistry.BOMBEGRANTE_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.BOMBEGRANTE_POD.asItem(), BlockRegistry.BOMBEGRANTE_POD.get()))); +// +// LootPool.Builder mobJarBuilder = LootPool.lootPool() +// .setRolls(ConstantValue.exactly(1)) +// .add(LootItem.lootTableItem(BlockRegistry.MOB_JAR) +// .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) +// .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) +// .copy("entityTag", "BlockEntityTag.entityTag", CopyCustomDataFunction.MergeStrategy.REPLACE) +// .copy("entityId", "entityId", CopyCustomDataFunction.MergeStrategy.REPLACE)) +// ); +// add(BlockRegistry.MOB_JAR.get(), LootTable.lootTable().withPool(mobJarBuilder)); +// //CustomName +// LootPool.Builder repository = LootPool.lootPool() +// .setRolls(ConstantValue.exactly(1)) +// .add(LootItem.lootTableItem(BlockRegistry.REPOSITORY) +// .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY))); +// add(BlockRegistry.REPOSITORY.get(), LootTable.lootTable().withPool(repository)); +// registerDropSelf(BlockRegistry.SOURCESTONE_SCONCE_BLOCK.get()); +// registerDropSelf(BlockRegistry.POLISHED_SCONCE_BLOCK.get()); +// registerDropSelf(BlockRegistry.ARCHWOOD_SCONCE_BLOCK.get()); +// registerDropSelf(BlockRegistry.REDSTONE_RELAY.get()); +// registerDropSelf(BlockRegistry.SOURCEBERRY_SACK.get()); +// } +// +// @Override +// protected void add(Block pBlock, LootTable.Builder pBuilder) { +// list.add(pBlock); +// super.add(pBlock, pBuilder); +// } +// +// @Override +// protected void add(Block pBlock, Function pFactory) { +// list.add(pBlock); +// super.add(pBlock, pFactory); +// } +// +// +// protected void add(RegistryWrapper pBlock, LootTable.Builder pBuilder) { +// add(pBlock.get(), pBuilder); +// } +// +// +// protected void add(RegistryWrapper pBlock, Function pFactory) { +// add(pBlock.get(), pFactory); +// } +// +// public LootPool.Builder POD_BUILDER(Item item, Block block) { +// return LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) +// .add(LootItem.lootTableItem(item) +// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(3.0F)) +// .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(block) +// .setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(ArchfruitPod.AGE, 2))))); +// } +// +// public LootTable.Builder createManaManchineTable(Block block) { +// LootPool.Builder builder = LootPool.lootPool() +// .setRolls(ConstantValue.exactly(1)) +// .add(LootItem.lootTableItem(block) +// .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) +// .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) +// .copy("inv", "BlockEntityTag.inv", CopyCustomDataFunction.MergeStrategy.REPLACE) //addOperation +// .copy("source", "BlockEntityTag.source", CopyCustomDataFunction.MergeStrategy.REPLACE)) +// ); +// return LootTable.lootTable().withPool(builder); +// } +// +// protected void registerSlabItemTable(Block p_124291_) { +// list.add(p_124291_); +// this.add(p_124291_, LootTable.lootTable().withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) +// .add(applyExplosionDecay(p_124291_, LootItem.lootTableItem(p_124291_).apply(SetItemCountFunction.setCount(ConstantValue.exactly(2.0F)) +// .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(p_124291_).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(SlabBlock.TYPE, SlabType.DOUBLE)))))))); +// +// } +// +// // Override and ignore the missing loot table error +// +// +// @Override +// public void generate(BiConsumer, LootTable.Builder> pGenerator) { +// this.generate(); +// Set> set = new HashSet<>(); +// +// for (Block block : list) { +// if (block.isEnabled(this.enabledFeatures)) { +// ResourceKey resourcelocation = block.getLootTable(); +// if (resourcelocation != BuiltInLootTables.EMPTY && set.add(resourcelocation)) { +// LootTable.Builder loottable$builder = this.map.remove(resourcelocation); +// if (loottable$builder == null) { +// continue; +// } +// +// pGenerator.accept(resourcelocation, loottable$builder); +// } +// } +// } +// } +// +// protected & StringRepresentable> void registerBedCondition(Block block, Property prop, T isValue) { +// list.add(block); +// this.add(block, LootTable.lootTable().withPool(applyExplosionCondition(block, LootPool.lootPool().setRolls(ConstantValue.exactly(1)) +// .add(LootItem.lootTableItem(block).when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(block).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(prop, isValue))))))); +// } +// +// public void registerLeavesAndSticks(Block leaves, Block sapling) { +// list.add(leaves); +// this.add(leaves, l_state -> createLeavesDrops(l_state, sapling, DEFAULT_SAPLING_DROP_RATES)); +// } +// +// public void registerDropDoor(Block block) { +// list.add(block); +// this.add(block, createDoorTable(block)); +// } +// +// private void registerDropSelf(BlockRegistryWrapper block) { +// registerDropSelf(block.get()); +// } +// +// public void registerDropSelf(Block block) { +// list.add(block); +// dropSelf(block); +// } +// +// public void registerDrop(Block input, ItemLike output) { +// list.add(input); +// dropOther(input, output); +// } +// +// @Override +// protected Iterable getKnownBlocks() { +// return BuiltInRegistries.BLOCK.stream().filter(block -> BuiltInRegistries.BLOCK.getKey(block).getNamespace().equals(ArsNouveau.MODID)).collect(Collectors.toList()); +// } +// +// } +// +// +// public static class EntityLootTable extends EntityLootSubProvider { +// private final Map, Map, LootTable.Builder>> map = Maps.newHashMap(); +// +// protected EntityLootTable() { +// super(FeatureFlags.REGISTRY.allFlags()); +// } +// +// @Override +// public void generate() { +// add(ModEntities.WILDEN_STALKER.get(), LootTable.lootTable() +// .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)) +// .add(LootItem.lootTableItem(ItemsRegistry.WILDEN_WING.get()) +// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))) +// .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) +// ); +// add(ModEntities.WILDEN_GUARDIAN.get(), LootTable.lootTable() +// .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)) +// .add(LootItem.lootTableItem(ItemsRegistry.WILDEN_SPIKE.get()) +// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))) +// .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) +// ); +// add(ModEntities.WILDEN_HUNTER.get(), LootTable.lootTable() +// .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)) +// .add(LootItem.lootTableItem(ItemsRegistry.WILDEN_HORN.get()) +// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))) +// .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) +// ); +// } +// +// @Override +// protected void add(EntityType pEntityType, LootTable.Builder pBuilder) { +// super.add(pEntityType, pBuilder); +// this.map.put(pEntityType, ImmutableMap.of(pEntityType.getDefaultLootTable(), pBuilder)); +// } +// +// @Override +// protected void add(EntityType pEntityType, ResourceKey pLootTableLocation, LootTable.Builder pBuilder) { +// super.add(pEntityType, pLootTableLocation, pBuilder); +// this.map.computeIfAbsent(pEntityType, (p_249004_) -> { +// return Maps.newHashMap(); +// }).put(pLootTableLocation, pBuilder); +// } +// +// @Override +// public void generate(BiConsumer, LootTable.Builder> pGenerator) { +// this.generate(); +// Set> set = Sets.newHashSet(); +// this.getKnownEntityTypes().map(EntityType::builtInRegistryHolder).forEach((p_249003_) -> { +// EntityType entitytype = p_249003_.value(); +// if (canHaveLootTable(entitytype)) { +// Map, LootTable.Builder> map = this.map.remove(entitytype); +// ResourceKey resourcelocation = entitytype.getDefaultLootTable(); +// if (map != null) { +// map.forEach((p_250376_, p_250972_) -> { +// if (!set.add(p_250376_)) { +// throw new IllegalStateException(String.format(Locale.ROOT, "Duplicate loottable '%s' for '%s'", p_250376_, p_249003_.key().location())); +// } else { +// pGenerator.accept(p_250376_, p_250972_); +// } +// }); +// } +// } else { +// Map, LootTable.Builder> map1 = this.map.remove(entitytype); +// if (map1 != null) { +// throw new IllegalStateException(String.format(Locale.ROOT, "Weird loottables '%s' for '%s', not a LivingEntity so should not have loot", map1.keySet().stream().map(ResourceKey::toString).collect(Collectors.joining(",")), p_249003_.key().location())); +// } +// } +// +// }); +// } +// +// @Override +// protected Stream> getKnownEntityTypes() { +// return BuiltInRegistries.ENTITY_TYPE.stream().filter(block -> BuiltInRegistries.ENTITY_TYPE.getKey(block).getNamespace().equals(ArsNouveau.MODID)).toList().stream(); +// } +// } +// +// @Override +// protected void validate(WritableRegistry writableregistry, ValidationContext validationcontext, ProblemReporter.Collector problemreporter$collector) { +// +// } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java index ec4f3e0def..5a3dd20ffc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java @@ -3,10 +3,12 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.crafting.recipes.DispelEntityRecipe; +import com.mojang.serialization.JsonOps; import net.minecraft.advancements.critereon.EntityFlagsPredicate; import net.minecraft.advancements.critereon.EntityPredicate; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; @@ -18,7 +20,7 @@ public class DispelEntityProvider extends SimpleDataProvider{ - public List recipes = new ArrayList<>(); + public List recipes = new ArrayList<>(); public DispelEntityProvider(DataGenerator generatorIn) { super(generatorIn); @@ -27,16 +29,20 @@ public DispelEntityProvider(DataGenerator generatorIn) { @Override public void collectJsons(CachedOutput pOutput) { addEntries(); - for (DispelEntityRecipe recipe : recipes) { - Path path = getRecipePath(output, recipe.getId().getPath()); - saveStable(pOutput, recipe.asRecipe(), path); + for (Wrapper recipe : recipes) { + Path path = getRecipePath(output, recipe.location().getPath()); + saveStable(pOutput, DispelEntityRecipe.Serializer.CODEC.codec().encodeStart(JsonOps.INSTANCE, recipe.recipe).getOrThrow(), path); } } protected void addEntries() { - recipes.add(new DispelEntityRecipe(ArsNouveau.prefix( "blaze_powder"), EntityType.BLAZE, EntityType.BLAZE.getDefaultLootTable(), new LootItemCondition[]{ + recipes.add(new Wrapper(ArsNouveau.prefix( "blaze_powder"), new DispelEntityRecipe(EntityType.BLAZE, EntityType.BLAZE.getDefaultLootTable().location(), new LootItemCondition[]{ LootItemEntityPropertyCondition.hasProperties(LootContext.EntityTarget.THIS, EntityPredicate.Builder.entity().flags(EntityFlagsPredicate.Builder.flags().setOnFire(true))).build() - })); + }))); + } + + public record Wrapper(ResourceLocation location, DispelEntityRecipe recipe){ + } protected static Path getRecipePath(Path path, String id) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java index 5e57421535..6d70c232c7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java @@ -31,7 +31,7 @@ public static void datagen(GatherDataEvent event) { event.getGenerator().addProvider(event.includeServer(), new GlyphRecipeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new ApparatusRecipeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new PatchouliProvider(event.getGenerator())); - event.getGenerator().addProvider(event.includeServer(), new DefaultTableProvider(output, provider)); +// event.getGenerator().addProvider(event.includeServer(), new DefaultTableProvider(output, provider)); event.getGenerator().addProvider(event.includeServer(), new ImbuementRecipeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new CrushRecipeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new ItemTagProvider(output, provider, fileHelper)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java index 849d1c4173..57405bf9b7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntitySpellArrow.java @@ -10,6 +10,7 @@ import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; @@ -17,7 +18,9 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.Arrow; +import net.minecraft.world.entity.projectile.ProjectileDeflection; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; @@ -207,53 +210,52 @@ public byte getPierceLevel() { protected void onHitEntity(EntityHitResult p_213868_1_) { super.onHitEntity(p_213868_1_); Entity entity = p_213868_1_.getEntity(); - float f = (float) this.getDeltaMovement().length(); - int i = Mth.ceil(Mth.clamp((double) f * this.getBaseDamage(), 0.0D, 2.147483647E9D)); + float f = (float)this.getDeltaMovement().length(); + double d0 = this.getBaseDamage(); + Entity entity1 = this.getOwner(); + DamageSource damagesource = this.damageSources().arrow(this, entity1 != null ? entity1 : this); + if (this.getWeaponItem() != null && this.level() instanceof ServerLevel serverlevel) { + d0 = (double)EnchantmentHelper.modifyDamage(serverlevel, this.getWeaponItem(), entity, damagesource, (float)d0); + } + + int j = Mth.ceil(Mth.clamp((double)f * d0, 0.0, 2.147483647E9)); if (this.isCritArrow()) { - long j = this.random.nextInt(i / 2 + 2); - i = (int) Math.min(j + (long) i, 2147483647L); + long k = (long)this.random.nextInt(j / 2 + 2); + j = (int)Math.min(k + (long)j, 2147483647L); } - Entity entity1 = this.getOwner(); - DamageSource damagesource; - if (entity1 == null) { - damagesource = level.damageSources().arrow(this, this); - } else { - damagesource = level.damageSources().arrow(this, entity1); - if (entity1 instanceof LivingEntity) { - ((LivingEntity) entity1).setLastHurtMob(entity); - } + if (entity1 instanceof LivingEntity livingentity1) { + livingentity1.setLastHurtMob(entity); } boolean flag = entity.getType() == EntityType.ENDERMAN; - int k = entity.getRemainingFireTicks(); + int i = entity.getRemainingFireTicks(); if (this.isOnFire() && !flag) { - entity.setRemainingFireTicks(100); + entity.igniteForSeconds(5.0F); } - if (entity.hurt(damagesource, (float) i)) { + if (entity.hurt(damagesource, (float)j)) { if (flag) { return; } if (entity instanceof LivingEntity livingentity) { - if (!this.level.isClientSide && this.getPierceLevel() <= 0) { + if (!this.level().isClientSide && this.getPierceLevel() <= 0) { livingentity.setArrowCount(livingentity.getArrowCount() + 1); } - if (this.knockback > 0) { - Vec3 vector3d = this.getDeltaMovement().multiply(1.0D, 0.0D, 1.0D).normalize().scale((double) this.knockback * 0.6D); - if (vector3d.lengthSqr() > 0.0D) { - livingentity.push(vector3d.x, 0.1D, vector3d.z); - } + this.doKnockback(livingentity, damagesource); + if (this.level() instanceof ServerLevel serverlevel1) { + EnchantmentHelper.doPostAttackEffectsWithItemSource(serverlevel1, livingentity, damagesource, this.getWeaponItem()); } this.doPostHurtEffects(livingentity); } } else { - entity.setRemainingFireTicks(k); - + entity.setRemainingFireTicks(i); + this.deflect(ProjectileDeflection.REVERSE, entity, this.getOwner(), false); + this.setDeltaMovement(this.getDeltaMovement().scale(0.2)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java index 583c64da1a..02c8663df0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java @@ -12,9 +12,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.DamageTypeTags; import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.ShieldItem; import net.minecraft.world.phys.BlockHitResult; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; @@ -82,14 +80,14 @@ public static void dispelEvent(DispelEvent e) { public static void modifyItemAttributes(ItemAttributeModifierEvent event) { ItemStack itemStack = event.getItemStack(); if (itemStack.isEnchanted()) { - if (itemStack.getItem() instanceof ArmorItem armor) { - if (!(event.getSlotType() == armor.getEquipmentSlot())) { - return; - } - } else if (event.getSlotType() != EquipmentSlot.MAINHAND && event.getSlotType() != EquipmentSlot.OFFHAND) { - return; - } else if (itemStack.getItem() instanceof ShieldItem && !(event.getSlotType() == EquipmentSlot.OFFHAND)) - return; +// if (itemStack.getItem() instanceof ArmorItem armor) { +// if (!(event.getSlotType() == armor.getEquipmentSlot())) { +// return; +// } +// } else if (event.getSlotType() != EquipmentSlot.MAINHAND && event.getSlotType() != EquipmentSlot.OFFHAND) { +// return; +// } else if (itemStack.getItem() instanceof ShieldItem && !(event.getSlotType() == EquipmentSlot.OFFHAND)) +// return; //TODO: reimplement manaboost/regen attributes // if (itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT) > 0) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index 3917a21247..bd8c10b946 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -136,7 +136,7 @@ public static void itemPickupEvent(ItemEntityPickupEvent event) { } @SubscribeEvent - public static void shieldEvent(ShieldBlockEvent e) { + public static void shieldEvent(LivingShieldBlockEvent e) { if (!e.getEntity().level.isClientSide && e.getEntity() instanceof Player player && player.isBlocking()) { if (player.getUseItem().getItem() == ItemsRegistry.ENCHANTERS_SHIELD.asItem()) { player.addEffect(new MobEffectInstance(ModPotions.MANA_REGEN_EFFECT, 200, 1)); @@ -146,7 +146,7 @@ public static void shieldEvent(ShieldBlockEvent e) { } @SubscribeEvent - public static void livingHurtEvent(LivingHurtEvent e) { + public static void livingHurtEvent(LivingDamageEvent.Post e) { if (e.getEntity().level.isClientSide) return; if (e.getSource().getEntity() instanceof LivingEntity livingUser) { @@ -237,16 +237,19 @@ public static void onJump(LivingEvent.LivingJumpEvent event) { } @SubscribeEvent - public static void entityHurt(LivingHurtEvent e) { - if (e.getEntity() != null && e.getEntity().hasEffect(ModPotions.DEFENCE_EFFECT) && (e.getSource().is(DamageTypes.MAGIC) || e.getSource().is(DamageTypes.GENERIC) || e.getSource().is(DamageTypes.MOB_ATTACK))) { - if (e.getAmount() > 0.5) { - e.setAmount((float) Math.max(0.5, e.getAmount() - 1.0f - e.getEntity().getEffect(ModPotions.DEFENCE_EFFECT).getAmplifier())); + public static void entityHurt(LivingDamageEvent.Pre e) { + var container = e.getContainer(); + var source = container.getSource(); + var amount = container.getNewDamage(); + if (e.getEntity().hasEffect(ModPotions.DEFENCE_EFFECT) && (source.is(DamageTypes.MAGIC) || source.is(DamageTypes.GENERIC) || source.is(DamageTypes.MOB_ATTACK))) { + if (amount > 0.5) { + container.setNewDamage((float) Math.max(0.5, amount - 1.0f - e.getEntity().getEffect(ModPotions.DEFENCE_EFFECT).getAmplifier())); } } - if (e.getEntity() != null && e.getSource().is(DamageTypes.LIGHTNING_BOLT) && e.getEntity().hasEffect(ModPotions.SHOCKED_EFFECT)) { - float damage = e.getAmount() + 3.0f + 3.0f * e.getEntity().getEffect(ModPotions.SHOCKED_EFFECT).getAmplifier(); - e.setAmount(Math.max(0, damage)); + if (source.is(DamageTypes.LIGHTNING_BOLT) && e.getEntity().hasEffect(ModPotions.SHOCKED_EFFECT)) { + float damage = amount + 3.0f + 3.0f * e.getEntity().getEffect(ModPotions.SHOCKED_EFFECT).getAmplifier(); + container.setNewDamage(Math.max(0, damage)); } LivingEntity entity = e.getEntity(); if (entity == null) @@ -257,16 +260,16 @@ public static void entityHurt(LivingHurtEvent e) { || entity.isOnFire() || entity.hasEffect(ModPotions.SHOCKED_EFFECT) || entity.getTicksFrozen() >= entity.getTicksRequiredToFreeze())) { - e.setAmount(e.getAmount() + 0.5f + 0.33f * entity.getEffect(ModPotions.HEX_EFFECT).getAmplifier()); + container.setNewDamage(amount + 0.5f + 0.33f * entity.getEffect(ModPotions.HEX_EFFECT).getAmplifier()); } double warding = PerkUtil.valueOrZero(entity, PerkAttributes.WARDING); double feather = PerkUtil.valueOrZero(entity, PerkAttributes.FEATHER); - if (e.getSource().is(DamageTypes.MAGIC)) { - e.setAmount((float) (e.getAmount() - warding)); + if (source.is(DamageTypes.MAGIC)) { + container.setNewDamage((float) (amount - warding)); } - if (e.getSource().is(DamageTypes.FALL)) { - e.setAmount((float) (e.getAmount() - (e.getAmount() * feather))); + if (source.is(DamageTypes.FALL)) { + container.setNewDamage((float) (amount - (amount * feather))); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/FamiliarEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/FamiliarEvents.java index 70af19e908..7f8d5039b9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/FamiliarEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/FamiliarEvents.java @@ -10,8 +10,8 @@ import net.minecraft.world.entity.player.Player; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.entity.living.LivingDamageEvent; import net.neoforged.neoforge.event.entity.living.LivingEntityUseItemEvent; -import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; import net.neoforged.neoforge.event.entity.living.LivingKnockBackEvent; import net.neoforged.neoforge.event.entity.living.MobEffectEvent; @@ -132,7 +132,7 @@ public static void knockbackEvent(LivingKnockBackEvent event){ } @SubscribeEvent - public static void livingHurtEvent(LivingHurtEvent event){ + public static void livingHurtEvent(LivingDamageEvent.Post event){ if(!event.getSource().is(DamageTypeTags.BYPASSES_ARMOR) && event.getEntity() instanceof Player player) { List golems = getFamiliars((familiarEntity -> familiarEntity instanceof FamiliarAmethystGolem golem && golem.getOwner() != null && golem.getOwner().equals(event.getEntity()))); if (!golems.isEmpty()) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/OpenChestEvent.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/OpenChestEvent.java index f318948605..d39de992af 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/OpenChestEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/OpenChestEvent.java @@ -24,7 +24,7 @@ public void open() { try { if (level.getBlockEntity(pos) instanceof ChestBlockEntity chestBlockEntity) { fakePlayer.level = level; - fakePlayer.nextContainerCounter(); + fakePlayer.containerCounter = fakePlayer.containerCounter % 100 + 1; fakePlayer.setPos(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5); fakePlayer.containerMenu = chestBlockEntity.createMenu(fakePlayer.containerCounter, fakePlayer.inventory, fakePlayer); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java index 62c201c6cc..70847a9dfe 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java @@ -3,8 +3,8 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketReactiveSpell; -import com.hollingsworth.arsnouveau.common.spell.casters.ReactiveCaster; import com.hollingsworth.arsnouveau.common.util.HolderHelper; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.LivingEntity; @@ -12,7 +12,7 @@ import net.minecraft.world.item.ItemStack; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; +import net.neoforged.neoforge.event.entity.living.LivingDamageEvent; import net.neoforged.neoforge.event.entity.player.AttackEntityEvent; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; @@ -20,7 +20,7 @@ public class ReactiveEvents { @SubscribeEvent - public static void livingHitEvent(LivingHurtEvent e) { + public static void livingHitEvent(LivingDamageEvent.Post e) { LivingEntity entity = e.getEntity(); if (entity.getCommandSenderWorld().isClientSide) return; @@ -30,9 +30,10 @@ public static void livingHitEvent(LivingHurtEvent e) { } } - public static void castSpell(LivingEntity playerIn, ItemStack s) { - if (s.getEnchantmentLevel(HolderHelper.unwrap(playerIn.level, EnchantmentRegistry.REACTIVE_ENCHANTMENT)) * .25 >= Math.random() && new ReactiveCaster(s).getSpell().isValid()) { - ReactiveCaster reactiveCaster = new ReactiveCaster(s); + public static void castSpell(LivingEntity playerIn, ItemStack stack) { + int level = stack.getEnchantmentLevel(playerIn.level.holderOrThrow(EnchantmentRegistry.REACTIVE_ENCHANTMENT)); + var reactiveCaster = stack.get(DataComponentRegistry.REACTIVE_CASTER); + if (level * .25 >= Math.random() && reactiveCaster != null && reactiveCaster.getSpell().isValid()) { reactiveCaster.castSpell(playerIn.getCommandSenderWorld(), playerIn, InteractionHand.MAIN_HAND, null); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/BlankParchmentItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/BlankParchmentItem.java index cd1ea17c0b..688766218b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/BlankParchmentItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/BlankParchmentItem.java @@ -3,7 +3,7 @@ import com.hollingsworth.arsnouveau.api.camera.ICameraMountable; import com.hollingsworth.arsnouveau.api.item.IScribeable; import com.hollingsworth.arsnouveau.common.block.tile.ScribesTile; -import com.hollingsworth.arsnouveau.common.items.data.ScryData; +import com.hollingsworth.arsnouveau.common.items.data.ScryPosData; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; @@ -31,7 +31,7 @@ public InteractionResult useOn(UseOnContext pContext) { return super.useOn(pContext); if (pContext.getLevel().getBlockEntity(pContext.getClickedPos()) instanceof ICameraMountable) { ItemStack stack = new ItemStack(ItemsRegistry.SCRYER_SCROLL.get()); - stack.set(DataComponentRegistry.SCRY_DATA, new ScryData(pContext.getClickedPos())); + stack.set(DataComponentRegistry.SCRY_DATA, new ScryPosData(pContext.getClickedPos())); if (!pContext.getPlayer().addItem(stack)) { pContext.getLevel().addFreshEntity(new ItemEntity(pContext.getLevel(), pContext.getPlayer().getX(), pContext.getPlayer().getY(), pContext.getPlayer().getZ(), stack)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java index abcf14f342..708bc92ddc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java @@ -1,25 +1,19 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.item.ICasterTool; -import com.hollingsworth.arsnouveau.api.mana.IManaCap; import com.hollingsworth.arsnouveau.api.mana.IManaDiscountEquipment; -import com.hollingsworth.arsnouveau.api.spell.*; +import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; +import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; -import com.hollingsworth.arsnouveau.common.network.Networking; -import com.hollingsworth.arsnouveau.common.network.NotEnoughManaPacket; -import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.config.Config; -import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.ItemStack; @@ -84,35 +78,4 @@ public Optional getTooltipImage(ItemStack pStack) { return Optional.of(new SpellTooltip(caster)); return Optional.empty(); } - - /** - * A Spell resolver that ignores mana player limits. - */ - public static class TomeSpellCaster extends SpellCaster { - public TomeSpellCaster(ItemStack stack) { - super(stack); - } - - @Override - public SpellResolver getSpellResolver(SpellContext context, Level worldIn, LivingEntity playerIn, InteractionHand handIn) { - return new SpellResolver(context) { - @Override - protected boolean enoughMana(LivingEntity entity) { - int totalCost = getResolveCost(); - IManaCap manaCap = CapabilityRegistry.getMana(entity).orElse(null); - if (manaCap == null) - return false; - boolean canCast = totalCost <= manaCap.getCurrentMana() || manaCap.getCurrentMana() == manaCap.getMaxMana() || (entity instanceof Player player && player.isCreative()); - if (!canCast && !entity.getCommandSenderWorld().isClientSide && !silent) { - PortUtil.sendMessageNoSpam(entity, Component.translatable("ars_nouveau.spell.no_mana")); - if (entity instanceof ServerPlayer serverPlayer) - Networking.sendToPlayerClient(new NotEnoughManaPacket(totalCost), serverPlayer); - } - return canCast; - } - - }; - } - } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java index 0517cd3bb1..7aaa78e059 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java @@ -1,37 +1,24 @@ package com.hollingsworth.arsnouveau.common.items; -import com.hollingsworth.arsnouveau.api.ANFakePlayer; import com.hollingsworth.arsnouveau.api.item.ICasterTool; -import com.hollingsworth.arsnouveau.api.spell.*; -import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.IWrappedCaster; -import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.LivingCaster; -import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.PlayerCaster; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.client.renderer.item.ScryCasterRenderer; -import com.hollingsworth.arsnouveau.common.block.BasicSpellTurret; import com.hollingsworth.arsnouveau.common.block.ScryerCrystal; -import com.hollingsworth.arsnouveau.common.items.data.ScryData; -import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; +import com.hollingsworth.arsnouveau.common.items.data.ScryPosData; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Position; import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; -import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; @@ -57,7 +44,7 @@ public InteractionResult useOn(UseOnContext pContext) { ItemStack stack = pContext.getItemInHand(); if(pContext.getLevel().getBlockState(pos).getBlock() instanceof ScryerCrystal){ if(!pContext.getLevel().isClientSide) { - stack.set(DataComponentRegistry.SCRY_DATA, new ScryData(pos)); + stack.set(DataComponentRegistry.SCRY_DATA, new ScryPosData(pos)); PortUtil.sendMessage(pContext.getPlayer(), Component.translatable("ars_nouveau.dominion_wand.position_set")); } return InteractionResult.SUCCESS; @@ -75,7 +62,7 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte @Override public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { getInformation(stack, context, tooltip2, flagIn); - ScryData data = stack.get(DataComponentRegistry.SCRY_DATA); + ScryPosData data = stack.get(DataComponentRegistry.SCRY_DATA); if(data == null || data.pos() == null){ tooltip2.add(Component.translatable("ars_nouveau.scry_caster.no_pos")); }else{ @@ -104,65 +91,4 @@ public void registerControllers(AnimatableManager.ControllerRegistrar data) {} public AnimatableInstanceCache getAnimatableInstanceCache() { return factory; } - - public static class ScryCasterType extends SpellCaster{ - - @Override - public InteractionResultHolder castSpell(Level worldIn, LivingEntity entity, InteractionHand handIn, @org.jetbrains.annotations.Nullable Component invalidMessage, @NotNull Spell spell) { - ItemStack stack = entity.getItemInHand(handIn); - - if (worldIn.isClientSide) - return InteractionResultHolder.pass(entity.getItemInHand(handIn)); - spell = modifySpellBeforeCasting(worldIn, entity, handIn, spell); - if (!spell.isValid() && invalidMessage != null) { - PortUtil.sendMessageNoSpam(entity, invalidMessage); - return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); - } - Player player = entity instanceof Player thisPlayer ? thisPlayer : ANFakePlayer.getPlayer((ServerLevel) worldIn); - IWrappedCaster wrappedCaster = entity instanceof Player pCaster ? new PlayerCaster(pCaster) : new LivingCaster(entity); - SpellResolver resolver = getSpellResolver(new SpellContext(worldIn, spell, entity, wrappedCaster, stack), worldIn, player, handIn); - ITurretBehavior behavior = BasicSpellTurret.TURRET_BEHAVIOR_MAP.get(spell.getCastMethod()); - if(behavior == null){ - PortUtil.sendMessage(entity, Component.translatable("ars_nouveau.scry_caster.invalid_behavior")); - return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); - } - - ScryData data = stack.get(DataComponentRegistry.SCRY_DATA); - boolean playerHoldingScroll = entity.getItemInHand(InteractionHand.OFF_HAND).getItem() instanceof ScryerScroll; - BlockPos scryPos = playerHoldingScroll ? player.getItemInHand(InteractionHand.OFF_HAND).getOrDefault(DataComponentRegistry.SCRY_DATA, new ScryData(null)).pos() : data.pos(); - if(scryPos == null){ - PortUtil.sendMessage(entity, Component.translatable("ars_nouveau.scry_caster.no_pos")); - return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); - } - if(!worldIn.isLoaded(scryPos)){ - PortUtil.sendMessage(entity, Component.translatable("ars_nouveau.camera.not_loaded")); - return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); - } - BlockState castingAtState = worldIn.getBlockState(scryPos); - if(!(castingAtState.getBlock() instanceof ScryerCrystal)){ - PortUtil.sendMessage(entity, Component.translatable("ars_nouveau.scry_caster.not_crystal")); - return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); - } - - if(!resolver.canCast(player)){ - return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); - } - - Position position; - Direction direction = castingAtState.getValue(ScryerCrystal.FACING); - // Target the block the crystal is facing if the spell is a touch spell. - if(spell.getCastMethod() instanceof MethodTouch){ - position = BasicSpellTurret.getDispensePosition(scryPos, direction); - }else{ - position = ScryerCrystal.getDispensePosition(scryPos, direction); - } - behavior.onCast(resolver, (ServerLevel) worldIn, scryPos, - player, - position, - direction); - resolver.expendMana(); - playSound(entity.getOnPos(), worldIn, entity, getCurrentSound(), SoundSource.PLAYERS); - return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); - } - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java index c16b994fb9..2644cc355c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.camera.ICameraMountable; -import com.hollingsworth.arsnouveau.common.items.data.ScryData; +import com.hollingsworth.arsnouveau.common.items.data.ScryPosData; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.network.chat.Component; @@ -24,7 +24,7 @@ public InteractionResult useOn(UseOnContext pContext) { if (pContext.getLevel().isClientSide) return super.useOn(pContext); if (pContext.getLevel().getBlockEntity(pContext.getClickedPos()) instanceof ICameraMountable) { - ScryData data = new ScryData(pContext.getClickedPos()); + ScryPosData data = new ScryPosData(pContext.getClickedPos()); pContext.getItemInHand().set(DataComponentRegistry.SCRY_DATA, data); PortUtil.sendMessage(pContext.getPlayer(), Component.translatable("ars_nouveau.scryer_scroll.bound", pContext.getClickedPos().getX() + ", " + pContext.getClickedPos().getY() + ", " + pContext.getClickedPos().getZ())); } @@ -34,7 +34,7 @@ public InteractionResult useOn(UseOnContext pContext) { @Override public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { - ScryData data = stack.getOrDefault(DataComponentRegistry.SCRY_DATA, new ScryData(null)); + ScryPosData data = stack.getOrDefault(DataComponentRegistry.SCRY_DATA, new ScryPosData(null)); if (data.pos() != null) { tooltip2.add(Component.translatable("ars_nouveau.scryer_scroll.bound", data.pos().getX() + ", " + data.pos().getY() + ", " + data.pos().getZ())); } else { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java index 5333fa048d..c7be8eeb90 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.common.items; -import com.google.common.collect.Lists; import com.hollingsworth.arsnouveau.api.item.ICasterTool; import com.hollingsworth.arsnouveau.api.mana.IManaDiscountEquipment; import com.hollingsworth.arsnouveau.api.spell.*; @@ -13,27 +12,29 @@ import com.hollingsworth.arsnouveau.common.util.PortUtil; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.stats.Stats; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.monster.CrossbowAttackMob; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.FireworkRocketEntity; import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.item.*; +import net.minecraft.world.item.component.ChargedProjectiles; +import net.minecraft.world.item.component.CustomData; +import net.minecraft.world.item.enchantment.EnchantmentEffectComponents; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.Nullable; import org.joml.Quaternionf; import org.joml.Vector3f; import software.bernie.geckolib.animatable.GeoItem; @@ -43,60 +44,49 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.function.Consumer; import java.util.function.Predicate; public class SpellCrossbow extends CrossbowItem implements GeoItem, ICasterTool, IManaDiscountEquipment { - + private static final CrossbowItem.ChargingSounds DEFAULT_SOUNDS = new CrossbowItem.ChargingSounds( + Optional.of(SoundEvents.CROSSBOW_LOADING_START), Optional.of(SoundEvents.CROSSBOW_LOADING_MIDDLE), Optional.of(SoundEvents.CROSSBOW_LOADING_END) + ); public SpellCrossbow(Properties pProperties) { super(pProperties); } - public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pHand) { - ItemStack itemstack = pPlayer.getItemInHand(pHand); - if (isCharged(itemstack)) { - shootStoredProjectiles(pLevel, pPlayer, pHand, itemstack, getShootingPower(itemstack), 1.0F); - setCharged(itemstack, false); - return InteractionResultHolder.consume(itemstack); - } else if (!pPlayer.getProjectile(itemstack).isEmpty()) { - if (!isCharged(itemstack)) { - this.startSoundPlayed = false; - this.midLoadSoundPlayed = false; - pPlayer.startUsingItem(pHand); - } - - return InteractionResultHolder.consume(itemstack); - } else { - return InteractionResultHolder.fail(itemstack); - } - } - - private float getShootingPower(ItemStack pCrossbowStack) { - return hasChargedProjectile(pCrossbowStack, Items.FIREWORK_ROCKET) ? 1.6F : 3.15F; - } - - /** - * Called when the player stops using an Item (stops holding the right mouse button). - */ + // Duplicate override except we use our own tryLoadProjectiles + @Override public void releaseUsing(ItemStack pStack, Level pLevel, LivingEntity pEntityLiving, int pTimeLeft) { - int i = this.getUseDuration(pStack) - pTimeLeft; - float f = getPowerForTime(i, pStack); + int i = this.getUseDuration(pStack, pEntityLiving) - pTimeLeft; + float f = getPowerForTime(i, pStack, pEntityLiving); if (f >= 1.0F && !isCharged(pStack) && tryLoadProjectiles(pEntityLiving, pStack)) { - setCharged(pStack, true); - SoundSource soundsource = pEntityLiving instanceof Player ? SoundSource.PLAYERS : SoundSource.HOSTILE; - pLevel.playSound(null, pEntityLiving.getX(), pEntityLiving.getY(), pEntityLiving.getZ(), SoundEvents.CROSSBOW_LOADING_END, soundsource, 1.0F, 1.0F / (pLevel.getRandom().nextFloat() * 0.5F + 1.0F) + 0.2F); + CrossbowItem.ChargingSounds crossbowitem$chargingsounds = EnchantmentHelper.pickHighestLevel(pStack, EnchantmentEffectComponents.CROSSBOW_CHARGING_SOUNDS).orElse(DEFAULT_SOUNDS); + crossbowitem$chargingsounds.end() + .ifPresent( + p_352852_ -> pLevel.playSound( + null, + pEntityLiving.getX(), + pEntityLiving.getY(), + pEntityLiving.getZ(), + p_352852_.value(), + pEntityLiving.getSoundSource(), + 1.0F, + 1.0F / (pLevel.getRandom().nextFloat() * 0.5F + 1.0F) + 0.2F + ) + ); } - } private boolean tryLoadProjectiles(LivingEntity pShooter, ItemStack pCrossbowStack) { - int multishotLevel = EnchantmentHelper.getTagEnchantmentLevel(Enchantments.MULTISHOT, pCrossbowStack); + int multishotLevel = EnchantmentHelper.getTagEnchantmentLevel(pShooter.level.holderOrThrow(Enchantments.MULTISHOT), pCrossbowStack); int numProjectiles = multishotLevel == 0 ? 1 : 3; boolean isCreative = pShooter instanceof Player && ((Player)pShooter).getAbilities().instabuild; ItemStack ammoStack = pShooter.getProjectile(pCrossbowStack); ItemStack ammoCopy = ammoStack.copy(); - ISpellCaster caster = getSpellCaster(pCrossbowStack); + SpellCaster caster = getSpellCaster(pCrossbowStack); SpellResolver resolver = new SpellResolver(new SpellContext(pShooter.level, caster.modifySpellBeforeCasting(pShooter.level, pShooter, InteractionHand.MAIN_HAND, caster.getSpell()), pShooter, LivingCaster.from(pShooter), pCrossbowStack)); boolean consumedMana = false; @@ -108,6 +98,7 @@ private boolean tryLoadProjectiles(LivingEntity pShooter, ItemStack pCrossbowSta if(ammoStack.getItem() instanceof FormSpellArrow formSpellArrow && formSpellArrow.part == AugmentSplit.INSTANCE){ numProjectiles += formSpellArrow.numParts; } + List stacks = new ArrayList<>(); for(int k = 0; k < numProjectiles; ++k) { if (k > 0) { ammoStack = ammoCopy.copy(); @@ -117,79 +108,20 @@ private boolean tryLoadProjectiles(LivingEntity pShooter, ItemStack pCrossbowSta ammoStack = new ItemStack(Items.ARROW); ammoCopy = ammoStack.copy(); } - if (!loadProjectile(pShooter, pCrossbowStack, ammoStack, k > 0, isCreative, consumedMana)) { - return false; - } - } - - return true; - } - - private boolean loadProjectile(LivingEntity pShooter, ItemStack pCrossbowStack, ItemStack pAmmoStack, boolean pHasAmmo, boolean pIsCreative, boolean consumedMana) { - if (pAmmoStack.isEmpty()) { - return false; - } else { - boolean flag = pIsCreative && pAmmoStack.getItem() instanceof ArrowItem; - ItemStack itemstack; - if (!flag && !pIsCreative && !pHasAmmo) { - itemstack = pAmmoStack.split(1); - if (pAmmoStack.isEmpty() && pShooter instanceof Player) { - ((Player)pShooter).getInventory().removeItem(pAmmoStack); - } - } else { - itemstack = pAmmoStack.copy(); - } - addChargedProjectile(pCrossbowStack, itemstack, consumedMana); - return true; - } - } - - private void addChargedProjectile(ItemStack pCrossbowStack, ItemStack pAmmoStack, boolean isSpell) { - CompoundTag compoundtag = pCrossbowStack.getOrCreateTag(); - ListTag listtag; - if (compoundtag.contains("ChargedProjectiles", 9)) { - listtag = compoundtag.getList("ChargedProjectiles", 10); - } else { - listtag = new ListTag(); - } - - CompoundTag compoundtag1 = new CompoundTag(); - pAmmoStack.save(compoundtag1); - listtag.add(compoundtag1); - compoundtag.put("ChargedProjectiles", listtag); - compoundtag.putBoolean("isSpell", isSpell); - } - - private List getChargedProjectiles(ItemStack pCrossbowStack) { - List list = Lists.newArrayList(); - CompoundTag compoundtag = pCrossbowStack.getTag(); - if (compoundtag != null && compoundtag.contains("ChargedProjectiles", 9)) { - ListTag listtag = compoundtag.getList("ChargedProjectiles", 10); - if (listtag != null) { - for(int i = 0; i < listtag.size(); ++i) { - CompoundTag compoundtag1 = listtag.getCompound(i); - list.add(ItemStack.of(compoundtag1)); - } + ItemStack checkedAmmo = useAmmo(pCrossbowStack, ammoStack, pShooter, k > 0); + if(!checkedAmmo.isEmpty()) { + stacks.add(useAmmo(pCrossbowStack, ammoStack, pShooter, k > 0)); } } - return list; - } - - private void clearChargedProjectiles(ItemStack pCrossbowStack) { - CompoundTag compoundtag = pCrossbowStack.getTag(); - if (compoundtag != null) { - ListTag listtag = compoundtag.getList("ChargedProjectiles", 9); - listtag.clear(); - compoundtag.put("ChargedProjectiles", listtag); + if(!stacks.isEmpty()){ + pCrossbowStack.set(DataComponents.CHARGED_PROJECTILES, ChargedProjectiles.of(stacks)); + CompoundTag tag = new CompoundTag(); + tag.putBoolean("isSpell", true); + pCrossbowStack.set(DataComponents.CUSTOM_DATA, CustomData.of(tag)); } - } - - public boolean hasChargedProjectile(ItemStack pCrossbowStack, Item pAmmoItem) { - return getChargedProjectiles(pCrossbowStack).stream().anyMatch((p_40870_) -> { - return p_40870_.is(pAmmoItem); - }); + return true; } public void shootOne(Level worldIn, LivingEntity pShooter, InteractionHand pHand, ItemStack pCrossbowStack, ItemStack pAmmoStack, float pSoundPitch, boolean pIsCreativeMode, float pVelocity, float pInaccuracy, float pProjectileAngle, boolean isSpell) { @@ -205,29 +137,23 @@ public void shootOne(Level worldIn, LivingEntity pShooter, InteractionHand pHand } } LivingCaster livingCaster = pShooter instanceof Player ? new PlayerCaster((Player)pShooter) : new LivingCaster(pShooter); - ISpellCaster caster = getSpellCaster(pCrossbowStack); + SpellCaster caster = getSpellCaster(pCrossbowStack); SpellResolver resolver = new SpellResolver(new SpellContext(worldIn, caster.modifySpellBeforeCasting(worldIn, pShooter, InteractionHand.MAIN_HAND, caster.getSpell()), pShooter, livingCaster, pCrossbowStack)); if (pAmmoStack.getItem() == Items.ARROW && isSpell) { projectile = buildSpellArrow(worldIn, pShooter, caster, pCrossbowStack); - ((EntitySpellArrow) projectile).pierceLeft += EnchantmentHelper.getTagEnchantmentLevel(Enchantments.PIERCING, pCrossbowStack); + ((EntitySpellArrow) projectile).pierceLeft += EnchantmentHelper.getTagEnchantmentLevel(worldIn.holderOrThrow(Enchantments.PIERCING), pCrossbowStack); }else if(pAmmoStack.getItem() instanceof SpellArrow && projectile instanceof EntitySpellArrow spellArrow){ - spellArrow.pierceLeft += EnchantmentHelper.getTagEnchantmentLevel(Enchantments.PIERCING, pCrossbowStack); + spellArrow.pierceLeft += EnchantmentHelper.getTagEnchantmentLevel(worldIn.holderOrThrow(Enchantments.PIERCING), pCrossbowStack); spellArrow.setColors(resolver.spell.color()); } - if (pShooter instanceof CrossbowAttackMob crossbowattackmob) { - crossbowattackmob.shootCrossbowProjectile(crossbowattackmob.getTarget(), pCrossbowStack, projectile, pProjectileAngle); - } else { - Vec3 vec31 = pShooter.getUpVector(1.0F); - Quaternionf quaternionf = (new Quaternionf()).setAngleAxis(pProjectileAngle * ((float)Math.PI / 180F), vec31.x, vec31.y, vec31.z); - Vec3 vec3 = pShooter.getViewVector(1.0F); - Vector3f vector3f = vec3.toVector3f().rotate(quaternionf); - projectile.shoot(vector3f.x(), vector3f.y(), vector3f.z(), pVelocity, pInaccuracy); - } + Vec3 vec31 = pShooter.getUpVector(1.0F); + Quaternionf quaternionf = (new Quaternionf()).setAngleAxis(pProjectileAngle * ((float)Math.PI / 180F), vec31.x, vec31.y, vec31.z); + Vec3 vec3 = pShooter.getViewVector(1.0F); + Vector3f vector3f = vec3.toVector3f().rotate(quaternionf); + projectile.shoot(vector3f.x(), vector3f.y(), vector3f.z(), pVelocity, pInaccuracy); + - pCrossbowStack.hurtAndBreak(flag ? 3 : 1, pShooter, (p_40858_) -> { - p_40858_.broadcastBreakEvent(pHand); - }); worldIn.addFreshEntity(projectile); worldIn.playSound(null, pShooter.getX(), pShooter.getY(), pShooter.getZ(), SoundEvents.CROSSBOW_SHOOT, SoundSource.PLAYERS, 1.0F, pSoundPitch); } @@ -235,28 +161,25 @@ public void shootOne(Level worldIn, LivingEntity pShooter, InteractionHand pHand private AbstractArrow getArrow(Level pLevel, LivingEntity pLivingEntity, ItemStack pCrossbowStack, ItemStack pAmmoStack) { ArrowItem arrowitem = (ArrowItem)(pAmmoStack.getItem() instanceof ArrowItem ? pAmmoStack.getItem() : Items.ARROW); - AbstractArrow abstractarrow = arrowitem.createArrow(pLevel, pAmmoStack, pLivingEntity); + AbstractArrow abstractarrow = arrowitem.createArrow(pLevel, pAmmoStack, pLivingEntity, pCrossbowStack); if (pLivingEntity instanceof Player) { abstractarrow.setCritArrow(true); } - abstractarrow.setSoundEvent(SoundEvents.CROSSBOW_HIT); - abstractarrow.setShotFromCrossbow(true); - int i = pCrossbowStack.getEnchantmentLevel(Enchantments.PIERCING); - if (i > 0) { - abstractarrow.setPierceLevel((byte)i); - } - return abstractarrow; } - // was override of performShooting - public void shootStoredProjectiles(Level pLevel, LivingEntity pShooter, InteractionHand pUsedHand, ItemStack pCrossbowStack, float pVelocity, float pInaccuracy) { + + @Override + public void performShooting(Level pLevel, LivingEntity pShooter, InteractionHand pUsedHand, ItemStack pCrossbowStack, float pVelocity, float pInaccuracy, @Nullable LivingEntity pTarget){ if (pShooter instanceof Player player && net.neoforged.neoforge.event.EventHooks.onArrowLoose(pCrossbowStack, pShooter.level, player, 1, true) < 0) return; - List list = getChargedProjectiles(pCrossbowStack); - float[] afloat = getShotPitches(pShooter.getRandom()); - boolean isSpell = pCrossbowStack.hasTag() && pCrossbowStack.getTag().getBoolean("isSpell"); - for(int i = 0; i < list.size(); ++i) { - ItemStack itemstack = list.get(i); + ChargedProjectiles chargedprojectiles = pCrossbowStack.set(DataComponents.CHARGED_PROJECTILES, ChargedProjectiles.EMPTY); + if(chargedprojectiles == null) + return; + var customData = pCrossbowStack.get(DataComponents.CUSTOM_DATA); + CompoundTag tag = customData != null ? customData.getUnsafe() : new CompoundTag(); + boolean isSpell = tag.getBoolean("isSpell"); + for(int i = 0; i < chargedprojectiles.getItems().size(); ++i) { + ItemStack itemstack = chargedprojectiles.getItems().get(i); boolean flag = pShooter instanceof Player && ((Player)pShooter).getAbilities().instabuild; if (!itemstack.isEmpty()) { float offset = 10.0f * (float)((i > 0 ? 1 + i : 0) / 2); @@ -268,14 +191,6 @@ public void shootStoredProjectiles(Level pLevel, LivingEntity pShooter, Interact } } - onCrossbowShot(pLevel, pShooter, pCrossbowStack); - } - - - /** - * Called after {@plainlink #fireProjectiles} to clear the charged projectile and to update the player advancements. - */ - private void onCrossbowShot(Level pLevel, LivingEntity pShooter, ItemStack pCrossbowStack) { if (pShooter instanceof ServerPlayer serverplayer) { if (!pLevel.isClientSide) { CriteriaTriggers.SHOT_CROSSBOW.trigger(serverplayer, pCrossbowStack); @@ -283,8 +198,6 @@ private void onCrossbowShot(Level pLevel, LivingEntity pShooter, ItemStack pCros serverplayer.awardStat(Stats.ITEM_USED.get(pCrossbowStack.getItem())); } - - clearChargedProjectiles(pCrossbowStack); } @Override @@ -351,6 +264,11 @@ public BlockEntityWithoutLevelRenderer getCustomRenderer() { }); } + @Override + public boolean useOnRelease(ItemStack pStack) { + return pStack.is(this); + } + @Override public void registerControllers(AnimatableManager.ControllerRegistrar data) {} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ReactiveCasterData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ReactiveCasterData.java new file mode 100644 index 0000000000..abeda46edf --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ReactiveCasterData.java @@ -0,0 +1,36 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.hollingsworth.arsnouveau.api.spell.*; +import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; +import com.mojang.serialization.MapCodec; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.common.util.FakePlayer; + +import java.util.Map; + +public class ReactiveCasterData extends SpellCaster { + public static MapCodec CODEC = SpellCaster.createCodec(ReactiveCasterData::new); + + public static StreamCodec STREAM_CODEC = CheatSerializer.create(ReactiveCasterData.CODEC.codec()); + + public ReactiveCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots) { + super(slot, flavorText, isHidden, hiddenText, maxSlots); + } + + public ReactiveCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, Map spells) { + super(slot, flavorText, isHidden, hiddenText, maxSlots, spells); + } + + @Override + public SpellResolver getSpellResolver(SpellContext context, Level worldIn, LivingEntity playerIn, InteractionHand handIn) { + if(!(playerIn instanceof Player) || playerIn instanceof FakePlayer){ + return new EntitySpellResolver(context); + } + return super.getSpellResolver(context, worldIn, playerIn, handIn); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java new file mode 100644 index 0000000000..9b849ef11a --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java @@ -0,0 +1,107 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.hollingsworth.arsnouveau.api.ANFakePlayer; +import com.hollingsworth.arsnouveau.api.spell.*; +import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.IWrappedCaster; +import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.LivingCaster; +import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.PlayerCaster; +import com.hollingsworth.arsnouveau.common.block.BasicSpellTurret; +import com.hollingsworth.arsnouveau.common.block.ScryerCrystal; +import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; +import com.hollingsworth.arsnouveau.common.items.ScryerScroll; +import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; +import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Position; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; + +public class ScryCasterData extends SpellCaster { + + public static final MapCodec CODEC = createCodec(ScryCasterData::new); + + public static final StreamCodec STREAM_CODEC = CheatSerializer.create(CODEC); + + public ScryCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots) { + super(slot, flavorText, isHidden, hiddenText, maxSlots); + } + + public ScryCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, Map spells) { + super(slot, flavorText, isHidden, hiddenText, maxSlots, spells); + } + + @Override + public InteractionResultHolder castSpell(Level worldIn, LivingEntity entity, InteractionHand handIn, @org.jetbrains.annotations.Nullable Component invalidMessage, @NotNull Spell spell) { + ItemStack stack = entity.getItemInHand(handIn); + + if (worldIn.isClientSide) + return InteractionResultHolder.pass(entity.getItemInHand(handIn)); + spell = modifySpellBeforeCasting(worldIn, entity, handIn, spell); + if (!spell.isValid() && invalidMessage != null) { + PortUtil.sendMessageNoSpam(entity, invalidMessage); + return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); + } + Player player = entity instanceof Player thisPlayer ? thisPlayer : ANFakePlayer.getPlayer((ServerLevel) worldIn); + IWrappedCaster wrappedCaster = entity instanceof Player pCaster ? new PlayerCaster(pCaster) : new LivingCaster(entity); + SpellResolver resolver = getSpellResolver(new SpellContext(worldIn, spell, entity, wrappedCaster, stack), worldIn, player, handIn); + ITurretBehavior behavior = BasicSpellTurret.TURRET_BEHAVIOR_MAP.get(spell.getCastMethod()); + if(behavior == null){ + PortUtil.sendMessage(entity, Component.translatable("ars_nouveau.scry_caster.invalid_behavior")); + return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); + } + + ScryPosData data = stack.get(DataComponentRegistry.SCRY_DATA); + boolean playerHoldingScroll = entity.getItemInHand(InteractionHand.OFF_HAND).getItem() instanceof ScryerScroll; + BlockPos scryPos = playerHoldingScroll ? player.getItemInHand(InteractionHand.OFF_HAND).getOrDefault(DataComponentRegistry.SCRY_DATA, new ScryPosData(null)).pos() : data.pos(); + if(scryPos == null){ + PortUtil.sendMessage(entity, Component.translatable("ars_nouveau.scry_caster.no_pos")); + return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); + } + if(!worldIn.isLoaded(scryPos)){ + PortUtil.sendMessage(entity, Component.translatable("ars_nouveau.camera.not_loaded")); + return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); + } + BlockState castingAtState = worldIn.getBlockState(scryPos); + if(!(castingAtState.getBlock() instanceof ScryerCrystal)){ + PortUtil.sendMessage(entity, Component.translatable("ars_nouveau.scry_caster.not_crystal")); + return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); + } + + if(!resolver.canCast(player)){ + return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); + } + + Position position; + Direction direction = castingAtState.getValue(ScryerCrystal.FACING); + // Target the block the crystal is facing if the spell is a touch spell. + if(spell.getCastMethod() instanceof MethodTouch){ + position = BasicSpellTurret.getDispensePosition(scryPos, direction); + }else{ + position = ScryerCrystal.getDispensePosition(scryPos, direction); + } + behavior.onCast(resolver, (ServerLevel) worldIn, scryPos, + player, + position, + direction); + resolver.expendMana(); + playSound(entity.getOnPos(), worldIn, entity, getCurrentSound(), SoundSource.PLAYERS); + return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryData.java deleted file mode 100644 index b939f2ff67..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryData.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.hollingsworth.arsnouveau.common.items.data; - -import com.mojang.serialization.Codec; -import net.minecraft.core.BlockPos; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; - -public record ScryData(BlockPos pos) { - public static Codec CODEC = BlockPos.CODEC.xmap(ScryData::new, ScryData::pos); - - public static StreamCodec STREAM_CODEC = StreamCodec.composite(BlockPos.STREAM_CODEC, ScryData::pos, ScryData::new); -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryPosData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryPosData.java new file mode 100644 index 0000000000..0d1ea6a924 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryPosData.java @@ -0,0 +1,12 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; + +public record ScryPosData(BlockPos pos) { + public static Codec CODEC = BlockPos.CODEC.xmap(ScryPosData::new, ScryPosData::pos); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite(BlockPos.STREAM_CODEC, ScryPosData::pos, ScryPosData::new); +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java new file mode 100644 index 0000000000..1bb8787656 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java @@ -0,0 +1,59 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.hollingsworth.arsnouveau.api.mana.IManaCap; +import com.hollingsworth.arsnouveau.api.spell.Spell; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; +import com.hollingsworth.arsnouveau.api.spell.SpellContext; +import com.hollingsworth.arsnouveau.api.spell.SpellResolver; +import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; +import com.hollingsworth.arsnouveau.common.network.Networking; +import com.hollingsworth.arsnouveau.common.network.NotEnoughManaPacket; +import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; +import com.mojang.serialization.MapCodec; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; + +import java.util.Map; + +public class TomeCasterData extends SpellCaster { + public static final MapCodec CODEC = SpellCaster.createCodec(TomeCasterData::new); + + public static final StreamCodec STREAM_CODEC = CheatSerializer.create(TomeCasterData.CODEC); + + + public TomeCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots) { + super(slot, flavorText, isHidden, hiddenText, maxSlots); + } + + public TomeCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, Map spells) { + super(slot, flavorText, isHidden, hiddenText, maxSlots, spells); + } + + @Override + public SpellResolver getSpellResolver(SpellContext context, Level worldIn, LivingEntity playerIn, InteractionHand handIn) { + return new SpellResolver(context) { + @Override + protected boolean enoughMana(LivingEntity entity) { + int totalCost = getResolveCost(); + IManaCap manaCap = CapabilityRegistry.getMana(entity).orElse(null); + if (manaCap == null) + return false; + boolean canCast = totalCost <= manaCap.getCurrentMana() || manaCap.getCurrentMana() == manaCap.getMaxMana() || (entity instanceof Player player && player.isCreative()); + if (!canCast && !entity.getCommandSenderWorld().isClientSide && !silent) { + PortUtil.sendMessageNoSpam(entity, Component.translatable("ars_nouveau.spell.no_mana")); + if (entity instanceof ServerPlayer serverPlayer) + Networking.sendToPlayerClient(new NotEnoughManaPacket(totalCost), serverPlayer); + } + return canCast; + } + + }; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/CrossbowMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/CrossbowMixin.java deleted file mode 100644 index 92a9c6043b..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/CrossbowMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.hollingsworth.arsnouveau.common.mixin; - -import com.hollingsworth.arsnouveau.common.items.SpellCrossbow; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.CrossbowItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(CrossbowItem.class) -public class CrossbowMixin { - @Inject(method="Lnet/minecraft/world/item/CrossbowItem;performShooting(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/InteractionHand;Lnet/minecraft/world/item/ItemStack;FF)V", - at= @At("HEAD"), - cancellable = true) - private static void performShooting(Level pLevel, LivingEntity pShooter, InteractionHand pUsedHand, ItemStack pCrossbowStack, float pVelocity, float pInaccuracy, CallbackInfo ci) { - if(!(pShooter instanceof Player) && pCrossbowStack.getItem() instanceof SpellCrossbow spellCrossbow){ - spellCrossbow.shootStoredProjectiles(pLevel, pShooter, pUsedHand, pCrossbowStack, pVelocity, pInaccuracy); - ci.cancel(); - } - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java index 4e980b3ce3..8e450e8a17 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java @@ -20,12 +20,12 @@ public class PacketSetBookMode extends AbstractPacket{ //Decoder public PacketSetBookMode(RegistryFriendlyByteBuf buf) { - spellCaster = ANCodecs.decode(SpellCaster.CODEC.codec(), buf.readNbt()); + spellCaster = ANCodecs.decode(SpellCaster.DEFAULT_CODEC.codec(), buf.readNbt()); } //Encoder public void toBytes(RegistryFriendlyByteBuf buf) { - buf.writeNbt(ANCodecs.encode(SpellCaster.CODEC.codec(), spellCaster)); + buf.writeNbt(ANCodecs.encode(SpellCaster.DEFAULT_CODEC.codec(), spellCaster)); } public PacketSetBookMode(SpellCaster spellCaster) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/BounceEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/BounceEffect.java index dfe6ee8773..93e6ff129a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/BounceEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/BounceEffect.java @@ -12,9 +12,8 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.entity.living.LivingDamageEvent; import net.neoforged.neoforge.event.entity.living.LivingFallEvent; -import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; @EventBusSubscriber(modid = ArsNouveau.MODID) public class BounceEffect extends MobEffect { @@ -58,7 +57,9 @@ public static void onFall(LivingFallEvent event) { } @SubscribeEvent - public static void onFlyWallDamage(LivingHurtEvent event) { + public static void onFlyWallDamage(LivingDamageEvent.Pre event) { + var container = event.getContainer(); + var source = container.getSource(); LivingEntity entity = event.getEntity(); if (entity == null || !entity.hasEffect(ModPotions.BOUNCE_EFFECT)) { return; @@ -67,8 +68,8 @@ public static void onFlyWallDamage(LivingHurtEvent event) { if (!isPlayer) { return; } - if(event.getSource().is(DamageTypes.FLY_INTO_WALL)){ - event.setAmount(0); + if(source.is(DamageTypes.FLY_INTO_WALL)){ + container.setNewDamage(0); Vec3 lookAngle = entity.getLookAngle(); entity.setDeltaMovement(lookAngle.scale(-2)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java index 6c9d16ff01..2bea36bb02 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.Level; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; +import net.neoforged.neoforge.event.entity.living.LivingDamageEvent; import net.neoforged.neoforge.event.tick.PlayerTickEvent; @EventBusSubscriber(modid = ArsNouveau.MODID) @@ -52,9 +52,12 @@ public static void entityTick(PlayerTickEvent.Post e) { } @SubscribeEvent - public static void entityHurt(LivingHurtEvent e) { - if (e.getSource().is(DamageTypes.FALL) && e.getEntity().hasEffect(ModPotions.GRAVITY_EFFECT)) { - e.setAmount(e.getAmount() * 2.0f); + public static void entityHurt(LivingDamageEvent.Pre e) { + var container = e.getContainer(); + var source = container.getSource(); + var amount = container.getNewDamage(); + if (source.is(DamageTypes.FALL) && e.getEntity().hasEffect(ModPotions.GRAVITY_EFFECT)) { + container.setNewDamage(amount * 2.0f); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/casters/ReactiveCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/casters/ReactiveCaster.java deleted file mode 100644 index 434b105ef5..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/casters/ReactiveCaster.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.hollingsworth.arsnouveau.common.spell.casters; - -import com.hollingsworth.arsnouveau.api.spell.EntitySpellResolver; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; -import com.hollingsworth.arsnouveau.api.spell.SpellContext; -import com.hollingsworth.arsnouveau.api.spell.SpellResolver; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.neoforged.neoforge.common.util.FakePlayer; - -public class ReactiveCaster extends SpellCaster { - public ReactiveCaster(ItemStack stack) { - super(stack); - } - - @Override - public SpellResolver getSpellResolver(SpellContext context, Level worldIn, LivingEntity playerIn, InteractionHand handIn) { - if(!(playerIn instanceof Player) || playerIn instanceof FakePlayer){ - return new EntitySpellResolver(context); - } - return super.getSpellResolver(context, worldIn, playerIn, handIn); - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLight.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLight.java index 65b648cf49..fafa05aec7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLight.java @@ -69,7 +69,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull lightable.onLight(rayTraceResult, world, shooter, spellStats, spellContext); return; } else if (world.getBlockEntity(pos) instanceof SignBlockEntity sign) { - sign.updateText((a) -> sign.getTextFacingPlayer(player).setHasGlowingText(true), + sign.updateText((a) -> sign.getText(true).setHasGlowingText(true), sign.isFacingFrontText(player) ); world.gameEvent(GameEvent.BLOCK_CHANGE, sign.getBlockPos(), GameEvent.Context.of(player, sign.getBlockState())); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java index b75a6a2af6..d1aca4c160 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java @@ -1,6 +1,8 @@ package com.hollingsworth.arsnouveau.common.util; +import com.google.gson.JsonElement; import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; @@ -24,4 +26,8 @@ public static Tag encode(Codec codec, T value){ public static T decode(Codec codec, Tag tag){ return codec.parse(NbtOps.INSTANCE, tag).getOrThrow(); } + + public static JsonElement toJson(Codec codec, T value){ + return codec.encodeStart(JsonOps.INSTANCE, value).getOrThrow(); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java index 631a377a93..783783ea98 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java @@ -27,7 +27,7 @@ public class DataComponentRegistry { public static final DeferredHolder , DataComponentType> PRESENT = DATA.register("present", () -> DataComponentType.builder().persistent(PresentData.CODEC).networkSynchronized(PresentData.STREAM_CODEC).build()); - public static final DeferredHolder , DataComponentType> SCRY_DATA = DATA.register("scry_data", () -> DataComponentType.builder().persistent(ScryData.CODEC).networkSynchronized(ScryData.STREAM_CODEC).build()); + public static final DeferredHolder , DataComponentType> SCRY_DATA = DATA.register("scry_data", () -> DataComponentType.builder().persistent(ScryPosData.CODEC).networkSynchronized(ScryPosData.STREAM_CODEC).build()); public static final DeferredHolder , DataComponentType> WARP_SCROLL = DATA.register("warp_scroll", () -> DataComponentType.builder().persistent(WarpScrollData.CODEC).networkSynchronized(WarpScrollData.STREAM_CODEC).build()); @@ -37,11 +37,17 @@ public class DataComponentRegistry { public static final DeferredHolder, DataComponentType> CODEX_DATA = DATA.register("codex_data", () -> DataComponentType.builder().persistent(CodexData.CODEC).networkSynchronized(CodexData.STREAM).build()); - public static final DeferredHolder, DataComponentType> SPELL_CASTER = DATA.register("spell_caster", () -> DataComponentType.builder().persistent(SpellCaster.CODEC.codec()).networkSynchronized(SpellCaster.STREAM).build()); + public static final DeferredHolder, DataComponentType> SPELL_CASTER = DATA.register("spell_caster", () -> DataComponentType.builder().persistent(SpellCaster.DEFAULT_CODEC.codec()).networkSynchronized(SpellCaster.DEFAULT_STREAM).build()); + + public static final DeferredHolder, DataComponentType> SCRY_CASTER = DATA.register("scry_caster", () -> DataComponentType.builder().persistent(ScryCasterData.CODEC.codec()).networkSynchronized(ScryCasterData.STREAM_CODEC).build()); public static final DeferredHolder, DataComponentType> POTION_LAUNCHER = DATA.register("potion_launcher", () -> DataComponentType.builder().persistent(PotionLauncherData.CODEC.codec()).networkSynchronized(PotionLauncherData.STREAM).build()); public static final DeferredHolder, DataComponentType> BLOCK_FILL_CONTENTS = DATA.register("block_fill_contents", () -> DataComponentType.builder().persistent(BlockFillContents.CODEC).networkSynchronized(BlockFillContents.STREAM_CODEC).build()); public static final DeferredHolder, DataComponentType> MOB_JAR = DATA.register("mob_jar", () -> DataComponentType.builder().persistent(MobJarData.CODEC).networkSynchronized(MobJarData.STREAM).build()); + + public static final DeferredHolder, DataComponentType> TOME_CASTER = DATA.register("tome_caster", () -> DataComponentType.builder().persistent(TomeCasterData.CODEC.codec()).networkSynchronized(TomeCasterData.STREAM_CODEC).build()); + + public static final DeferredHolder, DataComponentType> REACTIVE_CASTER = DATA.register("reactive_caster", () -> DataComponentType.builder().persistent(ReactiveCasterData.CODEC.codec()).networkSynchronized(ReactiveCasterData.STREAM_CODEC).build()); } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 0b68280c90..9d1ca905a3 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -3,6 +3,7 @@ public net.minecraft.world.entity.Entity position public net.minecraft.client.gui.components.EditBox * public net.minecraft.world.entity.projectile.AbstractArrow knockbackStrength # knockbackStrength public net.minecraft.world.item.alchemy.PotionBrewing m_43513_(Lnet/minecraft/world/item/alchemy/Potion;Lnet/minecraft/world/item/Item;Lnet/minecraft/world/item/alchemy/Potion;)V # addMix +public net.minecraft.world.item.alchemy.PotionBrewing$Mix public net.minecraft.world.level.Explosion * public-f net.minecraft.world.entity.raid.Raid numGroups # numGroups public net.minecraft.world.entity.monster.ZombieVillager startConverting(Ljava/util/UUID;I)V # startConverting @@ -21,6 +22,7 @@ public net.minecraft.world.item.context.UseOnContext hitResult # hitResult public net.minecraft.world.level.block.AbstractCandleBlock setLit(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Z)V # setLit public-f net.minecraft.world.entity.Entity setRemoved(Lnet/minecraft/world/entity/Entity$RemovalReason;)V # setRemoved public net.minecraft.server.level.ServerPlayer camera # camera +public net.minecraft.server.level.ServerPlayer containerCounter # containerCounter public net.minecraft.client.multiplayer.ClientChunkCache$Storage public net.minecraft.client.player.LocalPlayer yRotLast # yRotLast public net.minecraft.client.player.LocalPlayer xRotLast # xRotLast diff --git a/src/main/resources/ars_nouveau.mixins.json b/src/main/resources/ars_nouveau.mixins.json index d066fdf424..c883f687be 100644 --- a/src/main/resources/ars_nouveau.mixins.json +++ b/src/main/resources/ars_nouveau.mixins.json @@ -17,7 +17,6 @@ "light.LightEntityMixin" ], "mixins": [ - "CrossbowMixin", "DamageSourceMixin", "LivingAccessor", "MobAccessor", From ab1cc1c8caef154e27edb65426c92ec5be62b886 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 4 Jul 2024 17:13:17 -0500 Subject: [PATCH 027/363] fix toml, event subscribers --- .gitignore | 2 +- build.gradle | 40 +++--- .../hollingsworth/arsnouveau/ArsNouveau.java | 31 ++--- .../api/camera/ICameraMountable.java | 2 +- .../arsnouveau/api/util/BlockUtil.java | 5 +- .../arsnouveau/api/util/SourceUtil.java | 3 - .../arsnouveau/api/util/SpellUtil.java | 3 +- .../client/container/TerminalSyncManager.java | 11 +- .../renderer/tile/IntangibleAirRenderer.java | 2 +- .../common/block/BasicSpellTurret.java | 2 +- .../common/block/RotatingSpellTurret.java | 2 +- .../block/tile/BasicSpellTurretTile.java | 16 ++- .../block/tile/EnchantedTurretTile.java | 8 +- .../block/tile/TimerSpellTurretTile.java | 8 +- .../common/camera/CameraController.java | 16 ++- .../common/camera/CameraEvents.java | 2 +- .../common/entity/ScryerCamera.java | 2 +- .../entity/pathfinding/FMLEventHandler.java | 6 +- .../arsnouveau/common/event/EventHandler.java | 4 +- .../common/mixin/camera/ChunkMapMixin.java | 131 ++++++++---------- .../arsnouveau/setup/config/ANModConfig.java | 22 +-- .../setup/registry/CapabilityRegistry.java | 32 ++--- .../setup/registry/RecipeRegistry.java | 2 - .../resources/META-INF/neoforge.mods.toml | 34 ++--- 24 files changed, 181 insertions(+), 205 deletions(-) diff --git a/.gitignore b/.gitignore index d9aa287284..8ef87c4cc3 100644 --- a/.gitignore +++ b/.gitignore @@ -20,7 +20,7 @@ build # other eclipse -run +runs server # Files from Forge MDK diff --git a/build.gradle b/build.gradle index e1c10f9103..2d5fcdad57 100644 --- a/build.gradle +++ b/build.gradle @@ -118,26 +118,26 @@ dependencies { implementation 'top.theillusivec4.curios:curios-neoforge:9.0.3+1.21' } -tasks.withType(ProcessResources).configureEach { - var replaceProperties = [ - minecraft_version : minecraft_version, - minecraft_version_range: minecraft_version_range, - neo_version : neo_version, - neo_version_range : neo_version_range, - loader_version_range : loader_version_range, - mod_id : mod_id, - mod_name : mod_name, - mod_license : mod_license, - mod_version : mod_version, - mod_authors : mod_authors, - mod_description : mod_description - ] - inputs.properties replaceProperties - - filesMatching(['META-INF/neoforge.mods.toml']) { - expand replaceProperties - } -} +//tasks.withType(ProcessResources).configureEach { +// var replaceProperties = [ +// minecraft_version : minecraft_version, +// minecraft_version_range: minecraft_version_range, +// neo_version : neo_version, +// neo_version_range : neo_version_range, +// loader_version_range : loader_version_range, +// mod_id : mod_id, +// mod_name : mod_name, +// mod_license : mod_license, +// mod_version : mod_version, +// mod_authors : mod_authors, +// mod_description : mod_description +// ] +// inputs.properties replaceProperties +// +// filesMatching(['META-INF/neoforge.mods.toml']) { +// expand replaceProperties +// } +//} tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation diff --git a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java index 31ad87f807..cefe94f4b3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java +++ b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau; -import com.hollingsworth.arsnouveau.api.event.EventQueue; import com.hollingsworth.arsnouveau.api.registry.BuddingConversionRegistry; import com.hollingsworth.arsnouveau.api.registry.CasterTomeRegistry; import com.hollingsworth.arsnouveau.api.registry.RitualRegistry; @@ -10,7 +9,6 @@ import com.hollingsworth.arsnouveau.common.advancement.ANCriteriaTriggers; import com.hollingsworth.arsnouveau.common.entity.pathfinding.ClientEventHandler; import com.hollingsworth.arsnouveau.common.entity.pathfinding.FMLEventHandler; -import com.hollingsworth.arsnouveau.common.entity.pathfinding.Pathfinding; import com.hollingsworth.arsnouveau.common.items.RitualTablet; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.world.Terrablender; @@ -21,10 +19,7 @@ import com.hollingsworth.arsnouveau.setup.proxy.ClientProxy; import com.hollingsworth.arsnouveau.setup.proxy.IProxy; import com.hollingsworth.arsnouveau.setup.proxy.ServerProxy; -import com.hollingsworth.arsnouveau.setup.registry.APIRegistry; -import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; -import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; -import com.hollingsworth.arsnouveau.setup.registry.ModEntities; +import com.hollingsworth.arsnouveau.setup.registry.*; import com.hollingsworth.arsnouveau.setup.reward.Rewards; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; @@ -33,11 +28,9 @@ import net.minecraft.world.level.block.DispenserBlock; import net.minecraft.world.level.block.FlowerPotBlock; import net.neoforged.bus.api.IEventBus; -import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModList; import net.neoforged.fml.ModLoadingContext; -import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.Mod; import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; @@ -46,14 +39,14 @@ import net.neoforged.fml.event.lifecycle.InterModEnqueueEvent; import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.common.world.chunk.RegisterTicketControllersEvent; +import net.neoforged.neoforge.common.world.chunk.TicketController; import net.neoforged.neoforge.event.server.ServerStartedEvent; -import net.neoforged.neoforge.event.server.ServerStoppingEvent; import java.util.function.Supplier; @Mod(ArsNouveau.MODID) -@EventBusSubscriber(modid = ArsNouveau.MODID) public class ArsNouveau { public static final String MODID = "ars_nouveau"; @SuppressWarnings("deprecation") // Has to be runForDist, SafeRunForDist will throw a sided crash @@ -63,10 +56,9 @@ public class ArsNouveau { public static boolean optifineLoaded = false; public static boolean sodiumLoaded = false; public static boolean patchouliLoaded = false; - + public static TicketController ticketController; public ArsNouveau(IEventBus modEventBus, ModContainer modContainer){ - NeoForge.EVENT_BUS.register(this); - NeoForge.EVENT_BUS.register(FMLEventHandler.class); + NeoForge.EVENT_BUS.addListener(FMLEventHandler::onServerStopped); caelusLoaded = ModList.get().isLoaded("caelus"); terrablenderLoaded = ModList.get().isLoaded("terrablender"); sodiumLoaded = ModList.get().isLoaded("rubidium"); @@ -81,13 +73,17 @@ public ArsNouveau(IEventBus modEventBus, ModContainer modContainer){ } modEventBus.addListener(Networking::register); modEventBus.addListener(ModSetup::registerEvents); + modEventBus.addListener(CapabilityRegistry::registerCapabilities); ModSetup.registers(modEventBus); modEventBus.addListener(ModEntities::registerPlacements); modEventBus.addListener(this::setup); modEventBus.addListener(this::postModLoadEvent); modEventBus.addListener(this::clientSetup); modEventBus.addListener(this::sendImc); - NeoForge.EVENT_BUS.register(this); + modEventBus.addListener((RegisterTicketControllersEvent e) ->{ + ticketController = new TicketController(ArsNouveau.prefix("ticket_controller")); + e.register(ticketController); + }); ANCriteriaTriggers.init(); try { Thread thread = new Thread(Rewards::init); @@ -166,13 +162,6 @@ public void sendImc(InterModEnqueueEvent evt) { ModSetup.sendIntercoms(); } - @SubscribeEvent - public static void onServerStopped(final ServerStoppingEvent event) { - Pathfinding.shutdown(); - EventQueue.getServerInstance().clear(); - EventQueue.getClientQueue().clear(); - } - public static ResourceLocation prefix(String str) { return ResourceLocation.fromNamespaceAndPath(MODID, str); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java b/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java index d7883b7949..27713014e5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java @@ -32,7 +32,7 @@ default void mountCamera(Level level, BlockPos pos, Player player) { for (int x = chunkPos.getX() - viewDistance; x <= chunkPos.getX() + viewDistance; x++) { for (int z = chunkPos.getZ() - viewDistance; z <= chunkPos.getZ() + viewDistance; z++) { - ForcedChunkManager.forceChunk(serverLevel, ArsNouveau.MODID, dummyEntity, x, z, true, false); + ArsNouveau.ticketController.forceChunk(serverLevel, dummyEntity, x, z, true, true); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java index 55416e82dd..6faa82502b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java @@ -335,7 +335,8 @@ public static boolean breakExtraBlock(ServerLevel world, BlockPos pos, ItemStack } GameType type = player.getAbilities().instabuild ? GameType.CREATIVE : GameType.SURVIVAL; - int exp = net.neoforged.neoforge.common.CommonHooks.onBlockBreakEvent(world, type, player, pos); + //TODO: check block breaking rules + int exp = 1;// net.neoforged.neoforge.common.CommonHooks.onBlockBreakEvent(world, type, player, pos); if (exp == -1) { return false; } else { @@ -344,7 +345,7 @@ public static boolean breakExtraBlock(ServerLevel world, BlockPos pos, ItemStack if ((block instanceof CommandBlock || block instanceof StructureBlock || block instanceof JigsawBlock) && !player.canUseGameMasterBlocks()) { world.sendBlockUpdated(pos, blockstate, blockstate, 3); return false; - } else if (player.getMainHandItem().onBlockStartBreak(pos, player)) { + } else if (false){// player.getMainHandItem().onBlockStartBreak(pos, player)) { return false; } else if (player.blockActionRestricted(world, pos, type)) { return false; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java index 194ff58e57..29b4f85b5e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.api.util; -import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.source.ISpecialSourceProvider; import com.hollingsworth.arsnouveau.api.source.SourceManager; import com.hollingsworth.arsnouveau.api.source.SourceProvider; @@ -8,14 +7,12 @@ import com.hollingsworth.arsnouveau.common.entity.EntityFollowProjectile; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; -import net.neoforged.fml.common.EventBusSubscriber; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.Optional; -@EventBusSubscriber(modid = ArsNouveau.MODID) public class SourceUtil { public static List canGiveSource(BlockPos pos, Level world, int range) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/SpellUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/SpellUtil.java index a9fbd2c220..94f1c1e876 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/SpellUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/SpellUtil.java @@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Vec3i; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; @@ -58,7 +59,7 @@ public static boolean isCorrectHarvestLevel(int strength, BlockState state) { }; if (strength > 5) tier = Tiers.NETHERITE; - return TierSortingRegistry.isCorrectTierForDrops(tier, state); + return !BuiltInRegistries.BLOCK.getOrCreateTag(tier.getIncorrectBlocksForDrops()).contains(state.getBlockHolder()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java index f8b99a1b8a..2f4663426d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java @@ -66,7 +66,9 @@ private StoredItemStack read(FriendlyByteBuf buf) { long count = (flags & 1) != 0 ? 0 : buf.readVarLong(); stack.setCount(count); if(rd && (flags & 2) != 0) { - stack.getStack().setTag(buf.readNbt()); + //todo: check storage terminal for this +// stack.getStack(). +// stack.getStack().setTag(buf.readNbt()); } idMap.put(stack, id); idMap2.put(id, stack); @@ -204,9 +206,10 @@ public static Item readItemId(FriendlyByteBuf buf) { public static CompoundTag getSyncTag(ItemStack stack) { Item item = stack.getItem(); CompoundTag compoundtag = null; - if (item.isDamageable(stack) || item.shouldOverrideMultiplayerNbt()) { - compoundtag = stack.getShareTag(); - } + // todo: storage check if this is needed +// if (item.isDamageable(stack) || item.shouldOverrideMultiplayerNbt()) { +// compoundtag = stack.getShareTag(); +// } return compoundtag; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/IntangibleAirRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/IntangibleAirRenderer.java index 6984ad961f..e7c17ebe33 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/IntangibleAirRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/IntangibleAirRenderer.java @@ -53,7 +53,7 @@ public DummyRender(String p_173178_, VertexFormat p_173179_, VertexFormat.Mode p } - private void renderModelBrightnessColorQuads(PoseStack.Pose matrixEntry, VertexConsumer builder, int color, List listQuads, int combinedLightsIn, int combinedOverlayIn) { + private void renderModelBrightnessColorQuads(PoseStack.Pose matrixEntry, VertexConsumer builder, float red, float green, float blue, float alpha, List listQuads, int combinedLightsIn, int combinedOverlayIn) { for (BakedQuad bakedquad : listQuads) { float f; float f1; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java index 657017823f..4f580bae18 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java @@ -111,7 +111,7 @@ public void onCast(SpellResolver resolver, ServerLevel serverLevel, BlockPos pos public void shootSpell(ServerLevel world, BlockPos pos) { if (!(world.getBlockEntity(pos) instanceof BasicSpellTurretTile tile)) return; - ISpellCaster caster = tile.getSpellCaster(); + SpellCaster caster = tile.spellCaster; if (caster.getSpell().isEmpty()) return; int manaCost = tile.getManaCost(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java index 05d29aeeca..10ed1833c0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java @@ -41,7 +41,7 @@ public class RotatingSpellTurret extends BasicSpellTurret { //Direction Adjustments public void shootSpell(ServerLevel world, BlockPos pos) { if (!(world.getBlockEntity(pos) instanceof RotatingTurretTile tile)) return; - ISpellCaster caster = tile.getSpellCaster(); + SpellCaster caster = tile.spellCaster; if (caster.getSpell().isEmpty()) return; int manaCost = tile.getManaCost(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java index 5dbc1b057e..599ad25e6b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java @@ -1,9 +1,9 @@ package com.hollingsworth.arsnouveau.common.block.tile; import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; -import com.hollingsworth.arsnouveau.api.spell.ItemCasterProvider; import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.common.block.ITickable; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; @@ -11,6 +11,8 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.capabilities.ICapabilityProvider; +import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.*; @@ -18,10 +20,10 @@ import java.util.List; -public class BasicSpellTurretTile extends ModdedTile implements ITooltipProvider, GeoBlockEntity, IAnimationListener, ITickable, ItemCasterProvider { +public class BasicSpellTurretTile extends ModdedTile implements ITooltipProvider, GeoBlockEntity, IAnimationListener, ITickable, ICapabilityProvider { boolean playRecoil; - public SpellCaster spellCaster = new SpellCaster(new CompoundTag()); + public SpellCaster spellCaster = new SpellCaster(0, null, false, null, 1); public BasicSpellTurretTile(BlockEntityType p_i48289_1_, BlockPos pos, BlockState state) { super(p_i48289_1_, pos, state); @@ -38,13 +40,13 @@ public int getManaCost() { @Override protected void saveAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { super.saveAdditional(pTag, pRegistries); - spellCaster.serializeOnTag(pTag); + pTag.put("spell_caster", ANCodecs.encode(SpellCaster.DEFAULT_CODEC.codec(), spellCaster)); } @Override protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { super.loadAdditional(pTag, pRegistries); - this.spellCaster = new TurretSpellCaster(pTag); + this.spellCaster = ANCodecs.decode(SpellCaster.DEFAULT_CODEC.codec(), pTag.get("spell_caster")); } @Override @@ -83,4 +85,8 @@ public void startAnimation(int arg) { this.playRecoil = true; } + @Override + public @Nullable SpellCaster getCapability(BasicSpellTurretTile object, Void context) { + return spellCaster; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantedTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantedTurretTile.java index 9d23503a78..76dfdfe1bc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantedTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantedTurretTile.java @@ -3,11 +3,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.state.BlockState; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.*; public class EnchantedTurretTile extends BasicSpellTurretTile { @@ -18,7 +14,7 @@ public EnchantedTurretTile(BlockPos pos, BlockState state) { @Override public int getManaCost() { - return getSpellCaster().getSpell().getCost() / 2; + return this.spellCaster.getSpell().getCost() / 2; } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TimerSpellTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TimerSpellTurretTile.java index 2dd244f11a..6ffe9d8082 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TimerSpellTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TimerSpellTurretTile.java @@ -14,11 +14,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.*; import java.util.List; @@ -49,7 +45,7 @@ public void tick() { @Override public int getManaCost() { int cost = super.getManaCost(); - Spell spell = this.getSpellCaster().getSpell(); + Spell spell = this.spellCaster.getSpell(); cost -= spell.getInstanceCount(MethodTouch.INSTANCE) * MethodTouch.INSTANCE.getCastingCost(); cost -= spell.getInstanceCount(EffectRedstone.INSTANCE) * EffectRedstone.INSTANCE.getCastingCost(); cost -= spell.getInstanceCount(MethodProjectile.INSTANCE) * MethodProjectile.INSTANCE.getCastingCost(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java index 57320aca3c..cecc379366 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraController.java @@ -30,7 +30,7 @@ public class CameraController { private static boolean wasRightPressed; @SubscribeEvent - public static void onClientTick(ClientTickEvent event) { + public static void onClientTick(ClientTickEvent.Pre event) { Entity cameraEntity = Minecraft.getInstance().cameraEntity; if (cameraEntity instanceof ScryerCamera cam) { @@ -54,7 +54,19 @@ public static void onClientTick(ClientTickEvent event) { dismount(); options.keyShift.setDown(false); } - } else if (event instanceof ClientTickEvent.Post) { + } + } + } + + @SubscribeEvent + public static void onClientTick(ClientTickEvent.Post event) { + Entity cameraEntity = Minecraft.getInstance().cameraEntity; + + if (cameraEntity instanceof ScryerCamera cam) { + Options options = Minecraft.getInstance().options; + + //up/down/left/right handling is split to prevent players who are viewing a camera from moving around in a boat or on a horse + if (event instanceof ClientTickEvent.Post) { if (wasUpPressed) { moveViewUp(cam); options.keyUp.setDown(true); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraEvents.java index 08a9592349..995497732a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/camera/CameraEvents.java @@ -31,7 +31,7 @@ public static void onPlayerLoggedOut(PlayerLoggedOutEvent event) { } @SubscribeEvent - public static void onDamageTaken(LivingDamageEvent event) { + public static void onDamageTaken(LivingDamageEvent.Pre event) { LivingEntity entity = event.getEntity(); Level level = entity.level; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/ScryerCamera.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/ScryerCamera.java index 0841848451..e69de8087d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/ScryerCamera.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/ScryerCamera.java @@ -150,7 +150,7 @@ public void discardCamera() { for (int x = chunkPos.getX() - view; x <= chunkPos.getX() + view; x++) { for (int z = chunkPos.getZ() - view; z <= chunkPos.getZ() + view; z++) { - ForcedChunkManager.forceChunk((ServerLevel) this.level, ArsNouveau.MODID, this, x, z, false, false); + ArsNouveau.ticketController.forceChunk((ServerLevel) this.level, this, x, z, false, false); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/FMLEventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/FMLEventHandler.java index 9733ca0368..68f585ba54 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/FMLEventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/FMLEventHandler.java @@ -1,14 +1,16 @@ package com.hollingsworth.arsnouveau.common.entity.pathfinding; -import net.neoforged.bus.api.SubscribeEvent; +import com.hollingsworth.arsnouveau.api.event.EventQueue; import net.neoforged.neoforge.event.server.ServerStoppingEvent; /** * Event handler used to catch various forge events. */ public class FMLEventHandler { - @SubscribeEvent + public static void onServerStopped(final ServerStoppingEvent event) { Pathfinding.shutdown(); + EventQueue.getServerInstance().clear(); + EventQueue.getClientQueue().clear(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index bd8c10b946..5d0722a5fa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -129,7 +129,7 @@ public boolean isExpired() { } @SubscribeEvent(priority = EventPriority.LOWEST) - public static void itemPickupEvent(ItemEntityPickupEvent event) { + public static void itemPickupEvent(ItemEntityPickupEvent.Pre event) { Player player = event.getPlayer(); ItemStack pickingUp = event.getItemEntity().getItem(); VoidJar.tryVoiding(player, pickingUp); @@ -208,7 +208,7 @@ public static void clientTickEnd(ClientTickEvent.Post event) { @SubscribeEvent(priority = EventPriority.LOWEST) - public static void onGlideTick(PlayerTickEvent event) { + public static void onGlideTick(PlayerTickEvent.Pre event) { var player = event.getEntity(); if (ArsNouveau.caelusLoaded && EffectGlide.canGlide(player)) { CaelusHandler.setFlying(player); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ChunkMapMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ChunkMapMixin.java index bd1d886881..ca1a240f15 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ChunkMapMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ChunkMapMixin.java @@ -1,24 +1,8 @@ package com.hollingsworth.arsnouveau.common.mixin.camera; -import com.hollingsworth.arsnouveau.common.entity.ScryerCamera; -import com.hollingsworth.arsnouveau.common.util.CameraUtil; -import it.unimi.dsi.fastutil.objects.ObjectIterator; -import net.minecraft.core.SectionPos; -import net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket; -import net.minecraft.server.level.ChunkHolder; import net.minecraft.server.level.ChunkMap; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.ChunkPos; -import org.apache.commons.lang3.mutable.MutableObject; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import java.util.List; // https://github.com/Geforce132/SecurityCraft/blob/1.18.2/src/main/java/net/geforcemods/securitycraft/mixin/camera/ChunkMapMixin.java @Mixin( @@ -26,63 +10,64 @@ priority = 1100 ) public abstract class ChunkMapMixin { - @Shadow - int viewDistance; - - public ChunkMapMixin() { - } - - @Shadow - protected abstract void updateChunkTracking(ServerPlayer var1, ChunkPos var2, MutableObject var3, boolean var4, boolean var5); - - @Shadow - public abstract List getPlayers(ChunkPos var1, boolean var2); - - @Inject( - method = {"setViewDistance"}, - at = {@At( - value = "NEW", - target = "org/apache/commons/lang3/mutable/MutableObject", - shift = At.Shift.AFTER - )}, - locals = LocalCapture.CAPTURE_FAILSOFT, - cancellable = true, - remap = false - ) - private void updateAccordingToCamera(int viewDistance, CallbackInfo callback, int i, int j, ObjectIterator objectIterator, ChunkHolder chunkHolder, ChunkPos chunkPos) { - MutableObject mutableObject = new MutableObject(); - this.getPlayers(chunkPos, false).forEach((player) -> { - SectionPos sectionPos; - if (CameraUtil.isPlayerMountedOnCamera(player)) { - sectionPos = SectionPos.of(player.getCamera()); - } else { - sectionPos = player.getLastSectionPos(); - } - - boolean flag = ChunkMap.isChunkInRange(chunkPos.x, chunkPos.z, sectionPos.x(), sectionPos.z(), j); - boolean flag1 = ChunkMap.isChunkInRange(chunkPos.x, chunkPos.z, sectionPos.x(), sectionPos.z(), viewDistance); - this.updateChunkTracking(player, chunkPos, mutableObject, flag, flag1); - }); - callback.cancel(); - } - - @Inject( - method = {"move"}, - at = {@At("TAIL")} - ) - private void trackCameraLoadedChunks(ServerPlayer player, CallbackInfo callback) { - if (CameraUtil.isPlayerMountedOnCamera(player)) { - SectionPos pos = SectionPos.of(player.getCamera()); - ScryerCamera camera = (ScryerCamera) player.getCamera(); - - for (int i = pos.x() - this.viewDistance; i <= pos.x() + this.viewDistance; ++i) { - for (int j = pos.z() - this.viewDistance; j <= pos.z() + this.viewDistance; ++j) { - this.updateChunkTracking(player, new ChunkPos(i, j), new MutableObject(), camera.hasLoadedChunks(), true); - } - } + //todo: reenable scryer camera +// @Shadow +// int viewDistance; +// +// public ChunkMapMixin() { +// } +// +// @Shadow +// protected abstract void updateChunkTracking(ServerPlayer var1, ChunkPos var2, MutableObject var3, boolean var4, boolean var5); +// +// @Shadow +// public abstract List getPlayers(ChunkPos var1, boolean var2); - camera.setHasLoadedChunks(this.viewDistance); - } +// @Inject( +// method = {"setViewDistance"}, +// at = {@At( +// value = "NEW", +// target = "org/apache/commons/lang3/mutable/MutableObject", +// shift = At.Shift.AFTER +// )}, +// locals = LocalCapture.CAPTURE_FAILSOFT, +// cancellable = true, +// remap = false +// ) +// private void updateAccordingToCamera(int viewDistance, CallbackInfo callback, int i, int j, ObjectIterator objectIterator, ChunkHolder chunkHolder, ChunkPos chunkPos) { +// MutableObject mutableObject = new MutableObject(); +// this.getPlayers(chunkPos, false).forEach((player) -> { +// SectionPos sectionPos; +// if (CameraUtil.isPlayerMountedOnCamera(player)) { +// sectionPos = SectionPos.of(player.getCamera()); +// } else { +// sectionPos = player.getLastSectionPos(); +// } +// +// boolean flag = ChunkMap.isChunkInRange(chunkPos.x, chunkPos.z, sectionPos.x(), sectionPos.z(), j); +// boolean flag1 = ChunkMap.isChunkInRange(chunkPos.x, chunkPos.z, sectionPos.x(), sectionPos.z(), viewDistance); +// this.updateChunkTracking(player, chunkPos, mutableObject, flag, flag1); +// }); +// callback.cancel(); +// } - } +// @Inject( +// method = {"move"}, +// at = {@At("TAIL")} +// ) +// private void trackCameraLoadedChunks(ServerPlayer player, CallbackInfo callback) { +// if (CameraUtil.isPlayerMountedOnCamera(player)) { +// SectionPos pos = SectionPos.of(player.getCamera()); +// ScryerCamera camera = (ScryerCamera) player.getCamera(); +// +// for (int i = pos.x() - this.viewDistance; i <= pos.x() + this.viewDistance; ++i) { +// for (int j = pos.z() - this.viewDistance; j <= pos.z() + this.viewDistance; ++j) { +// this.updateChunkTracking(player, new ChunkPos(i, j), new MutableObject(), camera.hasLoadedChunks(), true); +// } +// } +// +// camera.setHasLoadedChunks(this.viewDistance); +// } +// +// } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ANModConfig.java b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ANModConfig.java index 2daa42dc00..7bd3fd26ea 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ANModConfig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ANModConfig.java @@ -1,14 +1,15 @@ package com.hollingsworth.arsnouveau.setup.config; import com.electronwill.nightconfig.core.file.CommentedFileConfig; -import java.nio.file.Path; -import java.util.function.Function; import net.neoforged.fml.ModContainer; import net.neoforged.fml.config.ConfigFileTypeHandler; import net.neoforged.fml.config.IConfigSpec; import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.loading.FMLPaths; +import java.nio.file.Path; +import java.util.function.Function; + public class ANModConfig extends ModConfig { private static final ANConfigFileTypeHandler AN_TOML = new ANConfigFileTypeHandler(); @@ -16,11 +17,10 @@ public ANModConfig(ModConfig.Type type, IConfigSpec iConfigSpec, ModContainer super(type, iConfigSpec, container, fileName + ".toml"); } - @Override - public ConfigFileTypeHandler getHandler() { - return AN_TOML; - } - +// @Override +// public ConfigFileTypeHandler getHandler() { +// return AN_TOML; +// } private static class ANConfigFileTypeHandler extends ConfigFileTypeHandler { @@ -37,9 +37,9 @@ public Function reader(Path configBasePath) { return super.reader(getPath(configBasePath)); } - @Override - public void unload(Path configBasePath, ModConfig config) { - super.unload(getPath(configBasePath), config); - } +// @Override +// public void unload(Path configBasePath, ModConfig config) { +// super.unload(getPath(configBasePath), config); +// } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java index 7c35d1da49..b6a4762dab 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java @@ -2,15 +2,14 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.mana.IManaCap; -import com.hollingsworth.arsnouveau.common.block.tile.StorageLecternTile; -import com.hollingsworth.arsnouveau.common.capability.*; +import com.hollingsworth.arsnouveau.common.capability.ANPlayerDataCap; +import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; +import com.hollingsworth.arsnouveau.common.capability.ManaCap; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketSyncPlayerCap; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -24,7 +23,6 @@ import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.wrapper.InvWrapper; -import javax.annotation.Nullable; import java.util.List; public class CapabilityRegistry { @@ -80,22 +78,22 @@ public static LazyOptional empty() { } } + public static void registerCapabilities(RegisterCapabilitiesEvent event) { + event.registerEntity(MANA_CAPABILITY, EntityType.PLAYER, (player, ctx) -> new ManaCap()); + event.registerEntity(PLAYER_DATA_CAP, EntityType.PLAYER, (player, ctx) -> new ANPlayerDataCap()); + var containers = List.of(BlockRegistry.ENCHANTING_APP_TILE, BlockRegistry.IMBUEMENT_TILE, BlockRegistry.SCRIBES_TABLE_TILE); + for(var container : containers){ + event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, container.get(), (c, side) -> new InvWrapper(c)); + } + + event.registerBlockEntity(LECTERN_CAP, BlockRegistry.CRAFTING_LECTERN_TILE.get(), (c, side) -> c.getCapability(c, side)); + } + + @SuppressWarnings("unused") @EventBusSubscriber(modid = ArsNouveau.MODID) public static class EventHandler { - @SubscribeEvent - public static void registerCapabilities(final RegisterCapabilitiesEvent event) { - event.registerEntity(MANA_CAPABILITY, EntityType.PLAYER, (player, ctx) -> new ManaCap()); - event.registerEntity(PLAYER_DATA_CAP, EntityType.PLAYER, (player, ctx) -> new ANPlayerDataCap()); - var containers = List.of(BlockRegistry.ENCHANTING_APP_TILE, BlockRegistry.IMBUEMENT_TILE, BlockRegistry.SCRIBES_TABLE_TILE); - for(var container : containers){ - event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, container.get(), (c, side) -> new InvWrapper(c)); - } - - event.registerBlockEntity(LECTERN_CAP, BlockRegistry.CRAFTING_LECTERN_TILE.get(), (c, side) -> c.getCapability(c, side)); - } - /** * Copy the player's mana when they respawn after dying or returning from the end. * diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java index d124bef74e..7455743ca2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java @@ -5,14 +5,12 @@ import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; -import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; @SuppressWarnings("Convert2MethodRef") -@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD) public class RecipeRegistry { public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(BuiltInRegistries.RECIPE_SERIALIZER, MODID); diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml index 54763fdaad..4f84395cc0 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -1,29 +1,21 @@ modLoader="javafml" #mandatory # A version range to match for said mod loader - for regular FML @Mod it will be the forge version -loaderVersion="[40,)" #mandatory (28 is current forge version) +loaderVersion="[4,)" # A URL to refer people to when problems occur with this mod issueTrackerURL="https://github.com/baileyholl/Ars-Nouveau" #optional license="GNU GENERAL PUBLIC LICENSE" -# A list of mods - how many allowed here is determined by the individual mod loader -[[mods]] #mandatory -# The modid of the mod -modId="ars_nouveau" #mandatory -# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it -version="${file.jarVersion}" #mandatory - # A display name for the mod -displayName="Ars Nouveau" #mandatory -# A file name (in the root of the mod JAR) containing a logo for display -logoFile="examplemod.png" #optional -# A text field displayed in the mod UI -credits="Vazkii, Azanor, Elucent, Gigaherz" #optional -license="GNU GENERAL PUBLIC LICENSE" -# A text field displayed in the mod UI -authors="Bailey Hollingsworth" #optional -# The description text for the mod (multi line!) (#mandatory) -description=''' -Craft spells, create powerful baubles, and summon magical creatures! -''' +[[mods]] + modId="ars_nouveau" + version="${file.jarVersion}" + displayName="Ars Nouveau" + logoFile="examplemod.png" #optional + credits="Vazkii, Azanor, Elucent, Gigaherz" #optional + license="GNU GENERAL PUBLIC LICENSE" + authors="Bailey Hollingsworth" + description=''' + Craft spells, create powerful baubles, and summon magical creatures! + ''' # A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. [[dependencies.ars_nouveau]] #optional # the modid of the dependency @@ -31,7 +23,7 @@ Craft spells, create powerful baubles, and summon magical creatures! # Does this dependency have to exist - if not, ordering below must be specified mandatory=true #mandatory # The version range of the dependency - versionRange="[47.1.0,)" #mandatory + versionRange="[21,)" #mandatory # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory ordering="NONE" # Side this dependency is applied on - BOTH, CLIENT or SERVER From c6c3dbbc15e34de1686219f1a06ca6c23a59e420 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Fri, 5 Jul 2024 13:10:18 -0500 Subject: [PATCH 028/363] fix shaders --- .../resources/assets/ars_nouveau/shaders/core/blamed_entity.vsh | 2 +- .../assets/ars_nouveau/shaders/core/rainbow_entity.vsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/ars_nouveau/shaders/core/blamed_entity.vsh b/src/main/resources/assets/ars_nouveau/shaders/core/blamed_entity.vsh index 292ef4210f..82e490c844 100644 --- a/src/main/resources/assets/ars_nouveau/shaders/core/blamed_entity.vsh +++ b/src/main/resources/assets/ars_nouveau/shaders/core/blamed_entity.vsh @@ -117,7 +117,7 @@ void main() { float time = map(sin(GameTime * 800), -1, 1, 0, 1); gl_Position = (ProjMat * ModelViewMat * vec4(Position, 1.0) ) + mapSnoise(Position + time, -0.1, 0.1); - vertexDistance = fog_distance(ModelViewMat, IViewRotMat * Position, FogShape); + vertexDistance = fog_distance(Position, FogShape); vertexColor = minecraft_mix_light(Light0_Direction, Light1_Direction, Normal, Color); lightMapColor = texelFetch(Sampler2, UV2 / 16, 0); overlayColor = texelFetch(Sampler1, UV1, 0); diff --git a/src/main/resources/assets/ars_nouveau/shaders/core/rainbow_entity.vsh b/src/main/resources/assets/ars_nouveau/shaders/core/rainbow_entity.vsh index 955095d936..d30c34c7cc 100644 --- a/src/main/resources/assets/ars_nouveau/shaders/core/rainbow_entity.vsh +++ b/src/main/resources/assets/ars_nouveau/shaders/core/rainbow_entity.vsh @@ -31,7 +31,7 @@ out vec4 normal; void main() { gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); - vertexDistance = fog_distance(ModelViewMat, IViewRotMat * Position, FogShape); + vertexDistance = fog_distance(Position, FogShape); vertexColor = minecraft_mix_light(Light0_Direction, Light1_Direction, Normal, Color); lightMapColor = texelFetch(Sampler2, UV2 / 16, 0); overlayColor = texelFetch(Sampler1, UV1, 0); From eab15e46a614d4e30979fa9865283ea084298a81 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Fri, 5 Jul 2024 22:48:27 -0500 Subject: [PATCH 029/363] world enterable --- gradle.properties | 2 +- .../103d9f3f36b01595f1aa5172191e60eff02e6924 | 32 +- .../1fdcfe145635ded7bf0d505f6787667f0b49b64e | 2 +- .../2741af456691947b147d613b4e1cc70c9e71dd32 | 4 +- .../303313689de900e45df1f7ca17c3d36f2c78ac0c | 4 +- .../366e6cedc97b567a76524805ff813b15bef0b4f4 | 4 +- .../43f70b1d0fc3650d25dddf44c6efffef1900bb18 | 54 +- .../457d401e850e914fe39c053c4aa175787ef49774 | 26 +- .../57a62c95f59bc5868cffb1d040840f0d715117bd | 4 +- .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 170 --- ... 5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e} | 2 +- .../5c9e5647706b386caccf0aef27efaa68965030b8 | 110 +- .../73a0c150702b0db33c4f7a4031c7885e3223a862 | 2 +- .../7b0970ef111b287b053eb2a386d0fca6ee5aa291 | 2 +- .../95c82c0d51fb7266bfeb5f2d122be5f9b82ff056 | 2 +- .../9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e | 1102 ++++++++--------- .../a4c3c262a85f6a179e7e29128e8b31d4da806803 | 2 +- .../a5922da861c7ee259705eec42cf3df986f0db576 | 2 +- .../abe0934abf823d33d3e88ae408c1d215f03f6bdc | 4 +- .../af617d50f86666f21b24a8919c1c50aad8faa4f8 | 28 +- .../cdae075e2d4d58384fe4d2075f6d5323fe5baa69 | 27 - .../d0c924a870929ce1baf161c329e85242236b3530 | 32 +- .../d2032e9832fa171affe4a9c0c99fb97f183ff8a6 | 2 +- .../e0d3d0b8d9c807675613821fa865a35f707cd83f | 2 + .../e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 | 352 +++--- .../e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 | 40 - .../e7c243f38c2b0774b1bff1a90ede0b19a4077240 | 31 +- .../eac00f78ae0d33a31d4f208cb05939a004e6cb91 | 120 +- .../f0f2bcace349d412215f006e6183aa56b9316c3c | 164 +-- .../f49682cfc17456297bb895b136258055d85afc0c | 17 +- .../en_us/entries/aqua_affinity.json | 11 - .../en_us/entries/bane_of_arthropods.json | 27 - .../en_us/entries/blast_protection.json | 23 - .../en_us/entries/depth_strider.json | 19 - .../en_us/entries/efficiency.json | 27 - .../en_us/entries/feather_falling.json | 23 - .../en_us/entries/fire_aspect.json | 15 - .../en_us/entries/fire_protection.json | 23 - .../worn_notebook/en_us/entries/flame.json | 11 - .../worn_notebook/en_us/entries/fortune.json | 19 - .../worn_notebook/en_us/entries/infinity.json | 11 - .../en_us/entries/knockback.json | 15 - .../worn_notebook/en_us/entries/looting.json | 19 - .../en_us/entries/mana_boost.json | 19 - .../en_us/entries/mana_regen.json | 19 - .../en_us/entries/multishot.json | 11 - .../worn_notebook/en_us/entries/piercing.json | 23 - .../worn_notebook/en_us/entries/power.json | 27 - .../en_us/entries/projectile_protection.json | 23 - .../en_us/entries/protection.json | 23 - .../worn_notebook/en_us/entries/punch.json | 15 - .../en_us/entries/quick_charge.json | 19 - .../en_us/entries/respiration.json | 19 - .../en_us/entries/sharpness.json | 27 - .../en_us/entries/silk_touch.json | 11 - .../worn_notebook/en_us/entries/smite.json | 27 - .../worn_notebook/en_us/entries/sweeping.json | 19 - .../worn_notebook/en_us/entries/thorns.json | 19 - .../en_us/entries/unbreaking.json | 19 - .../building_blocks/archwood_button.json | 11 +- .../building_blocks/archwood_door.json | 11 +- .../building_blocks/archwood_fence.json | 11 +- .../building_blocks/archwood_fence_gate.json | 11 +- .../archwood_pressure_plate.json | 11 +- .../building_blocks/archwood_slab.json | 11 +- .../gilded_sourcestone_alternating_slab.json | 11 +- ...rcestone_alternating_stone_cutterslab.json | 11 +- ...cestone_alternating_stonecutter_stair.json | 11 +- .../gilded_sourcestone_basketweave_slab.json | 11 +- ...rcestone_basketweave_stone_cutterslab.json | 11 +- ...cestone_basketweave_stonecutter_stair.json | 11 +- .../gilded_sourcestone_large_bricks_slab.json | 11 +- ...cestone_large_bricks_stone_cutterslab.json | 11 +- ...estone_large_bricks_stonecutter_stair.json | 11 +- .../gilded_sourcestone_mosaic_slab.json | 11 +- ...d_sourcestone_mosaic_stone_cutterslab.json | 11 +- ..._sourcestone_mosaic_stonecutter_stair.json | 11 +- .../gilded_sourcestone_small_bricks_slab.json | 11 +- ...cestone_small_bricks_stone_cutterslab.json | 11 +- ...estone_small_bricks_stonecutter_stair.json | 11 +- ...h_gilded_sourcestone_alternating_slab.json | 11 +- ...rcestone_alternating_stone_cutterslab.json | 11 +- ...cestone_alternating_stonecutter_stair.json | 11 +- ...h_gilded_sourcestone_basketweave_slab.json | 11 +- ...rcestone_basketweave_stone_cutterslab.json | 11 +- ...cestone_basketweave_stonecutter_stair.json | 11 +- ..._gilded_sourcestone_large_bricks_slab.json | 11 +- ...cestone_large_bricks_stone_cutterslab.json | 11 +- ...estone_large_bricks_stonecutter_stair.json | 11 +- ...smooth_gilded_sourcestone_mosaic_slab.json | 11 +- ...d_sourcestone_mosaic_stone_cutterslab.json | 11 +- ..._sourcestone_mosaic_stonecutter_stair.json | 11 +- ..._gilded_sourcestone_small_bricks_slab.json | 11 +- ...cestone_small_bricks_stone_cutterslab.json | 11 +- ...estone_small_bricks_stonecutter_stair.json | 11 +- .../smooth_sourcestone_alternating_slab.json | 11 +- ...rcestone_alternating_stone_cutterslab.json | 11 +- ...cestone_alternating_stonecutter_stair.json | 11 +- .../smooth_sourcestone_basketweave_slab.json | 11 +- ...rcestone_basketweave_stone_cutterslab.json | 11 +- ...cestone_basketweave_stonecutter_stair.json | 11 +- .../smooth_sourcestone_large_bricks_slab.json | 11 +- ...cestone_large_bricks_stone_cutterslab.json | 11 +- ...estone_large_bricks_stonecutter_stair.json | 11 +- .../smooth_sourcestone_mosaic_slab.json | 11 +- ...h_sourcestone_mosaic_stone_cutterslab.json | 11 +- ..._sourcestone_mosaic_stonecutter_stair.json | 11 +- .../smooth_sourcestone_slab.json | 11 +- .../smooth_sourcestone_small_bricks_slab.json | 11 +- ...cestone_small_bricks_stone_cutterslab.json | 11 +- ...estone_small_bricks_stonecutter_stair.json | 11 +- .../smooth_sourcestone_stone_cutterslab.json | 11 +- .../smooth_sourcestone_stonecutter_stair.json | 11 +- .../sourcestone_alternating_slab.json | 11 +- ...rcestone_alternating_stone_cutterslab.json | 11 +- ...cestone_alternating_stonecutter_stair.json | 11 +- .../sourcestone_basketweave_slab.json | 11 +- ...rcestone_basketweave_stone_cutterslab.json | 11 +- ...cestone_basketweave_stonecutter_stair.json | 11 +- .../sourcestone_large_bricks_slab.json | 11 +- ...cestone_large_bricks_stone_cutterslab.json | 11 +- ...estone_large_bricks_stonecutter_stair.json | 11 +- .../sourcestone_mosaic_slab.json | 11 +- .../sourcestone_mosaic_stone_cutterslab.json | 11 +- .../sourcestone_mosaic_stonecutter_stair.json | 11 +- .../sourcestone_small_bricks_slab.json | 11 +- ...cestone_small_bricks_stone_cutterslab.json | 11 +- ...estone_small_bricks_stonecutter_stair.json | 11 +- .../stripped_blue_archwood_wood.json | 11 +- .../stripped_green_archwood_wood.json | 11 +- .../stripped_purple_archwood_wood.json | 11 +- .../stripped_red_archwood_wood.json | 11 +- .../recipes/decorations/sourcestone_1.json | 11 +- .../recipes/decorations/sourcestone_10.json | 11 +- .../recipes/decorations/sourcestone_11.json | 11 +- .../recipes/decorations/sourcestone_12.json | 11 +- .../recipes/decorations/sourcestone_13.json | 11 +- .../recipes/decorations/sourcestone_14.json | 11 +- .../recipes/decorations/sourcestone_15.json | 11 +- .../recipes/decorations/sourcestone_16.json | 11 +- .../recipes/decorations/sourcestone_17.json | 11 +- .../recipes/decorations/sourcestone_18.json | 11 +- .../recipes/decorations/sourcestone_19.json | 11 +- .../recipes/decorations/sourcestone_2.json | 11 +- .../recipes/decorations/sourcestone_20.json | 11 +- .../recipes/decorations/sourcestone_21.json | 11 +- .../recipes/decorations/sourcestone_3.json | 11 +- .../recipes/decorations/sourcestone_4.json | 11 +- .../recipes/decorations/sourcestone_5.json | 11 +- .../recipes/decorations/sourcestone_6.json | 11 +- .../recipes/decorations/sourcestone_7.json | 11 +- .../recipes/decorations/sourcestone_8.json | 11 +- .../recipes/decorations/sourcestone_9.json | 11 +- .../recipes/misc/agronomic_sourcelink.json | 11 +- .../misc/air_essence_to_snow_bucket.json | 11 +- .../recipes/misc/alchemical_sourcelink.json | 11 +- .../recipes/misc/allow_scroll.json | 11 +- .../recipes/misc/alteration_table.json | 11 +- .../recipes/misc/annotated_codex.json | 11 +- .../recipes/misc/arcane_core.json | 11 +- .../recipes/misc/arcane_pedestal.json | 11 +- .../recipes/misc/arcane_platform.json | 11 +- .../recipes/misc/archwood_chest.json | 11 +- .../recipes/misc/archwood_planks.json | 11 +- .../recipes/misc/archwood_sconce.json | 11 +- .../recipes/misc/archwood_stairs.json | 11 +- .../recipes/misc/archwood_to_chest.json | 11 +- .../recipes/misc/archwood_trapdoor.json | 11 +- .../recipes/misc/basic_spell_turret.json | 11 +- .../recipes/misc/blank_parchment.json | 11 +- .../recipes/misc/blank_thread.json | 11 +- .../recipes/misc/blue_archwood_wood.json | 11 +- .../recipes/misc/blue_sbed.json | 11 +- .../recipes/misc/challenge_2.json | 11 +- .../recipes/misc/clear_allow.json | 11 +- .../recipes/misc/clear_deny.json | 11 +- .../conjuration_essence_to_end_stone.json | 11 +- .../conjuration_essence_to_soul_sand.json | 11 +- .../recipes/misc/deny_scroll.json | 11 +- .../recipes/misc/dowsing_rod.json | 11 +- .../recipes/misc/dull_trinket.json | 11 +- .../recipes/misc/enchanting_apparatus.json | 11 +- .../recipes/misc/experience_gem.json | 11 +- .../recipes/misc/falseweave.json | 11 +- .../recipes/misc/fire_essence_to_charge.json | 11 +- .../misc/fire_essence_to_magma_block.json | 11 +- .../recipes/misc/ghostweave.json | 11 +- ...gilded_sourcestone_alternating_stairs.json | 11 +- ...ourcestone_alternating_to_sourcestone.json | 11 +- ...gilded_sourcestone_basketweave_stairs.json | 11 +- ...ourcestone_basketweave_to_sourcestone.json | 11 +- ...ilded_sourcestone_large_bricks_stairs.json | 11 +- ...urcestone_large_bricks_to_sourcestone.json | 11 +- .../gilded_sourcestone_mosaic_stairs.json | 11 +- ...ded_sourcestone_mosaic_to_sourcestone.json | 11 +- ...ilded_sourcestone_small_bricks_stairs.json | 11 +- ...urcestone_small_bricks_to_sourcestone.json | 11 +- .../recipes/misc/greater_experience_gem.json | 11 +- .../recipes/misc/green_archwood_wood.json | 11 +- .../recipes/misc/green_sbed.json | 11 +- .../recipes/misc/horn_to_bonemeal.json | 11 +- .../recipes/misc/imbuement_chamber.json | 11 +- .../recipes/misc/item_detector.json | 11 +- .../recipes/misc/magebloom_block.json | 11 +- .../misc/magebloom_block_to_magebloom.json | 11 +- .../recipes/misc/magebloom_fiber.json | 11 +- .../recipes/misc/magebloom_to_pink.json | 11 +- .../recipes/misc/magelight_torch.json | 11 +- .../manipulation_essence_to_andesite.json | 11 +- ...anipulation_essence_to_blazin_sapling.json | 11 +- .../misc/manipulation_essence_to_calcite.json | 11 +- ...pulation_essence_to_cascading_sapling.json | 11 +- .../manipulation_essence_to_deepslate.json | 11 +- .../misc/manipulation_essence_to_diorite.json | 11 +- ...lation_essence_to_flourishing_sapling.json | 11 +- .../misc/manipulation_essence_to_granite.json | 11 +- .../manipulation_essence_to_grass_block.json | 11 +- .../manipulation_essence_to_moss_block.json | 11 +- .../manipulation_essence_to_mycelium.json | 11 +- .../misc/manipulation_essence_to_tuff.json | 11 +- ...anipulation_essence_to_vexing_sapling.json | 11 +- .../recipes/misc/mimic_scroll.json | 11 +- .../recipes/misc/mirrorweave.json | 11 +- .../recipes/misc/mob_jar.json | 11 +- .../recipes/misc/moonfall_2.json | 11 +- .../recipes/misc/mundane_belt.json | 11 +- .../recipes/misc/mycelial_sourcelink.json | 11 +- .../recipes/misc/orange_sbed.json | 11 +- .../recipes/misc/platform_to_pedestal.json | 11 +- .../recipes/misc/polished_sconce.json | 11 +- .../recipes/misc/polished_source_sconce.json | 11 +- .../recipes/misc/potion_jar.json | 11 +- .../recipes/misc/potion_jar_empty.json | 11 +- .../recipes/misc/purple_archwood_wood.json | 11 +- .../recipes/misc/purple_sbed.json | 11 +- .../recipes/misc/red_archwood_wood.json | 11 +- .../recipes/misc/red_sbed.json | 11 +- .../recipes/misc/redstone_relay.json | 11 +- .../recipes/misc/relay.json | 11 +- .../recipes/misc/repository.json | 11 +- .../recipes/misc/ring_of_potential.json | 11 +- .../recipes/misc/ritual_animal_summon.json | 11 +- .../recipes/misc/ritual_awakening.json | 11 +- .../recipes/misc/ritual_binding.json | 11 +- .../recipes/misc/ritual_brazier.json | 11 +- .../recipes/misc/ritual_burrowing.json | 11 +- .../recipes/misc/ritual_challenge.json | 11 +- .../recipes/misc/ritual_cloudshaping.json | 11 +- .../misc/ritual_conjure_island_desert.json | 11 +- .../misc/ritual_conjure_island_plains.json | 11 +- .../recipes/misc/ritual_containment.json | 11 +- .../recipes/misc/ritual_disintegration.json | 11 +- .../recipes/misc/ritual_fertility.json | 11 +- .../recipes/misc/ritual_flight.json | 11 +- .../recipes/misc/ritual_flowering.json | 11 +- .../recipes/misc/ritual_forestation.json | 11 +- .../recipes/misc/ritual_gravity.json | 11 +- .../recipes/misc/ritual_harvest.json | 11 +- .../recipes/misc/ritual_moonfall.json | 11 +- .../recipes/misc/ritual_overgrowth.json | 11 +- .../recipes/misc/ritual_restoration.json | 11 +- .../recipes/misc/ritual_sanctuary.json | 11 +- .../recipes/misc/ritual_scrying.json | 11 +- .../recipes/misc/ritual_sunrise.json | 11 +- .../recipes/misc/ritual_warping.json | 11 +- .../recipes/misc/ritual_wilden_summon.json | 11 +- .../recipes/misc/rotating_spell_turret.json | 11 +- ...rotating_turret_to_basic_spell_turret.json | 11 +- .../recipes/misc/runic_chalk.json | 11 +- .../recipes/misc/sconce.json | 11 +- .../recipes/misc/scribes_table.json | 11 +- .../recipes/misc/scry_to_blank_parchment.json | 11 +- .../recipes/misc/scryers_crystal.json | 11 +- .../recipes/misc/sky_block.json | 11 +- ...gilded_sourcestone_alternating_stairs.json | 11 +- ...ourcestone_alternating_to_sourcestone.json | 11 +- ...gilded_sourcestone_basketweave_stairs.json | 11 +- ...ourcestone_basketweave_to_sourcestone.json | 11 +- ...ilded_sourcestone_large_bricks_stairs.json | 11 +- ...urcestone_large_bricks_to_sourcestone.json | 11 +- ...ooth_gilded_sourcestone_mosaic_stairs.json | 11 +- ...ded_sourcestone_mosaic_to_sourcestone.json | 11 +- ...ilded_sourcestone_small_bricks_stairs.json | 11 +- ...urcestone_small_bricks_to_sourcestone.json | 11 +- ...smooth_sourcestone_alternating_stairs.json | 11 +- ...ourcestone_alternating_to_sourcestone.json | 11 +- ...smooth_sourcestone_basketweave_stairs.json | 11 +- ...ourcestone_basketweave_to_sourcestone.json | 11 +- ...mooth_sourcestone_large_bricks_stairs.json | 11 +- ...urcestone_large_bricks_to_sourcestone.json | 11 +- .../smooth_sourcestone_mosaic_stairs.json | 11 +- ...oth_sourcestone_mosaic_to_sourcestone.json | 11 +- ...mooth_sourcestone_small_bricks_stairs.json | 11 +- ...urcestone_small_bricks_to_sourcestone.json | 11 +- .../misc/smooth_sourcestone_stairs.json | 11 +- .../smooth_sourcestone_to_sourcestone.json | 11 +- .../recipes/misc/source_berry_pie.json | 11 +- .../recipes/misc/source_berry_roll.json | 11 +- .../recipes/misc/source_gem_block.json | 11 +- .../recipes/misc/source_gem_block_2.json | 11 +- .../recipes/misc/source_jar.json | 11 +- .../recipes/misc/sourceberry_sack.json | 11 +- .../misc/sourceberry_sack_to_bush.json | 11 +- .../recipes/misc/sourceberry_to_purple.json | 11 +- .../recipes/misc/sourcestone.json | 11 +- .../misc/sourcestone_alternating_stairs.json | 11 +- ...ourcestone_alternating_to_sourcestone.json | 11 +- .../misc/sourcestone_basketweave_stairs.json | 11 +- ...ourcestone_basketweave_to_sourcestone.json | 11 +- .../misc/sourcestone_large_bricks_stairs.json | 11 +- ...urcestone_large_bricks_to_sourcestone.json | 11 +- .../misc/sourcestone_mosaic_stairs.json | 11 +- .../sourcestone_mosaic_to_sourcestone.json | 11 +- .../recipes/misc/sourcestone_sconce.json | 11 +- .../misc/sourcestone_small_bricks_stairs.json | 11 +- ...urcestone_small_bricks_to_sourcestone.json | 11 +- .../recipes/misc/spell_prism.json | 11 +- .../recipes/misc/spike_to_arrow.json | 11 +- .../recipes/misc/spike_to_dye.json | 11 +- .../recipes/misc/starbuncle_shades.json | 11 +- .../recipes/misc/sunrise_2.json | 11 +- .../recipes/misc/vitalic_sourcelink.json | 11 +- .../recipes/misc/void_prism.json | 11 +- .../recipes/misc/volcanic_sourcelink.json | 11 +- .../recipes/misc/warp_scroll.json | 11 +- .../recipes/misc/water_essence_to_bucket.json | 11 +- .../misc/water_essence_to_obsidian.json | 11 +- .../recipes/misc/wilden_summon_alt.json | 11 +- .../recipes/misc/wing_to_leather.json | 11 +- .../recipes/misc/wipe_spell_parchment.json | 11 +- .../recipes/misc/wipe_starby_shard.json | 11 +- .../recipes/misc/wixie_hat.json | 11 +- .../recipes/misc/worn_notebook.json | 11 +- .../recipes/misc/yellow_sbed.json | 11 +- .../advancements/alteration_table.json | 38 - .../advancements/amethyst_golem_charm.json | 38 - .../advancements/apprentice_spell_book.json | 38 - .../advancements/archmage_spell_book.json | 38 - .../advancements/basic_spell_turret.json | 38 - .../advancements/catch_lightning.json | 30 - .../advancements/create_portal.json | 30 - .../advancements/drygmy_charm.json | 38 - .../advancements/eat_bombegranate.json | 36 - .../advancements/enchanting_apparatus.json | 38 - .../ars_nouveau/advancements/familiar.json | 30 - .../advancements/imbuement_chamber.json | 38 - .../advancements/magebloom_crop.json | 38 - .../ars_nouveau/advancements/mob_jar.json | 38 - .../advancements/novice_spell_book.json | 38 - .../ars_nouveau/advancements/poof_mob.json | 30 - .../advancements/potion_diffuser.json | 38 - .../advancements/potion_flask.json | 39 - .../ars_nouveau/advancements/potion_jar.json | 38 - .../advancements/potion_melder.json | 38 - .../ars_nouveau/advancements/prismatic.json | 30 - .../advancements/ritual_brazier.json | 38 - .../advancements/ritual_gravity.json | 34 - .../data/ars_nouveau/advancements/root.json | 38 - .../advancements/scryers_oculus.json | 38 - .../advancements/shapers_focus.json | 38 - .../advancements/shrunk_starbuncle.json | 30 - .../ars_nouveau/advancements/source_jar.json | 38 - .../ars_nouveau/advancements/spell_prism.json | 38 - .../advancements/starbuncle_shades.json | 38 - .../advancements/starby_charm.json | 38 - .../advancements/summon_focus.json | 38 - .../advancements/time_in_a_bottle.json | 30 - .../ars_nouveau/advancements/warp_scroll.json | 38 - .../advancements/whirlisprig_charm.json | 38 - .../advancements/wilden_explosion.json | 30 - .../advancements/wilden_tribute.json | 38 - .../ars_nouveau/advancements/wixie_charm.json | 38 - .../ars_nouveau/advancements/wixie_hat.json | 38 - .../blocks/agronomic_sourcelink.json | 21 - .../blocks/alchemical_sourcelink.json | 21 - .../loot_tables/blocks/alteration_table.json | 30 - .../loot_tables/blocks/arcane_core.json | 21 - .../loot_tables/blocks/arcane_pedestal.json | 21 - .../loot_tables/blocks/arcane_platform.json | 21 - .../loot_tables/blocks/archwood_button.json | 21 - .../loot_tables/blocks/archwood_chest.json | 21 - .../loot_tables/blocks/archwood_door.json | 30 - .../loot_tables/blocks/archwood_fence.json | 21 - .../blocks/archwood_fence_gate.json | 21 - .../loot_tables/blocks/archwood_planks.json | 21 - .../blocks/archwood_pressure_plate.json | 21 - .../loot_tables/blocks/archwood_sconce.json | 21 - .../loot_tables/blocks/archwood_slab.json | 35 - .../loot_tables/blocks/archwood_stairs.json | 21 - .../loot_tables/blocks/archwood_trapdoor.json | 21 - .../blocks/basic_spell_turret.json | 21 - .../loot_tables/blocks/bastion_pod.json | 32 - .../blocks/blue_archwood_leaves.json | 136 -- .../loot_tables/blocks/blue_archwood_log.json | 21 - .../blocks/blue_archwood_sapling.json | 21 - .../blocks/blue_archwood_wood.json | 21 - .../loot_tables/blocks/blue_sbed.json | 21 - .../loot_tables/blocks/bombegranate_pod.json | 32 - .../loot_tables/blocks/brazier_relay.json | 21 - .../loot_tables/blocks/drygmy_stone.json | 21 - .../blocks/enchanting_apparatus.json | 21 - .../loot_tables/blocks/falseweave.json | 21 - .../loot_tables/blocks/frostaya_pod.json | 32 - .../loot_tables/blocks/ghostweave.json | 21 - .../gilded_sourcestone_alternating.json | 21 - .../gilded_sourcestone_alternating_slab.json | 21 - ...gilded_sourcestone_alternating_stairs.json | 21 - .../gilded_sourcestone_basketweave.json | 21 - .../gilded_sourcestone_basketweave_slab.json | 21 - ...gilded_sourcestone_basketweave_stairs.json | 21 - .../gilded_sourcestone_large_bricks.json | 21 - .../gilded_sourcestone_large_bricks_slab.json | 21 - ...ilded_sourcestone_large_bricks_stairs.json | 21 - .../blocks/gilded_sourcestone_mosaic.json | 21 - .../gilded_sourcestone_mosaic_slab.json | 21 - .../gilded_sourcestone_mosaic_stairs.json | 21 - .../gilded_sourcestone_small_bricks.json | 21 - .../gilded_sourcestone_small_bricks_slab.json | 21 - ...ilded_sourcestone_small_bricks_stairs.json | 21 - .../blocks/green_archwood_leaves.json | 136 -- .../blocks/green_archwood_log.json | 21 - .../blocks/green_archwood_sapling.json | 21 - .../blocks/green_archwood_wood.json | 21 - .../loot_tables/blocks/green_sbed.json | 21 - .../loot_tables/blocks/imbuement_chamber.json | 21 - .../loot_tables/blocks/item_detector.json | 21 - .../loot_tables/blocks/magebloom_block.json | 21 - .../loot_tables/blocks/magelight_torch.json | 21 - .../loot_tables/blocks/mendosteen_pod.json | 32 - .../loot_tables/blocks/mirrorweave.json | 21 - .../loot_tables/blocks/mob_jar.json | 48 - .../blocks/mycelial_sourcelink.json | 21 - .../loot_tables/blocks/orange_sbed.json | 21 - .../loot_tables/blocks/polished_sconce.json | 21 - .../loot_tables/blocks/potion_diffuser.json | 21 - .../loot_tables/blocks/potion_jar.json | 63 - .../loot_tables/blocks/potion_melder.json | 21 - .../blocks/potted_blue_archwood_sapling.json | 36 - .../blocks/potted_green_archwood_sapling.json | 36 - .../blocks/potted_magebloom_crop.json | 36 - .../potted_purple_archwood_sapling.json | 36 - .../blocks/potted_red_archwood_sapling.json | 36 - .../blocks/purple_archwood_leaves.json | 136 -- .../blocks/purple_archwood_log.json | 21 - .../blocks/purple_archwood_sapling.json | 21 - .../blocks/purple_archwood_wood.json | 21 - .../loot_tables/blocks/purple_sbed.json | 21 - .../blocks/red_archwood_leaves.json | 136 -- .../loot_tables/blocks/red_archwood_log.json | 21 - .../blocks/red_archwood_sapling.json | 21 - .../loot_tables/blocks/red_archwood_wood.json | 21 - .../loot_tables/blocks/red_sbed.json | 21 - .../loot_tables/blocks/redstone_relay.json | 21 - .../ars_nouveau/loot_tables/blocks/relay.json | 21 - .../loot_tables/blocks/relay_collector.json | 21 - .../loot_tables/blocks/relay_deposit.json | 21 - .../loot_tables/blocks/relay_splitter.json | 21 - .../loot_tables/blocks/relay_warp.json | 21 - .../loot_tables/blocks/repository.json | 22 - .../loot_tables/blocks/ritual_brazier.json | 21 - .../blocks/rotating_spell_turret.json | 21 - .../loot_tables/blocks/sconce.json | 21 - .../loot_tables/blocks/scribes_table.json | 30 - .../loot_tables/blocks/scryers_crystal.json | 21 - .../loot_tables/blocks/scryers_oculus.json | 21 - .../loot_tables/blocks/sky_block.json | 21 - ...smooth_gilded_sourcestone_alternating.json | 21 - ...h_gilded_sourcestone_alternating_slab.json | 21 - ...gilded_sourcestone_alternating_stairs.json | 21 - ...smooth_gilded_sourcestone_basketweave.json | 21 - ...h_gilded_sourcestone_basketweave_slab.json | 21 - ...gilded_sourcestone_basketweave_stairs.json | 21 - ...mooth_gilded_sourcestone_large_bricks.json | 21 - ..._gilded_sourcestone_large_bricks_slab.json | 21 - ...ilded_sourcestone_large_bricks_stairs.json | 21 - .../smooth_gilded_sourcestone_mosaic.json | 21 - ...smooth_gilded_sourcestone_mosaic_slab.json | 21 - ...ooth_gilded_sourcestone_mosaic_stairs.json | 21 - ...mooth_gilded_sourcestone_small_bricks.json | 21 - ..._gilded_sourcestone_small_bricks_slab.json | 21 - ...ilded_sourcestone_small_bricks_stairs.json | 21 - .../blocks/smooth_sourcestone.json | 21 - .../smooth_sourcestone_alternating.json | 21 - .../smooth_sourcestone_alternating_slab.json | 21 - ...smooth_sourcestone_alternating_stairs.json | 21 - .../smooth_sourcestone_basketweave.json | 21 - .../smooth_sourcestone_basketweave_slab.json | 21 - ...smooth_sourcestone_basketweave_stairs.json | 21 - .../smooth_sourcestone_large_bricks.json | 21 - .../smooth_sourcestone_large_bricks_slab.json | 21 - ...mooth_sourcestone_large_bricks_stairs.json | 21 - .../blocks/smooth_sourcestone_mosaic.json | 21 - .../smooth_sourcestone_mosaic_slab.json | 21 - .../smooth_sourcestone_mosaic_stairs.json | 21 - .../blocks/smooth_sourcestone_slab.json | 21 - .../smooth_sourcestone_small_bricks.json | 21 - .../smooth_sourcestone_small_bricks_slab.json | 21 - ...mooth_sourcestone_small_bricks_stairs.json | 21 - .../blocks/smooth_sourcestone_stairs.json | 21 - .../loot_tables/blocks/source_gem_block.json | 21 - .../loot_tables/blocks/source_jar.json | 43 - .../loot_tables/blocks/sourceberry_sack.json | 21 - .../loot_tables/blocks/sourcestone.json | 21 - .../blocks/sourcestone_alternating.json | 21 - .../blocks/sourcestone_alternating_slab.json | 21 - .../sourcestone_alternating_stairs.json | 21 - .../blocks/sourcestone_basketweave.json | 21 - .../blocks/sourcestone_basketweave_slab.json | 21 - .../sourcestone_basketweave_stairs.json | 21 - .../blocks/sourcestone_large_bricks.json | 21 - .../blocks/sourcestone_large_bricks_slab.json | 21 - .../sourcestone_large_bricks_stairs.json | 21 - .../blocks/sourcestone_mosaic.json | 21 - .../blocks/sourcestone_mosaic_slab.json | 21 - .../blocks/sourcestone_mosaic_stairs.json | 21 - .../blocks/sourcestone_sconce.json | 21 - .../loot_tables/blocks/sourcestone_slab.json | 21 - .../blocks/sourcestone_small_bricks.json | 21 - .../blocks/sourcestone_small_bricks_slab.json | 21 - .../sourcestone_small_bricks_stairs.json | 21 - .../blocks/sourcestone_stairs.json | 21 - .../loot_tables/blocks/spell_prism.json | 21 - .../loot_tables/blocks/spell_sensor.json | 21 - .../loot_tables/blocks/spell_turret.json | 21 - .../loot_tables/blocks/storage_lectern.json | 21 - .../blocks/stripped_blue_archwood_log.json | 21 - .../blocks/stripped_blue_archwood_wood.json | 21 - .../blocks/stripped_green_archwood_log.json | 21 - .../blocks/stripped_green_archwood_wood.json | 21 - .../blocks/stripped_purple_archwood_log.json | 21 - .../blocks/stripped_purple_archwood_wood.json | 21 - .../blocks/stripped_red_archwood_log.json | 21 - .../blocks/stripped_red_archwood_wood.json | 21 - .../blocks/timer_spell_turret.json | 21 - .../blocks/vitalic_sourcelink.json | 21 - .../loot_tables/blocks/void_prism.json | 21 - .../blocks/volcanic_sourcelink.json | 21 - .../loot_tables/blocks/wixie_cauldron.json | 21 - .../loot_tables/blocks/yellow_sbed.json | 21 - .../loot_tables/entities/wilden_guardian.json | 31 - .../loot_tables/entities/wilden_hunter.json | 31 - .../loot_tables/entities/wilden_stalker.json | 31 - .../biome_modifier/common_source_berry.json | 2 +- .../biome_modifier/drygmy_spawn.json | 2 +- .../biome_modifier/gift_starbuncle_spawn.json | 2 +- .../biome_modifier/rare_archwood_mix.json | 2 +- .../biome_modifier/starbuncle_spawn.json | 2 +- .../biome_modifier/whirlisprig_spawn.json | 2 +- .../agronomic_sourcelink.json | 10 +- .../air_essence_to_snow_bucket.json | 3 +- .../alchemical_sourcelink.json | 10 +- .../{recipes => recipe}/allow_scroll.json | 5 +- .../{recipes => recipe}/alteration_table.json | 6 +- .../{recipes => recipe}/annotated_codex.json | 3 +- .../{recipes => recipe}/arcane_core.json | 10 +- .../{recipes => recipe}/arcane_pedestal.json | 10 +- .../{recipes => recipe}/arcane_platform.json | 3 +- .../{recipes => recipe}/archwood_button.json | 3 +- .../{recipes => recipe}/archwood_chest.json | 6 +- .../{recipes => recipe}/archwood_door.json | 5 +- .../{recipes => recipe}/archwood_fence.json | 5 +- .../archwood_fence_gate.json | 6 +- .../{recipes => recipe}/archwood_planks.json | 4 +- .../archwood_pressure_plate.json | 6 +- .../{recipes => recipe}/archwood_sconce.json | 5 +- .../{recipes => recipe}/archwood_slab.json | 5 +- .../{recipes => recipe}/archwood_stairs.json | 5 +- .../archwood_to_chest.json | 3 +- .../archwood_trapdoor.json | 5 +- .../basic_spell_turret.json | 12 +- .../{recipes => recipe}/blank_parchment.json | 6 +- .../{recipes => recipe}/blank_thread.json | 8 +- .../blue_archwood_wood.json | 5 +- .../{recipes => recipe}/blue_sbed.json | 5 +- .../{recipes => recipe}/challenge_2.json | 3 +- .../{recipes => recipe}/clear_allow.json | 3 +- .../{recipes => recipe}/clear_deny.json | 3 +- .../conjuration_essence_to_end_stone.json | 7 +- .../conjuration_essence_to_soul_sand.json | 7 +- .../{recipes => recipe}/deny_scroll.json | 5 +- .../{recipes => recipe}/dowsing_rod.json | 8 +- .../{recipes => recipe}/dull_trinket.json | 10 +- .../enchanting_apparatus.json | 12 +- .../{recipes => recipe}/experience_gem.json | 2 +- .../{recipes => recipe}/falseweave.json | 5 +- .../fire_essence_to_charge.json | 2 +- .../fire_essence_to_magma_block.json | 7 +- .../{recipes => recipe}/ghostweave.json | 5 +- .../gilded_sourcestone_alternating_slab.json | 5 +- ...gilded_sourcestone_alternating_stairs.json | 5 +- ...rcestone_alternating_stone_cutterslab.json | 6 +- ...cestone_alternating_stonecutter_stair.json | 6 +- ...ourcestone_alternating_to_sourcestone.json | 3 +- .../gilded_sourcestone_basketweave_slab.json | 5 +- ...gilded_sourcestone_basketweave_stairs.json | 5 +- ...rcestone_basketweave_stone_cutterslab.json | 6 +- ...cestone_basketweave_stonecutter_stair.json | 6 +- ...ourcestone_basketweave_to_sourcestone.json | 3 +- .../gilded_sourcestone_large_bricks_slab.json | 5 +- ...ilded_sourcestone_large_bricks_stairs.json | 5 +- ...cestone_large_bricks_stone_cutterslab.json | 6 +- ...estone_large_bricks_stonecutter_stair.json | 6 +- ...urcestone_large_bricks_to_sourcestone.json | 3 +- .../gilded_sourcestone_mosaic_slab.json | 5 +- .../gilded_sourcestone_mosaic_stairs.json | 5 +- ...d_sourcestone_mosaic_stone_cutterslab.json | 6 +- ..._sourcestone_mosaic_stonecutter_stair.json | 6 +- ...ded_sourcestone_mosaic_to_sourcestone.json | 3 +- .../gilded_sourcestone_small_bricks_slab.json | 5 +- ...ilded_sourcestone_small_bricks_stairs.json | 5 +- ...cestone_small_bricks_stone_cutterslab.json | 6 +- ...estone_small_bricks_stonecutter_stair.json | 6 +- ...urcestone_small_bricks_to_sourcestone.json | 3 +- .../greater_experience_gem.json | 3 +- .../green_archwood_wood.json | 5 +- .../{recipes => recipe}/green_sbed.json | 5 +- .../{recipes => recipe}/horn_to_bonemeal.json | 2 +- .../imbuement_chamber.json | 8 +- .../{recipes => recipe}/item_detector.json | 8 +- .../{recipes => recipe}/magebloom_block.json | 6 +- .../magebloom_block_to_magebloom.json | 2 +- .../{recipes => recipe}/magebloom_fiber.json | 2 +- .../magebloom_to_pink.json | 2 +- .../{recipes => recipe}/magelight_torch.json | 10 +- .../manipulation_essence_to_andesite.json | 5 +- ...anipulation_essence_to_blazin_sapling.json | 3 +- .../manipulation_essence_to_calcite.json | 5 +- ...pulation_essence_to_cascading_sapling.json | 3 +- .../manipulation_essence_to_deepslate.json | 5 +- .../manipulation_essence_to_diorite.json | 5 +- ...lation_essence_to_flourishing_sapling.json | 3 +- .../manipulation_essence_to_granite.json | 5 +- .../manipulation_essence_to_grass_block.json | 5 +- .../manipulation_essence_to_moss_block.json | 5 +- .../manipulation_essence_to_mycelium.json | 5 +- .../manipulation_essence_to_tuff.json | 5 +- ...anipulation_essence_to_vexing_sapling.json | 3 +- .../{recipes => recipe}/mimic_scroll.json | 3 +- .../{recipes => recipe}/mirrorweave.json | 5 +- .../{recipes => recipe}/mob_jar.json | 8 +- .../{recipes => recipe}/moonfall_2.json | 3 +- .../{recipes => recipe}/mundane_belt.json | 10 +- .../mycelial_sourcelink.json | 10 +- .../{recipes => recipe}/orange_sbed.json | 6 +- .../platform_to_pedestal.json | 3 +- .../{recipes => recipe}/polished_sconce.json | 3 +- .../polished_source_sconce.json | 3 +- .../{recipes => recipe}/potion_jar.json | 3 +- .../{recipes => recipe}/potion_jar_empty.json | 3 +- .../purple_archwood_wood.json | 5 +- .../{recipes => recipe}/purple_sbed.json | 5 +- .../red_archwood_wood.json | 5 +- .../{recipes => recipe}/red_sbed.json | 5 +- .../{recipes => recipe}/redstone_relay.json | 12 +- .../{recipes => recipe}/relay.json | 10 +- .../{recipes => recipe}/repository.json | 10 +- .../ring_of_potential.json | 10 +- .../ritual_animal_summon.json | 3 +- .../{recipes => recipe}/ritual_awakening.json | 11 +- .../{recipes => recipe}/ritual_binding.json | 9 +- .../{recipes => recipe}/ritual_brazier.json | 11 +- .../{recipes => recipe}/ritual_burrowing.json | 5 +- .../{recipes => recipe}/ritual_challenge.json | 3 +- .../ritual_cloudshaping.json | 5 +- .../ritual_conjure_island_desert.json | 3 +- .../ritual_conjure_island_plains.json | 3 +- .../ritual_containment.json | 3 +- .../ritual_disintegration.json | 3 +- .../{recipes => recipe}/ritual_fertility.json | 3 +- .../{recipes => recipe}/ritual_flight.json | 7 +- .../{recipes => recipe}/ritual_flowering.json | 3 +- .../ritual_forestation.json | 3 +- .../{recipes => recipe}/ritual_gravity.json | 3 +- .../{recipes => recipe}/ritual_harvest.json | 3 +- .../{recipes => recipe}/ritual_moonfall.json | 5 +- .../ritual_overgrowth.json | 3 +- .../ritual_restoration.json | 3 +- .../{recipes => recipe}/ritual_sanctuary.json | 3 +- .../{recipes => recipe}/ritual_scrying.json | 5 +- .../{recipes => recipe}/ritual_sunrise.json | 3 +- .../{recipes => recipe}/ritual_warping.json | 3 +- .../ritual_wilden_summon.json | 3 +- .../rotating_spell_turret.json | 3 +- ...rotating_turret_to_basic_spell_turret.json | 3 +- .../{recipes => recipe}/runic_chalk.json | 3 +- .../{recipes => recipe}/sconce.json | 9 +- .../{recipes => recipe}/scribes_table.json | 10 +- .../scry_to_blank_parchment.json | 3 +- .../{recipes => recipe}/scryers_crystal.json | 5 +- .../{recipes => recipe}/sky_block.json | 5 +- ...h_gilded_sourcestone_alternating_slab.json | 5 +- ...gilded_sourcestone_alternating_stairs.json | 5 +- ...rcestone_alternating_stone_cutterslab.json | 6 +- ...cestone_alternating_stonecutter_stair.json | 6 +- ...ourcestone_alternating_to_sourcestone.json | 3 +- ...h_gilded_sourcestone_basketweave_slab.json | 5 +- ...gilded_sourcestone_basketweave_stairs.json | 5 +- ...rcestone_basketweave_stone_cutterslab.json | 6 +- ...cestone_basketweave_stonecutter_stair.json | 6 +- ...ourcestone_basketweave_to_sourcestone.json | 3 +- ..._gilded_sourcestone_large_bricks_slab.json | 5 +- ...ilded_sourcestone_large_bricks_stairs.json | 5 +- ...cestone_large_bricks_stone_cutterslab.json | 6 +- ...estone_large_bricks_stonecutter_stair.json | 6 +- ...urcestone_large_bricks_to_sourcestone.json | 3 +- ...smooth_gilded_sourcestone_mosaic_slab.json | 5 +- ...ooth_gilded_sourcestone_mosaic_stairs.json | 5 +- ...d_sourcestone_mosaic_stone_cutterslab.json | 6 +- ..._sourcestone_mosaic_stonecutter_stair.json | 6 +- ...ded_sourcestone_mosaic_to_sourcestone.json | 3 +- ..._gilded_sourcestone_small_bricks_slab.json | 5 +- ...ilded_sourcestone_small_bricks_stairs.json | 5 +- ...cestone_small_bricks_stone_cutterslab.json | 6 +- ...estone_small_bricks_stonecutter_stair.json | 6 +- ...urcestone_small_bricks_to_sourcestone.json | 3 +- .../smooth_sourcestone_alternating_slab.json | 5 +- ...smooth_sourcestone_alternating_stairs.json | 5 +- ...rcestone_alternating_stone_cutterslab.json | 6 +- ...cestone_alternating_stonecutter_stair.json | 6 +- ...ourcestone_alternating_to_sourcestone.json | 3 +- .../smooth_sourcestone_basketweave_slab.json | 5 +- ...smooth_sourcestone_basketweave_stairs.json | 5 +- ...rcestone_basketweave_stone_cutterslab.json | 6 +- ...cestone_basketweave_stonecutter_stair.json | 6 +- ...ourcestone_basketweave_to_sourcestone.json | 3 +- .../smooth_sourcestone_large_bricks_slab.json | 5 +- ...mooth_sourcestone_large_bricks_stairs.json | 5 +- ...cestone_large_bricks_stone_cutterslab.json | 6 +- ...estone_large_bricks_stonecutter_stair.json | 6 +- ...urcestone_large_bricks_to_sourcestone.json | 3 +- .../smooth_sourcestone_mosaic_slab.json | 5 +- .../smooth_sourcestone_mosaic_stairs.json | 5 +- ...h_sourcestone_mosaic_stone_cutterslab.json | 6 +- ..._sourcestone_mosaic_stonecutter_stair.json | 6 +- ...oth_sourcestone_mosaic_to_sourcestone.json | 3 +- .../smooth_sourcestone_slab.json | 5 +- .../smooth_sourcestone_small_bricks_slab.json | 5 +- ...mooth_sourcestone_small_bricks_stairs.json | 5 +- ...cestone_small_bricks_stone_cutterslab.json | 6 +- ...estone_small_bricks_stonecutter_stair.json | 6 +- ...urcestone_small_bricks_to_sourcestone.json | 3 +- .../smooth_sourcestone_stairs.json | 5 +- .../smooth_sourcestone_stone_cutterslab.json | 6 +- .../smooth_sourcestone_stonecutter_stair.json | 6 +- .../smooth_sourcestone_to_sourcestone.json | 3 +- .../{recipes => recipe}/source_berry_pie.json | 3 +- .../source_berry_roll.json | 3 +- .../{recipes => recipe}/source_gem_block.json | 8 +- .../source_gem_block_2.json | 2 +- .../{recipes => recipe}/source_jar.json | 8 +- .../{recipes => recipe}/sourceberry_sack.json | 3 +- .../sourceberry_sack_to_bush.json | 2 +- .../sourceberry_to_purple.json | 3 +- .../{recipes => recipe}/sourcestone.json | 9 +- .../{recipes => recipe}/sourcestone_1.json | 6 +- .../{recipes => recipe}/sourcestone_10.json | 6 +- .../{recipes => recipe}/sourcestone_11.json | 6 +- .../{recipes => recipe}/sourcestone_12.json | 6 +- .../{recipes => recipe}/sourcestone_13.json | 6 +- .../{recipes => recipe}/sourcestone_14.json | 6 +- .../{recipes => recipe}/sourcestone_15.json | 6 +- .../{recipes => recipe}/sourcestone_16.json | 6 +- .../{recipes => recipe}/sourcestone_17.json | 6 +- .../{recipes => recipe}/sourcestone_18.json | 6 +- .../{recipes => recipe}/sourcestone_19.json | 6 +- .../{recipes => recipe}/sourcestone_2.json | 6 +- .../{recipes => recipe}/sourcestone_20.json | 6 +- .../{recipes => recipe}/sourcestone_21.json | 6 +- .../{recipes => recipe}/sourcestone_3.json | 6 +- .../{recipes => recipe}/sourcestone_4.json | 6 +- .../{recipes => recipe}/sourcestone_5.json | 6 +- .../{recipes => recipe}/sourcestone_6.json | 6 +- .../{recipes => recipe}/sourcestone_7.json | 6 +- .../{recipes => recipe}/sourcestone_8.json | 6 +- .../{recipes => recipe}/sourcestone_9.json | 6 +- .../sourcestone_alternating_slab.json | 5 +- .../sourcestone_alternating_stairs.json | 5 +- ...rcestone_alternating_stone_cutterslab.json | 6 +- ...cestone_alternating_stonecutter_stair.json | 6 +- ...ourcestone_alternating_to_sourcestone.json | 3 +- .../sourcestone_basketweave_slab.json | 5 +- .../sourcestone_basketweave_stairs.json | 5 +- ...rcestone_basketweave_stone_cutterslab.json | 6 +- ...cestone_basketweave_stonecutter_stair.json | 6 +- ...ourcestone_basketweave_to_sourcestone.json | 3 +- .../sourcestone_large_bricks_slab.json | 5 +- .../sourcestone_large_bricks_stairs.json | 5 +- ...cestone_large_bricks_stone_cutterslab.json | 6 +- ...estone_large_bricks_stonecutter_stair.json | 6 +- ...urcestone_large_bricks_to_sourcestone.json | 3 +- .../sourcestone_mosaic_slab.json | 5 +- .../sourcestone_mosaic_stairs.json | 5 +- .../sourcestone_mosaic_stone_cutterslab.json | 6 +- .../sourcestone_mosaic_stonecutter_stair.json | 6 +- .../sourcestone_mosaic_to_sourcestone.json | 3 +- .../sourcestone_sconce.json | 5 +- .../sourcestone_small_bricks_slab.json | 5 +- .../sourcestone_small_bricks_stairs.json | 5 +- ...cestone_small_bricks_stone_cutterslab.json | 6 +- ...estone_small_bricks_stonecutter_stair.json | 6 +- ...urcestone_small_bricks_to_sourcestone.json | 3 +- .../{recipes => recipe}/spell_prism.json | 10 +- .../{recipes => recipe}/spike_to_arrow.json | 5 +- .../{recipes => recipe}/spike_to_dye.json | 2 +- .../starbuncle_shades.json | 6 +- .../stripped_blue_archwood_wood.json | 5 +- .../stripped_green_archwood_wood.json | 5 +- .../stripped_purple_archwood_wood.json | 5 +- .../stripped_red_archwood_wood.json | 5 +- .../{recipes => recipe}/sunrise_2.json | 3 +- .../vitalic_sourcelink.json | 10 +- .../{recipes => recipe}/void_prism.json | 8 +- .../volcanic_sourcelink.json | 10 +- .../data/ars_nouveau/recipe/warp_scroll.json | 37 + .../water_essence_to_bucket.json | 3 +- .../water_essence_to_obsidian.json | 3 +- .../wilden_summon_alt.json | 3 +- .../{recipes => recipe}/wing_to_leather.json | 3 +- .../wipe_spell_parchment.json | 3 +- .../wipe_starby_shard.json | 3 +- .../{recipes => recipe}/wixie_hat.json | 8 +- .../{recipes => recipe}/worn_notebook.json | 5 +- .../{recipes => recipe}/yellow_sbed.json | 5 +- .../recipes/abjuration_essence.json | 21 + .../data/ars_nouveau/recipes/air_essence.json | 21 + .../ars_nouveau/recipes/alchemists_crown.json | 16 +- ...{imbuement_amethyst.json => amethyst.json} | 7 +- ...methyst_block.json => amethyst_block.json} | 7 +- .../ars_nouveau/recipes/amplify_arrow.json | 21 + .../recipes/amulet_of_mana_boost.json | 32 +- .../recipes/amulet_of_mana_regen.json | 32 +- .../ars_nouveau/recipes/aqua_affinity_1.json | 33 +- .../ars_nouveau/recipes/arcanist_boots.json | 16 +- .../ars_nouveau/recipes/arcanist_hood.json | 16 +- .../recipes/arcanist_leggings.json | 16 +- .../ars_nouveau/recipes/arcanist_robes.json | 16 +- .../recipes/bane_of_arthropods_1.json | 17 +- .../recipes/bane_of_arthropods_2.json | 21 +- .../recipes/bane_of_arthropods_3.json | 25 +- .../recipes/bane_of_arthropods_4.json | 29 +- .../recipes/bane_of_arthropods_5.json | 33 +- .../ars_nouveau/recipes/battlemage_boots.json | 16 +- .../ars_nouveau/recipes/battlemage_hood.json | 16 +- .../recipes/battlemage_leggings.json | 16 +- .../ars_nouveau/recipes/battlemage_robes.json | 16 +- .../recipes/belt_of_levitation.json | 24 +- .../recipes/belt_of_unstable_gifts.json | 26 +- .../recipes/blast_protection_1.json | 13 +- .../recipes/blast_protection_2.json | 21 +- .../recipes/blast_protection_3.json | 25 +- .../recipes/blast_protection_4.json | 33 +- .../data/ars_nouveau/recipes/blue_dye.json | 15 + .../ars_nouveau/recipes/brazier_relay.json | 16 +- .../data/ars_nouveau/recipes/brown_dye.json | 15 + .../budding_conversion/budding_amethyst.json | 2 - .../data/ars_nouveau/recipes/burst.json | 44 +- .../data/ars_nouveau/recipes/cobblestone.json | 15 + .../recipes/conjuration_essence.json | 21 + .../ars_nouveau/recipes/crush_blue_dye.json | 15 - .../ars_nouveau/recipes/crush_brown_dye.json | 15 - .../recipes/crush_cobblestone.json | 15 - .../crush_glowstone_block_to_dust.json | 15 - .../ars_nouveau/recipes/crush_gravel.json | 21 - .../recipes/crush_light_blue_dye.json | 15 - .../recipes/crush_light_gray_dye_azure.json | 15 - .../recipes/crush_light_gray_dye_oxeye.json | 15 - .../recipes/crush_light_gray_dye_tulip.json | 15 - .../recipes/crush_magenta_dye.json | 15 - .../recipes/crush_magenta_dye_lilac.json | 15 - .../ars_nouveau/recipes/crush_orange_dye.json | 15 - .../ars_nouveau/recipes/crush_pink_dye.json | 15 - .../recipes/crush_pink_dye_peony.json | 15 - .../recipes/crush_quartz_block_to_quartz.json | 15 - .../recipes/crush_red_dye_beetroot.json | 15 - .../recipes/crush_red_dye_poppy.json | 15 - .../recipes/crush_red_dye_rose_bush.json | 15 - .../recipes/crush_red_dye_tulip.json | 15 - .../recipes/crush_sandstone_to_sand.json | 15 - .../data/ars_nouveau/recipes/crush_stone.json | 15 - .../ars_nouveau/recipes/crush_sugar_cane.json | 15 - .../ars_nouveau/recipes/crush_terracotta.json | 15 - .../ars_nouveau/recipes/crush_white_dye.json | 15 - .../ars_nouveau/recipes/crush_yellow_dye.json | 15 - .../recipes/crush_yellow_dye_sunflower.json | 15 - .../ars_nouveau/recipes/depth_strider_1.json | 17 +- .../ars_nouveau/recipes/depth_strider_2.json | 25 +- .../ars_nouveau/recipes/depth_strider_3.json | 33 +- .../recipes/dispel_entity/blaze_powder.json | 2 - .../ars_nouveau/recipes/dominion_wand.json | 22 +- .../ars_nouveau/recipes/drygmy_charm.json | 24 +- .../recipes/dye_apprentice_spell_book.json | 14 - .../recipes/dye_arcanist_boots.json | 14 - .../recipes/dye_arcanist_hood.json | 14 - .../recipes/dye_arcanist_leggings.json | 14 - .../recipes/dye_arcanist_robes.json | 14 - .../recipes/dye_archmage_spell_book.json | 14 - .../recipes/dye_battlemage_boots.json | 14 - .../recipes/dye_battlemage_hood.json | 14 - .../recipes/dye_battlemage_leggings.json | 14 - .../recipes/dye_battlemage_robes.json | 14 - .../recipes/dye_novice_spell_book.json | 14 - .../recipes/dye_sorcerer_boots.json | 14 - .../recipes/dye_sorcerer_hood.json | 14 - .../recipes/dye_sorcerer_leggings.json | 14 - .../recipes/dye_sorcerer_robes.json | 14 - .../ars_nouveau/recipes/earth_essence.json | 21 + .../ars_nouveau/recipes/efficiency_1.json | 17 +- .../ars_nouveau/recipes/efficiency_2.json | 17 +- .../ars_nouveau/recipes/efficiency_3.json | 33 +- .../ars_nouveau/recipes/efficiency_4.json | 33 +- .../ars_nouveau/recipes/efficiency_5.json | 33 +- .../ars_nouveau/recipes/enchanters_eye.json | 24 +- .../recipes/enchanters_mirror.json | 28 +- .../recipes/enchanters_shield.json | 24 +- .../ars_nouveau/recipes/enchanters_sword.json | 26 +- .../recipes/feather_falling_1.json | 17 +- .../recipes/feather_falling_2.json | 21 +- .../recipes/feather_falling_3.json | 33 +- .../recipes/feather_falling_4.json | 33 +- .../ars_nouveau/recipes/fire_aspect_1.json | 21 +- .../ars_nouveau/recipes/fire_aspect_2.json | 25 +- .../ars_nouveau/recipes/fire_essence.json | 21 + .../recipes/fire_protection_1.json | 17 +- .../recipes/fire_protection_2.json | 21 +- .../recipes/fire_protection_3.json | 29 +- .../recipes/fire_protection_4.json | 33 +- .../recipes/fire_protection_5.json | 33 +- .../recipes/first_armor_upgrade.json | 12 + .../data/ars_nouveau/recipes/flame_1.json | 13 +- .../data/ars_nouveau/recipes/fortune_1.json | 33 +- .../data/ars_nouveau/recipes/fortune_2.json | 33 +- .../data/ars_nouveau/recipes/fortune_3.json | 33 +- .../recipes/glowstone_block_to_dust.json | 15 + .../ars_nouveau/recipes/glyph_accelerate.json | 24 +- .../ars_nouveau/recipes/glyph_amplify.json | 14 +- .../recipes/glyph_animate_block.json | 29 +- .../data/ars_nouveau/recipes/glyph_aoe.json | 14 +- .../data/ars_nouveau/recipes/glyph_blink.json | 34 +- .../ars_nouveau/recipes/glyph_bounce.json | 29 +- .../data/ars_nouveau/recipes/glyph_break.json | 14 +- .../ars_nouveau/recipes/glyph_cold_snap.json | 24 +- .../recipes/glyph_conjure_water.json | 19 +- .../data/ars_nouveau/recipes/glyph_craft.json | 14 +- .../data/ars_nouveau/recipes/glyph_crush.json | 24 +- .../data/ars_nouveau/recipes/glyph_cut.json | 24 +- .../ars_nouveau/recipes/glyph_dampen.json | 14 +- .../ars_nouveau/recipes/glyph_decelerate.json | 24 +- .../data/ars_nouveau/recipes/glyph_delay.json | 24 +- .../ars_nouveau/recipes/glyph_dispel.json | 29 +- .../recipes/glyph_duration_down.json | 19 +- .../recipes/glyph_ender_inventory.json | 19 +- .../ars_nouveau/recipes/glyph_evaporate.json | 29 +- .../ars_nouveau/recipes/glyph_exchange.json | 29 +- .../ars_nouveau/recipes/glyph_explosion.json | 34 +- .../recipes/glyph_extend_time.json | 19 +- .../ars_nouveau/recipes/glyph_extract.json | 14 +- .../data/ars_nouveau/recipes/glyph_fangs.json | 29 +- .../data/ars_nouveau/recipes/glyph_fell.json | 19 +- .../ars_nouveau/recipes/glyph_firework.json | 29 +- .../data/ars_nouveau/recipes/glyph_flare.json | 39 +- .../ars_nouveau/recipes/glyph_fortune.json | 14 +- .../ars_nouveau/recipes/glyph_freeze.json | 24 +- .../data/ars_nouveau/recipes/glyph_glide.json | 34 +- .../ars_nouveau/recipes/glyph_gravity.json | 39 +- .../data/ars_nouveau/recipes/glyph_grow.json | 54 +- .../data/ars_nouveau/recipes/glyph_gust.json | 29 +- .../data/ars_nouveau/recipes/glyph_harm.json | 29 +- .../ars_nouveau/recipes/glyph_harvest.json | 19 +- .../data/ars_nouveau/recipes/glyph_heal.json | 39 +- .../data/ars_nouveau/recipes/glyph_hex.json | 39 +- .../ars_nouveau/recipes/glyph_ignite.json | 29 +- .../ars_nouveau/recipes/glyph_infuse.json | 24 +- .../ars_nouveau/recipes/glyph_intangible.json | 39 +- .../ars_nouveau/recipes/glyph_interact.json | 29 +- .../recipes/glyph_invisibility.json | 24 +- .../ars_nouveau/recipes/glyph_launch.json | 29 +- .../data/ars_nouveau/recipes/glyph_leap.json | 29 +- .../data/ars_nouveau/recipes/glyph_light.json | 19 +- .../ars_nouveau/recipes/glyph_lightning.json | 34 +- .../ars_nouveau/recipes/glyph_linger.json | 34 +- .../data/ars_nouveau/recipes/glyph_name.json | 19 +- .../data/ars_nouveau/recipes/glyph_orbit.json | 24 +- .../recipes/glyph_phantom_block.json | 49 +- .../ars_nouveau/recipes/glyph_pickup.json | 19 +- .../ars_nouveau/recipes/glyph_pierce.json | 19 +- .../recipes/glyph_place_block.json | 19 +- .../ars_nouveau/recipes/glyph_projectile.json | 19 +- .../data/ars_nouveau/recipes/glyph_pull.json | 14 +- .../ars_nouveau/recipes/glyph_randomize.json | 19 +- .../recipes/glyph_redstone_signal.json | 29 +- .../ars_nouveau/recipes/glyph_rotate.json | 14 +- .../data/ars_nouveau/recipes/glyph_rune.json | 24 +- .../data/ars_nouveau/recipes/glyph_self.json | 19 +- .../recipes/glyph_sense_magic.json | 24 +- .../ars_nouveau/recipes/glyph_sensitive.json | 24 +- .../ars_nouveau/recipes/glyph_slowfall.json | 44 +- .../data/ars_nouveau/recipes/glyph_smelt.json | 39 +- .../data/ars_nouveau/recipes/glyph_snare.json | 34 +- .../data/ars_nouveau/recipes/glyph_split.json | 24 +- .../recipes/glyph_summon_decoy.json | 34 +- .../recipes/glyph_summon_steed.json | 29 +- .../recipes/glyph_summon_undead.json | 24 +- .../ars_nouveau/recipes/glyph_summon_vex.json | 19 +- .../recipes/glyph_summon_wolves.json | 49 +- .../data/ars_nouveau/recipes/glyph_toss.json | 19 +- .../data/ars_nouveau/recipes/glyph_touch.json | 14 +- .../ars_nouveau/recipes/glyph_underfoot.json | 19 +- .../data/ars_nouveau/recipes/glyph_wall.json | 34 +- .../ars_nouveau/recipes/glyph_wind_shear.json | 29 +- .../ars_nouveau/recipes/glyph_wither.json | 29 +- .../data/ars_nouveau/recipes/gravel.json | 23 + .../recipes/imbuement_abjuration_essence.json | 26 - .../recipes/imbuement_air_essence.json | 26 - .../recipes/imbuement_amplify_arrow.json | 26 - .../imbuement_conjuration_essence.json | 26 - .../recipes/imbuement_earth_essence.json | 26 - .../recipes/imbuement_fire_essence.json | 26 - .../ars_nouveau/recipes/imbuement_lapis.json | 10 - .../imbuement_manipulation_essence.json | 26 - .../recipes/imbuement_pierce_arrow.json | 26 - .../recipes/imbuement_split_arrow.json | 26 - .../recipes/imbuement_water_essence.json | 26 - .../data/ars_nouveau/recipes/infinity_1.json | 33 +- .../ars_nouveau/recipes/jar_of_light.json | 20 +- .../data/ars_nouveau/recipes/jump_ring.json | 16 +- .../data/ars_nouveau/recipes/knockback_1.json | 17 +- .../data/ars_nouveau/recipes/knockback_2.json | 21 +- .../data/ars_nouveau/recipes/lapis.json | 11 + .../ars_nouveau/recipes/light_blue_dye.json | 15 + .../recipes/light_gray_dye_azure.json | 15 + .../recipes/light_gray_dye_oxeye.json | 15 + .../recipes/light_gray_dye_tulip.json | 15 + .../recipes/lingering_flask_cannon.json | 16 +- .../data/ars_nouveau/recipes/looting_1.json | 33 +- .../data/ars_nouveau/recipes/looting_2.json | 33 +- .../data/ars_nouveau/recipes/looting_3.json | 33 +- .../ars_nouveau/recipes/magebloom_crop.json | 24 +- .../data/ars_nouveau/recipes/magenta_dye.json | 15 + .../recipes/magenta_dye_lilac.json | 15 + .../ars_nouveau/recipes/mana_boost_1.json | 21 +- .../ars_nouveau/recipes/mana_boost_2.json | 33 +- .../ars_nouveau/recipes/mana_boost_3.json | 33 +- .../ars_nouveau/recipes/mana_regen_1.json | 25 +- .../ars_nouveau/recipes/mana_regen_2.json | 33 +- .../ars_nouveau/recipes/mana_regen_3.json | 33 +- .../recipes/manipulation_essence.json | 21 + .../data/ars_nouveau/recipes/multishot_1.json | 33 +- .../data/ars_nouveau/recipes/orange_dye.json | 15 + .../ars_nouveau/recipes/pierce_arrow.json | 21 + .../data/ars_nouveau/recipes/piercing_1.json | 21 +- .../data/ars_nouveau/recipes/piercing_2.json | 25 +- .../data/ars_nouveau/recipes/piercing_3.json | 29 +- .../data/ars_nouveau/recipes/piercing_4.json | 33 +- .../data/ars_nouveau/recipes/pink_dye.json | 15 + .../ars_nouveau/recipes/pink_dye_peony.json | 15 + .../ars_nouveau/recipes/potion_diffuser.json | 22 +- .../ars_nouveau/recipes/potion_flask.json | 20 +- .../recipes/potion_flask_amplify.json | 16 +- .../recipes/potion_flask_extend_time.json | 16 +- .../ars_nouveau/recipes/potion_melder.json | 28 +- .../data/ars_nouveau/recipes/power_1.json | 13 +- .../data/ars_nouveau/recipes/power_2.json | 21 +- .../data/ars_nouveau/recipes/power_3.json | 33 +- .../data/ars_nouveau/recipes/power_4.json | 33 +- .../data/ars_nouveau/recipes/power_5.json | 33 +- .../recipes/projectile_protection_1.json | 21 +- .../recipes/projectile_protection_2.json | 25 +- .../recipes/projectile_protection_3.json | 29 +- .../recipes/projectile_protection_4.json | 29 +- .../recipes/projectile_protection_5.json | 33 +- .../ars_nouveau/recipes/protection_1.json | 21 +- .../ars_nouveau/recipes/protection_2.json | 29 +- .../ars_nouveau/recipes/protection_3.json | 33 +- .../ars_nouveau/recipes/protection_4.json | 33 +- .../ars_nouveau/recipes/protection_5.json | 33 +- .../data/ars_nouveau/recipes/punch_1.json | 17 +- .../data/ars_nouveau/recipes/punch_2.json | 21 +- .../recipes/quartz_block_to_quartz.json | 15 + .../ars_nouveau/recipes/quick_charge_1.json | 17 +- .../ars_nouveau/recipes/quick_charge_2.json | 21 +- .../ars_nouveau/recipes/quick_charge_3.json | 25 +- .../data/ars_nouveau/recipes/reactive.json | 14 + .../data/ars_nouveau/recipes/reactive_1.json | 21 - .../data/ars_nouveau/recipes/reactive_2.json | 33 +- .../data/ars_nouveau/recipes/reactive_3.json | 33 +- .../data/ars_nouveau/recipes/reactive_4.json | 25 +- .../ars_nouveau/recipes/red_dye_beetroot.json | 15 + .../ars_nouveau/recipes/red_dye_poppy.json | 15 + .../recipes/red_dye_rose_bush.json | 15 + .../ars_nouveau/recipes/red_dye_tulip.json | 15 + .../ars_nouveau/recipes/relay_collector.json | 24 +- .../ars_nouveau/recipes/relay_deposit.json | 16 +- .../ars_nouveau/recipes/relay_splitter.json | 32 +- .../data/ars_nouveau/recipes/relay_warp.json | 24 +- .../data/ars_nouveau/recipes/reset.json | 14 +- .../ars_nouveau/recipes/respiration_1.json | 13 +- .../ars_nouveau/recipes/respiration_2.json | 33 +- .../ars_nouveau/recipes/respiration_3.json | 33 +- .../data/ars_nouveau/recipes/rewind.json | 29 +- .../recipes/ring_of_greater_discount.json | 32 +- .../recipes/ring_of_lesser_discount.json | 32 +- .../recipes/sandstone_to_sand.json | 15 + .../recipes/scry_ritual/amethyst_blocks.json | 6 +- .../recipes/scry_ritual/amethyst_gems.json | 6 +- .../recipes/scry_ritual/coal_ores.json | 6 +- .../recipes/scry_ritual/copper_ores.json | 6 +- .../recipes/scry_ritual/diamond_ores.json | 6 +- .../recipes/scry_ritual/emerald_ores.json | 6 +- .../recipes/scry_ritual/gold_ores.json | 6 +- .../recipes/scry_ritual/iron_ores.json | 6 +- .../recipes/scry_ritual/lapis_ores.json | 6 +- .../scry_ritual/netherite_scrap_ores.json | 6 +- .../recipes/scry_ritual/quartz_ores.json | 6 +- .../recipes/scry_ritual/redstone_ores.json | 6 +- .../ars_nouveau/recipes/scryers_oculus.json | 20 +- .../recipes/second_armor_upgrade.json | 15 + .../ars_nouveau/recipes/shapers_focus.json | 20 +- .../data/ars_nouveau/recipes/sharpness_1.json | 17 +- .../data/ars_nouveau/recipes/sharpness_2.json | 21 +- .../data/ars_nouveau/recipes/sharpness_3.json | 17 +- .../data/ars_nouveau/recipes/sharpness_4.json | 21 +- .../data/ars_nouveau/recipes/sharpness_5.json | 25 +- .../ars_nouveau/recipes/silk_touch_1.json | 33 +- .../data/ars_nouveau/recipes/smite_1.json | 17 +- .../data/ars_nouveau/recipes/smite_2.json | 21 +- .../data/ars_nouveau/recipes/smite_3.json | 25 +- .../data/ars_nouveau/recipes/smite_4.json | 29 +- .../data/ars_nouveau/recipes/smite_5.json | 33 +- .../ars_nouveau/recipes/sorcerer_boots.json | 16 +- .../ars_nouveau/recipes/sorcerer_hood.json | 16 +- .../recipes/sorcerer_leggings.json | 16 +- .../ars_nouveau/recipes/sorcerer_robes.json | 16 +- .../data/ars_nouveau/recipes/spell_bow.json | 20 +- .../ars_nouveau/recipes/spell_crossbow.json | 20 +- .../ars_nouveau/recipes/spell_sensor.json | 16 +- .../ars_nouveau/recipes/spell_turret.json | 22 +- .../data/ars_nouveau/recipes/spell_write.json | 7 +- .../recipes/splash_flask_cannon.json | 32 +- .../data/ars_nouveau/recipes/split_arrow.json | 21 + .../recipes/stable_warp_scroll.json | 20 +- .../ars_nouveau/recipes/starbuncle_charm.json | 24 +- .../data/ars_nouveau/recipes/stone.json | 15 + .../ars_nouveau/recipes/storage_lectern.json | 24 +- .../data/ars_nouveau/recipes/sugar_cane.json | 15 + .../ars_nouveau/recipes/summon_focus.json | 18 +- .../recipes/summon_ritual/bats.json | 5 +- .../data/ars_nouveau/recipes/sweeping_1.json | 23 - .../data/ars_nouveau/recipes/sweeping_2.json | 38 - .../data/ars_nouveau/recipes/sweeping_3.json | 48 - .../ars_nouveau/recipes/sweeping_edge_1.json | 16 + .../ars_nouveau/recipes/sweeping_edge_2.json | 25 + .../ars_nouveau/recipes/sweeping_edge_3.json | 31 + .../data/ars_nouveau/recipes/terracotta.json | 15 + .../data/ars_nouveau/recipes/thorns_1.json | 13 +- .../data/ars_nouveau/recipes/thorns_2.json | 25 +- .../data/ars_nouveau/recipes/thorns_3.json | 33 +- .../recipes/thread_amethyst_golem.json | 22 +- .../ars_nouveau/recipes/thread_chilling.json | 16 +- .../ars_nouveau/recipes/thread_depths.json | 16 +- .../ars_nouveau/recipes/thread_drygmy.json | 16 +- .../ars_nouveau/recipes/thread_feather.json | 24 +- .../ars_nouveau/recipes/thread_gliding.json | 16 +- .../ars_nouveau/recipes/thread_heights.json | 16 +- .../ars_nouveau/recipes/thread_high_step.json | 16 +- .../recipes/thread_immolation.json | 16 +- .../ars_nouveau/recipes/thread_kindling.json | 16 +- .../recipes/thread_life_drain.json | 16 +- .../recipes/thread_magic_capacity.json | 16 +- .../ars_nouveau/recipes/thread_repairing.json | 16 +- .../recipes/thread_spellpower.json | 16 +- .../recipes/thread_starbuncle.json | 16 +- .../ars_nouveau/recipes/thread_undying.json | 16 +- .../ars_nouveau/recipes/thread_warding.json | 16 +- .../recipes/thread_whirlisprig.json | 16 +- .../ars_nouveau/recipes/thread_wixie.json | 20 +- .../recipes/timer_spell_turret.json | 16 +- .../recipes/tomes/arachne_tome.json | 25 - .../recipes/tomes/aurellia_tome.json | 29 - .../recipes/tomes/bailey_tome.json | 26 - .../ars_nouveau/recipes/tomes/chems_tome.json | 27 - .../recipes/tomes/darkfira_tome.json | 29 - .../recipes/tomes/farfalla_tome.json | 24 - .../recipes/tomes/fireball_tome.json | 26 - .../ars_nouveau/recipes/tomes/glow_tome.json | 24 - .../recipes/tomes/gootastic_tome.json | 27 - .../ars_nouveau/recipes/tomes/ivy_tome.json | 29 - .../ars_nouveau/recipes/tomes/kirin_tome.json | 23 - .../recipes/tomes/lyrellion_tome.json | 26 - .../ars_nouveau/recipes/tomes/othy_tome.json | 25 - .../recipes/tomes/poseidon_tome.json | 29 - .../recipes/tomes/renew_rune_tome.json | 24 - .../recipes/tomes/shadow_tome.json | 29 - .../recipes/tomes/silvanus_tome.json | 24 - .../recipes/tomes/spinoftw_tome.json | 28 - .../recipes/tomes/takeoff_tome.json | 24 - .../ars_nouveau/recipes/tomes/toxin_tome.json | 23 - .../ars_nouveau/recipes/tomes/uni_tome.json | 30 - .../ars_nouveau/recipes/tomes/vault_tome.json | 24 - .../recipes/tomes/warp_impact_tome.json | 23 - .../recipes/tomes/xacris_2_tome.json | 29 - .../recipes/tomes/xacris_tome.json | 27 - .../ars_nouveau/recipes/tomes/yeet_tome.json | 28 - .../ars_nouveau/recipes/unbreaking_1.json | 17 +- .../ars_nouveau/recipes/unbreaking_2.json | 25 +- .../ars_nouveau/recipes/unbreaking_3.json | 33 +- .../data/ars_nouveau/recipes/upgrade_1.json | 17 - .../data/ars_nouveau/recipes/upgrade_2.json | 22 - .../data/ars_nouveau/recipes/void_jar.json | 18 +- .../data/ars_nouveau/recipes/wand.json | 28 +- .../data/ars_nouveau/recipes/warp_scroll.json | 36 - .../ars_nouveau/recipes/warp_scroll_copy.json | 17 +- .../ars_nouveau/recipes/water_essence.json | 21 + .../recipes/whirlisprig_charm.json | 22 +- .../data/ars_nouveau/recipes/white_dye.json | 15 + .../data/ars_nouveau/recipes/wixie_charm.json | 18 +- .../data/ars_nouveau/recipes/wololo.json | 29 +- .../data/ars_nouveau/recipes/yellow_dye.json | 15 + .../recipes/yellow_dye_sunflower.json | 15 + .../tags/{blocks => block}/an_decorative.json | 0 .../tags/{blocks => block}/blazing_logs.json | 0 .../{blocks => block}/break_blacklist.json | 0 .../{blocks => block}/break_with_pickaxe.json | 0 .../{blocks => block}/cascading_logs.json | 0 .../tags/{blocks => block}/dowsing_rod.json | 0 .../{blocks => block}/flourishing_logs.json | 0 .../tags/{blocks => block}/golem/budding.json | 0 .../tags/{blocks => block}/golem/cluster.json | 0 .../{blocks => block}/gravity_blacklist.json | 2 +- .../{blocks => block}/harvest/fellable.json | 0 .../{blocks => block}/harvest/foliage.json | 0 .../tags/{blocks => block}/harvest/stems.json | 0 .../tags/{blocks => block}/ignore_tile.json | 0 .../{blocks => block}/interact_blacklist.json | 0 .../tags/{blocks => block}/magic_plants.json | 0 .../{blocks => block}/magic_saplings.json | 0 .../tags/{blocks => block}/no_break_drop.json | 0 .../occludes_spell_sensor.json | 0 .../storage/autopull_disabled.json | 0 .../tags/{blocks => block}/summon_bed.json | 0 .../{blocks => block}/summon_sleepable.json | 0 .../tags/{blocks => block}/vexing_logs.json | 0 .../whirlisprig/greatly_likes.json | 0 .../whirlisprig/kinda_likes.json | 0 .../an_hostile.json | 0 .../animal_summon_blacklist.json | 0 .../berry_blacklist.json | 0 .../disintegration_blacklist.json | 0 .../disintegration_whitelist.json | 0 .../drygmy_blacklist.json | 0 .../familiar.json | 0 .../jar_blacklist.json | 0 .../jar_release_blacklist.json | 0 .../jar_whitelist.json | 0 .../lingering_blacklist.json | 0 .../magic_find.json | 0 .../rewind_blacklist.json | 2 +- .../spell_can_hit.json | 0 .../tags/{items => item}/golem/shard.json | 0 .../interact_jar_blacklist.json | 0 .../tags/{items => item}/magic_food.json | 0 .../tags/{items => item}/magic_shards.json | 0 .../ritual_loot_blacklist.json | 0 .../ritual_trade_blacklist.json | 0 .../{items => item}/shady_wizard_fruits.json | 0 .../tags/{items => item}/summon_bed.json | 0 .../whirlisprig/denied_drop.json | 2 +- .../tags/{items => item}/wilden_drop.json | 0 .../tags/worldgen/biome/no_mob_spawn.json | 2 +- .../worldgen/biome/archwood_forest.json | 1 + .../configured_feature/blazing_tree.json | 12 +- .../configured_feature/cascading_tree.json | 12 +- .../configured_feature/flourishing_tree.json | 12 +- .../natural_blazing_tree.json | 12 +- .../natural_cascading_tree.json | 12 +- .../natural_flourishing_tree.json | 12 +- .../natural_vexing_tree.json | 12 +- .../configured_feature/vexing_tree.json | 12 +- .../tags/blocks => c/tags/block}/chests.json | 0 .../tags/block}/chests/wooden.json | 0 .../blocks => c/tags/block}/fence_gates.json | 0 .../tags/block}/fence_gates/wooden.json | 0 .../tags/blocks => c/tags/block}/fences.json | 0 .../tags/block}/fences/wooden.json | 0 .../tags/block}/relocation_not_supported.json | 0 .../tags/damage_type/is_magic.json | 0 .../tags/entity_type}/bosses.json | 0 .../tags/items => c/tags/item}/armors.json | 0 .../tags/items => c/tags/item}/chests.json | 0 .../items => c/tags/item}/chests/wooden.json | 0 .../tags/items => c/tags/item}/crops.json | 0 .../items => c/tags/item}/fence_gates.json | 0 .../tags/item}/fence_gates/wooden.json | 0 .../tags/items => c/tags/item}/fences.json | 0 .../items => c/tags/item}/fences/wooden.json | 0 .../items => c/tags/item}/fruits/berry.json | 0 .../tags/items => c/tags/item}/gems.json | 0 .../items => c/tags/item}/music_discs.json | 0 .../tags/item}/planks/archwood.json | 0 .../tags/items => c/tags/item}/seeds.json | 0 .../items => c/tags/item}/storage_blocks.json | 0 .../tags/item/tools/shield.json} | 0 .../tags/{blocks => block}/bee_growables.json | 0 .../tags/{blocks => block}/buttons.json | 0 .../tags/{blocks => block}/crops.json | 0 .../tags/{blocks => block}/doors.json | 0 .../tags/{blocks => block}/fence_gates.json | 0 .../tags/{blocks => block}/fences.json | 0 .../tags/{blocks => block}/fire.json | 0 .../tags/{blocks => block}/leaves.json | 0 .../leaves/archwood_leaves.json | 0 .../tags/{blocks => block}/logs.json | 0 .../{blocks => block}/logs_that_burn.json | 0 .../tags/{blocks => block}/mineable/axe.json | 0 .../tags/{blocks => block}/mineable/hoe.json | 0 .../{blocks => block}/mineable/pickaxe.json | 0 .../tags/{blocks => block}/planks.json | 0 .../tags/{blocks => block}/portals.json | 0 .../tags/{blocks => block}/saplings.json | 0 .../tags/{blocks => block}/slabs.json | 0 .../tags/{blocks => block}/stairs.json | 0 .../tags/{blocks => block}/trapdoors.json | 0 .../{blocks => block}/wooden_buttons.json | 0 .../tags/{blocks => block}/wooden_doors.json | 0 .../tags/{blocks => block}/wooden_fences.json | 0 .../tags/{blocks => block}/wooden_slabs.json | 0 .../tags/{blocks => block}/wooden_stairs.json | 0 .../{blocks => block}/wooden_trapdoors.json | 0 .../{items => item}/beacon_payment_items.json | 0 .../tags/{items => item}/bookshelf_books.json | 0 .../tags/{items => item}/buttons.json | 0 .../tags/item/chest_armor.json} | 0 .../minecraft/tags/{items => item}/doors.json | 0 .../tags/{items => item}/fences.json | 0 .../tags/item/foot_armor.json} | 0 .../tags/item/head_armor.json} | 0 .../tags/{items => item}/leaves.json | 0 .../tags/{items => item}/lectern_books.json | 0 .../tags/item/leg_armor.json} | 0 .../minecraft/tags/{items => item}/logs.json | 0 .../tags/{items => item}/logs_that_burn.json | 0 .../tags/{items => item}/planks.json | 0 .../tags/{items => item}/saplings.json | 0 .../minecraft/tags/{items => item}/slabs.json | 0 .../tags/{items => item}/stairs.json | 0 .../tags/{items => item}/swords.json | 0 .../tags/{items => item}/trapdoors.json | 0 .../tags/{items => item}/wooden_buttons.json | 0 .../tags/{items => item}/wooden_doors.json | 0 .../tags/{items => item}/wooden_fences.json | 0 .../wooden_pressure_plates.json | 0 .../tags/{items => item}/wooden_slabs.json | 0 .../tags/{items => item}/wooden_stairs.json | 0 .../{items => item}/wooden_trapdoors.json | 0 .../neoforge/data_maps/item/compostables.json | 49 + .../tags/block}/bushes.json | 0 .../tags/item}/gems/source.json | 0 .../tags/item}/logs/archwood.json | 0 .../tags/item}/storage_blocks/source.json | 0 .../arsnouveau/api/sound/SpellSound.java | 1 - .../arsnouveau/api/util/ManaUtil.java | 5 +- ...ncements.java => AdvancementProvider.java} | 6 +- .../arsnouveau/common/datagen/ModDatagen.java | 9 +- .../advancement/ANAdvancementBuilder.java | 32 +- .../advancement/SimpleAdvancements.java | 44 + .../arsnouveau/setup/ModSetup.java | 11 +- 1365 files changed, 5562 insertions(+), 16477 deletions(-) delete mode 100644 src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d rename src/generated/resources/.cache/{c622617f6fabf890a00b9275cd5f643584a8a2c8 => 5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e} (50%) delete mode 100644 src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 create mode 100644 src/generated/resources/.cache/e0d3d0b8d9c807675613821fa865a35f707cd83f delete mode 100644 src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/aqua_affinity.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/bane_of_arthropods.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/blast_protection.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/depth_strider.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/efficiency.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/feather_falling.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/fire_aspect.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/fire_protection.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/flame.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/fortune.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/infinity.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/knockback.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/looting.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mana_boost.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mana_regen.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/multishot.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/piercing.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/power.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/projectile_protection.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/protection.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/punch.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/quick_charge.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/respiration.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/sharpness.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/silk_touch.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/smite.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/sweeping.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/thorns.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/unbreaking.json rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/archwood_button.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/archwood_door.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/archwood_fence.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/archwood_fence_gate.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/archwood_pressure_plate.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/archwood_slab.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/gilded_sourcestone_alternating_slab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/gilded_sourcestone_alternating_stone_cutterslab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/gilded_sourcestone_alternating_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/gilded_sourcestone_basketweave_slab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/gilded_sourcestone_basketweave_stone_cutterslab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/gilded_sourcestone_basketweave_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/gilded_sourcestone_large_bricks_slab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/gilded_sourcestone_large_bricks_stone_cutterslab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/gilded_sourcestone_large_bricks_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/gilded_sourcestone_mosaic_slab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/gilded_sourcestone_mosaic_stone_cutterslab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/gilded_sourcestone_mosaic_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/gilded_sourcestone_small_bricks_slab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/gilded_sourcestone_small_bricks_stone_cutterslab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/gilded_sourcestone_small_bricks_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_gilded_sourcestone_alternating_slab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stone_cutterslab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_slab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_slab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_slab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_slab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_alternating_slab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_alternating_stone_cutterslab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_alternating_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_basketweave_slab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_basketweave_stone_cutterslab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_basketweave_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_large_bricks_slab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_large_bricks_stone_cutterslab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_large_bricks_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_mosaic_slab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_mosaic_stone_cutterslab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_mosaic_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_slab.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_small_bricks_slab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_small_bricks_stone_cutterslab.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_small_bricks_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_stone_cutterslab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/smooth_sourcestone_stonecutter_stair.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/sourcestone_alternating_slab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/sourcestone_alternating_stone_cutterslab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/sourcestone_alternating_stonecutter_stair.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/sourcestone_basketweave_slab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/sourcestone_basketweave_stone_cutterslab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/sourcestone_basketweave_stonecutter_stair.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/sourcestone_large_bricks_slab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/sourcestone_large_bricks_stone_cutterslab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/sourcestone_large_bricks_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/sourcestone_mosaic_slab.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/sourcestone_mosaic_stone_cutterslab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/sourcestone_mosaic_stonecutter_stair.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/sourcestone_small_bricks_slab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/sourcestone_small_bricks_stone_cutterslab.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/sourcestone_small_bricks_stonecutter_stair.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/stripped_blue_archwood_wood.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/stripped_green_archwood_wood.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/stripped_purple_archwood_wood.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/building_blocks/stripped_red_archwood_wood.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_1.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_10.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_11.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_12.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_13.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_14.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_15.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_16.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_17.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_18.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_19.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_2.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_20.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_21.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_3.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_4.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_5.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_6.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_7.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_8.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/decorations/sourcestone_9.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/agronomic_sourcelink.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/air_essence_to_snow_bucket.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/alchemical_sourcelink.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/allow_scroll.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/alteration_table.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/annotated_codex.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/arcane_core.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/arcane_pedestal.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/arcane_platform.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/archwood_chest.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/archwood_planks.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/archwood_sconce.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/archwood_stairs.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/archwood_to_chest.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/archwood_trapdoor.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/basic_spell_turret.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/blank_parchment.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/blank_thread.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/blue_archwood_wood.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/blue_sbed.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/challenge_2.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/clear_allow.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/clear_deny.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/conjuration_essence_to_end_stone.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/conjuration_essence_to_soul_sand.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/deny_scroll.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/dowsing_rod.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/dull_trinket.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/enchanting_apparatus.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/experience_gem.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/falseweave.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/fire_essence_to_charge.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/fire_essence_to_magma_block.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ghostweave.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/gilded_sourcestone_alternating_stairs.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/gilded_sourcestone_alternating_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/gilded_sourcestone_basketweave_stairs.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/gilded_sourcestone_basketweave_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/gilded_sourcestone_large_bricks_stairs.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/gilded_sourcestone_large_bricks_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/gilded_sourcestone_mosaic_stairs.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/gilded_sourcestone_mosaic_to_sourcestone.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/gilded_sourcestone_small_bricks_stairs.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/gilded_sourcestone_small_bricks_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/greater_experience_gem.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/green_archwood_wood.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/green_sbed.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/horn_to_bonemeal.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/imbuement_chamber.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/item_detector.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/magebloom_block.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/magebloom_block_to_magebloom.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/magebloom_fiber.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/magebloom_to_pink.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/magelight_torch.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/manipulation_essence_to_andesite.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/manipulation_essence_to_blazin_sapling.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/manipulation_essence_to_calcite.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/manipulation_essence_to_cascading_sapling.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/manipulation_essence_to_deepslate.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/manipulation_essence_to_diorite.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/manipulation_essence_to_flourishing_sapling.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/manipulation_essence_to_granite.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/manipulation_essence_to_grass_block.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/manipulation_essence_to_moss_block.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/manipulation_essence_to_mycelium.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/manipulation_essence_to_tuff.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/manipulation_essence_to_vexing_sapling.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/mimic_scroll.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/mirrorweave.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/mob_jar.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/moonfall_2.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/mundane_belt.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/mycelial_sourcelink.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/orange_sbed.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/platform_to_pedestal.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/polished_sconce.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/polished_source_sconce.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/potion_jar.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/potion_jar_empty.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/purple_archwood_wood.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/purple_sbed.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/red_archwood_wood.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/red_sbed.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/redstone_relay.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/relay.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/repository.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ring_of_potential.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_animal_summon.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_awakening.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_binding.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_brazier.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_burrowing.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_challenge.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_cloudshaping.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_conjure_island_desert.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_conjure_island_plains.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_containment.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_disintegration.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_fertility.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_flight.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_flowering.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_forestation.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_gravity.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_harvest.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_moonfall.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_overgrowth.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_restoration.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_sanctuary.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_scrying.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_sunrise.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_warping.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/ritual_wilden_summon.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/rotating_spell_turret.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/rotating_turret_to_basic_spell_turret.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/runic_chalk.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sconce.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/scribes_table.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/scry_to_blank_parchment.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/scryers_crystal.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sky_block.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_gilded_sourcestone_alternating_stairs.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_gilded_sourcestone_alternating_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_gilded_sourcestone_basketweave_stairs.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_gilded_sourcestone_basketweave_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_gilded_sourcestone_large_bricks_stairs.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_gilded_sourcestone_mosaic_stairs.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_gilded_sourcestone_mosaic_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_gilded_sourcestone_small_bricks_stairs.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_sourcestone_alternating_stairs.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_sourcestone_alternating_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_sourcestone_basketweave_stairs.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_sourcestone_basketweave_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_sourcestone_large_bricks_stairs.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_sourcestone_large_bricks_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_sourcestone_mosaic_stairs.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_sourcestone_mosaic_to_sourcestone.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_sourcestone_small_bricks_stairs.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_sourcestone_small_bricks_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_sourcestone_stairs.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/smooth_sourcestone_to_sourcestone.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/source_berry_pie.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/source_berry_roll.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/source_gem_block.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/source_gem_block_2.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/source_jar.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sourceberry_sack.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sourceberry_sack_to_bush.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sourceberry_to_purple.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sourcestone.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sourcestone_alternating_stairs.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sourcestone_alternating_to_sourcestone.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sourcestone_basketweave_stairs.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sourcestone_basketweave_to_sourcestone.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sourcestone_large_bricks_stairs.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sourcestone_large_bricks_to_sourcestone.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sourcestone_mosaic_stairs.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sourcestone_mosaic_to_sourcestone.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sourcestone_sconce.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sourcestone_small_bricks_stairs.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sourcestone_small_bricks_to_sourcestone.json (76%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/spell_prism.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/spike_to_arrow.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/spike_to_dye.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/starbuncle_shades.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/sunrise_2.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/vitalic_sourcelink.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/void_prism.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/volcanic_sourcelink.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/warp_scroll.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/water_essence_to_bucket.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/water_essence_to_obsidian.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/wilden_summon_alt.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/wing_to_leather.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/wipe_spell_parchment.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/wipe_starby_shard.json (75%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/wixie_hat.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/worn_notebook.json (74%) rename src/generated/resources/data/ars_nouveau/{advancements => advancement}/recipes/misc/yellow_sbed.json (74%) delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/alteration_table.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/amethyst_golem_charm.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/apprentice_spell_book.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/archmage_spell_book.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/basic_spell_turret.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/catch_lightning.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/create_portal.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/drygmy_charm.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/eat_bombegranate.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/enchanting_apparatus.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/familiar.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/imbuement_chamber.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/magebloom_crop.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/mob_jar.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/novice_spell_book.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/poof_mob.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/potion_diffuser.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/potion_flask.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/potion_jar.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/potion_melder.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/prismatic.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/ritual_brazier.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/ritual_gravity.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/root.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/scryers_oculus.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/shapers_focus.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/shrunk_starbuncle.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/source_jar.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/spell_prism.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/starbuncle_shades.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/starby_charm.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/summon_focus.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/time_in_a_bottle.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/warp_scroll.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/whirlisprig_charm.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/wilden_explosion.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/wilden_tribute.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/wixie_charm.json delete mode 100644 src/generated/resources/data/ars_nouveau/advancements/wixie_hat.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/agronomic_sourcelink.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/alchemical_sourcelink.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/alteration_table.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/arcane_core.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/arcane_pedestal.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/arcane_platform.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_button.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_chest.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_door.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_fence.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_fence_gate.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_planks.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_pressure_plate.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_sconce.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_trapdoor.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/basic_spell_turret.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/bastion_pod.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_archwood_leaves.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_archwood_log.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_archwood_sapling.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_archwood_wood.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_sbed.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/bombegranate_pod.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/brazier_relay.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/drygmy_stone.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/enchanting_apparatus.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/falseweave.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/frostaya_pod.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/ghostweave.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_alternating.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_alternating_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_alternating_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_basketweave.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_basketweave_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_basketweave_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_large_bricks.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_large_bricks_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_large_bricks_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_mosaic.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_mosaic_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_mosaic_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_small_bricks.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_small_bricks_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_small_bricks_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_archwood_leaves.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_archwood_log.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_archwood_sapling.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_archwood_wood.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_sbed.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/imbuement_chamber.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/item_detector.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/magebloom_block.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/magelight_torch.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/mendosteen_pod.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/mirrorweave.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/mob_jar.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/mycelial_sourcelink.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/orange_sbed.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/polished_sconce.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/potion_diffuser.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/potion_jar.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/potion_melder.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_blue_archwood_sapling.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_green_archwood_sapling.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_magebloom_crop.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_purple_archwood_sapling.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_red_archwood_sapling.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_archwood_leaves.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_archwood_log.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_archwood_sapling.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_archwood_wood.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_sbed.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_archwood_leaves.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_archwood_log.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_archwood_sapling.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_archwood_wood.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_sbed.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/redstone_relay.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay_collector.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay_deposit.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay_splitter.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay_warp.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/repository.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/ritual_brazier.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/rotating_spell_turret.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sconce.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/scribes_table.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/scryers_crystal.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/scryers_oculus.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sky_block.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_alternating.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_alternating_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_alternating_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_basketweave.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_basketweave_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_basketweave_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_large_bricks.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_large_bricks_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_large_bricks_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_mosaic.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_mosaic_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_mosaic_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_small_bricks.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_small_bricks_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_small_bricks_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_alternating.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_alternating_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_alternating_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_basketweave.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_basketweave_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_basketweave_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_large_bricks.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_large_bricks_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_large_bricks_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_mosaic.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_mosaic_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_mosaic_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_small_bricks.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_small_bricks_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_small_bricks_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/source_gem_block.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/source_jar.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourceberry_sack.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_alternating.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_alternating_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_alternating_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_basketweave.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_basketweave_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_basketweave_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_large_bricks.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_large_bricks_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_large_bricks_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_mosaic.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_mosaic_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_mosaic_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_sconce.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_small_bricks.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_small_bricks_slab.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_small_bricks_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_stairs.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/spell_prism.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/spell_sensor.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/spell_turret.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/storage_lectern.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_blue_archwood_log.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_blue_archwood_wood.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_green_archwood_log.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_green_archwood_wood.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_purple_archwood_log.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_purple_archwood_wood.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_red_archwood_log.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_red_archwood_wood.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/timer_spell_turret.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/vitalic_sourcelink.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/void_prism.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/volcanic_sourcelink.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/wixie_cauldron.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/blocks/yellow_sbed.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/entities/wilden_guardian.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/entities/wilden_hunter.json delete mode 100644 src/generated/resources/data/ars_nouveau/loot_tables/entities/wilden_stalker.json rename src/generated/resources/data/ars_nouveau/{forge => neoforge}/biome_modifier/common_source_berry.json (77%) rename src/generated/resources/data/ars_nouveau/{forge => neoforge}/biome_modifier/drygmy_spawn.json (81%) rename src/generated/resources/data/ars_nouveau/{forge => neoforge}/biome_modifier/gift_starbuncle_spawn.json (82%) rename src/generated/resources/data/ars_nouveau/{forge => neoforge}/biome_modifier/rare_archwood_mix.json (78%) rename src/generated/resources/data/ars_nouveau/{forge => neoforge}/biome_modifier/starbuncle_spawn.json (82%) rename src/generated/resources/data/ars_nouveau/{forge => neoforge}/biome_modifier/whirlisprig_spawn.json (82%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/agronomic_sourcelink.json (61%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/air_essence_to_snow_bucket.json (81%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/alchemical_sourcelink.json (61%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/allow_scroll.json (69%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/alteration_table.json (77%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/annotated_codex.json (79%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/arcane_core.json (63%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/arcane_pedestal.json (62%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/arcane_platform.json (74%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/archwood_button.json (75%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/archwood_chest.json (78%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/archwood_door.json (77%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/archwood_fence.json (79%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/archwood_fence_gate.json (78%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/archwood_planks.json (63%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/archwood_pressure_plate.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/archwood_sconce.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/archwood_slab.json (75%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/archwood_stairs.json (74%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/archwood_to_chest.json (78%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/archwood_trapdoor.json (75%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/basic_spell_turret.json (51%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/blank_parchment.json (77%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/blank_thread.json (67%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/blue_archwood_wood.json (73%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/blue_sbed.json (69%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/challenge_2.json (82%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/clear_allow.json (75%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/clear_deny.json (75%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/conjuration_essence_to_end_stone.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/conjuration_essence_to_soul_sand.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/deny_scroll.json (68%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/dowsing_rod.json (67%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/dull_trinket.json (56%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/enchanting_apparatus.json (58%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/experience_gem.json (82%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/falseweave.json (80%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/fire_essence_to_charge.json (88%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/fire_essence_to_magma_block.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ghostweave.json (80%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_alternating_slab.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_alternating_stairs.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_alternating_stone_cutterslab.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_alternating_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_alternating_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_basketweave_slab.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_basketweave_stairs.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_basketweave_stone_cutterslab.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_basketweave_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_basketweave_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_large_bricks_slab.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_large_bricks_stairs.json (70%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_large_bricks_stone_cutterslab.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_large_bricks_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_large_bricks_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_mosaic_slab.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_mosaic_stairs.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_mosaic_stone_cutterslab.json (56%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_mosaic_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_mosaic_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_small_bricks_slab.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_small_bricks_stairs.json (70%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_small_bricks_stone_cutterslab.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_small_bricks_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gilded_sourcestone_small_bricks_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/greater_experience_gem.json (84%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/green_archwood_wood.json (73%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/green_sbed.json (68%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/horn_to_bonemeal.json (83%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/imbuement_chamber.json (67%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/item_detector.json (73%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/magebloom_block.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/magebloom_block_to_magebloom.json (81%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/magebloom_fiber.json (80%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/magebloom_to_pink.json (87%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/magelight_torch.json (56%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/manipulation_essence_to_andesite.json (80%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/manipulation_essence_to_blazin_sapling.json (79%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/manipulation_essence_to_calcite.json (80%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/manipulation_essence_to_cascading_sapling.json (78%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/manipulation_essence_to_deepslate.json (80%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/manipulation_essence_to_diorite.json (81%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/manipulation_essence_to_flourishing_sapling.json (78%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/manipulation_essence_to_granite.json (81%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/manipulation_essence_to_grass_block.json (80%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/manipulation_essence_to_moss_block.json (80%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/manipulation_essence_to_mycelium.json (81%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/manipulation_essence_to_tuff.json (81%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/manipulation_essence_to_vexing_sapling.json (78%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/mimic_scroll.json (79%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/mirrorweave.json (80%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/mob_jar.json (70%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/moonfall_2.json (79%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/mundane_belt.json (57%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/mycelial_sourcelink.json (62%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/orange_sbed.json (78%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/platform_to_pedestal.json (74%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/polished_sconce.json (75%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/polished_source_sconce.json (73%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/potion_jar.json (81%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/potion_jar_empty.json (75%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/purple_archwood_wood.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/purple_sbed.json (67%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/red_archwood_wood.json (73%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/red_sbed.json (69%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/redstone_relay.json (51%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/relay.json (56%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/repository.json (56%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ring_of_potential.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_animal_summon.json (86%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_awakening.json (70%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_binding.json (65%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_brazier.json (53%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_burrowing.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_challenge.json (82%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_cloudshaping.json (68%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_conjure_island_desert.json (79%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_conjure_island_plains.json (79%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_containment.json (86%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_disintegration.json (87%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_fertility.json (88%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_flight.json (78%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_flowering.json (89%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_forestation.json (82%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_gravity.json (86%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_harvest.json (83%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_moonfall.json (74%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_overgrowth.json (88%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_restoration.json (82%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_sanctuary.json (82%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_scrying.json (79%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_sunrise.json (86%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_warping.json (80%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ritual_wilden_summon.json (86%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/rotating_spell_turret.json (73%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/rotating_turret_to_basic_spell_turret.json (74%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/runic_chalk.json (84%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sconce.json (50%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/scribes_table.json (62%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/scry_to_blank_parchment.json (74%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/scryers_crystal.json (64%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sky_block.json (80%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_alternating_slab.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_alternating_stairs.json (70%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_alternating_stone_cutterslab.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_alternating_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_alternating_to_sourcestone.json (78%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_basketweave_slab.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_basketweave_stairs.json (70%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_basketweave_to_sourcestone.json (78%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_large_bricks_slab.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_large_bricks_stairs.json (70%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json (54%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json (78%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_mosaic_slab.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_mosaic_stairs.json (70%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_mosaic_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_small_bricks_slab.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_small_bricks_stairs.json (70%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json (54%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json (78%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_alternating_slab.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_alternating_stairs.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_alternating_stone_cutterslab.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_alternating_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_alternating_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_basketweave_slab.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_basketweave_stairs.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_basketweave_stone_cutterslab.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_basketweave_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_basketweave_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_large_bricks_slab.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_large_bricks_stairs.json (70%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_large_bricks_stone_cutterslab.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_large_bricks_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_large_bricks_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_mosaic_slab.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_mosaic_stairs.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_mosaic_stone_cutterslab.json (56%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_mosaic_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_mosaic_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_slab.json (73%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_small_bricks_slab.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_small_bricks_stairs.json (70%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_small_bricks_stone_cutterslab.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_small_bricks_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_small_bricks_to_sourcestone.json (77%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_stairs.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_stone_cutterslab.json (56%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_stonecutter_stair.json (56%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smooth_sourcestone_to_sourcestone.json (76%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/source_berry_pie.json (88%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/source_berry_roll.json (83%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/source_gem_block.json (57%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/source_gem_block_2.json (83%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/source_jar.json (69%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourceberry_sack.json (91%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourceberry_sack_to_bush.json (80%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourceberry_to_purple.json (77%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone.json (60%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_1.json (56%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_10.json (56%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_11.json (52%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_12.json (54%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_13.json (52%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_14.json (52%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_15.json (52%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_16.json (52%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_17.json (52%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_18.json (51%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_19.json (51%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_2.json (54%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_20.json (50%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_21.json (50%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_3.json (54%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_4.json (54%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_5.json (54%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_6.json (52%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_7.json (54%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_8.json (52%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_9.json (52%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_alternating_slab.json (73%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_alternating_stairs.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_alternating_stone_cutterslab.json (56%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_alternating_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_alternating_to_sourcestone.json (76%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_basketweave_slab.json (73%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_basketweave_stairs.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_basketweave_stone_cutterslab.json (56%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_basketweave_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_basketweave_to_sourcestone.json (76%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_large_bricks_slab.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_large_bricks_stairs.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_large_bricks_stone_cutterslab.json (56%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_large_bricks_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_large_bricks_to_sourcestone.json (76%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_mosaic_slab.json (73%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_mosaic_stairs.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_mosaic_stone_cutterslab.json (56%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_mosaic_stonecutter_stair.json (56%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_mosaic_to_sourcestone.json (76%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_sconce.json (70%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_small_bricks_slab.json (72%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_small_bricks_stairs.json (71%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_small_bricks_stone_cutterslab.json (56%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_small_bricks_stonecutter_stair.json (55%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sourcestone_small_bricks_to_sourcestone.json (76%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/spell_prism.json (62%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/spike_to_arrow.json (83%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/spike_to_dye.json (83%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/starbuncle_shades.json (75%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/stripped_blue_archwood_wood.json (73%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/stripped_green_archwood_wood.json (73%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/stripped_purple_archwood_wood.json (73%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/stripped_red_archwood_wood.json (73%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sunrise_2.json (79%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/vitalic_sourcelink.json (63%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/void_prism.json (68%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/volcanic_sourcelink.json (62%) create mode 100644 src/generated/resources/data/ars_nouveau/recipe/warp_scroll.json rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/water_essence_to_bucket.json (80%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/water_essence_to_obsidian.json (81%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/wilden_summon_alt.json (85%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/wing_to_leather.json (77%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/wipe_spell_parchment.json (74%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/wipe_starby_shard.json (74%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/wixie_hat.json (68%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/worn_notebook.json (66%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/yellow_sbed.json (67%) create mode 100644 src/generated/resources/data/ars_nouveau/recipes/abjuration_essence.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/air_essence.json rename src/generated/resources/data/ars_nouveau/recipes/{imbuement_amethyst.json => amethyst.json} (53%) rename src/generated/resources/data/ars_nouveau/recipes/{imbuement_amethyst_block.json => amethyst_block.json} (51%) create mode 100644 src/generated/resources/data/ars_nouveau/recipes/amplify_arrow.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/blue_dye.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/brown_dye.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/cobblestone.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/conjuration_essence.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_blue_dye.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_brown_dye.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_cobblestone.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_glowstone_block_to_dust.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_gravel.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_light_blue_dye.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_light_gray_dye_azure.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_light_gray_dye_oxeye.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_light_gray_dye_tulip.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_magenta_dye.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_magenta_dye_lilac.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_orange_dye.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_pink_dye.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_pink_dye_peony.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_quartz_block_to_quartz.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_red_dye_beetroot.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_red_dye_poppy.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_red_dye_rose_bush.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_red_dye_tulip.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_sandstone_to_sand.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_stone.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_sugar_cane.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_terracotta.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_white_dye.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_yellow_dye.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/crush_yellow_dye_sunflower.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/dye_apprentice_spell_book.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/dye_arcanist_boots.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/dye_arcanist_hood.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/dye_arcanist_leggings.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/dye_arcanist_robes.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/dye_archmage_spell_book.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/dye_battlemage_boots.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/dye_battlemage_hood.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/dye_battlemage_leggings.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/dye_battlemage_robes.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/dye_novice_spell_book.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/dye_sorcerer_boots.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/dye_sorcerer_hood.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/dye_sorcerer_leggings.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/dye_sorcerer_robes.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/earth_essence.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/fire_essence.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/first_armor_upgrade.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/glowstone_block_to_dust.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/gravel.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/imbuement_abjuration_essence.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/imbuement_air_essence.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/imbuement_amplify_arrow.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/imbuement_conjuration_essence.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/imbuement_earth_essence.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/imbuement_fire_essence.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/imbuement_lapis.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/imbuement_manipulation_essence.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/imbuement_pierce_arrow.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/imbuement_split_arrow.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/imbuement_water_essence.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/lapis.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/light_blue_dye.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_azure.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_oxeye.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_tulip.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/magenta_dye.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/magenta_dye_lilac.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/manipulation_essence.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/orange_dye.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/pierce_arrow.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/pink_dye.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/pink_dye_peony.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/quartz_block_to_quartz.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/reactive.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/reactive_1.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/red_dye_beetroot.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/red_dye_poppy.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/red_dye_rose_bush.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/red_dye_tulip.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/sandstone_to_sand.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/second_armor_upgrade.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/split_arrow.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/stone.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/sugar_cane.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/sweeping_1.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/sweeping_2.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/sweeping_3.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_1.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_2.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_3.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/terracotta.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/arachne_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/aurellia_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/bailey_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/chems_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/darkfira_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/farfalla_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/fireball_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/glow_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/gootastic_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/ivy_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/kirin_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/lyrellion_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/othy_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/poseidon_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/renew_rune_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/shadow_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/silvanus_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/spinoftw_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/takeoff_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/toxin_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/uni_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/vault_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/warp_impact_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/xacris_2_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/xacris_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/tomes/yeet_tome.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/upgrade_1.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/upgrade_2.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipes/warp_scroll.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/water_essence.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/white_dye.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/yellow_dye.json create mode 100644 src/generated/resources/data/ars_nouveau/recipes/yellow_dye_sunflower.json rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/an_decorative.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/blazing_logs.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/break_blacklist.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/break_with_pickaxe.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/cascading_logs.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/dowsing_rod.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/flourishing_logs.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/golem/budding.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/golem/cluster.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/gravity_blacklist.json (66%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/harvest/fellable.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/harvest/foliage.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/harvest/stems.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/ignore_tile.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/interact_blacklist.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/magic_plants.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/magic_saplings.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/no_break_drop.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/occludes_spell_sensor.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/storage/autopull_disabled.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/summon_bed.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/summon_sleepable.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/vexing_logs.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/whirlisprig/greatly_likes.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{blocks => block}/whirlisprig/kinda_likes.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{entity_types => entity_type}/an_hostile.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{entity_types => entity_type}/animal_summon_blacklist.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{entity_types => entity_type}/berry_blacklist.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{entity_types => entity_type}/disintegration_blacklist.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{entity_types => entity_type}/disintegration_whitelist.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{entity_types => entity_type}/drygmy_blacklist.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{entity_types => entity_type}/familiar.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{entity_types => entity_type}/jar_blacklist.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{entity_types => entity_type}/jar_release_blacklist.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{entity_types => entity_type}/jar_whitelist.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{entity_types => entity_type}/lingering_blacklist.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{entity_types => entity_type}/magic_find.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{entity_types => entity_type}/rewind_blacklist.json (51%) rename src/generated/resources/data/ars_nouveau/tags/{entity_types => entity_type}/spell_can_hit.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{items => item}/golem/shard.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{items => item}/interact_jar_blacklist.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{items => item}/magic_food.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{items => item}/magic_shards.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{items => item}/ritual_loot_blacklist.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{items => item}/ritual_trade_blacklist.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{items => item}/shady_wizard_fruits.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{items => item}/summon_bed.json (100%) rename src/generated/resources/data/ars_nouveau/tags/{items => item}/whirlisprig/denied_drop.json (69%) rename src/generated/resources/data/ars_nouveau/tags/{items => item}/wilden_drop.json (100%) rename src/generated/resources/data/{forge/tags/blocks => c/tags/block}/chests.json (100%) rename src/generated/resources/data/{forge/tags/blocks => c/tags/block}/chests/wooden.json (100%) rename src/generated/resources/data/{forge/tags/blocks => c/tags/block}/fence_gates.json (100%) rename src/generated/resources/data/{forge/tags/blocks => c/tags/block}/fence_gates/wooden.json (100%) rename src/generated/resources/data/{forge/tags/blocks => c/tags/block}/fences.json (100%) rename src/generated/resources/data/{forge/tags/blocks => c/tags/block}/fences/wooden.json (100%) rename src/generated/resources/data/{forge/tags/blocks => c/tags/block}/relocation_not_supported.json (100%) rename src/generated/resources/data/{forge => c}/tags/damage_type/is_magic.json (100%) rename src/generated/resources/data/{forge/tags/entity_types => c/tags/entity_type}/bosses.json (100%) rename src/generated/resources/data/{forge/tags/items => c/tags/item}/armors.json (100%) rename src/generated/resources/data/{forge/tags/items => c/tags/item}/chests.json (100%) rename src/generated/resources/data/{forge/tags/items => c/tags/item}/chests/wooden.json (100%) rename src/generated/resources/data/{forge/tags/items => c/tags/item}/crops.json (100%) rename src/generated/resources/data/{forge/tags/items => c/tags/item}/fence_gates.json (100%) rename src/generated/resources/data/{forge/tags/items => c/tags/item}/fence_gates/wooden.json (100%) rename src/generated/resources/data/{forge/tags/items => c/tags/item}/fences.json (100%) rename src/generated/resources/data/{forge/tags/items => c/tags/item}/fences/wooden.json (100%) rename src/generated/resources/data/{forge/tags/items => c/tags/item}/fruits/berry.json (100%) rename src/generated/resources/data/{forge/tags/items => c/tags/item}/gems.json (100%) rename src/generated/resources/data/{minecraft/tags/items => c/tags/item}/music_discs.json (100%) rename src/generated/resources/data/{forge/tags/items => c/tags/item}/planks/archwood.json (100%) rename src/generated/resources/data/{forge/tags/items => c/tags/item}/seeds.json (100%) rename src/generated/resources/data/{forge/tags/items => c/tags/item}/storage_blocks.json (100%) rename src/generated/resources/data/{forge/tags/items/tools/shields.json => c/tags/item/tools/shield.json} (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/bee_growables.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/buttons.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/crops.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/doors.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/fence_gates.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/fences.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/fire.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/leaves.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/leaves/archwood_leaves.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/logs.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/logs_that_burn.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/mineable/axe.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/mineable/hoe.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/mineable/pickaxe.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/planks.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/portals.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/saplings.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/slabs.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/stairs.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/trapdoors.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/wooden_buttons.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/wooden_doors.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/wooden_fences.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/wooden_slabs.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/wooden_stairs.json (100%) rename src/generated/resources/data/minecraft/tags/{blocks => block}/wooden_trapdoors.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/beacon_payment_items.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/bookshelf_books.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/buttons.json (100%) rename src/generated/resources/data/{forge/tags/items/armors/chestplates.json => minecraft/tags/item/chest_armor.json} (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/doors.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/fences.json (100%) rename src/generated/resources/data/{forge/tags/items/armors/boots.json => minecraft/tags/item/foot_armor.json} (100%) rename src/generated/resources/data/{forge/tags/items/armors/helmets.json => minecraft/tags/item/head_armor.json} (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/leaves.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/lectern_books.json (100%) rename src/generated/resources/data/{forge/tags/items/armors/leggings.json => minecraft/tags/item/leg_armor.json} (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/logs.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/logs_that_burn.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/planks.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/saplings.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/slabs.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/stairs.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/swords.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/trapdoors.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/wooden_buttons.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/wooden_doors.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/wooden_fences.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/wooden_pressure_plates.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/wooden_slabs.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/wooden_stairs.json (100%) rename src/generated/resources/data/minecraft/tags/{items => item}/wooden_trapdoors.json (100%) create mode 100644 src/generated/resources/data/neoforge/data_maps/item/compostables.json rename src/generated/resources/data/{forge/tags/blocks => neoforge/tags/block}/bushes.json (100%) rename src/generated/resources/data/{forge/tags/items => neoforge/tags/item}/gems/source.json (100%) rename src/generated/resources/data/{forge/tags/items => neoforge/tags/item}/logs/archwood.json (100%) rename src/generated/resources/data/{forge/tags/items => neoforge/tags/item}/storage_blocks/source.json (100%) rename src/main/java/com/hollingsworth/arsnouveau/common/datagen/{ANAdvancements.java => AdvancementProvider.java} (61%) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/SimpleAdvancements.java diff --git a/gradle.properties b/gradle.properties index 2c6258496e..c47bb767cd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! -jei_version=19.0.0.9 +jei_version=19.1.1.19 curios_version=8.0.0-beta geckolib_version=4.5.5 patchouli_version=85-NEOFORGE diff --git a/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 index 735403e639..f39112575f 100644 --- a/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 +++ b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 @@ -1,22 +1,22 @@ -// 1.20.1 2023-07-04T22:32:46.6221803 Registries -5b27d9bd2e748a676fc3a543b79267fade5c1b29 data/ars_nouveau/forge/biome_modifier/common_source_berry.json -0fc7a4c066d04bef0b19c2d737f12e30a5e5574b data/ars_nouveau/forge/biome_modifier/drygmy_spawn.json -fef80938625d68521ba773ff48cadf1a29763141 data/ars_nouveau/forge/biome_modifier/gift_starbuncle_spawn.json -35db7a4314649cf0d68e633d16a64b5d481bb6a3 data/ars_nouveau/forge/biome_modifier/rare_archwood_mix.json -ca5e0993c8dfb8dedb1932c675bd371ea3cab4fb data/ars_nouveau/forge/biome_modifier/starbuncle_spawn.json -c889e5aaa64045afdd9723fecd4369c7b6f15c6b data/ars_nouveau/forge/biome_modifier/whirlisprig_spawn.json -9dcce4ab379d23b107656eaf0db9550872b9f09a data/ars_nouveau/worldgen/biome/archwood_forest.json -b38560f4724ad8e759e4e261adea7cf73815ecac data/ars_nouveau/worldgen/configured_feature/blazing_tree.json -2a2b6b90778d726112ee05a230b67d1bcd11be4d data/ars_nouveau/worldgen/configured_feature/cascading_tree.json -c39fe894a0c38706288607d9d64cd9171f64b8fd data/ars_nouveau/worldgen/configured_feature/flourishing_tree.json +// 1.21 2024-07-05T22:41:47.5401094 Registries +32a6b3988ea60702ed982c1c98ce98d780914ee6 data/ars_nouveau/neoforge/biome_modifier/common_source_berry.json +48f1ed52be8710f33085755655620cd53a9a6705 data/ars_nouveau/neoforge/biome_modifier/drygmy_spawn.json +e91a5b67459e7010b9d1a4352ce270b6d1c14d24 data/ars_nouveau/neoforge/biome_modifier/gift_starbuncle_spawn.json +87eb27c6d0baff653b0d954f8dcd774b3226006d data/ars_nouveau/neoforge/biome_modifier/rare_archwood_mix.json +58b5e0b1fce0f61d0d897e12070469b7e2273853 data/ars_nouveau/neoforge/biome_modifier/starbuncle_spawn.json +a1446fb90ad8cd51a55e9faa10d0da6dc6bc3d35 data/ars_nouveau/neoforge/biome_modifier/whirlisprig_spawn.json +9c2b9e582185c70673bbe62c4fa760e204e3154b data/ars_nouveau/worldgen/biome/archwood_forest.json +11dae67f4834780fdc8afa11b6add259df6f6fe1 data/ars_nouveau/worldgen/configured_feature/blazing_tree.json +2be9afcb9cb6e17391a8d24861adb4a0a6314ae2 data/ars_nouveau/worldgen/configured_feature/cascading_tree.json +d9029270f2740e4e84e75949c131a504613d5359 data/ars_nouveau/worldgen/configured_feature/flourishing_tree.json d30c7c27da29b890c1d8bd285dbda9202c5c6b84 data/ars_nouveau/worldgen/configured_feature/lights.json a21b4c0ed68c5ea8e6b5d0497efbc44c827d6406 data/ars_nouveau/worldgen/configured_feature/mixed_archwoods.json -53f11a5504c0481baa1262e33c89a3d8818baafd data/ars_nouveau/worldgen/configured_feature/natural_blazing_tree.json -43451bdd825a48c6f4c4b44b33aac518230c7bb7 data/ars_nouveau/worldgen/configured_feature/natural_cascading_tree.json -4497529359c04381447aaa73d48b72b71667a430 data/ars_nouveau/worldgen/configured_feature/natural_flourishing_tree.json -206a9229a1357637e8f4f84da33d6b0839723fed data/ars_nouveau/worldgen/configured_feature/natural_vexing_tree.json +f54a8bffecd9d41f35fac1c92f8a1e02ec01e54d data/ars_nouveau/worldgen/configured_feature/natural_blazing_tree.json +3ac1582c7155a72d82ab2e546d8050367dcd5504 data/ars_nouveau/worldgen/configured_feature/natural_cascading_tree.json +e7dd83973ec66d9a0dc19f4323df9d4352d83e98 data/ars_nouveau/worldgen/configured_feature/natural_flourishing_tree.json +b0e09044a79801d3dde689dd8ad800d16dd04e4f data/ars_nouveau/worldgen/configured_feature/natural_vexing_tree.json eaa9fc028d32f25881bd9cda25c96359531a763c data/ars_nouveau/worldgen/configured_feature/patch_berry.json -09075fe29292dd2330cea92a33f07736ac5e9f48 data/ars_nouveau/worldgen/configured_feature/vexing_tree.json +40335ff334180caf10b53c0d3cab77d0776c6ad5 data/ars_nouveau/worldgen/configured_feature/vexing_tree.json bf008aeef567f9361d4f6403ffadb7a675f1d506 data/ars_nouveau/worldgen/placed_feature/mojang_flowers.json e0001a60d7b93a7a3a1aa534f7a1d42406e0bacc data/ars_nouveau/worldgen/placed_feature/mojang_grass.json a9ecb313d4444666b74e42f640d22ff0746d4b11 data/ars_nouveau/worldgen/placed_feature/placed_berry_bush.json diff --git a/src/generated/resources/.cache/1fdcfe145635ded7bf0d505f6787667f0b49b64e b/src/generated/resources/.cache/1fdcfe145635ded7bf0d505f6787667f0b49b64e index 47042565cf..f502209b5a 100644 --- a/src/generated/resources/.cache/1fdcfe145635ded7bf0d505f6787667f0b49b64e +++ b/src/generated/resources/.cache/1fdcfe145635ded7bf0d505f6787667f0b49b64e @@ -1,4 +1,4 @@ -// 1.20.1 2023-10-26T12:19:29.0107601 Ars Nouveau's Damage Type Data +// 1.21 2024-07-05T22:41:47.5326053 Ars Nouveau's Damage Type Data 4b4b2ff422d23e4cb6282f664d89dad7ac8ff8e6 data/ars_nouveau/damage_type/crush.json fe8c85729655f971ee94229cbb7d68bbb513d08b data/ars_nouveau/damage_type/flare.json 3aa319bb73ba25bbeae84aace10603b4900b6100 data/ars_nouveau/damage_type/frost.json diff --git a/src/generated/resources/.cache/2741af456691947b147d613b4e1cc70c9e71dd32 b/src/generated/resources/.cache/2741af456691947b147d613b4e1cc70c9e71dd32 index 60f1b5cfab..038739ebe1 100644 --- a/src/generated/resources/.cache/2741af456691947b147d613b4e1cc70c9e71dd32 +++ b/src/generated/resources/.cache/2741af456691947b147d613b4e1cc70c9e71dd32 @@ -1,5 +1,5 @@ -// 1.20.1 2023-10-26T12:16:43.4980133 Tags for minecraft:damage_type mod id ars_nouveau -8641b05da5b216be05123e3ed96b606930b31f26 data/forge/tags/damage_type/is_magic.json +// 1.21 2024-07-05T22:41:47.5316058 Tags for minecraft:damage_type mod id ars_nouveau +8641b05da5b216be05123e3ed96b606930b31f26 data/c/tags/damage_type/is_magic.json 8641b05da5b216be05123e3ed96b606930b31f26 data/minecraft/tags/damage_type/always_hurts_ender_dragons.json c07768ed08384f5d693ed8bed719a825a531b78e data/minecraft/tags/damage_type/bypasses_armor.json 4eb8deadc24e4e017387ef06cfa6543373cea902 data/minecraft/tags/damage_type/is_fall.json diff --git a/src/generated/resources/.cache/303313689de900e45df1f7ca17c3d36f2c78ac0c b/src/generated/resources/.cache/303313689de900e45df1f7ca17c3d36f2c78ac0c index c42dd01353..0ce305e7b0 100644 --- a/src/generated/resources/.cache/303313689de900e45df1f7ca17c3d36f2c78ac0c +++ b/src/generated/resources/.cache/303313689de900e45df1f7ca17c3d36f2c78ac0c @@ -1,7 +1,7 @@ -// 1.20.1 2023-10-08T20:36:02.303844 Tags for minecraft:worldgen/biome mod id ars_nouveau +// 1.21 2024-07-05T22:41:47.5306079 Tags for minecraft:worldgen/biome mod id ars_nouveau 92c4e65802ffcb7533e9259f0b0356510154d662 data/ars_nouveau/tags/worldgen/biome/archwood_biome.json 60daaef808d1b0ed031d9007b5ad3007d1fdb695 data/ars_nouveau/tags/worldgen/biome/berry_spawn.json -dd6a4096577ce192ee015c7a197377dd46613544 data/ars_nouveau/tags/worldgen/biome/no_mob_spawn.json +e65d864a8148e6a6c372dcc989f9c68e0ae6110c data/ars_nouveau/tags/worldgen/biome/no_mob_spawn.json b020f6cdcd2d955793278b2f89a178a1d31e599a data/ars_nouveau/tags/worldgen/biome/summon_spawn.json c35a28e912b4aa05b77d622c24298f022d3bcb17 data/minecraft/tags/worldgen/biome/has_structure/village_plains.json c35a28e912b4aa05b77d622c24298f022d3bcb17 data/minecraft/tags/worldgen/biome/is_forest.json diff --git a/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 b/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 index bf819474e6..ae85aecbe9 100644 --- a/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 +++ b/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 @@ -1,2 +1,2 @@ -// 1.20.1 2024-06-15T19:12:02.443064236 Dispel Entity Datagen -24dafc01b9e4bc49d500116e4ef4707fc0083247 data/ars_nouveau/recipes/dispel_entity/blaze_powder.json +// 1.21 2024-07-05T22:41:47.5651639 Dispel Entity Datagen +2b2866dbb0114991a01e7a8e47a99deeeb46c536 data/ars_nouveau/recipes/dispel_entity/blaze_powder.json diff --git a/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 b/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 index f15ef0e2d8..6d24b71b0a 100644 --- a/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 +++ b/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 @@ -1,27 +1,27 @@ -// 1.20.1 2024-04-27T13:00:27.3118577 Crush -89f6c5048e41f3226ef9bdda74f014fb860b464a data/ars_nouveau/recipes/crush_blue_dye.json -d44de9a1af0d9b28eb63f2376ec9d7e9b08eaec3 data/ars_nouveau/recipes/crush_brown_dye.json -9c59b21719e0446a5660c0002da247acdc0e5517 data/ars_nouveau/recipes/crush_cobblestone.json -e86ed58be6f713d3f8b5aa179b2930ee000f1a92 data/ars_nouveau/recipes/crush_glowstone_block_to_dust.json -b08c2a6794259f444d5e418550c19c8f55675db4 data/ars_nouveau/recipes/crush_gravel.json -9cbcf2d638d6574a5b6bf58f9339e91bab5d9c10 data/ars_nouveau/recipes/crush_light_blue_dye.json -b9abeab71d6e16b2213eb0c61e226bb2816e6ac2 data/ars_nouveau/recipes/crush_light_gray_dye_azure.json -4540298de153311b98de7f5a9f510caa933c9ba0 data/ars_nouveau/recipes/crush_light_gray_dye_oxeye.json -2e574d03f3a8af93763537df7fa34d2de95dc4ed data/ars_nouveau/recipes/crush_light_gray_dye_tulip.json -2c1f5735dfe0235b70ae07163529d6c0eec9ee26 data/ars_nouveau/recipes/crush_magenta_dye.json -c4e5d9ad478e966fa70dc501613405ba189d148d data/ars_nouveau/recipes/crush_magenta_dye_lilac.json -62d33c0d201a74823944d04bee3dda4f20630c60 data/ars_nouveau/recipes/crush_orange_dye.json -c7dbb291235d4f0fef993287bd8b98ca9fcac83a data/ars_nouveau/recipes/crush_pink_dye.json -57e0bff67a07848cdddf65db4de52e4ff283dd59 data/ars_nouveau/recipes/crush_pink_dye_peony.json -b840b47ecfdc091fc6af420b5f3d7bae80fa7ca2 data/ars_nouveau/recipes/crush_quartz_block_to_quartz.json -0547a66b09a223abc2f9a5000c7dcca28818a313 data/ars_nouveau/recipes/crush_red_dye_beetroot.json -90273e6666854a6899e140b40a763f1d5d9cb3c5 data/ars_nouveau/recipes/crush_red_dye_poppy.json -8ed1509d1004cea57a5d4f3f99600cda9c41502b data/ars_nouveau/recipes/crush_red_dye_rose_bush.json -bd29ab50480b706afd1ce73d48947e2f68733624 data/ars_nouveau/recipes/crush_red_dye_tulip.json -080cb94575c215589b1e79ee2e5e9ea70cf431be data/ars_nouveau/recipes/crush_sandstone_to_sand.json -76862874ee9bbe22b88f3433c34dcd45702d4218 data/ars_nouveau/recipes/crush_stone.json -db8f6504bdd05ba00b49eda65b3d3370aab0a0bf data/ars_nouveau/recipes/crush_sugar_cane.json -905fe9f5228c747b9a3bc5af4073c6fa0161ca95 data/ars_nouveau/recipes/crush_terracotta.json -7a63269fb10b766297f971b5505a4c03f5e377c6 data/ars_nouveau/recipes/crush_white_dye.json -febe08366a2ea8e4e6d29a8b14f945667261a143 data/ars_nouveau/recipes/crush_yellow_dye.json -7dfcca185b0307a1b81058148bc7caec7dc99e76 data/ars_nouveau/recipes/crush_yellow_dye_sunflower.json +// 1.21 2024-07-05T22:41:47.5641633 Crush +fe168ce4aeb994be41509cf040d4934c0da0729c data/ars_nouveau/recipes/blue_dye.json +484ecb6d278aedfcc0fb112d90973631171cc78d data/ars_nouveau/recipes/brown_dye.json +6a91f645a9a8acd469ee3ae9be3b5a58f4440ea9 data/ars_nouveau/recipes/cobblestone.json +b57fd21f55173dbfbbdaccce01dc75aee89dcc1b data/ars_nouveau/recipes/glowstone_block_to_dust.json +b66add34a9522eb33302383bc0e4b24a5ab8d956 data/ars_nouveau/recipes/gravel.json +85d82d266ab47916861ba5a154bfa2c4052a49ea data/ars_nouveau/recipes/light_blue_dye.json +70aaf3d10df25f414d66ff8aab7fc959d2a34d25 data/ars_nouveau/recipes/light_gray_dye_azure.json +ed30d14e551881ecd8259b04c20e5b188607b0ab data/ars_nouveau/recipes/light_gray_dye_oxeye.json +beaef70f77bfdabe6182314dba6076e5ded40931 data/ars_nouveau/recipes/light_gray_dye_tulip.json +f263c70ce3f048f852195e687a4a56f622930583 data/ars_nouveau/recipes/magenta_dye.json +30057c3ad58e30919dbc7aeaf48f909e12f5c22e data/ars_nouveau/recipes/magenta_dye_lilac.json +c949a74b9e2eb9ed2cd8baebc46b09478dbe524f data/ars_nouveau/recipes/orange_dye.json +0966d33727af8e0759307a91e291ddc54bda129f data/ars_nouveau/recipes/pink_dye.json +3d43b26b78b728e472208d08befaa7793d436b6c data/ars_nouveau/recipes/pink_dye_peony.json +1bfea1bad5c8279b9a7e4eeec4dfd9a0860f0d56 data/ars_nouveau/recipes/quartz_block_to_quartz.json +2fb2e37a483f9a44c61e1211223d307e15d6755c data/ars_nouveau/recipes/red_dye_beetroot.json +21615074b45085577dd4baf935e1cab2457871a7 data/ars_nouveau/recipes/red_dye_poppy.json +359263c4bf5840bfffcc0868a4682667aaf031f1 data/ars_nouveau/recipes/red_dye_rose_bush.json +877cb67cb7077dadeed4fd1e5cb1ee7146f240da data/ars_nouveau/recipes/red_dye_tulip.json +a71613c06c515d519c73a2fa4c6a13846fcc2809 data/ars_nouveau/recipes/sandstone_to_sand.json +ed909eaa1111d45bcf3b93c2af927c162fd94a8a data/ars_nouveau/recipes/stone.json +3a1839fec755ba01156720a96a0b689a7e185aae data/ars_nouveau/recipes/sugar_cane.json +1c434ab9cb4e8cd46e2a89a17e9a9f6aef4bba6a data/ars_nouveau/recipes/terracotta.json +c80a31b9729d5d5406024f9c25d948b14947aaac data/ars_nouveau/recipes/white_dye.json +c9350c3ec8456a40b8190697bf22b83e32011648 data/ars_nouveau/recipes/yellow_dye.json +947543c9865c485a164cd4ccc7ad70c037a5c335 data/ars_nouveau/recipes/yellow_dye_sunflower.json diff --git a/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 b/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 index d38895df15..327d399818 100644 --- a/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 +++ b/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 @@ -1,13 +1,13 @@ -// 1.20.1 2024-06-15T19:25:53.535665436 Scry Ritual Datagen -e72254d66d10ea16125165e2a42f90bcdedf1da7 data/ars_nouveau/recipes/scry_ritual/amethyst_blocks.json -8a268cddaa06f14a9678d681bb1ef601c3d28761 data/ars_nouveau/recipes/scry_ritual/amethyst_gems.json -45dfbbb83a3c4b0ca88af91b0e33601472173ada data/ars_nouveau/recipes/scry_ritual/coal_ores.json -9f3cfc89b39d566cbee1de2693fee071fb590e89 data/ars_nouveau/recipes/scry_ritual/copper_ores.json -72033ec1323c34e45f9711c147618ffa750afc90 data/ars_nouveau/recipes/scry_ritual/diamond_ores.json -fa2a80cfab89d1d4ad8e486e52e3f4107ebd7b5e data/ars_nouveau/recipes/scry_ritual/emerald_ores.json -e6712729551a0c1c8f348ca46b076403025f5e22 data/ars_nouveau/recipes/scry_ritual/gold_ores.json -376fb23d4b286cb48d204e7d7f8e87ae0efc89c1 data/ars_nouveau/recipes/scry_ritual/iron_ores.json -913389129694ce7838da880df05a79adf525cf0d data/ars_nouveau/recipes/scry_ritual/lapis_ores.json -4f7ab2c68434ec6510ab0674206185916896cd99 data/ars_nouveau/recipes/scry_ritual/netherite_scrap_ores.json -1dff6e7c4d61c8402e9e88218a21badb6d563de4 data/ars_nouveau/recipes/scry_ritual/quartz_ores.json -2c964b711a2dc97cd2f609ead820455eea379bf8 data/ars_nouveau/recipes/scry_ritual/redstone_ores.json +// 1.21 2024-07-05T22:41:47.5631625 Scry Ritual Datagen +695e6271a4560287aac86ae20873ccf9f7e42929 data/ars_nouveau/recipes/scry_ritual/amethyst_blocks.json +43c47bef5ee1e37a66c36501bfbd81aa093119a0 data/ars_nouveau/recipes/scry_ritual/amethyst_gems.json +498a70fc13f765f5b231c5636569be2bd4b5fa88 data/ars_nouveau/recipes/scry_ritual/coal_ores.json +5c3ca7c082ce229ecbf6b7d7aa2d1b0ac1dfc0e0 data/ars_nouveau/recipes/scry_ritual/copper_ores.json +f4da61f7f1a6a3de589754068a6cc921738c04b1 data/ars_nouveau/recipes/scry_ritual/diamond_ores.json +8203d577c10448ce828b64f4e0d4ee516777aec2 data/ars_nouveau/recipes/scry_ritual/emerald_ores.json +cdb2c98b7fa1f74a4738191595138fd1bcf2f14e data/ars_nouveau/recipes/scry_ritual/gold_ores.json +f602a7106d08a693e2f8a9f389f802426737fd0a data/ars_nouveau/recipes/scry_ritual/iron_ores.json +d3ef057f3a0b80f59da3aedf0f66075d93df4c1c data/ars_nouveau/recipes/scry_ritual/lapis_ores.json +d531c324568ca9469d7e833d5e4550982437f0ec data/ars_nouveau/recipes/scry_ritual/netherite_scrap_ores.json +831457a367560779bd257f382a063d1614edbf95 data/ars_nouveau/recipes/scry_ritual/quartz_ores.json +32a4a18d1567a78e396430fc5ecc83ea9ff42645 data/ars_nouveau/recipes/scry_ritual/redstone_ores.json diff --git a/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd b/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd index 6f7e33df18..b5e30a8fb1 100644 --- a/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd +++ b/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd @@ -1,2 +1,2 @@ -// 1.20.1 2024-05-28T15:46:45.221194793 Summon Ritual Datagen -d95446d6778935fe5edc52ae61939063a685c3d5 data/ars_nouveau/recipes/summon_ritual/bats.json +// 1.21 2024-07-05T22:41:47.5546454 Summon Ritual Datagen +bbb35bb1987fe1d0410f4cc51a3b08c5baaf4058 data/ars_nouveau/recipes/summon_ritual/bats.json diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d deleted file mode 100644 index 381c5bda2b..0000000000 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ /dev/null @@ -1,170 +0,0 @@ -// 1.20.1 2024-01-14T21:26:50.3571269 Loot Tables -4f70eae621815da8d08d3ea0b9fd479b48bad2d3 data/ars_nouveau/loot_tables/blocks/agronomic_sourcelink.json -8a6d60f2b39de0408c7e4537b53e866a04236d22 data/ars_nouveau/loot_tables/blocks/alchemical_sourcelink.json -8bdff8a0a49a9f3f21a822eb1d1d01a950d6ad1a data/ars_nouveau/loot_tables/blocks/alteration_table.json -3f9ddb75996549cf381b4b1b6d1739eb83bf437b data/ars_nouveau/loot_tables/blocks/arcane_core.json -ef48dae9fc4eb8f60977f6fe355fc57cf198db7a data/ars_nouveau/loot_tables/blocks/arcane_pedestal.json -53bf378ab2897ecd519af63fd2b0ed1cd2e8677b data/ars_nouveau/loot_tables/blocks/arcane_platform.json -45051ced83838c9d65d2b8f504b8a0f67a84b05e data/ars_nouveau/loot_tables/blocks/archwood_button.json -bd02fbb12b7c0c175bd6d0e1b187d2863417639a data/ars_nouveau/loot_tables/blocks/archwood_chest.json -e8985e027de224f13721125c4b09d65713f97dc5 data/ars_nouveau/loot_tables/blocks/archwood_door.json -26b9292b4a83dd617d39b696cec4135427498a63 data/ars_nouveau/loot_tables/blocks/archwood_fence.json -9f049cc2f08417b7eca511cf243c4f0fd02defc4 data/ars_nouveau/loot_tables/blocks/archwood_fence_gate.json -f9e27d9666e987dd258f4f7eae3e26e76af37a8b data/ars_nouveau/loot_tables/blocks/archwood_planks.json -e81dd438da4fefc94c36ba7ca66cdc96eb894fbf data/ars_nouveau/loot_tables/blocks/archwood_pressure_plate.json -34474b1ab19734300b3340f1fc93b35a3f236130 data/ars_nouveau/loot_tables/blocks/archwood_sconce.json -9b6046d339e837e294f50722c066fd2b9ba4ca1c data/ars_nouveau/loot_tables/blocks/archwood_slab.json -c175159946f8e1a1d9777625b1a565012f9ea1ac data/ars_nouveau/loot_tables/blocks/archwood_stairs.json -241b4a83e94824d1d28d5203a3873d25b731f016 data/ars_nouveau/loot_tables/blocks/archwood_trapdoor.json -953dc98596bb992c024d3a5bc5007d49600a5dea data/ars_nouveau/loot_tables/blocks/basic_spell_turret.json -e9dbdaf07f7ec302897ddad436c794103b1059b2 data/ars_nouveau/loot_tables/blocks/bastion_pod.json -263d7a52e8c7268d2b5fed066b0b02f5ef33defe data/ars_nouveau/loot_tables/blocks/blue_archwood_leaves.json -d177c2573688d773f18a7ebf34d00530a22f6ac1 data/ars_nouveau/loot_tables/blocks/blue_archwood_log.json -ecc018a81786cc6a6e28d361245f41ac11dbe254 data/ars_nouveau/loot_tables/blocks/blue_archwood_sapling.json -3d912ff5f4cb0dc9bd1253b96a1f4ffcdc06a2b3 data/ars_nouveau/loot_tables/blocks/blue_archwood_wood.json -d74fd91465aa6474895a69ce39c3c63e96cd61af data/ars_nouveau/loot_tables/blocks/blue_sbed.json -fe4e42346e3f3b02b067ec99d988953be10780f3 data/ars_nouveau/loot_tables/blocks/bombegranate_pod.json -25879b59f556935200d2f9d63e9fe18c0f8b6375 data/ars_nouveau/loot_tables/blocks/brazier_relay.json -cf0a6f8a23b9a04aac70bae40c63d8e57b1006a6 data/ars_nouveau/loot_tables/blocks/drygmy_stone.json -50fb5a022df6f6d156c90ee3121ccfe82943beb7 data/ars_nouveau/loot_tables/blocks/enchanting_apparatus.json -7a2afda0f26e560c401265332ba8466e324c2b90 data/ars_nouveau/loot_tables/blocks/falseweave.json -e23b39b257d50c062129f1abb33f277a758ad2a1 data/ars_nouveau/loot_tables/blocks/frostaya_pod.json -57a757c165d2b0bcb480c1e948766fb714a75dc0 data/ars_nouveau/loot_tables/blocks/ghostweave.json -7d0528215f008b8e98d38e590cf5ad40ba2644a1 data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_alternating.json -ba6dd685d930c77f684b0b805799f7305296678d data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_alternating_slab.json -ac5adad7cfa5a64b21aeb0399b50a885b4937968 data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_alternating_stairs.json -381408b99442f1ad4bf66a6a10a68d2cbd789dc8 data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_basketweave.json -e546d725ad3f43b5dd18057f212d38f9ed853361 data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_basketweave_slab.json -6926d66cd344c39c06c86bd21ec9c45a853461e5 data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_basketweave_stairs.json -6ced512f67c47e4a5162a0257d81f73dcae370da data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_large_bricks.json -8d1891aa81a67e9ee849c6daa7c037c12c8f0839 data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_large_bricks_slab.json -8a51072a80ce8ea0696bdf22636e99de4c3d7f9d data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_large_bricks_stairs.json -1749337e2a7d8d623578b78cb1184a10b8dface9 data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_mosaic.json -3e7d5686638e742fd74278e94157748119122956 data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_mosaic_slab.json -c6e7419ee0480ecead75d1564f0c7f1927629975 data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_mosaic_stairs.json -8cb421ba47c458534a0b87439be3c7813e0c6b2d data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_small_bricks.json -73c7f7561087045f511845e5d6674889f17c4ad5 data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_small_bricks_slab.json -e36caa0a35b00d749d0ab30d86401b33c3ad6736 data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_small_bricks_stairs.json -1c33193d0793042bd6ffceaf922edb21b4a5fb31 data/ars_nouveau/loot_tables/blocks/green_archwood_leaves.json -8e02847416b3fbd2f7ee102ec6091b797890f027 data/ars_nouveau/loot_tables/blocks/green_archwood_log.json -624aac56531fafa0fb0b66931e54ffade954dcf0 data/ars_nouveau/loot_tables/blocks/green_archwood_sapling.json -a28c937d10a3fe9217162d764863964ce6d63c58 data/ars_nouveau/loot_tables/blocks/green_archwood_wood.json -9881f7ab8a9fe67b52bc163b58fb2e9f1bb805b4 data/ars_nouveau/loot_tables/blocks/green_sbed.json -e220cb0773c9e33776b5909041613d3291d06548 data/ars_nouveau/loot_tables/blocks/imbuement_chamber.json -df5ba05995044413998b7cbbf02d6c7a63e7c583 data/ars_nouveau/loot_tables/blocks/item_detector.json -2af90b26f5f047e3168626ce05aad7a64f42d2ec data/ars_nouveau/loot_tables/blocks/magebloom_block.json -072841a4552421b48e60a01206d4b1f42dd90da5 data/ars_nouveau/loot_tables/blocks/magelight_torch.json -9d551107c336c6341450da44650d007e795ae962 data/ars_nouveau/loot_tables/blocks/mendosteen_pod.json -019635e76547e287688dc710b66e2f96d86ba011 data/ars_nouveau/loot_tables/blocks/mirrorweave.json -d7bc6b201b00d874e5e63bf3b14d13a3251d119a data/ars_nouveau/loot_tables/blocks/mob_jar.json -06f0d996eea4783dd302764820d1d0e87178cc04 data/ars_nouveau/loot_tables/blocks/mycelial_sourcelink.json -6bf8bd330d83e260cd4fcf8311560fd37399f016 data/ars_nouveau/loot_tables/blocks/orange_sbed.json -b6f8c60f021cc50669d4a4f75056334922fdd5b1 data/ars_nouveau/loot_tables/blocks/polished_sconce.json -a3b768d587399b35b7b094b7bce9f70e9033ef44 data/ars_nouveau/loot_tables/blocks/potion_diffuser.json -e26b00ec2aea17f0aa0016b415f37ca9ba597008 data/ars_nouveau/loot_tables/blocks/potion_jar.json -8653cbc9f5368a9767156cf5842781623f1c76ed data/ars_nouveau/loot_tables/blocks/potion_melder.json -2983589b24f1fa835eae3c40877e0728eb9a5981 data/ars_nouveau/loot_tables/blocks/potted_blue_archwood_sapling.json -040c5c292dd024010db00c1433781b44351f52a4 data/ars_nouveau/loot_tables/blocks/potted_green_archwood_sapling.json -20ddfca015d14d3a7f7b550c2b262f4862d1f75b data/ars_nouveau/loot_tables/blocks/potted_magebloom_crop.json -dc18f35d7a8d6bf84c82e2206d5b0c069e964c1e data/ars_nouveau/loot_tables/blocks/potted_purple_archwood_sapling.json -4e76f2d01cff38f0866d8cf088e258f428f35e4b data/ars_nouveau/loot_tables/blocks/potted_red_archwood_sapling.json -a314c5753355b0ff9594247c99f8e3505f9ae74b data/ars_nouveau/loot_tables/blocks/purple_archwood_leaves.json -cf7efdbd5b6e77bcbf10453354b14d0b96aadcda data/ars_nouveau/loot_tables/blocks/purple_archwood_log.json -cf9cf5fccb3de2f32cee7d00ad660f69407602d5 data/ars_nouveau/loot_tables/blocks/purple_archwood_sapling.json -fc728de445a4bc800c00a685110321f5e13dcc85 data/ars_nouveau/loot_tables/blocks/purple_archwood_wood.json -ac8b57829cc7829446d261fa71c2574c72cd1c2d data/ars_nouveau/loot_tables/blocks/purple_sbed.json -c233e9e672096d9d25210eda5b7b3bae135c7060 data/ars_nouveau/loot_tables/blocks/redstone_relay.json -6d0b6bff18358ccc973afd082490546d7cb0d52a data/ars_nouveau/loot_tables/blocks/red_archwood_leaves.json -2b1e55d818128d6e1575c5b9e947910ba1011148 data/ars_nouveau/loot_tables/blocks/red_archwood_log.json -167dacda5b033bc2ea2f4f17b4b30d88187ef06b data/ars_nouveau/loot_tables/blocks/red_archwood_sapling.json -8c4a3c881d255931c3304a5e310fa999686ddced data/ars_nouveau/loot_tables/blocks/red_archwood_wood.json -d2eb2e725a6fe9ddf74eb22f4c4a2bb4e3717964 data/ars_nouveau/loot_tables/blocks/red_sbed.json -99675e30bd8f76cbb080d31bc8a6047f2280bd54 data/ars_nouveau/loot_tables/blocks/relay.json -9520d386bc5119acad6a177455b7ea5223fdb117 data/ars_nouveau/loot_tables/blocks/relay_collector.json -f9cfd7f203d4fc26033d055fa936508c4e369ffa data/ars_nouveau/loot_tables/blocks/relay_deposit.json -084d2d8f43154b85960282eb4c515348c80b1203 data/ars_nouveau/loot_tables/blocks/relay_splitter.json -dd4282bd6f44a455aa442afd4d97fcf1ed9b2eaf data/ars_nouveau/loot_tables/blocks/relay_warp.json -cac944832ef77dadfa9217f950fa995e762a5422 data/ars_nouveau/loot_tables/blocks/repository.json -f93f19e982d57699feaaed5c19ed8fbc0dec4796 data/ars_nouveau/loot_tables/blocks/ritual_brazier.json -8cb7ec62461732b94f263088750ea75273380bf4 data/ars_nouveau/loot_tables/blocks/rotating_spell_turret.json -1e582aa987ca89e885741b61fa9229ebcdebce9d data/ars_nouveau/loot_tables/blocks/sconce.json -26728e4a536530c8e335a606fca91f3ee99cb168 data/ars_nouveau/loot_tables/blocks/scribes_table.json -984435831881b13c2c1bdecf041e8dd1ccb40bac data/ars_nouveau/loot_tables/blocks/scryers_crystal.json -bc8435066f7b47edb7197fe0d207c44c0094f1c4 data/ars_nouveau/loot_tables/blocks/scryers_oculus.json -faa169858abb5eb9e9d62d6f41954d98242ae42f data/ars_nouveau/loot_tables/blocks/sky_block.json -674a56d476c613ddc975af252aa511d67c768130 data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_alternating.json -b048c81d1487ba7dd40189442ce11a5c6937317b data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_alternating_slab.json -7aadcd3e56430fdfb7889374a4c4f7b732e8ce64 data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_alternating_stairs.json -f1423b08a0b72a3b4e0902a88d5a8f809f5cba19 data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_basketweave.json -fba23f12624dd92b240e9180d963590082d55557 data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_basketweave_slab.json -4723ffa800c362863d51e6994e558aca587311c4 data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_basketweave_stairs.json -16a119ba4294d3f77af4f764a3d2aef403f3038f data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_large_bricks.json -d1bb287d54cc2a4bcb8e093a60893f579a178ec1 data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_large_bricks_slab.json -75ec795e4aa1be4ebb0c7fe1b8636993eaa5d8ba data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_large_bricks_stairs.json -4a3163207549d3f02541bf2039fab13e21803767 data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_mosaic.json -ab9664200751134e23d539a824741ab30185cb41 data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_mosaic_slab.json -b78795b7118976f7250d93827a9c80218ffe3ad0 data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_mosaic_stairs.json -717886abf77f77f481af18662bd6b262bcef48f2 data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_small_bricks.json -283b1405945e3ecc25fcd4457097972077bc7e8f data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_small_bricks_slab.json -d7cdfc8eaa9e40101eeb6185c1c4e9d5b9218243 data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_small_bricks_stairs.json -ccdb190d803f59c5ef8726d248830434d6c540d7 data/ars_nouveau/loot_tables/blocks/smooth_sourcestone.json -67d31883c7dc6632265e7ec03fb5b739fab315d1 data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_alternating.json -9b046ee5f4bae2eb32d2db59cb7864bdc69d723e data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_alternating_slab.json -a205a6b50ae311561b5d2bc29b188288141a299c data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_alternating_stairs.json -b8733770850ea0012c67a3ec3d1e03134e6c13f9 data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_basketweave.json -8a7c0327f56cc9496e18be413478f2b7983ec445 data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_basketweave_slab.json -d7d0b68063bdabc0e0ff1b1ae3b17ed004173540 data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_basketweave_stairs.json -c18b70f5e59d0ae6bdca21845da7f10c8baf2b46 data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_large_bricks.json -f5a1d6acb131a489129e1d0ab1a2c1f9de5156fd data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_large_bricks_slab.json -0acf441f53f330991ef49828ff9b66e1c622b78a data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_large_bricks_stairs.json -31cbc75aab2372f6a23567dd4372fccd23005ea1 data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_mosaic.json -7d0c6a97a0e3d9d0c011526c9db258443c3225d5 data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_mosaic_slab.json -be49357c6ee04402a71b75963b5b2e047fee8938 data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_mosaic_stairs.json -18884920130d1ca32411fbdedb9a551fbbbe5e4f data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_slab.json -64897b76c33423b90e8eb17390fa7de0d9dfe9dc data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_small_bricks.json -ee44c86873143caf5b8e9fc05d74acb98fa9f3b9 data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_small_bricks_slab.json -eda12a15644f4ac9fbf901cd738434df58db11a9 data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_small_bricks_stairs.json -62a4e61ba7b3bbd78d5cdca0cba621c98113638b data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_stairs.json -1fc8c5595757f818906588e2a7ad87f3ee7ad89d data/ars_nouveau/loot_tables/blocks/sourceberry_sack.json -42e5040c6a81a4617c6ef147e12e17267bbbcd2a data/ars_nouveau/loot_tables/blocks/sourcestone.json -b56aaf60ce3bafd66649843757a01d84d1cc8453 data/ars_nouveau/loot_tables/blocks/sourcestone_alternating.json -56ae08dbfc2014ff8a2606d7e7e989c040d9d066 data/ars_nouveau/loot_tables/blocks/sourcestone_alternating_slab.json -54175f8012d1f822f50d5703bcfcd99e4b0d3736 data/ars_nouveau/loot_tables/blocks/sourcestone_alternating_stairs.json -491e38b7824baac8f6ac93c90f9edccf35f77707 data/ars_nouveau/loot_tables/blocks/sourcestone_basketweave.json -e07e3d7b2e47f58dbe3db2575d250dd78acd1ca8 data/ars_nouveau/loot_tables/blocks/sourcestone_basketweave_slab.json -00cfcfece665375c9df7bbe6f439eea43225e254 data/ars_nouveau/loot_tables/blocks/sourcestone_basketweave_stairs.json -4feb095b7aec7b12712b22cbc8b0c80bfde72e29 data/ars_nouveau/loot_tables/blocks/sourcestone_large_bricks.json -03d6d7899db53d9fc380e7b88b2a8c03c524d55d data/ars_nouveau/loot_tables/blocks/sourcestone_large_bricks_slab.json -a9ccd94f6755cbac1a79c19bdb5a07fe1220a852 data/ars_nouveau/loot_tables/blocks/sourcestone_large_bricks_stairs.json -3df5edddb7ba8bcff233effb681a315a9011d539 data/ars_nouveau/loot_tables/blocks/sourcestone_mosaic.json -3ccfc90bc256c162837acf8cce74d71387f918d8 data/ars_nouveau/loot_tables/blocks/sourcestone_mosaic_slab.json -1e042e669e68da9bc47c3e7306b9ce47a3102e38 data/ars_nouveau/loot_tables/blocks/sourcestone_mosaic_stairs.json -5a8e1094a4131655c1f2f83d2f0d545da41b74ef data/ars_nouveau/loot_tables/blocks/sourcestone_sconce.json -f17397c3a6f7c57a5086773c548d6ca152d0739f data/ars_nouveau/loot_tables/blocks/sourcestone_slab.json -065d119b33f7fb12f181b63105bd7bc40d65b079 data/ars_nouveau/loot_tables/blocks/sourcestone_small_bricks.json -4a2dbb5cc4f68b42d58c3c3da25b33f0b9cb3cbf data/ars_nouveau/loot_tables/blocks/sourcestone_small_bricks_slab.json -ecf0726adda255df3ff434ce3c33c041b04ece5f data/ars_nouveau/loot_tables/blocks/sourcestone_small_bricks_stairs.json -e92ecb490985aae22297d2f5cd5bcb5e625671b7 data/ars_nouveau/loot_tables/blocks/sourcestone_stairs.json -5708d7c438d48789ab5d0f00a115bdebe340215b data/ars_nouveau/loot_tables/blocks/source_gem_block.json -de69afa2d3bda63f5fa5551faa06b3856f9e2b45 data/ars_nouveau/loot_tables/blocks/source_jar.json -7cfca21047bb21713aaeec12060826e87c6cd4de data/ars_nouveau/loot_tables/blocks/spell_prism.json -401055b950ac66d34a96e29f1666fd3c59244c0f data/ars_nouveau/loot_tables/blocks/spell_sensor.json -2e038e8112b147e2a4d00e4a1d707541c89c421c data/ars_nouveau/loot_tables/blocks/spell_turret.json -9ee66bf29aa157ad4254250a2471b6b0a8789355 data/ars_nouveau/loot_tables/blocks/storage_lectern.json -9aaab2a4ead128014c2d59c87df70099a1df6a91 data/ars_nouveau/loot_tables/blocks/stripped_blue_archwood_log.json -2f2e910c3358aaba61f6659bab3be24a8482ea93 data/ars_nouveau/loot_tables/blocks/stripped_blue_archwood_wood.json -7845d4cd003da6b676c6a2567dc373aa1d2d7a8c data/ars_nouveau/loot_tables/blocks/stripped_green_archwood_log.json -414eec71ea3a2f3d11a1ce6797bb1046afc119c3 data/ars_nouveau/loot_tables/blocks/stripped_green_archwood_wood.json -508f43a5d8e9edc0df1895c3216b376d6ef3f6a7 data/ars_nouveau/loot_tables/blocks/stripped_purple_archwood_log.json -000970bcb030af1b0966cf449b20d1c1934d8371 data/ars_nouveau/loot_tables/blocks/stripped_purple_archwood_wood.json -7397be3ff36dd3a4199274affac7d79813d5c3b6 data/ars_nouveau/loot_tables/blocks/stripped_red_archwood_log.json -4fdf99a777c15036d627f12d5ffe68e8fe74dbb3 data/ars_nouveau/loot_tables/blocks/stripped_red_archwood_wood.json -5aff8275565145ae0e02d748a9076f36362ce067 data/ars_nouveau/loot_tables/blocks/timer_spell_turret.json -8f418cce50e6d4c09d2a9c0e190b56ef41628010 data/ars_nouveau/loot_tables/blocks/vitalic_sourcelink.json -9961fbe0d98b899ed331c4b52c8be082764fe178 data/ars_nouveau/loot_tables/blocks/void_prism.json -b7c7dfedc82b75fad6c44b41b53664b086f17e20 data/ars_nouveau/loot_tables/blocks/volcanic_sourcelink.json -5a7f8da8da17f592fe60568b87cba566dbfa6105 data/ars_nouveau/loot_tables/blocks/wixie_cauldron.json -6a4107b990568ff31b9c3251ac2d03330dff96d7 data/ars_nouveau/loot_tables/blocks/yellow_sbed.json -97e37314cb36312f2d50b833b53d7a1becaa0587 data/ars_nouveau/loot_tables/entities/wilden_guardian.json -38484c59a021a2ce94871fa50348b9f1e0b5b154 data/ars_nouveau/loot_tables/entities/wilden_hunter.json -30555a8ac86f2afc4b86f5fc3ab1561ab253463f data/ars_nouveau/loot_tables/entities/wilden_stalker.json diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e similarity index 50% rename from src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 rename to src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index d890ccceeb..888abe95ce 100644 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.20.1 2024-05-25T15:52:16.7168943 Languages: en_us +// 1.21 2024-07-05T22:41:47.5441201 Languages: en_us for mod: ars_nouveau 34260db741d6494b1b36d30ecdfe7cf81e8138b7 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 b/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 index 674806e672..59e0327c3b 100644 --- a/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 +++ b/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 @@ -1,55 +1,55 @@ -// 1.20.1 2024-05-30T20:24:51.579642115 Tags for minecraft:item mod id ars_nouveau -bde6ca31173d1f22d5f6fe355dc90c9faa35b239 data/ars_nouveau/tags/items/golem/shard.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/items/interact_jar_blacklist.json -a0800fbffa0e00aecb2e86a1e991d42904427191 data/ars_nouveau/tags/items/magic_food.json -1781e2e03328482696e713943d129953a77de05c data/ars_nouveau/tags/items/magic_shards.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/items/ritual_loot_blacklist.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/items/ritual_trade_blacklist.json -2bea9b95ffd91ffd3ad204aab2644fae06731943 data/ars_nouveau/tags/items/shady_wizard_fruits.json -f5e3f6895ab28e98f84db162bb5a7ec0d8484aae data/ars_nouveau/tags/items/summon_bed.json -69048d53b29588f52e6e47c61ac0b01697fdad03 data/ars_nouveau/tags/items/whirlisprig/denied_drop.json -efd77219e54deb73b590435b014edcbb9c0f5ee1 data/ars_nouveau/tags/items/wilden_drop.json -aa16961d2b945c22363c452b360f56d9b4b01e32 data/forge/tags/items/armors.json -c417d25dbf09fa35316563dab44086ea9c57398f data/forge/tags/items/armors/boots.json -debde73c045884d2f3335478b8e70e443135fe48 data/forge/tags/items/armors/chestplates.json -b11f943ffa45a788b39c9d51e5bd83e321044249 data/forge/tags/items/armors/helmets.json -4106122c7c1fbe11b433269a6ae8ce58fe1926d5 data/forge/tags/items/armors/leggings.json -2f9b7e099208b0e404e0f81c89f2a368e5d909da data/forge/tags/items/chests.json -2f9b7e099208b0e404e0f81c89f2a368e5d909da data/forge/tags/items/chests/wooden.json -d975e125845630962d46be3215fd2bf3c557e5dc data/forge/tags/items/crops.json -0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/forge/tags/items/fence_gates.json -0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/forge/tags/items/fence_gates/wooden.json -87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/forge/tags/items/fences.json -87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/forge/tags/items/fences/wooden.json -f36268e9375442e51cbf98f2c4d573082aa56378 data/forge/tags/items/fruits/berry.json -0fab28203f8c9e1daa9c635ecb6c026ba0be0ba1 data/forge/tags/items/gems.json -0fab28203f8c9e1daa9c635ecb6c026ba0be0ba1 data/forge/tags/items/gems/source.json -f8f647d2f880955435d323e3c61b7d789d06d59c data/forge/tags/items/logs/archwood.json -f898aac12b01b598949701b1f6e45aa0cd1d9a25 data/forge/tags/items/planks/archwood.json -3737e6b65e87993bd971b233c3aca5088721eb32 data/forge/tags/items/seeds.json -6febc815f11d70abf442be0be941a9132ddd072d data/forge/tags/items/storage_blocks.json -6febc815f11d70abf442be0be941a9132ddd072d data/forge/tags/items/storage_blocks/source.json -877c63c507be1e55a9f5eeed6e73dfabea015dab data/forge/tags/items/tools/shields.json -0fab28203f8c9e1daa9c635ecb6c026ba0be0ba1 data/minecraft/tags/items/beacon_payment_items.json -30ef7d5d3bbd42c50ac6566dce458cb5f7ee404b data/minecraft/tags/items/bookshelf_books.json -43a847dca5f71ae27537abc65fabcd8d3fdb1c72 data/minecraft/tags/items/buttons.json -a01909919207615cda1bb44f33db287efa02333b data/minecraft/tags/items/doors.json -87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/minecraft/tags/items/fences.json -248bbddd99634aced7fd4adc84b0290de05f4a0a data/minecraft/tags/items/leaves.json -30ef7d5d3bbd42c50ac6566dce458cb5f7ee404b data/minecraft/tags/items/lectern_books.json -f8f647d2f880955435d323e3c61b7d789d06d59c data/minecraft/tags/items/logs.json -f8f647d2f880955435d323e3c61b7d789d06d59c data/minecraft/tags/items/logs_that_burn.json -a350e3112294fc7f7f26561673046c76017f3198 data/minecraft/tags/items/music_discs.json -f898aac12b01b598949701b1f6e45aa0cd1d9a25 data/minecraft/tags/items/planks.json -ce9ccf92ade8cd330c990516ee0f8a30c35adea9 data/minecraft/tags/items/saplings.json -70afef6fe4926a8dbf1205248dc1371974ef3037 data/minecraft/tags/items/slabs.json -e5d97b748b59672ba4baec9c3f1093370adf0332 data/minecraft/tags/items/stairs.json -c4a5a335ee7bb70e73214b86cb2889caeaf5be79 data/minecraft/tags/items/swords.json -23fc13405d4dc43512deb39ee5bbbb73da177166 data/minecraft/tags/items/trapdoors.json -43a847dca5f71ae27537abc65fabcd8d3fdb1c72 data/minecraft/tags/items/wooden_buttons.json -a01909919207615cda1bb44f33db287efa02333b data/minecraft/tags/items/wooden_doors.json -87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/minecraft/tags/items/wooden_fences.json -7df208f0e5454cd8762173c46b867bf524fb1f7d data/minecraft/tags/items/wooden_pressure_plates.json -70afef6fe4926a8dbf1205248dc1371974ef3037 data/minecraft/tags/items/wooden_slabs.json -e5d97b748b59672ba4baec9c3f1093370adf0332 data/minecraft/tags/items/wooden_stairs.json -23fc13405d4dc43512deb39ee5bbbb73da177166 data/minecraft/tags/items/wooden_trapdoors.json +// 1.21 2024-07-05T22:41:47.5481227 Tags for minecraft:item mod id ars_nouveau +bde6ca31173d1f22d5f6fe355dc90c9faa35b239 data/ars_nouveau/tags/item/golem/shard.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/item/interact_jar_blacklist.json +a0800fbffa0e00aecb2e86a1e991d42904427191 data/ars_nouveau/tags/item/magic_food.json +1781e2e03328482696e713943d129953a77de05c data/ars_nouveau/tags/item/magic_shards.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/item/ritual_loot_blacklist.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/item/ritual_trade_blacklist.json +2bea9b95ffd91ffd3ad204aab2644fae06731943 data/ars_nouveau/tags/item/shady_wizard_fruits.json +f5e3f6895ab28e98f84db162bb5a7ec0d8484aae data/ars_nouveau/tags/item/summon_bed.json +9df18c2be6a7eba8d9ffaea4af55c89cf07a8674 data/ars_nouveau/tags/item/whirlisprig/denied_drop.json +efd77219e54deb73b590435b014edcbb9c0f5ee1 data/ars_nouveau/tags/item/wilden_drop.json +aa16961d2b945c22363c452b360f56d9b4b01e32 data/c/tags/item/armors.json +2f9b7e099208b0e404e0f81c89f2a368e5d909da data/c/tags/item/chests.json +2f9b7e099208b0e404e0f81c89f2a368e5d909da data/c/tags/item/chests/wooden.json +d975e125845630962d46be3215fd2bf3c557e5dc data/c/tags/item/crops.json +87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/c/tags/item/fences.json +87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/c/tags/item/fences/wooden.json +0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/c/tags/item/fence_gates.json +0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/c/tags/item/fence_gates/wooden.json +f36268e9375442e51cbf98f2c4d573082aa56378 data/c/tags/item/fruits/berry.json +0fab28203f8c9e1daa9c635ecb6c026ba0be0ba1 data/c/tags/item/gems.json +a350e3112294fc7f7f26561673046c76017f3198 data/c/tags/item/music_discs.json +f898aac12b01b598949701b1f6e45aa0cd1d9a25 data/c/tags/item/planks/archwood.json +3737e6b65e87993bd971b233c3aca5088721eb32 data/c/tags/item/seeds.json +6febc815f11d70abf442be0be941a9132ddd072d data/c/tags/item/storage_blocks.json +877c63c507be1e55a9f5eeed6e73dfabea015dab data/c/tags/item/tools/shield.json +0fab28203f8c9e1daa9c635ecb6c026ba0be0ba1 data/minecraft/tags/item/beacon_payment_items.json +30ef7d5d3bbd42c50ac6566dce458cb5f7ee404b data/minecraft/tags/item/bookshelf_books.json +43a847dca5f71ae27537abc65fabcd8d3fdb1c72 data/minecraft/tags/item/buttons.json +debde73c045884d2f3335478b8e70e443135fe48 data/minecraft/tags/item/chest_armor.json +a01909919207615cda1bb44f33db287efa02333b data/minecraft/tags/item/doors.json +87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/minecraft/tags/item/fences.json +c417d25dbf09fa35316563dab44086ea9c57398f data/minecraft/tags/item/foot_armor.json +b11f943ffa45a788b39c9d51e5bd83e321044249 data/minecraft/tags/item/head_armor.json +248bbddd99634aced7fd4adc84b0290de05f4a0a data/minecraft/tags/item/leaves.json +30ef7d5d3bbd42c50ac6566dce458cb5f7ee404b data/minecraft/tags/item/lectern_books.json +4106122c7c1fbe11b433269a6ae8ce58fe1926d5 data/minecraft/tags/item/leg_armor.json +f8f647d2f880955435d323e3c61b7d789d06d59c data/minecraft/tags/item/logs.json +f8f647d2f880955435d323e3c61b7d789d06d59c data/minecraft/tags/item/logs_that_burn.json +f898aac12b01b598949701b1f6e45aa0cd1d9a25 data/minecraft/tags/item/planks.json +ce9ccf92ade8cd330c990516ee0f8a30c35adea9 data/minecraft/tags/item/saplings.json +70afef6fe4926a8dbf1205248dc1371974ef3037 data/minecraft/tags/item/slabs.json +e5d97b748b59672ba4baec9c3f1093370adf0332 data/minecraft/tags/item/stairs.json +c4a5a335ee7bb70e73214b86cb2889caeaf5be79 data/minecraft/tags/item/swords.json +23fc13405d4dc43512deb39ee5bbbb73da177166 data/minecraft/tags/item/trapdoors.json +43a847dca5f71ae27537abc65fabcd8d3fdb1c72 data/minecraft/tags/item/wooden_buttons.json +a01909919207615cda1bb44f33db287efa02333b data/minecraft/tags/item/wooden_doors.json +87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/minecraft/tags/item/wooden_fences.json +7df208f0e5454cd8762173c46b867bf524fb1f7d data/minecraft/tags/item/wooden_pressure_plates.json +70afef6fe4926a8dbf1205248dc1371974ef3037 data/minecraft/tags/item/wooden_slabs.json +e5d97b748b59672ba4baec9c3f1093370adf0332 data/minecraft/tags/item/wooden_stairs.json +23fc13405d4dc43512deb39ee5bbbb73da177166 data/minecraft/tags/item/wooden_trapdoors.json +0fab28203f8c9e1daa9c635ecb6c026ba0be0ba1 data/neoforge/tags/item/gems/source.json +f8f647d2f880955435d323e3c61b7d789d06d59c data/neoforge/tags/item/logs/archwood.json +6febc815f11d70abf442be0be941a9132ddd072d data/neoforge/tags/item/storage_blocks/source.json diff --git a/src/generated/resources/.cache/73a0c150702b0db33c4f7a4031c7885e3223a862 b/src/generated/resources/.cache/73a0c150702b0db33c4f7a4031c7885e3223a862 index a7c7ec4f97..f22fd9e978 100644 --- a/src/generated/resources/.cache/73a0c150702b0db33c4f7a4031c7885e3223a862 +++ b/src/generated/resources/.cache/73a0c150702b0db33c4f7a4031c7885e3223a862 @@ -1,4 +1,4 @@ -// 1.20.1 2024-02-18T23:17:23.6326183 Tags for minecraft:mob_effect mod id ars_nouveau +// 1.21 2024-07-05T22:41:47.5356055 Tags for minecraft:mob_effect mod id ars_nouveau 08d652bf70406a53ea8f4c794d20f054284765b9 data/ars_nouveau/tags/mob_effect/deny_dispel.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/mob_effect/to_sync.json 0315b9264874191953c091e06cf2d340f81d6d67 data/ars_nouveau/tags/mob_effect/unstable_gifts.json diff --git a/src/generated/resources/.cache/7b0970ef111b287b053eb2a386d0fca6ee5aa291 b/src/generated/resources/.cache/7b0970ef111b287b053eb2a386d0fca6ee5aa291 index 2f77c0f47d..068a2a1cdf 100644 --- a/src/generated/resources/.cache/7b0970ef111b287b053eb2a386d0fca6ee5aa291 +++ b/src/generated/resources/.cache/7b0970ef111b287b053eb2a386d0fca6ee5aa291 @@ -1,3 +1,3 @@ -// 1.20.1 2023-07-04T22:32:46.6062005 Tags for minecraft:worldgen/placed_feature mod id ars_nouveau +// 1.21 2024-07-05T22:41:47.5316058 Tags for minecraft:worldgen/placed_feature mod id ars_nouveau 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/worldgen/placed_feature/archwood_trees.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/worldgen/placed_feature/source_berries.json diff --git a/src/generated/resources/.cache/95c82c0d51fb7266bfeb5f2d122be5f9b82ff056 b/src/generated/resources/.cache/95c82c0d51fb7266bfeb5f2d122be5f9b82ff056 index d0f48246b2..e513f4fef1 100644 --- a/src/generated/resources/.cache/95c82c0d51fb7266bfeb5f2d122be5f9b82ff056 +++ b/src/generated/resources/.cache/95c82c0d51fb7266bfeb5f2d122be5f9b82ff056 @@ -1,2 +1,2 @@ -// 1.20.1 2023-10-08T20:36:02.3183705 Tags for minecraft:worldgen/structure mod id ars_nouveau +// 1.21 2024-07-05T22:41:47.5451208 Tags for minecraft:worldgen/structure mod id ars_nouveau eedfc051e19e8fe8ea38287245711becdf5d7ba7 data/ars_nouveau/tags/worldgen/structure/wilden_den.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index 887df500bc..82c075211d 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,551 +1,551 @@ -// 1.20.1 2024-01-14T16:47:50.1775243 Recipes -53e7c7063857317940cff0f32c3e0bb2144ce88a data/ars_nouveau/advancements/recipes/building_blocks/archwood_button.json -3b562128c61e177df4b6cadd7e13b0a7f2aae1df data/ars_nouveau/advancements/recipes/building_blocks/archwood_door.json -e310e3ed620252904dbd7ad1ce31741843c2474e data/ars_nouveau/advancements/recipes/building_blocks/archwood_fence.json -8dedcddba355a2f18754d3ba1d679f50dd0c8022 data/ars_nouveau/advancements/recipes/building_blocks/archwood_fence_gate.json -42330c5167c9f9647339893e151a73f9ac03521d data/ars_nouveau/advancements/recipes/building_blocks/archwood_pressure_plate.json -4953870becddaf8d8db06953e498df57a1493561 data/ars_nouveau/advancements/recipes/building_blocks/archwood_slab.json -9b25e971a63b55752e747f3a898db3c017a14e35 data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_alternating_slab.json -ffad3a80fe45f2cbd236691e57edf36711bcbc3e data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_alternating_stonecutter_stair.json -e7c838cf2fe6cd7d155df5af50f425426547470a data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_alternating_stone_cutterslab.json -9ebfa46b24ef9c1d438473e6c84a757b2dc32466 data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_basketweave_slab.json -3f1bc9e4a985539335251263c603c4844a27610a data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_basketweave_stonecutter_stair.json -7f58ee21b431f6cbf1ed7f238b66f52377854a21 data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_basketweave_stone_cutterslab.json -b033be865d5e0a7d68698fb346d35b1ac3c0e6f6 data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_large_bricks_slab.json -fc061d8976bd83c719fbe09c58583d5c1e838d0c data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_large_bricks_stonecutter_stair.json -420edae67303c64e140cefc648bf34dec655c633 data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_large_bricks_stone_cutterslab.json -7e5fc14456c7bf87ca0f031ca0cc22d74fcbac6a data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_mosaic_slab.json -9c67a0dbb74c5b510061e981cc6a85ddd1a4fbbb data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_mosaic_stonecutter_stair.json -02c1ab0bc6bf09edbf74863eb1daeeeea1a5b31a data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_mosaic_stone_cutterslab.json -291fde1d1e00cf90aac8dfab8f84354d4cdbad03 data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_small_bricks_slab.json -d14da0deff92ad2970b8acaadf456bf8d59a4c82 data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_small_bricks_stonecutter_stair.json -7b42a5ea1c31bae8127334e2401cec685d93ee2c data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_small_bricks_stone_cutterslab.json -5bbaff67c9d47c827893da84bb523be3a6bc7f7d data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_alternating_slab.json -2c5da2c8b594c55e04409c9468ef50d021153818 data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stonecutter_stair.json -65875017a3108414971ea9abd39abb072b786771 data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stone_cutterslab.json -e06290ae0e320dea2d1e3a2d1bb4b9bbfae4c47b data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_slab.json -8b9d5d92f0b47dc939dcca401c608705eb813e27 data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json -c5010ff2762269a2f3f944876782e75d22ebcd01 data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json -3be403f901206c4f7f46d43ef929927ffd5b4f7e data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_slab.json -8fbd655028411e61f6e3d914148a7e6752570b69 data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json -e673b741666a52505858e48902c6413d35e1cc66 data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json -90e609b2b1f249eda36080f354544aa94cfd623e data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_slab.json -ac4ccf5c6b61d725b17118fd42f70b01f027cca3 data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json -2374128a52c68589d809f570b185bfa4fa61dc25 data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json -aa347799d81c0c4b43541f093d4250100aa38a7c data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_slab.json -b451bf2c004c6a934b135dcb9ae54fbbed460088 data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json -a4f41554f47039581a15faf2e2f8d445798ed337 data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json -a6a1324bf324a5b3b40c543b4a808503a290b004 data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_alternating_slab.json -ef6adfa9e81877b08ad457a97103f749098fc988 data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_alternating_stonecutter_stair.json -32c7b3feb7cc38730bc3f3ea5cc145ae5a38b60a data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_alternating_stone_cutterslab.json -efa890c81e41748bae284069318692bf97077ac1 data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_basketweave_slab.json -e948f9460405abed0c73343b8cf36c9252ac509b data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_basketweave_stonecutter_stair.json -55cdd74c3c735488a80c61170d646b8ec7352c02 data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_basketweave_stone_cutterslab.json -24ca28067416609a9a73e56f6d3ca0106f8d3907 data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_large_bricks_slab.json -34a1ea5603b8c7ed332aa1047480c9ea83c6b4a9 data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_large_bricks_stonecutter_stair.json -00088b747d4850b1503773d597e3a55809f0073a data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_large_bricks_stone_cutterslab.json -424dde3bbb2763aa503407879fe25daf523eab32 data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_mosaic_slab.json -cd1b126ea29d2c85ee6b36f94aa6b738c5c28dd5 data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_mosaic_stonecutter_stair.json -dd98220ed71d549bfc4875702b80ae4560879225 data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_mosaic_stone_cutterslab.json -e1a9e680449ab7fba0bb73e0fd0cf93314cbad1a data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_slab.json -86534675197f1c4f11c16f298fc6e80d15b7d255 data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_small_bricks_slab.json -01516cfafa2da3d8607d3cb710625331714faa6e data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_small_bricks_stonecutter_stair.json -4f0d06589810ad5f596edf0f3694ead8ff080ce6 data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_small_bricks_stone_cutterslab.json -073779af40fe168393b8ba34bbdff4859fd4bdb7 data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_stonecutter_stair.json -b980f69ba558033cd8152cfafed997a00ffddf0e data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_stone_cutterslab.json -781c89ac8105e4117ca3cabc50b30170ef2180c5 data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_alternating_slab.json -f2aee537be70ecb9f611e7a4e3f0df159ee147ec data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_alternating_stonecutter_stair.json -aaef9ef075ee5ec9ad0a93e1c911426541d5200d data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_alternating_stone_cutterslab.json -0bf7316754cdae69a293380f2357a1e4a5fb45e1 data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_basketweave_slab.json -622c858321cb6e70f64ced16f77ab7d26e2ac53c data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_basketweave_stonecutter_stair.json -0d5d00414fe428018277ebc912c96093d1c522d1 data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_basketweave_stone_cutterslab.json -8d06128638902ce1e2ecab788c356f35cf16a67a data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_large_bricks_slab.json -6614d0bec2194fedb08a1f0ba7399ea540e602b3 data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_large_bricks_stonecutter_stair.json -28110443f3519a4b484022835d0f2197061f86c9 data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_large_bricks_stone_cutterslab.json -780b54bf31e9ea568884eb435d6880d82eecde5a data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_mosaic_slab.json -9785d1fb343d478ac50f747f7b07be966c5d20ae data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_mosaic_stonecutter_stair.json -2717ff445467d5aeda3d77c447b5c79189b49634 data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_mosaic_stone_cutterslab.json -169de0ee7694d4e518d552cb19d70ea3ca635682 data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_small_bricks_slab.json -741e8b2d4849c8dc3b07fb6f969ae00818c96c70 data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_small_bricks_stonecutter_stair.json -6d9fd09c0c737e3eef929f7202b3aa8814c4182d data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_small_bricks_stone_cutterslab.json -827a48aae66d28e6bc6c2c08edeef5f8bfb7b949 data/ars_nouveau/advancements/recipes/building_blocks/stripped_blue_archwood_wood.json -b0d58e4d0d3b242603a597c2b3b773757af4d29c data/ars_nouveau/advancements/recipes/building_blocks/stripped_green_archwood_wood.json -8254d35e1deb3de4bd63c09a2400e13c602ff308 data/ars_nouveau/advancements/recipes/building_blocks/stripped_purple_archwood_wood.json -6e2b9d37b5a297abedc54bbe37bd6163e3b0f553 data/ars_nouveau/advancements/recipes/building_blocks/stripped_red_archwood_wood.json -e5ee5a7d3d041aa02eaa23bbec78be4898de3927 data/ars_nouveau/advancements/recipes/decorations/sourcestone_1.json -a62fe26f225935b535e819c8a32931eabf98efc8 data/ars_nouveau/advancements/recipes/decorations/sourcestone_10.json -9aa251620295cde01e606cfec1bab3c52e940bad data/ars_nouveau/advancements/recipes/decorations/sourcestone_11.json -8ae784d0af3326803f87a2059ad8eeb0df014042 data/ars_nouveau/advancements/recipes/decorations/sourcestone_12.json -9a62c1e62a4e6252f82f28bc0fe28f89988794a5 data/ars_nouveau/advancements/recipes/decorations/sourcestone_13.json -a799adb648037bac6e1aa6127890ca352ff80b22 data/ars_nouveau/advancements/recipes/decorations/sourcestone_14.json -2b831ca296b46196da9e2e34af69d5095f8cd649 data/ars_nouveau/advancements/recipes/decorations/sourcestone_15.json -57d5dda701cf5ce86affa4caf7ff6e8753d2e2a1 data/ars_nouveau/advancements/recipes/decorations/sourcestone_16.json -5b3dfcba541e07e9ebe16b375972b1b138b39181 data/ars_nouveau/advancements/recipes/decorations/sourcestone_17.json -c41d0cb2798a8bc55c89c714a13e200c19e5a38a data/ars_nouveau/advancements/recipes/decorations/sourcestone_18.json -16d659b039e8fecdc2936a53f8e577febeaac4d0 data/ars_nouveau/advancements/recipes/decorations/sourcestone_19.json -865295481119bb65a3156d131d21bfcbc26d02de data/ars_nouveau/advancements/recipes/decorations/sourcestone_2.json -202bbeb3da9c9b63cecf1300f78c06d6e8075e40 data/ars_nouveau/advancements/recipes/decorations/sourcestone_20.json -2b7b7a48e78efd83e0886ef008df6ddfb59e52bc data/ars_nouveau/advancements/recipes/decorations/sourcestone_21.json -a039317324ec1d72f5e7a946b0e96a2f7a204780 data/ars_nouveau/advancements/recipes/decorations/sourcestone_3.json -ccecff6cb21467e193378339f3b023b13f061772 data/ars_nouveau/advancements/recipes/decorations/sourcestone_4.json -dfe252ec7291b8bf68d6a24d2e2447c3d3729277 data/ars_nouveau/advancements/recipes/decorations/sourcestone_5.json -1a6db490a3a5fadea827fdce444241827dac7dd9 data/ars_nouveau/advancements/recipes/decorations/sourcestone_6.json -a27d8bd22260081c85fab6c87343dd5a563f5cb2 data/ars_nouveau/advancements/recipes/decorations/sourcestone_7.json -c4c7e5017762d3bc6e63dcc0dbbc1636061a0f16 data/ars_nouveau/advancements/recipes/decorations/sourcestone_8.json -a0d6c36502b4c90264787d8bbdbdf5a7d6b71793 data/ars_nouveau/advancements/recipes/decorations/sourcestone_9.json -2ae56eef32219ba48fc0344bc7ee1ddcf577a1b2 data/ars_nouveau/advancements/recipes/misc/agronomic_sourcelink.json -76bb37bd928c4407f9786854a26d496f2c092794 data/ars_nouveau/advancements/recipes/misc/air_essence_to_snow_bucket.json -9a857bd8961f29c8884a7e4193f045dc06fe5fc9 data/ars_nouveau/advancements/recipes/misc/alchemical_sourcelink.json -125a7a53ee37280b9297fc7a1f0a121798cec5e3 data/ars_nouveau/advancements/recipes/misc/allow_scroll.json -09a37190f244f658b1c4bd1c21f47d562588efe5 data/ars_nouveau/advancements/recipes/misc/alteration_table.json -c8f22aaf04f59468d7e0ad1d01fe404b589ea35e data/ars_nouveau/advancements/recipes/misc/annotated_codex.json -dfc143c0d0e00c7c36d9688dd14aea25c2b7f939 data/ars_nouveau/advancements/recipes/misc/arcane_core.json -ece3ff8f70aff79b1a57efb084807501ac71d721 data/ars_nouveau/advancements/recipes/misc/arcane_pedestal.json -d26025b3148b989d42200e4138b737223a69fc77 data/ars_nouveau/advancements/recipes/misc/arcane_platform.json -a0d40423bfc28eda895f5a1e87a82c828cecf01a data/ars_nouveau/advancements/recipes/misc/archwood_chest.json -6dad201e375f525cbc37d8a5ecdf02d3d59d96f5 data/ars_nouveau/advancements/recipes/misc/archwood_planks.json -c60091f5ae2ae9fc1dfe91763e36bf8753a44df8 data/ars_nouveau/advancements/recipes/misc/archwood_sconce.json -507d7515c89b4877a09a99dff8a98687068993d9 data/ars_nouveau/advancements/recipes/misc/archwood_stairs.json -2055b2401b1ff735cd71f3ae53096c3dc0d3e95f data/ars_nouveau/advancements/recipes/misc/archwood_to_chest.json -e3b41e068773cbb256766d257fd8f15676991fbf data/ars_nouveau/advancements/recipes/misc/archwood_trapdoor.json -19fd57aa598b702f8aba57b08a5f05afc02f7ca8 data/ars_nouveau/advancements/recipes/misc/basic_spell_turret.json -fd4084bfffc41ed2dd2215f8cc6edf794af801e9 data/ars_nouveau/advancements/recipes/misc/blank_parchment.json -9a6c7f2b500414305b9deeafbf9d82ff4f563a75 data/ars_nouveau/advancements/recipes/misc/blank_thread.json -b01d10fd9f474e90dff3f0998d93a106b9aef600 data/ars_nouveau/advancements/recipes/misc/blue_archwood_wood.json -a3b4142bff32c81bb0d9674f2ce584fb7abbfc20 data/ars_nouveau/advancements/recipes/misc/blue_sbed.json -1caa19ba9c45b8de13f2605198fde16667885edd data/ars_nouveau/advancements/recipes/misc/challenge_2.json -a64162fd75008287c88ce636af7327cf5bc7a088 data/ars_nouveau/advancements/recipes/misc/clear_allow.json -c2087ee717be66870836c7d322ff4f716fb63be4 data/ars_nouveau/advancements/recipes/misc/clear_deny.json -1be6bde036e4432a671ca916cba3882642195a11 data/ars_nouveau/advancements/recipes/misc/conjuration_essence_to_end_stone.json -7b2fd6675abf05dec5f2af5833d06587668c0562 data/ars_nouveau/advancements/recipes/misc/conjuration_essence_to_soul_sand.json -100d8b54180dfee1c89ee31ce00a0cd8ebabb15c data/ars_nouveau/advancements/recipes/misc/deny_scroll.json -426ce745043da35a2481bec982d9a307346999f1 data/ars_nouveau/advancements/recipes/misc/dowsing_rod.json -10e1d2334bf97d8ff0c68ca61638676e28c1e3e7 data/ars_nouveau/advancements/recipes/misc/dull_trinket.json -2b6713c855391d9b950f7cdfef3e97f63fcf3ec7 data/ars_nouveau/advancements/recipes/misc/enchanting_apparatus.json -35ca16f4d136781aa388b2ffef009f248aa6ac44 data/ars_nouveau/advancements/recipes/misc/experience_gem.json -f1ab6cb5b91a67b84e41a32efb2430d07307f0e6 data/ars_nouveau/advancements/recipes/misc/falseweave.json -19b0b11001e3c877522c338eaa3f896a8b5a62a6 data/ars_nouveau/advancements/recipes/misc/fire_essence_to_charge.json -be0ecd8da68aeb7e7bdc313ac6732bcb24171978 data/ars_nouveau/advancements/recipes/misc/fire_essence_to_magma_block.json -e2123252d24f2a5a699a271d7cb784ebe30cd217 data/ars_nouveau/advancements/recipes/misc/ghostweave.json -31d11f17b1db1ccf787e328d14de0ff7dd64d116 data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_alternating_stairs.json -311db54c69d80993baf63bbd850a199659408a08 data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_alternating_to_sourcestone.json -82674cdc89b1184f669c8ce0b99384467ae2fe68 data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_basketweave_stairs.json -1b5d25a8f82ff4b38d65a6b61e8dc837fc118a94 data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_basketweave_to_sourcestone.json -2b4d04860adc1ce95bcb0daf3da40a7090c0c193 data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_large_bricks_stairs.json -9d6ac4813035e4c8d12a0b7b1625c5d43a98676a data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_large_bricks_to_sourcestone.json -daa0106b800f552699e3dcd16971e808c6691235 data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_mosaic_stairs.json -13dc8f99eb654583d7da1551db02ee6a8c33bdb6 data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_mosaic_to_sourcestone.json -2aacf802e846dd5ae59c440738d83347999852b2 data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_small_bricks_stairs.json -16457e4658207e02fb2b5744ead411f830bb996f data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_small_bricks_to_sourcestone.json -405c934ce9435e2d00861bb92a767fc542277150 data/ars_nouveau/advancements/recipes/misc/greater_experience_gem.json -fbd14ad9d760ec330d5d6fdef5a2ed6e2816e033 data/ars_nouveau/advancements/recipes/misc/green_archwood_wood.json -7b9649223a6e320a1210f4e79bc8ee8af4f31eb3 data/ars_nouveau/advancements/recipes/misc/green_sbed.json -57af0a239d2c797518d7ce02a589e68fedfff6e4 data/ars_nouveau/advancements/recipes/misc/horn_to_bonemeal.json -306e42de4aeb93f81af9f61ad657a4a3dbd73efc data/ars_nouveau/advancements/recipes/misc/imbuement_chamber.json -f4c746040408f6200447330841f0851e223bf292 data/ars_nouveau/advancements/recipes/misc/item_detector.json -9cae6c3ddc9f0a4402da7bc260ae143fcb665e73 data/ars_nouveau/advancements/recipes/misc/magebloom_block.json -0c1c75a40eca890fbc5089b0f61956e239e18cf9 data/ars_nouveau/advancements/recipes/misc/magebloom_block_to_magebloom.json -d2e8af1fe23a203626d3c0f9619a6dd99f9d03d1 data/ars_nouveau/advancements/recipes/misc/magebloom_fiber.json -fdabab31ed67abae434803d17464a71eb4ec63ac data/ars_nouveau/advancements/recipes/misc/magebloom_to_pink.json -192ae35d5908b67e1f567303dbcb85a682ffd8cd data/ars_nouveau/advancements/recipes/misc/magelight_torch.json -997abf2419fd0ec4cdc5839b0ebc70cdc5295b45 data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_andesite.json -799c0e4c9a4b1a9d1ec2396bc055bf8f504c488a data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_blazin_sapling.json -a1d05a36c50bc8fd6e287247116d2ab5203c8102 data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_calcite.json -0670e2d9e1c120a4c2cffbc9a8b85efc588d677f data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_cascading_sapling.json -259edfb8fa2b70becfd5ba71c4ed92f92a83227d data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_deepslate.json -05708d16bebaef064c8b52e640625668b0fd3427 data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_diorite.json -4d3d42f066635a638d03cfb00c9f7cea0c9a6ac9 data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_flourishing_sapling.json -c7bebe34381452a345238f20f46280807f3d950d data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_granite.json -a066afa8c4c38fab518fbf6d4bccce7e52dc87c3 data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_grass_block.json -5d3e8d29fa684121bf843acfd69e682a532a2336 data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_moss_block.json -ed00b71c3ebf5e55c23e133c8bbe3f371b130583 data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_mycelium.json -1662c6ceba1ec36e38392c7f254717526d46f52a data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_tuff.json -5ee4b833b6948f637be0bc7813a3ae024700f707 data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_vexing_sapling.json -13a3949dcea463f2098fd54f94ce8e2aeb850813 data/ars_nouveau/advancements/recipes/misc/mimic_scroll.json -5c9cd3a4baccee8c4c78ac8c61dd36528abadc03 data/ars_nouveau/advancements/recipes/misc/mirrorweave.json -e6ec4eaa44ed94e98f90b4adfb19d506406884fc data/ars_nouveau/advancements/recipes/misc/mob_jar.json -89bea982f7d02da39916a036293f896654947809 data/ars_nouveau/advancements/recipes/misc/moonfall_2.json -163a00071fbfea378e45e321518a83df060f98a2 data/ars_nouveau/advancements/recipes/misc/mundane_belt.json -3efff467902798f8feaa7c6548dd0440d18524a8 data/ars_nouveau/advancements/recipes/misc/mycelial_sourcelink.json -16008448d03388350c888adc3aa5e357bee28f99 data/ars_nouveau/advancements/recipes/misc/orange_sbed.json -229d60fcc273f9166d386181d9f9a63bcb5d5517 data/ars_nouveau/advancements/recipes/misc/platform_to_pedestal.json -a3396053a8aa797f9bf7ada27b8e6ad9b1311c48 data/ars_nouveau/advancements/recipes/misc/polished_sconce.json -2eec5509a1f42ff8fb3f558a3d29eb66e1dc43d6 data/ars_nouveau/advancements/recipes/misc/polished_source_sconce.json -d571346d7e763c8427a7b8b4dc5ec1da0ac85962 data/ars_nouveau/advancements/recipes/misc/potion_jar.json -62819b931ba5f84f07f19e3814c2b079b70da887 data/ars_nouveau/advancements/recipes/misc/potion_jar_empty.json -5665454713cd882984d831d28780a3b5ff03231e data/ars_nouveau/advancements/recipes/misc/purple_archwood_wood.json -d5065e641feaaf9362b662bd30b4f44793794e46 data/ars_nouveau/advancements/recipes/misc/purple_sbed.json -a5563cacb2cd5f0ce1e7116f45741b2e6a30bec6 data/ars_nouveau/advancements/recipes/misc/redstone_relay.json -28b20c40e2e32ddadee8f564a00f38a1607e9a6a data/ars_nouveau/advancements/recipes/misc/red_archwood_wood.json -c70d4535470c73b9ee01a113218bee9c939ac84d data/ars_nouveau/advancements/recipes/misc/red_sbed.json -ba446b8822f83eaf4807091d6e835afd355b6c17 data/ars_nouveau/advancements/recipes/misc/relay.json -a93b6cbf06ae040006836d9302d26fdb7f0a13a1 data/ars_nouveau/advancements/recipes/misc/repository.json -2fafdc544f57a734ac2807b9b0e5dad84ff40454 data/ars_nouveau/advancements/recipes/misc/ring_of_potential.json -28f80fc268bcf854dbe2149d53d5df330093b610 data/ars_nouveau/advancements/recipes/misc/ritual_animal_summon.json -5f2b04a975ab83da6bb1933a8e51d51035765573 data/ars_nouveau/advancements/recipes/misc/ritual_awakening.json -654199091bf1c59b20cc1d8a10d35829fd2e58c3 data/ars_nouveau/advancements/recipes/misc/ritual_binding.json -7a62f57029a277f2ba9b992ba140010323c5c7bb data/ars_nouveau/advancements/recipes/misc/ritual_brazier.json -ead566f4c3bd14ebbd5c3d3813b275a1a742c7cb data/ars_nouveau/advancements/recipes/misc/ritual_burrowing.json -9aef649005b6d7ad3884972e28f25e8e4753faf6 data/ars_nouveau/advancements/recipes/misc/ritual_challenge.json -10022114603c61cb0bb8b1d0d9ea90bd7ed5b108 data/ars_nouveau/advancements/recipes/misc/ritual_cloudshaping.json -44d698dd369c9db1f82bbafd1749ba2159fc0596 data/ars_nouveau/advancements/recipes/misc/ritual_conjure_island_desert.json -74515cf74c636b4f2a5d1b833ea72617b858b106 data/ars_nouveau/advancements/recipes/misc/ritual_conjure_island_plains.json -262670641ef53ed41ed8dfb35ecc5c774820de42 data/ars_nouveau/advancements/recipes/misc/ritual_containment.json -77e698da24ee3a867cb3f88a1f0fad620c5a4dc8 data/ars_nouveau/advancements/recipes/misc/ritual_disintegration.json -e0cd3715303024f98bb70fe42369681f4a30856f data/ars_nouveau/advancements/recipes/misc/ritual_fertility.json -1b8b5803cf92ea8a80e738e3d7183ea980c0bf62 data/ars_nouveau/advancements/recipes/misc/ritual_flight.json -228aa62a0fd21bb498282fcc1c5b722fd2fef6dd data/ars_nouveau/advancements/recipes/misc/ritual_flowering.json -720a316846a1b4fca1291540c71b4fee6e436c22 data/ars_nouveau/advancements/recipes/misc/ritual_forestation.json -843f0566acbe6800570c405e4c305530144037a9 data/ars_nouveau/advancements/recipes/misc/ritual_gravity.json -aae1d8344e5a57e3ce38f474a4815c915ee50f17 data/ars_nouveau/advancements/recipes/misc/ritual_harvest.json -07e92a9351eec80779b0b2e040ce6a6c6b4bbff7 data/ars_nouveau/advancements/recipes/misc/ritual_moonfall.json -bd6744a7bf42e4fb19c1db9fe641fcd800b909ba data/ars_nouveau/advancements/recipes/misc/ritual_overgrowth.json -f221cfa170a71dd86516236138bbdb2e45bb63de data/ars_nouveau/advancements/recipes/misc/ritual_restoration.json -4644e2207078a45cac89b58a9c6a7e586429d847 data/ars_nouveau/advancements/recipes/misc/ritual_sanctuary.json -963f787615043164ebda808f19ca6ad56738a165 data/ars_nouveau/advancements/recipes/misc/ritual_scrying.json -d2f0ee88732c63ab7d5907949aa2bac8b134122c data/ars_nouveau/advancements/recipes/misc/ritual_sunrise.json -983cd4205360abd2f674615b4f4d9bdb76c086f4 data/ars_nouveau/advancements/recipes/misc/ritual_warping.json -33c15d7a10f5e2af77024c8b60e2245363934bcc data/ars_nouveau/advancements/recipes/misc/ritual_wilden_summon.json -5ccff06037753d29b8f43450f2a581fa824e9a40 data/ars_nouveau/advancements/recipes/misc/rotating_spell_turret.json -dac4925ea3504a26662f2e39e1d0415717ca3bd9 data/ars_nouveau/advancements/recipes/misc/rotating_turret_to_basic_spell_turret.json -69ef0b3afa50bf87ad5d7c295865ca3664e73a29 data/ars_nouveau/advancements/recipes/misc/runic_chalk.json -be041d96a9724a72fcd1568303666837b7d1b11d data/ars_nouveau/advancements/recipes/misc/sconce.json -e5c8a6f7e9b4d0e29c821ee128f90f931713ae53 data/ars_nouveau/advancements/recipes/misc/scribes_table.json -c51cb7ed72953d7ae0be54076b16c2522832012d data/ars_nouveau/advancements/recipes/misc/scryers_crystal.json -c0f369b843364157625cfa5f5e438676a2b72f56 data/ars_nouveau/advancements/recipes/misc/scry_to_blank_parchment.json -8f8d8efc499e122d9295cc4ede7317bfce3b605b data/ars_nouveau/advancements/recipes/misc/sky_block.json -ba0df9383ab0194e54312c267dd6167ef3628cc2 data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_alternating_stairs.json -a308cc31110bc54f3e02dfe589c695c8f8a05a80 data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_alternating_to_sourcestone.json -1624c1d0fe3a9c8378cb5d4a84d853aa4449b26a data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_basketweave_stairs.json -dc2560dc9b01f4eff89339b7372e1185555c2570 data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_basketweave_to_sourcestone.json -3b9a9c2b7078262a01e17c6c42caf8dd55be59a2 data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_large_bricks_stairs.json -50b0ccc67486cf955d6da7b72519be507a893de3 data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json -b5ec84b36637afeee7bc77fb7a3058800a0d7155 data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_mosaic_stairs.json -ebb170cdbad96edd36b59034d7e36ce6525f8847 data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_mosaic_to_sourcestone.json -fde302a76499f6b2c0ed3ddb5dd9b0b17725ba9a data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_small_bricks_stairs.json -46d270887bedfb7a1d2d36e76b1d458de8c341e6 data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json -3b093d3e55f204d4d232eb348e940feca2832e00 data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_alternating_stairs.json -c6b210fa51083872be607beffde4ccb631e683ca data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_alternating_to_sourcestone.json -8ecb5ce7ccc90279159b5bb4f87e3dc525fc645e data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_basketweave_stairs.json -1a0dc8db7e660311b9a5f0fdb1e7e639f8a1e340 data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_basketweave_to_sourcestone.json -7f4f5dc81bc3fa674ddd4ed782e2fc9b225706c8 data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_large_bricks_stairs.json -cbaa2e46081fe7a57e638f41feffbf5f8d76381c data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_large_bricks_to_sourcestone.json -4ff4f26a02094b029f66be49eaa13723008598ab data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_mosaic_stairs.json -1d7cc122296b758fc871a1c9824899b9c9b89280 data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_mosaic_to_sourcestone.json -9e5e491714b7a05d93ac19b63da9a10fd84efebc data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_small_bricks_stairs.json -78c9127df28d28904b8c8f2444cde7b723286c78 data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_small_bricks_to_sourcestone.json -dcb5acd709453328e54c4a4fe9baeb0aa853f13a data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_stairs.json -b7aea62df71eedf29e6a9f2edc9e5b8ed58bc454 data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_to_sourcestone.json -ae57d06f57fa4fc88430d17e23c049c5dcfe95da data/ars_nouveau/advancements/recipes/misc/sourceberry_sack.json -ded98335add32f9277cfed35bed408b2c66e0e3a data/ars_nouveau/advancements/recipes/misc/sourceberry_sack_to_bush.json -17de4338fe6d2b0bcc1e2aea8bd32b8287b0b6f8 data/ars_nouveau/advancements/recipes/misc/sourceberry_to_purple.json -520a65b822a70e9d633a92a589ce47d9513c4e4c data/ars_nouveau/advancements/recipes/misc/sourcestone.json -e18056ae26d474a80f98653ba0759fb566f4c55b data/ars_nouveau/advancements/recipes/misc/sourcestone_alternating_stairs.json -337bba37b00529eb72759e15772682c34f199d61 data/ars_nouveau/advancements/recipes/misc/sourcestone_alternating_to_sourcestone.json -dd194dbd7eee6f3077f5f85a4caa9293bde80bcf data/ars_nouveau/advancements/recipes/misc/sourcestone_basketweave_stairs.json -679c0f473736d3e5b0edd9fbc88a9385d2dc6852 data/ars_nouveau/advancements/recipes/misc/sourcestone_basketweave_to_sourcestone.json -5b8094bb5698874ec59c73b24a95e36d56736954 data/ars_nouveau/advancements/recipes/misc/sourcestone_large_bricks_stairs.json -31d290c490d917827d36428f1a081fff0af36699 data/ars_nouveau/advancements/recipes/misc/sourcestone_large_bricks_to_sourcestone.json -e745a6fac9489041d744b6d76cbe5cb6b7269cf3 data/ars_nouveau/advancements/recipes/misc/sourcestone_mosaic_stairs.json -6f74cb90f1f751fa026d49f37f37c4494eb82d16 data/ars_nouveau/advancements/recipes/misc/sourcestone_mosaic_to_sourcestone.json -34891bad1e4a71b99ae0ba026988e53baebe1226 data/ars_nouveau/advancements/recipes/misc/sourcestone_sconce.json -3f051b1cc71436769adfb4af05b398311a09eee0 data/ars_nouveau/advancements/recipes/misc/sourcestone_small_bricks_stairs.json -b0936e237f7a59689acf604f34c588bd023c9218 data/ars_nouveau/advancements/recipes/misc/sourcestone_small_bricks_to_sourcestone.json -9e448e65a84c012853a9352833f6a7c4a451bd80 data/ars_nouveau/advancements/recipes/misc/source_berry_pie.json -5a85e7f6a9f6a46d2c32a4200617770f43bb3bab data/ars_nouveau/advancements/recipes/misc/source_berry_roll.json -d1e6db355e0bea5fee4dac6eb89d437a5b414908 data/ars_nouveau/advancements/recipes/misc/source_gem_block.json -b6fafd2d74d39a57f36b116f4de7baacedb3698d data/ars_nouveau/advancements/recipes/misc/source_gem_block_2.json -6e8fe3f9716245507f685c2068b63857ca27ddb7 data/ars_nouveau/advancements/recipes/misc/source_jar.json -ae59493d8689c72857b8323b4b02c2567f5000b9 data/ars_nouveau/advancements/recipes/misc/spell_prism.json -f1dcfe025da4bc52b81bfbbfda27a35331cd8bd3 data/ars_nouveau/advancements/recipes/misc/spike_to_arrow.json -fc86514cab5f3ff4b9a387b0c08f2f41a63f6ebb data/ars_nouveau/advancements/recipes/misc/spike_to_dye.json -26aecff9a223f58a04015f2e72edbae970b3f24b data/ars_nouveau/advancements/recipes/misc/starbuncle_shades.json -e964b648ad0e6d1ffcc2c1900a4917180771513c data/ars_nouveau/advancements/recipes/misc/sunrise_2.json -07896b58fecc06485329a9a94e0508421511def3 data/ars_nouveau/advancements/recipes/misc/vitalic_sourcelink.json -8ac0aac2d1419eb350aff4cced5d15d8a7d08db4 data/ars_nouveau/advancements/recipes/misc/void_prism.json -a66848b94a51024926adb434394bb6bbb60bbbab data/ars_nouveau/advancements/recipes/misc/volcanic_sourcelink.json -634c1cea30a296b75cb82bee1c20696c3b49a856 data/ars_nouveau/advancements/recipes/misc/warp_scroll.json -40cadecf05824b2d9ecb9e405e6bc8bca62188f1 data/ars_nouveau/advancements/recipes/misc/water_essence_to_bucket.json -9cb5b1a8caee4cd625054e1b3095bae6b159ee65 data/ars_nouveau/advancements/recipes/misc/water_essence_to_obsidian.json -15901f8fc05c80de35deac17e6c2296213557a13 data/ars_nouveau/advancements/recipes/misc/wilden_summon_alt.json -0ac01eddacece874a06bb4504ee360fc8a05b7f6 data/ars_nouveau/advancements/recipes/misc/wing_to_leather.json -05dbd663b8f0ce65f779545637e634ad831fdf9e data/ars_nouveau/advancements/recipes/misc/wipe_spell_parchment.json -ddaea8f63238386dd7f628579997298ce660ff91 data/ars_nouveau/advancements/recipes/misc/wipe_starby_shard.json -3546cf9f7c96679879ae001d6369227bac401892 data/ars_nouveau/advancements/recipes/misc/wixie_hat.json -48483202be5f979239c021d230f0f5bb1f11f3e5 data/ars_nouveau/advancements/recipes/misc/worn_notebook.json -686b7026638d821c6ed293cbac11e14e612e8cee data/ars_nouveau/advancements/recipes/misc/yellow_sbed.json -b62012506109fdd025b1aeaaca5f117f80a8118f data/ars_nouveau/recipes/agronomic_sourcelink.json -c0ebf3a4e071f6bb3fa9fc4466665608dc1e2799 data/ars_nouveau/recipes/air_essence_to_snow_bucket.json -8b456a733fd3024a80f0b64e0888a07ea844b089 data/ars_nouveau/recipes/alchemical_sourcelink.json -f7f1e6fcb759bb61399a534b9f93797dee43ef68 data/ars_nouveau/recipes/allow_scroll.json -de614945d8abc5d208cbf45072468c8f3b5b15e3 data/ars_nouveau/recipes/alteration_table.json -8f11baa5f4732c994fdff8a08e72a7cba6dae47a data/ars_nouveau/recipes/annotated_codex.json -ded7d0190444e957c1fc649e15ec5de39089a560 data/ars_nouveau/recipes/arcane_core.json -d824b3d862f7617313f7ad0cc784a5e4554aa82a data/ars_nouveau/recipes/arcane_pedestal.json -a8b07af3051961ff012e34ca03042254b091dd84 data/ars_nouveau/recipes/arcane_platform.json -d19c4a5633b4fd8ad1a1aa8b5b7275e8038a9493 data/ars_nouveau/recipes/archwood_button.json -ce7fa3b0e9834eed19c2d7c165717bfa4d2efe44 data/ars_nouveau/recipes/archwood_chest.json -170dc5ca3e29e8efd798a3f2ab78f646b7452a31 data/ars_nouveau/recipes/archwood_door.json -c6787c4b76bbad79980973e813c6d307a9466baa data/ars_nouveau/recipes/archwood_fence.json -43be057fe2fa8779d0dcf7acf5725407c64d8e62 data/ars_nouveau/recipes/archwood_fence_gate.json -0d49373b44a5b9366fe430c9a294cd9bfbd9eb8e data/ars_nouveau/recipes/archwood_planks.json -04f60f7b047efb566d047cd810a8bc36ecfce366 data/ars_nouveau/recipes/archwood_pressure_plate.json -708a31988ccac421ac54fb8ae4f1da7296079f3b data/ars_nouveau/recipes/archwood_sconce.json -55ab45f313b09bd33b71505e7c5b2811d4b43100 data/ars_nouveau/recipes/archwood_slab.json -bf850f7392fb2439e698d4c503a9d6d0d5978e37 data/ars_nouveau/recipes/archwood_stairs.json -3310a6f2acd6524d43f620eb68ab5677f3410da3 data/ars_nouveau/recipes/archwood_to_chest.json -ed16bee8f4f2d424ad85b25119731623d2b1978b data/ars_nouveau/recipes/archwood_trapdoor.json -fdb5ba6a8b71d06f4c8c062f487cd8f2d069c18c data/ars_nouveau/recipes/basic_spell_turret.json -53f2944a8ff5f7c927e169974fd55467b568a01e data/ars_nouveau/recipes/blank_parchment.json -f0e52e23dc621a6d7ec7ffbd49a89584c8d1e5ce data/ars_nouveau/recipes/blank_thread.json -72fe03c5f61a29d3997cc666316949bc40630885 data/ars_nouveau/recipes/blue_archwood_wood.json -6d11b2acd2de9a400a5a99c73d00fbb9f026895d data/ars_nouveau/recipes/blue_sbed.json -8f370bd03973df1cbe6b5414577f9d38ddae98a7 data/ars_nouveau/recipes/challenge_2.json -db7845e9c74c849d1678a9bdfd29241ef00d99ac data/ars_nouveau/recipes/clear_allow.json -987e5779ef6bee8d89beca504d959b07ec286e6d data/ars_nouveau/recipes/clear_deny.json -a1379695851596078fcf225a1ef28c5bad1624d4 data/ars_nouveau/recipes/conjuration_essence_to_end_stone.json -e895ac3e27efb03266be59aed48838ea892b1445 data/ars_nouveau/recipes/conjuration_essence_to_soul_sand.json -c0ed2c399bd421f7b792c19fd7b1213c4280121d data/ars_nouveau/recipes/deny_scroll.json -90c8f9a55e4098c748eee59cdaf107d2068da687 data/ars_nouveau/recipes/dowsing_rod.json -723a8a864ce598871b31b941d28c37fc70068258 data/ars_nouveau/recipes/dull_trinket.json -6ef13bcb5cf03c9cd583c8d277c0ddb3f70f0bca data/ars_nouveau/recipes/enchanting_apparatus.json -d2d12d2e6c17ac9f808657f450baa569a2782a1e data/ars_nouveau/recipes/experience_gem.json -41e7eab320aaa1474989f86ee9ea426bdc8ebca2 data/ars_nouveau/recipes/falseweave.json -086242e4fe6e1add8bb723e680f2854aae91c551 data/ars_nouveau/recipes/fire_essence_to_charge.json -1e6279f40d3edd383835aee6fbc3861e82d8cc10 data/ars_nouveau/recipes/fire_essence_to_magma_block.json -71e3b465a90516b20419251c5abd9a2ba4a868f7 data/ars_nouveau/recipes/ghostweave.json -d4e7dd85a594e56f69390afdb21defd1ed7f660a data/ars_nouveau/recipes/gilded_sourcestone_alternating_slab.json -bef00f4d9620c8448161a0c5f520dc3f184dadea data/ars_nouveau/recipes/gilded_sourcestone_alternating_stairs.json -fcd7c1f7b8bf98ea133f79684afabb5dec846777 data/ars_nouveau/recipes/gilded_sourcestone_alternating_stonecutter_stair.json -8dcff57694dd9b43db92aa284344ecfa1c6f545a data/ars_nouveau/recipes/gilded_sourcestone_alternating_stone_cutterslab.json -e113ab2c4ca0712bfca782a3d77aecf556e25e9b data/ars_nouveau/recipes/gilded_sourcestone_alternating_to_sourcestone.json -6f58fe8864de21c66627edec7d8f282fcf890ef6 data/ars_nouveau/recipes/gilded_sourcestone_basketweave_slab.json -0553b383cd4c13cb966e579fe871d764b388ba4b data/ars_nouveau/recipes/gilded_sourcestone_basketweave_stairs.json -d1ef7292248042b8514376274cde9b6c41d6ddfa data/ars_nouveau/recipes/gilded_sourcestone_basketweave_stonecutter_stair.json -1a95fccc441ed4d26be5e9549eed3e34828be771 data/ars_nouveau/recipes/gilded_sourcestone_basketweave_stone_cutterslab.json -74a0bb2ff0262ddf3ed8deb64e7d311f7388693e data/ars_nouveau/recipes/gilded_sourcestone_basketweave_to_sourcestone.json -ce07b3516d11354434608be2fa659236cbb0b1ff data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_slab.json -fc373f52ec549204fbd0057b0002e2ab180bf0ea data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_stairs.json -1640860e3c60a8058c50a30bf56a48ea67f40486 data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_stonecutter_stair.json -8bad2b82ed4dd7ac407bc7e6edb6f4059a9bca55 data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_stone_cutterslab.json -7b941c04d30a81232849dfe86ad5f53b6397ea81 data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_to_sourcestone.json -71113c842cf63a4fab3ac5b2cca535b798169640 data/ars_nouveau/recipes/gilded_sourcestone_mosaic_slab.json -cc67a04a01da83c0a0a452dbb67ae1a826a2d944 data/ars_nouveau/recipes/gilded_sourcestone_mosaic_stairs.json -ef21d4d9632993bc69c730cc048bfa541b57bc8e data/ars_nouveau/recipes/gilded_sourcestone_mosaic_stonecutter_stair.json -88e69ec74f27c513c0338e5ac48729cd94a9d7df data/ars_nouveau/recipes/gilded_sourcestone_mosaic_stone_cutterslab.json -c9973b5c87457878eb558eb68cf87fd64d7c4b8a data/ars_nouveau/recipes/gilded_sourcestone_mosaic_to_sourcestone.json -56c5c70ed393ffb55a0242b4a64f5364c4abfe60 data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_slab.json -9282f354634538aed990e0d0d4b39b213cffcf89 data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_stairs.json -1f7e261e50d92eacac5d963cef497a5a3a69f9e7 data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_stonecutter_stair.json -f0ec2a274ae868d7e31c2e10005a81883c4d2872 data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_stone_cutterslab.json -04372d44d2f156990c960bb951cb42cbb09ee4d8 data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_to_sourcestone.json -e7baf398712857616b1b99f8b96b699e2eb9221b data/ars_nouveau/recipes/greater_experience_gem.json -f4d83d6fc0243993b2c58975f1f09289dcaf6d58 data/ars_nouveau/recipes/green_archwood_wood.json -364d93d65e772647f45264c627715ff7343dc7d5 data/ars_nouveau/recipes/green_sbed.json -0369323cc4c7f06bc9d31ebea5e333beab4553bf data/ars_nouveau/recipes/horn_to_bonemeal.json -ec74ae1f4b47fd1a07d8f9fdf27443fa807003f0 data/ars_nouveau/recipes/imbuement_chamber.json -e48d84d5207dd3b9feb7f7424ce40fa7d1cdc5ed data/ars_nouveau/recipes/item_detector.json -8eab511a9c2aa67beed27c3c64ecba58a209942d data/ars_nouveau/recipes/magebloom_block.json -039ada39d384c58708b63b56d62a41c784f88aec data/ars_nouveau/recipes/magebloom_block_to_magebloom.json -2dfb00604136b251f4a3ed3108d0e2491c6309e9 data/ars_nouveau/recipes/magebloom_fiber.json -38b1b5c3c1c78aa8c62063ef4ab199230e0b65e1 data/ars_nouveau/recipes/magebloom_to_pink.json -38d4b0b0680219d9e58f4ba9e6a7b25dccf9af07 data/ars_nouveau/recipes/magelight_torch.json -73e90bd8e80b4348fbc800a300b3a32d74176492 data/ars_nouveau/recipes/manipulation_essence_to_andesite.json -30465bd20992273162ccb9f55c760e60c4e12ee7 data/ars_nouveau/recipes/manipulation_essence_to_blazin_sapling.json -609436cc37e50466da79e3b1102d9e4be4cac254 data/ars_nouveau/recipes/manipulation_essence_to_calcite.json -72dcad8fd8c309f5e2b9c878f90709cc52842e77 data/ars_nouveau/recipes/manipulation_essence_to_cascading_sapling.json -b62d0651c774a88e2a151dccf0860fab960c450e data/ars_nouveau/recipes/manipulation_essence_to_deepslate.json -6af58b79eecfc2b1e9d13ba7e5ed0ba75284824f data/ars_nouveau/recipes/manipulation_essence_to_diorite.json -b2a4d621423b80280ad5ca041a3336aa83cbb03d data/ars_nouveau/recipes/manipulation_essence_to_flourishing_sapling.json -d9cda1a7a05db050590b55cdd7443cd6196591e4 data/ars_nouveau/recipes/manipulation_essence_to_granite.json -9f1d531a6cb6778cd2f129dc0d5921dd91f391e8 data/ars_nouveau/recipes/manipulation_essence_to_grass_block.json -a6cff63c2dbfb049e6f1b902b036c1936c6fdbac data/ars_nouveau/recipes/manipulation_essence_to_moss_block.json -9ae3f25eda43cbe783d57c84d06336b07bf62d98 data/ars_nouveau/recipes/manipulation_essence_to_mycelium.json -06e2fa1406affe1e17f5804e7d602a25ff64a150 data/ars_nouveau/recipes/manipulation_essence_to_tuff.json -bf66fd2eb18e88a8367954cfe8d6e60085f3d097 data/ars_nouveau/recipes/manipulation_essence_to_vexing_sapling.json -454242b21f01a56050153d57a5b905339cb3dcf2 data/ars_nouveau/recipes/mimic_scroll.json -19fa787e2ce9fa0c3424d6e28fffe5ee87b8821d data/ars_nouveau/recipes/mirrorweave.json -99dfe9d513d832d7a4c6c84c9dbaf61bd38b1c30 data/ars_nouveau/recipes/mob_jar.json -21d0f18a4df065b3e4200c3456f4013eee187e28 data/ars_nouveau/recipes/moonfall_2.json -e261091b31ecf2e81f66c2c111fbbcb2bbb613a0 data/ars_nouveau/recipes/mundane_belt.json -c92bd1177e23f95da05485af9535b89ab026a5db data/ars_nouveau/recipes/mycelial_sourcelink.json -88ea6a036e3248aa1e9fa04249afb5fc3a17d123 data/ars_nouveau/recipes/orange_sbed.json -a52a170a1bdc7d61ecee5328618515336993fe78 data/ars_nouveau/recipes/platform_to_pedestal.json -5615bf7eea52f13211245e4b6fc35a54a4399275 data/ars_nouveau/recipes/polished_sconce.json -ca9c42ffa7b2bf57ec281661d6e22ae6ae2724c9 data/ars_nouveau/recipes/polished_source_sconce.json -8a5ebb46d3f31580232d021d9858e72297c02dd5 data/ars_nouveau/recipes/potion_jar.json -496fe635461a9c2f54e31ea47382adba2d21d6f8 data/ars_nouveau/recipes/potion_jar_empty.json -079ddb469381c7cf8c409dd42d835148eb1d4fd7 data/ars_nouveau/recipes/purple_archwood_wood.json -414896ed23ca2091eb545f84ff32175b2af94172 data/ars_nouveau/recipes/purple_sbed.json -3c6f013e3db3944e2aa8c7a79ec1770969749262 data/ars_nouveau/recipes/redstone_relay.json -a801d5ba5e86e4543b211654b6168fa3d21b6abd data/ars_nouveau/recipes/red_archwood_wood.json -e9875c626f2089f3fe8775b860a7238854bacb7b data/ars_nouveau/recipes/red_sbed.json -679e48084a7599d574d11a8cca58a73205d440fc data/ars_nouveau/recipes/relay.json -f15274ef72e8c71bfa999b096a745e077898cee5 data/ars_nouveau/recipes/repository.json -38836bee9cf3eb7fa3e50fffc1ef1a0d8a142014 data/ars_nouveau/recipes/ring_of_potential.json -be91029c614db90d0c8f09ec615cbd3f8727876e data/ars_nouveau/recipes/ritual_animal_summon.json -ae56cb8be4d219ebc8ae21499e1ab01eb21a4153 data/ars_nouveau/recipes/ritual_awakening.json -8706fd2c2ae0f90e0ad9be2505251b87e2f3fe33 data/ars_nouveau/recipes/ritual_binding.json -368f115c149efa32ea00e507f7128efc2eb6490f data/ars_nouveau/recipes/ritual_brazier.json -ce6fffedae9b01eff179a273005f6d05d1b8f832 data/ars_nouveau/recipes/ritual_burrowing.json -f0cbbbe9408496d9a0a62b72345c12b304266d54 data/ars_nouveau/recipes/ritual_challenge.json -bcc87dc4ca3d0cd0e734460e50f6962010fe25e9 data/ars_nouveau/recipes/ritual_cloudshaping.json -5fc1f7cfd51603ada0c46633e410f51758d24b7a data/ars_nouveau/recipes/ritual_conjure_island_desert.json -2d2a883dbfd0f52580884b40b6d9544e9beba7d7 data/ars_nouveau/recipes/ritual_conjure_island_plains.json -b6be2a0744e852865859a1cafc87c8c9e3e0509b data/ars_nouveau/recipes/ritual_containment.json -1a73c5c407eb60b981ac7ef27be51b87185f84a4 data/ars_nouveau/recipes/ritual_disintegration.json -a23f354932fdd08441e1b5b1bb724ac6d19d4f58 data/ars_nouveau/recipes/ritual_fertility.json -6ecd2f3eb49fb546d8a99c0c8ec6d2e25f0a4426 data/ars_nouveau/recipes/ritual_flight.json -1ca17abdc62b59476048de9567379b78378d2010 data/ars_nouveau/recipes/ritual_flowering.json -877a0d77b02b3ebb108aa4ca9a22b20b980ee92d data/ars_nouveau/recipes/ritual_forestation.json -22178b377cf918f0dc34fec089255d5a0f3578c5 data/ars_nouveau/recipes/ritual_gravity.json -12788526ae408bed10dc9f31583b414def9e211d data/ars_nouveau/recipes/ritual_harvest.json -0f8b17e3a63618a33264f2d3749521d4d1093d33 data/ars_nouveau/recipes/ritual_moonfall.json -c6a48710eda8437d30f04e5266493a3ad531914f data/ars_nouveau/recipes/ritual_overgrowth.json -6c1b5b56997b2d8fefbc804234ef2aae1ca8878c data/ars_nouveau/recipes/ritual_restoration.json -b3f9527970e1c22cc278e5814fccb3b740f8c2cd data/ars_nouveau/recipes/ritual_sanctuary.json -b2553e40217ee6878fff79516fb808401026ba22 data/ars_nouveau/recipes/ritual_scrying.json -1f32a8dc90daa70659eeb284a0942cb1547d4a77 data/ars_nouveau/recipes/ritual_sunrise.json -052f2cfef8e61d0b8202b5719c41c66b8d88ffc0 data/ars_nouveau/recipes/ritual_warping.json -c118f8a8e09a2ef8245c71e29c3da1ecd0958b8b data/ars_nouveau/recipes/ritual_wilden_summon.json -22640671f5fe7ffb83431129d06700743e753388 data/ars_nouveau/recipes/rotating_spell_turret.json -69965c9fbaa44ee5de6a30740840bb81da80228a data/ars_nouveau/recipes/rotating_turret_to_basic_spell_turret.json -a103980ba04e72676d87db3c6c743a0ceb9b3cc2 data/ars_nouveau/recipes/runic_chalk.json -c6773e70311fca9281f26d082dd9859ef286157f data/ars_nouveau/recipes/sconce.json -ee3252e115c44d2601f3d2c8b29842a685e6ac83 data/ars_nouveau/recipes/scribes_table.json -1cdbc48acf7df9290a17db1a078c77091c44fdd3 data/ars_nouveau/recipes/scryers_crystal.json -49ac7070dc0a0d761c47ad0db54e0f9a84f88c88 data/ars_nouveau/recipes/scry_to_blank_parchment.json -e437df6c746607aede25f9cf6abb18477a682f1f data/ars_nouveau/recipes/sky_block.json -4e59cb42bdfa1ddc1a8ec8fc78f15c5c1cae3a87 data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_slab.json -6e8e3eed13bb34e4069e4a58259256114163a034 data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_stairs.json -62e7315992f4c45a19a1773e3d7aa69da73e6589 data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_stonecutter_stair.json -43246e07bb14c6f3c70755a1d5681af20589e6a3 data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_stone_cutterslab.json -d190b2110ec2b4f16b89a04ccd7b8a03ecff2759 data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_to_sourcestone.json -7cd48b922d1db29d4950986f46d3ff735fa723e5 data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_slab.json -f9fc0c05da9b0e979f9d74b6adfdae4f0ec5d33b data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_stairs.json -e6f9810cae9d9462a8b95a30515eac469beff5b2 data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json -cd63e80ec5f4ee6990fc012522fe5ac8569d43e3 data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json -90cf649b86540fdef86c36f21b7c85a5015d1897 data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_to_sourcestone.json -cd86800d877584df28c67b0e17951d1537d39c5c data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_slab.json -1d2ffa6b903ff0352b95d7cac1423d47aa5ebd6e data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_stairs.json -56f63cd691b09534bd24e2bae4a4eb4500e8dd26 data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json -bcc4f4f097dcf46f3b0e142d8444176982288d1e data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json -d42d9bacbab0f88244298cbcc86dfe909d49ff92 data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json -379e216ac51a19c59f513f74c668cb667898d890 data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_slab.json -d6810a30883c1a2f8ad135212460739a7d3bd1ca data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_stairs.json -9662e70f840fbde57597895d63b4b266d79186a8 data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json -4f211286e1168b83a38a7e282d8582fbb47613b4 data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json -d1aafea920c9f3b22d5195735647f4f1942ec747 data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_to_sourcestone.json -b6914a98179439fabaf410880a2287f8cfb180f0 data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_slab.json -7ad614c46403c8b3092bd945e8d13b20fa6e03ef data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_stairs.json -fe79c707f281392de353eaa7ef0c0d7dea7e9ab2 data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json -9f9fc32672b42ec3725bf24d3c88d09ee2a8278b data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json -8cfc405a45fea1c453368e45f8ecce92e44183dd data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json -5bb028423bfe7b5dea78d0058da74e2fab0659b1 data/ars_nouveau/recipes/smooth_sourcestone_alternating_slab.json -4baa570229fd9dedeefc4622d439777c6c88c303 data/ars_nouveau/recipes/smooth_sourcestone_alternating_stairs.json -b814ce26813def7d8d999870c36a70779a2cae03 data/ars_nouveau/recipes/smooth_sourcestone_alternating_stonecutter_stair.json -355a77766fe35c67808f67034d58704a5e16373d data/ars_nouveau/recipes/smooth_sourcestone_alternating_stone_cutterslab.json -28e529623c6fd0ae0199b0579ab8c7acd50f5d83 data/ars_nouveau/recipes/smooth_sourcestone_alternating_to_sourcestone.json -40b2cd9c8242a1612f52decf83acd3096d36f60a data/ars_nouveau/recipes/smooth_sourcestone_basketweave_slab.json -e011e0faf384b99b45e749b2897aadbc7735ffc7 data/ars_nouveau/recipes/smooth_sourcestone_basketweave_stairs.json -fe55f76c446e06c486705b8157583ef37fc28f35 data/ars_nouveau/recipes/smooth_sourcestone_basketweave_stonecutter_stair.json -2f39eeca74d0b5772d473a01e149d0ff0abb1e62 data/ars_nouveau/recipes/smooth_sourcestone_basketweave_stone_cutterslab.json -5ed1860069ff30e4afe0f877fabc9ee736da4939 data/ars_nouveau/recipes/smooth_sourcestone_basketweave_to_sourcestone.json -9475b1d1f64713543883dea78ae89774a1822fea data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_slab.json -3f6ed13b9cb73391ea10b9c8ddda2dc89d883ef1 data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_stairs.json -32f7618a6f427bb703a1c6df288160d11c05cb24 data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_stonecutter_stair.json -1184a9aa333837863acf6b85029ae6893e5e5e64 data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_stone_cutterslab.json -99c5a19f37663b1172b3b338b2b65ee16f8d60b2 data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_to_sourcestone.json -4ab4ac0137206c344d7bcaf27d8c1294511d569d data/ars_nouveau/recipes/smooth_sourcestone_mosaic_slab.json -0d35f4e8ff09e7b39331837b3a248be98c27d80b data/ars_nouveau/recipes/smooth_sourcestone_mosaic_stairs.json -eefe61a069a5b63c4dfdc04eabd8efe594f65ee7 data/ars_nouveau/recipes/smooth_sourcestone_mosaic_stonecutter_stair.json -f02f80c2d5e4b9f4efbc12b41aa5bbf0ec973916 data/ars_nouveau/recipes/smooth_sourcestone_mosaic_stone_cutterslab.json -0993eb48717b5bf1f3c6a91f6d7e9ebfdbf70eb1 data/ars_nouveau/recipes/smooth_sourcestone_mosaic_to_sourcestone.json -8d223a547315195fa68114d1efca7ef578c0f5f1 data/ars_nouveau/recipes/smooth_sourcestone_slab.json -f10f2924cbdfd538dbea9e36d4cf647c278c9692 data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_slab.json -4648452ba39f915ea689831809a4e98894825c74 data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_stairs.json -f06f6973f12d55f47ccb79cdf61a232875d593ae data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_stonecutter_stair.json -24bbbd83f2b6033396ad890d9b007cc5eaad3255 data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_stone_cutterslab.json -87b7b4725a5dac43f72b2f972cb82773c0b61b0a data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_to_sourcestone.json -8db0884ca16831bd363f70de517b84eb5d8d9dcf data/ars_nouveau/recipes/smooth_sourcestone_stairs.json -da94c5784db6534f1a89ae7aa00dbf086066b759 data/ars_nouveau/recipes/smooth_sourcestone_stonecutter_stair.json -ccd6d3272ecfda6c597736ab5382bce24f881532 data/ars_nouveau/recipes/smooth_sourcestone_stone_cutterslab.json -e6cb25144ee38345ec558d387af01fbb5775373d data/ars_nouveau/recipes/smooth_sourcestone_to_sourcestone.json -86402ce914a4f6563886f21ad0aed238c689505a data/ars_nouveau/recipes/sourceberry_sack.json -c4fbaa90ef7a0f5d8112c9a85a483a28f4698164 data/ars_nouveau/recipes/sourceberry_sack_to_bush.json -105f397daef41a5983e13a1e38ae29c9cc690357 data/ars_nouveau/recipes/sourceberry_to_purple.json -83dea3876695e41e1c923c6289348badca95a6b8 data/ars_nouveau/recipes/sourcestone.json -686f5067a589fac908d1f080b3120264d887b10f data/ars_nouveau/recipes/sourcestone_1.json -f5d4719eaeebeab437df8295d693ae00e402d1b0 data/ars_nouveau/recipes/sourcestone_10.json -2ab6fbc8de1aa9fb17b28c1856843b74c4088f3a data/ars_nouveau/recipes/sourcestone_11.json -1cdebd7adaea90f8cd227003ef7cd548a7b981e3 data/ars_nouveau/recipes/sourcestone_12.json -1ed9101eb5a9b1042a24f1cc5b199bd82f481e36 data/ars_nouveau/recipes/sourcestone_13.json -d09805ce8f7846204883982efd29e769f6cdc591 data/ars_nouveau/recipes/sourcestone_14.json -19d7d57e615bf74a03000d2a3f7082a6deef9bdf data/ars_nouveau/recipes/sourcestone_15.json -7d07f840321cad0a7f1d01fcc504c8691a1e2047 data/ars_nouveau/recipes/sourcestone_16.json -1ff1fc98650d3d65ec77793edf1b7cc6f49316fb data/ars_nouveau/recipes/sourcestone_17.json -45e49ef3532024d3b23af1ef0cc6dd5f0b312652 data/ars_nouveau/recipes/sourcestone_18.json -3cd07157ed5f8280e8382766fb18254a3b64ba13 data/ars_nouveau/recipes/sourcestone_19.json -438fb83cc3e43520b33fc9403d7f84ac711792ad data/ars_nouveau/recipes/sourcestone_2.json -bd1d20b013e9a19ed17e1ba1657628323b736ede data/ars_nouveau/recipes/sourcestone_20.json -bf8d10c4965dca553dd28150758117fc49830ba0 data/ars_nouveau/recipes/sourcestone_21.json -3f571cd307caf7a7499ac9457a5f0034cb0fde0a data/ars_nouveau/recipes/sourcestone_3.json -e555d8d7faf391471076075f0e5181343927ebdf data/ars_nouveau/recipes/sourcestone_4.json -38e5d75fb68fc94277e6fef5a798fa0e8c10c32b data/ars_nouveau/recipes/sourcestone_5.json -656f75430307fa29842826549670b92a4760fc20 data/ars_nouveau/recipes/sourcestone_6.json -d3dc783e8f8142014f1573195c11b981677ff278 data/ars_nouveau/recipes/sourcestone_7.json -28b3b751e680dbe327229205649690b2ac7d1d9f data/ars_nouveau/recipes/sourcestone_8.json -44e5818dbab70c01b0e832549f0e76257b722bd3 data/ars_nouveau/recipes/sourcestone_9.json -9219b14018ae83510e361171b1eb4b1484276868 data/ars_nouveau/recipes/sourcestone_alternating_slab.json -d5af6f489a8ebf8034cc265bd45b2affbd0883c8 data/ars_nouveau/recipes/sourcestone_alternating_stairs.json -31784187304d8469deb5331313b0d33d5a08055b data/ars_nouveau/recipes/sourcestone_alternating_stonecutter_stair.json -fe78886d60b78718936ff67e7f8a8f0883499b06 data/ars_nouveau/recipes/sourcestone_alternating_stone_cutterslab.json -a6a2bdd2a7c9e17b8d56401ace3766fa96980b11 data/ars_nouveau/recipes/sourcestone_alternating_to_sourcestone.json -cfc4af9af3bbe90a701b3d1444112bc582250561 data/ars_nouveau/recipes/sourcestone_basketweave_slab.json -18d2a2217a5a390e888bcea9870a0206e9681f8f data/ars_nouveau/recipes/sourcestone_basketweave_stairs.json -347fac73c0a4bbc30c4a7fa35d04392e8b4cbf32 data/ars_nouveau/recipes/sourcestone_basketweave_stonecutter_stair.json -ad95fd917e4e92317a824f3c173d8e2111348e92 data/ars_nouveau/recipes/sourcestone_basketweave_stone_cutterslab.json -b11fd115cd5caa2bfb4e49df10825f658e60891c data/ars_nouveau/recipes/sourcestone_basketweave_to_sourcestone.json -09204e2bcbc72778615e949c600f25137752562d data/ars_nouveau/recipes/sourcestone_large_bricks_slab.json -e37677e62cc78eae542df9bc06fbae3d2b11e92d data/ars_nouveau/recipes/sourcestone_large_bricks_stairs.json -aba9ad04eb06fcc09339866c37a494377752afec data/ars_nouveau/recipes/sourcestone_large_bricks_stonecutter_stair.json -4dd292f3d30bc72af0dd62402448b3cbd551fce3 data/ars_nouveau/recipes/sourcestone_large_bricks_stone_cutterslab.json -d68e4bf5af76ccf9b8616710a2b0137d9fc53b63 data/ars_nouveau/recipes/sourcestone_large_bricks_to_sourcestone.json -948591f19c1be1fb372e38c6d58b22d826af42ae data/ars_nouveau/recipes/sourcestone_mosaic_slab.json -7efb798637b0d798d3dc890f8fd436b732945349 data/ars_nouveau/recipes/sourcestone_mosaic_stairs.json -95ac722216d4eb200b4ff4ac32309bae8b03703d data/ars_nouveau/recipes/sourcestone_mosaic_stonecutter_stair.json -d569206a7dbcafc28673d3578543bcad8a4585a1 data/ars_nouveau/recipes/sourcestone_mosaic_stone_cutterslab.json -8d46b12badd8d0470598ed368754477ffb785cb4 data/ars_nouveau/recipes/sourcestone_mosaic_to_sourcestone.json -33cdab07f36bc280af8f1e06e12dde4504e7fe7f data/ars_nouveau/recipes/sourcestone_sconce.json -2f9438d10eada6b495483929ec4ed925cb76c076 data/ars_nouveau/recipes/sourcestone_small_bricks_slab.json -5fd9581519924b0b0f547f464f083c02a78ea34d data/ars_nouveau/recipes/sourcestone_small_bricks_stairs.json -85fcc0df44ae5fa93c405ae3cefea34afdf0f04f data/ars_nouveau/recipes/sourcestone_small_bricks_stonecutter_stair.json -efc067841a618abc7635b3e962efd067c10e44ac data/ars_nouveau/recipes/sourcestone_small_bricks_stone_cutterslab.json -6cbc846116a928a5db93569592849fd053b1caac data/ars_nouveau/recipes/sourcestone_small_bricks_to_sourcestone.json -ee087b1a429b7414ec0765910da0c8458ae34b7d data/ars_nouveau/recipes/source_berry_pie.json -4e28b5f50a27990e77ef595e1f1a15cf8a15f8e3 data/ars_nouveau/recipes/source_berry_roll.json -26fe44f96843396960d06044306a18a464d3b8bd data/ars_nouveau/recipes/source_gem_block.json -64c1202210e826be1175188dcffc4678d785e1ab data/ars_nouveau/recipes/source_gem_block_2.json -2eebd504513cfb6ff54688714e39585dfc8151e4 data/ars_nouveau/recipes/source_jar.json -a8e9cfb8c4323aa8a8c68667cffe5ddebd29ed0b data/ars_nouveau/recipes/spell_prism.json -5552f529a2ea476d9c81af9eb45f7b5d85d70ef7 data/ars_nouveau/recipes/spike_to_arrow.json -5633df06340adbb5ef81fd55a6eca76ece50abb9 data/ars_nouveau/recipes/spike_to_dye.json -7e0a18171b362f24867be9e91ed96aa2b6a7ca94 data/ars_nouveau/recipes/starbuncle_shades.json -d0cbd3b7d0a9856b9ba271e30840a77067d6dbd4 data/ars_nouveau/recipes/stripped_blue_archwood_wood.json -c1b39f32c8eb0c8af0e0806caab030aac9ba07ae data/ars_nouveau/recipes/stripped_green_archwood_wood.json -b0622456bce670918d14531ee0e3f204f4bbf365 data/ars_nouveau/recipes/stripped_purple_archwood_wood.json -5bd22e17bb0689799e70c0457cbbc5ab01eee8f9 data/ars_nouveau/recipes/stripped_red_archwood_wood.json -e86158e1c621924cc81653f3bb6319560acb1c7c data/ars_nouveau/recipes/sunrise_2.json -77aaadb85cfab2054ef8c0052a4cca1daaa4c03c data/ars_nouveau/recipes/vitalic_sourcelink.json -2ae082929e6a81ec53c6dc165ae0d93cd09f26e0 data/ars_nouveau/recipes/void_prism.json -b0d141a806d38be4f66262ca0fca5e864af65903 data/ars_nouveau/recipes/volcanic_sourcelink.json -060ae21eae8acec76bd2cad48989176d2a062548 data/ars_nouveau/recipes/warp_scroll.json -7cc82e182a17f59715871f4e39e5149602052216 data/ars_nouveau/recipes/water_essence_to_bucket.json -d8e64d0c8b1f74d6e8e6bc26941b2e27956d1118 data/ars_nouveau/recipes/water_essence_to_obsidian.json -b4ad39bc045b261d56ccb7e0986f80977faeac9f data/ars_nouveau/recipes/wilden_summon_alt.json -56e2ad0a4cccb91dc81c3d9947ed0d9d3c2e8ede data/ars_nouveau/recipes/wing_to_leather.json -a80d6fd5fdc53764124cdd9b9b9dc2e22e4cb4de data/ars_nouveau/recipes/wipe_spell_parchment.json -8ffb544702c8fe2dabb7256d878e27e8d2b1ace7 data/ars_nouveau/recipes/wipe_starby_shard.json -aaee980d0bd3ebf36b4c0c322f182af8739162cb data/ars_nouveau/recipes/wixie_hat.json -101f88c002780d0a9eaacb9388268fb3ea2627a7 data/ars_nouveau/recipes/worn_notebook.json -85ee0bd3155a5ae82a7f5fbedb0724841bb0f9da data/ars_nouveau/recipes/yellow_sbed.json +// 1.21 2024-07-05T22:41:47.5546454 Recipes +a76e5d9eef406841f56740535ec2afdd509de507 data/ars_nouveau/advancement/recipes/building_blocks/archwood_button.json +443515bb80018fbe37a128cb6849f5e818be315d data/ars_nouveau/advancement/recipes/building_blocks/archwood_door.json +4dfc3afae271aae8423d20dedb67dc601ff71fa0 data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence.json +555bfa84b8d917ca5638f2d0dc23108870a9bc7b data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence_gate.json +def127a7c0f29fad76cdaf9b743e36ef45328afe data/ars_nouveau/advancement/recipes/building_blocks/archwood_pressure_plate.json +2a416ecd7c9492d109f8dafb77314b51ea1ded48 data/ars_nouveau/advancement/recipes/building_blocks/archwood_slab.json +acae2362e9f3cd7a9935b9212b0ab3c8d0eef4b0 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_alternating_slab.json +f622578994052016b073f7aa8e80e9e98b39e7be data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_alternating_stonecutter_stair.json +9afdd42458a184c5761f459ed9780000b8203ed0 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_alternating_stone_cutterslab.json +078674526af2c5edf85d86d01059c2c8c895d18c data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_basketweave_slab.json +0089d7cd0b7f7210b0724e7956efdbd2c978b695 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_basketweave_stonecutter_stair.json +ef2363a53b3a5ca6b42d1b9ec48913e8a0057aba data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_basketweave_stone_cutterslab.json +d650ef0c4aa6837af4b3bee3c8661411ec1fa6e7 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_large_bricks_slab.json +7a7f51a16d4ee55cbdf9b1401c6ed2f5b446b239 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_large_bricks_stonecutter_stair.json +1050f3b7be67aeefaf50aaaa092af4fe5ffdfd44 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_large_bricks_stone_cutterslab.json +f833f91bb48646b21e69692fb205678de6d22a2e data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_mosaic_slab.json +2ab749ad52394319df6600d750a482fc68c1e767 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_mosaic_stonecutter_stair.json +efa780b453dcff5ec504342f3abacdfbf03ecbab data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_mosaic_stone_cutterslab.json +dc20aa018cf8af561123260fdaa5ba9c02cdd82d data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_small_bricks_slab.json +3a187cea09031d8a7d75efad0fb5963bfebe02c4 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_small_bricks_stonecutter_stair.json +721fb0c7512c13e39ee0c66412646b8b69517d16 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_small_bricks_stone_cutterslab.json +236bb8bd26f6fd83715c747e389df29a2367cd38 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_alternating_slab.json +16eea23e43b517a9a3015fb8520fe1e5e5ed9ee1 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stonecutter_stair.json +ff32ff93931cc54a01a3dd47a021d4af47d6acc3 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stone_cutterslab.json +ddebb03f58448735210895ff13c5c1762c9a112c data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_slab.json +6a6eac4de0111e461fd5c3005e02e848fead529f data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json +af930a48344ba532c7a69cf15634e13458a826ec data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json +f1cb018ad70a83b05186e4d4822074cc975f06a1 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_slab.json +ed97fbda1c2262195ac3313c6e1aaa71918dbace data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json +5892375df57cc93c25283121e23dc65a627abadd data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json +6594e9eafd49193aee6d2cb9fa481ac7a80704d3 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_slab.json +a8c6d0d203453b90a20383fa92155a9b40827974 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json +a69d99414109b9d806ea4d084e13ef58294fec60 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json +9e920332e1c8ca217c15cd7a2e5fc785cfd71bb5 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_slab.json +a7bb35e3c2ffd1c3875d49588bc62181fee818b0 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json +960674ea166c33a4725a3c79993f8a49c6c01598 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json +e40138c4c84ea03c321debb52d5fdbeac59dd58d data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_alternating_slab.json +1775d41f83e81773725c4e060f44f19db61229ed data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_alternating_stonecutter_stair.json +545494407451ce5e534116aa047979ab79f9ee02 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_alternating_stone_cutterslab.json +f598288c789715f023c80c320a536fe7cb3283af data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_basketweave_slab.json +0ced393f47eb27c7a310d40a018b673be87b4b39 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_basketweave_stonecutter_stair.json +75d37aa86bb76534fca38428eed5ec5ac51b8778 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_basketweave_stone_cutterslab.json +2b5e688501f86d0d08c48ede453bd60e628dfd65 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_large_bricks_slab.json +0dd7fb8eafa45f1889540fa7459dcdd161a525ee data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_large_bricks_stonecutter_stair.json +623cf69535c7681b51b623c924ed38fcc4164a97 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_large_bricks_stone_cutterslab.json +14a5c7b3f502f4074d4af0ffe02907e463bd2ede data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_mosaic_slab.json +6f170e79b34a0f66c0cf7c3ff31fe7c6d2b7cd2d data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_mosaic_stonecutter_stair.json +1c6dbfffbb46fd90b889fb2f9b23f8d3b4c4d5cb data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_mosaic_stone_cutterslab.json +46e3735a1c31c396a9306dbfd48911387a40e740 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_slab.json +f822ea7d8ee0625be3ceb049f083939bbb2571d9 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_small_bricks_slab.json +9e944db43d890264df8bddacb306c6117e027b60 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_small_bricks_stonecutter_stair.json +ac4885ad10139b4019d931a904ca7726c292882e data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_small_bricks_stone_cutterslab.json +78dc0d1b15d6ce7b550ef61be56ba2ab0c0e84f7 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_stonecutter_stair.json +911edbee487fc32a143650648430faeb6b10c818 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_stone_cutterslab.json +1a48420aa9cd65137f3f339d46fba6aecc97a153 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_alternating_slab.json +5900b60ebd7e23a69b9b9b3e6cfb43d54c0de6a3 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_alternating_stonecutter_stair.json +e75f405d103a49e0390f020dcc8bd12dca01a77a data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_alternating_stone_cutterslab.json +ff4325d9957220595f9d9a0b1b0f2112f8db373e data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_basketweave_slab.json +31f5b6aaaa27aefe59594352b9e9818f054e5400 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_basketweave_stonecutter_stair.json +30dd9aa4e573a42b45a61c1d71aab0b094c89c76 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_basketweave_stone_cutterslab.json +c964d23995e4621aa26de3c579f193d96d18beb2 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_large_bricks_slab.json +472bf065e4180a91215633ee45954b79c71e5930 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_large_bricks_stonecutter_stair.json +4cd5bb29ca543cf6784beb5b51e527c307d23811 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_large_bricks_stone_cutterslab.json +1c36285d9b015cd3bed1e797f58dad8ab6fc6d69 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_mosaic_slab.json +0e9005aa01b1f981869f3f0898a7cde54e1562fd data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_mosaic_stonecutter_stair.json +58a72ea39e76cb7996cecfd9b76f4d9d792b9b62 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_mosaic_stone_cutterslab.json +b02dbe5c8976cb25f4beb11a85c01fb677d97d55 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_small_bricks_slab.json +f27a3b46b1aa7331a4eee2e7cbb351f7b4194bdd data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_small_bricks_stonecutter_stair.json +b3d4856ab21f3709c7bd375b55d5a5ad7bd9b6cd data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_small_bricks_stone_cutterslab.json +a028196e811c34f73ae9345be697b90244bde7af data/ars_nouveau/advancement/recipes/building_blocks/stripped_blue_archwood_wood.json +ae1cbf18f4372832fce1954024bf06642754fabe data/ars_nouveau/advancement/recipes/building_blocks/stripped_green_archwood_wood.json +3c24b90a75b046dfe7fb5d48e0db151ff492cbc9 data/ars_nouveau/advancement/recipes/building_blocks/stripped_purple_archwood_wood.json +9504299723911a9c0961b0f63c3a5cc7c49e6db0 data/ars_nouveau/advancement/recipes/building_blocks/stripped_red_archwood_wood.json +0bfb5848184aedfd2de89f2a7ce59eccbed3acb6 data/ars_nouveau/advancement/recipes/decorations/sourcestone_1.json +217cbcd7ec0889c2ed3879a5ad33ec5399bf3a5f data/ars_nouveau/advancement/recipes/decorations/sourcestone_10.json +fd3820b9df1ee0f44fda86f125ed34e410eb254e data/ars_nouveau/advancement/recipes/decorations/sourcestone_11.json +83a99f5b2ab8b347be80539551ffd99231189607 data/ars_nouveau/advancement/recipes/decorations/sourcestone_12.json +c361fd29bbb99f506ca12170021e9c38cd122554 data/ars_nouveau/advancement/recipes/decorations/sourcestone_13.json +2eb23bb53b36c2b3a54fee9b81f8079d604aa1c7 data/ars_nouveau/advancement/recipes/decorations/sourcestone_14.json +f947482197d70818fa29c9f4b3946cd39a0ff9e9 data/ars_nouveau/advancement/recipes/decorations/sourcestone_15.json +d953a2a42d765ee356f49362a86893c87c3645f5 data/ars_nouveau/advancement/recipes/decorations/sourcestone_16.json +813ce753869a767b0efbad254379c042f05b73e4 data/ars_nouveau/advancement/recipes/decorations/sourcestone_17.json +4df57f064fddb9dde116c51834fb182657649bfc data/ars_nouveau/advancement/recipes/decorations/sourcestone_18.json +9455b7cb4022b55b4d0f91b461584f5cd356b7e2 data/ars_nouveau/advancement/recipes/decorations/sourcestone_19.json +fcaead1d634ab9537bf157e7f5b2af1659e974cf data/ars_nouveau/advancement/recipes/decorations/sourcestone_2.json +5724f06e4412c74414637c9862173a77e6f3f208 data/ars_nouveau/advancement/recipes/decorations/sourcestone_20.json +a086407503fea0af68f8fd71820df368a0db4bf0 data/ars_nouveau/advancement/recipes/decorations/sourcestone_21.json +c21aa876357f5281b61f927bb3f292dc724a1518 data/ars_nouveau/advancement/recipes/decorations/sourcestone_3.json +1cda35e2d1d5eb50287d60c2d6d3a42d94cba36a data/ars_nouveau/advancement/recipes/decorations/sourcestone_4.json +74d4c1acd7dafa408a02f477bdf0d14371bc0738 data/ars_nouveau/advancement/recipes/decorations/sourcestone_5.json +bd6327a7a111128918f5fe8becca698c82bc4bfc data/ars_nouveau/advancement/recipes/decorations/sourcestone_6.json +06e5e009f02c83478cde570b296020f0736c438d data/ars_nouveau/advancement/recipes/decorations/sourcestone_7.json +33c52bd0c40a146e5b469e83bc95f141154be813 data/ars_nouveau/advancement/recipes/decorations/sourcestone_8.json +77faa19b8deb8942a14cb2e9e4b59167e12627cf data/ars_nouveau/advancement/recipes/decorations/sourcestone_9.json +dff19d1f78f12c4a744c10d8641c118dfa423cd8 data/ars_nouveau/advancement/recipes/misc/agronomic_sourcelink.json +39b1a153bd894af852d6c6da19e8f7fe712c9a8a data/ars_nouveau/advancement/recipes/misc/air_essence_to_snow_bucket.json +9d503500b088e272cbf6142cf62850efa0412288 data/ars_nouveau/advancement/recipes/misc/alchemical_sourcelink.json +ff5ad5968ba408751617333eed8b010958504587 data/ars_nouveau/advancement/recipes/misc/allow_scroll.json +15bb5ae5bd54f2c65512f5fc3834703844d96b04 data/ars_nouveau/advancement/recipes/misc/alteration_table.json +f2dff2e9a6bfcc46831335dca3e7c9aab16d78a4 data/ars_nouveau/advancement/recipes/misc/annotated_codex.json +59bc41df7fdc4ce872c6b3fc91d9c45ffb74aad6 data/ars_nouveau/advancement/recipes/misc/arcane_core.json +41dffa0b4b8ae8d44847841f35db31dfbdb76109 data/ars_nouveau/advancement/recipes/misc/arcane_pedestal.json +ac40320cca59dd0638b1b193d7914451f4f28039 data/ars_nouveau/advancement/recipes/misc/arcane_platform.json +184781612584160baf8103c9a056d7e4d9aece94 data/ars_nouveau/advancement/recipes/misc/archwood_chest.json +8dbda63b9ccfeb5a9c92fdbe1200231e4e52eea2 data/ars_nouveau/advancement/recipes/misc/archwood_planks.json +2e416567343ab261eabe13203acd032ac550a3d0 data/ars_nouveau/advancement/recipes/misc/archwood_sconce.json +7a498e23b2bf3ee47abec88a833f894747134258 data/ars_nouveau/advancement/recipes/misc/archwood_stairs.json +a904ce4aeb217411f81762754850ee3dc6f8178b data/ars_nouveau/advancement/recipes/misc/archwood_to_chest.json +fe2d63b2c1ab989576d865de606e933041d432c9 data/ars_nouveau/advancement/recipes/misc/archwood_trapdoor.json +4188bbc9ea2e3daacc75e5522090d2e104ce125f data/ars_nouveau/advancement/recipes/misc/basic_spell_turret.json +88b3efa21297b86c0ea30d671c747f788db9ca19 data/ars_nouveau/advancement/recipes/misc/blank_parchment.json +2e3971fe417ffe9c3cc9f129f1958e8a9c7d1179 data/ars_nouveau/advancement/recipes/misc/blank_thread.json +1a7b11ebce4db493ec50cf75cba887031da1f10f data/ars_nouveau/advancement/recipes/misc/blue_archwood_wood.json +93e1fcf252f3070b7f8177b7bc53a40afef1b50a data/ars_nouveau/advancement/recipes/misc/blue_sbed.json +322033a1b280739bdbdb1727bcff7a062543f295 data/ars_nouveau/advancement/recipes/misc/challenge_2.json +7da8bc295360a5593768f48cb28969e176ed9c26 data/ars_nouveau/advancement/recipes/misc/clear_allow.json +bd84245ddb990572c5b7c28344abbef91b6afffd data/ars_nouveau/advancement/recipes/misc/clear_deny.json +3b9109fa6d74c9ea53ec1c988f11d63b82b158c8 data/ars_nouveau/advancement/recipes/misc/conjuration_essence_to_end_stone.json +51662ebf31064f23ee492a65c57354e3f379b3b2 data/ars_nouveau/advancement/recipes/misc/conjuration_essence_to_soul_sand.json +aeb58692a9a5d2ae343fb99c63c6e5b4face1165 data/ars_nouveau/advancement/recipes/misc/deny_scroll.json +ce68133533f50f14cb4e0aeb02bd95394eac1ee5 data/ars_nouveau/advancement/recipes/misc/dowsing_rod.json +ed76c3b2b1ae1548374d4b69476df1cf5f8e6c6f data/ars_nouveau/advancement/recipes/misc/dull_trinket.json +c029261ba3b02679f2c85b220bd57417a060f246 data/ars_nouveau/advancement/recipes/misc/enchanting_apparatus.json +cf5734766cf8f986445f4fb5120b2055083868ba data/ars_nouveau/advancement/recipes/misc/experience_gem.json +6e9008bf44e6ffa8e88a68e5990bd18d155708d3 data/ars_nouveau/advancement/recipes/misc/falseweave.json +af6da5b189736af8b7ce4a6ad9705a20dc95a7b8 data/ars_nouveau/advancement/recipes/misc/fire_essence_to_charge.json +2d4c590e01929f845a708fd67e6b7062ca4bebf0 data/ars_nouveau/advancement/recipes/misc/fire_essence_to_magma_block.json +e5e55d984db9ed44d27d9f12395375b9b1e22c77 data/ars_nouveau/advancement/recipes/misc/ghostweave.json +20fd074b90697747ac8740a3f13aa5b02c1fd2e6 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_alternating_stairs.json +43ed4e25b959439bff96f0a49cd1e4e40849c6f3 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_alternating_to_sourcestone.json +e1164262fe3158d03e9294ed0e850ec2299c1f1f data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_basketweave_stairs.json +12c4f697a4fbdc62c181f051ec0d6313f38f8330 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_basketweave_to_sourcestone.json +fbf73c4a98c3e43cdd895f124f4753748167f253 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_large_bricks_stairs.json +ba1b8a4c0e97363afc109a4be7effea8022519d1 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_large_bricks_to_sourcestone.json +692f74b3cbe8b2a26c2cfdf4b1c47048dc4bebd0 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_mosaic_stairs.json +1f6485887ec84595cc337327b67521363dccafd5 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_mosaic_to_sourcestone.json +0d86f240a2082b164a10e625ce962797a48278cb data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_small_bricks_stairs.json +21a1edbc70d25bc82e638a9836727b1ba960d471 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_small_bricks_to_sourcestone.json +fb08def3440513871b80cc47607bd9c5f7f645e8 data/ars_nouveau/advancement/recipes/misc/greater_experience_gem.json +0c3e6e5c6de7eab2f5b766f1780384132ed3ae16 data/ars_nouveau/advancement/recipes/misc/green_archwood_wood.json +165804892abcc34d9c826c841312e896362c9d7f data/ars_nouveau/advancement/recipes/misc/green_sbed.json +583682c3debd35d4ccf520ea0c42e9958082aab1 data/ars_nouveau/advancement/recipes/misc/horn_to_bonemeal.json +b298653b4c8246d9f54e6a625b671e7e6555dfba data/ars_nouveau/advancement/recipes/misc/imbuement_chamber.json +984b6dbb7e4cee65805d9fb7d0af59cac8007bc4 data/ars_nouveau/advancement/recipes/misc/item_detector.json +3cca43487ce3210de82f148837fa2e28809e9f11 data/ars_nouveau/advancement/recipes/misc/magebloom_block.json +c55767bb1ffcbfda3df3d07a9f62b5d13c137b49 data/ars_nouveau/advancement/recipes/misc/magebloom_block_to_magebloom.json +4e8d24e618c749de6bf4954d92eb5a0311528f64 data/ars_nouveau/advancement/recipes/misc/magebloom_fiber.json +d4e9027c9656ecb4974bfe8bc93a179e8975aa31 data/ars_nouveau/advancement/recipes/misc/magebloom_to_pink.json +cb993034dd83cf99abbcccb2365f18809f886768 data/ars_nouveau/advancement/recipes/misc/magelight_torch.json +9e315dede142b1d4fb61d0f5c4b289ad74bd378c data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_andesite.json +bdd327175bdbf17ff207d9bb8ab410d8194a0413 data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_blazin_sapling.json +ed79f8d415273a281bc1326ce41197f0dd125802 data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_calcite.json +d752f09cf359a1abd87d6ee030ba35d1c6d79018 data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_cascading_sapling.json +d3a7dc16eeb8685b7d8dafe881d6a392ef51de94 data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_deepslate.json +4d38c26b159df5c4c2c3dc59d5c35ede4fadc320 data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_diorite.json +769520d0389fc2674af93c23f431f1401f251df8 data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_flourishing_sapling.json +aa56c9db3a48ca9494abb404c6762f859f3a72ed data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_granite.json +8838e4822ebfbb59f6ad6b5e09eda9f7814cce1f data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_grass_block.json +7e7b64d8a57cf495af3b7f7448f45dd78d3897b6 data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_moss_block.json +d912575a1c027c166dbb79bc21fe0a0d83f74a13 data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_mycelium.json +281be0bb3b58787889e6f90546b398c93c82ed0d data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_tuff.json +2455dde539f665d6af904b2625f29026c46ee08c data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_vexing_sapling.json +f6f9ce0e87bc1e86a77a14e0d733955e615c5b31 data/ars_nouveau/advancement/recipes/misc/mimic_scroll.json +50e8dc4fb0c1c59c6d6915514a81d435a12d7c9c data/ars_nouveau/advancement/recipes/misc/mirrorweave.json +5ffb4999e39135815ed73f3e1b03fdcbd9a70028 data/ars_nouveau/advancement/recipes/misc/mob_jar.json +ebc4ca30ff3290926a30485b72ab6c4a7a288bbf data/ars_nouveau/advancement/recipes/misc/moonfall_2.json +1b554c4e460b09ab8dfa3fbe86d54d25deb34f39 data/ars_nouveau/advancement/recipes/misc/mundane_belt.json +fcbdea7a47c81d7b81d78dc923da2b6e8f053c62 data/ars_nouveau/advancement/recipes/misc/mycelial_sourcelink.json +8b0d8a29fda79d30b45a74888be2a59e6a78f6f4 data/ars_nouveau/advancement/recipes/misc/orange_sbed.json +4359acbc033050e0ed9799a3bfd98b885b3a9cf5 data/ars_nouveau/advancement/recipes/misc/platform_to_pedestal.json +0e66cca3efe59a05c6bdabe7b4402b6eeabb95a4 data/ars_nouveau/advancement/recipes/misc/polished_sconce.json +c7de7a1254dac01e3fb7489ea3b4bc99489b3b02 data/ars_nouveau/advancement/recipes/misc/polished_source_sconce.json +1067cdecf290cb72fc49d7cc335f1ac1d2df23ff data/ars_nouveau/advancement/recipes/misc/potion_jar.json +704e2ff8179f368d1f281beb28517186f944d2e5 data/ars_nouveau/advancement/recipes/misc/potion_jar_empty.json +1c40654d6e633350cb0b63bb6fa22d592640292c data/ars_nouveau/advancement/recipes/misc/purple_archwood_wood.json +418fbce7fb5bbccda8c8c552efa0191f0a324892 data/ars_nouveau/advancement/recipes/misc/purple_sbed.json +4da9eef356a8e78fbc35c6d64e12fc70cd2a2a2c data/ars_nouveau/advancement/recipes/misc/redstone_relay.json +bb32cde2de07df7f88b2ebc92986f1d4b3c14679 data/ars_nouveau/advancement/recipes/misc/red_archwood_wood.json +69f6e2bab56586ac49f320eeb09ba6d0c60c8ad3 data/ars_nouveau/advancement/recipes/misc/red_sbed.json +f230680eb5c4b413a6dab4982a27632136878308 data/ars_nouveau/advancement/recipes/misc/relay.json +96008186e68872c56e524c819bdd1d8b6a98657c data/ars_nouveau/advancement/recipes/misc/repository.json +6e07b1ac1089cb77c8d52e4b7eb51f382077bfa0 data/ars_nouveau/advancement/recipes/misc/ring_of_potential.json +93d0f7b6a18a85830f2bdd9bc18e6f25de6fbb23 data/ars_nouveau/advancement/recipes/misc/ritual_animal_summon.json +516c48e6f05c4a8863569d4b5d5d5cd237eef50f data/ars_nouveau/advancement/recipes/misc/ritual_awakening.json +b66daf9b8628197182eb657259add2219e327804 data/ars_nouveau/advancement/recipes/misc/ritual_binding.json +d6c64ae7cba1a4428f6fb6eb5725d70429aac28e data/ars_nouveau/advancement/recipes/misc/ritual_brazier.json +d585a28f9ec5c80c860a880da646a0e1cbd29891 data/ars_nouveau/advancement/recipes/misc/ritual_burrowing.json +3e00274831e0ee9b276e6296042f9058f7a19dba data/ars_nouveau/advancement/recipes/misc/ritual_challenge.json +a169a28459ed5cfb77c9423c2be75020fde5d075 data/ars_nouveau/advancement/recipes/misc/ritual_cloudshaping.json +6a9a6cb103cc5f382c698e02f6ee8f8bc55b39ba data/ars_nouveau/advancement/recipes/misc/ritual_conjure_island_desert.json +9c8e75ad389473120dd72ee1dc6fbbb6c2806f9d data/ars_nouveau/advancement/recipes/misc/ritual_conjure_island_plains.json +035ba59353171683d8e29234b2c140f4e0317377 data/ars_nouveau/advancement/recipes/misc/ritual_containment.json +f7221bb7722eaef8a0ea30dc18f36ca2d67caa49 data/ars_nouveau/advancement/recipes/misc/ritual_disintegration.json +bf6bff7bb9e86bf02874f4791d18af7057e91385 data/ars_nouveau/advancement/recipes/misc/ritual_fertility.json +5854b1f0d7e14337a7226d1c1a2769107fa99d0c data/ars_nouveau/advancement/recipes/misc/ritual_flight.json +66772fe673c2a8728e227bb410fd436466478900 data/ars_nouveau/advancement/recipes/misc/ritual_flowering.json +13acc4426232b1b9da9bf6f63ae55111c6de2f6e data/ars_nouveau/advancement/recipes/misc/ritual_forestation.json +3cf2cc260d4ed276100dd102bca4a56356a377e5 data/ars_nouveau/advancement/recipes/misc/ritual_gravity.json +295991526f870ad8a2713f6f26b31f9d6b712121 data/ars_nouveau/advancement/recipes/misc/ritual_harvest.json +6b948f8a98f03eee270b7e12a8fa1e38843de893 data/ars_nouveau/advancement/recipes/misc/ritual_moonfall.json +a2b6d4898b584b12bea6d560d0c5fbf29149cf4c data/ars_nouveau/advancement/recipes/misc/ritual_overgrowth.json +aae376becfe697176fd3b265e4a4629b75cbd642 data/ars_nouveau/advancement/recipes/misc/ritual_restoration.json +a9a598c2eed61ffef2f156b6aec2d5ad15852950 data/ars_nouveau/advancement/recipes/misc/ritual_sanctuary.json +4f85eabfebd50f55c0352595297738c8f54343ab data/ars_nouveau/advancement/recipes/misc/ritual_scrying.json +ab4423babbbf08ed9698fa451d4041813fe98c0c data/ars_nouveau/advancement/recipes/misc/ritual_sunrise.json +006841c9d6d77511f4275f097693dfa09bd91f30 data/ars_nouveau/advancement/recipes/misc/ritual_warping.json +997e5a8a51ca710dca7fcc46c49b8e7048d9066e data/ars_nouveau/advancement/recipes/misc/ritual_wilden_summon.json +b05fbed6a0c7478199d618b3f26b4d99af9efc9c data/ars_nouveau/advancement/recipes/misc/rotating_spell_turret.json +29bd8737e113c7b1543d7e7d893317d02fc4bc19 data/ars_nouveau/advancement/recipes/misc/rotating_turret_to_basic_spell_turret.json +82b9d17d9f7811b83b7a0e0c7db19d0afb5021a6 data/ars_nouveau/advancement/recipes/misc/runic_chalk.json +fa5266c90fae3ef135d5523c457225605e3b909f data/ars_nouveau/advancement/recipes/misc/sconce.json +91d29bdec0988ec8ea94712570e65858d7de1119 data/ars_nouveau/advancement/recipes/misc/scribes_table.json +85dffb3f1ef831d06f7ec0beb6bfa976c8c561c6 data/ars_nouveau/advancement/recipes/misc/scryers_crystal.json +2c4a2972a0af633956f26482ca37fe33ccc53435 data/ars_nouveau/advancement/recipes/misc/scry_to_blank_parchment.json +b52a5e166239ed32b8b93b330b2a9e7d43789c4e data/ars_nouveau/advancement/recipes/misc/sky_block.json +442bee3c3db279f9cc988b7973cb1cb3e6102f12 data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_alternating_stairs.json +9cffa208cb7232a2c9b4ac609383037c1bb98525 data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_alternating_to_sourcestone.json +27b1490e1058520e1f1c66b0c49b6ff1bcdf3369 data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_basketweave_stairs.json +f10a0f4b647296be5469daa92e5b8b0f9c1445eb data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_basketweave_to_sourcestone.json +2e47ddcc62bb3775f955c15dd8761b306f447955 data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_large_bricks_stairs.json +28cfd90070f17ecee262dfb31e579271a9cc848c data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json +0b5730776b4dd4232da1a4183b3b924fcf7ffbae data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_mosaic_stairs.json +5f66b6d6f8490f471f6eb53b25172ae71fbd04c9 data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_mosaic_to_sourcestone.json +0def42c4240ad1b40014168a0979568f406b7c06 data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_small_bricks_stairs.json +2e649a5b6049237a770a2c331ea6e1a809778f69 data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json +3fd9990348249a9967e41cb61431d6b0882b1504 data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_alternating_stairs.json +71d5edf9dbcda39acf3bfb8a426f13b0d1cc917d data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_alternating_to_sourcestone.json +709175e4bf0c9f5f356ec5174d5aba25e3ed57af data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_basketweave_stairs.json +3b064766fc4f8eb4b694ca40d704de4fc9b4814a data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_basketweave_to_sourcestone.json +14ad843efe394c96211d275db8044cd88d23f0e5 data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_large_bricks_stairs.json +b62bdc459f398a41f2dbe6a867a1165a7994f499 data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_large_bricks_to_sourcestone.json +8fba0b290f4a0f273bd6675039dd508e1838c99b data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_mosaic_stairs.json +019380077fa997a14314970b37e51210c915ee5a data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_mosaic_to_sourcestone.json +c26106da66b9864bc72422c85c8df751d6099c13 data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_small_bricks_stairs.json +9de521bc71c61cee74f407cc30f655ad911a1294 data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_small_bricks_to_sourcestone.json +6d58de9d2b8cc3dc6c074e0dfa6c1ec1d0da084e data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_stairs.json +467fbdae986ac021853baee924d400edf9f0f792 data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_to_sourcestone.json +41943cdd43e1784d00a0352877b28d51defc0a6c data/ars_nouveau/advancement/recipes/misc/sourceberry_sack.json +7fae9d67aa96c6c2641fdf63e2a73311fe475892 data/ars_nouveau/advancement/recipes/misc/sourceberry_sack_to_bush.json +1bc1aa2668cd3af3e50bb2b894f0dd86851e4c1e data/ars_nouveau/advancement/recipes/misc/sourceberry_to_purple.json +1c6aa0f934d18de34772236a077882be418b4783 data/ars_nouveau/advancement/recipes/misc/sourcestone.json +86d6f4a3bd6e988b9bc47f916a7f44525bf192e9 data/ars_nouveau/advancement/recipes/misc/sourcestone_alternating_stairs.json +75ec5bfd504ba4cbed8cc1b0ba32997e7222cbb7 data/ars_nouveau/advancement/recipes/misc/sourcestone_alternating_to_sourcestone.json +c29a360fa70068e3c07167d5899c6242cf17029a data/ars_nouveau/advancement/recipes/misc/sourcestone_basketweave_stairs.json +4dd17377c1407da4fa499fa1495e1764fa80cda1 data/ars_nouveau/advancement/recipes/misc/sourcestone_basketweave_to_sourcestone.json +e4717f22b89d122860734599e4f440959875f975 data/ars_nouveau/advancement/recipes/misc/sourcestone_large_bricks_stairs.json +cf81a21d61397d5b78975991b9ad41e4830178d8 data/ars_nouveau/advancement/recipes/misc/sourcestone_large_bricks_to_sourcestone.json +7f258c667bd762ddd40f03d3fed4ccd1a6407d40 data/ars_nouveau/advancement/recipes/misc/sourcestone_mosaic_stairs.json +981f6183c0644eaf3e9a986010bf94a3334dfd08 data/ars_nouveau/advancement/recipes/misc/sourcestone_mosaic_to_sourcestone.json +e0c811a47839c1fd402983c4c8ef5fa9d7d2414f data/ars_nouveau/advancement/recipes/misc/sourcestone_sconce.json +0a955c1d4c0ea3bd1ec8169203a445f848dd1a07 data/ars_nouveau/advancement/recipes/misc/sourcestone_small_bricks_stairs.json +b8f2593a25b47f91e79bef34fdd258113d044436 data/ars_nouveau/advancement/recipes/misc/sourcestone_small_bricks_to_sourcestone.json +d8e07f32cadfef1920a3f261bb6e443a789dae7e data/ars_nouveau/advancement/recipes/misc/source_berry_pie.json +070781d53653203a45a20a1425177870a2b5e39b data/ars_nouveau/advancement/recipes/misc/source_berry_roll.json +d534fabcb40063e41e50a9e759915a449f618a96 data/ars_nouveau/advancement/recipes/misc/source_gem_block.json +c6c2d1f29264f7653df4c3fa7162224c0a158e21 data/ars_nouveau/advancement/recipes/misc/source_gem_block_2.json +1a6acd884f55925ba6b37be57b56e394b2e5d08b data/ars_nouveau/advancement/recipes/misc/source_jar.json +269f32221e7761b07fda58c2d1f0e4d385be01a9 data/ars_nouveau/advancement/recipes/misc/spell_prism.json +72c1ae940c65ff0d29a11b7842b288b1227d02d1 data/ars_nouveau/advancement/recipes/misc/spike_to_arrow.json +bd91063f72b718971e580b32fe3520a1f2996982 data/ars_nouveau/advancement/recipes/misc/spike_to_dye.json +18f9e176cb6e92e34a3a01bdcc1afdd8c2aedf58 data/ars_nouveau/advancement/recipes/misc/starbuncle_shades.json +95a48ec579c57b38d7d0472cd016897fdfb8f542 data/ars_nouveau/advancement/recipes/misc/sunrise_2.json +5793395abd4db53a2742a5265b5eb6fafbbfa488 data/ars_nouveau/advancement/recipes/misc/vitalic_sourcelink.json +91d18c601d25407857547b9cf0b328c78ba87caa data/ars_nouveau/advancement/recipes/misc/void_prism.json +ba6873e6404bdd17126bf015f9779f3132a61779 data/ars_nouveau/advancement/recipes/misc/volcanic_sourcelink.json +b1a4e7eedc02c3d7d84c9e5076ba4cb05c050c6c data/ars_nouveau/advancement/recipes/misc/warp_scroll.json +b29d4b79698922fff384dcb4c8cfdc4f755e66a5 data/ars_nouveau/advancement/recipes/misc/water_essence_to_bucket.json +1170f3c85b47ac82d9efddd0475237e846b51466 data/ars_nouveau/advancement/recipes/misc/water_essence_to_obsidian.json +adb956258b9aff02e0b8396cd3b1c30743c00f3b data/ars_nouveau/advancement/recipes/misc/wilden_summon_alt.json +14cec136a7a9321a31b4fc30ccdb0b92fac35723 data/ars_nouveau/advancement/recipes/misc/wing_to_leather.json +db1612c9ca686be98cf08042852b554004c20b36 data/ars_nouveau/advancement/recipes/misc/wipe_spell_parchment.json +af16e626f979fe486e94e2ce83029e605f9e0484 data/ars_nouveau/advancement/recipes/misc/wipe_starby_shard.json +3c94cedc091410f9753fafd28c68c70e065e43d2 data/ars_nouveau/advancement/recipes/misc/wixie_hat.json +f5d0e8bf6c31595b6a37dc127d98a90a542353ca data/ars_nouveau/advancement/recipes/misc/worn_notebook.json +0d8e97944642ff8e877d0aa4688fa4407f09fe61 data/ars_nouveau/advancement/recipes/misc/yellow_sbed.json +281db2929d352e7f97ec4b5d5ff6d420b9ba2a0e data/ars_nouveau/recipe/agronomic_sourcelink.json +03c20e84c9f6180060bce50d07e0dfcae78afd9a data/ars_nouveau/recipe/air_essence_to_snow_bucket.json +d44f4d6bfb9f8cceef5af7c4a53778e0069f83c8 data/ars_nouveau/recipe/alchemical_sourcelink.json +3bcad68084c5963d189a3adda7178e5c1d2cd72b data/ars_nouveau/recipe/allow_scroll.json +53ee254fdf04074f4e24818108e3df9a10ceb791 data/ars_nouveau/recipe/alteration_table.json +6893d65f6c1b20b176a80d4acddbf08bbf49031b data/ars_nouveau/recipe/annotated_codex.json +95030b2241e712a64e84bc4180973d2f1c65f2cc data/ars_nouveau/recipe/arcane_core.json +8847040079205bf424aa43fcc5b0c55d9b33b688 data/ars_nouveau/recipe/arcane_pedestal.json +b3b729af157d37ce8fd800f06eb9723237fa6fde data/ars_nouveau/recipe/arcane_platform.json +68f7b6c77cb804e36cee558b93189b95a35affd1 data/ars_nouveau/recipe/archwood_button.json +3390b28cb95c3c54012968d9e5c8b0a45d7124e7 data/ars_nouveau/recipe/archwood_chest.json +19ade102ab38051edba714910dc8f966d23d2ea2 data/ars_nouveau/recipe/archwood_door.json +145c3b2469019bda16df0cb8493ca735fbcde977 data/ars_nouveau/recipe/archwood_fence.json +035beb9e6e73ee4e88daded672e57b2d806be214 data/ars_nouveau/recipe/archwood_fence_gate.json +43dec629dee5ee3dda31027315870e9ba2560093 data/ars_nouveau/recipe/archwood_planks.json +3b4decb139ef2bbc828c428eb13862980a763847 data/ars_nouveau/recipe/archwood_pressure_plate.json +2bcdc0c44a334f4355e448c71293acf4dc5f41ab data/ars_nouveau/recipe/archwood_sconce.json +5201be3f889d6a51d065363f17600a4614969353 data/ars_nouveau/recipe/archwood_slab.json +986ff47f53636936ffd6e0f074ec802862d96e12 data/ars_nouveau/recipe/archwood_stairs.json +e27acf9a62c7ac6edd984df1f526089bb5d8c768 data/ars_nouveau/recipe/archwood_to_chest.json +4d6c7d5c0e64d0486d365377417117d5edb382c4 data/ars_nouveau/recipe/archwood_trapdoor.json +996c7d872b91004988c93878973932ca32be4acf data/ars_nouveau/recipe/basic_spell_turret.json +86f7be9a035d695bc99e98fc90d070a3c92e7935 data/ars_nouveau/recipe/blank_parchment.json +29b58ebf63ce034972b8aee060ab643fce3d9ba8 data/ars_nouveau/recipe/blank_thread.json +05a109cd0b76401aa94d1958644e15df3ee1295c data/ars_nouveau/recipe/blue_archwood_wood.json +f7f44d2c3eb30021937d9cec4fe65a1921d29c1e data/ars_nouveau/recipe/blue_sbed.json +fa6ef2dc0ff3bed59dae1e84d229529b02860109 data/ars_nouveau/recipe/challenge_2.json +aaa983f63a03c4423709c2cd6b7c064df9fa555f data/ars_nouveau/recipe/clear_allow.json +4b75d660393bdf2ef048cd1d1b5a060ad2e1e69d data/ars_nouveau/recipe/clear_deny.json +a6d152a895509e9499224a26df6a16958eb1a7ab data/ars_nouveau/recipe/conjuration_essence_to_end_stone.json +eb467e8db516eb4a594e598773148c391b95246b data/ars_nouveau/recipe/conjuration_essence_to_soul_sand.json +93301e4c21000b77f346500c66d17515abddb623 data/ars_nouveau/recipe/deny_scroll.json +1ae35513507490134369531a55de220f64f137e2 data/ars_nouveau/recipe/dowsing_rod.json +01bc9ca87d828cb1e8de2988c8fb935decc8546b data/ars_nouveau/recipe/dull_trinket.json +a106290849c3a7cf7fe7b954e007b6211d8683df data/ars_nouveau/recipe/enchanting_apparatus.json +b9ddb20217f0c3a7ccd43888986b8e1dd3737f5f data/ars_nouveau/recipe/experience_gem.json +2f5f3364bb268f60fecc7d2de647682aa5b876b8 data/ars_nouveau/recipe/falseweave.json +21d41cbd34de46e75115a6223a06142191138c42 data/ars_nouveau/recipe/fire_essence_to_charge.json +5c714e8a66c2b9d7bd58c263df92cedbea9ae252 data/ars_nouveau/recipe/fire_essence_to_magma_block.json +85af3fd5c829862cae286f2d9a3018bb8f87abdf data/ars_nouveau/recipe/ghostweave.json +d31c60a70ac056c62aa42633582c7ce8aaeef573 data/ars_nouveau/recipe/gilded_sourcestone_alternating_slab.json +21b874051ced8c33e45f5bf00117b04444f62587 data/ars_nouveau/recipe/gilded_sourcestone_alternating_stairs.json +65800bdb787ddbe7dab2974c509f18c9e69b0f53 data/ars_nouveau/recipe/gilded_sourcestone_alternating_stonecutter_stair.json +72dbd88e2d2faa69d739400a4168fe341715d304 data/ars_nouveau/recipe/gilded_sourcestone_alternating_stone_cutterslab.json +a530b27fb878b58d73c4f918d6aef268a454dd5a data/ars_nouveau/recipe/gilded_sourcestone_alternating_to_sourcestone.json +f435ab7ac3168eb2b07ef335257154167e05c021 data/ars_nouveau/recipe/gilded_sourcestone_basketweave_slab.json +2c467ba42d8d13245f32281b57f58af5dc366171 data/ars_nouveau/recipe/gilded_sourcestone_basketweave_stairs.json +5303510885a9e072c309bfe6b4159ac8ecb3e644 data/ars_nouveau/recipe/gilded_sourcestone_basketweave_stonecutter_stair.json +010fae0cdc8d9d88a214d94089abb2029b2ad90a data/ars_nouveau/recipe/gilded_sourcestone_basketweave_stone_cutterslab.json +d6b3a2917ddae9f41ebf370d674b71733e3e550f data/ars_nouveau/recipe/gilded_sourcestone_basketweave_to_sourcestone.json +7ce6626f86fc6722cd87e03c4f7159e580ba7b15 data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_slab.json +1c8e7831fec55dba45bf5d066ac01fbbd2a9eb6b data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_stairs.json +93078f7bf378895bf4db0a161a053cda119d0043 data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_stonecutter_stair.json +16b12c427a3243640cff98af2efe2134a1423a5a data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_stone_cutterslab.json +47999849d849266b83130193dbff3d0b6de777fe data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_to_sourcestone.json +6be8ab4f5410b7159be110086fb96ced60662474 data/ars_nouveau/recipe/gilded_sourcestone_mosaic_slab.json +59e6a7bd5a0c59b37627d0ec01874970f1d36d41 data/ars_nouveau/recipe/gilded_sourcestone_mosaic_stairs.json +72cf3e2fff2482f8595dc047002c293c55ffcc42 data/ars_nouveau/recipe/gilded_sourcestone_mosaic_stonecutter_stair.json +97b8dbcf22d1c324149cae94fc390043e32ed426 data/ars_nouveau/recipe/gilded_sourcestone_mosaic_stone_cutterslab.json +1d7c57aebdf109cf029978d22d0e7c9a0b0fb969 data/ars_nouveau/recipe/gilded_sourcestone_mosaic_to_sourcestone.json +bec69a8d002ea373314fc0393c84d8036d415c17 data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_slab.json +2d878d6f32ab84ec46f5c3784da220cde6493772 data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stairs.json +077fadc7edaa58f40a873b955063b296f7c0607c data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stonecutter_stair.json +c2460feccf67516df403a9abb8c832911390bf4c data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stone_cutterslab.json +29a297bd450b2f8df3a69bfe40bc0b75bee0ab55 data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_to_sourcestone.json +68145936a0efb8b3b80e5469df8cd52caf7c85d8 data/ars_nouveau/recipe/greater_experience_gem.json +47d30e1bdf7c9e8947c5fa5f0fd047567abf195d data/ars_nouveau/recipe/green_archwood_wood.json +e54c68f5c220f3af8b9c996094a2ab213a05775e data/ars_nouveau/recipe/green_sbed.json +f07d4e92f2ecd9d05562cf1a7dd43c21e6c8d935 data/ars_nouveau/recipe/horn_to_bonemeal.json +fd0f5e2dcb502227b5583b181f196026d5f4f769 data/ars_nouveau/recipe/imbuement_chamber.json +da33ed3a448276094d5721a580910bc5bd068f3c data/ars_nouveau/recipe/item_detector.json +cd414f88fe9d90cb7e6e483612fabca6efece561 data/ars_nouveau/recipe/magebloom_block.json +32e401c4e59339f6be8e031cd31c11599ea94466 data/ars_nouveau/recipe/magebloom_block_to_magebloom.json +e6aa2f2be1609f389ab67f0ebeebfdc3470a7012 data/ars_nouveau/recipe/magebloom_fiber.json +205220ac210cf0a840b9559ab1336af5080d242b data/ars_nouveau/recipe/magebloom_to_pink.json +0d24f341fdeb54d084dbaf1ef4fe8f2945e247f0 data/ars_nouveau/recipe/magelight_torch.json +c92467ad911ade5f06c0135a3e0587c3f3ef9314 data/ars_nouveau/recipe/manipulation_essence_to_andesite.json +2e3dcdfe595b65c8ff6703a125b14d4a7817528e data/ars_nouveau/recipe/manipulation_essence_to_blazin_sapling.json +0426e0c3b309f6f0f5f7ab25d0ef32e22ca9d51a data/ars_nouveau/recipe/manipulation_essence_to_calcite.json +f4c014af6ca13688b188bfc70db5d0f92c5de585 data/ars_nouveau/recipe/manipulation_essence_to_cascading_sapling.json +f72b44924bb0c7c14584ac5555c65ec8233d6a91 data/ars_nouveau/recipe/manipulation_essence_to_deepslate.json +b9800ed946a7698a5338eea2c03fecb4660396e4 data/ars_nouveau/recipe/manipulation_essence_to_diorite.json +15825744662c224513e7a896c10bf7498e872378 data/ars_nouveau/recipe/manipulation_essence_to_flourishing_sapling.json +180fd298b3cac043bc226ffe98d292c7efe5f793 data/ars_nouveau/recipe/manipulation_essence_to_granite.json +d54eacc226f29a2c537fc491c0b56839155d988e data/ars_nouveau/recipe/manipulation_essence_to_grass_block.json +43c4e057c200e73cb7d86a6c85efc5b135dada3c data/ars_nouveau/recipe/manipulation_essence_to_moss_block.json +a36e18e1eb518eeaf677d8109574e13461c24561 data/ars_nouveau/recipe/manipulation_essence_to_mycelium.json +0b2950bc4680c5866c7f96ca2f81e144c9733066 data/ars_nouveau/recipe/manipulation_essence_to_tuff.json +80304edc468f0f9f988156764dc4bfd24979b874 data/ars_nouveau/recipe/manipulation_essence_to_vexing_sapling.json +707522a192ccd25e2da6490e5e9d6476fe66c5f7 data/ars_nouveau/recipe/mimic_scroll.json +2934fb39403c24a9c6c363dd2b1eea19a094c4cf data/ars_nouveau/recipe/mirrorweave.json +e1884cca124df55bf412d95549f86800492deaac data/ars_nouveau/recipe/mob_jar.json +60f6f54acffb0880bac374b48177fd9bd1dd4106 data/ars_nouveau/recipe/moonfall_2.json +d14d1bcf99c787e770333aca4cf115074615676a data/ars_nouveau/recipe/mundane_belt.json +4ad6635b57eec4221ff24ef683d4286578c9c180 data/ars_nouveau/recipe/mycelial_sourcelink.json +ca12f5dca463bbf0aca09c46b8efe2f6446c90ce data/ars_nouveau/recipe/orange_sbed.json +598c51209c60374d958b0a81afe37462dad45081 data/ars_nouveau/recipe/platform_to_pedestal.json +27e2e8438ba3dfdff05440abd1f751c50f0be420 data/ars_nouveau/recipe/polished_sconce.json +4c7cb2cfb58fde34c12f4672b9ec44b30d618eb1 data/ars_nouveau/recipe/polished_source_sconce.json +7873c2163a0b02d99e4c70be8af5e5d9c0bd34c4 data/ars_nouveau/recipe/potion_jar.json +21f23f67bae60bff26f2c255f38c0ab41f4a5cbd data/ars_nouveau/recipe/potion_jar_empty.json +ea63cf7bea666ed17912b8fae45be7eaa3ed7288 data/ars_nouveau/recipe/purple_archwood_wood.json +4a2c4815844b91e8cf3636d33b6d0c53bdaf267c data/ars_nouveau/recipe/purple_sbed.json +aebabb5b244a14c33336386f60c98912fd05e099 data/ars_nouveau/recipe/redstone_relay.json +5a328c1fbe2131697c8af1a91b48781d4d5b57ad data/ars_nouveau/recipe/red_archwood_wood.json +8ff451fad137ccc8a670fb3d335299810ea8eea0 data/ars_nouveau/recipe/red_sbed.json +9c9b067f9aa4bdcdf9766f4f959a638799a04e06 data/ars_nouveau/recipe/relay.json +6cb8d39204d624ee51b5f0d5450833632a0ac194 data/ars_nouveau/recipe/repository.json +9a850855f9eeddb1e20cde0399bd93d10ff42638 data/ars_nouveau/recipe/ring_of_potential.json +8a46330ef6197232cc0e87155b9834eb57f56620 data/ars_nouveau/recipe/ritual_animal_summon.json +b7e8f61b9faf2b00693d209870838f790c6ea3d4 data/ars_nouveau/recipe/ritual_awakening.json +d5c136a07a295a3b25930678b65f373aabd2b217 data/ars_nouveau/recipe/ritual_binding.json +7d82169426617fb9d9ba3fc8ce1f4d78be1a365b data/ars_nouveau/recipe/ritual_brazier.json +f372b9092ba4f2990fa6a944b2c0dbf730c32367 data/ars_nouveau/recipe/ritual_burrowing.json +f9607dc36c4f4626afa9d98369a5c21f471b32d9 data/ars_nouveau/recipe/ritual_challenge.json +cd230d36564bbe95f04f51288c172eb3db143309 data/ars_nouveau/recipe/ritual_cloudshaping.json +d1b2121d00b5d216c29c005e195a835687939123 data/ars_nouveau/recipe/ritual_conjure_island_desert.json +4f6c73461d37232f39d4220994a7681298bd1f8c data/ars_nouveau/recipe/ritual_conjure_island_plains.json +71984fb8e25ca4a919b2332ee0e25256f92659af data/ars_nouveau/recipe/ritual_containment.json +5545ad0aba36dc60d030be3bb0ca8df335513850 data/ars_nouveau/recipe/ritual_disintegration.json +36806069545229e9791194e2c69ed3374aeedc08 data/ars_nouveau/recipe/ritual_fertility.json +fcf24b2cb4935579d70f679e9ce623fa8e3bcadf data/ars_nouveau/recipe/ritual_flight.json +cd4e3739a388e3303bcefcd30be39c4da6ea6d06 data/ars_nouveau/recipe/ritual_flowering.json +f2d2b98c71bf9a37fd9094eb2a805164c24f04e0 data/ars_nouveau/recipe/ritual_forestation.json +58d97163c8181c5bd2ab07ffa4a08a540b0cf845 data/ars_nouveau/recipe/ritual_gravity.json +d7e8c558924b2edb195713f67a840134bdf20d84 data/ars_nouveau/recipe/ritual_harvest.json +b66a7c4bd80359f57c798857de8e566e432cd126 data/ars_nouveau/recipe/ritual_moonfall.json +b2a0966389179ec0f881c489fa5ecbc2c5055473 data/ars_nouveau/recipe/ritual_overgrowth.json +5061c6aafaad2e5b027adb74257390a262f13603 data/ars_nouveau/recipe/ritual_restoration.json +f3c8e1e452d9e3da0d41bf55e60da60b476a204a data/ars_nouveau/recipe/ritual_sanctuary.json +accc32c820494bb259dc6f0902ccbfd11a6d0fd7 data/ars_nouveau/recipe/ritual_scrying.json +5123654f5081a2901bb2919e9308c65c0358ab95 data/ars_nouveau/recipe/ritual_sunrise.json +a4194bc3caca8f56ee425021f31738c189bec74d data/ars_nouveau/recipe/ritual_warping.json +6e3200ffef781dc82bad2f6b9658836cd816511b data/ars_nouveau/recipe/ritual_wilden_summon.json +a37c13de84a1b1166110870ce4e289955bbb7126 data/ars_nouveau/recipe/rotating_spell_turret.json +c575a5b0c428b291f1cfc84eeabd4dbbbb2c2a34 data/ars_nouveau/recipe/rotating_turret_to_basic_spell_turret.json +43458f912f2a3eef45c0786aafa19e8cdca7eae4 data/ars_nouveau/recipe/runic_chalk.json +3f7e6a6bc404cd3e5ce9396384b736ae86885bf2 data/ars_nouveau/recipe/sconce.json +5463e82e3cc0ceb956288d726c3c6d466b9e5af4 data/ars_nouveau/recipe/scribes_table.json +400b7a598f728a4e32d0c7be87226e3446f8ba3d data/ars_nouveau/recipe/scryers_crystal.json +40ac99a48606b92662bbab965d4a7d973e5580c7 data/ars_nouveau/recipe/scry_to_blank_parchment.json +0d8e0aa41af9c50473968e97f935509bf2891de9 data/ars_nouveau/recipe/sky_block.json +1ae6da8aeb72f0a39bd555e3e0ba3836f2425c08 data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_slab.json +9cf986d982d9babb27efd1f08f016f1a90ee279b data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_stairs.json +5286a1149ff48ec0f9ccd24d86b9a6ba85888dc7 data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_stonecutter_stair.json +b2aa1274857a762eea51ce2290b6159c9ae884e3 data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_stone_cutterslab.json +41747a7c1df5324d4c1c3cb7749582c7ad4f42e2 data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_to_sourcestone.json +d603cfd482db284b650c443a4daac2b429f2f355 data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_slab.json +f73f2114bd9891fb8811637048befc3e3b503fc6 data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_stairs.json +fd9828f0eca7c883bdf5c2de9fcee960d40cd45e data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json +0d50893b86460068ee53c04cdb87835679ecf312 data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json +401c05cb82f1a186c95b53efa4b568e13d942ffa data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_to_sourcestone.json +a3448158fb4f4a9d811d1bf329fa1560bbc44efd data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_slab.json +c37f97def8efa69e9cc45e6a734fa65ca64b2040 data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_stairs.json +638081ba1ec2a17971fe028dfda9e427535f433b data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json +997a3a6c9a8afb4eb889706ea151170e52f9fb20 data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json +599200cbe797865023bbea5fdf3b626f70b404aa data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json +87f03e363d4d9ddde833f4a0b35f156dfccfb950 data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_slab.json +cc1cc37a2b321648efb307d9e44fb3bfeb2b4ffc data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_stairs.json +33a3d5cbf47243297753df92a9d51b912ec9237f data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json +feb07332e311c2d8565eb59ce6469bd4cc2bdd36 data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json +cf1c3934d4d1b7e0a3739d129c934502b23a7a0c data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_to_sourcestone.json +edabd715e2c0681e5a40fb01d05bbd3eec348a44 data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_slab.json +7cde0b5dea4fdf5294ac974d22cbb1b56363666c data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_stairs.json +027af62b9ac0066493147fb27149cff581a3f091 data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json +42e48354ce520118af057bb26e4127608c9a8685 data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json +993fa30ea7ad937b570745c57747fbc7857b38cb data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json +b68748358f0cb152bdff59e4483485c477754e6c data/ars_nouveau/recipe/smooth_sourcestone_alternating_slab.json +1a131fbece02b012ea835d06dcdb0ab29351edd6 data/ars_nouveau/recipe/smooth_sourcestone_alternating_stairs.json +076f2e1e468ae7fa4cb235f7115f67b6273df50c data/ars_nouveau/recipe/smooth_sourcestone_alternating_stonecutter_stair.json +291c6a88ae2a27925d626b09cd796a0f5ff1b4be data/ars_nouveau/recipe/smooth_sourcestone_alternating_stone_cutterslab.json +4b11b94f89f7d55c5f36ada8d789a6a15302518c data/ars_nouveau/recipe/smooth_sourcestone_alternating_to_sourcestone.json +acbe5a1fb8f456d08d8a86621ca5551c68b64df4 data/ars_nouveau/recipe/smooth_sourcestone_basketweave_slab.json +de8804b81bb11ad699c118c674a5ec92e54f2e8f data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stairs.json +d0263bb0d14c77a757f1444371caff2686f3b335 data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stonecutter_stair.json +49d5eee984f3df841e993c5a2e9c616816a6cc8b data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stone_cutterslab.json +8a7130ffa41374909ef985ec4c1ec350d654f162 data/ars_nouveau/recipe/smooth_sourcestone_basketweave_to_sourcestone.json +400372944ed98be7d1b7cb5e1f5ae072bafbc63e data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_slab.json +e18cc711473df298fe44a175b0c213098ee30c7e data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stairs.json +0f8d955c626ea38620e19169c0f1ef44efcebd7a data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stonecutter_stair.json +15f3705f7b46ca54c466f11f5995c0128ccee15f data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stone_cutterslab.json +0a51b41ba8045d99c34e73e68f87f0d6c916c42d data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_to_sourcestone.json +72a51d1e712113f01339cc90f3760a45da2e96e8 data/ars_nouveau/recipe/smooth_sourcestone_mosaic_slab.json +0e7d4e14121efb8091b2d28435043a2a86140f32 data/ars_nouveau/recipe/smooth_sourcestone_mosaic_stairs.json +5226c6ab60c3d2fc686ff7d41c49ef7600b2350b data/ars_nouveau/recipe/smooth_sourcestone_mosaic_stonecutter_stair.json +79f98eb6af3b66bbcde4dd4aa2eac4d568204c63 data/ars_nouveau/recipe/smooth_sourcestone_mosaic_stone_cutterslab.json +a14378f3918389d0bf3b384611bf0d7e83a8468d data/ars_nouveau/recipe/smooth_sourcestone_mosaic_to_sourcestone.json +92af529e7cd0999cd17c58283341826986e3bd21 data/ars_nouveau/recipe/smooth_sourcestone_slab.json +baa85035a6ee43dadafc6f4882e19134d6d2edec data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_slab.json +01bc82b98db62c0b558e83333593f2ea2e9f18de data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_stairs.json +95f339b25fd4e0a308f820633bc55153a625fc7d data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_stonecutter_stair.json +3cdfe411f2ccd0f012721780a375d7d795085c78 data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_stone_cutterslab.json +5c091fd7739ce37ed1f0ca819e76820586f7409d data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_to_sourcestone.json +b4e0da986074b8609eb152ea0127dfd29e7d904f data/ars_nouveau/recipe/smooth_sourcestone_stairs.json +2a1c4eedde39a9ccf22526a9036356590ce7d437 data/ars_nouveau/recipe/smooth_sourcestone_stonecutter_stair.json +c5463533191816bf832dd59136803829ebfbfe3b data/ars_nouveau/recipe/smooth_sourcestone_stone_cutterslab.json +0c5925117feaa9dc6d3f825b19f89984c943911e data/ars_nouveau/recipe/smooth_sourcestone_to_sourcestone.json +815af537716d5a9879a3e51c39ea662b8d34d669 data/ars_nouveau/recipe/sourceberry_sack.json +d7293d221e0717498eb71355af2008ea2ad9c0ae data/ars_nouveau/recipe/sourceberry_sack_to_bush.json +2e861cae2c767aa5892e58bc39ffca478553316d data/ars_nouveau/recipe/sourceberry_to_purple.json +654efbc06185e618944f8bba2362cb8329ad1594 data/ars_nouveau/recipe/sourcestone.json +b159d2ff355a3f08def030f597621b034126b94e data/ars_nouveau/recipe/sourcestone_1.json +5c80647e01b985769d977f597af8f397b8c444b7 data/ars_nouveau/recipe/sourcestone_10.json +dadc5af121d0e6547541b38271af71e758cb4232 data/ars_nouveau/recipe/sourcestone_11.json +e1b4c37eb9b22541eaa02967ff91797e7ad882a6 data/ars_nouveau/recipe/sourcestone_12.json +e0da83103834adb3dfd9df2989b75a5a513e5c20 data/ars_nouveau/recipe/sourcestone_13.json +b83fc2b852867eb2ebab51e83a1da1c94e6a5a40 data/ars_nouveau/recipe/sourcestone_14.json +bd75333f67ffbb471769db4aae0eb7582e0806fe data/ars_nouveau/recipe/sourcestone_15.json +58606e1aa6ab0eb8885f670585e34e224b0f7c7d data/ars_nouveau/recipe/sourcestone_16.json +cdef5a28e311087d7d8efa68d67bdcb7f371340e data/ars_nouveau/recipe/sourcestone_17.json +d6b9c1bb422584f2fee25f681795e8c2cce69ec2 data/ars_nouveau/recipe/sourcestone_18.json +9f145274e8a2726d9428fde5801387ee25425ec0 data/ars_nouveau/recipe/sourcestone_19.json +6ea62abbb740ee890efe9e9ba79baf3c76a6cc24 data/ars_nouveau/recipe/sourcestone_2.json +a00160fa1d58d426fdecab6c095dd146b4344b4b data/ars_nouveau/recipe/sourcestone_20.json +7bdd0fddeeedf5e99f84930887585b2ada74efa1 data/ars_nouveau/recipe/sourcestone_21.json +2a210426af321b4df999879edc2640e9bb7f7e02 data/ars_nouveau/recipe/sourcestone_3.json +3486cf69f78cc17517415c90ad1e79227faab7c0 data/ars_nouveau/recipe/sourcestone_4.json +bab03894df49ef652c72176013430594c46f0721 data/ars_nouveau/recipe/sourcestone_5.json +68a8a95d6e3529329cdaa2bf25879b9df43a17ed data/ars_nouveau/recipe/sourcestone_6.json +d3eb1d7ea5eeb8b2f85c58383d4c94b40ac216f0 data/ars_nouveau/recipe/sourcestone_7.json +ff5c63c8a8789d2c83d357dc049662e4fd477d86 data/ars_nouveau/recipe/sourcestone_8.json +7e6bb85ea469420c27d9b78d26ff122b73620296 data/ars_nouveau/recipe/sourcestone_9.json +403b68d8066f10b3bff82ebc776e4f0319573215 data/ars_nouveau/recipe/sourcestone_alternating_slab.json +e687db6c44b28f20bbe43fcab295bc902a8d795a data/ars_nouveau/recipe/sourcestone_alternating_stairs.json +39b748e5cf116e29cd2dc95900ed69c48c517462 data/ars_nouveau/recipe/sourcestone_alternating_stonecutter_stair.json +69dd8f536ce20b2944488d90d26bda71ffe6ac04 data/ars_nouveau/recipe/sourcestone_alternating_stone_cutterslab.json +8b6e1873b09131090b5c9262f038b4a643444df1 data/ars_nouveau/recipe/sourcestone_alternating_to_sourcestone.json +8a7ac1181c49b97c3a70aa5c089c353353a48722 data/ars_nouveau/recipe/sourcestone_basketweave_slab.json +d8987e3cd5b7933ddad2fa0f5f8eef4dc6c757af data/ars_nouveau/recipe/sourcestone_basketweave_stairs.json +75cc98a03d013ad872bad29c0e1fc2cc84de3fae data/ars_nouveau/recipe/sourcestone_basketweave_stonecutter_stair.json +f7a36183332cee6b288bd113af0b38335c746e2b data/ars_nouveau/recipe/sourcestone_basketweave_stone_cutterslab.json +21e59abdf2bc5b18c2cdbcf84a7b08c00a586ead data/ars_nouveau/recipe/sourcestone_basketweave_to_sourcestone.json +4cdf9a8b4bde0f985a01d1b772323df62c5a214c data/ars_nouveau/recipe/sourcestone_large_bricks_slab.json +055ecd2a82200dbba5aae29e67953f824ae4d49a data/ars_nouveau/recipe/sourcestone_large_bricks_stairs.json +58271d6404ad2fcbf894a99c197bd5ed4f885d4c data/ars_nouveau/recipe/sourcestone_large_bricks_stonecutter_stair.json +4dd8855c114c924326c2e56dc4f09a66c0b15bc4 data/ars_nouveau/recipe/sourcestone_large_bricks_stone_cutterslab.json +fbef7ce258ce205b3025282fe6184d6c2b9ee8a6 data/ars_nouveau/recipe/sourcestone_large_bricks_to_sourcestone.json +30340db1f04937e6523a64b8645be6e9524c1bbb data/ars_nouveau/recipe/sourcestone_mosaic_slab.json +8ce7fbf1157565bf6612cb3420b84f78d836d2c1 data/ars_nouveau/recipe/sourcestone_mosaic_stairs.json +e99742a48cbaefae14294f67296528e3ebc9fcfb data/ars_nouveau/recipe/sourcestone_mosaic_stonecutter_stair.json +6d345bf331f36f58111429200c9263f69c9f796f data/ars_nouveau/recipe/sourcestone_mosaic_stone_cutterslab.json +9b48c087b8662d53b6bd459a2e14d7de9fc1cd10 data/ars_nouveau/recipe/sourcestone_mosaic_to_sourcestone.json +c2d1c1bed407152bfb766dd479faa568bdde16a3 data/ars_nouveau/recipe/sourcestone_sconce.json +1cf3f3ec1144f994fb1951b1e839466c305c98d6 data/ars_nouveau/recipe/sourcestone_small_bricks_slab.json +206a6ae71999c8bcb2aee40ec68a71c1bf57b832 data/ars_nouveau/recipe/sourcestone_small_bricks_stairs.json +4a17f86391b25d61a3c5a2947434367826cc596b data/ars_nouveau/recipe/sourcestone_small_bricks_stonecutter_stair.json +e44f13b1e300032a8b8f5c6751ed7fc583b210be data/ars_nouveau/recipe/sourcestone_small_bricks_stone_cutterslab.json +7f6168d5ae8e831e77cb0806e3a06d91b5450155 data/ars_nouveau/recipe/sourcestone_small_bricks_to_sourcestone.json +fb928e4220c714f21512e797870c15e474f50dba data/ars_nouveau/recipe/source_berry_pie.json +afe7ecef1ee8ae08a8d3a2acc1b08327d0ef9618 data/ars_nouveau/recipe/source_berry_roll.json +49b7be2f902611e6cf09f1b7ecf2344a3df3e33e data/ars_nouveau/recipe/source_gem_block.json +c06a657b4454d37d6a163c4cc10704a5c8cf5065 data/ars_nouveau/recipe/source_gem_block_2.json +9f629e68870a9bcb8827301b66f253caa5731d80 data/ars_nouveau/recipe/source_jar.json +89dd364bbdaa7000d4f7fb12e519af92a921318d data/ars_nouveau/recipe/spell_prism.json +2ba1f528e85a732de26d7a83a4bc4924cbfd59f8 data/ars_nouveau/recipe/spike_to_arrow.json +958a7d7aedff3bc57fdfcb14ac84ed435927e115 data/ars_nouveau/recipe/spike_to_dye.json +068807a1afd31b9497831aeefe2df60d2565d690 data/ars_nouveau/recipe/starbuncle_shades.json +62b1c75eb9640af367537bf8ca9cc86f2150b91a data/ars_nouveau/recipe/stripped_blue_archwood_wood.json +0f063f4016238c46eeaf1c3f3eb8a50860958552 data/ars_nouveau/recipe/stripped_green_archwood_wood.json +87f04a42c9dd11a6b0f87b823206876d8914afd6 data/ars_nouveau/recipe/stripped_purple_archwood_wood.json +d128ca0b445cec01f08427a1161cc5d7c7786ca3 data/ars_nouveau/recipe/stripped_red_archwood_wood.json +ca56d495360055deb4f24de0c41884339e8f9d56 data/ars_nouveau/recipe/sunrise_2.json +2e5aa7a43e48187bcf7825d17a879844e6f805d2 data/ars_nouveau/recipe/vitalic_sourcelink.json +814123e61686726650596240db521172b91f7535 data/ars_nouveau/recipe/void_prism.json +af3c284b1aa5cd7db73e4744bc86a54be0d1806d data/ars_nouveau/recipe/volcanic_sourcelink.json +d109d81969bd3fe482ceb338954b92bb7ea76716 data/ars_nouveau/recipe/warp_scroll.json +c19871c38692c25e6045b280e8b4b5d36203c15f data/ars_nouveau/recipe/water_essence_to_bucket.json +3a1671e8f9c1c4f6348ee0ea0bb6626f104e850c data/ars_nouveau/recipe/water_essence_to_obsidian.json +f9c3f8eef713e609e22c9c5b3eba2b848c13af89 data/ars_nouveau/recipe/wilden_summon_alt.json +70042fe858652ec14314d20f993b5bade0b7de16 data/ars_nouveau/recipe/wing_to_leather.json +532075e3c595e9d3b3b067289d5efbaf7fe49362 data/ars_nouveau/recipe/wipe_spell_parchment.json +e40f3959e9af493782395c436060a4c80ee61929 data/ars_nouveau/recipe/wipe_starby_shard.json +c1ff140a7eea0c25559c9445572b928edec0d5f1 data/ars_nouveau/recipe/wixie_hat.json +635ab6a0a28315545b61d556d8924deac512ac98 data/ars_nouveau/recipe/worn_notebook.json +6fd5261e1412280fcc8d3a12414c7cb6342b78f3 data/ars_nouveau/recipe/yellow_sbed.json diff --git a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 index 05531dcb82..7a9ebdf7c7 100644 --- a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 +++ b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 @@ -1,4 +1,4 @@ -// 1.20.1 2024-04-27T17:37:53.0704187 Ars Nouveau Item Models +// 1.21 2024-07-05T22:41:47.5366047 Ars Nouveau Item Models 11ee554b11a3a830e89b742762e5b754c2ecb5ee assets/ars_nouveau/models/item/agronomic_sourcelink.json 339a05323ebef7efc5c70db708a2e7a24708e9bc assets/ars_nouveau/models/item/alchemical_sourcelink.json a0214090201827dd5f954d0b33e64e4df6e53764 assets/ars_nouveau/models/item/alchemists_crown.json diff --git a/src/generated/resources/.cache/a5922da861c7ee259705eec42cf3df986f0db576 b/src/generated/resources/.cache/a5922da861c7ee259705eec42cf3df986f0db576 index cf085e61be..b4092e298b 100644 --- a/src/generated/resources/.cache/a5922da861c7ee259705eec42cf3df986f0db576 +++ b/src/generated/resources/.cache/a5922da861c7ee259705eec42cf3df986f0db576 @@ -1,4 +1,4 @@ -// 1.20.1 2023-10-08T20:36:02.3058543 Block States: ars_nouveau +// 1.21 2024-07-05T22:41:47.5336056 Block States: ars_nouveau 1b2e60c29cbc9cba57df1e1d0fd9b6f5394b7980 assets/ars_nouveau/blockstates/agronomic_sourcelink.json ca9e60aa92a8af0ebf19eb2abd29e68574574b75 assets/ars_nouveau/blockstates/alchemical_sourcelink.json 638796836b1f117aedad8d79ecec507b605c60d3 assets/ars_nouveau/blockstates/archwood_door.json diff --git a/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc b/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc index e00f99b066..8484cd165b 100644 --- a/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc +++ b/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc @@ -1,2 +1,2 @@ -// 1.20.1 2024-05-28T15:33:08.094098332 Budding Conversion Datagen -47df6e662e7d3f5e264a84868bc714615e3f9b9e data/ars_nouveau/recipes/budding_conversion/budding_amethyst.json +// 1.21 2024-07-05T22:41:47.5431199 Budding Conversion Datagen +10ac984d2cfbd22599c15cbee3b5718147466f24 data/ars_nouveau/recipes/budding_conversion/budding_amethyst.json diff --git a/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 b/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 index 837e234536..5c61b2376c 100644 --- a/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 +++ b/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 @@ -1,14 +1,14 @@ -// 1.20.1 2023-10-08T20:36:02.3193737 Imbuement -7336327ae14427a6547a2b37c75bbe14a08e4727 data/ars_nouveau/recipes/imbuement_abjuration_essence.json -c74f3187365f92179d5200f693d3b550a7faf525 data/ars_nouveau/recipes/imbuement_air_essence.json -873c28c3a398a7180118f343823240dbaf660e53 data/ars_nouveau/recipes/imbuement_amethyst.json -8c9b6e7337d0bd7fef7fff0f51f9ab77994c6ed2 data/ars_nouveau/recipes/imbuement_amethyst_block.json -877524b385a8fbd227e6ebef3410c1182272ecbd data/ars_nouveau/recipes/imbuement_amplify_arrow.json -4d9a5eda30b03d44f64d4eba347eeb3516d503fb data/ars_nouveau/recipes/imbuement_conjuration_essence.json -ab12a9fef122b2048c07dc538029cd66783a2b9d data/ars_nouveau/recipes/imbuement_earth_essence.json -5f415035618f282d3ad9a8a2c566a40eaff6ad20 data/ars_nouveau/recipes/imbuement_fire_essence.json -e37c2c26bfe4df6b5f5fc588d7c86ba3fd7bc494 data/ars_nouveau/recipes/imbuement_lapis.json -fd622888edcb2f91d1b6617beb8524cef7dc09c8 data/ars_nouveau/recipes/imbuement_manipulation_essence.json -9cf6a6c09ece8f3a2c7f03de8171703d67eb9621 data/ars_nouveau/recipes/imbuement_pierce_arrow.json -c9164f8b97673764938c57338d15b48d7b8f8aae data/ars_nouveau/recipes/imbuement_split_arrow.json -af4f3257dcb26afc3d90dfb8f9df034e6ab29c15 data/ars_nouveau/recipes/imbuement_water_essence.json +// 1.21 2024-07-05T22:41:47.5461209 Imbuement +974c697181074e040d9d4ebf686b5a90f5def841 data/ars_nouveau/recipes/abjuration_essence.json +ddd8adaffaa8c57e9c166ec4a16c84c4bfb9d82e data/ars_nouveau/recipes/air_essence.json +da10a2f3438ac30b12dd724204bdc7d9dd8289b9 data/ars_nouveau/recipes/amethyst.json +6523b4dc44b09c5423d7c64ff3051438966c5d66 data/ars_nouveau/recipes/amethyst_block.json +115d647a6d4cf519c16da4504e8c8db17f3d5ebc data/ars_nouveau/recipes/amplify_arrow.json +881dccacec3cb203aac682071dafa404e6657149 data/ars_nouveau/recipes/conjuration_essence.json +fe7e60a935b2906e4e10cba135a1948bc5f3a243 data/ars_nouveau/recipes/earth_essence.json +2269915429ba66392d9dbe7b51bb86b2ab820b1b data/ars_nouveau/recipes/fire_essence.json +555d6f245c68358aaf85965d96ec261d92b83a1e data/ars_nouveau/recipes/lapis.json +828ad058c94024260d1bcbf171a9e73cca114b89 data/ars_nouveau/recipes/manipulation_essence.json +1282caff28b4599947022e1981dadcafde2ff6e5 data/ars_nouveau/recipes/pierce_arrow.json +863697816f215752a637966c1f14ef65f5cc6402 data/ars_nouveau/recipes/split_arrow.json +6bd51ed6a5394ebe4b1a7b1557a45eeb34d61c4e data/ars_nouveau/recipes/water_essence.json diff --git a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 deleted file mode 100644 index 1838ad292d..0000000000 --- a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 +++ /dev/null @@ -1,27 +0,0 @@ -// 1.20.1 2024-06-01T20:51:47.3388634 Ars Nouveau Caster Tomes Datagen -7b2d5bfec3c8c3e016df01d114f69f395acf450a data/ars_nouveau/recipes/tomes/arachne_tome.json -42abffd34f905357b1e7aa2f91214a261d1c1e4d data/ars_nouveau/recipes/tomes/aurellia_tome.json -d8da4283859f5a0c1b49bfde99fa028fad70dffc data/ars_nouveau/recipes/tomes/bailey_tome.json -cc53c0c87ebb8e8d8344185643b1a765b1a4e7a6 data/ars_nouveau/recipes/tomes/chems_tome.json -ad0be5d588d5d3dedb19bbfe69ec8795f319cf10 data/ars_nouveau/recipes/tomes/darkfira_tome.json -1c3cfb008409293739fc2e20c823a7000846fd86 data/ars_nouveau/recipes/tomes/farfalla_tome.json -4a71274794cbe3f2302ec706ab363f6f009be26c data/ars_nouveau/recipes/tomes/fireball_tome.json -8967c5feaaf3fa912e6516039bd64d51d722fc2d data/ars_nouveau/recipes/tomes/glow_tome.json -108fea568d7666ea958a9a115ccc864da5d8b0c5 data/ars_nouveau/recipes/tomes/gootastic_tome.json -3ea074d05dd54e663fe432e7c37381ade1ab46ac data/ars_nouveau/recipes/tomes/ivy_tome.json -6583c7b1cc0f8003e92350b01d53c68cadb6cb6c data/ars_nouveau/recipes/tomes/kirin_tome.json -0fb84c6da3cdb156fb08e11357d0e486e161bd66 data/ars_nouveau/recipes/tomes/lyrellion_tome.json -0aadfcbe4d6d6f5ac28acddb93c010598910f567 data/ars_nouveau/recipes/tomes/othy_tome.json -d77ebf81bb18332359b137d22714b7b88d72f0f9 data/ars_nouveau/recipes/tomes/poseidon_tome.json -913f86e82e8a2f7887d2d26de1f342ba531e31c5 data/ars_nouveau/recipes/tomes/renew_rune_tome.json -009df7865491324b380369702e1926f9761243d4 data/ars_nouveau/recipes/tomes/shadow_tome.json -ec3f2fc59ee9a71071955ed4924c7503e6a2a014 data/ars_nouveau/recipes/tomes/silvanus_tome.json -c9b3b701a65b6931b834bf2bd03273d5d5858db0 data/ars_nouveau/recipes/tomes/spinoftw_tome.json -60b255429548abfbe6ff2c66168a2c9b2173cd91 data/ars_nouveau/recipes/tomes/takeoff_tome.json -400f3118236e9baabf8a6dfde3639a0f08a7d68a data/ars_nouveau/recipes/tomes/toxin_tome.json -60b9ea4f6dc3caa5f67ff7616e84a81dd0959181 data/ars_nouveau/recipes/tomes/uni_tome.json -16d1bb0bb87e20429e024d11e1074a3aa8fb9618 data/ars_nouveau/recipes/tomes/vault_tome.json -cc2e31b60c7a332564f39896e553855701bf5935 data/ars_nouveau/recipes/tomes/warp_impact_tome.json -ed1ce9465021152c439c604aa021b4722b40dedf data/ars_nouveau/recipes/tomes/xacris_2_tome.json -75c1e8c02ab28f58f340cafe236fe4d713ac2fd4 data/ars_nouveau/recipes/tomes/xacris_tome.json -e31cdd795dd8391f347c9885061bbbb395407da9 data/ars_nouveau/recipes/tomes/yeet_tome.json diff --git a/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 b/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 index 4c5da86c85..856ae18868 100644 --- a/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 +++ b/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 @@ -1,16 +1,16 @@ -// 1.20.1 2024-04-28T11:40:36.5904096 Tags for minecraft:entity_type mod id ars_nouveau -4d0235b95823f5d315aae7e9f9e484cbde8294a0 data/ars_nouveau/tags/entity_types/animal_summon_blacklist.json -a958530eef4b0d5ac2f1c7bd552b60e23cb66d9a data/ars_nouveau/tags/entity_types/an_hostile.json -290c285b1e334d322b8d070b2c6a071114b1d70c data/ars_nouveau/tags/entity_types/berry_blacklist.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_types/disintegration_blacklist.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_types/disintegration_whitelist.json -29671cfa11d074462c259806e9d60468451e3cdb data/ars_nouveau/tags/entity_types/drygmy_blacklist.json -37c0c70962a460e0c2d62b6dafe0ee563c8773d4 data/ars_nouveau/tags/entity_types/familiar.json -d845fe0d8c60d85668664fdf64a9c87ca2176e4c data/ars_nouveau/tags/entity_types/jar_blacklist.json -e00f2931577049b9a4400a87ed9c249373be376c data/ars_nouveau/tags/entity_types/jar_release_blacklist.json -81129e21b3ae9fc2579ae17d4c228b76271a2b4d data/ars_nouveau/tags/entity_types/jar_whitelist.json -6ea663c420f871864a11d18e9448d602520eeff9 data/ars_nouveau/tags/entity_types/lingering_blacklist.json -84573a969de7731afa84f6a69831eb283c565ba5 data/ars_nouveau/tags/entity_types/magic_find.json -a37c8a7cf9e25ba9178196b0552e6c5e79567ffa data/ars_nouveau/tags/entity_types/rewind_blacklist.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_types/spell_can_hit.json -ac003d93bbb50df3d9d0d7bf1561a9b274c4e65b data/forge/tags/entity_types/bosses.json +// 1.21 2024-07-05T22:41:47.5386059 Tags for minecraft:entity_type mod id ars_nouveau +4d0235b95823f5d315aae7e9f9e484cbde8294a0 data/ars_nouveau/tags/entity_type/animal_summon_blacklist.json +a958530eef4b0d5ac2f1c7bd552b60e23cb66d9a data/ars_nouveau/tags/entity_type/an_hostile.json +290c285b1e334d322b8d070b2c6a071114b1d70c data/ars_nouveau/tags/entity_type/berry_blacklist.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_type/disintegration_blacklist.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_type/disintegration_whitelist.json +29671cfa11d074462c259806e9d60468451e3cdb data/ars_nouveau/tags/entity_type/drygmy_blacklist.json +37c0c70962a460e0c2d62b6dafe0ee563c8773d4 data/ars_nouveau/tags/entity_type/familiar.json +d845fe0d8c60d85668664fdf64a9c87ca2176e4c data/ars_nouveau/tags/entity_type/jar_blacklist.json +e00f2931577049b9a4400a87ed9c249373be376c data/ars_nouveau/tags/entity_type/jar_release_blacklist.json +81129e21b3ae9fc2579ae17d4c228b76271a2b4d data/ars_nouveau/tags/entity_type/jar_whitelist.json +6ea663c420f871864a11d18e9448d602520eeff9 data/ars_nouveau/tags/entity_type/lingering_blacklist.json +84573a969de7731afa84f6a69831eb283c565ba5 data/ars_nouveau/tags/entity_type/magic_find.json +86a469d8e9ee317a1ca5b93bfed0be34ff5b0d89 data/ars_nouveau/tags/entity_type/rewind_blacklist.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_type/spell_can_hit.json +ac003d93bbb50df3d9d0d7bf1561a9b274c4e65b data/c/tags/entity_type/bosses.json diff --git a/src/generated/resources/.cache/d2032e9832fa171affe4a9c0c99fb97f183ff8a6 b/src/generated/resources/.cache/d2032e9832fa171affe4a9c0c99fb97f183ff8a6 index c400ab9fb1..140b46b943 100644 --- a/src/generated/resources/.cache/d2032e9832fa171affe4a9c0c99fb97f183ff8a6 +++ b/src/generated/resources/.cache/d2032e9832fa171affe4a9c0c99fb97f183ff8a6 @@ -1,2 +1,2 @@ -// 1.20.1 2023-07-04T22:32:46.6092021 atlases generator for ars_nouveau +// 1.21 2024-07-05T22:41:47.5316058 atlases generator for ars_nouveau 0824a6d8558f29057b8af23a64a6dfa5da2ca88b assets/minecraft/atlases/chests.json diff --git a/src/generated/resources/.cache/e0d3d0b8d9c807675613821fa865a35f707cd83f b/src/generated/resources/.cache/e0d3d0b8d9c807675613821fa865a35f707cd83f new file mode 100644 index 0000000000..d3c359ae55 --- /dev/null +++ b/src/generated/resources/.cache/e0d3d0b8d9c807675613821fa865a35f707cd83f @@ -0,0 +1,2 @@ +// 1.21 2024-07-05T22:41:47.5526451 Data Maps +835362efe6b3a85abe6e05e01dcb8d34823e18a0 data/neoforge/data_maps/item/compostables.json diff --git a/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 b/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 index 8ce88ed455..9bc6083e39 100644 --- a/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 +++ b/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 @@ -1,176 +1,176 @@ -// 1.20.1 2024-04-27T18:30:25.908670982 Apparatus -47c673376b4ffc5874674165c030f4e7213c87cb data/ars_nouveau/recipes/alchemists_crown.json -9de96693a6f1f8acf98ddedc408117537e390b95 data/ars_nouveau/recipes/amulet_of_mana_boost.json -9336968ca3afbcbcdcb1dfd5c8bbe859975835a0 data/ars_nouveau/recipes/amulet_of_mana_regen.json -fc150a0bed5af02b8db590daf5f8afec329ff17b data/ars_nouveau/recipes/aqua_affinity_1.json -ccb17398cf33ad12fdcc27fb7ee72e4c5a88c60b data/ars_nouveau/recipes/arcanist_boots.json -3440a27728d2016fa5cdf6f9fa67b361e6e3b1da data/ars_nouveau/recipes/arcanist_hood.json -5998521e8dd4b9665ebe961ef2ae5732ec23bc28 data/ars_nouveau/recipes/arcanist_leggings.json -fd4faa5abc7d525015f1ec36b65e746f46f25cb6 data/ars_nouveau/recipes/arcanist_robes.json -9431bdf49069a5eb7600c5b95d4ba8d9a1fdcf40 data/ars_nouveau/recipes/bane_of_arthropods_1.json -83189940684ed643627e4685e34091477d3f13c1 data/ars_nouveau/recipes/bane_of_arthropods_2.json -4e3a919a09b271c934b7e7732ee0e2954cf28f5e data/ars_nouveau/recipes/bane_of_arthropods_3.json -56bb9521b5577fce27020e50e20c314c80ffe5d4 data/ars_nouveau/recipes/bane_of_arthropods_4.json -6ddf1714f252c78874938cd4fb79a80aba6da9eb data/ars_nouveau/recipes/bane_of_arthropods_5.json -db9025d188b80499467e1319288da558da1f4be0 data/ars_nouveau/recipes/battlemage_boots.json -79780f1f093eaba9d07747e8ccbdc35cabf93d72 data/ars_nouveau/recipes/battlemage_hood.json -aef4e4c908837e629ce65c7b9025b5c213352c89 data/ars_nouveau/recipes/battlemage_leggings.json -02a64ebfccde8de6b825177a4e6b16a7f04fce7b data/ars_nouveau/recipes/battlemage_robes.json -1329d2b97a1e591ec191539334b1f49669463586 data/ars_nouveau/recipes/belt_of_levitation.json -a4ab4f73c2d183ccff73d679f9c1e30f938a2f8d data/ars_nouveau/recipes/belt_of_unstable_gifts.json -17a2a2738db23726d4a3ca2e7bde8c03255f3f03 data/ars_nouveau/recipes/blast_protection_1.json -8239a17ca1f3d38dc17474a8e5c748d33cda9509 data/ars_nouveau/recipes/blast_protection_2.json -a728ac5f321cf2f3315a4b86bbce1a3a2eb4b03f data/ars_nouveau/recipes/blast_protection_3.json -bf63106198fbaec7a639c3660a59c8daaac522f5 data/ars_nouveau/recipes/blast_protection_4.json -4e5dd650fe3f1d69c42144bcc7261a8d09a4408a data/ars_nouveau/recipes/brazier_relay.json -8b81707d8d77e584ba8f65e61b27ef36a0b34e82 data/ars_nouveau/recipes/depth_strider_1.json -8a416b13c837cbef25070034210a741daa9b5deb data/ars_nouveau/recipes/depth_strider_2.json -2c73d29201b7b8e5b952d0e2c46a352b5dafd01e data/ars_nouveau/recipes/depth_strider_3.json -abe71720a8d059daaff51c0ca53f369bc7957bd2 data/ars_nouveau/recipes/dominion_wand.json -564a53afd430704dc656249ed9b5e3dc6f9b9f12 data/ars_nouveau/recipes/drygmy_charm.json -50c79cc6c4ed98523406adaaf642ee9a25faa269 data/ars_nouveau/recipes/efficiency_1.json -6cf0d34fe6c84d72ac6da208135708fbeeceb187 data/ars_nouveau/recipes/efficiency_2.json -92402ebb482088e6d0702798f0ad07d6a8309aeb data/ars_nouveau/recipes/efficiency_3.json -de71474fb35692c7088b9440c0c6bba36a262e35 data/ars_nouveau/recipes/efficiency_4.json -a5ee85ae56de89d694f4430003d34959f562b24a data/ars_nouveau/recipes/efficiency_5.json -d4a76f6988eacd98d20cc563ca717b21ce5f1d15 data/ars_nouveau/recipes/enchanters_eye.json -10a1c8caae004253314ffe084add6bf950d189a1 data/ars_nouveau/recipes/enchanters_mirror.json -aaa1c27b165fa8515b595601668b858e136c0209 data/ars_nouveau/recipes/enchanters_shield.json -5d673e5104ba5be3e34b653807286349e88c8420 data/ars_nouveau/recipes/enchanters_sword.json -3321d66e6241cf0e9a6a90085c30e5e6bbc73594 data/ars_nouveau/recipes/feather_falling_1.json -4c8ee26334782811c6cc16f3f36b26bfe69d167e data/ars_nouveau/recipes/feather_falling_2.json -e6dda21fae2d55ef5d7cad7d7711e64c83d2bd58 data/ars_nouveau/recipes/feather_falling_3.json -8d60e2847ecd50dc2b74cd5d3a2609023dba1815 data/ars_nouveau/recipes/feather_falling_4.json -436a9217ef5434b266107b8e183327e31bc7acda data/ars_nouveau/recipes/fire_aspect_1.json -3e60eee6ff6ec553ce9e25e3cb0c1a0b2fa381f8 data/ars_nouveau/recipes/fire_aspect_2.json -b2f02d0e0556b20338ad04fc78df020eaef153fb data/ars_nouveau/recipes/fire_protection_1.json -2c4ef09faaa031684b82eacb696d5db52541bd09 data/ars_nouveau/recipes/fire_protection_2.json -f98d1ab720db3a84742055c5995f8ea5060cba31 data/ars_nouveau/recipes/fire_protection_3.json -008dcd6b11cf54a35a79763433dadae64b3cb112 data/ars_nouveau/recipes/fire_protection_4.json -6054654e5438a7c9ce537e0a3a6a386756601ce7 data/ars_nouveau/recipes/fire_protection_5.json -7862bdc9c7124cc01c8c3280f9b9e2c41bbb1960 data/ars_nouveau/recipes/flame_1.json -8a1dc7457089128edcfe3ec23f3433ea7deede75 data/ars_nouveau/recipes/fortune_1.json -c96faa00a6648573eddb08e6bb9d2b82020aab2f data/ars_nouveau/recipes/fortune_2.json -21969be82dfc26b0e48911f4f21d38d24142e619 data/ars_nouveau/recipes/fortune_3.json -ec952c57d59d54a02da3301d4502ec926800438c data/ars_nouveau/recipes/infinity_1.json -388cc834eac87f5774b99899c5df9290cc50f65f data/ars_nouveau/recipes/jar_of_light.json -9dd267bdd8265184cec4ee610139318921c19651 data/ars_nouveau/recipes/jump_ring.json -588a5debf821d2cd7617de2aee640fc68c608f41 data/ars_nouveau/recipes/knockback_1.json -056b6f330bac0f9d19155fbea4521b3e6fd07549 data/ars_nouveau/recipes/knockback_2.json -3d953def1a654a23cae4a133a9e82688c74c02db data/ars_nouveau/recipes/lingering_flask_cannon.json -b9c72388d5c9c24dcd833009e09e19b0a0e07fa0 data/ars_nouveau/recipes/looting_1.json -d3de096e31d57f64a484673ea36a3b0c02c30981 data/ars_nouveau/recipes/looting_2.json -1e356262c0cfe380087445772e22789561232913 data/ars_nouveau/recipes/looting_3.json -fbad503628d71338f5cb2b196d17f66eec341e55 data/ars_nouveau/recipes/magebloom_crop.json -3788d9cf4ee3d1bc263538b12517a1bc968bbf40 data/ars_nouveau/recipes/mana_boost_1.json -1ebc27c4d30250b60aae1e308b1bf97304514e58 data/ars_nouveau/recipes/mana_boost_2.json -68d912353522e9c441c93a80b035812401447095 data/ars_nouveau/recipes/mana_boost_3.json -ee1cd800413e901550b3d2d2d31a8dbc632d46ad data/ars_nouveau/recipes/mana_regen_1.json -af849c5bae463a6c73f97d659b638e2ccc54b677 data/ars_nouveau/recipes/mana_regen_2.json -284f9e9d701674b1ededddae84f93e20438c0037 data/ars_nouveau/recipes/mana_regen_3.json -2e1f9af1aa8102d247240b0fe477aa58ad2b8fc7 data/ars_nouveau/recipes/multishot_1.json -3c3108523cbe5c8f9521a02292dea745cf036edb data/ars_nouveau/recipes/piercing_1.json -d407761751bc5f0eccc8467c35b22cd9f64a70a6 data/ars_nouveau/recipes/piercing_2.json -1c218b3ee4b0eaa58d1ffd41b6c7a8fb5d0b086f data/ars_nouveau/recipes/piercing_3.json -0ef519b7ac08da1f0815db06f644c1d81983d402 data/ars_nouveau/recipes/piercing_4.json -e5ed57cd56ad547e4584d10a65db14337390ae02 data/ars_nouveau/recipes/potion_diffuser.json -3916fdf3cef1c6036bb1c05318e1192939b319f8 data/ars_nouveau/recipes/potion_flask.json -80f9284211e5f198001104ef12b8568d685d3faa data/ars_nouveau/recipes/potion_flask_amplify.json -cc643b365742c44af861c49a14a047257f2348a7 data/ars_nouveau/recipes/potion_flask_extend_time.json -47a0c0b22175bee1b1151034d5a0162340d570be data/ars_nouveau/recipes/potion_melder.json -9ff69b4cfbce5040af7889f6ed7e7ff1a5b07cf9 data/ars_nouveau/recipes/power_1.json -e0017abf1de1d69504ad9a68f882f03aa762b36e data/ars_nouveau/recipes/power_2.json -4fa9cfcb70396ad64bc9098f3d94a5ff3d3c585b data/ars_nouveau/recipes/power_3.json -ad3819dffdb30c7d98af727ae582d7ba2a15dcad data/ars_nouveau/recipes/power_4.json -b093eef664cef0cb660c263fa9e1694e59093793 data/ars_nouveau/recipes/power_5.json -2f2505c02f1054a4e289459639b3f07bb38c89a0 data/ars_nouveau/recipes/projectile_protection_1.json -de306a0b33506f7fbfcee280f8974041e7a584a4 data/ars_nouveau/recipes/projectile_protection_2.json -5e15a70f12deae797db5bd7d037d0db85d221da5 data/ars_nouveau/recipes/projectile_protection_3.json -c381e367d43d8f5db9ec6e8e58ff7afc48fee7e8 data/ars_nouveau/recipes/projectile_protection_4.json -f758adb213989b51801c8a1fe4eb7dfd55ec9fb2 data/ars_nouveau/recipes/projectile_protection_5.json -cd83e1d73d47e26cfd0f1605ec3239a750e4a092 data/ars_nouveau/recipes/protection_1.json -a48e5762a3d3319db3a025e6782c7d36701a0813 data/ars_nouveau/recipes/protection_2.json -413905719592aab645c018c00b08258eff1c68cd data/ars_nouveau/recipes/protection_3.json -7ad45b003b3b74065962ce6b9e7bc56047284ce3 data/ars_nouveau/recipes/protection_4.json -5edf3c4538ce3edfa7687a1fd4ea3008d4d9d5c4 data/ars_nouveau/recipes/protection_5.json -d608397a2a8341d43647be9d9986219264aa0ce9 data/ars_nouveau/recipes/punch_1.json -3e9e044ef323cfa880ca3f80fca3b004eceecef8 data/ars_nouveau/recipes/punch_2.json -5475fc4133a39187b7f43fa1d0a61579538422b5 data/ars_nouveau/recipes/quick_charge_1.json -09c72461ec8bb42b08af841a098244db3f7b0852 data/ars_nouveau/recipes/quick_charge_2.json -97335bafd855696d9b02dc613cda3b04f009dd4d data/ars_nouveau/recipes/quick_charge_3.json -a420bb000517eedb1b85f93bba1f5ea39851cd5f data/ars_nouveau/recipes/reactive_1.json -bfe9e930b21ca98beb268258f29a0b5ebdea69e8 data/ars_nouveau/recipes/reactive_2.json -67119cb73a21d5e74199ebc0feb1ff3ea8ff73a0 data/ars_nouveau/recipes/reactive_3.json -76b70ef1c844f8299ca5be35ba9b64cef26efc2d data/ars_nouveau/recipes/reactive_4.json -ae25f33ff1537ee7d2380c5c4393ba5b55f4db37 data/ars_nouveau/recipes/relay_collector.json -428ea5e2eada275482cd77adf036725bd3398acb data/ars_nouveau/recipes/relay_deposit.json -8b22ea0454ea9e1475765cb57c37ae18ba4a34ba data/ars_nouveau/recipes/relay_splitter.json -c0072de8f7c670f835a3a3bbbe48f076282f6148 data/ars_nouveau/recipes/relay_warp.json -b7050b76b2e84de738ae3476b6726b6512ef758f data/ars_nouveau/recipes/respiration_1.json -c49d73188435f41dc62a7a648fdbb71ea8f88d02 data/ars_nouveau/recipes/respiration_2.json -aec234ebc8182859a3628e442092234f40d65b0c data/ars_nouveau/recipes/respiration_3.json -543e4f7b6546354430ce6387f5e8458e15bd21a2 data/ars_nouveau/recipes/ring_of_greater_discount.json -e66b1a9f97074c98ea13feac282d18b3fcd15d43 data/ars_nouveau/recipes/ring_of_lesser_discount.json -039735743258296bf7ff8231cab69389281b9f16 data/ars_nouveau/recipes/scryers_oculus.json -a20305ffa6818478d3661898be93969aaac1d478 data/ars_nouveau/recipes/shapers_focus.json -617c0867525709df35dfb94f50f85f10607e799a data/ars_nouveau/recipes/sharpness_1.json -20963f51d0b5f37d26bc2347eda0e823a29409b3 data/ars_nouveau/recipes/sharpness_2.json -07ddedb48834a762d461601a1488a0617e87c2b8 data/ars_nouveau/recipes/sharpness_3.json -e4fa184da62f3c844dcdb5e80050265c525edb2b data/ars_nouveau/recipes/sharpness_4.json -71c8514b2f4c11b4ee79d0ab9dbd2ac6c3c4444d data/ars_nouveau/recipes/sharpness_5.json -a7011d4d9d9a9c66e18db75b1aef7a1cc53ac4ef data/ars_nouveau/recipes/silk_touch_1.json -5b312d8d1cfdb6df635f3ba9940a4906c5722430 data/ars_nouveau/recipes/smite_1.json -9f882d98994b5bcc4ef75d0ec57406bebbafc9b5 data/ars_nouveau/recipes/smite_2.json -4c4f2898b15e2ed8607e0a3dbffddc3e901240d3 data/ars_nouveau/recipes/smite_3.json -7876348940944b886b73151ccb12441300b477d3 data/ars_nouveau/recipes/smite_4.json -b54053da88c7b6b44c077001a3b426c7681c1d65 data/ars_nouveau/recipes/smite_5.json -92a1e19535f2cbfcf2798af9ded178977ad115a4 data/ars_nouveau/recipes/sorcerer_boots.json -b157c8399ba5374d3b950a6997a97ed7a8f2e581 data/ars_nouveau/recipes/sorcerer_hood.json -29d312e6db6b5f9b3c30d929120b6c3bc2857727 data/ars_nouveau/recipes/sorcerer_leggings.json -8eefa1db8ed2d98be2217a33c45a6f7d6271ea3f data/ars_nouveau/recipes/sorcerer_robes.json -20e34e9f8d44a12a23216c0533b5b1b683bba807 data/ars_nouveau/recipes/spell_bow.json -cd1e42846a8fc8b83bc0d97a7ed011a56f72c500 data/ars_nouveau/recipes/spell_crossbow.json -91df45176d5e117853887c4b0edb8ace32e1abe7 data/ars_nouveau/recipes/spell_sensor.json -a5cd53eea13b4dae5249694a701608a630d19817 data/ars_nouveau/recipes/spell_turret.json -d838045b9e960e29b0ee40bc8ca504efe2c37510 data/ars_nouveau/recipes/spell_write.json -dae29c9eb350d1ebeaf82b219ff039bfdd5aecfa data/ars_nouveau/recipes/splash_flask_cannon.json -272c97f483b36f6b801bc908c1289a9c47506747 data/ars_nouveau/recipes/stable_warp_scroll.json -00a89a09fe98afaa7190f54056572de5ce47d466 data/ars_nouveau/recipes/starbuncle_charm.json -9df10bbe0e82b8782527b4ec3992bd68d6f1977b data/ars_nouveau/recipes/storage_lectern.json -2c7db0cb23d9280d05663e9720828b93afd00da7 data/ars_nouveau/recipes/summon_focus.json -b05f2a39b87dab025c1c7759ffbd8cc26ebdf2e6 data/ars_nouveau/recipes/sweeping_1.json -f147aa1c0269cca5634737f4c1ddabccb682aa08 data/ars_nouveau/recipes/sweeping_2.json -42ca37ab1db6f8b594e13f8d033d07c4ef2a850b data/ars_nouveau/recipes/sweeping_3.json -62d3417fcded40c5b27e2108eef528f31cedce57 data/ars_nouveau/recipes/thorns_1.json -61cc10aea1c8e514592b71160f54553dc65e3e81 data/ars_nouveau/recipes/thorns_2.json -6b71c2071ea4d1ea2799e8e62fb0bf152bdd5120 data/ars_nouveau/recipes/thorns_3.json -357e204119f122f377dbe4834c852ed90c8b9fa7 data/ars_nouveau/recipes/thread_amethyst_golem.json -61d6fbbc58c2c31e5dd624dbf57c7db72ca91021 data/ars_nouveau/recipes/thread_chilling.json -98f9bda8f773441ce9d56e9033321227ebf18908 data/ars_nouveau/recipes/thread_depths.json -177c721fa4e3438d1fca2c43106916ba5e9bf637 data/ars_nouveau/recipes/thread_drygmy.json -94dce20351b9d3032985f15346a3433e86158d35 data/ars_nouveau/recipes/thread_feather.json -2b12a718fa45a9c28d12699e81e1a36a8280eee0 data/ars_nouveau/recipes/thread_gliding.json -19aaca263d1b9c8fdeb9d24498acba1cf86bf4e3 data/ars_nouveau/recipes/thread_heights.json -0529fff0aa61f87beb0cc790209e8a3e50cf6cb1 data/ars_nouveau/recipes/thread_high_step.json -def934419266f753070ed01e0231596062b25811 data/ars_nouveau/recipes/thread_immolation.json -b2452b46446df1616212bf48cbeaed9033890a69 data/ars_nouveau/recipes/thread_kindling.json -ccb614ebf64ef93ae01b603148f24ca2296891f4 data/ars_nouveau/recipes/thread_life_drain.json -6caacc7461039b09cb526473381588a99378ba1d data/ars_nouveau/recipes/thread_magic_capacity.json -9073070a30fc6af8b80e75a12321aad7deaa236c data/ars_nouveau/recipes/thread_repairing.json -b5537a87ffbae3b11efc8d1795cf1b35e8ade734 data/ars_nouveau/recipes/thread_spellpower.json -6234ba2ba90e6198872ecd33e245de30949db521 data/ars_nouveau/recipes/thread_starbuncle.json -8e6a1334bd33817185da6aea6bd37559a02d858c data/ars_nouveau/recipes/thread_undying.json -ffac82c8be28a6322eba88b78a2a45038fe8630a data/ars_nouveau/recipes/thread_warding.json -e803562bc5a9a6497531314b7b78829795ef3043 data/ars_nouveau/recipes/thread_whirlisprig.json -6aedba611991413a89b52ed4104020bd2893a72c data/ars_nouveau/recipes/thread_wixie.json -e054edda6fa8689addfa4abbd51930d8d45f0945 data/ars_nouveau/recipes/timer_spell_turret.json -e1cc6d0c01577b3e5da6b62a82b56e6846b0e5e3 data/ars_nouveau/recipes/unbreaking_1.json -86d31da0c636f8196e18576d174c33f680f1996a data/ars_nouveau/recipes/unbreaking_2.json -573be5bf4bffe9a42edb58584c55c20aaafb78cb data/ars_nouveau/recipes/unbreaking_3.json -04b8be12321f56767b95da1d420ec5deb6618844 data/ars_nouveau/recipes/upgrade_1.json -97cb74b7eaa6e58a1fef39cfa60385e16841421f data/ars_nouveau/recipes/upgrade_2.json -f20c2279577e5ea573cdc582115236399d373025 data/ars_nouveau/recipes/void_jar.json -6c531cd3b8eb3a07c8ef67df28eeb76726dec8b0 data/ars_nouveau/recipes/wand.json -a74ab697306f2bb6f269966a8b1a5310a35fb8e5 data/ars_nouveau/recipes/warp_scroll_copy.json -fbe69ae16f6026d04ac3033a29737206db8a00df data/ars_nouveau/recipes/whirlisprig_charm.json -d5e23ac6fa4ffef6e21cbeadb5c08032e0839adb data/ars_nouveau/recipes/wixie_charm.json +// 1.21 2024-07-05T22:41:47.5411155 Apparatus +fb72ed4841264600c52f467c5f2a03ef440a38cb data/ars_nouveau/recipes/alchemists_crown.json +a20b2c86d4399461eaab73edce04323cd3cdc697 data/ars_nouveau/recipes/amulet_of_mana_boost.json +37cae95a78f283e24bedae76534f827c68ba7dd5 data/ars_nouveau/recipes/amulet_of_mana_regen.json +3c3ca7d3b3faa68920b91edce159d18e267abd17 data/ars_nouveau/recipes/aqua_affinity_1.json +4bb885be0907769cdbb71c5a6bc247a10a108bee data/ars_nouveau/recipes/arcanist_boots.json +e01b67707c4965ab890a062c99d50a84bea34461 data/ars_nouveau/recipes/arcanist_hood.json +27daf0b298e5e3859abe32a37373c2f5575a19fe data/ars_nouveau/recipes/arcanist_leggings.json +4224ee563775c88e8c3170bec4eaf388222d6e88 data/ars_nouveau/recipes/arcanist_robes.json +836f88aafe65f5ca70ec225d10f33a1b81dcb388 data/ars_nouveau/recipes/bane_of_arthropods_1.json +7d8d894e7120120f64dc1bcf8fbe33e391146d81 data/ars_nouveau/recipes/bane_of_arthropods_2.json +e4f6fc7200faae766e672f714f190534eff46f5f data/ars_nouveau/recipes/bane_of_arthropods_3.json +ac8c1049cf330496589a63da84fbce561ca817d0 data/ars_nouveau/recipes/bane_of_arthropods_4.json +8763e62776c9ea399194ec666a7ecab826e42185 data/ars_nouveau/recipes/bane_of_arthropods_5.json +efbcfaec39b9f98810bd8fb914289d8c8d920bf8 data/ars_nouveau/recipes/battlemage_boots.json +f194dfc7114c2de9edac4c4ce03e80d8f166aef4 data/ars_nouveau/recipes/battlemage_hood.json +a3105ce016f168cd35f07374b2998971fd6cd9a4 data/ars_nouveau/recipes/battlemage_leggings.json +72313f6dd5f25699d2c1248568952a7b07f55aa7 data/ars_nouveau/recipes/battlemage_robes.json +2f909917745a053b12d96383c01cf16e176246ab data/ars_nouveau/recipes/belt_of_levitation.json +c00e61b0d908051fa11076a67bbad509f22d7882 data/ars_nouveau/recipes/belt_of_unstable_gifts.json +2f3cb27b0a5ad0ffc8980523286f8219c35ca28d data/ars_nouveau/recipes/blast_protection_1.json +0db81d38de1f268e7a1297d0df35b0e11c6d5d54 data/ars_nouveau/recipes/blast_protection_2.json +73a0028e7b35e130e84619657dd694cc217f5685 data/ars_nouveau/recipes/blast_protection_3.json +f7f455dd70ea2c1567983620bd5ef77e183e93ec data/ars_nouveau/recipes/blast_protection_4.json +5241f9a54f8f217641347d189dc09ca9332252a3 data/ars_nouveau/recipes/brazier_relay.json +b39745ef3c086965c1a9e526f556353875261902 data/ars_nouveau/recipes/depth_strider_1.json +c9e83203147d08d92f4c623c4bbd1be3ffe14cb7 data/ars_nouveau/recipes/depth_strider_2.json +f9cec31b747fdfba29153bb62a19a60bfbcf376c data/ars_nouveau/recipes/depth_strider_3.json +a84d7d4a1358ca424f3f3233eb071b8fd7252281 data/ars_nouveau/recipes/dominion_wand.json +3a584f734506921105848c29b99124a896201c0b data/ars_nouveau/recipes/drygmy_charm.json +20ba7d0ed572ff4601a3347a9d7dcdf02790aa3e data/ars_nouveau/recipes/efficiency_1.json +f35e1bd98bf7be6d18a2d6a5d0d37ed2967feb10 data/ars_nouveau/recipes/efficiency_2.json +06ebaa07668833986508f2486cfdd1663d23d942 data/ars_nouveau/recipes/efficiency_3.json +ca4032c5216d4036407bd11b66c8e4c9d318892d data/ars_nouveau/recipes/efficiency_4.json +9573fc0c5ac7c54376524cdc828877655547b4bb data/ars_nouveau/recipes/efficiency_5.json +4778856ebc7b6e16b707f3874d0780879fc9de58 data/ars_nouveau/recipes/enchanters_eye.json +a984f0a5fa46d034b53917e190ca973c5799d95a data/ars_nouveau/recipes/enchanters_mirror.json +d1361bef3b5a881a23ea8ce9a41e69b81d2b0f7b data/ars_nouveau/recipes/enchanters_shield.json +c1c6dab35abdb2448ec9c86797a3226720908961 data/ars_nouveau/recipes/enchanters_sword.json +c9742f93a27a3d4fbb39f87786a6da625fbdbe93 data/ars_nouveau/recipes/feather_falling_1.json +b84415cf0d72fa5dcfcb646b603133d1df95e3ec data/ars_nouveau/recipes/feather_falling_2.json +c8d454d4720b6a6249cc9917b7a2a1692916d265 data/ars_nouveau/recipes/feather_falling_3.json +60e4a34f9624b7206c7446f264fa322a2258ae09 data/ars_nouveau/recipes/feather_falling_4.json +9b45c91132e66e72b411740e43bd68a504fd16f4 data/ars_nouveau/recipes/fire_aspect_1.json +c97610865013e5e4484fb3fb806f1b07e84443b5 data/ars_nouveau/recipes/fire_aspect_2.json +ea20e4c2b57851bb7d916dbc20ed4237ef5d2694 data/ars_nouveau/recipes/fire_protection_1.json +d62e1cbf1e93b621b5616ab5b1f5dbeda6750fb9 data/ars_nouveau/recipes/fire_protection_2.json +8ed43885c76be58dc964f6b6785bc4d86c92d69f data/ars_nouveau/recipes/fire_protection_3.json +8b2b2a014044e4d1e34f4652145c4a4988d99ecd data/ars_nouveau/recipes/fire_protection_4.json +be0f61a87d68ff18022d6641cb41c642a606ef92 data/ars_nouveau/recipes/fire_protection_5.json +d7ba28ce9e84739524af257b5fd9e0f967389631 data/ars_nouveau/recipes/first_armor_upgrade.json +8cc2eafe96e3570b0f0580650b072e33bd474960 data/ars_nouveau/recipes/flame_1.json +9e6e433a01950ae0b24c139a1b24dbc56266b92a data/ars_nouveau/recipes/fortune_1.json +9981a4e919c62d834548fdc7f67346f710a05cbf data/ars_nouveau/recipes/fortune_2.json +373414b2253612d371fc97a94a53d9dbf87563df data/ars_nouveau/recipes/fortune_3.json +6f91076bd12652d475a11306f009ba31cea8e348 data/ars_nouveau/recipes/infinity_1.json +54af5f9dae88edff870af8c7da2ca460a190c8fd data/ars_nouveau/recipes/jar_of_light.json +4fc7dba3b56892ace79cf167e4e771ae97137da1 data/ars_nouveau/recipes/jump_ring.json +6af4709c8b8a5fe042ce6ad4822541a96690948c data/ars_nouveau/recipes/knockback_1.json +3bba1b55de1f2b5621af044b03d2a788a4f7aec3 data/ars_nouveau/recipes/knockback_2.json +415023665c08999aa1069b92ddda02ecac00f1b1 data/ars_nouveau/recipes/lingering_flask_cannon.json +398d2e9bed0a267ebb0cb6873776338089e7fb5c data/ars_nouveau/recipes/looting_1.json +ee228546696ced85f9490ce9da08cf7a0a6ac4ba data/ars_nouveau/recipes/looting_2.json +e5ae08c2f47d0cda8af711e6fdbc21c43b445217 data/ars_nouveau/recipes/looting_3.json +37ab56d8d94804b98eea95e3ec4a5db17c49b0f5 data/ars_nouveau/recipes/magebloom_crop.json +6523a5c4dd039bc8fe3bda029d8ce7e7b61c35fa data/ars_nouveau/recipes/mana_boost_1.json +e63fa11ec0cdfb453cdad6eb23a625a74c80bbac data/ars_nouveau/recipes/mana_boost_2.json +51a5ced96b1fd86b52a9403dc02c613b97fd5d95 data/ars_nouveau/recipes/mana_boost_3.json +949a0513b78d2e757d99d4830279a37c00dc59d7 data/ars_nouveau/recipes/mana_regen_1.json +e31d6c99de9494b0dd7cd99328a52901183c52a0 data/ars_nouveau/recipes/mana_regen_2.json +0ed170543581cba1ff4f1590b7ef1d1444a7c1eb data/ars_nouveau/recipes/mana_regen_3.json +c8351e79728ba327e6b20dada8c371e0ce642d05 data/ars_nouveau/recipes/multishot_1.json +136fcdb50195cb46c57bf2a6934879d0ee0c986d data/ars_nouveau/recipes/piercing_1.json +7be6cc46e8c935b1558eb64439c6586c55929dc9 data/ars_nouveau/recipes/piercing_2.json +15731b82f78f06d0b45268bc0f384d7d1632a94d data/ars_nouveau/recipes/piercing_3.json +5e613451e8dcc3037a8e2e27f623cbe317923f23 data/ars_nouveau/recipes/piercing_4.json +24636ce003b15cdadc23ecb7f0ae96e99e48e1f9 data/ars_nouveau/recipes/potion_diffuser.json +d46ddfcd500e082dd23c2bd419ab39c9404ccf1e data/ars_nouveau/recipes/potion_flask.json +f6556751116a1335bbce68ca3891bd4ff135a079 data/ars_nouveau/recipes/potion_flask_amplify.json +41b3f96ee5fd919d2db71ca0ad0fdbc191e1eebe data/ars_nouveau/recipes/potion_flask_extend_time.json +f5857569dca9a51e79d54bc40f1a61a4f9fdc4c2 data/ars_nouveau/recipes/potion_melder.json +1bf1edef9f01d6386afd84c9b3442330f6b44272 data/ars_nouveau/recipes/power_1.json +fd4f92f95c4153d9544d8b621269ea5d66383f3d data/ars_nouveau/recipes/power_2.json +4a2436e69d9429db5eea62c26ccd7d2bbd4759db data/ars_nouveau/recipes/power_3.json +edec15450793c872f73af1a89796cf7d36326fce data/ars_nouveau/recipes/power_4.json +ee211ae3eb2864c842b398d5496d66bbb15882d1 data/ars_nouveau/recipes/power_5.json +b442abbdd012b59a16a8f369faded364177a2688 data/ars_nouveau/recipes/projectile_protection_1.json +e36f7a2ad97fa70c74d93eee1277fd862ce9f9c3 data/ars_nouveau/recipes/projectile_protection_2.json +a9d521d5658d4fc759556468c2d6ce2f7bb3babf data/ars_nouveau/recipes/projectile_protection_3.json +4527c879e9543624cbd49c677422f1bcdf77859d data/ars_nouveau/recipes/projectile_protection_4.json +b96befa3dd8ce69edde26310cb0d610b0ec0e512 data/ars_nouveau/recipes/projectile_protection_5.json +f2f1b0fe3b4ec8d7fced37e3f71ee17dc1eccb8b data/ars_nouveau/recipes/protection_1.json +aeab337473e8300929c44ee4a02cd7e04d69d029 data/ars_nouveau/recipes/protection_2.json +597f9e8587d320a02377ea76ead9999c03df1931 data/ars_nouveau/recipes/protection_3.json +84e9441d9c4bdb0c829569f96635a0100db4c1e8 data/ars_nouveau/recipes/protection_4.json +590ffda2fb09414779c01eceea08da6aac78f965 data/ars_nouveau/recipes/protection_5.json +94f6bb8c547fcc36bbb56a25dd146153ea776a19 data/ars_nouveau/recipes/punch_1.json +f492d4cae146653d3d3dba3ef12c23501848d6f5 data/ars_nouveau/recipes/punch_2.json +314322ca49b6c68038a64dd591ab2cc8c1c794d0 data/ars_nouveau/recipes/quick_charge_1.json +d7dcd72e99895701e20df052bd7df87488abb774 data/ars_nouveau/recipes/quick_charge_2.json +11e0eb139b7539d0f7b12dad730dd1c983287623 data/ars_nouveau/recipes/quick_charge_3.json +ce8fc7478cb7c46d3c069099b007a0d0cefce4c7 data/ars_nouveau/recipes/reactive.json +f24b312ca6b9c6fa83eeb6d106370bab76eac2a9 data/ars_nouveau/recipes/reactive_2.json +51941f8dc7728de8f91d382d29f67ad1b0ee56a0 data/ars_nouveau/recipes/reactive_3.json +be41ac9628db4fac57839c2ee59c1cab6621d002 data/ars_nouveau/recipes/reactive_4.json +729c1b99be46dccff5ecef88529fedb3c3ad6600 data/ars_nouveau/recipes/relay_collector.json +9626aed3cfb65ac73e0369aaab5fac731d8797ad data/ars_nouveau/recipes/relay_deposit.json +67ebb7c1e627e0e555fc1843ec9e93b74cdeb0c6 data/ars_nouveau/recipes/relay_splitter.json +facba97725c9567e1114c938c91a7301268d32be data/ars_nouveau/recipes/relay_warp.json +7bf7e1c54873c01a8710bf3f3596552e7a82b2fd data/ars_nouveau/recipes/respiration_1.json +447c42afe8c28cd97513fbd0595a449316077982 data/ars_nouveau/recipes/respiration_2.json +1e7ce9f4616f86d76e71d1298f3464e5ded813bd data/ars_nouveau/recipes/respiration_3.json +4a14bf05b33d0216566f78384421bb412876fafd data/ars_nouveau/recipes/ring_of_greater_discount.json +8806af9377ef69b7d2443aa76ea17dfd68ae2dee data/ars_nouveau/recipes/ring_of_lesser_discount.json +6f03c848b9b537e9e56cc6da6deb285a38adb8ab data/ars_nouveau/recipes/scryers_oculus.json +f0940942eece51d48b5141a671419fc47b64c792 data/ars_nouveau/recipes/second_armor_upgrade.json +0f273466b72acc20bc5fe007e7d19acaca9e7f3a data/ars_nouveau/recipes/shapers_focus.json +edd9f6e7a2c5e7f57ff82adf9a70585910312360 data/ars_nouveau/recipes/sharpness_1.json +786d4ec17b76aec0201c374cbfd32bd7520a1bd2 data/ars_nouveau/recipes/sharpness_2.json +870f4a35f2ec26a9d348ec36f753cad264588fe9 data/ars_nouveau/recipes/sharpness_3.json +9cf5eea51dfc1db4ce8dc8a5cd341c0e1b271793 data/ars_nouveau/recipes/sharpness_4.json +bca5b12e4bb61ff53bd8442b72e395c1895ceed7 data/ars_nouveau/recipes/sharpness_5.json +e59728e2a10112af6d9b18292b8ee8919409f1b7 data/ars_nouveau/recipes/silk_touch_1.json +cedeb7a384c1597624a7dcdf09fcb444e3c2e881 data/ars_nouveau/recipes/smite_1.json +ab79dfed1d55dccf493a4885423d28c332b4401b data/ars_nouveau/recipes/smite_2.json +eddb9e7681694d9c7df156d6b8edd7d1cfc439dd data/ars_nouveau/recipes/smite_3.json +10e6ba9c28f88386fb85d9aa9a6bf9fb9282b552 data/ars_nouveau/recipes/smite_4.json +b75ee0a9fbeae85fde264e136c14467210e0bbd7 data/ars_nouveau/recipes/smite_5.json +94e7fb147d453bb70a5771dbe221e3c75b505cd3 data/ars_nouveau/recipes/sorcerer_boots.json +89d4ec865cb6c4f84a2b92f531b7bf5f2f254bda data/ars_nouveau/recipes/sorcerer_hood.json +02ef475aeac5bb43ea6ac147c8d366cff5411aa5 data/ars_nouveau/recipes/sorcerer_leggings.json +95fbe3adce48d9c0cac8267f3be1c03d1f189027 data/ars_nouveau/recipes/sorcerer_robes.json +b39dd805b19f2b16914a520230959c2c6c65c825 data/ars_nouveau/recipes/spell_bow.json +f8323767064c376cb90e04d61b27e2ef9da523b1 data/ars_nouveau/recipes/spell_crossbow.json +be82ae84c0ebbfdfbe719a94d14818f7bffe7b99 data/ars_nouveau/recipes/spell_sensor.json +65e4c7cc88cdf662f3e6c6d5e2a3b1713a46c16d data/ars_nouveau/recipes/spell_turret.json +8b74efc903e7fd30e9be0a3bf50dc811b227ac1b data/ars_nouveau/recipes/spell_write.json +faff46a4612cca552249ac69d3cdb8d67c299a19 data/ars_nouveau/recipes/splash_flask_cannon.json +7f21540a5bdb3d65984eec8a61a4e78f9cf1edfe data/ars_nouveau/recipes/stable_warp_scroll.json +8d5f0c39e86ad2255dfa6850fc02df88823f3f55 data/ars_nouveau/recipes/starbuncle_charm.json +ff7f37fabc6f5e1e9286f95a67aa8f41fec14963 data/ars_nouveau/recipes/storage_lectern.json +f8e7cd194d9cb5c6aa56a70b93ae831f0d420ac7 data/ars_nouveau/recipes/summon_focus.json +82ac616ba3ffbc862e5bce4d6a3a592c4aab4e69 data/ars_nouveau/recipes/sweeping_edge_1.json +465d3415cbfb4906da456a35f16f7cfcd6d94fb7 data/ars_nouveau/recipes/sweeping_edge_2.json +c279614bf63100e9c1f3832b971cfc62ccec86be data/ars_nouveau/recipes/sweeping_edge_3.json +7a8c06788707cf87a52606561556ed2d5796af7e data/ars_nouveau/recipes/thorns_1.json +6d66dfcb9b044c91c59ecfee257b3444ceab5ca0 data/ars_nouveau/recipes/thorns_2.json +f0a934796f04c228a5acc8458c350edceba733e8 data/ars_nouveau/recipes/thorns_3.json +9e54d82da1da081044c46ba528e282ef680bbf4f data/ars_nouveau/recipes/thread_amethyst_golem.json +31b91d2dcde117b1e63c757d9b6c502fb3f9cbfc data/ars_nouveau/recipes/thread_chilling.json +e12e5d8abfeca1d77177f099e099b2a673c0b507 data/ars_nouveau/recipes/thread_depths.json +206065144c7a2b27fe83824b81ed4de131dafccd data/ars_nouveau/recipes/thread_drygmy.json +036fbe60a5ceab2389343cd9bf269196a507c21d data/ars_nouveau/recipes/thread_feather.json +2cbb8df5e30297af6336a24dc58e0502fef02a42 data/ars_nouveau/recipes/thread_gliding.json +ddbe9f0a66cde1fc6d0da2b27c7145d0e7874a78 data/ars_nouveau/recipes/thread_heights.json +83b148515f0687dddfbb730c3edbefa98f86abc6 data/ars_nouveau/recipes/thread_high_step.json +20e017e91d313e59032b5e7f23aa69930384f8a8 data/ars_nouveau/recipes/thread_immolation.json +8ded4b4995884f924bc05d39976f0e8092984a5a data/ars_nouveau/recipes/thread_kindling.json +e1f904ed98b8038868d0445b35c7fc8cdc534024 data/ars_nouveau/recipes/thread_life_drain.json +ccd0369f5106f228ec923319b32f6ac6d370c8c5 data/ars_nouveau/recipes/thread_magic_capacity.json +ed7eafe49de50eb5cd865d29f786ea2a76df02f0 data/ars_nouveau/recipes/thread_repairing.json +b7497d22af35b79a8bcf30644be7301bde408fb5 data/ars_nouveau/recipes/thread_spellpower.json +24fb3d52e1bfe932469c5eb74a0c59c445df77e9 data/ars_nouveau/recipes/thread_starbuncle.json +b5480513683ac166c8f3ac8d973cb24b29d918fc data/ars_nouveau/recipes/thread_undying.json +68a80f65febc886f3ee09deff19fdc72e6bf1442 data/ars_nouveau/recipes/thread_warding.json +56db861c10828de84d8c8fe9c4f5cfbec622751a data/ars_nouveau/recipes/thread_whirlisprig.json +495fe90ec4b2c80444611a169db9ee421b77ae9c data/ars_nouveau/recipes/thread_wixie.json +87a1e549710354e03939b5a88685f15ee5eb995b data/ars_nouveau/recipes/timer_spell_turret.json +69180aa1d418f1bf68eeda49e2d7f573c914a51d data/ars_nouveau/recipes/unbreaking_1.json +240061b982b2b457462622b1b48f676dc83e9be6 data/ars_nouveau/recipes/unbreaking_2.json +e2f19fc062070e24ae35597c096eb691766b551c data/ars_nouveau/recipes/unbreaking_3.json +366114e867ab11ec19a9c13e3e8f88a4b681ec10 data/ars_nouveau/recipes/void_jar.json +b9c3afd44505bf198b797a2b5f46ce9a5ed3f18b data/ars_nouveau/recipes/wand.json +55df26b1d3d21a7d0240837aa404ad7f1bd3e0de data/ars_nouveau/recipes/warp_scroll_copy.json +d403242b22926cd16ad7047d9b8891d7f5a487ff data/ars_nouveau/recipes/whirlisprig_charm.json +c89e7cfa113958b729e50ac301a002d524989a5d data/ars_nouveau/recipes/wixie_charm.json diff --git a/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 b/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 deleted file mode 100644 index d8bb84730f..0000000000 --- a/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 +++ /dev/null @@ -1,40 +0,0 @@ -// 1.20.1 2023-10-08T20:36:02.3394116 Advancements -7295239c199c7886bf0317067fbaf3090076239e data/ars_nouveau/advancements/alteration_table.json -6781bad48309645bfb0fab3d02adfa7c33b5852c data/ars_nouveau/advancements/amethyst_golem_charm.json -8b36814d9bda6dcf457239295627d68bda637474 data/ars_nouveau/advancements/apprentice_spell_book.json -25ccc181f0e39492be414d3e49cdbe5e94b8d525 data/ars_nouveau/advancements/archmage_spell_book.json -b26f1a7e3c1e5af31b6810efff6572a12cef0e51 data/ars_nouveau/advancements/basic_spell_turret.json -4db4f0a6dedb1565571057f76d0ea1be286d3c8a data/ars_nouveau/advancements/catch_lightning.json -5eae06db2ac182afa3d08bad37064e5472198150 data/ars_nouveau/advancements/create_portal.json -6e2028d3003c1d05ae6eb3e68286aec602943d1b data/ars_nouveau/advancements/drygmy_charm.json -61888987172b4ec11fe02f4aa80b024f962281d5 data/ars_nouveau/advancements/eat_bombegranate.json -e26ad2307ee1b70efe15cfcbab1ab749af46048e data/ars_nouveau/advancements/enchanting_apparatus.json -7941e0d3c4c0a67f7c8a265e86ba9aecf1bae10e data/ars_nouveau/advancements/familiar.json -6c1a62096abeeae2c30a5623af2d7b4c9ab3abd9 data/ars_nouveau/advancements/imbuement_chamber.json -ecea019da4c9883f8222a24020d91bfb45b822db data/ars_nouveau/advancements/magebloom_crop.json -c153e6a545fb4aa246bd5e73384272b4e767571b data/ars_nouveau/advancements/mob_jar.json -f38e21479fe3be11fce1309bdbfe55d812be7f7b data/ars_nouveau/advancements/novice_spell_book.json -99f7861a9be18fbd67c91be44d1447edc05fab8c data/ars_nouveau/advancements/poof_mob.json -200710eb2cfbf18d9547cc08e1d405966428ccd7 data/ars_nouveau/advancements/potion_diffuser.json -7c6251197378383cf1ee5163acf227899d386662 data/ars_nouveau/advancements/potion_flask.json -a41878e8192bb3154e1d55165608c10c5a640e03 data/ars_nouveau/advancements/potion_jar.json -7ae0149b4e7e1c24cb9b8879080592d85dec20c5 data/ars_nouveau/advancements/potion_melder.json -ca760aefd6cecc0d54e0d0c3f2a411552b79d967 data/ars_nouveau/advancements/prismatic.json -0c41c790e0c758f2570a802ba7e1b66cbfb8b65d data/ars_nouveau/advancements/ritual_brazier.json -d4af90d483986bdf9289897b1dd7687ef4daa975 data/ars_nouveau/advancements/ritual_gravity.json -05c322d82a943da793534201a48a821a55b8d502 data/ars_nouveau/advancements/root.json -6c481c463e143e164abf7497497c17cfd9908af5 data/ars_nouveau/advancements/scryers_oculus.json -427e01c440adb1640e70830caf805ac82540d936 data/ars_nouveau/advancements/shapers_focus.json -fd478754b5fc95e4d8ba9b6563c606be7dfb2769 data/ars_nouveau/advancements/shrunk_starbuncle.json -3347d13613d95ab28565a4c48070c28d35474187 data/ars_nouveau/advancements/source_jar.json -7e2ed1f871133a701cda4d650714c34c4ea0c4e4 data/ars_nouveau/advancements/spell_prism.json -5255a7bb9e19e4f0c117c9e2abc8969271d39984 data/ars_nouveau/advancements/starbuncle_shades.json -ad6d82016052260971adf3dc5bea3d78e9d2f6e2 data/ars_nouveau/advancements/starby_charm.json -d4be553019610d360394cabf7098393f8c0f1b12 data/ars_nouveau/advancements/summon_focus.json -5d84793bf8b791e98f0734e50f8605f4aff6848a data/ars_nouveau/advancements/time_in_a_bottle.json -98fdd2b40fd5a51c2ed8a2ce76c5181f6c29e14e data/ars_nouveau/advancements/warp_scroll.json -b50a8ef059f6848aa86c2b9ae66f00ea9705f5b5 data/ars_nouveau/advancements/whirlisprig_charm.json -a807a3c7f8d096a345f20606c71a0aedc1879a58 data/ars_nouveau/advancements/wilden_explosion.json -0cee7dded67d14bc8e82a7d0a8a4579778109928 data/ars_nouveau/advancements/wilden_tribute.json -c069e8211db8b191a218076c908409d1d699d58b data/ars_nouveau/advancements/wixie_charm.json -5f3bbb513301d81412009a63d7d719dfefd26d24 data/ars_nouveau/advancements/wixie_hat.json diff --git a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 index ffb85c9d20..a6783873f9 100644 --- a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 +++ b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 @@ -1,5 +1,4 @@ -// 1.20.1 2024-05-25T15:52:16.7098195 Patchouli -d5f03c259d2af4f5e8e286639783f4fc833b1076 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/aqua_affinity.json +// 1.21 2024-07-05T22:41:47.5481227 Patchouli 2ec536fea831588201432d61d70af61385882054 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/alteration_table.json a82f4fc73946d228b1e3f5e03d0ecef46f33cdfb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/applying_perks.json 8ce1d8e886b45066bc5c1d9d8e87bdabbb27ae27 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor.json @@ -40,10 +39,6 @@ c5c734978c587616db905cdcdd4da1bd054ab42b assets/ars_nouveau/patchouli_books/worn f6550bcc2b3942c8c56bcee77a7eb1b665f94dce assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/whirlisprig_charm.json 6c33f9c15e7ae17847d3d0b827d2fed0f25dab47 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/wixie_charm.json 3ac1fbba7133877181a6dfb45a3912643d84c057 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/wixie_hat.json -1611ad9925068a078a2c38232eb4838afe522831 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/bane_of_arthropods.json -4410ed3db44cc2768b3e7112c540aa2f85542302 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/blast_protection.json -50ab5ad4ee56ed51741919095bf1a1d42c68f5c5 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/depth_strider.json -df71d7770db5331a593675a532d6ef185673afde assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/efficiency.json d50e699fd8864679faf31cce12f56187089c702e assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/how_to_enchant.json a0ad396126caa1957af15dcea3c0d6d2fb69d215 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/alchemists_crown.json 2fb96ae53395bc9195823d0dbf32f14c16714746 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/amulet_of_mana_boost.json @@ -81,11 +76,6 @@ bad5903ed7c684d271018903b883dd0d93e90be9 assets/ars_nouveau/patchouli_books/worn 28d5400a00e0a3815baca6c09638bd9975b7b39c assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/familiars/familiar_whirlisprig.json 6132f230c492940e5fe2300d68e5beda78a8123d assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/familiars/familiar_wixie.json a0ff769b287c249b70f38c077c166d2fe535a908 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/familiars/summoning_familiars.json -ed569beaa89979f9b4a8c561451a12d5de31cb35 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/feather_falling.json -4bfb4d7066b0422fe9054b156330302d3b432aa6 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/fire_aspect.json -41500ea885383ff578f8bdc85f79e0c8ef0368b0 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/fire_protection.json -d89dc9f18a450067816b2bbe5f9961610f920e04 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/flame.json -b76f876ee770c8710bafa355e9d527260fdbb541 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/fortune.json c01907f9d8427a918dc5b87120bd72737e949a4b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/apparatus_crafting.json 4f9fc7476eb34327f97b015055b5c347211aab70 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/better_casting.json db85a7250583470d885c54c2968242ce9c8ff0f2 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/new_glyphs.json @@ -178,9 +168,6 @@ b4fa0ba50c09a58436480ef00c0885402acaf50f assets/ars_nouveau/patchouli_books/worn 9eabc682bf4db9cf279c69762b12c1e657b1dc3c assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_wall.json 4cc981601776c7b95dab585271966183f450b228 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_wither.json 5f6a0b507b8bc0c8a36125bb54a27b66d27c6ebf assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/rewind.json -372bd6add262cac20658b0ab6181fc74908fd8ff assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/infinity.json -30e7760ae54a753465d48d6609dd0edc7c480e44 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/knockback.json -b6ce8c4962d9de6fc0a3194007ea8516046d5a6c assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/looting.json 50235d1b87546d57973ce69945517a432f22ed3e assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/bookwyrm_charm.json 1a25ac02c68a2ba58342ed551f59c60f5f8832d8 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/brazier_relay.json 730a6bdae91b4a8239778753105a2b36e23e06b4 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/enchanting_apparatus.json @@ -198,17 +185,8 @@ eb9ec934fad69de9859f3ea369e0b425e5f49a8e assets/ars_nouveau/patchouli_books/worn 9ea03a0bf9efe62392c5f2739a3689fdc39c31de assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/scryer_scroll.json 7be64662ebd5e76cdc477b564d6554127f1f41a0 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/storage_lectern.json e797ff6d4a79504b65178376196d5442fed62f42 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/warp_portal.json -9b4e79632022441481188de75ca691f0bdba400f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mana_boost.json -9504291ac23aa6afa832b57f78e357ced8776711 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mana_regen.json 71b1f74e7cc2ad20e3a61b777a7b46ea53f93a02 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mod_news/mod_news.json ef537c19f4d82731675ea19c6b24223bc44f97a1 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mod_news/support_mod.json -15aca30d2b0769add4852c5db9fec7b59d3a95af assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/multishot.json -0cefd41fde33d02b5e267590e57bcdac8d99f061 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/piercing.json -8db5d0ed0a7194aea0ea3472164d466ce5b45b3d assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/power.json -2fceaf71534bd874bf910eacd8b8959e8bec9cfc assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/projectile_protection.json -3a8ad1489c1839eca6f70dd8c17e7fed6fecd36b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/protection.json -3bac46c81e3334e1b3e3d0bfe903dd9ddd7c62e7 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/punch.json -01a9b8de671af3355f8e6dd3ae9864a704d1c236 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/quick_charge.json c0133d1f6bc4d504f978862421be5322cce9a8f2 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/archwood.json be9750fac4d703ce1091a78ddd1e68afe7d07c57 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/archwood_forest.json a8873366db454ebb1a2b3bc4b4a1e231c1149368 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/decorative.json @@ -218,7 +196,6 @@ d233d1c6e535ed96c4b0d658a3753a872b244b3e assets/ars_nouveau/patchouli_books/worn 470e5c7898f68e4ebd1e4d875572220b34ae005b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/sourceberry.json db2496ea2719bf0896a2bc677d6b7acfc70b2bfc assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/weald_walker.json 538a462442e2a483ae77691159097b15c550ee41 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/wilden.json -42b5cfa4e9884b2ef27ce2198567192bad9d6f8b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/respiration.json 9aead2cc81b16e5fae92249660da4f6ba82d6285 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/performing_rituals.json 183986f935c469bdf1fdb35de3fb0db38694c893 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_animal_summon.json 49aeb97ef8a6053c66144350d3844e1b0335a745 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_awakening.json @@ -244,9 +221,6 @@ ec591ffd95169da87b8c22b4813193df78d55bc1 assets/ars_nouveau/patchouli_books/worn c8758a36d9c9d49d217acf78b132c5aa8cf67c72 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_sunrise.json 682bd8c651c407289485d6b874f0711792e390f6 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_warping.json 38d8253759c61f192b156e87c67de8674058ad9f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_wilden_summon.json -3b981535457f90643e45c21d851924271afa2283 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/sharpness.json -dbb199e3a567e3a71177d41c2b8922afb8389028 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/silk_touch.json -38ba77e54d73ec616e70b2fdfb2f78dbf0bfab53 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/smite.json 5c9d742c9d9f7c4e9edb008f162b47b8b5443405 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/agronomic_sourcelink.json a15996ea5afdc6cb22c8836b07ff5ea9f9094f5f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/alchemical_sourcelink.json 3db09458abf213e57f9706cd310b11b53eb49ccd assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/mycelial_sourcelink.json @@ -258,6 +232,3 @@ d7507128658b7179b51d141ce2b4b70864983cdc assets/ars_nouveau/patchouli_books/worn 9064367451a30de1e079fe457416ae9a8ceeee4e assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/source_jar.json c1d3cc4349a72b0b4173d25b8a7a0959b6b6983a assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/vitalic_sourcelink.json 8f1a33d70f98b657d619f325b2f6fc434876ba30 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/volcanic_sourcelink.json -86408d8e6dc755d23ddcbaff1600bdba721657a7 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/sweeping.json -7d49e0efa8fa2905c64c982e993bad6e72a0e6d9 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/thorns.json -c7e15b81420b23c10a466cde899f56064e662c7f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/unbreaking.json diff --git a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 index 5e8bd2e5e7..ed20fed5f5 100644 --- a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 +++ b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 @@ -1,60 +1,60 @@ -// 1.20.1 2024-06-15T16:02:11.4218629 AN tags -939cde8f97e4e8d7ea8445415522f703b2b927d4 data/ars_nouveau/tags/blocks/an_decorative.json -de95bc21249101b079255a1a00274f60d55e0602 data/ars_nouveau/tags/blocks/blazing_logs.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/blocks/break_blacklist.json -d4330c0670a8ff0476a64cff8c8e30d9e6d5d760 data/ars_nouveau/tags/blocks/break_with_pickaxe.json -f18ad76deff8743ab0ab66eec039a6b49e1af706 data/ars_nouveau/tags/blocks/cascading_logs.json -f897daf999684561d1d4a41ba1401c1e4f0a57bf data/ars_nouveau/tags/blocks/dowsing_rod.json -bffdd6dd7a1a644d46e5f7a0fad91ff652e495c8 data/ars_nouveau/tags/blocks/flourishing_logs.json -a6a64805262317e89ec5a7353c2584f80b7a9ce8 data/ars_nouveau/tags/blocks/golem/budding.json -d4330c0670a8ff0476a64cff8c8e30d9e6d5d760 data/ars_nouveau/tags/blocks/golem/cluster.json -9508afb5b4ebf137a32d3731f2be1d9bb3c21b33 data/ars_nouveau/tags/blocks/gravity_blacklist.json -ca6ae04e3b5412d751537558230d824bfd86d7da data/ars_nouveau/tags/blocks/harvest/fellable.json -df87c9e82c58b24ac8e979c73fc3be68bf25b4b0 data/ars_nouveau/tags/blocks/harvest/foliage.json -7d78d30b1cc01fb43cfb8364ed31026ee0640387 data/ars_nouveau/tags/blocks/harvest/stems.json -5efa96a28ef2e2290cc0a0f827844a96bd9f94f2 data/ars_nouveau/tags/blocks/ignore_tile.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/blocks/interact_blacklist.json -bf1a44f8a79b447f1e7b6541e8c3d93e4ef6f71f data/ars_nouveau/tags/blocks/magic_plants.json -ce9ccf92ade8cd330c990516ee0f8a30c35adea9 data/ars_nouveau/tags/blocks/magic_saplings.json -6429b3e3e4f89e7bb44af0c2ab98368717674afc data/ars_nouveau/tags/blocks/no_break_drop.json -7d0c18d2019049acf42d10f3ae809011f4e968c1 data/ars_nouveau/tags/blocks/occludes_spell_sensor.json -b0d3df2afba9d4095985b91440f57652d9217d04 data/ars_nouveau/tags/blocks/storage/autopull_disabled.json -f5e3f6895ab28e98f84db162bb5a7ec0d8484aae data/ars_nouveau/tags/blocks/summon_bed.json -449d2dab531ac4032acb37910e9a380d07431391 data/ars_nouveau/tags/blocks/summon_sleepable.json -47f1f23357a86b9184362224b5c7095555f6846d data/ars_nouveau/tags/blocks/vexing_logs.json -a8499e798f3d96d8569c7b06e1c9b83d05da3caf data/ars_nouveau/tags/blocks/whirlisprig/greatly_likes.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/blocks/whirlisprig/kinda_likes.json -f36268e9375442e51cbf98f2c4d573082aa56378 data/forge/tags/blocks/bushes.json -2f9b7e099208b0e404e0f81c89f2a368e5d909da data/forge/tags/blocks/chests.json -2f9b7e099208b0e404e0f81c89f2a368e5d909da data/forge/tags/blocks/chests/wooden.json -87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/forge/tags/blocks/fences.json -87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/forge/tags/blocks/fences/wooden.json -0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/forge/tags/blocks/fence_gates.json -0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/forge/tags/blocks/fence_gates/wooden.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/forge/tags/blocks/relocation_not_supported.json -3737e6b65e87993bd971b233c3aca5088721eb32 data/minecraft/tags/blocks/bee_growables.json -43a847dca5f71ae27537abc65fabcd8d3fdb1c72 data/minecraft/tags/blocks/buttons.json -3737e6b65e87993bd971b233c3aca5088721eb32 data/minecraft/tags/blocks/crops.json -a01909919207615cda1bb44f33db287efa02333b data/minecraft/tags/blocks/doors.json -87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/minecraft/tags/blocks/fences.json -0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/minecraft/tags/blocks/fence_gates.json -538ec6e043a39f9e362acfa8b44db2f266ace007 data/minecraft/tags/blocks/fire.json -248bbddd99634aced7fd4adc84b0290de05f4a0a data/minecraft/tags/blocks/leaves.json -248bbddd99634aced7fd4adc84b0290de05f4a0a data/minecraft/tags/blocks/leaves/archwood_leaves.json -da17a4d3113a940d3ad74c9d53bb9e561d800a66 data/minecraft/tags/blocks/logs.json -da17a4d3113a940d3ad74c9d53bb9e561d800a66 data/minecraft/tags/blocks/logs_that_burn.json -e8c6b8b119d79bc393cacf55b78f9847be95731a data/minecraft/tags/blocks/mineable/axe.json -09d25939216754a32aee1e0e3278aa55cc5b770c data/minecraft/tags/blocks/mineable/hoe.json -05a1fe2e7a67fb4d6bf6ebb18cdfc7e6353d6e8d data/minecraft/tags/blocks/mineable/pickaxe.json -f898aac12b01b598949701b1f6e45aa0cd1d9a25 data/minecraft/tags/blocks/planks.json -5a18f153ac2947c6cea854e2fa5be21d85eb6766 data/minecraft/tags/blocks/portals.json -ce9ccf92ade8cd330c990516ee0f8a30c35adea9 data/minecraft/tags/blocks/saplings.json -c5ffd8d59cb98c262e42a783ddf9a73a9b76ad9d data/minecraft/tags/blocks/slabs.json -e0e9a39db9de083bbe33dbea99e0f4c0be9627d0 data/minecraft/tags/blocks/stairs.json -23fc13405d4dc43512deb39ee5bbbb73da177166 data/minecraft/tags/blocks/trapdoors.json -43a847dca5f71ae27537abc65fabcd8d3fdb1c72 data/minecraft/tags/blocks/wooden_buttons.json -a01909919207615cda1bb44f33db287efa02333b data/minecraft/tags/blocks/wooden_doors.json -87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/minecraft/tags/blocks/wooden_fences.json -70afef6fe4926a8dbf1205248dc1371974ef3037 data/minecraft/tags/blocks/wooden_slabs.json -e5d97b748b59672ba4baec9c3f1093370adf0332 data/minecraft/tags/blocks/wooden_stairs.json -23fc13405d4dc43512deb39ee5bbbb73da177166 data/minecraft/tags/blocks/wooden_trapdoors.json +// 1.21 2024-07-05T22:41:47.5461209 AN tags +939cde8f97e4e8d7ea8445415522f703b2b927d4 data/ars_nouveau/tags/block/an_decorative.json +de95bc21249101b079255a1a00274f60d55e0602 data/ars_nouveau/tags/block/blazing_logs.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/block/break_blacklist.json +d4330c0670a8ff0476a64cff8c8e30d9e6d5d760 data/ars_nouveau/tags/block/break_with_pickaxe.json +f18ad76deff8743ab0ab66eec039a6b49e1af706 data/ars_nouveau/tags/block/cascading_logs.json +f897daf999684561d1d4a41ba1401c1e4f0a57bf data/ars_nouveau/tags/block/dowsing_rod.json +bffdd6dd7a1a644d46e5f7a0fad91ff652e495c8 data/ars_nouveau/tags/block/flourishing_logs.json +a6a64805262317e89ec5a7353c2584f80b7a9ce8 data/ars_nouveau/tags/block/golem/budding.json +d4330c0670a8ff0476a64cff8c8e30d9e6d5d760 data/ars_nouveau/tags/block/golem/cluster.json +245fdfab101831211397a667863633b9c6d8bf79 data/ars_nouveau/tags/block/gravity_blacklist.json +ca6ae04e3b5412d751537558230d824bfd86d7da data/ars_nouveau/tags/block/harvest/fellable.json +df87c9e82c58b24ac8e979c73fc3be68bf25b4b0 data/ars_nouveau/tags/block/harvest/foliage.json +7d78d30b1cc01fb43cfb8364ed31026ee0640387 data/ars_nouveau/tags/block/harvest/stems.json +5efa96a28ef2e2290cc0a0f827844a96bd9f94f2 data/ars_nouveau/tags/block/ignore_tile.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/block/interact_blacklist.json +bf1a44f8a79b447f1e7b6541e8c3d93e4ef6f71f data/ars_nouveau/tags/block/magic_plants.json +ce9ccf92ade8cd330c990516ee0f8a30c35adea9 data/ars_nouveau/tags/block/magic_saplings.json +6429b3e3e4f89e7bb44af0c2ab98368717674afc data/ars_nouveau/tags/block/no_break_drop.json +7d0c18d2019049acf42d10f3ae809011f4e968c1 data/ars_nouveau/tags/block/occludes_spell_sensor.json +b0d3df2afba9d4095985b91440f57652d9217d04 data/ars_nouveau/tags/block/storage/autopull_disabled.json +f5e3f6895ab28e98f84db162bb5a7ec0d8484aae data/ars_nouveau/tags/block/summon_bed.json +449d2dab531ac4032acb37910e9a380d07431391 data/ars_nouveau/tags/block/summon_sleepable.json +47f1f23357a86b9184362224b5c7095555f6846d data/ars_nouveau/tags/block/vexing_logs.json +a8499e798f3d96d8569c7b06e1c9b83d05da3caf data/ars_nouveau/tags/block/whirlisprig/greatly_likes.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/block/whirlisprig/kinda_likes.json +2f9b7e099208b0e404e0f81c89f2a368e5d909da data/c/tags/block/chests.json +2f9b7e099208b0e404e0f81c89f2a368e5d909da data/c/tags/block/chests/wooden.json +87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/c/tags/block/fences.json +87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/c/tags/block/fences/wooden.json +0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/c/tags/block/fence_gates.json +0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/c/tags/block/fence_gates/wooden.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/c/tags/block/relocation_not_supported.json +3737e6b65e87993bd971b233c3aca5088721eb32 data/minecraft/tags/block/bee_growables.json +43a847dca5f71ae27537abc65fabcd8d3fdb1c72 data/minecraft/tags/block/buttons.json +3737e6b65e87993bd971b233c3aca5088721eb32 data/minecraft/tags/block/crops.json +a01909919207615cda1bb44f33db287efa02333b data/minecraft/tags/block/doors.json +87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/minecraft/tags/block/fences.json +0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/minecraft/tags/block/fence_gates.json +538ec6e043a39f9e362acfa8b44db2f266ace007 data/minecraft/tags/block/fire.json +248bbddd99634aced7fd4adc84b0290de05f4a0a data/minecraft/tags/block/leaves.json +248bbddd99634aced7fd4adc84b0290de05f4a0a data/minecraft/tags/block/leaves/archwood_leaves.json +da17a4d3113a940d3ad74c9d53bb9e561d800a66 data/minecraft/tags/block/logs.json +da17a4d3113a940d3ad74c9d53bb9e561d800a66 data/minecraft/tags/block/logs_that_burn.json +e8c6b8b119d79bc393cacf55b78f9847be95731a data/minecraft/tags/block/mineable/axe.json +09d25939216754a32aee1e0e3278aa55cc5b770c data/minecraft/tags/block/mineable/hoe.json +05a1fe2e7a67fb4d6bf6ebb18cdfc7e6353d6e8d data/minecraft/tags/block/mineable/pickaxe.json +f898aac12b01b598949701b1f6e45aa0cd1d9a25 data/minecraft/tags/block/planks.json +5a18f153ac2947c6cea854e2fa5be21d85eb6766 data/minecraft/tags/block/portals.json +ce9ccf92ade8cd330c990516ee0f8a30c35adea9 data/minecraft/tags/block/saplings.json +c5ffd8d59cb98c262e42a783ddf9a73a9b76ad9d data/minecraft/tags/block/slabs.json +e0e9a39db9de083bbe33dbea99e0f4c0be9627d0 data/minecraft/tags/block/stairs.json +23fc13405d4dc43512deb39ee5bbbb73da177166 data/minecraft/tags/block/trapdoors.json +43a847dca5f71ae27537abc65fabcd8d3fdb1c72 data/minecraft/tags/block/wooden_buttons.json +a01909919207615cda1bb44f33db287efa02333b data/minecraft/tags/block/wooden_doors.json +87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/minecraft/tags/block/wooden_fences.json +70afef6fe4926a8dbf1205248dc1371974ef3037 data/minecraft/tags/block/wooden_slabs.json +e5d97b748b59672ba4baec9c3f1093370adf0332 data/minecraft/tags/block/wooden_stairs.json +23fc13405d4dc43512deb39ee5bbbb73da177166 data/minecraft/tags/block/wooden_trapdoors.json +f36268e9375442e51cbf98f2c4d573082aa56378 data/neoforge/tags/block/bushes.json diff --git a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c index 17973a4b8c..c3e82eac83 100644 --- a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c +++ b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c @@ -1,82 +1,82 @@ -// 1.20.1 2024-04-27T17:54:35.4529148 Glyph Recipes -4a93ce36d7592e183a340b759dd8354f02aaa6c3 data/ars_nouveau/recipes/burst.json -9350ccacd4478fc29cbb997b18a01b45d14c0bde data/ars_nouveau/recipes/glyph_accelerate.json -3c24bcec44204ae8e60321ee54866cf60dc7dd87 data/ars_nouveau/recipes/glyph_amplify.json -1e14184172ba9754528e2ff8884591cfd0431ca8 data/ars_nouveau/recipes/glyph_animate_block.json -ea9c60e7a04292b2aee53af1b379a29e073d5dbe data/ars_nouveau/recipes/glyph_aoe.json -8387464470ea15598614a66e5ca7ebcf32ef4499 data/ars_nouveau/recipes/glyph_blink.json -9341d4522a5542067046cbcdcbf1df90fcd6c852 data/ars_nouveau/recipes/glyph_bounce.json -9a945272486561840fe3923f1599c657cc3cae7c data/ars_nouveau/recipes/glyph_break.json -6934efda9f325fd38cc55c9b098ce85db8ec7506 data/ars_nouveau/recipes/glyph_cold_snap.json -9a606666589f82d3db82f803aa0bfd1730927b7c data/ars_nouveau/recipes/glyph_conjure_water.json -b32e6fa20da670e7ce1d9fd7f1ebdd51f69441b4 data/ars_nouveau/recipes/glyph_craft.json -e75aaa854076e614af2fcaf50a884b08286f493f data/ars_nouveau/recipes/glyph_crush.json -3d009e1f04a0410dd961ff9bb4c16dcb065f4bd9 data/ars_nouveau/recipes/glyph_cut.json -25238980637efb8280b0e2ed25af5f48bb337d18 data/ars_nouveau/recipes/glyph_dampen.json -77611408ebea85fe966c13a3c347bebce44b2875 data/ars_nouveau/recipes/glyph_decelerate.json -b236286da9805734e9d077333dc5ee693c2ef59c data/ars_nouveau/recipes/glyph_delay.json -e4c110c05a48734e8d9da504a64de190b399d528 data/ars_nouveau/recipes/glyph_dispel.json -8f9b49c2fd7a6948a2fcc8ef5405629ceab38dfb data/ars_nouveau/recipes/glyph_duration_down.json -559f39040d6baf95aa50c668e3d35fbe42142bb9 data/ars_nouveau/recipes/glyph_ender_inventory.json -7e03d152b59337907fcbad0741b24b02c9861521 data/ars_nouveau/recipes/glyph_evaporate.json -8d87f5fb4506e94141ee90f51a786616dd994810 data/ars_nouveau/recipes/glyph_exchange.json -49e86cc917f0633a7f3a206cc4c205d78c77933e data/ars_nouveau/recipes/glyph_explosion.json -055e79e689bf26f4160e567893d961b64799dd7a data/ars_nouveau/recipes/glyph_extend_time.json -2093b0b66893a8277d14d3b156fd8e547218a937 data/ars_nouveau/recipes/glyph_extract.json -0dd80e782d809ad717cb224bfe8e5de9559b8688 data/ars_nouveau/recipes/glyph_fangs.json -86783d3067275318b98cfa42c20bfe8b61b840bd data/ars_nouveau/recipes/glyph_fell.json -1c3637f508c95c6a3776be057941b950eb3296aa data/ars_nouveau/recipes/glyph_firework.json -6c0a6c9bf930c4ea014d028a1d3923823ed68a64 data/ars_nouveau/recipes/glyph_flare.json -59853a3f7c1f602ad6991668a6d292cedceab7d6 data/ars_nouveau/recipes/glyph_fortune.json -61bd5eb53bcc613728eb02d2b9baf7cdd73f9564 data/ars_nouveau/recipes/glyph_freeze.json -a245741f088712611845892e402f989e186e5add data/ars_nouveau/recipes/glyph_glide.json -a76902aa37d07607826f6e810d3095db93f6d2cb data/ars_nouveau/recipes/glyph_gravity.json -003b59927120417d0811c3f70bdb82bf6553d529 data/ars_nouveau/recipes/glyph_grow.json -6dff2314681c326819b80fea3b9472da29e8a934 data/ars_nouveau/recipes/glyph_gust.json -2b16fc7e1f13e23be127c87d7d6cac572b166ee5 data/ars_nouveau/recipes/glyph_harm.json -ac5e07ae2e682bd689ec080e13ae296e3acddcd2 data/ars_nouveau/recipes/glyph_harvest.json -0425f8039a62bd7f5d79faae1f6096b78a07079b data/ars_nouveau/recipes/glyph_heal.json -16f2bfb50a9e53880ebbddd02c126772d8413527 data/ars_nouveau/recipes/glyph_hex.json -cd97b982aa19c07f34681c82df54c93d3379aa2a data/ars_nouveau/recipes/glyph_ignite.json -b78a88dfc32b3b2bd67d8bbec25a9a6a12456052 data/ars_nouveau/recipes/glyph_infuse.json -c0bc5b7d4a910d189488b9b6b57c17c16524b3da data/ars_nouveau/recipes/glyph_intangible.json -ac900ff8ea416ef7a599d0e137213c866600a83f data/ars_nouveau/recipes/glyph_interact.json -fe0c64893495b2cba18083c2a75b405031bf450b data/ars_nouveau/recipes/glyph_invisibility.json -7b0a78b09435f4e31a738bd5c21f3f970d8502ba data/ars_nouveau/recipes/glyph_launch.json -724106e07ef7114d3a3606d227223a5993b275d3 data/ars_nouveau/recipes/glyph_leap.json -4fa94cb8710e39e414647907e2596d0b867f6e6a data/ars_nouveau/recipes/glyph_light.json -e17147e4f7d94cd137f66e9f238d1ee2df0f31e8 data/ars_nouveau/recipes/glyph_lightning.json -94e1c59e578d5aba80082c3f461b5140ab0604a9 data/ars_nouveau/recipes/glyph_linger.json -65d8c21bf86eec06abbfa22c57e0d738df57a80e data/ars_nouveau/recipes/glyph_name.json -7c58bb859070f1dd17873ed38cddae31cc500e53 data/ars_nouveau/recipes/glyph_orbit.json -e479a4b5876f3d9c043211f1a5e2b1237b2ec51a data/ars_nouveau/recipes/glyph_phantom_block.json -30c901cdec84c184565b7254b10051f4e4973840 data/ars_nouveau/recipes/glyph_pickup.json -b019efb0d7512054020def6d84e97b6045a70cd8 data/ars_nouveau/recipes/glyph_pierce.json -b266aa14f7762070d7055b095a5c0a681a036236 data/ars_nouveau/recipes/glyph_place_block.json -13aa90b59435a9a64fb7e9b0b282f11f8da3a563 data/ars_nouveau/recipes/glyph_projectile.json -9e8afeddd398ba2b4703d8faf876f68262b6dee9 data/ars_nouveau/recipes/glyph_pull.json -8eab97a52dcb5d6accf3cd97e245ef8c98c60385 data/ars_nouveau/recipes/glyph_randomize.json -5ef4c9558830e69cea92a8c4afbb74f1b752d149 data/ars_nouveau/recipes/glyph_redstone_signal.json -d2c28344f777218e572949154c82a1e49efe8f2c data/ars_nouveau/recipes/glyph_rotate.json -9da5750a9304472e1a30a5cdf95adf385c53bacf data/ars_nouveau/recipes/glyph_rune.json -b7b9915f5082fc14585413e9676608d3227ba57a data/ars_nouveau/recipes/glyph_self.json -6ca85c0c62361d625cb649109857c864e8e5ab5c data/ars_nouveau/recipes/glyph_sense_magic.json -1c0baac330226a0c82184c8a9258015b6d829df9 data/ars_nouveau/recipes/glyph_sensitive.json -968dfd7b3dcf69b3fa1a394f18578ae67144a7ae data/ars_nouveau/recipes/glyph_slowfall.json -2cc23708567bbcabdcc5db8311ade8e880d77103 data/ars_nouveau/recipes/glyph_smelt.json -649a02a426b6258a8ee533738c4f5a68c478d424 data/ars_nouveau/recipes/glyph_snare.json -50ba9adabe7e2f7fea27c95160c784fdd87df08a data/ars_nouveau/recipes/glyph_split.json -71a0cf52765d27c996422fb16ad2cc500e71fee6 data/ars_nouveau/recipes/glyph_summon_decoy.json -1cd2888ee89625e10c2002b7a58fc6249b79038f data/ars_nouveau/recipes/glyph_summon_steed.json -5f7bbf4624e4de4c397f45e1bc843d4fd1897865 data/ars_nouveau/recipes/glyph_summon_undead.json -a16de95a4fd3f588f272a4ca0aa78b3654be5ad0 data/ars_nouveau/recipes/glyph_summon_vex.json -2ae740c9389524dd2f8dab79fed090c05533a247 data/ars_nouveau/recipes/glyph_summon_wolves.json -a76647ba95afa16f11715e13bf309d95a36c384a data/ars_nouveau/recipes/glyph_toss.json -fdaeeea6ff76220054dc9ee6a9d9744bb02136f3 data/ars_nouveau/recipes/glyph_touch.json -f71678a159afeb629fd22d92ebe1392a5cdb2594 data/ars_nouveau/recipes/glyph_underfoot.json -c7bd4171820b1b273044d122de1de0d355bc74b8 data/ars_nouveau/recipes/glyph_wall.json -346e5a3585ab4ead62d72eb02693ac33b4c925cb data/ars_nouveau/recipes/glyph_wind_shear.json -1a59e8eb83b348ebb1d9a7d1c63026020e0da92d data/ars_nouveau/recipes/glyph_wither.json -8c94f255c8502b3f8db72fe648890976ac5b745e data/ars_nouveau/recipes/reset.json -53e1006459d571834b6cd36bc28511b075e4786f data/ars_nouveau/recipes/rewind.json -84adc263d06920b13597ed2477ebfd7b125955c8 data/ars_nouveau/recipes/wololo.json +// 1.21 2024-07-05T22:41:47.5280938 Glyph Recipes +e4ef5c317ca1bb6d7ff64e6e65dbd41428eb9717 data/ars_nouveau/recipes/burst.json +9913a7b479e3ac1c0da2614ffae49ebaf026e6f7 data/ars_nouveau/recipes/glyph_accelerate.json +7032acba1fd2e577cec1e9e3a48331c862522b38 data/ars_nouveau/recipes/glyph_amplify.json +0e9bff6dbf895ba80b0bd5bcde200152032a087c data/ars_nouveau/recipes/glyph_animate_block.json +8bd925d7db4de20b8622eb3d39fcc082ac4d25fd data/ars_nouveau/recipes/glyph_aoe.json +15b965d4e21561025f9c74225ce5f9299abfe2ea data/ars_nouveau/recipes/glyph_blink.json +8de13db95f7d14dbf144d5cb3aaf705a45d195c8 data/ars_nouveau/recipes/glyph_bounce.json +c12a30b265277c1e793045454de09509a70564ba data/ars_nouveau/recipes/glyph_break.json +ffbb7d49317cff93082873399be237a2508e3695 data/ars_nouveau/recipes/glyph_cold_snap.json +45a9f8b6f07e6532ded8011f48a931a036c4c3d7 data/ars_nouveau/recipes/glyph_conjure_water.json +f6b8f292e7d187f2b21b7c87e113f6f1aeef29fb data/ars_nouveau/recipes/glyph_craft.json +81d95aba0686c38f16c8746ca016be871df8d1ea data/ars_nouveau/recipes/glyph_crush.json +88ea95676a6b9fd44d9da33d7f505241dea82e78 data/ars_nouveau/recipes/glyph_cut.json +3cad5c66a601dacf6bb5d08f31ec6b98b9391514 data/ars_nouveau/recipes/glyph_dampen.json +8a008779d3add831619a4081b16a4c9bea2dfe0f data/ars_nouveau/recipes/glyph_decelerate.json +23a4e63c84e9b3cbc9c972cf768ebb2b8bcea765 data/ars_nouveau/recipes/glyph_delay.json +e82372cc310cfc6f749b6eec86e238b6815801f6 data/ars_nouveau/recipes/glyph_dispel.json +4daa3b4f4849bfa6b17cc87ec029181f83eb115b data/ars_nouveau/recipes/glyph_duration_down.json +59ce04f1c3bd86741e586cbe21a8e232817de060 data/ars_nouveau/recipes/glyph_ender_inventory.json +c7d88c8b291fb8a16d644b0a123e52afbabe82e5 data/ars_nouveau/recipes/glyph_evaporate.json +3178a5019d00ca334d8b0f3a3de2a7e72f3a1a73 data/ars_nouveau/recipes/glyph_exchange.json +f4e201d11e39459b017809128a699e8604790c52 data/ars_nouveau/recipes/glyph_explosion.json +ab103fd6bf4c5125ed473191184c638168b79d13 data/ars_nouveau/recipes/glyph_extend_time.json +12e57017df0e322c9878840fdfff8d97a78ed2ec data/ars_nouveau/recipes/glyph_extract.json +9dce84836e77e0510301136613311b82147e23a9 data/ars_nouveau/recipes/glyph_fangs.json +14112a9c8c2aaaf5d482aa97c83d1f07f088c53d data/ars_nouveau/recipes/glyph_fell.json +409742ef2cf5d148f55c71a4a811551747569b60 data/ars_nouveau/recipes/glyph_firework.json +d1e68fdd9075b82c6829f19902989d5194e85b1f data/ars_nouveau/recipes/glyph_flare.json +db3cccf344ed76c5e73c6d1c7939495ea7bf2ff4 data/ars_nouveau/recipes/glyph_fortune.json +b156d1b81c65374e3ba9faedfb3d445d722e26ff data/ars_nouveau/recipes/glyph_freeze.json +fe4bc1ee1d457b7c3c6e8dd646f057688e493bf7 data/ars_nouveau/recipes/glyph_glide.json +56c8a1604b5a71e248db1a231cde67208bde3fa5 data/ars_nouveau/recipes/glyph_gravity.json +dd60a4ed00289c81dcccebad7b40bf5163243f60 data/ars_nouveau/recipes/glyph_grow.json +78ad0604b7b5127af60333497bd7627ea13c8e7c data/ars_nouveau/recipes/glyph_gust.json +febe999646d4a63714754ee8a9ad1ebeab97911c data/ars_nouveau/recipes/glyph_harm.json +9dbc6193bd7d3bf47eec6728c9ded37fc16216a9 data/ars_nouveau/recipes/glyph_harvest.json +053e9548d8b4748a43e7c6ec1408095f40952537 data/ars_nouveau/recipes/glyph_heal.json +8a6053bd3bb15e8fe990c6dc35f92e7e1271966e data/ars_nouveau/recipes/glyph_hex.json +06d96b9d2a92aacbccf400ebfc2e794376394e82 data/ars_nouveau/recipes/glyph_ignite.json +4b9d7ff36ab385619aebee5ad77417b20e0b356e data/ars_nouveau/recipes/glyph_infuse.json +35c08f159f0b64ef31645294bb57621c96942476 data/ars_nouveau/recipes/glyph_intangible.json +74110848bfcbd802ce0bb9e64913bff220e61081 data/ars_nouveau/recipes/glyph_interact.json +d68657caa28efee45bc9864ee1f48523c1e275c2 data/ars_nouveau/recipes/glyph_invisibility.json +888d6bcc4870ca81f5f764dbdb1c8f41a1828375 data/ars_nouveau/recipes/glyph_launch.json +ba8fbf41205c71635b2f83160f3807aa1365f668 data/ars_nouveau/recipes/glyph_leap.json +8826bf4f65d755e461ef9711ea7687caa41c8d0e data/ars_nouveau/recipes/glyph_light.json +071bbf896c39e6af31d79586f7797f3fa9f49223 data/ars_nouveau/recipes/glyph_lightning.json +45cb2b91645f64b35d5fe2d623d656e02020cfb0 data/ars_nouveau/recipes/glyph_linger.json +cd597326b462b00c4cb3e00e20b57848b8544c6d data/ars_nouveau/recipes/glyph_name.json +0fb93f333f3006cbffb7c6a768fbc9e4f9f011de data/ars_nouveau/recipes/glyph_orbit.json +8edfd26bba8f546ffd6b115ef8b8bedca85c1c37 data/ars_nouveau/recipes/glyph_phantom_block.json +92a3da8010db95c33d5ad2e28988149dd52024ac data/ars_nouveau/recipes/glyph_pickup.json +f74bb17bfe562f93d8436498878f5d98adff115b data/ars_nouveau/recipes/glyph_pierce.json +bc6028c06d2c6725c45822a80490ee9850a9818c data/ars_nouveau/recipes/glyph_place_block.json +66f999c678a78ae79763a2ef17822fdb7a5e0003 data/ars_nouveau/recipes/glyph_projectile.json +3952cc5e5c1648af8183f048ab4f1f45491cc7e5 data/ars_nouveau/recipes/glyph_pull.json +44ee117ed99d031c5b53b43167cb9eb7bb23277d data/ars_nouveau/recipes/glyph_randomize.json +b8d19e6007f734228ff5c3cc77a47739d0e22c3d data/ars_nouveau/recipes/glyph_redstone_signal.json +4fd550580851766be4ff0c2890d1c50f17699000 data/ars_nouveau/recipes/glyph_rotate.json +666a060411ed52137c2b3fb7a6c09a6d967d4a97 data/ars_nouveau/recipes/glyph_rune.json +f881f9e2e66389c7476338d9dac2499718b21c33 data/ars_nouveau/recipes/glyph_self.json +2b08d1ded4ef1b5c692f25ea4c9ab18f41677056 data/ars_nouveau/recipes/glyph_sense_magic.json +bffd66f9ba9907dce9e3a92c0316e14a92c1e77a data/ars_nouveau/recipes/glyph_sensitive.json +886f2211c9bfd0c105c13fa4c16c5ed7f983677f data/ars_nouveau/recipes/glyph_slowfall.json +e23f69d25ee927e35ec2d27415654635a57699d3 data/ars_nouveau/recipes/glyph_smelt.json +665ec7348ec90589ed28c638582a6e378a1f4a65 data/ars_nouveau/recipes/glyph_snare.json +b5bba37bd4768ea3f083378fbf9cab84ba7a6f8e data/ars_nouveau/recipes/glyph_split.json +3be4d85a117ac02fb085bf0e05398bd750c02c19 data/ars_nouveau/recipes/glyph_summon_decoy.json +353218b388d951fc2626c957eef2ceef40dc552e data/ars_nouveau/recipes/glyph_summon_steed.json +cb52a0151b23d440d7cb408c57da81521b6a3240 data/ars_nouveau/recipes/glyph_summon_undead.json +9106bd510401b2d4b322a8fcff280aefb5b7c8e3 data/ars_nouveau/recipes/glyph_summon_vex.json +882e1bb46ced8b0b5cdabec1efb9b6e501ac84d1 data/ars_nouveau/recipes/glyph_summon_wolves.json +5c4d580cb5c5d23ee861e9877cec17b525c33232 data/ars_nouveau/recipes/glyph_toss.json +6203889841c33fad76490d252c49d44cf5480a4f data/ars_nouveau/recipes/glyph_touch.json +73cac8ef303a09fc4d4983667634473c6ec2ba93 data/ars_nouveau/recipes/glyph_underfoot.json +73fcc563c61d67a8d13fcf3173792f5870d81332 data/ars_nouveau/recipes/glyph_wall.json +56be773111a9c8c80e4a58e7fb31330b9a263bee data/ars_nouveau/recipes/glyph_wind_shear.json +6872442625e3e5c91a8212221b0d42e1bad4d196 data/ars_nouveau/recipes/glyph_wither.json +90c1991b4da7582d59891b3779966c08f2b4b11d data/ars_nouveau/recipes/reset.json +1e7ed0579d489e3f57ce351e43bc3466ca8925a5 data/ars_nouveau/recipes/rewind.json +bae3dc70f49ed0abc765dfd63e7321a1eb5101cc data/ars_nouveau/recipes/wololo.json diff --git a/src/generated/resources/.cache/f49682cfc17456297bb895b136258055d85afc0c b/src/generated/resources/.cache/f49682cfc17456297bb895b136258055d85afc0c index d6db556806..eb4aa692c3 100644 --- a/src/generated/resources/.cache/f49682cfc17456297bb895b136258055d85afc0c +++ b/src/generated/resources/.cache/f49682cfc17456297bb895b136258055d85afc0c @@ -1,16 +1 @@ -// 1.20.1 2023-10-08T20:36:02.3269016 ArsNouveau: Json Datagen -52b2fa316594532c45007918108b95cd4c39384d data/ars_nouveau/recipes/dye_apprentice_spell_book.json -10c2eea031e674a714b28ddf95190579ceebef08 data/ars_nouveau/recipes/dye_arcanist_boots.json -bf4382767f1437c32139176a510a5df2df71ff3f data/ars_nouveau/recipes/dye_arcanist_hood.json -e4b60daafc4e506d2179e536d7ddbfdac7c512d9 data/ars_nouveau/recipes/dye_arcanist_leggings.json -088c7209606127712bfe1f2a74843d01a952d91d data/ars_nouveau/recipes/dye_arcanist_robes.json -b28556eb2fcc1d1ab07e06cb72a525a75c8ecfde data/ars_nouveau/recipes/dye_archmage_spell_book.json -9f701ae9cce9ec3cf39de9c6a424c8ef000c3ce5 data/ars_nouveau/recipes/dye_battlemage_boots.json -01a81a74a4957065b1f39b07a954c8c80ac329d5 data/ars_nouveau/recipes/dye_battlemage_hood.json -186d407bd304b6676aa7b0ca7c051677e0342820 data/ars_nouveau/recipes/dye_battlemage_leggings.json -6d4515d622c19c7a931084af1a8e21e21a47a9b6 data/ars_nouveau/recipes/dye_battlemage_robes.json -62c7be53939987218779763d5922e15dc275ce68 data/ars_nouveau/recipes/dye_novice_spell_book.json -15ad554c47715a3a9b97545727e24a32d3a9da17 data/ars_nouveau/recipes/dye_sorcerer_boots.json -5d5d61b848873444a1f8205ed312241d18036da0 data/ars_nouveau/recipes/dye_sorcerer_hood.json -153dcc9946bcb6c207312d9b2e4344904640e70f data/ars_nouveau/recipes/dye_sorcerer_leggings.json -29748fb2f26bd59a933fdefd3560b38704ebfaba data/ars_nouveau/recipes/dye_sorcerer_robes.json +// 1.21 2024-07-05T22:41:47.5536456 ArsNouveau: Json Datagen diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/aqua_affinity.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/aqua_affinity.json deleted file mode 100644 index a64876517b..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/aqua_affinity.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.aqua_affinity", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:aqua_affinity_1" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/bane_of_arthropods.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/bane_of_arthropods.json deleted file mode 100644 index ec031e16a8..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/bane_of_arthropods.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.bane_of_arthropods", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:bane_of_arthropods_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:bane_of_arthropods_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:bane_of_arthropods_3" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:bane_of_arthropods_4" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:bane_of_arthropods_5" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/blast_protection.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/blast_protection.json deleted file mode 100644 index f40baacd70..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/blast_protection.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.blast_protection", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:blast_protection_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:blast_protection_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:blast_protection_3" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:blast_protection_4" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/depth_strider.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/depth_strider.json deleted file mode 100644 index 4ab8fd48a4..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/depth_strider.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.depth_strider", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:depth_strider_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:depth_strider_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:depth_strider_3" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/efficiency.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/efficiency.json deleted file mode 100644 index 3105d78404..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/efficiency.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.efficiency", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:efficiency_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:efficiency_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:efficiency_3" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:efficiency_4" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:efficiency_5" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/feather_falling.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/feather_falling.json deleted file mode 100644 index 3818a0f0c4..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/feather_falling.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.feather_falling", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:feather_falling_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:feather_falling_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:feather_falling_3" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:feather_falling_4" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/fire_aspect.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/fire_aspect.json deleted file mode 100644 index 469f18690e..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/fire_aspect.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.fire_aspect", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:fire_aspect_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:fire_aspect_2" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/fire_protection.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/fire_protection.json deleted file mode 100644 index 14a4beed28..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/fire_protection.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.fire_protection", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:fire_protection_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:fire_protection_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:fire_protection_3" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:fire_protection_4" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/flame.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/flame.json deleted file mode 100644 index 87ebab4056..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/flame.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.flame", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:flame_1" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/fortune.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/fortune.json deleted file mode 100644 index 2b535d79a3..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/fortune.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.fortune", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:fortune_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:fortune_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:fortune_3" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/infinity.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/infinity.json deleted file mode 100644 index 2de38e2b14..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/infinity.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.infinity", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:infinity_1" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/knockback.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/knockback.json deleted file mode 100644 index 5180ec3c07..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/knockback.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.knockback", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:knockback_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:knockback_2" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/looting.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/looting.json deleted file mode 100644 index 3f6a0df225..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/looting.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.looting", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:looting_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:looting_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:looting_3" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mana_boost.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mana_boost.json deleted file mode 100644 index d22e878d2a..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mana_boost.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.ars_nouveau.mana_boost", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:mana_boost_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:mana_boost_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:mana_boost_3" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mana_regen.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mana_regen.json deleted file mode 100644 index 023e71f2ca..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mana_regen.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.ars_nouveau.mana_regen", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:mana_regen_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:mana_regen_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:mana_regen_3" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/multishot.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/multishot.json deleted file mode 100644 index ded57db370..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/multishot.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.multishot", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:multishot_1" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/piercing.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/piercing.json deleted file mode 100644 index a768a4e1b0..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/piercing.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.piercing", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:piercing_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:piercing_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:piercing_3" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:piercing_4" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/power.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/power.json deleted file mode 100644 index 1af3b333a0..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/power.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.power", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:power_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:power_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:power_3" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:power_4" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:power_5" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/projectile_protection.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/projectile_protection.json deleted file mode 100644 index 507cdb1902..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/projectile_protection.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.projectile_protection", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:projectile_protection_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:projectile_protection_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:projectile_protection_3" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:projectile_protection_4" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/protection.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/protection.json deleted file mode 100644 index 15555513c1..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/protection.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.protection", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:protection_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:protection_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:protection_3" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:protection_4" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/punch.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/punch.json deleted file mode 100644 index b2033e0eb2..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/punch.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.punch", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:punch_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:punch_2" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/quick_charge.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/quick_charge.json deleted file mode 100644 index 9df948de2c..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/quick_charge.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.quick_charge", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:quick_charge_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:quick_charge_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:quick_charge_3" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/respiration.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/respiration.json deleted file mode 100644 index 33b2f34155..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/respiration.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.respiration", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:respiration_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:respiration_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:respiration_3" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/sharpness.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/sharpness.json deleted file mode 100644 index f3ae480c88..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/sharpness.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.sharpness", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:sharpness_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:sharpness_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:sharpness_3" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:sharpness_4" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:sharpness_5" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/silk_touch.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/silk_touch.json deleted file mode 100644 index e119e9230d..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/silk_touch.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.silk_touch", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:silk_touch_1" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/smite.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/smite.json deleted file mode 100644 index 0ff3725044..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/smite.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.smite", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:smite_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:smite_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:smite_3" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:smite_4" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:smite_5" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/sweeping.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/sweeping.json deleted file mode 100644 index 8a577c5b1b..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/sweeping.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.sweeping", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:sweeping_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:sweeping_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:sweeping_3" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/thorns.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/thorns.json deleted file mode 100644 index fdbe3b89df..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/thorns.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.thorns", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:thorns_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:thorns_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:thorns_3" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/unbreaking.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/unbreaking.json deleted file mode 100644 index a2a12f0480..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/unbreaking.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "category": "ars_nouveau:enchantments", - "icon": "minecraft:enchanted_book", - "name": "enchantment.minecraft.unbreaking", - "pages": [ - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:unbreaking_1" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:unbreaking_2" - }, - { - "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:unbreaking_3" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_button.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_button.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_button.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_button.json index 12d3efa7cd..2daae146e6 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_button.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_button.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:archwood_button" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_door.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_door.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_door.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_door.json index 9117194587..c6a3f8e948 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_door.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_door.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:archwood_door" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_fence.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_fence.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence.json index f7d9017b94..ef67759ffe 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_fence.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:archwood_fence" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_fence_gate.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence_gate.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_fence_gate.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence_gate.json index a37ecb3a2f..c2b19959fc 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_fence_gate.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence_gate.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:archwood_fence_gate" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_pressure_plate.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_pressure_plate.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_pressure_plate.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_pressure_plate.json index 43ba334c07..f75bb0f68e 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_pressure_plate.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_pressure_plate.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:archwood_pressure_plate" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_slab.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_slab.json index b63e42dc87..e938ad16fa 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/archwood_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/archwood_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:archwood_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_alternating_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_alternating_slab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_alternating_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_alternating_slab.json index c7fb9dbeb0..a6d0f59de4 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_alternating_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_alternating_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_alternating_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_alternating_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_alternating_stone_cutterslab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_alternating_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_alternating_stone_cutterslab.json index a19b3cbf8f..805f653350 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_alternating_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_alternating_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_alternating_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_alternating_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_alternating_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_alternating_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_alternating_stonecutter_stair.json index a5a961d05c..b795a9a1cf 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_alternating_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_alternating_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_alternating_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_basketweave_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_basketweave_slab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_basketweave_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_basketweave_slab.json index 0135a41ca8..826ab9a524 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_basketweave_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_basketweave_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_basketweave_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_basketweave_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_basketweave_stone_cutterslab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_basketweave_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_basketweave_stone_cutterslab.json index 95db6a019b..792bd9eb2f 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_basketweave_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_basketweave_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_basketweave_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_basketweave_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_basketweave_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_basketweave_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_basketweave_stonecutter_stair.json index 92a5265722..c663797aaf 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_basketweave_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_basketweave_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_basketweave_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_large_bricks_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_large_bricks_slab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_large_bricks_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_large_bricks_slab.json index 6107a84ca1..371647c4bb 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_large_bricks_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_large_bricks_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_large_bricks_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_large_bricks_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_large_bricks_stone_cutterslab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_large_bricks_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_large_bricks_stone_cutterslab.json index 6fa04c6a91..31a03591be 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_large_bricks_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_large_bricks_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_large_bricks_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_large_bricks_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_large_bricks_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_large_bricks_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_large_bricks_stonecutter_stair.json index 3ed4b21466..c1f0400784 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_large_bricks_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_large_bricks_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_large_bricks_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_mosaic_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_mosaic_slab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_mosaic_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_mosaic_slab.json index c0a81ebb3d..2e13f52132 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_mosaic_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_mosaic_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_mosaic_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_mosaic_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_mosaic_stone_cutterslab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_mosaic_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_mosaic_stone_cutterslab.json index 60fcddbc03..9049dcf5ad 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_mosaic_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_mosaic_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_mosaic_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_mosaic_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_mosaic_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_mosaic_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_mosaic_stonecutter_stair.json index bf659a5465..3ccbbaa408 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_mosaic_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_mosaic_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_mosaic_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_small_bricks_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_small_bricks_slab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_small_bricks_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_small_bricks_slab.json index 054f787f28..5c7bd6d857 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_small_bricks_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_small_bricks_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_small_bricks_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_small_bricks_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_small_bricks_stone_cutterslab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_small_bricks_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_small_bricks_stone_cutterslab.json index acbea78763..7b6bad2885 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_small_bricks_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_small_bricks_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_small_bricks_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_small_bricks_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_small_bricks_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_small_bricks_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_small_bricks_stonecutter_stair.json index 2fec87fda5..ee68b00f70 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/gilded_sourcestone_small_bricks_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_small_bricks_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_small_bricks_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_alternating_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_alternating_slab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_alternating_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_alternating_slab.json index 44d1f5e30b..1d2e25b7b5 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_alternating_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_alternating_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_alternating_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stone_cutterslab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stone_cutterslab.json index 675a0bc06a..e7b45ba743 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_alternating_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stonecutter_stair.json index b5beec87b8..04523c4596 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_alternating_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_slab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_slab.json index 6d958d868b..53ecf4b8fa 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_basketweave_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json index d6344c2408..ff76411052 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_basketweave_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json index 71ada78b1e..b6d76667bb 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_basketweave_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_slab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_slab.json index 4a3a73927a..7adc0d5bda 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_large_bricks_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json index 671df31abb..600ef8654b 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_large_bricks_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json index 8acbb9effe..88c367d820 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_large_bricks_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_slab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_slab.json index 8908693558..6d1fabf13a 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_mosaic_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json index 7e24aa10df..48fe109cd3 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_mosaic_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json index e22b19f69d..c69861b029 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_mosaic_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_slab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_slab.json index 2e123e7527..479e423a65 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_small_bricks_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json index d83eb9a0b4..bdc91e0969 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_small_bricks_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json index 5970da3de2..8ab5e09edd 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_small_bricks_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_alternating_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_alternating_slab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_alternating_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_alternating_slab.json index 58ec0ea0f1..2af10d8209 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_alternating_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_alternating_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_alternating_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_alternating_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_alternating_stone_cutterslab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_alternating_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_alternating_stone_cutterslab.json index 54a30cae8b..bc950b1823 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_alternating_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_alternating_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_alternating_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_alternating_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_alternating_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_alternating_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_alternating_stonecutter_stair.json index 45b96eaf81..0497a68384 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_alternating_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_alternating_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_alternating_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_basketweave_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_basketweave_slab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_basketweave_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_basketweave_slab.json index 1b31588ef4..9a3004088e 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_basketweave_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_basketweave_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_basketweave_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_basketweave_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_basketweave_stone_cutterslab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_basketweave_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_basketweave_stone_cutterslab.json index b8c050e14c..915a2d2ad0 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_basketweave_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_basketweave_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_basketweave_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_basketweave_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_basketweave_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_basketweave_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_basketweave_stonecutter_stair.json index 825fcb0900..f14662ecb7 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_basketweave_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_basketweave_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_basketweave_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_large_bricks_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_large_bricks_slab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_large_bricks_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_large_bricks_slab.json index 9cb33f959f..dee9cdadca 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_large_bricks_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_large_bricks_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_large_bricks_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_large_bricks_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_large_bricks_stone_cutterslab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_large_bricks_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_large_bricks_stone_cutterslab.json index a89b291499..71ac694488 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_large_bricks_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_large_bricks_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_large_bricks_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_large_bricks_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_large_bricks_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_large_bricks_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_large_bricks_stonecutter_stair.json index 1f961e9117..3231bdf01d 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_large_bricks_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_large_bricks_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_large_bricks_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_mosaic_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_mosaic_slab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_mosaic_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_mosaic_slab.json index 45940429b8..3999c2d5a9 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_mosaic_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_mosaic_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_mosaic_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_mosaic_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_mosaic_stone_cutterslab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_mosaic_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_mosaic_stone_cutterslab.json index c4f248ccce..9c796acec3 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_mosaic_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_mosaic_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_mosaic_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_mosaic_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_mosaic_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_mosaic_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_mosaic_stonecutter_stair.json index 66fb0c7189..4f69c64cd1 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_mosaic_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_mosaic_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_mosaic_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_slab.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_slab.json index fe1e2a518b..70ddda7863 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_small_bricks_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_small_bricks_slab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_small_bricks_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_small_bricks_slab.json index aec27d6d88..8d1a4733c3 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_small_bricks_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_small_bricks_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_small_bricks_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_small_bricks_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_small_bricks_stone_cutterslab.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_small_bricks_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_small_bricks_stone_cutterslab.json index afe298e489..f045bb051b 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_small_bricks_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_small_bricks_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_small_bricks_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_small_bricks_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_small_bricks_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_small_bricks_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_small_bricks_stonecutter_stair.json index 71410d413f..d679eb8513 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_small_bricks_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_small_bricks_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_small_bricks_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_stone_cutterslab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_stone_cutterslab.json index 9b1fb0f8cd..cc4f203a09 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_stonecutter_stair.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_stonecutter_stair.json index 7be0af7a0e..2b8ba20f87 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/smooth_sourcestone_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_alternating_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_alternating_slab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_alternating_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_alternating_slab.json index 4b979d3041..a57105e026 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_alternating_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_alternating_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_alternating_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_alternating_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_alternating_stone_cutterslab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_alternating_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_alternating_stone_cutterslab.json index a0f72ba4f3..b1fab80502 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_alternating_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_alternating_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_alternating_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_alternating_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_alternating_stonecutter_stair.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_alternating_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_alternating_stonecutter_stair.json index 9985085f19..e6bb7edd9a 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_alternating_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_alternating_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_alternating_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_basketweave_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_basketweave_slab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_basketweave_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_basketweave_slab.json index 4dec692e7b..06854dffb9 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_basketweave_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_basketweave_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_basketweave_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_basketweave_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_basketweave_stone_cutterslab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_basketweave_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_basketweave_stone_cutterslab.json index d224c235c2..33182e673a 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_basketweave_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_basketweave_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_basketweave_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_basketweave_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_basketweave_stonecutter_stair.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_basketweave_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_basketweave_stonecutter_stair.json index 8cfa78bee5..e97fda29ba 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_basketweave_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_basketweave_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_basketweave_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_large_bricks_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_large_bricks_slab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_large_bricks_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_large_bricks_slab.json index b8ff36ae36..c5edd56aeb 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_large_bricks_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_large_bricks_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_large_bricks_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_large_bricks_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_large_bricks_stone_cutterslab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_large_bricks_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_large_bricks_stone_cutterslab.json index 395a36e8a8..2dfcad45a8 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_large_bricks_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_large_bricks_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_large_bricks_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_large_bricks_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_large_bricks_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_large_bricks_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_large_bricks_stonecutter_stair.json index 4cacf889ab..559524b793 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_large_bricks_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_large_bricks_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_large_bricks_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_mosaic_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_mosaic_slab.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_mosaic_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_mosaic_slab.json index db7e765420..66bba86711 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_mosaic_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_mosaic_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_mosaic_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_mosaic_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_mosaic_stone_cutterslab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_mosaic_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_mosaic_stone_cutterslab.json index 42b67d16e8..3da6d35e67 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_mosaic_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_mosaic_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_mosaic_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_mosaic_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_mosaic_stonecutter_stair.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_mosaic_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_mosaic_stonecutter_stair.json index d2a54839ad..59cbc5343c 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_mosaic_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_mosaic_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_mosaic_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_small_bricks_slab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_small_bricks_slab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_small_bricks_slab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_small_bricks_slab.json index f7d46d675a..45e993438c 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_small_bricks_slab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_small_bricks_slab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_small_bricks_slab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_small_bricks_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_small_bricks_stone_cutterslab.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_small_bricks_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_small_bricks_stone_cutterslab.json index bb6323ca7f..84d271dcf2 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_small_bricks_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_small_bricks_stone_cutterslab.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_small_bricks_stone_cutterslab" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_small_bricks_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_small_bricks_stonecutter_stair.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_small_bricks_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_small_bricks_stonecutter_stair.json index 868a9b747b..5950a5a01b 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/sourcestone_small_bricks_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_small_bricks_stonecutter_stair.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_small_bricks_stonecutter_stair" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/stripped_blue_archwood_wood.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/stripped_blue_archwood_wood.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/stripped_blue_archwood_wood.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/stripped_blue_archwood_wood.json index 6781294989..ed58ff2a35 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/stripped_blue_archwood_wood.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/stripped_blue_archwood_wood.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:stripped_blue_archwood_wood" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/stripped_green_archwood_wood.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/stripped_green_archwood_wood.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/stripped_green_archwood_wood.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/stripped_green_archwood_wood.json index 02b9391760..6751181725 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/stripped_green_archwood_wood.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/stripped_green_archwood_wood.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:stripped_green_archwood_wood" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/stripped_purple_archwood_wood.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/stripped_purple_archwood_wood.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/stripped_purple_archwood_wood.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/stripped_purple_archwood_wood.json index b34fe8a7aa..38211b8a3d 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/stripped_purple_archwood_wood.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/stripped_purple_archwood_wood.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:stripped_purple_archwood_wood" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/stripped_red_archwood_wood.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/stripped_red_archwood_wood.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/stripped_red_archwood_wood.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/stripped_red_archwood_wood.json index 449bf6156b..fe21ea422f 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/building_blocks/stripped_red_archwood_wood.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/building_blocks/stripped_red_archwood_wood.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:stripped_red_archwood_wood" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_1.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_1.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_1.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_1.json index 2d676b7638..ea5adbede7 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_1.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_1.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_1" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_10.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_10.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_10.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_10.json index dfdd888d06..c89d8283a4 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_10.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_10.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_10" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_11.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_11.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_11.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_11.json index c70b80990d..604df0cfac 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_11.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_11.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_11" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_12.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_12.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_12.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_12.json index 1cf2b8603e..063093024d 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_12.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_12.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_12" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_13.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_13.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_13.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_13.json index 14c3720fa3..db8f073372 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_13.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_13.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_13" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_14.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_14.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_14.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_14.json index 5ea2c5e164..0887e40a6e 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_14.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_14.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_14" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_15.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_15.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_15.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_15.json index 98bf19bd9a..a29ded87b7 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_15.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_15.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_15" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_16.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_16.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_16.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_16.json index 8206596422..0dcd99a1a1 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_16.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_16.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_16" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_17.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_17.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_17.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_17.json index 11756bb39c..1353631416 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_17.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_17.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_17" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_18.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_18.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_18.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_18.json index eeb98aa211..ea1dc6a8fd 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_18.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_18.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_18" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_19.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_19.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_19.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_19.json index 6e7e7e939a..009650fbf5 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_19.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_19.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_19" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_2.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_2.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_2.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_2.json index 67a5e01817..a7d4a939aa 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_2.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_2.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_2" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_20.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_20.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_20.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_20.json index e8ab225da4..a530448cf4 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_20.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_20.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_20" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_21.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_21.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_21.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_21.json index 92b07fc0e6..ce382958aa 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_21.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_21.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_21" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_3.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_3.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_3.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_3.json index d71c2bd79d..336d046250 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_3.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_3.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_3" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_4.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_4.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_4.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_4.json index 5d47e52954..520c8dc934 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_4.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_4.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_4" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_5.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_5.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_5.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_5.json index d394d4a592..c80583a43e 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_5.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_5.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_5" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_6.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_6.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_6.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_6.json index b6b6b7fc43..0e495885f0 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_6.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_6.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_6" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_7.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_7.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_7.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_7.json index 602e2f47d0..5fe319eebc 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_7.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_7.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_7" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_8.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_8.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_8.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_8.json index 97bb60c828..2de6b00d36 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_8.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_8.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_8" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_9.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_9.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_9.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_9.json index f363b406d5..301bb1de74 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/decorations/sourcestone_9.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/decorations/sourcestone_9.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_9" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/agronomic_sourcelink.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/agronomic_sourcelink.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/agronomic_sourcelink.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/agronomic_sourcelink.json index 237324ae15..d8190f9b48 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/agronomic_sourcelink.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/agronomic_sourcelink.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:agronomic_sourcelink" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/air_essence_to_snow_bucket.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/air_essence_to_snow_bucket.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/air_essence_to_snow_bucket.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/air_essence_to_snow_bucket.json index fa5e1e6273..8b5ce10927 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/air_essence_to_snow_bucket.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/air_essence_to_snow_bucket.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:air_essence_to_snow_bucket" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/alchemical_sourcelink.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/alchemical_sourcelink.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/alchemical_sourcelink.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/alchemical_sourcelink.json index 149584488d..b2393a8a6b 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/alchemical_sourcelink.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/alchemical_sourcelink.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:alchemical_sourcelink" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/allow_scroll.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/allow_scroll.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/allow_scroll.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/allow_scroll.json index f26ffa6515..8e465fcf4f 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/allow_scroll.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/allow_scroll.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:allow_scroll" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/alteration_table.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/alteration_table.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/alteration_table.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/alteration_table.json index e46fc4b135..6ae5fc4814 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/alteration_table.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/alteration_table.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:alteration_table" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/annotated_codex.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/annotated_codex.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/annotated_codex.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/annotated_codex.json index 9a7934f857..ce414002bf 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/annotated_codex.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/annotated_codex.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:annotated_codex" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/arcane_core.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/arcane_core.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/arcane_core.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/arcane_core.json index f2ee5c36b5..deef9c0921 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/arcane_core.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/arcane_core.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:arcane_core" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/arcane_pedestal.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/arcane_pedestal.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/arcane_pedestal.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/arcane_pedestal.json index 1290d11300..bf043442af 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/arcane_pedestal.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/arcane_pedestal.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:arcane_pedestal" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/arcane_platform.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/arcane_platform.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/arcane_platform.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/arcane_platform.json index f36bf019b3..d04ec0d1c6 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/arcane_platform.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/arcane_platform.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:arcane_platform" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_chest.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_chest.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_chest.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_chest.json index 662e8e8184..98e3ef1422 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_chest.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_chest.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:archwood_chest" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_planks.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_planks.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_planks.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_planks.json index 0ea580920e..baa8158b88 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_planks.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_planks.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:archwood_planks" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_sconce.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_sconce.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_sconce.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_sconce.json index 83356fcdde..03bd57200a 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_sconce.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_sconce.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:archwood_sconce" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_stairs.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_stairs.json index e880df80c8..1c10a3d05a 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:archwood_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_to_chest.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_to_chest.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_to_chest.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_to_chest.json index 20d01d6436..136933fbbf 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_to_chest.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_to_chest.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:archwood_to_chest" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_trapdoor.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_trapdoor.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_trapdoor.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_trapdoor.json index bdf74a60ad..e366872b3b 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/archwood_trapdoor.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_trapdoor.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:archwood_trapdoor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/basic_spell_turret.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/basic_spell_turret.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/basic_spell_turret.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/basic_spell_turret.json index d614ec9635..8593a106f9 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/basic_spell_turret.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/basic_spell_turret.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:basic_spell_turret" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/blank_parchment.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/blank_parchment.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/blank_parchment.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/blank_parchment.json index f58490f60b..bbc4313a1d 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/blank_parchment.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/blank_parchment.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:blank_parchment" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/blank_thread.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/blank_thread.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/blank_thread.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/blank_thread.json index 4b0f408484..1f2ac211be 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/blank_thread.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/blank_thread.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:blank_thread" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/blue_archwood_wood.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/blue_archwood_wood.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/blue_archwood_wood.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/blue_archwood_wood.json index 0541ffc376..d65e1522db 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/blue_archwood_wood.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/blue_archwood_wood.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:blue_archwood_wood" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/blue_sbed.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/blue_sbed.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/blue_sbed.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/blue_sbed.json index e131a0e5e1..7f5368bad0 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/blue_sbed.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/blue_sbed.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:blue_sbed" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/challenge_2.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/challenge_2.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/challenge_2.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/challenge_2.json index 7ff300dfb2..fe5d632e75 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/challenge_2.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/challenge_2.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:challenge_2" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/clear_allow.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_allow.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/clear_allow.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_allow.json index 5681a7ab61..5e6b432b10 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/clear_allow.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_allow.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:clear_allow" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/clear_deny.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_deny.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/clear_deny.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_deny.json index 9bf2b43e59..aeae5acc69 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/clear_deny.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_deny.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:clear_deny" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/conjuration_essence_to_end_stone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/conjuration_essence_to_end_stone.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/conjuration_essence_to_end_stone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/conjuration_essence_to_end_stone.json index 3438fba9aa..150c82c839 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/conjuration_essence_to_end_stone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/conjuration_essence_to_end_stone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:conjuration_essence_to_end_stone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/conjuration_essence_to_soul_sand.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/conjuration_essence_to_soul_sand.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/conjuration_essence_to_soul_sand.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/conjuration_essence_to_soul_sand.json index 0b4ddbf964..055ab50374 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/conjuration_essence_to_soul_sand.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/conjuration_essence_to_soul_sand.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:conjuration_essence_to_soul_sand" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/deny_scroll.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/deny_scroll.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/deny_scroll.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/deny_scroll.json index cc8556cee7..abb9b27241 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/deny_scroll.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/deny_scroll.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:deny_scroll" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/dowsing_rod.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/dowsing_rod.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/dowsing_rod.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/dowsing_rod.json index 7e642f0c3f..809d75c81f 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/dowsing_rod.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/dowsing_rod.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:dowsing_rod" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/dull_trinket.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/dull_trinket.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/dull_trinket.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/dull_trinket.json index dec7c145ad..da2a32445c 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/dull_trinket.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/dull_trinket.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:dull_trinket" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/enchanting_apparatus.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/enchanting_apparatus.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/enchanting_apparatus.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/enchanting_apparatus.json index 2c5f663266..88e0db390e 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/enchanting_apparatus.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/enchanting_apparatus.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:enchanting_apparatus" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/experience_gem.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/experience_gem.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/experience_gem.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/experience_gem.json index df8879856d..75f1b62357 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/experience_gem.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/experience_gem.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:experience_gem" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/falseweave.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/falseweave.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/falseweave.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/falseweave.json index a277bca96b..755bd106e5 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/falseweave.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/falseweave.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:falseweave" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/fire_essence_to_charge.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/fire_essence_to_charge.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/fire_essence_to_charge.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/fire_essence_to_charge.json index a5d1b589c1..673d4e3fbc 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/fire_essence_to_charge.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/fire_essence_to_charge.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:fire_essence_to_charge" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/fire_essence_to_magma_block.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/fire_essence_to_magma_block.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/fire_essence_to_magma_block.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/fire_essence_to_magma_block.json index 1d9c69acdf..9cc07f2b30 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/fire_essence_to_magma_block.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/fire_essence_to_magma_block.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:fire_essence_to_magma_block" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ghostweave.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ghostweave.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ghostweave.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ghostweave.json index 82e2d2bd15..d90dee52f0 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ghostweave.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ghostweave.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ghostweave" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_alternating_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_alternating_stairs.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_alternating_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_alternating_stairs.json index 721d8c32cb..3669840321 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_alternating_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_alternating_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_alternating_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_alternating_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_alternating_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_alternating_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_alternating_to_sourcestone.json index cc42c663a6..3c314b108c 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_alternating_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_alternating_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_alternating_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_basketweave_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_basketweave_stairs.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_basketweave_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_basketweave_stairs.json index 39f8e27ee2..a5e9c7e295 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_basketweave_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_basketweave_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_basketweave_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_basketweave_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_basketweave_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_basketweave_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_basketweave_to_sourcestone.json index b3729aa91c..4dfdef7c4c 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_basketweave_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_basketweave_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_basketweave_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_large_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_large_bricks_stairs.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_large_bricks_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_large_bricks_stairs.json index fd52de3187..a925dd4969 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_large_bricks_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_large_bricks_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_large_bricks_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_large_bricks_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_large_bricks_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_large_bricks_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_large_bricks_to_sourcestone.json index f71531a86a..1581199256 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_large_bricks_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_large_bricks_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_large_bricks_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_mosaic_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_mosaic_stairs.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_mosaic_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_mosaic_stairs.json index 1935d929f4..4696e1a642 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_mosaic_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_mosaic_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_mosaic_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_mosaic_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_mosaic_to_sourcestone.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_mosaic_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_mosaic_to_sourcestone.json index 5ce4334277..878a9d99e0 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_mosaic_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_mosaic_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_mosaic_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_small_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_small_bricks_stairs.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_small_bricks_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_small_bricks_stairs.json index d002814947..fdfbe91ee3 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_small_bricks_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_small_bricks_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_small_bricks_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_small_bricks_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_small_bricks_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_small_bricks_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_small_bricks_to_sourcestone.json index 9c6eedaa66..310188033f 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/gilded_sourcestone_small_bricks_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_small_bricks_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:gilded_sourcestone_small_bricks_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/greater_experience_gem.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/greater_experience_gem.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/greater_experience_gem.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/greater_experience_gem.json index 9c6806f91e..dad4303b88 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/greater_experience_gem.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/greater_experience_gem.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:greater_experience_gem" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/green_archwood_wood.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/green_archwood_wood.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/green_archwood_wood.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/green_archwood_wood.json index 90810adff0..cddd4ea116 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/green_archwood_wood.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/green_archwood_wood.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:green_archwood_wood" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/green_sbed.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/green_sbed.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/green_sbed.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/green_sbed.json index fc579023a9..6975c69a1c 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/green_sbed.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/green_sbed.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:green_sbed" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/horn_to_bonemeal.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/horn_to_bonemeal.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/horn_to_bonemeal.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/horn_to_bonemeal.json index cb20102075..57816f5cf4 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/horn_to_bonemeal.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/horn_to_bonemeal.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:horn_to_bonemeal" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/imbuement_chamber.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/imbuement_chamber.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/imbuement_chamber.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/imbuement_chamber.json index a4814e9455..47a729639f 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/imbuement_chamber.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/imbuement_chamber.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:imbuement_chamber" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/item_detector.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/item_detector.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/item_detector.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/item_detector.json index 1c3546c9cc..82c48bbcb1 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/item_detector.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/item_detector.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:item_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/magebloom_block.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/magebloom_block.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/magebloom_block.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/magebloom_block.json index b9ca35adf9..0a751e9cf7 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/magebloom_block.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/magebloom_block.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:magebloom_block" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/magebloom_block_to_magebloom.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/magebloom_block_to_magebloom.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/magebloom_block_to_magebloom.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/magebloom_block_to_magebloom.json index 3ed541be0a..b8d8f64280 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/magebloom_block_to_magebloom.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/magebloom_block_to_magebloom.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:magebloom_block_to_magebloom" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/magebloom_fiber.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/magebloom_fiber.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/magebloom_fiber.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/magebloom_fiber.json index a194c6b17a..d09ceb36cf 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/magebloom_fiber.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/magebloom_fiber.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:magebloom_fiber" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/magebloom_to_pink.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/magebloom_to_pink.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/magebloom_to_pink.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/magebloom_to_pink.json index 20ac07c3c2..2c1ce07c71 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/magebloom_to_pink.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/magebloom_to_pink.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:magebloom_to_pink" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/magelight_torch.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/magelight_torch.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/magelight_torch.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/magelight_torch.json index 6de8e11859..1aa0f5f4f4 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/magelight_torch.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/magelight_torch.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:magelight_torch" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_andesite.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_andesite.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_andesite.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_andesite.json index 1848512d6e..6457c6fbff 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_andesite.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_andesite.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:manipulation_essence_to_andesite" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_blazin_sapling.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_blazin_sapling.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_blazin_sapling.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_blazin_sapling.json index 807ae5879c..0cd2bd48bb 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_blazin_sapling.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_blazin_sapling.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:manipulation_essence_to_blazin_sapling" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_calcite.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_calcite.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_calcite.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_calcite.json index b4060d5b9a..8231627e2a 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_calcite.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_calcite.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:manipulation_essence_to_calcite" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_cascading_sapling.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_cascading_sapling.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_cascading_sapling.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_cascading_sapling.json index c194cf2bb6..f2a0bb1a7b 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_cascading_sapling.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_cascading_sapling.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:manipulation_essence_to_cascading_sapling" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_deepslate.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_deepslate.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_deepslate.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_deepslate.json index 037fcb1a8e..5e32ce8e22 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_deepslate.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_deepslate.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:manipulation_essence_to_deepslate" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_diorite.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_diorite.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_diorite.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_diorite.json index 51536a8100..ae88fd7b66 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_diorite.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_diorite.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:manipulation_essence_to_diorite" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_flourishing_sapling.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_flourishing_sapling.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_flourishing_sapling.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_flourishing_sapling.json index 8032df1382..13f7b377ab 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_flourishing_sapling.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_flourishing_sapling.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:manipulation_essence_to_flourishing_sapling" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_granite.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_granite.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_granite.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_granite.json index 6fbf19533e..ee77e9a8d8 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_granite.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_granite.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:manipulation_essence_to_granite" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_grass_block.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_grass_block.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_grass_block.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_grass_block.json index 92debf3e44..5b22de1e47 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_grass_block.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_grass_block.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:manipulation_essence_to_grass_block" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_moss_block.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_moss_block.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_moss_block.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_moss_block.json index 88315891ff..3b56b79ab3 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_moss_block.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_moss_block.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:manipulation_essence_to_moss_block" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_mycelium.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_mycelium.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_mycelium.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_mycelium.json index b11ff18ff3..2cf4ac67d6 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_mycelium.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_mycelium.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:manipulation_essence_to_mycelium" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_tuff.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_tuff.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_tuff.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_tuff.json index e4630deaa4..64c6bf65d5 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_tuff.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_tuff.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:manipulation_essence_to_tuff" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_vexing_sapling.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_vexing_sapling.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_vexing_sapling.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_vexing_sapling.json index af0bec5800..49775d9c84 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/manipulation_essence_to_vexing_sapling.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_vexing_sapling.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:manipulation_essence_to_vexing_sapling" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/mimic_scroll.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/mimic_scroll.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/mimic_scroll.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/mimic_scroll.json index 9640a6426a..fb05f4098b 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/mimic_scroll.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/mimic_scroll.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:mimic_scroll" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/mirrorweave.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/mirrorweave.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/mirrorweave.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/mirrorweave.json index d0222b9227..226c700d59 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/mirrorweave.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/mirrorweave.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:mirrorweave" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/mob_jar.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/mob_jar.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/mob_jar.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/mob_jar.json index 23a9a0f3b8..e6f378d5ae 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/mob_jar.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/mob_jar.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:mob_jar" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/moonfall_2.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/moonfall_2.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/moonfall_2.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/moonfall_2.json index 4ae4695dd3..465b700d42 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/moonfall_2.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/moonfall_2.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:moonfall_2" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/mundane_belt.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/mundane_belt.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/mundane_belt.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/mundane_belt.json index 375ef54df2..d9ae854e92 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/mundane_belt.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/mundane_belt.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:mundane_belt" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/mycelial_sourcelink.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/mycelial_sourcelink.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/mycelial_sourcelink.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/mycelial_sourcelink.json index 4df75fb40e..7daab5ec0e 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/mycelial_sourcelink.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/mycelial_sourcelink.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:mycelial_sourcelink" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/orange_sbed.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/orange_sbed.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/orange_sbed.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/orange_sbed.json index 8d693769ef..03f6863166 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/orange_sbed.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/orange_sbed.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:orange_sbed" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/platform_to_pedestal.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/platform_to_pedestal.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/platform_to_pedestal.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/platform_to_pedestal.json index 4c0bbcc0ae..f315b01131 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/platform_to_pedestal.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/platform_to_pedestal.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:platform_to_pedestal" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/polished_sconce.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/polished_sconce.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/polished_sconce.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/polished_sconce.json index 9c0b8eb8ed..a746432281 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/polished_sconce.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/polished_sconce.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:polished_sconce" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/polished_source_sconce.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/polished_source_sconce.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/polished_source_sconce.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/polished_source_sconce.json index 2e7528c2ba..4101c51b10 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/polished_source_sconce.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/polished_source_sconce.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:polished_source_sconce" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/potion_jar.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/potion_jar.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/potion_jar.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/potion_jar.json index fd3a6e758e..5925c047e8 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/potion_jar.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/potion_jar.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:potion_jar" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/potion_jar_empty.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/potion_jar_empty.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/potion_jar_empty.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/potion_jar_empty.json index 74d8e2ef17..fd8230cfd9 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/potion_jar_empty.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/potion_jar_empty.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:potion_jar_empty" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/purple_archwood_wood.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/purple_archwood_wood.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/purple_archwood_wood.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/purple_archwood_wood.json index d076cf7353..12b601c20a 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/purple_archwood_wood.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/purple_archwood_wood.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:purple_archwood_wood" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/purple_sbed.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/purple_sbed.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/purple_sbed.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/purple_sbed.json index 116476760e..a92cf07c79 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/purple_sbed.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/purple_sbed.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:purple_sbed" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/red_archwood_wood.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/red_archwood_wood.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/red_archwood_wood.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/red_archwood_wood.json index d8ff5e0e44..8d8e5b5d7d 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/red_archwood_wood.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/red_archwood_wood.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:red_archwood_wood" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/red_sbed.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/red_sbed.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/red_sbed.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/red_sbed.json index 5876d13b99..a2662cd4c2 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/red_sbed.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/red_sbed.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:red_sbed" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/redstone_relay.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/redstone_relay.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/redstone_relay.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/redstone_relay.json index 277ef15194..c3b399a44a 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/redstone_relay.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/redstone_relay.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:redstone_relay" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/relay.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/relay.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/relay.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/relay.json index f81bf721d3..6c050483fd 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/relay.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/relay.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:relay" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/repository.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/repository.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/repository.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/repository.json index e762f0e5ce..f296587117 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/repository.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/repository.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:repository" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ring_of_potential.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ring_of_potential.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ring_of_potential.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ring_of_potential.json index 00d2e0c7ba..7e429c5865 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ring_of_potential.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ring_of_potential.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ring_of_potential" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_animal_summon.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_animal_summon.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_animal_summon.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_animal_summon.json index a43da84da6..93770db426 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_animal_summon.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_animal_summon.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_animal_summon" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_awakening.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_awakening.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_awakening.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_awakening.json index f78596ef68..8a58f921dd 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_awakening.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_awakening.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_awakening" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_binding.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_binding.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_binding.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_binding.json index 036bfe1393..b6c7e85cb4 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_binding.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_binding.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_binding" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_brazier.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_brazier.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_brazier.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_brazier.json index 772aafcbe3..a4b0f82f07 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_brazier.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_brazier.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_brazier" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_burrowing.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_burrowing.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_burrowing.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_burrowing.json index cc1fe4c97a..e2f1080bf0 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_burrowing.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_burrowing.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_burrowing" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_challenge.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_challenge.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_challenge.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_challenge.json index 31397e0f3d..46ff3c48c7 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_challenge.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_challenge.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_challenge" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_cloudshaping.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_cloudshaping.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_cloudshaping.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_cloudshaping.json index ca19267910..90115e6599 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_cloudshaping.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_cloudshaping.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_cloudshaping" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_conjure_island_desert.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_conjure_island_desert.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_conjure_island_desert.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_conjure_island_desert.json index ba70a2323b..65a452b012 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_conjure_island_desert.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_conjure_island_desert.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_conjure_island_desert" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_conjure_island_plains.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_conjure_island_plains.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_conjure_island_plains.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_conjure_island_plains.json index e86cf22bd2..01041dd03e 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_conjure_island_plains.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_conjure_island_plains.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_conjure_island_plains" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_containment.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_containment.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_containment.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_containment.json index 65156707c1..092ef64da6 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_containment.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_containment.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_containment" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_disintegration.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_disintegration.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_disintegration.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_disintegration.json index dd28f59b85..eb2c178709 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_disintegration.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_disintegration.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_disintegration" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_fertility.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_fertility.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_fertility.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_fertility.json index b50aab86c6..16c9e770ca 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_fertility.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_fertility.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_fertility" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_flight.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_flight.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_flight.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_flight.json index 90ab0250fb..d8adfe5c9b 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_flight.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_flight.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_flight" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_flowering.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_flowering.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_flowering.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_flowering.json index 7c5cb63d80..d2e6a37007 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_flowering.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_flowering.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_flowering" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_forestation.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_forestation.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_forestation.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_forestation.json index 7eab0ab62f..c7c4a16b92 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_forestation.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_forestation.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_forestation" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_gravity.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_gravity.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_gravity.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_gravity.json index 7c74b1694f..3c7d578f6b 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_gravity.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_gravity.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_gravity" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_harvest.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_harvest.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_harvest.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_harvest.json index 55406ae72f..622de4b8a1 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_harvest.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_harvest.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_harvest" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_moonfall.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_moonfall.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_moonfall.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_moonfall.json index e8abd83ab1..ee74dbea1a 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_moonfall.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_moonfall.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_moonfall" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_overgrowth.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_overgrowth.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_overgrowth.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_overgrowth.json index 6a6cd5cbc5..ffe1610134 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_overgrowth.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_overgrowth.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_overgrowth" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_restoration.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_restoration.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_restoration.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_restoration.json index 831579e705..a8ce4b38a1 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_restoration.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_restoration.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_restoration" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_sanctuary.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_sanctuary.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_sanctuary.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_sanctuary.json index ec397dba01..8baf9287f4 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_sanctuary.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_sanctuary.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_sanctuary" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_scrying.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_scrying.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_scrying.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_scrying.json index 78b42d0e3e..9c89952c42 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_scrying.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_scrying.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_scrying" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_sunrise.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_sunrise.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_sunrise.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_sunrise.json index cb15cf62e7..2f81c32e38 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_sunrise.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_sunrise.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_sunrise" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_warping.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_warping.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_warping.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_warping.json index 1f8917bee7..0ee36eea2c 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_warping.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_warping.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_warping" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_wilden_summon.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_wilden_summon.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_wilden_summon.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_wilden_summon.json index 2524974680..66a4324caa 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/ritual_wilden_summon.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/ritual_wilden_summon.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:ritual_wilden_summon" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/rotating_spell_turret.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/rotating_spell_turret.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/rotating_spell_turret.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/rotating_spell_turret.json index 211e9331d5..8dbeeebed9 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/rotating_spell_turret.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/rotating_spell_turret.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:rotating_spell_turret" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/rotating_turret_to_basic_spell_turret.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/rotating_turret_to_basic_spell_turret.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/rotating_turret_to_basic_spell_turret.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/rotating_turret_to_basic_spell_turret.json index bb95c74954..847fb63321 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/rotating_turret_to_basic_spell_turret.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/rotating_turret_to_basic_spell_turret.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:rotating_turret_to_basic_spell_turret" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/runic_chalk.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/runic_chalk.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/runic_chalk.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/runic_chalk.json index ae0d0d6c94..bb899a5eed 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/runic_chalk.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/runic_chalk.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:runic_chalk" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sconce.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sconce.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sconce.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sconce.json index 9419946ade..156af66bbe 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sconce.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sconce.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sconce" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/scribes_table.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/scribes_table.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/scribes_table.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/scribes_table.json index c887069567..9fd9d6995b 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/scribes_table.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/scribes_table.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:scribes_table" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/scry_to_blank_parchment.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/scry_to_blank_parchment.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/scry_to_blank_parchment.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/scry_to_blank_parchment.json index da3b47154f..0a0aac05c3 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/scry_to_blank_parchment.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/scry_to_blank_parchment.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:scry_to_blank_parchment" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/scryers_crystal.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/scryers_crystal.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/scryers_crystal.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/scryers_crystal.json index 1d16d9824e..8f86aa38e9 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/scryers_crystal.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/scryers_crystal.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:scryers_crystal" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sky_block.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sky_block.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sky_block.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sky_block.json index cd2c5de62e..98336f18fa 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sky_block.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sky_block.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sky_block" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_alternating_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_alternating_stairs.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_alternating_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_alternating_stairs.json index 889e5ab1f2..8eca4424ce 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_alternating_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_alternating_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_alternating_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_alternating_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_alternating_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_alternating_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_alternating_to_sourcestone.json index eca0e4b43d..5c8ee54baa 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_alternating_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_alternating_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_alternating_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_basketweave_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_basketweave_stairs.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_basketweave_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_basketweave_stairs.json index 92202833ec..8fd3d7e4c1 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_basketweave_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_basketweave_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_basketweave_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_basketweave_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_basketweave_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_basketweave_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_basketweave_to_sourcestone.json index 8008a7840e..0b118a6d22 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_basketweave_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_basketweave_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_basketweave_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_large_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_large_bricks_stairs.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_large_bricks_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_large_bricks_stairs.json index c404463cb4..514e7e041c 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_large_bricks_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_large_bricks_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_large_bricks_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json index 60768e8710..564f0089c7 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_large_bricks_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_mosaic_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_mosaic_stairs.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_mosaic_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_mosaic_stairs.json index c7f16dfc70..d229ee61ff 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_mosaic_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_mosaic_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_mosaic_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_mosaic_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_mosaic_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_mosaic_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_mosaic_to_sourcestone.json index a3a21a23c6..166a0d7a3d 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_mosaic_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_mosaic_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_mosaic_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_small_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_small_bricks_stairs.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_small_bricks_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_small_bricks_stairs.json index 93b776c7f5..9021d0e70c 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_small_bricks_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_small_bricks_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_small_bricks_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json index bbcd188947..886796a4d5 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_gilded_sourcestone_small_bricks_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_alternating_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_alternating_stairs.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_alternating_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_alternating_stairs.json index d0d6cf966b..151b5ab725 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_alternating_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_alternating_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_alternating_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_alternating_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_alternating_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_alternating_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_alternating_to_sourcestone.json index ef2565b126..38dad07056 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_alternating_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_alternating_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_alternating_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_basketweave_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_basketweave_stairs.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_basketweave_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_basketweave_stairs.json index 59ae55a0bc..29a05e29af 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_basketweave_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_basketweave_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_basketweave_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_basketweave_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_basketweave_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_basketweave_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_basketweave_to_sourcestone.json index 6a5d65ac97..b7390c2db2 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_basketweave_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_basketweave_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_basketweave_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_large_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_large_bricks_stairs.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_large_bricks_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_large_bricks_stairs.json index c3272cfbb6..ef96742bfb 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_large_bricks_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_large_bricks_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_large_bricks_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_large_bricks_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_large_bricks_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_large_bricks_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_large_bricks_to_sourcestone.json index 663852b96b..7205582f75 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_large_bricks_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_large_bricks_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_large_bricks_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_mosaic_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_mosaic_stairs.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_mosaic_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_mosaic_stairs.json index e7faf36e6a..88c5add179 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_mosaic_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_mosaic_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_mosaic_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_mosaic_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_mosaic_to_sourcestone.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_mosaic_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_mosaic_to_sourcestone.json index fc9cf4da74..7f21404cfd 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_mosaic_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_mosaic_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_mosaic_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_small_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_small_bricks_stairs.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_small_bricks_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_small_bricks_stairs.json index 572c30b2e9..39e32a33c7 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_small_bricks_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_small_bricks_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_small_bricks_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_small_bricks_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_small_bricks_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_small_bricks_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_small_bricks_to_sourcestone.json index 8e87a33697..0bf4d6e337 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_small_bricks_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_small_bricks_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_small_bricks_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_stairs.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_stairs.json index 215dec7546..c00acd7d70 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_to_sourcestone.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_to_sourcestone.json index 0beef671fb..b2092ccc62 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/smooth_sourcestone_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:smooth_sourcestone_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/source_berry_pie.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_berry_pie.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/source_berry_pie.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_berry_pie.json index d07e4cc7e0..f4ecdef34f 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/source_berry_pie.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_berry_pie.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:source_berry_pie" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/source_berry_roll.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_berry_roll.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/source_berry_roll.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_berry_roll.json index aa8d9061be..af47212d49 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/source_berry_roll.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_berry_roll.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:source_berry_roll" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/source_gem_block.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_gem_block.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/source_gem_block.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_gem_block.json index ba30edf272..248cb8b575 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/source_gem_block.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_gem_block.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:source_gem_block" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/source_gem_block_2.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_gem_block_2.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/source_gem_block_2.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_gem_block_2.json index b133c85f1f..0f090b2ab3 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/source_gem_block_2.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_gem_block_2.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:source_gem_block_2" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/source_jar.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_jar.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/source_jar.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_jar.json index 95ab9c1d10..299a4e26a3 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/source_jar.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_jar.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:source_jar" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourceberry_sack.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourceberry_sack.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourceberry_sack.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourceberry_sack.json index 0aeed004b1..274f37307a 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourceberry_sack.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourceberry_sack.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourceberry_sack" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourceberry_sack_to_bush.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourceberry_sack_to_bush.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourceberry_sack_to_bush.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourceberry_sack_to_bush.json index 5b10eb969d..9b3f394608 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourceberry_sack_to_bush.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourceberry_sack_to_bush.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourceberry_sack_to_bush" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourceberry_to_purple.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourceberry_to_purple.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourceberry_to_purple.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourceberry_to_purple.json index b6f070aca6..27686bdb74 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourceberry_to_purple.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourceberry_to_purple.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourceberry_to_purple" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone.json index 2462eff49d..8bbdcad365 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_alternating_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_alternating_stairs.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_alternating_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_alternating_stairs.json index 9887e809cc..d1ab715826 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_alternating_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_alternating_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_alternating_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_alternating_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_alternating_to_sourcestone.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_alternating_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_alternating_to_sourcestone.json index 9da54f068e..c68a8a8ae0 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_alternating_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_alternating_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_alternating_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_basketweave_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_basketweave_stairs.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_basketweave_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_basketweave_stairs.json index 46e3c0c9c2..d4ff0a8cc4 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_basketweave_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_basketweave_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_basketweave_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_basketweave_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_basketweave_to_sourcestone.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_basketweave_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_basketweave_to_sourcestone.json index 9c2b00e0fa..f100201070 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_basketweave_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_basketweave_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_basketweave_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_large_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_large_bricks_stairs.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_large_bricks_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_large_bricks_stairs.json index 01d7ddef6b..921b8dd29d 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_large_bricks_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_large_bricks_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_large_bricks_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_large_bricks_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_large_bricks_to_sourcestone.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_large_bricks_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_large_bricks_to_sourcestone.json index ae52edcb93..72c5e86b6b 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_large_bricks_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_large_bricks_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_large_bricks_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_mosaic_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_mosaic_stairs.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_mosaic_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_mosaic_stairs.json index 7812d7853d..296c20fa76 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_mosaic_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_mosaic_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_mosaic_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_mosaic_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_mosaic_to_sourcestone.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_mosaic_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_mosaic_to_sourcestone.json index 265c09897e..2e284c48b9 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_mosaic_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_mosaic_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_mosaic_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_sconce.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_sconce.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_sconce.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_sconce.json index 2e778e42d1..755fd9062f 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_sconce.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_sconce.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_sconce" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_small_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_small_bricks_stairs.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_small_bricks_stairs.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_small_bricks_stairs.json index 27976b6296..78c0c0a719 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_small_bricks_stairs.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_small_bricks_stairs.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_small_bricks_stairs" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_small_bricks_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_small_bricks_to_sourcestone.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_small_bricks_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_small_bricks_to_sourcestone.json index f8f7bef145..e66cd343cc 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sourcestone_small_bricks_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_small_bricks_to_sourcestone.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sourcestone_small_bricks_to_sourcestone" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/spell_prism.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/spell_prism.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/spell_prism.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/spell_prism.json index db1584109d..32bc5c911c 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/spell_prism.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/spell_prism.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:spell_prism" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/spike_to_arrow.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/spike_to_arrow.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/spike_to_arrow.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/spike_to_arrow.json index eeae3af3d2..e5cab48751 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/spike_to_arrow.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/spike_to_arrow.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:spike_to_arrow" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/spike_to_dye.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/spike_to_dye.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/spike_to_dye.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/spike_to_dye.json index e85b0fc97d..e3907bb162 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/spike_to_dye.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/spike_to_dye.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:spike_to_dye" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/starbuncle_shades.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/starbuncle_shades.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/starbuncle_shades.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/starbuncle_shades.json index 65ebeaeef7..0df3ba4f00 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/starbuncle_shades.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/starbuncle_shades.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:starbuncle_shades" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sunrise_2.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sunrise_2.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sunrise_2.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sunrise_2.json index bcae24a9eb..269452f5d8 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/sunrise_2.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sunrise_2.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:sunrise_2" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/vitalic_sourcelink.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/vitalic_sourcelink.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/vitalic_sourcelink.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/vitalic_sourcelink.json index 762fe49762..f92a448a04 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/vitalic_sourcelink.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/vitalic_sourcelink.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:vitalic_sourcelink" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/void_prism.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/void_prism.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/void_prism.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/void_prism.json index 3868dfe58e..9e91b23370 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/void_prism.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/void_prism.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:void_prism" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/volcanic_sourcelink.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/volcanic_sourcelink.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/volcanic_sourcelink.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/volcanic_sourcelink.json index 5fdf7dd50d..da5d34ed02 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/volcanic_sourcelink.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/volcanic_sourcelink.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:volcanic_sourcelink" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/warp_scroll.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/warp_scroll.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/warp_scroll.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/warp_scroll.json index 11aa0eabfb..9967a8f8c0 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/warp_scroll.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/warp_scroll.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:warp_scroll" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/water_essence_to_bucket.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/water_essence_to_bucket.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/water_essence_to_bucket.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/water_essence_to_bucket.json index a485d939a8..291fc657c1 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/water_essence_to_bucket.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/water_essence_to_bucket.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:water_essence_to_bucket" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/water_essence_to_obsidian.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/water_essence_to_obsidian.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/water_essence_to_obsidian.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/water_essence_to_obsidian.json index 944d870cd1..d165a41630 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/water_essence_to_obsidian.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/water_essence_to_obsidian.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:water_essence_to_obsidian" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/wilden_summon_alt.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wilden_summon_alt.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/wilden_summon_alt.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wilden_summon_alt.json index ddc2b91bfc..62703c1552 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/wilden_summon_alt.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wilden_summon_alt.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:wilden_summon_alt" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/wing_to_leather.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wing_to_leather.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/wing_to_leather.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wing_to_leather.json index 0791be858d..cdfaba4e1e 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/wing_to_leather.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wing_to_leather.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:wing_to_leather" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/wipe_spell_parchment.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wipe_spell_parchment.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/wipe_spell_parchment.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wipe_spell_parchment.json index 27482f2126..a9529208d7 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/wipe_spell_parchment.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wipe_spell_parchment.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:wipe_spell_parchment" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/wipe_starby_shard.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wipe_starby_shard.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/wipe_starby_shard.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wipe_starby_shard.json index fc4f5fd868..cf735e8ae2 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/wipe_starby_shard.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wipe_starby_shard.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:wipe_starby_shard" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/wixie_hat.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wixie_hat.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/wixie_hat.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wixie_hat.json index ef36869f0a..1f2affc824 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/wixie_hat.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wixie_hat.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:wixie_hat" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/worn_notebook.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/worn_notebook.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/worn_notebook.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/worn_notebook.json index af1ff190d3..8935c1cc09 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/worn_notebook.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/worn_notebook.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:worn_notebook" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/yellow_sbed.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/yellow_sbed.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/advancements/recipes/misc/yellow_sbed.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/yellow_sbed.json index 62c4e9ea43..8722a5e2c0 100644 --- a/src/generated/resources/data/ars_nouveau/advancements/recipes/misc/yellow_sbed.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/yellow_sbed.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "ars_nouveau:worn_notebook" - ] + "items": "ars_nouveau:worn_notebook" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_journal", - "has_the_recipe" + "has_the_recipe", + "has_journal" ] ], "rewards": { "recipes": [ "ars_nouveau:yellow_sbed" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/alteration_table.json b/src/generated/resources/data/ars_nouveau/advancements/alteration_table.json deleted file mode 100644 index 07e6f83b52..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/alteration_table.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:magebloom_crop", - "criteria": { - "has_alteration_table": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:alteration_table" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.alteration_table" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:alteration_table" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.alteration_table" - } - }, - "requirements": [ - [ - "has_alteration_table" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/amethyst_golem_charm.json b/src/generated/resources/data/ars_nouveau/advancements/amethyst_golem_charm.json deleted file mode 100644 index cdf2c4bf58..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/amethyst_golem_charm.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:ritual_brazier", - "criteria": { - "has_amethyst_golem_charm": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:amethyst_golem_charm" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.amethyst_golem_charm" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:amethyst_golem_charm" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.amethyst_golem_charm" - } - }, - "requirements": [ - [ - "has_amethyst_golem_charm" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/apprentice_spell_book.json b/src/generated/resources/data/ars_nouveau/advancements/apprentice_spell_book.json deleted file mode 100644 index 30205a14b3..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/apprentice_spell_book.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:novice_spell_book", - "criteria": { - "has_apprentice_spell_book": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:apprentice_spell_book" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.apprentice_spell_book" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:apprentice_spell_book" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.apprentice_spell_book" - } - }, - "requirements": [ - [ - "has_apprentice_spell_book" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/archmage_spell_book.json b/src/generated/resources/data/ars_nouveau/advancements/archmage_spell_book.json deleted file mode 100644 index 02120d6544..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/archmage_spell_book.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:wilden_tribute", - "criteria": { - "has_archmage_spell_book": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:archmage_spell_book" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.archmage_spell_book" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:archmage_spell_book" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.archmage_spell_book" - } - }, - "requirements": [ - [ - "has_archmage_spell_book" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/basic_spell_turret.json b/src/generated/resources/data/ars_nouveau/advancements/basic_spell_turret.json deleted file mode 100644 index 5d24f4b401..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/basic_spell_turret.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:enchanting_apparatus", - "criteria": { - "has_basic_spell_turret": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:basic_spell_turret" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.basic_spell_turret" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:basic_spell_turret" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.basic_spell_turret" - } - }, - "requirements": [ - [ - "has_basic_spell_turret" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/catch_lightning.json b/src/generated/resources/data/ars_nouveau/advancements/catch_lightning.json deleted file mode 100644 index aed7da5a85..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/catch_lightning.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "parent": "ars_nouveau:mob_jar", - "criteria": { - "catch_lightning": { - "conditions": {}, - "trigger": "ars_nouveau:catch_lightning" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.catch_lightning" - }, - "frame": "challenge", - "hidden": true, - "icon": { - "item": "minecraft:lightning_rod" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.catch_lightning" - } - }, - "requirements": [ - [ - "catch_lightning" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/create_portal.json b/src/generated/resources/data/ars_nouveau/advancements/create_portal.json deleted file mode 100644 index 4b93228de0..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/create_portal.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "parent": "ars_nouveau:warp_scroll", - "criteria": { - "create_portal": { - "conditions": {}, - "trigger": "ars_nouveau:portals" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.create_portal" - }, - "frame": "challenge", - "hidden": false, - "icon": { - "item": "ars_nouveau:creative_source_jar" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.create_portal" - } - }, - "requirements": [ - [ - "create_portal" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/drygmy_charm.json b/src/generated/resources/data/ars_nouveau/advancements/drygmy_charm.json deleted file mode 100644 index 251b1f6115..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/drygmy_charm.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:poof_mob", - "criteria": { - "has_drygmy_charm": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:drygmy_charm" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.drygmy_charm" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:drygmy_charm" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.drygmy_charm" - } - }, - "requirements": [ - [ - "has_drygmy_charm" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/eat_bombegranate.json b/src/generated/resources/data/ars_nouveau/advancements/eat_bombegranate.json deleted file mode 100644 index d02e7acbc8..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/eat_bombegranate.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "parent": "ars_nouveau:root", - "criteria": { - "eat_bombegranate": { - "conditions": { - "item": { - "items": [ - "ars_nouveau:bombegranate_pod" - ] - } - }, - "trigger": "minecraft:consume_item" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.eat_bombegranate" - }, - "frame": "task", - "hidden": true, - "icon": { - "item": "ars_nouveau:bombegranate_pod" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.eat_bombegranate" - } - }, - "requirements": [ - [ - "eat_bombegranate" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/enchanting_apparatus.json b/src/generated/resources/data/ars_nouveau/advancements/enchanting_apparatus.json deleted file mode 100644 index 4f409df4fc..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/enchanting_apparatus.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:imbuement_chamber", - "criteria": { - "has_enchanting_apparatus": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:enchanting_apparatus" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.enchanting_apparatus" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:enchanting_apparatus" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.enchanting_apparatus" - } - }, - "requirements": [ - [ - "has_enchanting_apparatus" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/familiar.json b/src/generated/resources/data/ars_nouveau/advancements/familiar.json deleted file mode 100644 index d26dc0a21d..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/familiar.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "parent": "ars_nouveau:ritual_brazier", - "criteria": { - "familiar": { - "conditions": {}, - "trigger": "ars_nouveau:familiar" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.familiar" - }, - "frame": "goal", - "hidden": false, - "icon": { - "item": "ars_nouveau:ritual_binding" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.familiar" - } - }, - "requirements": [ - [ - "familiar" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/imbuement_chamber.json b/src/generated/resources/data/ars_nouveau/advancements/imbuement_chamber.json deleted file mode 100644 index 7e161d701e..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/imbuement_chamber.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:root", - "criteria": { - "has_imbuement_chamber": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:imbuement_chamber" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.imbuement_chamber" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:imbuement_chamber" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.imbuement_chamber" - } - }, - "requirements": [ - [ - "has_imbuement_chamber" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/magebloom_crop.json b/src/generated/resources/data/ars_nouveau/advancements/magebloom_crop.json deleted file mode 100644 index 1a4d2cc89a..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/magebloom_crop.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:enchanting_apparatus", - "criteria": { - "has_magebloom_crop": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:magebloom_crop" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.magebloom_crop" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:magebloom_crop" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.magebloom_crop" - } - }, - "requirements": [ - [ - "has_magebloom_crop" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/mob_jar.json b/src/generated/resources/data/ars_nouveau/advancements/mob_jar.json deleted file mode 100644 index 9063f13637..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/mob_jar.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:ritual_brazier", - "criteria": { - "has_mob_jar": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:mob_jar" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.mob_jar" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:mob_jar" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.mob_jar" - } - }, - "requirements": [ - [ - "has_mob_jar" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/novice_spell_book.json b/src/generated/resources/data/ars_nouveau/advancements/novice_spell_book.json deleted file mode 100644 index 73afa69e74..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/novice_spell_book.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:root", - "criteria": { - "has_novice_spell_book": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:novice_spell_book" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.novice_spell_book" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:novice_spell_book" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.novice_spell_book" - } - }, - "requirements": [ - [ - "has_novice_spell_book" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/poof_mob.json b/src/generated/resources/data/ars_nouveau/advancements/poof_mob.json deleted file mode 100644 index 9e16804a15..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/poof_mob.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "parent": "ars_nouveau:root", - "criteria": { - "poof_mob": { - "conditions": {}, - "trigger": "ars_nouveau:poof_mob" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.poof_mob" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "minecraft:gold_nugget" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.poof_mob" - } - }, - "requirements": [ - [ - "poof_mob" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/potion_diffuser.json b/src/generated/resources/data/ars_nouveau/advancements/potion_diffuser.json deleted file mode 100644 index 7d5bd500d5..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/potion_diffuser.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:potion_jar", - "criteria": { - "has_potion_diffuser": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:potion_diffuser" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.potion_diffuser" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:potion_diffuser" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.potion_diffuser" - } - }, - "requirements": [ - [ - "has_potion_diffuser" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/potion_flask.json b/src/generated/resources/data/ars_nouveau/advancements/potion_flask.json deleted file mode 100644 index 932c6adf08..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/potion_flask.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "parent": "ars_nouveau:potion_jar", - "criteria": { - "has_potion_flask": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:potion_flask" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.potion_flask" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:potion_flask", - "nbt": "{Damage:8}" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.potion_flask" - } - }, - "requirements": [ - [ - "has_potion_flask" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/potion_jar.json b/src/generated/resources/data/ars_nouveau/advancements/potion_jar.json deleted file mode 100644 index a81961d0fc..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/potion_jar.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:enchanting_apparatus", - "criteria": { - "has_potion_jar": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:potion_jar" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.potion_jar" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:potion_jar" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.potion_jar" - } - }, - "requirements": [ - [ - "has_potion_jar" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/potion_melder.json b/src/generated/resources/data/ars_nouveau/advancements/potion_melder.json deleted file mode 100644 index a7ee068467..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/potion_melder.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:potion_jar", - "criteria": { - "has_potion_melder": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:potion_melder" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.potion_melder" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:potion_melder" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.potion_melder" - } - }, - "requirements": [ - [ - "has_potion_melder" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/prismatic.json b/src/generated/resources/data/ars_nouveau/advancements/prismatic.json deleted file mode 100644 index f1736db9a2..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/prismatic.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "parent": "ars_nouveau:spell_prism", - "criteria": { - "prismatic": { - "conditions": {}, - "trigger": "ars_nouveau:prismatic" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.prismatic" - }, - "frame": "challenge", - "hidden": true, - "icon": { - "item": "ars_nouveau:spell_prism" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.prismatic" - } - }, - "requirements": [ - [ - "prismatic" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/ritual_brazier.json b/src/generated/resources/data/ars_nouveau/advancements/ritual_brazier.json deleted file mode 100644 index 7586162218..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/ritual_brazier.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:root", - "criteria": { - "has_ritual_brazier": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:ritual_brazier" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.ritual_brazier" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:ritual_brazier" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.ritual_brazier" - } - }, - "requirements": [ - [ - "has_ritual_brazier" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/ritual_gravity.json b/src/generated/resources/data/ars_nouveau/advancements/ritual_gravity.json deleted file mode 100644 index 849cb04506..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/ritual_gravity.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "parent": "ars_nouveau:ritual_brazier", - "criteria": { - "gravity_effect": { - "conditions": { - "effects": { - "ars_nouveau:gravity": {} - } - }, - "trigger": "minecraft:effects_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.ritual_gravity" - }, - "frame": "goal", - "hidden": false, - "icon": { - "item": "ars_nouveau:ritual_gravity" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.ritual_gravity" - } - }, - "requirements": [ - [ - "gravity_effect" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/root.json b/src/generated/resources/data/ars_nouveau/advancements/root.json deleted file mode 100644 index 0a6b995990..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/root.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "criteria": { - "ars_nouveau:worn_notebook": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:worn_notebook" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": false, - "background": "ars_nouveau:textures/gui/advancements/backgrounds/sourcestone.png", - "description": { - "translate": "ars_nouveau.advancement.desc.root" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:worn_notebook" - }, - "show_toast": false, - "title": { - "translate": "ars_nouveau.advancement.title.root" - } - }, - "requirements": [ - [ - "ars_nouveau:worn_notebook" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/scryers_oculus.json b/src/generated/resources/data/ars_nouveau/advancements/scryers_oculus.json deleted file mode 100644 index d6da71b2bf..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/scryers_oculus.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:enchanting_apparatus", - "criteria": { - "has_scryers_oculus": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:scryers_oculus" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.scryers_oculus" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:scryers_oculus" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.scryers_oculus" - } - }, - "requirements": [ - [ - "has_scryers_oculus" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/shapers_focus.json b/src/generated/resources/data/ars_nouveau/advancements/shapers_focus.json deleted file mode 100644 index da394166e7..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/shapers_focus.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:novice_spell_book", - "criteria": { - "has_shapers_focus": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:shapers_focus" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.shapers_focus" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:shapers_focus" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.shapers_focus" - } - }, - "requirements": [ - [ - "has_shapers_focus" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/shrunk_starbuncle.json b/src/generated/resources/data/ars_nouveau/advancements/shrunk_starbuncle.json deleted file mode 100644 index cfa6b943a0..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/shrunk_starbuncle.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "parent": "ars_nouveau:mob_jar", - "criteria": { - "shrunk_starbuncle": { - "conditions": {}, - "trigger": "ars_nouveau:shrunk_starby" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.shrunk_starbuncle" - }, - "frame": "challenge", - "hidden": true, - "icon": { - "item": "ars_nouveau:starbuncle_charm" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.shrunk_starbuncle" - } - }, - "requirements": [ - [ - "shrunk_starbuncle" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/source_jar.json b/src/generated/resources/data/ars_nouveau/advancements/source_jar.json deleted file mode 100644 index 409d1827f4..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/source_jar.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:imbuement_chamber", - "criteria": { - "has_source_jar": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:source_jar" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.source_jar" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:source_jar" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.source_jar" - } - }, - "requirements": [ - [ - "has_source_jar" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/spell_prism.json b/src/generated/resources/data/ars_nouveau/advancements/spell_prism.json deleted file mode 100644 index c550310742..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/spell_prism.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:basic_spell_turret", - "criteria": { - "has_spell_prism": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:spell_prism" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.spell_prism" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:spell_prism" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.spell_prism" - } - }, - "requirements": [ - [ - "has_spell_prism" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/starbuncle_shades.json b/src/generated/resources/data/ars_nouveau/advancements/starbuncle_shades.json deleted file mode 100644 index 1f70e64f59..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/starbuncle_shades.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:starby_charm", - "criteria": { - "has_starbuncle_shades": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:starbuncle_shades" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.starbuncle_shades" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:starbuncle_shades" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.starbuncle_shades" - } - }, - "requirements": [ - [ - "has_starbuncle_shades" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/starby_charm.json b/src/generated/resources/data/ars_nouveau/advancements/starby_charm.json deleted file mode 100644 index bd9fd47499..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/starby_charm.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:poof_mob", - "criteria": { - "has_starbuncle_charm": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:starbuncle_charm" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.starby_charm" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:starbuncle_charm" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.starby_charm" - } - }, - "requirements": [ - [ - "has_starbuncle_charm" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/summon_focus.json b/src/generated/resources/data/ars_nouveau/advancements/summon_focus.json deleted file mode 100644 index 07f36aa4e7..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/summon_focus.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:wilden_tribute", - "criteria": { - "has_summon_focus": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:summon_focus" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.summon_focus" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:summon_focus" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.summon_focus" - } - }, - "requirements": [ - [ - "has_summon_focus" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/time_in_a_bottle.json b/src/generated/resources/data/ars_nouveau/advancements/time_in_a_bottle.json deleted file mode 100644 index 64e75b5f35..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/time_in_a_bottle.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "parent": "ars_nouveau:mob_jar", - "criteria": { - "time_in_a_bottle": { - "conditions": {}, - "trigger": "ars_nouveau:time_in_bottle" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.time_in_a_bottle" - }, - "frame": "challenge", - "hidden": true, - "icon": { - "item": "minecraft:clock" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.time_in_a_bottle" - } - }, - "requirements": [ - [ - "time_in_a_bottle" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/warp_scroll.json b/src/generated/resources/data/ars_nouveau/advancements/warp_scroll.json deleted file mode 100644 index 33f7020e5e..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/warp_scroll.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:magebloom_crop", - "criteria": { - "has_warp_scroll": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:warp_scroll" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.warp_scroll" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:warp_scroll" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.warp_scroll" - } - }, - "requirements": [ - [ - "has_warp_scroll" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/whirlisprig_charm.json b/src/generated/resources/data/ars_nouveau/advancements/whirlisprig_charm.json deleted file mode 100644 index 050f6d8581..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/whirlisprig_charm.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:poof_mob", - "criteria": { - "has_whirlisprig_charm": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:whirlisprig_charm" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.whirlisprig_charm" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:whirlisprig_charm" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.whirlisprig_charm" - } - }, - "requirements": [ - [ - "has_whirlisprig_charm" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/wilden_explosion.json b/src/generated/resources/data/ars_nouveau/advancements/wilden_explosion.json deleted file mode 100644 index cdc5c36417..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/wilden_explosion.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "parent": "ars_nouveau:wilden_tribute", - "criteria": { - "wilden_explosion": { - "conditions": {}, - "trigger": "ars_nouveau:chimera_explosion" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.wilden_explosion" - }, - "frame": "challenge", - "hidden": true, - "icon": { - "item": "ars_nouveau:wilden_tribute" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.wilden_explosion" - } - }, - "requirements": [ - [ - "wilden_explosion" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/wilden_tribute.json b/src/generated/resources/data/ars_nouveau/advancements/wilden_tribute.json deleted file mode 100644 index 405e4397db..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/wilden_tribute.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:apprentice_spell_book", - "criteria": { - "has_wilden_tribute": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:wilden_tribute" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.wilden_tribute" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:wilden_tribute" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.wilden_tribute" - } - }, - "requirements": [ - [ - "has_wilden_tribute" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/wixie_charm.json b/src/generated/resources/data/ars_nouveau/advancements/wixie_charm.json deleted file mode 100644 index b0e7b9e233..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/wixie_charm.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:poof_mob", - "criteria": { - "has_wixie_charm": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:wixie_charm" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.wixie_charm" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:wixie_charm" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.wixie_charm" - } - }, - "requirements": [ - [ - "has_wixie_charm" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancements/wixie_hat.json b/src/generated/resources/data/ars_nouveau/advancements/wixie_hat.json deleted file mode 100644 index f4d47b304d..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancements/wixie_hat.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "ars_nouveau:starby_charm", - "criteria": { - "has_wixie_hat": { - "conditions": { - "items": [ - { - "items": [ - "ars_nouveau:wixie_hat" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "announce_to_chat": true, - "description": { - "translate": "ars_nouveau.adv.desc.wixie_hat" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "ars_nouveau:wixie_hat" - }, - "show_toast": true, - "title": { - "translate": "ars_nouveau.adv.title.wixie_hat" - } - }, - "requirements": [ - [ - "has_wixie_hat" - ] - ], - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/agronomic_sourcelink.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/agronomic_sourcelink.json deleted file mode 100644 index 07664ec33c..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/agronomic_sourcelink.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:agronomic_sourcelink" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/agronomic_sourcelink" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/alchemical_sourcelink.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/alchemical_sourcelink.json deleted file mode 100644 index 2c4299d630..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/alchemical_sourcelink.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:alchemical_sourcelink" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/alchemical_sourcelink" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/alteration_table.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/alteration_table.json deleted file mode 100644 index 31b51f1af2..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/alteration_table.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "conditions": [ - { - "block": "ars_nouveau:alteration_table", - "condition": "minecraft:block_state_property", - "properties": { - "part": "head" - } - } - ], - "name": "ars_nouveau:alteration_table" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/alteration_table" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/arcane_core.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/arcane_core.json deleted file mode 100644 index 8a178ff910..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/arcane_core.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:arcane_core" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/arcane_core" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/arcane_pedestal.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/arcane_pedestal.json deleted file mode 100644 index 16b7642602..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/arcane_pedestal.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:arcane_pedestal" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/arcane_pedestal" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/arcane_platform.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/arcane_platform.json deleted file mode 100644 index d1f8b05167..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/arcane_platform.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:arcane_platform" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/arcane_platform" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_button.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_button.json deleted file mode 100644 index 7877e565df..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_button.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:archwood_button" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/archwood_button" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_chest.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_chest.json deleted file mode 100644 index 52d0c97187..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_chest.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:archwood_chest" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/archwood_chest" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_door.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_door.json deleted file mode 100644 index 409c189265..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_door.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "conditions": [ - { - "block": "ars_nouveau:archwood_door", - "condition": "minecraft:block_state_property", - "properties": { - "half": "lower" - } - } - ], - "name": "ars_nouveau:archwood_door" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/archwood_door" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_fence.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_fence.json deleted file mode 100644 index 95812c2f4a..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_fence.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:archwood_fence" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/archwood_fence" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_fence_gate.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_fence_gate.json deleted file mode 100644 index e818ac6f6b..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_fence_gate.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:archwood_fence_gate" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/archwood_fence_gate" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_planks.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_planks.json deleted file mode 100644 index 1f024f0ad4..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_planks.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:archwood_planks" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/archwood_planks" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_pressure_plate.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_pressure_plate.json deleted file mode 100644 index 19e423c682..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_pressure_plate.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:archwood_pressure_plate" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/archwood_pressure_plate" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_sconce.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_sconce.json deleted file mode 100644 index 89a486b6c5..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_sconce.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:archwood_sconce" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/archwood_sconce" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_slab.json deleted file mode 100644 index 8ba1d14d86..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_slab.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "add": false, - "conditions": [ - { - "block": "ars_nouveau:archwood_slab", - "condition": "minecraft:block_state_property", - "properties": { - "type": "double" - } - } - ], - "count": 2.0, - "function": "minecraft:set_count" - }, - { - "function": "minecraft:explosion_decay" - } - ], - "name": "ars_nouveau:archwood_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/archwood_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_stairs.json deleted file mode 100644 index 29a6eef36b..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:archwood_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/archwood_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_trapdoor.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_trapdoor.json deleted file mode 100644 index 0fbbe2e38d..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/archwood_trapdoor.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:archwood_trapdoor" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/archwood_trapdoor" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/basic_spell_turret.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/basic_spell_turret.json deleted file mode 100644 index 9b94805b5b..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/basic_spell_turret.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:basic_spell_turret" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/basic_spell_turret" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/bastion_pod.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/bastion_pod.json deleted file mode 100644 index a6c597364d..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/bastion_pod.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "add": false, - "conditions": [ - { - "block": "ars_nouveau:bastion_pod", - "condition": "minecraft:block_state_property", - "properties": { - "age": "2" - } - } - ], - "count": 3.0, - "function": "minecraft:set_count" - } - ], - "name": "ars_nouveau:bastion_pod" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/bastion_pod" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_archwood_leaves.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_archwood_leaves.json deleted file mode 100644 index a5ec77d9a7..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_archwood_leaves.json +++ /dev/null @@ -1,136 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:alternatives", - "children": [ - { - "type": "minecraft:item", - "conditions": [ - { - "condition": "minecraft:any_of", - "terms": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "items": [ - "minecraft:shears" - ] - } - }, - { - "condition": "minecraft:match_tool", - "predicate": { - "enchantments": [ - { - "enchantment": "minecraft:silk_touch", - "levels": { - "min": 1 - } - } - ] - } - } - ] - } - ], - "name": "ars_nouveau:blue_archwood_leaves" - }, - { - "type": "minecraft:item", - "conditions": [ - { - "condition": "minecraft:survives_explosion" - }, - { - "chances": [ - 0.05, - 0.0625, - 0.083333336, - 0.1 - ], - "condition": "minecraft:table_bonus", - "enchantment": "minecraft:fortune" - } - ], - "name": "ars_nouveau:blue_archwood_sapling" - } - ] - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:inverted", - "term": { - "condition": "minecraft:any_of", - "terms": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "items": [ - "minecraft:shears" - ] - } - }, - { - "condition": "minecraft:match_tool", - "predicate": { - "enchantments": [ - { - "enchantment": "minecraft:silk_touch", - "levels": { - "min": 1 - } - } - ] - } - } - ] - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "conditions": [ - { - "chances": [ - 0.02, - 0.022222223, - 0.025, - 0.033333335, - 0.1 - ], - "condition": "minecraft:table_bonus", - "enchantment": "minecraft:fortune" - } - ], - "functions": [ - { - "add": false, - "count": { - "type": "minecraft:uniform", - "max": 2.0, - "min": 1.0 - }, - "function": "minecraft:set_count" - }, - { - "function": "minecraft:explosion_decay" - } - ], - "name": "minecraft:stick" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/blue_archwood_leaves" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_archwood_log.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_archwood_log.json deleted file mode 100644 index 467f7c7c45..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_archwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:blue_archwood_log" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/blue_archwood_log" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_archwood_sapling.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_archwood_sapling.json deleted file mode 100644 index 2a61b9b690..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_archwood_sapling.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:blue_archwood_sapling" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/blue_archwood_sapling" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_archwood_wood.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_archwood_wood.json deleted file mode 100644 index d92c75a880..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_archwood_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:blue_archwood_wood" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/blue_archwood_wood" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_sbed.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_sbed.json deleted file mode 100644 index 7134f85399..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/blue_sbed.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:blue_sbed" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/blue_sbed" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/bombegranate_pod.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/bombegranate_pod.json deleted file mode 100644 index a4457e7064..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/bombegranate_pod.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "add": false, - "conditions": [ - { - "block": "ars_nouveau:bombegranate_pod", - "condition": "minecraft:block_state_property", - "properties": { - "age": "2" - } - } - ], - "count": 3.0, - "function": "minecraft:set_count" - } - ], - "name": "ars_nouveau:bombegranate_pod" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/bombegranate_pod" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/brazier_relay.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/brazier_relay.json deleted file mode 100644 index de954e7c54..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/brazier_relay.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:brazier_relay" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/brazier_relay" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/drygmy_stone.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/drygmy_stone.json deleted file mode 100644 index 904695056e..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/drygmy_stone.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:mossy_cobblestone" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/drygmy_stone" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/enchanting_apparatus.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/enchanting_apparatus.json deleted file mode 100644 index 446f8c8eb9..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/enchanting_apparatus.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:enchanting_apparatus" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/enchanting_apparatus" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/falseweave.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/falseweave.json deleted file mode 100644 index a9ad7144b7..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/falseweave.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:falseweave" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/falseweave" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/frostaya_pod.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/frostaya_pod.json deleted file mode 100644 index 04159ed990..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/frostaya_pod.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "add": false, - "conditions": [ - { - "block": "ars_nouveau:frostaya_pod", - "condition": "minecraft:block_state_property", - "properties": { - "age": "2" - } - } - ], - "count": 3.0, - "function": "minecraft:set_count" - } - ], - "name": "ars_nouveau:frostaya_pod" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/frostaya_pod" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/ghostweave.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/ghostweave.json deleted file mode 100644 index 6b0eed2e4e..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/ghostweave.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:ghostweave" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/ghostweave" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_alternating.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_alternating.json deleted file mode 100644 index 516acc8736..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_alternating.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:gilded_sourcestone_alternating" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_alternating" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_alternating_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_alternating_slab.json deleted file mode 100644 index 23165f94db..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_alternating_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:gilded_sourcestone_alternating_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_alternating_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_alternating_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_alternating_stairs.json deleted file mode 100644 index 9587826607..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_alternating_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:gilded_sourcestone_alternating_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_alternating_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_basketweave.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_basketweave.json deleted file mode 100644 index d130cee12d..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_basketweave.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:gilded_sourcestone_basketweave" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_basketweave" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_basketweave_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_basketweave_slab.json deleted file mode 100644 index ae6f86b98c..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_basketweave_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:gilded_sourcestone_basketweave_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_basketweave_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_basketweave_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_basketweave_stairs.json deleted file mode 100644 index 035cd03082..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_basketweave_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:gilded_sourcestone_basketweave_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_basketweave_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_large_bricks.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_large_bricks.json deleted file mode 100644 index e158c2fd1f..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_large_bricks.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:gilded_sourcestone_large_bricks" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_large_bricks" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_large_bricks_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_large_bricks_slab.json deleted file mode 100644 index 6cbc62f58a..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_large_bricks_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:gilded_sourcestone_large_bricks_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_large_bricks_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_large_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_large_bricks_stairs.json deleted file mode 100644 index b22cdf45b5..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_large_bricks_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:gilded_sourcestone_large_bricks_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_large_bricks_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_mosaic.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_mosaic.json deleted file mode 100644 index 7805fbb4f4..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_mosaic.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:gilded_sourcestone_mosaic" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_mosaic" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_mosaic_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_mosaic_slab.json deleted file mode 100644 index 71d7dc82df..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_mosaic_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:gilded_sourcestone_mosaic_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_mosaic_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_mosaic_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_mosaic_stairs.json deleted file mode 100644 index ee3993d643..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_mosaic_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:gilded_sourcestone_mosaic_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_mosaic_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_small_bricks.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_small_bricks.json deleted file mode 100644 index 8b629ed0a0..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_small_bricks.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:gilded_sourcestone_small_bricks" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_small_bricks" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_small_bricks_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_small_bricks_slab.json deleted file mode 100644 index c5a78321ed..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_small_bricks_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:gilded_sourcestone_small_bricks_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_small_bricks_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_small_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_small_bricks_stairs.json deleted file mode 100644 index b7ac94e3aa..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/gilded_sourcestone_small_bricks_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:gilded_sourcestone_small_bricks_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_small_bricks_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_archwood_leaves.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_archwood_leaves.json deleted file mode 100644 index 61ac90b109..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_archwood_leaves.json +++ /dev/null @@ -1,136 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:alternatives", - "children": [ - { - "type": "minecraft:item", - "conditions": [ - { - "condition": "minecraft:any_of", - "terms": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "items": [ - "minecraft:shears" - ] - } - }, - { - "condition": "minecraft:match_tool", - "predicate": { - "enchantments": [ - { - "enchantment": "minecraft:silk_touch", - "levels": { - "min": 1 - } - } - ] - } - } - ] - } - ], - "name": "ars_nouveau:green_archwood_leaves" - }, - { - "type": "minecraft:item", - "conditions": [ - { - "condition": "minecraft:survives_explosion" - }, - { - "chances": [ - 0.05, - 0.0625, - 0.083333336, - 0.1 - ], - "condition": "minecraft:table_bonus", - "enchantment": "minecraft:fortune" - } - ], - "name": "ars_nouveau:green_archwood_sapling" - } - ] - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:inverted", - "term": { - "condition": "minecraft:any_of", - "terms": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "items": [ - "minecraft:shears" - ] - } - }, - { - "condition": "minecraft:match_tool", - "predicate": { - "enchantments": [ - { - "enchantment": "minecraft:silk_touch", - "levels": { - "min": 1 - } - } - ] - } - } - ] - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "conditions": [ - { - "chances": [ - 0.02, - 0.022222223, - 0.025, - 0.033333335, - 0.1 - ], - "condition": "minecraft:table_bonus", - "enchantment": "minecraft:fortune" - } - ], - "functions": [ - { - "add": false, - "count": { - "type": "minecraft:uniform", - "max": 2.0, - "min": 1.0 - }, - "function": "minecraft:set_count" - }, - { - "function": "minecraft:explosion_decay" - } - ], - "name": "minecraft:stick" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/green_archwood_leaves" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_archwood_log.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_archwood_log.json deleted file mode 100644 index f0b6cf3098..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_archwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:green_archwood_log" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/green_archwood_log" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_archwood_sapling.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_archwood_sapling.json deleted file mode 100644 index d6576d24aa..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_archwood_sapling.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:green_archwood_sapling" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/green_archwood_sapling" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_archwood_wood.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_archwood_wood.json deleted file mode 100644 index 0687716c8a..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_archwood_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:green_archwood_wood" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/green_archwood_wood" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_sbed.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_sbed.json deleted file mode 100644 index 2715dda94e..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/green_sbed.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:green_sbed" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/green_sbed" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/imbuement_chamber.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/imbuement_chamber.json deleted file mode 100644 index 31e897246b..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/imbuement_chamber.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:imbuement_chamber" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/imbuement_chamber" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/item_detector.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/item_detector.json deleted file mode 100644 index 943a9cb27a..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/item_detector.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:item_detector" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/item_detector" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/magebloom_block.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/magebloom_block.json deleted file mode 100644 index 337a2d5268..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/magebloom_block.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:magebloom_block" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/magebloom_block" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/magelight_torch.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/magelight_torch.json deleted file mode 100644 index 945a6281fe..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/magelight_torch.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:magelight_torch" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/magelight_torch" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/mendosteen_pod.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/mendosteen_pod.json deleted file mode 100644 index 7befb4e2e9..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/mendosteen_pod.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "add": false, - "conditions": [ - { - "block": "ars_nouveau:mendosteen_pod", - "condition": "minecraft:block_state_property", - "properties": { - "age": "2" - } - } - ], - "count": 3.0, - "function": "minecraft:set_count" - } - ], - "name": "ars_nouveau:mendosteen_pod" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/mendosteen_pod" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/mirrorweave.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/mirrorweave.json deleted file mode 100644 index 1d768d395b..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/mirrorweave.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:mirrorweave" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/mirrorweave" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/mob_jar.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/mob_jar.json deleted file mode 100644 index 3425ed7696..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/mob_jar.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "function": "minecraft:copy_name", - "source": "block_entity" - }, - { - "function": "minecraft:copy_nbt", - "ops": [ - { - "op": "replace", - "source": "entityTag", - "target": "BlockEntityTag.entityTag" - }, - { - "op": "replace", - "source": "entityId", - "target": "entityId" - } - ], - "source": "block_entity" - }, - { - "type": "ars_nouveau:mob_jar", - "entries": [ - { - "type": "minecraft:dynamic", - "name": "minecraft:contents" - } - ], - "function": "minecraft:set_contents" - } - ], - "name": "ars_nouveau:mob_jar" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/mob_jar" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/mycelial_sourcelink.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/mycelial_sourcelink.json deleted file mode 100644 index 8a83b1dd4d..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/mycelial_sourcelink.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:mycelial_sourcelink" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/mycelial_sourcelink" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/orange_sbed.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/orange_sbed.json deleted file mode 100644 index 0e20fa7771..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/orange_sbed.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:orange_sbed" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/orange_sbed" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/polished_sconce.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/polished_sconce.json deleted file mode 100644 index e0afccbbf2..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/polished_sconce.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:polished_sconce" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/polished_sconce" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potion_diffuser.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potion_diffuser.json deleted file mode 100644 index 8a72fbe770..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potion_diffuser.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:potion_diffuser" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/potion_diffuser" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potion_jar.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potion_jar.json deleted file mode 100644 index e002cfc39f..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potion_jar.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "function": "minecraft:copy_name", - "source": "block_entity" - }, - { - "function": "minecraft:copy_nbt", - "ops": [ - { - "op": "replace", - "source": "potionData", - "target": "BlockEntityTag.potionData" - }, - { - "op": "replace", - "source": "currentFill", - "target": "BlockEntityTag.currentFill" - }, - { - "op": "replace", - "source": "locked", - "target": "BlockEntityTag.locked" - }, - { - "op": "replace", - "source": "potionNames", - "target": "potionNames" - }, - { - "op": "replace", - "source": "currentFill", - "target": "fill" - } - ], - "source": "block_entity" - }, - { - "type": "ars_nouveau:potion_jar", - "entries": [ - { - "type": "minecraft:dynamic", - "name": "minecraft:contents" - } - ], - "function": "minecraft:set_contents" - } - ], - "name": "ars_nouveau:potion_jar" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/potion_jar" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potion_melder.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potion_melder.json deleted file mode 100644 index df301ed409..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potion_melder.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:potion_melder" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/potion_melder" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_blue_archwood_sapling.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_blue_archwood_sapling.json deleted file mode 100644 index 23c2c30bc6..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_blue_archwood_sapling.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:flower_pot" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:blue_archwood_sapling" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/potted_blue_archwood_sapling" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_green_archwood_sapling.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_green_archwood_sapling.json deleted file mode 100644 index eb98e64cb8..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_green_archwood_sapling.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:flower_pot" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:green_archwood_sapling" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/potted_green_archwood_sapling" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_magebloom_crop.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_magebloom_crop.json deleted file mode 100644 index 654f9d606f..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_magebloom_crop.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:flower_pot" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:magebloom_crop" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/potted_magebloom_crop" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_purple_archwood_sapling.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_purple_archwood_sapling.json deleted file mode 100644 index fbf8cbb84e..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_purple_archwood_sapling.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:flower_pot" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:purple_archwood_sapling" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/potted_purple_archwood_sapling" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_red_archwood_sapling.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_red_archwood_sapling.json deleted file mode 100644 index 43cb202433..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/potted_red_archwood_sapling.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:flower_pot" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:red_archwood_sapling" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/potted_red_archwood_sapling" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_archwood_leaves.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_archwood_leaves.json deleted file mode 100644 index d049af5f57..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_archwood_leaves.json +++ /dev/null @@ -1,136 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:alternatives", - "children": [ - { - "type": "minecraft:item", - "conditions": [ - { - "condition": "minecraft:any_of", - "terms": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "items": [ - "minecraft:shears" - ] - } - }, - { - "condition": "minecraft:match_tool", - "predicate": { - "enchantments": [ - { - "enchantment": "minecraft:silk_touch", - "levels": { - "min": 1 - } - } - ] - } - } - ] - } - ], - "name": "ars_nouveau:purple_archwood_leaves" - }, - { - "type": "minecraft:item", - "conditions": [ - { - "condition": "minecraft:survives_explosion" - }, - { - "chances": [ - 0.05, - 0.0625, - 0.083333336, - 0.1 - ], - "condition": "minecraft:table_bonus", - "enchantment": "minecraft:fortune" - } - ], - "name": "ars_nouveau:purple_archwood_sapling" - } - ] - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:inverted", - "term": { - "condition": "minecraft:any_of", - "terms": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "items": [ - "minecraft:shears" - ] - } - }, - { - "condition": "minecraft:match_tool", - "predicate": { - "enchantments": [ - { - "enchantment": "minecraft:silk_touch", - "levels": { - "min": 1 - } - } - ] - } - } - ] - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "conditions": [ - { - "chances": [ - 0.02, - 0.022222223, - 0.025, - 0.033333335, - 0.1 - ], - "condition": "minecraft:table_bonus", - "enchantment": "minecraft:fortune" - } - ], - "functions": [ - { - "add": false, - "count": { - "type": "minecraft:uniform", - "max": 2.0, - "min": 1.0 - }, - "function": "minecraft:set_count" - }, - { - "function": "minecraft:explosion_decay" - } - ], - "name": "minecraft:stick" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/purple_archwood_leaves" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_archwood_log.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_archwood_log.json deleted file mode 100644 index 1a110faec2..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_archwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:purple_archwood_log" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/purple_archwood_log" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_archwood_sapling.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_archwood_sapling.json deleted file mode 100644 index a04a509cd7..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_archwood_sapling.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:purple_archwood_sapling" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/purple_archwood_sapling" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_archwood_wood.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_archwood_wood.json deleted file mode 100644 index 41e54b3cb5..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_archwood_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:purple_archwood_wood" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/purple_archwood_wood" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_sbed.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_sbed.json deleted file mode 100644 index 19a8cf847c..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/purple_sbed.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:purple_sbed" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/purple_sbed" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_archwood_leaves.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_archwood_leaves.json deleted file mode 100644 index 2aa6bd40b1..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_archwood_leaves.json +++ /dev/null @@ -1,136 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:alternatives", - "children": [ - { - "type": "minecraft:item", - "conditions": [ - { - "condition": "minecraft:any_of", - "terms": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "items": [ - "minecraft:shears" - ] - } - }, - { - "condition": "minecraft:match_tool", - "predicate": { - "enchantments": [ - { - "enchantment": "minecraft:silk_touch", - "levels": { - "min": 1 - } - } - ] - } - } - ] - } - ], - "name": "ars_nouveau:red_archwood_leaves" - }, - { - "type": "minecraft:item", - "conditions": [ - { - "condition": "minecraft:survives_explosion" - }, - { - "chances": [ - 0.05, - 0.0625, - 0.083333336, - 0.1 - ], - "condition": "minecraft:table_bonus", - "enchantment": "minecraft:fortune" - } - ], - "name": "ars_nouveau:red_archwood_sapling" - } - ] - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:inverted", - "term": { - "condition": "minecraft:any_of", - "terms": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "items": [ - "minecraft:shears" - ] - } - }, - { - "condition": "minecraft:match_tool", - "predicate": { - "enchantments": [ - { - "enchantment": "minecraft:silk_touch", - "levels": { - "min": 1 - } - } - ] - } - } - ] - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "conditions": [ - { - "chances": [ - 0.02, - 0.022222223, - 0.025, - 0.033333335, - 0.1 - ], - "condition": "minecraft:table_bonus", - "enchantment": "minecraft:fortune" - } - ], - "functions": [ - { - "add": false, - "count": { - "type": "minecraft:uniform", - "max": 2.0, - "min": 1.0 - }, - "function": "minecraft:set_count" - }, - { - "function": "minecraft:explosion_decay" - } - ], - "name": "minecraft:stick" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/red_archwood_leaves" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_archwood_log.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_archwood_log.json deleted file mode 100644 index de6fa64ed1..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_archwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:red_archwood_log" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/red_archwood_log" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_archwood_sapling.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_archwood_sapling.json deleted file mode 100644 index 291a4acea2..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_archwood_sapling.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:red_archwood_sapling" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/red_archwood_sapling" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_archwood_wood.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_archwood_wood.json deleted file mode 100644 index d922b0c466..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_archwood_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:red_archwood_wood" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/red_archwood_wood" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_sbed.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_sbed.json deleted file mode 100644 index 7cc50e4998..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/red_sbed.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:red_sbed" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/red_sbed" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/redstone_relay.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/redstone_relay.json deleted file mode 100644 index af4b738890..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/redstone_relay.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:redstone_relay" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/redstone_relay" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay.json deleted file mode 100644 index fdeb4cace0..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:relay" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/relay" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay_collector.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay_collector.json deleted file mode 100644 index 8e6033eaa9..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay_collector.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:relay_collector" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/relay_collector" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay_deposit.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay_deposit.json deleted file mode 100644 index de241742a7..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay_deposit.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:relay_deposit" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/relay_deposit" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay_splitter.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay_splitter.json deleted file mode 100644 index 5b29cb1deb..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay_splitter.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:relay_splitter" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/relay_splitter" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay_warp.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay_warp.json deleted file mode 100644 index 492df76fd6..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/relay_warp.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:relay_warp" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/relay_warp" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/repository.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/repository.json deleted file mode 100644 index a4b1fd61dc..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/repository.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "function": "minecraft:copy_name", - "source": "block_entity" - } - ], - "name": "ars_nouveau:repository" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/repository" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/ritual_brazier.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/ritual_brazier.json deleted file mode 100644 index 62deb79813..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/ritual_brazier.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:ritual_brazier" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/ritual_brazier" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/rotating_spell_turret.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/rotating_spell_turret.json deleted file mode 100644 index cef109b7e7..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/rotating_spell_turret.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:rotating_spell_turret" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/rotating_spell_turret" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sconce.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sconce.json deleted file mode 100644 index c27f5f22e3..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sconce.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sconce" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sconce" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/scribes_table.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/scribes_table.json deleted file mode 100644 index cc27bb9c00..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/scribes_table.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "conditions": [ - { - "block": "ars_nouveau:scribes_table", - "condition": "minecraft:block_state_property", - "properties": { - "part": "head" - } - } - ], - "name": "ars_nouveau:scribes_table" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/scribes_table" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/scryers_crystal.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/scryers_crystal.json deleted file mode 100644 index b27e9bf688..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/scryers_crystal.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:scryers_crystal" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/scryers_crystal" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/scryers_oculus.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/scryers_oculus.json deleted file mode 100644 index ac49f4d9e9..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/scryers_oculus.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:scryers_oculus" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/scryers_oculus" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sky_block.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sky_block.json deleted file mode 100644 index 41f20e0e4e..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sky_block.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sky_block" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sky_block" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_alternating.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_alternating.json deleted file mode 100644 index cd58c262ed..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_alternating.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_gilded_sourcestone_alternating" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_alternating" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_alternating_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_alternating_slab.json deleted file mode 100644 index c390eb0b1e..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_alternating_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_gilded_sourcestone_alternating_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_alternating_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_alternating_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_alternating_stairs.json deleted file mode 100644 index ab840282e5..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_alternating_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_gilded_sourcestone_alternating_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_alternating_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_basketweave.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_basketweave.json deleted file mode 100644 index 91e0332113..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_basketweave.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_gilded_sourcestone_basketweave" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_basketweave" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_basketweave_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_basketweave_slab.json deleted file mode 100644 index 5dec419028..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_basketweave_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_gilded_sourcestone_basketweave_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_basketweave_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_basketweave_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_basketweave_stairs.json deleted file mode 100644 index 45a239ec1d..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_basketweave_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_gilded_sourcestone_basketweave_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_basketweave_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_large_bricks.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_large_bricks.json deleted file mode 100644 index 9e9a23f4b2..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_large_bricks.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_gilded_sourcestone_large_bricks" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_large_bricks" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_large_bricks_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_large_bricks_slab.json deleted file mode 100644 index ffef312ddd..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_large_bricks_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_gilded_sourcestone_large_bricks_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_large_bricks_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_large_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_large_bricks_stairs.json deleted file mode 100644 index 5a6506e50b..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_large_bricks_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_gilded_sourcestone_large_bricks_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_large_bricks_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_mosaic.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_mosaic.json deleted file mode 100644 index 99172fb5e7..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_mosaic.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_gilded_sourcestone_mosaic" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_mosaic" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_mosaic_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_mosaic_slab.json deleted file mode 100644 index 85796944d6..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_mosaic_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_gilded_sourcestone_mosaic_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_mosaic_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_mosaic_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_mosaic_stairs.json deleted file mode 100644 index 0c671dbba9..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_mosaic_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_gilded_sourcestone_mosaic_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_mosaic_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_small_bricks.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_small_bricks.json deleted file mode 100644 index a0e31cde8d..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_small_bricks.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_gilded_sourcestone_small_bricks" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_small_bricks" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_small_bricks_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_small_bricks_slab.json deleted file mode 100644 index 0a1c60b2ad..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_small_bricks_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_gilded_sourcestone_small_bricks_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_small_bricks_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_small_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_small_bricks_stairs.json deleted file mode 100644 index 1adb169902..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_gilded_sourcestone_small_bricks_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_gilded_sourcestone_small_bricks_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_small_bricks_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone.json deleted file mode 100644 index a9e4cc4222..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_alternating.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_alternating.json deleted file mode 100644 index a5fff31689..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_alternating.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_alternating" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_alternating" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_alternating_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_alternating_slab.json deleted file mode 100644 index 94500d8034..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_alternating_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_alternating_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_alternating_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_alternating_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_alternating_stairs.json deleted file mode 100644 index 6e558aac5d..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_alternating_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_alternating_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_alternating_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_basketweave.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_basketweave.json deleted file mode 100644 index aaf5ae1f26..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_basketweave.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_basketweave" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_basketweave" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_basketweave_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_basketweave_slab.json deleted file mode 100644 index 7d4681558f..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_basketweave_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_basketweave_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_basketweave_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_basketweave_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_basketweave_stairs.json deleted file mode 100644 index 20a74c1f50..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_basketweave_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_basketweave_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_basketweave_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_large_bricks.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_large_bricks.json deleted file mode 100644 index 04dbd0b50e..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_large_bricks.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_large_bricks" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_large_bricks" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_large_bricks_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_large_bricks_slab.json deleted file mode 100644 index 045a8e8461..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_large_bricks_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_large_bricks_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_large_bricks_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_large_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_large_bricks_stairs.json deleted file mode 100644 index b7b767c760..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_large_bricks_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_large_bricks_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_large_bricks_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_mosaic.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_mosaic.json deleted file mode 100644 index dc7d46e234..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_mosaic.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_mosaic" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_mosaic" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_mosaic_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_mosaic_slab.json deleted file mode 100644 index 5a08f4b876..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_mosaic_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_mosaic_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_mosaic_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_mosaic_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_mosaic_stairs.json deleted file mode 100644 index bc55e58a00..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_mosaic_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_mosaic_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_mosaic_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_slab.json deleted file mode 100644 index 9887f7fe71..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_small_bricks.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_small_bricks.json deleted file mode 100644 index 8a2d153524..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_small_bricks.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_small_bricks" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_small_bricks" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_small_bricks_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_small_bricks_slab.json deleted file mode 100644 index 02eb63ee73..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_small_bricks_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_small_bricks_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_small_bricks_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_small_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_small_bricks_stairs.json deleted file mode 100644 index 3807a2389c..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_small_bricks_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_small_bricks_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_small_bricks_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_stairs.json deleted file mode 100644 index 4486daa88f..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/smooth_sourcestone_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:smooth_sourcestone_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/source_gem_block.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/source_gem_block.json deleted file mode 100644 index 15f171428c..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/source_gem_block.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:source_gem_block" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/source_gem_block" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/source_jar.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/source_jar.json deleted file mode 100644 index 1c3c980830..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/source_jar.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "function": "minecraft:copy_name", - "source": "block_entity" - }, - { - "function": "minecraft:copy_nbt", - "ops": [ - { - "op": "replace", - "source": "source", - "target": "BlockEntityTag.source" - } - ], - "source": "block_entity" - }, - { - "type": "ars_nouveau:source_jar", - "entries": [ - { - "type": "minecraft:dynamic", - "name": "minecraft:contents" - } - ], - "function": "minecraft:set_contents" - } - ], - "name": "ars_nouveau:source_jar" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/source_jar" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourceberry_sack.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourceberry_sack.json deleted file mode 100644 index f1b697d569..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourceberry_sack.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourceberry_sack" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourceberry_sack" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone.json deleted file mode 100644 index b0e1bdb774..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_alternating.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_alternating.json deleted file mode 100644 index 1899e5b155..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_alternating.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_alternating" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_alternating" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_alternating_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_alternating_slab.json deleted file mode 100644 index 031b834197..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_alternating_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_alternating_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_alternating_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_alternating_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_alternating_stairs.json deleted file mode 100644 index 066a0712af..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_alternating_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_alternating_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_alternating_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_basketweave.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_basketweave.json deleted file mode 100644 index 64da270655..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_basketweave.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_basketweave" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_basketweave" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_basketweave_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_basketweave_slab.json deleted file mode 100644 index 6b9307bf10..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_basketweave_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_basketweave_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_basketweave_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_basketweave_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_basketweave_stairs.json deleted file mode 100644 index 7bacc5beb7..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_basketweave_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_basketweave_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_basketweave_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_large_bricks.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_large_bricks.json deleted file mode 100644 index 34dfc73dad..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_large_bricks.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_large_bricks" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_large_bricks" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_large_bricks_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_large_bricks_slab.json deleted file mode 100644 index 065ac54392..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_large_bricks_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_large_bricks_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_large_bricks_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_large_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_large_bricks_stairs.json deleted file mode 100644 index c9b6d032eb..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_large_bricks_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_large_bricks_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_large_bricks_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_mosaic.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_mosaic.json deleted file mode 100644 index 4e670b8fe6..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_mosaic.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_mosaic" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_mosaic" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_mosaic_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_mosaic_slab.json deleted file mode 100644 index 12d00f65ab..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_mosaic_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_mosaic_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_mosaic_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_mosaic_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_mosaic_stairs.json deleted file mode 100644 index c13ea1f393..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_mosaic_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_mosaic_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_mosaic_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_sconce.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_sconce.json deleted file mode 100644 index d6a4523709..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_sconce.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_sconce" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_sconce" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_slab.json deleted file mode 100644 index 2b049319da..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_small_bricks.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_small_bricks.json deleted file mode 100644 index b0ffae23e3..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_small_bricks.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_small_bricks" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_small_bricks" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_small_bricks_slab.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_small_bricks_slab.json deleted file mode 100644 index 89cf5a5b56..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_small_bricks_slab.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_small_bricks_slab" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_small_bricks_slab" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_small_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_small_bricks_stairs.json deleted file mode 100644 index 70f5299c4e..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_small_bricks_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_small_bricks_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_small_bricks_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_stairs.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_stairs.json deleted file mode 100644 index a12c995523..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/sourcestone_stairs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourcestone_stairs" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/sourcestone_stairs" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/spell_prism.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/spell_prism.json deleted file mode 100644 index ffe0bc359c..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/spell_prism.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:spell_prism" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/spell_prism" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/spell_sensor.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/spell_sensor.json deleted file mode 100644 index 722e413bff..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/spell_sensor.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:spell_sensor" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/spell_sensor" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/spell_turret.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/spell_turret.json deleted file mode 100644 index 3cf1ffff4a..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/spell_turret.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:spell_turret" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/spell_turret" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/storage_lectern.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/storage_lectern.json deleted file mode 100644 index 25e720fb47..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/storage_lectern.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:storage_lectern" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/storage_lectern" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_blue_archwood_log.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_blue_archwood_log.json deleted file mode 100644 index f823daa843..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_blue_archwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:stripped_blue_archwood_log" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/stripped_blue_archwood_log" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_blue_archwood_wood.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_blue_archwood_wood.json deleted file mode 100644 index b0706644ee..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_blue_archwood_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:stripped_blue_archwood_wood" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/stripped_blue_archwood_wood" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_green_archwood_log.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_green_archwood_log.json deleted file mode 100644 index c583f2caf4..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_green_archwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:stripped_green_archwood_log" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/stripped_green_archwood_log" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_green_archwood_wood.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_green_archwood_wood.json deleted file mode 100644 index 7d80281066..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_green_archwood_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:stripped_green_archwood_wood" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/stripped_green_archwood_wood" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_purple_archwood_log.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_purple_archwood_log.json deleted file mode 100644 index 4732b47297..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_purple_archwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:stripped_purple_archwood_log" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/stripped_purple_archwood_log" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_purple_archwood_wood.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_purple_archwood_wood.json deleted file mode 100644 index ea0c848da2..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_purple_archwood_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:stripped_purple_archwood_wood" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/stripped_purple_archwood_wood" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_red_archwood_log.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_red_archwood_log.json deleted file mode 100644 index dff2ba796c..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_red_archwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:stripped_red_archwood_log" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/stripped_red_archwood_log" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_red_archwood_wood.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_red_archwood_wood.json deleted file mode 100644 index d3a1aa10d8..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/stripped_red_archwood_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:stripped_red_archwood_wood" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/stripped_red_archwood_wood" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/timer_spell_turret.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/timer_spell_turret.json deleted file mode 100644 index cd161a66df..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/timer_spell_turret.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:timer_spell_turret" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/timer_spell_turret" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/vitalic_sourcelink.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/vitalic_sourcelink.json deleted file mode 100644 index ed2a0aa978..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/vitalic_sourcelink.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:vitalic_sourcelink" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/vitalic_sourcelink" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/void_prism.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/void_prism.json deleted file mode 100644 index 240e38a256..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/void_prism.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:void_prism" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/void_prism" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/volcanic_sourcelink.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/volcanic_sourcelink.json deleted file mode 100644 index 889d6d66c2..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/volcanic_sourcelink.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:volcanic_sourcelink" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/volcanic_sourcelink" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/wixie_cauldron.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/wixie_cauldron.json deleted file mode 100644 index 2d994baee4..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/wixie_cauldron.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:cauldron" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/wixie_cauldron" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/yellow_sbed.json b/src/generated/resources/data/ars_nouveau/loot_tables/blocks/yellow_sbed.json deleted file mode 100644 index 83a2a3672d..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/blocks/yellow_sbed.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:yellow_sbed" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:blocks/yellow_sbed" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/entities/wilden_guardian.json b/src/generated/resources/data/ars_nouveau/loot_tables/entities/wilden_guardian.json deleted file mode 100644 index 79000ad941..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/entities/wilden_guardian.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "type": "minecraft:entity", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "add": false, - "count": 1.0, - "function": "minecraft:set_count" - }, - { - "count": { - "type": "minecraft:uniform", - "max": 1.0, - "min": 0.0 - }, - "function": "minecraft:looting_enchant" - } - ], - "name": "ars_nouveau:wilden_spike" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:entities/wilden_guardian" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/entities/wilden_hunter.json b/src/generated/resources/data/ars_nouveau/loot_tables/entities/wilden_hunter.json deleted file mode 100644 index dbc129d14c..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/entities/wilden_hunter.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "type": "minecraft:entity", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "add": false, - "count": 1.0, - "function": "minecraft:set_count" - }, - { - "count": { - "type": "minecraft:uniform", - "max": 1.0, - "min": 0.0 - }, - "function": "minecraft:looting_enchant" - } - ], - "name": "ars_nouveau:wilden_horn" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:entities/wilden_hunter" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_tables/entities/wilden_stalker.json b/src/generated/resources/data/ars_nouveau/loot_tables/entities/wilden_stalker.json deleted file mode 100644 index 1471bf5703..0000000000 --- a/src/generated/resources/data/ars_nouveau/loot_tables/entities/wilden_stalker.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "type": "minecraft:entity", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "add": false, - "count": 1.0, - "function": "minecraft:set_count" - }, - { - "count": { - "type": "minecraft:uniform", - "max": 1.0, - "min": 0.0 - }, - "function": "minecraft:looting_enchant" - } - ], - "name": "ars_nouveau:wilden_wing" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ars_nouveau:entities/wilden_stalker" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/forge/biome_modifier/common_source_berry.json b/src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/common_source_berry.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/forge/biome_modifier/common_source_berry.json rename to src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/common_source_berry.json index 0fb1ae80da..fa1658d151 100644 --- a/src/generated/resources/data/ars_nouveau/forge/biome_modifier/common_source_berry.json +++ b/src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/common_source_berry.json @@ -1,5 +1,5 @@ { - "type": "forge:add_features", + "type": "neoforge:add_features", "biomes": "#ars_nouveau:berry_spawn", "features": "ars_nouveau:placed_berry_bush", "step": "vegetal_decoration" diff --git a/src/generated/resources/data/ars_nouveau/forge/biome_modifier/drygmy_spawn.json b/src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/drygmy_spawn.json similarity index 81% rename from src/generated/resources/data/ars_nouveau/forge/biome_modifier/drygmy_spawn.json rename to src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/drygmy_spawn.json index 0bfbac145a..e1029b0d83 100644 --- a/src/generated/resources/data/ars_nouveau/forge/biome_modifier/drygmy_spawn.json +++ b/src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/drygmy_spawn.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": "#minecraft:is_overworld", "spawners": { "type": "ars_nouveau:drygmy", diff --git a/src/generated/resources/data/ars_nouveau/forge/biome_modifier/gift_starbuncle_spawn.json b/src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/gift_starbuncle_spawn.json similarity index 82% rename from src/generated/resources/data/ars_nouveau/forge/biome_modifier/gift_starbuncle_spawn.json rename to src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/gift_starbuncle_spawn.json index cd3fe7a0c0..8dcf52731e 100644 --- a/src/generated/resources/data/ars_nouveau/forge/biome_modifier/gift_starbuncle_spawn.json +++ b/src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/gift_starbuncle_spawn.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": "#minecraft:is_overworld", "spawners": { "type": "ars_nouveau:gift_starby", diff --git a/src/generated/resources/data/ars_nouveau/forge/biome_modifier/rare_archwood_mix.json b/src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/rare_archwood_mix.json similarity index 78% rename from src/generated/resources/data/ars_nouveau/forge/biome_modifier/rare_archwood_mix.json rename to src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/rare_archwood_mix.json index 5eb2d03558..97a42e5ca7 100644 --- a/src/generated/resources/data/ars_nouveau/forge/biome_modifier/rare_archwood_mix.json +++ b/src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/rare_archwood_mix.json @@ -1,5 +1,5 @@ { - "type": "forge:add_features", + "type": "neoforge:add_features", "biomes": "#minecraft:is_overworld", "features": "ars_nouveau:placed_mixed_archwoods", "step": "vegetal_decoration" diff --git a/src/generated/resources/data/ars_nouveau/forge/biome_modifier/starbuncle_spawn.json b/src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/starbuncle_spawn.json similarity index 82% rename from src/generated/resources/data/ars_nouveau/forge/biome_modifier/starbuncle_spawn.json rename to src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/starbuncle_spawn.json index 919a15f7dd..8fa1cdb67b 100644 --- a/src/generated/resources/data/ars_nouveau/forge/biome_modifier/starbuncle_spawn.json +++ b/src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/starbuncle_spawn.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": "#minecraft:is_overworld", "spawners": { "type": "ars_nouveau:starbuncle", diff --git a/src/generated/resources/data/ars_nouveau/forge/biome_modifier/whirlisprig_spawn.json b/src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/whirlisprig_spawn.json similarity index 82% rename from src/generated/resources/data/ars_nouveau/forge/biome_modifier/whirlisprig_spawn.json rename to src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/whirlisprig_spawn.json index 4e704c8e3c..ea1f01f1fe 100644 --- a/src/generated/resources/data/ars_nouveau/forge/biome_modifier/whirlisprig_spawn.json +++ b/src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/whirlisprig_spawn.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": "#minecraft:is_overworld", "spawners": { "type": "ars_nouveau:whirlisprig", diff --git a/src/generated/resources/data/ars_nouveau/recipes/agronomic_sourcelink.json b/src/generated/resources/data/ars_nouveau/recipe/agronomic_sourcelink.json similarity index 61% rename from src/generated/resources/data/ars_nouveau/recipes/agronomic_sourcelink.json rename to src/generated/resources/data/ars_nouveau/recipe/agronomic_sourcelink.json index d969ce79f9..a1c2086ec4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/agronomic_sourcelink.json +++ b/src/generated/resources/data/ars_nouveau/recipe/agronomic_sourcelink.json @@ -3,13 +3,13 @@ "category": "misc", "key": { "g": { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, "i": { "item": "minecraft:wheat" }, "s": { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" } }, "pattern": [ @@ -18,7 +18,7 @@ " s " ], "result": { - "item": "ars_nouveau:agronomic_sourcelink" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:agronomic_sourcelink" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/air_essence_to_snow_bucket.json b/src/generated/resources/data/ars_nouveau/recipe/air_essence_to_snow_bucket.json similarity index 81% rename from src/generated/resources/data/ars_nouveau/recipes/air_essence_to_snow_bucket.json rename to src/generated/resources/data/ars_nouveau/recipe/air_essence_to_snow_bucket.json index 78c64a318f..61f186d661 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/air_essence_to_snow_bucket.json +++ b/src/generated/resources/data/ars_nouveau/recipe/air_essence_to_snow_bucket.json @@ -13,6 +13,7 @@ } ], "result": { - "item": "minecraft:powder_snow_bucket" + "count": 1, + "id": "minecraft:powder_snow_bucket" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/alchemical_sourcelink.json b/src/generated/resources/data/ars_nouveau/recipe/alchemical_sourcelink.json similarity index 61% rename from src/generated/resources/data/ars_nouveau/recipes/alchemical_sourcelink.json rename to src/generated/resources/data/ars_nouveau/recipe/alchemical_sourcelink.json index c6a24cd3bf..88002115a2 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/alchemical_sourcelink.json +++ b/src/generated/resources/data/ars_nouveau/recipe/alchemical_sourcelink.json @@ -3,13 +3,13 @@ "category": "misc", "key": { "g": { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, "i": { "item": "minecraft:brewing_stand" }, "s": { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" } }, "pattern": [ @@ -18,7 +18,7 @@ " s " ], "result": { - "item": "ars_nouveau:alchemical_sourcelink" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:alchemical_sourcelink" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/allow_scroll.json b/src/generated/resources/data/ars_nouveau/recipe/allow_scroll.json similarity index 69% rename from src/generated/resources/data/ars_nouveau/recipes/allow_scroll.json rename to src/generated/resources/data/ars_nouveau/recipe/allow_scroll.json index 2d79e78e83..f9c11cbd0c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/allow_scroll.json +++ b/src/generated/resources/data/ars_nouveau/recipe/allow_scroll.json @@ -6,10 +6,11 @@ "item": "ars_nouveau:blank_parchment" }, { - "tag": "forge:chests" + "tag": "c:chests" } ], "result": { - "item": "ars_nouveau:allow_scroll" + "count": 1, + "id": "ars_nouveau:allow_scroll" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/alteration_table.json b/src/generated/resources/data/ars_nouveau/recipe/alteration_table.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/recipes/alteration_table.json rename to src/generated/resources/data/ars_nouveau/recipe/alteration_table.json index 220b3f8f7b..efc0162253 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/alteration_table.json +++ b/src/generated/resources/data/ars_nouveau/recipe/alteration_table.json @@ -15,7 +15,7 @@ " x " ], "result": { - "item": "ars_nouveau:alteration_table" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:alteration_table" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/annotated_codex.json b/src/generated/resources/data/ars_nouveau/recipe/annotated_codex.json similarity index 79% rename from src/generated/resources/data/ars_nouveau/recipes/annotated_codex.json rename to src/generated/resources/data/ars_nouveau/recipe/annotated_codex.json index d6841eeea9..b2908c4eee 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/annotated_codex.json +++ b/src/generated/resources/data/ars_nouveau/recipe/annotated_codex.json @@ -10,6 +10,7 @@ } ], "result": { - "item": "ars_nouveau:annotated_codex" + "count": 1, + "id": "ars_nouveau:annotated_codex" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/arcane_core.json b/src/generated/resources/data/ars_nouveau/recipe/arcane_core.json similarity index 63% rename from src/generated/resources/data/ars_nouveau/recipes/arcane_core.json rename to src/generated/resources/data/ars_nouveau/recipe/arcane_core.json index 8eab0dfd70..9fc2091dbc 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/arcane_core.json +++ b/src/generated/resources/data/ars_nouveau/recipe/arcane_core.json @@ -6,10 +6,10 @@ "item": "ars_nouveau:sourcestone" }, "y": { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, "z": { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" } }, "pattern": [ @@ -18,7 +18,7 @@ "xxx" ], "result": { - "item": "ars_nouveau:arcane_core" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:arcane_core" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/arcane_pedestal.json b/src/generated/resources/data/ars_nouveau/recipe/arcane_pedestal.json similarity index 62% rename from src/generated/resources/data/ars_nouveau/recipes/arcane_pedestal.json rename to src/generated/resources/data/ars_nouveau/recipe/arcane_pedestal.json index 44a09a9057..a114e533b7 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/arcane_pedestal.json +++ b/src/generated/resources/data/ars_nouveau/recipe/arcane_pedestal.json @@ -6,10 +6,10 @@ "item": "ars_nouveau:sourcestone" }, "y": { - "tag": "forge:nuggets/gold" + "tag": "c:nuggets/gold" }, "z": { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" } }, "pattern": [ @@ -18,7 +18,7 @@ "yxy" ], "result": { - "item": "ars_nouveau:arcane_pedestal" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:arcane_pedestal" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/arcane_platform.json b/src/generated/resources/data/ars_nouveau/recipe/arcane_platform.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/recipes/arcane_platform.json rename to src/generated/resources/data/ars_nouveau/recipe/arcane_platform.json index 6ced99bac1..9402eff253 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/arcane_platform.json +++ b/src/generated/resources/data/ars_nouveau/recipe/arcane_platform.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:arcane_platform" + "count": 1, + "id": "ars_nouveau:arcane_platform" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/archwood_button.json b/src/generated/resources/data/ars_nouveau/recipe/archwood_button.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/recipes/archwood_button.json rename to src/generated/resources/data/ars_nouveau/recipe/archwood_button.json index 56766038b2..60f60d7ea8 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/archwood_button.json +++ b/src/generated/resources/data/ars_nouveau/recipe/archwood_button.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:archwood_button" + "count": 1, + "id": "ars_nouveau:archwood_button" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/archwood_chest.json b/src/generated/resources/data/ars_nouveau/recipe/archwood_chest.json similarity index 78% rename from src/generated/resources/data/ars_nouveau/recipes/archwood_chest.json rename to src/generated/resources/data/ars_nouveau/recipe/archwood_chest.json index c160b91599..43fdec4d18 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/archwood_chest.json +++ b/src/generated/resources/data/ars_nouveau/recipe/archwood_chest.json @@ -15,7 +15,7 @@ "xxx" ], "result": { - "item": "ars_nouveau:archwood_chest" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:archwood_chest" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/archwood_door.json b/src/generated/resources/data/ars_nouveau/recipe/archwood_door.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/recipes/archwood_door.json rename to src/generated/resources/data/ars_nouveau/recipe/archwood_door.json index 10042f267f..f325775324 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/archwood_door.json +++ b/src/generated/resources/data/ars_nouveau/recipe/archwood_door.json @@ -14,7 +14,6 @@ ], "result": { "count": 3, - "item": "ars_nouveau:archwood_door" - }, - "show_notification": true + "id": "ars_nouveau:archwood_door" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/archwood_fence.json b/src/generated/resources/data/ars_nouveau/recipe/archwood_fence.json similarity index 79% rename from src/generated/resources/data/ars_nouveau/recipes/archwood_fence.json rename to src/generated/resources/data/ars_nouveau/recipe/archwood_fence.json index 1951bb9027..8cbfad819b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/archwood_fence.json +++ b/src/generated/resources/data/ars_nouveau/recipe/archwood_fence.json @@ -16,7 +16,6 @@ ], "result": { "count": 3, - "item": "ars_nouveau:archwood_fence" - }, - "show_notification": true + "id": "ars_nouveau:archwood_fence" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/archwood_fence_gate.json b/src/generated/resources/data/ars_nouveau/recipe/archwood_fence_gate.json similarity index 78% rename from src/generated/resources/data/ars_nouveau/recipes/archwood_fence_gate.json rename to src/generated/resources/data/ars_nouveau/recipe/archwood_fence_gate.json index 07a4026235..84802b158c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/archwood_fence_gate.json +++ b/src/generated/resources/data/ars_nouveau/recipe/archwood_fence_gate.json @@ -15,7 +15,7 @@ "#W#" ], "result": { - "item": "ars_nouveau:archwood_fence_gate" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:archwood_fence_gate" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/archwood_planks.json b/src/generated/resources/data/ars_nouveau/recipe/archwood_planks.json similarity index 63% rename from src/generated/resources/data/ars_nouveau/recipes/archwood_planks.json rename to src/generated/resources/data/ars_nouveau/recipe/archwood_planks.json index aa16abb4e9..c98baf7857 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/archwood_planks.json +++ b/src/generated/resources/data/ars_nouveau/recipe/archwood_planks.json @@ -3,11 +3,11 @@ "category": "misc", "ingredients": [ { - "tag": "forge:logs/archwood" + "tag": "neoforge:logs/archwood" } ], "result": { "count": 4, - "item": "ars_nouveau:archwood_planks" + "id": "ars_nouveau:archwood_planks" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/archwood_pressure_plate.json b/src/generated/resources/data/ars_nouveau/recipe/archwood_pressure_plate.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/archwood_pressure_plate.json rename to src/generated/resources/data/ars_nouveau/recipe/archwood_pressure_plate.json index b58141a174..1e2748fabf 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/archwood_pressure_plate.json +++ b/src/generated/resources/data/ars_nouveau/recipe/archwood_pressure_plate.json @@ -11,7 +11,7 @@ "##" ], "result": { - "item": "ars_nouveau:archwood_pressure_plate" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:archwood_pressure_plate" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/archwood_sconce.json b/src/generated/resources/data/ars_nouveau/recipe/archwood_sconce.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/archwood_sconce.json rename to src/generated/resources/data/ars_nouveau/recipe/archwood_sconce.json index 6855e2af3e..1deb2ed751 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/archwood_sconce.json +++ b/src/generated/resources/data/ars_nouveau/recipe/archwood_sconce.json @@ -3,7 +3,7 @@ "category": "misc", "ingredients": [ { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { "item": "ars_nouveau:archwood_planks" @@ -13,6 +13,7 @@ } ], "result": { - "item": "ars_nouveau:archwood_sconce" + "count": 1, + "id": "ars_nouveau:archwood_sconce" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/archwood_slab.json b/src/generated/resources/data/ars_nouveau/recipe/archwood_slab.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/recipes/archwood_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/archwood_slab.json index 3f1aef04d3..3ed0ccb703 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/archwood_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/archwood_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:archwood_slab" - }, - "show_notification": true + "id": "ars_nouveau:archwood_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/archwood_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/archwood_stairs.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/recipes/archwood_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/archwood_stairs.json index 7c92720aa7..5cd2890fd6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/archwood_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/archwood_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:archwood_stairs" - }, - "show_notification": true + "id": "ars_nouveau:archwood_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/archwood_to_chest.json b/src/generated/resources/data/ars_nouveau/recipe/archwood_to_chest.json similarity index 78% rename from src/generated/resources/data/ars_nouveau/recipes/archwood_to_chest.json rename to src/generated/resources/data/ars_nouveau/recipe/archwood_to_chest.json index e1fa0b40ed..59b347351b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/archwood_to_chest.json +++ b/src/generated/resources/data/ars_nouveau/recipe/archwood_to_chest.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "minecraft:chest" + "count": 1, + "id": "minecraft:chest" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/archwood_trapdoor.json b/src/generated/resources/data/ars_nouveau/recipe/archwood_trapdoor.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/recipes/archwood_trapdoor.json rename to src/generated/resources/data/ars_nouveau/recipe/archwood_trapdoor.json index 862f22b930..0b193a0e76 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/archwood_trapdoor.json +++ b/src/generated/resources/data/ars_nouveau/recipe/archwood_trapdoor.json @@ -13,7 +13,6 @@ ], "result": { "count": 2, - "item": "ars_nouveau:archwood_trapdoor" - }, - "show_notification": true + "id": "ars_nouveau:archwood_trapdoor" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/basic_spell_turret.json b/src/generated/resources/data/ars_nouveau/recipe/basic_spell_turret.json similarity index 51% rename from src/generated/resources/data/ars_nouveau/recipes/basic_spell_turret.json rename to src/generated/resources/data/ars_nouveau/recipe/basic_spell_turret.json index e88ebc52ad..dcbd6355e0 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/basic_spell_turret.json +++ b/src/generated/resources/data/ars_nouveau/recipe/basic_spell_turret.json @@ -3,13 +3,13 @@ "category": "misc", "key": { "x": { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, "y": { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, "z": { - "tag": "forge:storage_blocks/redstone" + "tag": "c:storage_blocks/redstone" } }, "pattern": [ @@ -18,7 +18,7 @@ "yyy" ], "result": { - "item": "ars_nouveau:basic_spell_turret" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:basic_spell_turret" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/blank_parchment.json b/src/generated/resources/data/ars_nouveau/recipe/blank_parchment.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/recipes/blank_parchment.json rename to src/generated/resources/data/ars_nouveau/recipe/blank_parchment.json index 844e3535cf..e8a92addc3 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/blank_parchment.json +++ b/src/generated/resources/data/ars_nouveau/recipe/blank_parchment.json @@ -15,7 +15,7 @@ "yyy" ], "result": { - "item": "ars_nouveau:blank_parchment" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:blank_parchment" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/blank_thread.json b/src/generated/resources/data/ars_nouveau/recipe/blank_thread.json similarity index 67% rename from src/generated/resources/data/ars_nouveau/recipes/blank_thread.json rename to src/generated/resources/data/ars_nouveau/recipe/blank_thread.json index 3eb12caa12..339c265fa5 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/blank_thread.json +++ b/src/generated/resources/data/ars_nouveau/recipe/blank_thread.json @@ -6,7 +6,7 @@ "item": "ars_nouveau:magebloom_fiber" }, "y": { - "tag": "forge:nuggets/gold" + "tag": "c:nuggets/gold" } }, "pattern": [ @@ -15,7 +15,7 @@ "xxx" ], "result": { - "item": "ars_nouveau:blank_thread" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:blank_thread" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/blue_archwood_wood.json b/src/generated/resources/data/ars_nouveau/recipe/blue_archwood_wood.json similarity index 73% rename from src/generated/resources/data/ars_nouveau/recipes/blue_archwood_wood.json rename to src/generated/resources/data/ars_nouveau/recipe/blue_archwood_wood.json index e62770dce9..2c0aff8375 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/blue_archwood_wood.json +++ b/src/generated/resources/data/ars_nouveau/recipe/blue_archwood_wood.json @@ -12,7 +12,6 @@ ], "result": { "count": 3, - "item": "ars_nouveau:blue_archwood_wood" - }, - "show_notification": true + "id": "ars_nouveau:blue_archwood_wood" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/blue_sbed.json b/src/generated/resources/data/ars_nouveau/recipe/blue_sbed.json similarity index 69% rename from src/generated/resources/data/ars_nouveau/recipes/blue_sbed.json rename to src/generated/resources/data/ars_nouveau/recipe/blue_sbed.json index a80c2f240f..0f3651a951 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/blue_sbed.json +++ b/src/generated/resources/data/ars_nouveau/recipe/blue_sbed.json @@ -6,10 +6,11 @@ "tag": "ars_nouveau:summon_bed" }, { - "tag": "forge:dyes/blue" + "tag": "c:dyes/blue" } ], "result": { - "item": "ars_nouveau:blue_sbed" + "count": 1, + "id": "ars_nouveau:blue_sbed" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/challenge_2.json b/src/generated/resources/data/ars_nouveau/recipe/challenge_2.json similarity index 82% rename from src/generated/resources/data/ars_nouveau/recipes/challenge_2.json rename to src/generated/resources/data/ars_nouveau/recipe/challenge_2.json index 6dfd18aafa..ea5d297068 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/challenge_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/challenge_2.json @@ -13,6 +13,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_challenge" + "count": 1, + "id": "ars_nouveau:ritual_challenge" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/clear_allow.json b/src/generated/resources/data/ars_nouveau/recipe/clear_allow.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/recipes/clear_allow.json rename to src/generated/resources/data/ars_nouveau/recipe/clear_allow.json index d8293390ae..69eaeadcee 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/clear_allow.json +++ b/src/generated/resources/data/ars_nouveau/recipe/clear_allow.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:allow_scroll" + "count": 1, + "id": "ars_nouveau:allow_scroll" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/clear_deny.json b/src/generated/resources/data/ars_nouveau/recipe/clear_deny.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/recipes/clear_deny.json rename to src/generated/resources/data/ars_nouveau/recipe/clear_deny.json index 5e101e4116..83b925f198 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/clear_deny.json +++ b/src/generated/resources/data/ars_nouveau/recipe/clear_deny.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:deny_scroll" + "count": 1, + "id": "ars_nouveau:deny_scroll" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/conjuration_essence_to_end_stone.json b/src/generated/resources/data/ars_nouveau/recipe/conjuration_essence_to_end_stone.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/conjuration_essence_to_end_stone.json rename to src/generated/resources/data/ars_nouveau/recipe/conjuration_essence_to_end_stone.json index 014ad8a223..4d6656c779 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/conjuration_essence_to_end_stone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/conjuration_essence_to_end_stone.json @@ -3,7 +3,7 @@ "category": "misc", "key": { "x": { - "tag": "forge:stone" + "tag": "c:stones" }, "y": { "item": "ars_nouveau:conjuration_essence" @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "minecraft:end_stone" - }, - "show_notification": true + "id": "minecraft:end_stone" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/conjuration_essence_to_soul_sand.json b/src/generated/resources/data/ars_nouveau/recipe/conjuration_essence_to_soul_sand.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/conjuration_essence_to_soul_sand.json rename to src/generated/resources/data/ars_nouveau/recipe/conjuration_essence_to_soul_sand.json index c67115c1a0..e427029ba2 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/conjuration_essence_to_soul_sand.json +++ b/src/generated/resources/data/ars_nouveau/recipe/conjuration_essence_to_soul_sand.json @@ -3,7 +3,7 @@ "category": "misc", "key": { "x": { - "tag": "forge:sand" + "tag": "c:sands" }, "y": { "item": "ars_nouveau:conjuration_essence" @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "minecraft:soul_sand" - }, - "show_notification": true + "id": "minecraft:soul_sand" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/deny_scroll.json b/src/generated/resources/data/ars_nouveau/recipe/deny_scroll.json similarity index 68% rename from src/generated/resources/data/ars_nouveau/recipes/deny_scroll.json rename to src/generated/resources/data/ars_nouveau/recipe/deny_scroll.json index a7a552e9be..77a8088898 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/deny_scroll.json +++ b/src/generated/resources/data/ars_nouveau/recipe/deny_scroll.json @@ -6,10 +6,11 @@ "item": "ars_nouveau:blank_parchment" }, { - "tag": "forge:cobblestone" + "tag": "c:cobblestones" } ], "result": { - "item": "ars_nouveau:deny_scroll" + "count": 1, + "id": "ars_nouveau:deny_scroll" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dowsing_rod.json b/src/generated/resources/data/ars_nouveau/recipe/dowsing_rod.json similarity index 67% rename from src/generated/resources/data/ars_nouveau/recipes/dowsing_rod.json rename to src/generated/resources/data/ars_nouveau/recipe/dowsing_rod.json index 5eafd2162b..1ff05de20c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/dowsing_rod.json +++ b/src/generated/resources/data/ars_nouveau/recipe/dowsing_rod.json @@ -6,7 +6,7 @@ "item": "ars_nouveau:archwood_planks" }, "x": { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" } }, "pattern": [ @@ -14,7 +14,7 @@ "a a" ], "result": { - "item": "ars_nouveau:dowsing_rod" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:dowsing_rod" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dull_trinket.json b/src/generated/resources/data/ars_nouveau/recipe/dull_trinket.json similarity index 56% rename from src/generated/resources/data/ars_nouveau/recipes/dull_trinket.json rename to src/generated/resources/data/ars_nouveau/recipe/dull_trinket.json index b31ff7b349..539e622d2d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/dull_trinket.json +++ b/src/generated/resources/data/ars_nouveau/recipe/dull_trinket.json @@ -3,10 +3,10 @@ "category": "misc", "key": { "x": { - "tag": "forge:nuggets/iron" + "tag": "c:nuggets/iron" }, "y": { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" } }, "pattern": [ @@ -15,7 +15,7 @@ " x " ], "result": { - "item": "ars_nouveau:dull_trinket" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:dull_trinket" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/enchanting_apparatus.json b/src/generated/resources/data/ars_nouveau/recipe/enchanting_apparatus.json similarity index 58% rename from src/generated/resources/data/ars_nouveau/recipes/enchanting_apparatus.json rename to src/generated/resources/data/ars_nouveau/recipe/enchanting_apparatus.json index c2c70e62d8..960106d17d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/enchanting_apparatus.json +++ b/src/generated/resources/data/ars_nouveau/recipe/enchanting_apparatus.json @@ -3,13 +3,13 @@ "category": "misc", "key": { "d": { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, "g": { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, "n": { - "tag": "forge:nuggets/gold" + "tag": "c:nuggets/gold" }, "s": { "item": "ars_nouveau:sourcestone" @@ -21,7 +21,7 @@ "nsn" ], "result": { - "item": "ars_nouveau:enchanting_apparatus" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:enchanting_apparatus" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/experience_gem.json b/src/generated/resources/data/ars_nouveau/recipe/experience_gem.json similarity index 82% rename from src/generated/resources/data/ars_nouveau/recipes/experience_gem.json rename to src/generated/resources/data/ars_nouveau/recipe/experience_gem.json index 8ea3d502db..91bb8fdfdf 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/experience_gem.json +++ b/src/generated/resources/data/ars_nouveau/recipe/experience_gem.json @@ -8,6 +8,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:experience_gem" + "id": "ars_nouveau:experience_gem" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/falseweave.json b/src/generated/resources/data/ars_nouveau/recipe/falseweave.json similarity index 80% rename from src/generated/resources/data/ars_nouveau/recipes/falseweave.json rename to src/generated/resources/data/ars_nouveau/recipe/falseweave.json index cb6a4111e1..4fb6c923b9 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/falseweave.json +++ b/src/generated/resources/data/ars_nouveau/recipe/falseweave.json @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "ars_nouveau:falseweave" - }, - "show_notification": true + "id": "ars_nouveau:falseweave" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_essence_to_charge.json b/src/generated/resources/data/ars_nouveau/recipe/fire_essence_to_charge.json similarity index 88% rename from src/generated/resources/data/ars_nouveau/recipes/fire_essence_to_charge.json rename to src/generated/resources/data/ars_nouveau/recipe/fire_essence_to_charge.json index c6e66721fe..e4ae98e591 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/fire_essence_to_charge.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_essence_to_charge.json @@ -14,6 +14,6 @@ ], "result": { "count": 3, - "item": "minecraft:fire_charge" + "id": "minecraft:fire_charge" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_essence_to_magma_block.json b/src/generated/resources/data/ars_nouveau/recipe/fire_essence_to_magma_block.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/fire_essence_to_magma_block.json rename to src/generated/resources/data/ars_nouveau/recipe/fire_essence_to_magma_block.json index 8a1bd1e59b..07c871c3b5 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/fire_essence_to_magma_block.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_essence_to_magma_block.json @@ -3,7 +3,7 @@ "category": "misc", "key": { "x": { - "tag": "forge:stone" + "tag": "c:stones" }, "y": { "item": "ars_nouveau:fire_essence" @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "minecraft:magma_block" - }, - "show_notification": true + "id": "minecraft:magma_block" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ghostweave.json b/src/generated/resources/data/ars_nouveau/recipe/ghostweave.json similarity index 80% rename from src/generated/resources/data/ars_nouveau/recipes/ghostweave.json rename to src/generated/resources/data/ars_nouveau/recipe/ghostweave.json index 4ed0944403..dcfcd560e7 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ghostweave.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ghostweave.json @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "ars_nouveau:ghostweave" - }, - "show_notification": true + "id": "ars_nouveau:ghostweave" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_alternating_slab.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_alternating_slab.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_alternating_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_alternating_slab.json index 7f1600a02d..f5621e9f43 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_alternating_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_alternating_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:gilded_sourcestone_alternating_slab" - }, - "show_notification": true + "id": "ars_nouveau:gilded_sourcestone_alternating_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_alternating_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_alternating_stairs.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_alternating_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_alternating_stairs.json index 70cba5704a..126dc4f6d9 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_alternating_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_alternating_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:gilded_sourcestone_alternating_stairs" - }, - "show_notification": true + "id": "ars_nouveau:gilded_sourcestone_alternating_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_alternating_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_alternating_stone_cutterslab.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_alternating_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_alternating_stone_cutterslab.json index 509445d122..1356cc47e6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_alternating_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_alternating_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:gilded_sourcestone_alternating" }, - "result": "ars_nouveau:gilded_sourcestone_alternating_slab" + "result": { + "count": 2, + "id": "ars_nouveau:gilded_sourcestone_alternating_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_alternating_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_alternating_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_alternating_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_alternating_stonecutter_stair.json index 04ad357b15..591b73de5f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_alternating_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_alternating_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:gilded_sourcestone_alternating" }, - "result": "ars_nouveau:gilded_sourcestone_alternating_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:gilded_sourcestone_alternating_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_alternating_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_alternating_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_alternating_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_alternating_to_sourcestone.json index 9dd3832157..00c2d59de0 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_alternating_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_alternating_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_basketweave_slab.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_basketweave_slab.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_basketweave_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_basketweave_slab.json index 757a268a52..0b3eff4acf 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_basketweave_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_basketweave_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:gilded_sourcestone_basketweave_slab" - }, - "show_notification": true + "id": "ars_nouveau:gilded_sourcestone_basketweave_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_basketweave_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_basketweave_stairs.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_basketweave_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_basketweave_stairs.json index 96c52c71c4..a6b8a7d1b8 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_basketweave_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_basketweave_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:gilded_sourcestone_basketweave_stairs" - }, - "show_notification": true + "id": "ars_nouveau:gilded_sourcestone_basketweave_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_basketweave_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_basketweave_stone_cutterslab.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_basketweave_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_basketweave_stone_cutterslab.json index 1ca0690bc2..255dc210b7 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_basketweave_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_basketweave_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:gilded_sourcestone_basketweave" }, - "result": "ars_nouveau:gilded_sourcestone_basketweave_slab" + "result": { + "count": 2, + "id": "ars_nouveau:gilded_sourcestone_basketweave_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_basketweave_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_basketweave_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_basketweave_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_basketweave_stonecutter_stair.json index 8d53b89310..362479424b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_basketweave_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_basketweave_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:gilded_sourcestone_basketweave" }, - "result": "ars_nouveau:gilded_sourcestone_basketweave_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:gilded_sourcestone_basketweave_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_basketweave_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_basketweave_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_basketweave_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_basketweave_to_sourcestone.json index f184ab2d33..80a83ee6c3 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_basketweave_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_basketweave_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_slab.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_slab.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_slab.json index 1e8504b906..5e3f2838cc 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:gilded_sourcestone_large_bricks_slab" - }, - "show_notification": true + "id": "ars_nouveau:gilded_sourcestone_large_bricks_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_stairs.json similarity index 70% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_stairs.json index d4e6b9b8c6..25425b6c95 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:gilded_sourcestone_large_bricks_stairs" - }, - "show_notification": true + "id": "ars_nouveau:gilded_sourcestone_large_bricks_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_stone_cutterslab.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_stone_cutterslab.json index a500f8cd44..8e807f67f9 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:gilded_sourcestone_large_bricks" }, - "result": "ars_nouveau:gilded_sourcestone_large_bricks_slab" + "result": { + "count": 2, + "id": "ars_nouveau:gilded_sourcestone_large_bricks_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_stonecutter_stair.json index 61df90b493..e870d1f7f9 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:gilded_sourcestone_large_bricks" }, - "result": "ars_nouveau:gilded_sourcestone_large_bricks_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:gilded_sourcestone_large_bricks_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_to_sourcestone.json index 59713b57ab..73303f761e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_large_bricks_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_mosaic_slab.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_mosaic_slab.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_mosaic_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_mosaic_slab.json index 0e8e18e732..d1751241e1 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_mosaic_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_mosaic_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:gilded_sourcestone_mosaic_slab" - }, - "show_notification": true + "id": "ars_nouveau:gilded_sourcestone_mosaic_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_mosaic_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_mosaic_stairs.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_mosaic_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_mosaic_stairs.json index 6de3b0e7a5..2b29731b1b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_mosaic_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_mosaic_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:gilded_sourcestone_mosaic_stairs" - }, - "show_notification": true + "id": "ars_nouveau:gilded_sourcestone_mosaic_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_mosaic_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_mosaic_stone_cutterslab.json similarity index 56% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_mosaic_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_mosaic_stone_cutterslab.json index 316556ed4c..03e0cddb7d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_mosaic_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_mosaic_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:gilded_sourcestone_mosaic" }, - "result": "ars_nouveau:gilded_sourcestone_mosaic_slab" + "result": { + "count": 2, + "id": "ars_nouveau:gilded_sourcestone_mosaic_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_mosaic_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_mosaic_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_mosaic_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_mosaic_stonecutter_stair.json index 0f08e4930b..c599cbe1d1 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_mosaic_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_mosaic_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:gilded_sourcestone_mosaic" }, - "result": "ars_nouveau:gilded_sourcestone_mosaic_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:gilded_sourcestone_mosaic_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_mosaic_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_mosaic_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_mosaic_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_mosaic_to_sourcestone.json index 00c4765b10..408cdfdbd1 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_mosaic_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_mosaic_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_slab.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_slab.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_slab.json index b27d7912d3..6227ebbaac 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:gilded_sourcestone_small_bricks_slab" - }, - "show_notification": true + "id": "ars_nouveau:gilded_sourcestone_small_bricks_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stairs.json similarity index 70% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stairs.json index 869b1d402b..2aca19b65d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:gilded_sourcestone_small_bricks_stairs" - }, - "show_notification": true + "id": "ars_nouveau:gilded_sourcestone_small_bricks_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stone_cutterslab.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stone_cutterslab.json index 36881cd08e..1cd488590f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:gilded_sourcestone_small_bricks" }, - "result": "ars_nouveau:gilded_sourcestone_small_bricks_slab" + "result": { + "count": 2, + "id": "ars_nouveau:gilded_sourcestone_small_bricks_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stonecutter_stair.json index 7990dde508..0cfe618df7 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:gilded_sourcestone_small_bricks" }, - "result": "ars_nouveau:gilded_sourcestone_small_bricks_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:gilded_sourcestone_small_bricks_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_to_sourcestone.json index f7c2bd4b0d..321a57695d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/gilded_sourcestone_small_bricks_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/greater_experience_gem.json b/src/generated/resources/data/ars_nouveau/recipe/greater_experience_gem.json similarity index 84% rename from src/generated/resources/data/ars_nouveau/recipes/greater_experience_gem.json rename to src/generated/resources/data/ars_nouveau/recipe/greater_experience_gem.json index 1876904c7f..ed3d1e5bfb 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/greater_experience_gem.json +++ b/src/generated/resources/data/ars_nouveau/recipe/greater_experience_gem.json @@ -16,6 +16,7 @@ } ], "result": { - "item": "ars_nouveau:greater_experience_gem" + "count": 1, + "id": "ars_nouveau:greater_experience_gem" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/green_archwood_wood.json b/src/generated/resources/data/ars_nouveau/recipe/green_archwood_wood.json similarity index 73% rename from src/generated/resources/data/ars_nouveau/recipes/green_archwood_wood.json rename to src/generated/resources/data/ars_nouveau/recipe/green_archwood_wood.json index 414ff6f2c0..d479fa6cd8 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/green_archwood_wood.json +++ b/src/generated/resources/data/ars_nouveau/recipe/green_archwood_wood.json @@ -12,7 +12,6 @@ ], "result": { "count": 3, - "item": "ars_nouveau:green_archwood_wood" - }, - "show_notification": true + "id": "ars_nouveau:green_archwood_wood" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/green_sbed.json b/src/generated/resources/data/ars_nouveau/recipe/green_sbed.json similarity index 68% rename from src/generated/resources/data/ars_nouveau/recipes/green_sbed.json rename to src/generated/resources/data/ars_nouveau/recipe/green_sbed.json index c9bc9707da..b89f123002 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/green_sbed.json +++ b/src/generated/resources/data/ars_nouveau/recipe/green_sbed.json @@ -6,10 +6,11 @@ "tag": "ars_nouveau:summon_bed" }, { - "tag": "forge:dyes/green" + "tag": "c:dyes/green" } ], "result": { - "item": "ars_nouveau:green_sbed" + "count": 1, + "id": "ars_nouveau:green_sbed" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/horn_to_bonemeal.json b/src/generated/resources/data/ars_nouveau/recipe/horn_to_bonemeal.json similarity index 83% rename from src/generated/resources/data/ars_nouveau/recipes/horn_to_bonemeal.json rename to src/generated/resources/data/ars_nouveau/recipe/horn_to_bonemeal.json index 23ad71e848..8ba5cfd7d2 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/horn_to_bonemeal.json +++ b/src/generated/resources/data/ars_nouveau/recipe/horn_to_bonemeal.json @@ -8,6 +8,6 @@ ], "result": { "count": 3, - "item": "minecraft:bone_meal" + "id": "minecraft:bone_meal" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/imbuement_chamber.json b/src/generated/resources/data/ars_nouveau/recipe/imbuement_chamber.json similarity index 67% rename from src/generated/resources/data/ars_nouveau/recipes/imbuement_chamber.json rename to src/generated/resources/data/ars_nouveau/recipe/imbuement_chamber.json index da922b3c62..c769e297bd 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/imbuement_chamber.json +++ b/src/generated/resources/data/ars_nouveau/recipe/imbuement_chamber.json @@ -6,7 +6,7 @@ "item": "ars_nouveau:archwood_planks" }, "y": { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" } }, "pattern": [ @@ -15,7 +15,7 @@ "xyx" ], "result": { - "item": "ars_nouveau:imbuement_chamber" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:imbuement_chamber" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/item_detector.json b/src/generated/resources/data/ars_nouveau/recipe/item_detector.json similarity index 73% rename from src/generated/resources/data/ars_nouveau/recipes/item_detector.json rename to src/generated/resources/data/ars_nouveau/recipe/item_detector.json index 5292880e3b..a2ea42580f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/item_detector.json +++ b/src/generated/resources/data/ars_nouveau/recipe/item_detector.json @@ -3,7 +3,7 @@ "category": "misc", "key": { "x": { - "tag": "forge:glass" + "tag": "c:glass_blocks" }, "y": { "item": "minecraft:observer" @@ -18,7 +18,7 @@ "zzz" ], "result": { - "item": "ars_nouveau:item_detector" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:item_detector" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/magebloom_block.json b/src/generated/resources/data/ars_nouveau/recipe/magebloom_block.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/magebloom_block.json rename to src/generated/resources/data/ars_nouveau/recipe/magebloom_block.json index 12872f1c77..a49816ff80 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/magebloom_block.json +++ b/src/generated/resources/data/ars_nouveau/recipe/magebloom_block.json @@ -11,7 +11,7 @@ "xx " ], "result": { - "item": "ars_nouveau:magebloom_block" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:magebloom_block" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/magebloom_block_to_magebloom.json b/src/generated/resources/data/ars_nouveau/recipe/magebloom_block_to_magebloom.json similarity index 81% rename from src/generated/resources/data/ars_nouveau/recipes/magebloom_block_to_magebloom.json rename to src/generated/resources/data/ars_nouveau/recipe/magebloom_block_to_magebloom.json index dbb51b54de..5b0126bece 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/magebloom_block_to_magebloom.json +++ b/src/generated/resources/data/ars_nouveau/recipe/magebloom_block_to_magebloom.json @@ -8,6 +8,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:magebloom_fiber" + "id": "ars_nouveau:magebloom_fiber" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/magebloom_fiber.json b/src/generated/resources/data/ars_nouveau/recipe/magebloom_fiber.json similarity index 80% rename from src/generated/resources/data/ars_nouveau/recipes/magebloom_fiber.json rename to src/generated/resources/data/ars_nouveau/recipe/magebloom_fiber.json index 4033c76411..293adb5ed6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/magebloom_fiber.json +++ b/src/generated/resources/data/ars_nouveau/recipe/magebloom_fiber.json @@ -8,6 +8,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:magebloom_fiber" + "id": "ars_nouveau:magebloom_fiber" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/magebloom_to_pink.json b/src/generated/resources/data/ars_nouveau/recipe/magebloom_to_pink.json similarity index 87% rename from src/generated/resources/data/ars_nouveau/recipes/magebloom_to_pink.json rename to src/generated/resources/data/ars_nouveau/recipe/magebloom_to_pink.json index b3c881ae14..6fd2fb761a 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/magebloom_to_pink.json +++ b/src/generated/resources/data/ars_nouveau/recipe/magebloom_to_pink.json @@ -11,6 +11,6 @@ ], "result": { "count": 2, - "item": "minecraft:pink_dye" + "id": "minecraft:pink_dye" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/magelight_torch.json b/src/generated/resources/data/ars_nouveau/recipe/magelight_torch.json similarity index 56% rename from src/generated/resources/data/ars_nouveau/recipes/magelight_torch.json rename to src/generated/resources/data/ars_nouveau/recipe/magelight_torch.json index ff5a8b891a..7a4979b7fb 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/magelight_torch.json +++ b/src/generated/resources/data/ars_nouveau/recipe/magelight_torch.json @@ -3,10 +3,10 @@ "category": "misc", "key": { "x": { - "tag": "forge:nuggets/gold" + "tag": "c:nuggets/gold" }, "y": { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" } }, "pattern": [ @@ -15,7 +15,7 @@ " x " ], "result": { - "item": "ars_nouveau:magelight_torch" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:magelight_torch" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_andesite.json b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_andesite.json similarity index 80% rename from src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_andesite.json rename to src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_andesite.json index a8577b2035..34fa242ab6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_andesite.json +++ b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_andesite.json @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "minecraft:andesite" - }, - "show_notification": true + "id": "minecraft:andesite" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_blazin_sapling.json b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_blazin_sapling.json similarity index 79% rename from src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_blazin_sapling.json rename to src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_blazin_sapling.json index 6cd9eb7470..a69bda8686 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_blazin_sapling.json +++ b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_blazin_sapling.json @@ -10,6 +10,7 @@ } ], "result": { - "item": "ars_nouveau:red_archwood_sapling" + "count": 1, + "id": "ars_nouveau:red_archwood_sapling" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_calcite.json b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_calcite.json similarity index 80% rename from src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_calcite.json rename to src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_calcite.json index 2a93912ee2..3e63f153ac 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_calcite.json +++ b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_calcite.json @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "minecraft:calcite" - }, - "show_notification": true + "id": "minecraft:calcite" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_cascading_sapling.json b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_cascading_sapling.json similarity index 78% rename from src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_cascading_sapling.json rename to src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_cascading_sapling.json index 4976c46369..81d81ee558 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_cascading_sapling.json +++ b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_cascading_sapling.json @@ -10,6 +10,7 @@ } ], "result": { - "item": "ars_nouveau:blue_archwood_sapling" + "count": 1, + "id": "ars_nouveau:blue_archwood_sapling" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_deepslate.json b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_deepslate.json similarity index 80% rename from src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_deepslate.json rename to src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_deepslate.json index e19554442e..465aa14c0f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_deepslate.json +++ b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_deepslate.json @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "minecraft:deepslate" - }, - "show_notification": true + "id": "minecraft:deepslate" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_diorite.json b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_diorite.json similarity index 81% rename from src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_diorite.json rename to src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_diorite.json index bc6392d366..7435831d64 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_diorite.json +++ b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_diorite.json @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "minecraft:diorite" - }, - "show_notification": true + "id": "minecraft:diorite" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_flourishing_sapling.json b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_flourishing_sapling.json similarity index 78% rename from src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_flourishing_sapling.json rename to src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_flourishing_sapling.json index 8a6f8fda31..1e394d27c8 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_flourishing_sapling.json +++ b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_flourishing_sapling.json @@ -10,6 +10,7 @@ } ], "result": { - "item": "ars_nouveau:green_archwood_sapling" + "count": 1, + "id": "ars_nouveau:green_archwood_sapling" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_granite.json b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_granite.json similarity index 81% rename from src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_granite.json rename to src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_granite.json index e32f8f39e9..42e5659715 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_granite.json +++ b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_granite.json @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "minecraft:granite" - }, - "show_notification": true + "id": "minecraft:granite" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_grass_block.json b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_grass_block.json similarity index 80% rename from src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_grass_block.json rename to src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_grass_block.json index 7d0be9e7d0..98ac49d2b1 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_grass_block.json +++ b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_grass_block.json @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "minecraft:grass_block" - }, - "show_notification": true + "id": "minecraft:grass_block" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_moss_block.json b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_moss_block.json similarity index 80% rename from src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_moss_block.json rename to src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_moss_block.json index 8a931168b5..7783045090 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_moss_block.json +++ b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_moss_block.json @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "minecraft:moss_block" - }, - "show_notification": true + "id": "minecraft:moss_block" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_mycelium.json b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_mycelium.json similarity index 81% rename from src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_mycelium.json rename to src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_mycelium.json index 3c4dac1b01..74163c97fb 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_mycelium.json +++ b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_mycelium.json @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "minecraft:mycelium" - }, - "show_notification": true + "id": "minecraft:mycelium" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_tuff.json b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_tuff.json similarity index 81% rename from src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_tuff.json rename to src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_tuff.json index 36369e8dda..fc3657cb2a 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_tuff.json +++ b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_tuff.json @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "minecraft:tuff" - }, - "show_notification": true + "id": "minecraft:tuff" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_vexing_sapling.json b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_vexing_sapling.json similarity index 78% rename from src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_vexing_sapling.json rename to src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_vexing_sapling.json index 71bf5e6022..cb6f36cfe8 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence_to_vexing_sapling.json +++ b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence_to_vexing_sapling.json @@ -10,6 +10,7 @@ } ], "result": { - "item": "ars_nouveau:purple_archwood_sapling" + "count": 1, + "id": "ars_nouveau:purple_archwood_sapling" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/mimic_scroll.json b/src/generated/resources/data/ars_nouveau/recipe/mimic_scroll.json similarity index 79% rename from src/generated/resources/data/ars_nouveau/recipes/mimic_scroll.json rename to src/generated/resources/data/ars_nouveau/recipe/mimic_scroll.json index 251a981500..33724d7c27 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/mimic_scroll.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mimic_scroll.json @@ -10,6 +10,7 @@ } ], "result": { - "item": "ars_nouveau:mimic_scroll" + "count": 1, + "id": "ars_nouveau:mimic_scroll" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/mirrorweave.json b/src/generated/resources/data/ars_nouveau/recipe/mirrorweave.json similarity index 80% rename from src/generated/resources/data/ars_nouveau/recipes/mirrorweave.json rename to src/generated/resources/data/ars_nouveau/recipe/mirrorweave.json index 224568a27c..3d5a9597c7 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/mirrorweave.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mirrorweave.json @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "ars_nouveau:mirrorweave" - }, - "show_notification": true + "id": "ars_nouveau:mirrorweave" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/mob_jar.json b/src/generated/resources/data/ars_nouveau/recipe/mob_jar.json similarity index 70% rename from src/generated/resources/data/ars_nouveau/recipes/mob_jar.json rename to src/generated/resources/data/ars_nouveau/recipe/mob_jar.json index b3075b3982..13cfc59194 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/mob_jar.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mob_jar.json @@ -3,7 +3,7 @@ "category": "misc", "key": { "x": { - "tag": "forge:glass" + "tag": "c:glass_blocks" }, "y": { "item": "ars_nouveau:archwood_slab" @@ -15,7 +15,7 @@ "xxx" ], "result": { - "item": "ars_nouveau:mob_jar" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:mob_jar" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/moonfall_2.json b/src/generated/resources/data/ars_nouveau/recipe/moonfall_2.json similarity index 79% rename from src/generated/resources/data/ars_nouveau/recipes/moonfall_2.json rename to src/generated/resources/data/ars_nouveau/recipe/moonfall_2.json index a8a0d81d02..f409f45fe4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/moonfall_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/moonfall_2.json @@ -10,6 +10,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_moonfall" + "count": 1, + "id": "ars_nouveau:ritual_moonfall" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/mundane_belt.json b/src/generated/resources/data/ars_nouveau/recipe/mundane_belt.json similarity index 57% rename from src/generated/resources/data/ars_nouveau/recipes/mundane_belt.json rename to src/generated/resources/data/ars_nouveau/recipe/mundane_belt.json index 5fea9b7b9d..6f45b181cd 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/mundane_belt.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mundane_belt.json @@ -3,10 +3,10 @@ "category": "misc", "key": { "x": { - "tag": "forge:leather" + "tag": "c:leathers" }, "y": { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" } }, "pattern": [ @@ -15,7 +15,7 @@ " x " ], "result": { - "item": "ars_nouveau:mundane_belt" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:mundane_belt" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/mycelial_sourcelink.json b/src/generated/resources/data/ars_nouveau/recipe/mycelial_sourcelink.json similarity index 62% rename from src/generated/resources/data/ars_nouveau/recipes/mycelial_sourcelink.json rename to src/generated/resources/data/ars_nouveau/recipe/mycelial_sourcelink.json index bb3ca8a922..7edf8278c8 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/mycelial_sourcelink.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mycelial_sourcelink.json @@ -3,13 +3,13 @@ "category": "misc", "key": { "g": { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, "i": { "item": "minecraft:mushroom_stew" }, "s": { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" } }, "pattern": [ @@ -18,7 +18,7 @@ " s " ], "result": { - "item": "ars_nouveau:mycelial_sourcelink" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:mycelial_sourcelink" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/orange_sbed.json b/src/generated/resources/data/ars_nouveau/recipe/orange_sbed.json similarity index 78% rename from src/generated/resources/data/ars_nouveau/recipes/orange_sbed.json rename to src/generated/resources/data/ars_nouveau/recipe/orange_sbed.json index 3837092082..74e4abff6c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/orange_sbed.json +++ b/src/generated/resources/data/ars_nouveau/recipe/orange_sbed.json @@ -15,7 +15,7 @@ "xxx" ], "result": { - "item": "ars_nouveau:orange_sbed" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:orange_sbed" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/platform_to_pedestal.json b/src/generated/resources/data/ars_nouveau/recipe/platform_to_pedestal.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/recipes/platform_to_pedestal.json rename to src/generated/resources/data/ars_nouveau/recipe/platform_to_pedestal.json index f6819f9d6a..74ecee62df 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/platform_to_pedestal.json +++ b/src/generated/resources/data/ars_nouveau/recipe/platform_to_pedestal.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:arcane_pedestal" + "count": 1, + "id": "ars_nouveau:arcane_pedestal" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/polished_sconce.json b/src/generated/resources/data/ars_nouveau/recipe/polished_sconce.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/recipes/polished_sconce.json rename to src/generated/resources/data/ars_nouveau/recipe/polished_sconce.json index 8d08ce18e7..c4098e2c0b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/polished_sconce.json +++ b/src/generated/resources/data/ars_nouveau/recipe/polished_sconce.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:polished_sconce" + "count": 1, + "id": "ars_nouveau:polished_sconce" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/polished_source_sconce.json b/src/generated/resources/data/ars_nouveau/recipe/polished_source_sconce.json similarity index 73% rename from src/generated/resources/data/ars_nouveau/recipes/polished_source_sconce.json rename to src/generated/resources/data/ars_nouveau/recipe/polished_source_sconce.json index 7afab05519..e31122b83a 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/polished_source_sconce.json +++ b/src/generated/resources/data/ars_nouveau/recipe/polished_source_sconce.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone_sconce" + "count": 1, + "id": "ars_nouveau:sourcestone_sconce" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/potion_jar.json b/src/generated/resources/data/ars_nouveau/recipe/potion_jar.json similarity index 81% rename from src/generated/resources/data/ars_nouveau/recipes/potion_jar.json rename to src/generated/resources/data/ars_nouveau/recipe/potion_jar.json index 55cb4d0d7b..5a9f22bb28 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/potion_jar.json +++ b/src/generated/resources/data/ars_nouveau/recipe/potion_jar.json @@ -10,6 +10,7 @@ } ], "result": { - "item": "ars_nouveau:potion_jar" + "count": 1, + "id": "ars_nouveau:potion_jar" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/potion_jar_empty.json b/src/generated/resources/data/ars_nouveau/recipe/potion_jar_empty.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/recipes/potion_jar_empty.json rename to src/generated/resources/data/ars_nouveau/recipe/potion_jar_empty.json index b0c8e764ab..6efe2ed886 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/potion_jar_empty.json +++ b/src/generated/resources/data/ars_nouveau/recipe/potion_jar_empty.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:potion_jar" + "count": 1, + "id": "ars_nouveau:potion_jar" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/purple_archwood_wood.json b/src/generated/resources/data/ars_nouveau/recipe/purple_archwood_wood.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/purple_archwood_wood.json rename to src/generated/resources/data/ars_nouveau/recipe/purple_archwood_wood.json index 94cdfdb145..dfe66fcdd1 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/purple_archwood_wood.json +++ b/src/generated/resources/data/ars_nouveau/recipe/purple_archwood_wood.json @@ -12,7 +12,6 @@ ], "result": { "count": 3, - "item": "ars_nouveau:purple_archwood_wood" - }, - "show_notification": true + "id": "ars_nouveau:purple_archwood_wood" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/purple_sbed.json b/src/generated/resources/data/ars_nouveau/recipe/purple_sbed.json similarity index 67% rename from src/generated/resources/data/ars_nouveau/recipes/purple_sbed.json rename to src/generated/resources/data/ars_nouveau/recipe/purple_sbed.json index d1d5fce310..7b15fda86e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/purple_sbed.json +++ b/src/generated/resources/data/ars_nouveau/recipe/purple_sbed.json @@ -6,10 +6,11 @@ "tag": "ars_nouveau:summon_bed" }, { - "tag": "forge:dyes/purple" + "tag": "c:dyes/purple" } ], "result": { - "item": "ars_nouveau:purple_sbed" + "count": 1, + "id": "ars_nouveau:purple_sbed" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/red_archwood_wood.json b/src/generated/resources/data/ars_nouveau/recipe/red_archwood_wood.json similarity index 73% rename from src/generated/resources/data/ars_nouveau/recipes/red_archwood_wood.json rename to src/generated/resources/data/ars_nouveau/recipe/red_archwood_wood.json index f5e0adec0c..2a9c322f8f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/red_archwood_wood.json +++ b/src/generated/resources/data/ars_nouveau/recipe/red_archwood_wood.json @@ -12,7 +12,6 @@ ], "result": { "count": 3, - "item": "ars_nouveau:red_archwood_wood" - }, - "show_notification": true + "id": "ars_nouveau:red_archwood_wood" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/red_sbed.json b/src/generated/resources/data/ars_nouveau/recipe/red_sbed.json similarity index 69% rename from src/generated/resources/data/ars_nouveau/recipes/red_sbed.json rename to src/generated/resources/data/ars_nouveau/recipe/red_sbed.json index 0d20a47e25..6a470378c5 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/red_sbed.json +++ b/src/generated/resources/data/ars_nouveau/recipe/red_sbed.json @@ -6,10 +6,11 @@ "tag": "ars_nouveau:summon_bed" }, { - "tag": "forge:dyes/red" + "tag": "c:dyes/red" } ], "result": { - "item": "ars_nouveau:red_sbed" + "count": 1, + "id": "ars_nouveau:red_sbed" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/redstone_relay.json b/src/generated/resources/data/ars_nouveau/recipe/redstone_relay.json similarity index 51% rename from src/generated/resources/data/ars_nouveau/recipes/redstone_relay.json rename to src/generated/resources/data/ars_nouveau/recipe/redstone_relay.json index 121341fe9e..57095c53e8 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/redstone_relay.json +++ b/src/generated/resources/data/ars_nouveau/recipe/redstone_relay.json @@ -3,13 +3,13 @@ "category": "misc", "key": { "M": { - "tag": "forge:storage_blocks/source" + "tag": "neoforge:storage_blocks/source" }, "g": { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, "x": { - "tag": "forge:dusts/redstone" + "tag": "c:dusts/redstone" } }, "pattern": [ @@ -18,7 +18,7 @@ "gxg" ], "result": { - "item": "ars_nouveau:redstone_relay" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:redstone_relay" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/relay.json b/src/generated/resources/data/ars_nouveau/recipe/relay.json similarity index 56% rename from src/generated/resources/data/ars_nouveau/recipes/relay.json rename to src/generated/resources/data/ars_nouveau/recipe/relay.json index dc4df1cd4e..360e13bad1 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/relay.json +++ b/src/generated/resources/data/ars_nouveau/recipe/relay.json @@ -3,10 +3,10 @@ "category": "misc", "key": { "M": { - "tag": "forge:storage_blocks/source" + "tag": "neoforge:storage_blocks/source" }, "g": { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" } }, "pattern": [ @@ -15,7 +15,7 @@ "g g" ], "result": { - "item": "ars_nouveau:relay" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:relay" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/repository.json b/src/generated/resources/data/ars_nouveau/recipe/repository.json similarity index 56% rename from src/generated/resources/data/ars_nouveau/recipes/repository.json rename to src/generated/resources/data/ars_nouveau/recipe/repository.json index 03257f22b9..04c1490ac2 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/repository.json +++ b/src/generated/resources/data/ars_nouveau/recipe/repository.json @@ -3,10 +3,10 @@ "category": "misc", "key": { "x": { - "tag": "forge:logs/archwood" + "tag": "neoforge:logs/archwood" }, "y": { - "tag": "forge:nuggets/gold" + "tag": "c:nuggets/gold" } }, "pattern": [ @@ -15,7 +15,7 @@ "yxy" ], "result": { - "item": "ars_nouveau:repository" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:repository" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ring_of_potential.json b/src/generated/resources/data/ars_nouveau/recipe/ring_of_potential.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/ring_of_potential.json rename to src/generated/resources/data/ars_nouveau/recipe/ring_of_potential.json index 52e347db87..c41dfefde0 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ring_of_potential.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ring_of_potential.json @@ -3,10 +3,10 @@ "category": "misc", "key": { "x": { - "tag": "forge:nuggets/iron" + "tag": "c:nuggets/iron" }, "y": { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" } }, "pattern": [ @@ -15,7 +15,7 @@ "xxx" ], "result": { - "item": "ars_nouveau:ring_of_potential" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:ring_of_potential" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_animal_summon.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_animal_summon.json similarity index 86% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_animal_summon.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_animal_summon.json index 654257f6e5..4483fa0f30 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_animal_summon.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_animal_summon.json @@ -19,6 +19,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_animal_summon" + "count": 1, + "id": "ars_nouveau:ritual_animal_summon" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_awakening.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_awakening.json similarity index 70% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_awakening.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_awakening.json index 80f7cf2842..c36ba75f44 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_awakening.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_awakening.json @@ -18,19 +18,20 @@ "item": "ars_nouveau:purple_archwood_sapling" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" } ], "result": { - "item": "ars_nouveau:ritual_awakening" + "count": 1, + "id": "ars_nouveau:ritual_awakening" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_binding.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_binding.json similarity index 65% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_binding.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_binding.json index faf32f4420..ef2180996f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_binding.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_binding.json @@ -12,16 +12,17 @@ "item": "minecraft:ender_pearl" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" } ], "result": { - "item": "ars_nouveau:ritual_binding" + "count": 1, + "id": "ars_nouveau:ritual_binding" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_brazier.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_brazier.json similarity index 53% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_brazier.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_brazier.json index 9cce187315..1b36ff9ec9 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_brazier.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_brazier.json @@ -6,19 +6,20 @@ "item": "ars_nouveau:arcane_pedestal" }, { - "tag": "forge:storage_blocks/source" + "tag": "neoforge:storage_blocks/source" }, { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" } ], "result": { - "item": "ars_nouveau:ritual_brazier" + "count": 1, + "id": "ars_nouveau:ritual_brazier" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_burrowing.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_burrowing.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_burrowing.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_burrowing.json index 56e7e4d527..824e5ea20f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_burrowing.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_burrowing.json @@ -9,10 +9,11 @@ "item": "minecraft:iron_pickaxe" }, { - "tag": "forge:storage_blocks/coal" + "tag": "c:storage_blocks/coal" } ], "result": { - "item": "ars_nouveau:ritual_burrowing" + "count": 1, + "id": "ars_nouveau:ritual_burrowing" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_challenge.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_challenge.json similarity index 82% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_challenge.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_challenge.json index b1ef6c8fe1..01382ea0c0 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_challenge.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_challenge.json @@ -13,6 +13,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_challenge" + "count": 1, + "id": "ars_nouveau:ritual_challenge" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_cloudshaping.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_cloudshaping.json similarity index 68% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_cloudshaping.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_cloudshaping.json index 8bd1b899f9..6b74881927 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_cloudshaping.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_cloudshaping.json @@ -9,10 +9,11 @@ "item": "minecraft:feather" }, { - "tag": "forge:storage_blocks/source" + "tag": "neoforge:storage_blocks/source" } ], "result": { - "item": "ars_nouveau:ritual_cloudshaping" + "count": 1, + "id": "ars_nouveau:ritual_cloudshaping" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_conjure_island_desert.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_conjure_island_desert.json similarity index 79% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_conjure_island_desert.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_conjure_island_desert.json index cc3c9be971..587fdfedfe 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_conjure_island_desert.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_conjure_island_desert.json @@ -13,6 +13,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_conjure_island_desert" + "count": 1, + "id": "ars_nouveau:ritual_conjure_island_desert" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_conjure_island_plains.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_conjure_island_plains.json similarity index 79% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_conjure_island_plains.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_conjure_island_plains.json index c44cd074aa..730378d99a 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_conjure_island_plains.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_conjure_island_plains.json @@ -13,6 +13,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_conjure_island_plains" + "count": 1, + "id": "ars_nouveau:ritual_conjure_island_plains" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_containment.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_containment.json similarity index 86% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_containment.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_containment.json index 581d292f3f..c8fa51c42c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_containment.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_containment.json @@ -19,6 +19,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_containment" + "count": 1, + "id": "ars_nouveau:ritual_containment" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_disintegration.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_disintegration.json similarity index 87% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_disintegration.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_disintegration.json index 907914a74c..e5e14f9293 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_disintegration.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_disintegration.json @@ -25,6 +25,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_disintegration" + "count": 1, + "id": "ars_nouveau:ritual_disintegration" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_fertility.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_fertility.json similarity index 88% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_fertility.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_fertility.json index 6240f1a122..d5f4cea924 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_fertility.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_fertility.json @@ -25,6 +25,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_fertility" + "count": 1, + "id": "ars_nouveau:ritual_fertility" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_flight.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_flight.json similarity index 78% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_flight.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_flight.json index 1040086ca6..02fe1b1f48 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_flight.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_flight.json @@ -15,16 +15,17 @@ "item": "ars_nouveau:wilden_wing" }, { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { "item": "minecraft:ender_pearl" } ], "result": { - "item": "ars_nouveau:ritual_flight" + "count": 1, + "id": "ars_nouveau:ritual_flight" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_flowering.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_flowering.json similarity index 89% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_flowering.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_flowering.json index 118102476b..1956422f4e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_flowering.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_flowering.json @@ -28,6 +28,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_flowering" + "count": 1, + "id": "ars_nouveau:ritual_flowering" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_forestation.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_forestation.json similarity index 82% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_forestation.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_forestation.json index 1df4d8aa7c..5ff8106482 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_forestation.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_forestation.json @@ -13,6 +13,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_forestation" + "count": 1, + "id": "ars_nouveau:ritual_forestation" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_gravity.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_gravity.json similarity index 86% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_gravity.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_gravity.json index 2637d71e89..f3eeb6eac4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_gravity.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_gravity.json @@ -19,6 +19,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_gravity" + "count": 1, + "id": "ars_nouveau:ritual_gravity" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_harvest.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_harvest.json similarity index 83% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_harvest.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_harvest.json index 0f5a727d57..d5116f3eb2 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_harvest.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_harvest.json @@ -13,6 +13,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_harvest" + "count": 1, + "id": "ars_nouveau:ritual_harvest" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_moonfall.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_moonfall.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_moonfall.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_moonfall.json index bdf980a48f..a14cc9e026 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_moonfall.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_moonfall.json @@ -9,13 +9,14 @@ "item": "minecraft:ink_sac" }, { - "tag": "forge:storage_blocks/coal" + "tag": "c:storage_blocks/coal" }, { "item": "minecraft:clock" } ], "result": { - "item": "ars_nouveau:ritual_moonfall" + "count": 1, + "id": "ars_nouveau:ritual_moonfall" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_overgrowth.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_overgrowth.json similarity index 88% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_overgrowth.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_overgrowth.json index 8471dc0da5..46fec7a031 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_overgrowth.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_overgrowth.json @@ -22,6 +22,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_overgrowth" + "count": 1, + "id": "ars_nouveau:ritual_overgrowth" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_restoration.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_restoration.json similarity index 82% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_restoration.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_restoration.json index ddb630913e..d8897cb9db 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_restoration.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_restoration.json @@ -13,6 +13,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_restoration" + "count": 1, + "id": "ars_nouveau:ritual_restoration" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_sanctuary.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_sanctuary.json similarity index 82% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_sanctuary.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_sanctuary.json index d29adde3fc..39292ca053 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_sanctuary.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_sanctuary.json @@ -13,6 +13,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_sanctuary" + "count": 1, + "id": "ars_nouveau:ritual_sanctuary" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_scrying.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_scrying.json similarity index 79% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_scrying.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_scrying.json index f90e019fe1..05c0082053 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_scrying.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_scrying.json @@ -18,10 +18,11 @@ "item": "minecraft:glowstone" }, { - "tag": "forge:storage_blocks/source" + "tag": "neoforge:storage_blocks/source" } ], "result": { - "item": "ars_nouveau:ritual_scrying" + "count": 1, + "id": "ars_nouveau:ritual_scrying" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_sunrise.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_sunrise.json similarity index 86% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_sunrise.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_sunrise.json index d5d517de0f..6d19da2852 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_sunrise.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_sunrise.json @@ -19,6 +19,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_sunrise" + "count": 1, + "id": "ars_nouveau:ritual_sunrise" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_warping.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_warping.json similarity index 80% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_warping.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_warping.json index 555eb3fba7..13038be3f0 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_warping.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_warping.json @@ -10,6 +10,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_warping" + "count": 1, + "id": "ars_nouveau:ritual_warping" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ritual_wilden_summon.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_wilden_summon.json similarity index 86% rename from src/generated/resources/data/ars_nouveau/recipes/ritual_wilden_summon.json rename to src/generated/resources/data/ars_nouveau/recipe/ritual_wilden_summon.json index d9ceabfb3c..80d105ec3c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ritual_wilden_summon.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_wilden_summon.json @@ -19,6 +19,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_wilden_summon" + "count": 1, + "id": "ars_nouveau:ritual_wilden_summon" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/rotating_spell_turret.json b/src/generated/resources/data/ars_nouveau/recipe/rotating_spell_turret.json similarity index 73% rename from src/generated/resources/data/ars_nouveau/recipes/rotating_spell_turret.json rename to src/generated/resources/data/ars_nouveau/recipe/rotating_spell_turret.json index 5682c74d24..e37701a630 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/rotating_spell_turret.json +++ b/src/generated/resources/data/ars_nouveau/recipe/rotating_spell_turret.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:rotating_spell_turret" + "count": 1, + "id": "ars_nouveau:rotating_spell_turret" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/rotating_turret_to_basic_spell_turret.json b/src/generated/resources/data/ars_nouveau/recipe/rotating_turret_to_basic_spell_turret.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/recipes/rotating_turret_to_basic_spell_turret.json rename to src/generated/resources/data/ars_nouveau/recipe/rotating_turret_to_basic_spell_turret.json index 4691836bfd..8ed0c4fdd1 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/rotating_turret_to_basic_spell_turret.json +++ b/src/generated/resources/data/ars_nouveau/recipe/rotating_turret_to_basic_spell_turret.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:basic_spell_turret" + "count": 1, + "id": "ars_nouveau:basic_spell_turret" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/runic_chalk.json b/src/generated/resources/data/ars_nouveau/recipe/runic_chalk.json similarity index 84% rename from src/generated/resources/data/ars_nouveau/recipes/runic_chalk.json rename to src/generated/resources/data/ars_nouveau/recipe/runic_chalk.json index a81ad41ed0..5f03efae2d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/runic_chalk.json +++ b/src/generated/resources/data/ars_nouveau/recipe/runic_chalk.json @@ -13,6 +13,7 @@ } ], "result": { - "item": "ars_nouveau:runic_chalk" + "count": 1, + "id": "ars_nouveau:runic_chalk" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sconce.json b/src/generated/resources/data/ars_nouveau/recipe/sconce.json similarity index 50% rename from src/generated/resources/data/ars_nouveau/recipes/sconce.json rename to src/generated/resources/data/ars_nouveau/recipe/sconce.json index 241c771c8c..507b2b1f6e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sconce.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sconce.json @@ -3,16 +3,17 @@ "category": "misc", "ingredients": [ { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:nuggets/gold" + "tag": "c:nuggets/gold" }, { - "tag": "forge:nuggets/gold" + "tag": "c:nuggets/gold" } ], "result": { - "item": "ars_nouveau:sconce" + "count": 1, + "id": "ars_nouveau:sconce" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/scribes_table.json b/src/generated/resources/data/ars_nouveau/recipe/scribes_table.json similarity index 62% rename from src/generated/resources/data/ars_nouveau/recipes/scribes_table.json rename to src/generated/resources/data/ars_nouveau/recipe/scribes_table.json index ea5795722e..25d5e5cca8 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/scribes_table.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scribes_table.json @@ -6,10 +6,10 @@ "item": "ars_nouveau:archwood_slab" }, "y": { - "tag": "forge:nuggets/gold" + "tag": "c:nuggets/gold" }, "z": { - "tag": "forge:logs/archwood" + "tag": "neoforge:logs/archwood" } }, "pattern": [ @@ -18,7 +18,7 @@ "z z" ], "result": { - "item": "ars_nouveau:scribes_table" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:scribes_table" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_to_blank_parchment.json b/src/generated/resources/data/ars_nouveau/recipe/scry_to_blank_parchment.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/recipes/scry_to_blank_parchment.json rename to src/generated/resources/data/ars_nouveau/recipe/scry_to_blank_parchment.json index 30f91e5a0a..a97581f573 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/scry_to_blank_parchment.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_to_blank_parchment.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:blank_parchment" + "count": 1, + "id": "ars_nouveau:blank_parchment" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/scryers_crystal.json b/src/generated/resources/data/ars_nouveau/recipe/scryers_crystal.json similarity index 64% rename from src/generated/resources/data/ars_nouveau/recipes/scryers_crystal.json rename to src/generated/resources/data/ars_nouveau/recipe/scryers_crystal.json index 43457932d9..0df54cbb11 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/scryers_crystal.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scryers_crystal.json @@ -6,10 +6,11 @@ "item": "minecraft:ender_eye" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" } ], "result": { - "item": "ars_nouveau:scryers_crystal" + "count": 1, + "id": "ars_nouveau:scryers_crystal" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sky_block.json b/src/generated/resources/data/ars_nouveau/recipe/sky_block.json similarity index 80% rename from src/generated/resources/data/ars_nouveau/recipes/sky_block.json rename to src/generated/resources/data/ars_nouveau/recipe/sky_block.json index 2e3860f09c..b050b2ea2f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sky_block.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sky_block.json @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "ars_nouveau:sky_block" - }, - "show_notification": true + "id": "ars_nouveau:sky_block" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_slab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_slab.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_slab.json index 7d706d9401..2c1f7f9d7a 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:smooth_gilded_sourcestone_alternating_slab" - }, - "show_notification": true + "id": "ars_nouveau:smooth_gilded_sourcestone_alternating_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_stairs.json similarity index 70% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_stairs.json index 4383d73afa..149be9779f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:smooth_gilded_sourcestone_alternating_stairs" - }, - "show_notification": true + "id": "ars_nouveau:smooth_gilded_sourcestone_alternating_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_stone_cutterslab.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_stone_cutterslab.json index a5a69950c9..f8cddd8a2d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:smooth_gilded_sourcestone_alternating" }, - "result": "ars_nouveau:smooth_gilded_sourcestone_alternating_slab" + "result": { + "count": 2, + "id": "ars_nouveau:smooth_gilded_sourcestone_alternating_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_stonecutter_stair.json index 3e132e627c..b7123abda1 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:smooth_gilded_sourcestone_alternating" }, - "result": "ars_nouveau:smooth_gilded_sourcestone_alternating_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_gilded_sourcestone_alternating_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_to_sourcestone.json similarity index 78% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_to_sourcestone.json index 542273b262..281d08427a 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_alternating_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_slab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_slab.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_slab.json index e74982016f..6fbb364919 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:smooth_gilded_sourcestone_basketweave_slab" - }, - "show_notification": true + "id": "ars_nouveau:smooth_gilded_sourcestone_basketweave_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_stairs.json similarity index 70% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_stairs.json index 3634e57f16..96059b9f42 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:smooth_gilded_sourcestone_basketweave_stairs" - }, - "show_notification": true + "id": "ars_nouveau:smooth_gilded_sourcestone_basketweave_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json index 10a9f38c5c..d6dcba6ebf 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:smooth_gilded_sourcestone_basketweave" }, - "result": "ars_nouveau:smooth_gilded_sourcestone_basketweave_slab" + "result": { + "count": 2, + "id": "ars_nouveau:smooth_gilded_sourcestone_basketweave_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json index 084e730abc..f88465bca6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:smooth_gilded_sourcestone_basketweave" }, - "result": "ars_nouveau:smooth_gilded_sourcestone_basketweave_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_gilded_sourcestone_basketweave_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_to_sourcestone.json similarity index 78% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_to_sourcestone.json index 9728441fe4..d6873c52ac 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_basketweave_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_slab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_slab.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_slab.json index ed9dc9e932..2166ceafe5 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:smooth_gilded_sourcestone_large_bricks_slab" - }, - "show_notification": true + "id": "ars_nouveau:smooth_gilded_sourcestone_large_bricks_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_stairs.json similarity index 70% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_stairs.json index 6170eed3ab..09bbca2cd7 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:smooth_gilded_sourcestone_large_bricks_stairs" - }, - "show_notification": true + "id": "ars_nouveau:smooth_gilded_sourcestone_large_bricks_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json index 559ed0a41e..777aaa4959 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:smooth_gilded_sourcestone_large_bricks" }, - "result": "ars_nouveau:smooth_gilded_sourcestone_large_bricks_slab" + "result": { + "count": 2, + "id": "ars_nouveau:smooth_gilded_sourcestone_large_bricks_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json similarity index 54% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json index 6c78af9dd3..9b9f07be67 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:smooth_gilded_sourcestone_large_bricks" }, - "result": "ars_nouveau:smooth_gilded_sourcestone_large_bricks_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_gilded_sourcestone_large_bricks_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json similarity index 78% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json index 11c905f355..c177c11e83 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_slab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_slab.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_slab.json index 929846abd2..471f2037b6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:smooth_gilded_sourcestone_mosaic_slab" - }, - "show_notification": true + "id": "ars_nouveau:smooth_gilded_sourcestone_mosaic_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_stairs.json similarity index 70% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_stairs.json index 266fa79f93..9afc86b1b4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:smooth_gilded_sourcestone_mosaic_stairs" - }, - "show_notification": true + "id": "ars_nouveau:smooth_gilded_sourcestone_mosaic_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json index 3af35b10e7..e6ec600012 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:smooth_gilded_sourcestone_mosaic" }, - "result": "ars_nouveau:smooth_gilded_sourcestone_mosaic_slab" + "result": { + "count": 2, + "id": "ars_nouveau:smooth_gilded_sourcestone_mosaic_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json index 56d6abe498..2f7bcfd356 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:smooth_gilded_sourcestone_mosaic" }, - "result": "ars_nouveau:smooth_gilded_sourcestone_mosaic_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_gilded_sourcestone_mosaic_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_to_sourcestone.json index 95cc0916c8..6d01719348 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_mosaic_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_slab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_slab.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_slab.json index 966eb775c2..db8f2b7026 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:smooth_gilded_sourcestone_small_bricks_slab" - }, - "show_notification": true + "id": "ars_nouveau:smooth_gilded_sourcestone_small_bricks_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_stairs.json similarity index 70% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_stairs.json index b27784af00..03f270e2bc 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:smooth_gilded_sourcestone_small_bricks_stairs" - }, - "show_notification": true + "id": "ars_nouveau:smooth_gilded_sourcestone_small_bricks_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json index 4be5b625ed..a1b6edb915 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:smooth_gilded_sourcestone_small_bricks" }, - "result": "ars_nouveau:smooth_gilded_sourcestone_small_bricks_slab" + "result": { + "count": 2, + "id": "ars_nouveau:smooth_gilded_sourcestone_small_bricks_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json similarity index 54% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json index 0c31050a39..1d74a0a7f6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:smooth_gilded_sourcestone_small_bricks" }, - "result": "ars_nouveau:smooth_gilded_sourcestone_small_bricks_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_gilded_sourcestone_small_bricks_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json similarity index 78% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json index ba5a3ffbb2..75273799e6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_alternating_slab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_alternating_slab.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_alternating_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_alternating_slab.json index 996805b646..eafc730324 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_alternating_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_alternating_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:smooth_sourcestone_alternating_slab" - }, - "show_notification": true + "id": "ars_nouveau:smooth_sourcestone_alternating_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_alternating_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_alternating_stairs.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_alternating_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_alternating_stairs.json index 709de54abf..dc6f417151 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_alternating_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_alternating_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:smooth_sourcestone_alternating_stairs" - }, - "show_notification": true + "id": "ars_nouveau:smooth_sourcestone_alternating_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_alternating_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_alternating_stone_cutterslab.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_alternating_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_alternating_stone_cutterslab.json index 924914d2cd..4a7fbd70a6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_alternating_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_alternating_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:smooth_sourcestone_alternating" }, - "result": "ars_nouveau:smooth_sourcestone_alternating_slab" + "result": { + "count": 2, + "id": "ars_nouveau:smooth_sourcestone_alternating_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_alternating_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_alternating_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_alternating_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_alternating_stonecutter_stair.json index 530838f473..d193127d21 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_alternating_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_alternating_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:smooth_sourcestone_alternating" }, - "result": "ars_nouveau:smooth_sourcestone_alternating_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_sourcestone_alternating_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_alternating_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_alternating_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_alternating_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_alternating_to_sourcestone.json index e08b41d09d..347297d5d4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_alternating_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_alternating_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_basketweave_slab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_basketweave_slab.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_basketweave_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_basketweave_slab.json index 78c457cbbe..156b5b20d6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_basketweave_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_basketweave_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:smooth_sourcestone_basketweave_slab" - }, - "show_notification": true + "id": "ars_nouveau:smooth_sourcestone_basketweave_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_basketweave_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stairs.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_basketweave_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stairs.json index 447f0b9add..f1ab7a479c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_basketweave_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:smooth_sourcestone_basketweave_stairs" - }, - "show_notification": true + "id": "ars_nouveau:smooth_sourcestone_basketweave_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_basketweave_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stone_cutterslab.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_basketweave_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stone_cutterslab.json index 4f33d1d36b..6b6648dd4e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_basketweave_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:smooth_sourcestone_basketweave" }, - "result": "ars_nouveau:smooth_sourcestone_basketweave_slab" + "result": { + "count": 2, + "id": "ars_nouveau:smooth_sourcestone_basketweave_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_basketweave_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_basketweave_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stonecutter_stair.json index 366d56295a..a56b991a5c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_basketweave_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:smooth_sourcestone_basketweave" }, - "result": "ars_nouveau:smooth_sourcestone_basketweave_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_sourcestone_basketweave_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_basketweave_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_basketweave_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_basketweave_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_basketweave_to_sourcestone.json index 3172bdc845..df076c65e3 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_basketweave_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_basketweave_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_slab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_slab.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_slab.json index 29282d8eb3..08562ab85f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:smooth_sourcestone_large_bricks_slab" - }, - "show_notification": true + "id": "ars_nouveau:smooth_sourcestone_large_bricks_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stairs.json similarity index 70% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stairs.json index d7cd29d86c..d5d0fa8026 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:smooth_sourcestone_large_bricks_stairs" - }, - "show_notification": true + "id": "ars_nouveau:smooth_sourcestone_large_bricks_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stone_cutterslab.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stone_cutterslab.json index 6794192d52..17e5d50eae 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:smooth_sourcestone_large_bricks" }, - "result": "ars_nouveau:smooth_sourcestone_large_bricks_slab" + "result": { + "count": 2, + "id": "ars_nouveau:smooth_sourcestone_large_bricks_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stonecutter_stair.json index b3f16a4c70..8464e6738c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:smooth_sourcestone_large_bricks" }, - "result": "ars_nouveau:smooth_sourcestone_large_bricks_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_sourcestone_large_bricks_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_to_sourcestone.json index b2c9471e7d..0520be435d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_large_bricks_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_mosaic_slab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_mosaic_slab.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_mosaic_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_mosaic_slab.json index 149ec5ee71..b956cdc63e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_mosaic_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_mosaic_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:smooth_sourcestone_mosaic_slab" - }, - "show_notification": true + "id": "ars_nouveau:smooth_sourcestone_mosaic_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_mosaic_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_mosaic_stairs.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_mosaic_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_mosaic_stairs.json index 145f1a8303..13a5bdf19c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_mosaic_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_mosaic_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:smooth_sourcestone_mosaic_stairs" - }, - "show_notification": true + "id": "ars_nouveau:smooth_sourcestone_mosaic_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_mosaic_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_mosaic_stone_cutterslab.json similarity index 56% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_mosaic_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_mosaic_stone_cutterslab.json index 941f24091d..d37c61b038 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_mosaic_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_mosaic_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:smooth_sourcestone_mosaic" }, - "result": "ars_nouveau:smooth_sourcestone_mosaic_slab" + "result": { + "count": 2, + "id": "ars_nouveau:smooth_sourcestone_mosaic_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_mosaic_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_mosaic_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_mosaic_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_mosaic_stonecutter_stair.json index 3c77b46724..dda241213e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_mosaic_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_mosaic_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:smooth_sourcestone_mosaic" }, - "result": "ars_nouveau:smooth_sourcestone_mosaic_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_sourcestone_mosaic_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_mosaic_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_mosaic_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_mosaic_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_mosaic_to_sourcestone.json index ead4618afd..f58d0283c0 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_mosaic_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_mosaic_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_slab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_slab.json similarity index 73% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_slab.json index a22862d005..2a6c067c87 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:smooth_sourcestone_slab" - }, - "show_notification": true + "id": "ars_nouveau:smooth_sourcestone_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_slab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_slab.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_slab.json index c9eafb0da1..a62eafc096 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:smooth_sourcestone_small_bricks_slab" - }, - "show_notification": true + "id": "ars_nouveau:smooth_sourcestone_small_bricks_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_stairs.json similarity index 70% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_stairs.json index 8a06539a34..ad21747683 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:smooth_sourcestone_small_bricks_stairs" - }, - "show_notification": true + "id": "ars_nouveau:smooth_sourcestone_small_bricks_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_stone_cutterslab.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_stone_cutterslab.json index 3d3aaa723a..d8c8c466fc 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:smooth_sourcestone_small_bricks" }, - "result": "ars_nouveau:smooth_sourcestone_small_bricks_slab" + "result": { + "count": 2, + "id": "ars_nouveau:smooth_sourcestone_small_bricks_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_stonecutter_stair.json index 293529871e..0bbc766b94 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:smooth_sourcestone_small_bricks" }, - "result": "ars_nouveau:smooth_sourcestone_small_bricks_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_sourcestone_small_bricks_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_to_sourcestone.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_to_sourcestone.json index e909fe9f31..a68a0dad78 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_small_bricks_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_stairs.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_stairs.json index fe0280846c..4eb80938c9 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:smooth_sourcestone_stairs" - }, - "show_notification": true + "id": "ars_nouveau:smooth_sourcestone_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_stone_cutterslab.json similarity index 56% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_stone_cutterslab.json index 3a37364cc6..cc6b4aaef1 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:smooth_sourcestone" }, - "result": "ars_nouveau:smooth_sourcestone_slab" + "result": { + "count": 2, + "id": "ars_nouveau:smooth_sourcestone_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_stonecutter_stair.json similarity index 56% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_stonecutter_stair.json index 809d83419a..9ce851f567 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:smooth_sourcestone" }, - "result": "ars_nouveau:smooth_sourcestone_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_sourcestone_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_to_sourcestone.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_to_sourcestone.json index 17c66c2aab..1bad9cd8b8 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smooth_sourcestone_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/source_berry_pie.json b/src/generated/resources/data/ars_nouveau/recipe/source_berry_pie.json similarity index 88% rename from src/generated/resources/data/ars_nouveau/recipes/source_berry_pie.json rename to src/generated/resources/data/ars_nouveau/recipe/source_berry_pie.json index 7243166552..5955402a5b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/source_berry_pie.json +++ b/src/generated/resources/data/ars_nouveau/recipe/source_berry_pie.json @@ -22,6 +22,7 @@ } ], "result": { - "item": "ars_nouveau:source_berry_pie" + "count": 1, + "id": "ars_nouveau:source_berry_pie" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/source_berry_roll.json b/src/generated/resources/data/ars_nouveau/recipe/source_berry_roll.json similarity index 83% rename from src/generated/resources/data/ars_nouveau/recipes/source_berry_roll.json rename to src/generated/resources/data/ars_nouveau/recipe/source_berry_roll.json index ece87943d2..4ebc4fb7e8 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/source_berry_roll.json +++ b/src/generated/resources/data/ars_nouveau/recipe/source_berry_roll.json @@ -16,6 +16,7 @@ } ], "result": { - "item": "ars_nouveau:source_berry_roll" + "count": 1, + "id": "ars_nouveau:source_berry_roll" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/source_gem_block.json b/src/generated/resources/data/ars_nouveau/recipe/source_gem_block.json similarity index 57% rename from src/generated/resources/data/ars_nouveau/recipes/source_gem_block.json rename to src/generated/resources/data/ars_nouveau/recipe/source_gem_block.json index 3c556117ac..c766b6d48e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/source_gem_block.json +++ b/src/generated/resources/data/ars_nouveau/recipe/source_gem_block.json @@ -3,7 +3,7 @@ "category": "misc", "key": { "x": { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" } }, "pattern": [ @@ -11,7 +11,7 @@ "xx" ], "result": { - "item": "ars_nouveau:source_gem_block" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:source_gem_block" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/source_gem_block_2.json b/src/generated/resources/data/ars_nouveau/recipe/source_gem_block_2.json similarity index 83% rename from src/generated/resources/data/ars_nouveau/recipes/source_gem_block_2.json rename to src/generated/resources/data/ars_nouveau/recipe/source_gem_block_2.json index 2321310f1c..cb8c626edc 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/source_gem_block_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/source_gem_block_2.json @@ -8,6 +8,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:source_gem" + "id": "ars_nouveau:source_gem" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/source_jar.json b/src/generated/resources/data/ars_nouveau/recipe/source_jar.json similarity index 69% rename from src/generated/resources/data/ars_nouveau/recipes/source_jar.json rename to src/generated/resources/data/ars_nouveau/recipe/source_jar.json index 5f253c5a58..7c5a76f4f7 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/source_jar.json +++ b/src/generated/resources/data/ars_nouveau/recipe/source_jar.json @@ -3,7 +3,7 @@ "category": "misc", "key": { "x": { - "tag": "forge:glass" + "tag": "c:glass_blocks" }, "y": { "item": "ars_nouveau:archwood_slab" @@ -15,7 +15,7 @@ "yyy" ], "result": { - "item": "ars_nouveau:source_jar" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:source_jar" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourceberry_sack.json b/src/generated/resources/data/ars_nouveau/recipe/sourceberry_sack.json similarity index 91% rename from src/generated/resources/data/ars_nouveau/recipes/sourceberry_sack.json rename to src/generated/resources/data/ars_nouveau/recipe/sourceberry_sack.json index 6c7fc6d293..460105e169 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourceberry_sack.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourceberry_sack.json @@ -31,6 +31,7 @@ } ], "result": { - "item": "ars_nouveau:sourceberry_sack" + "count": 1, + "id": "ars_nouveau:sourceberry_sack" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourceberry_sack_to_bush.json b/src/generated/resources/data/ars_nouveau/recipe/sourceberry_sack_to_bush.json similarity index 80% rename from src/generated/resources/data/ars_nouveau/recipes/sourceberry_sack_to_bush.json rename to src/generated/resources/data/ars_nouveau/recipe/sourceberry_sack_to_bush.json index a955d82bec..b919d255ac 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourceberry_sack_to_bush.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourceberry_sack_to_bush.json @@ -8,6 +8,6 @@ ], "result": { "count": 9, - "item": "ars_nouveau:sourceberry_bush" + "id": "ars_nouveau:sourceberry_bush" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourceberry_to_purple.json b/src/generated/resources/data/ars_nouveau/recipe/sourceberry_to_purple.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/recipes/sourceberry_to_purple.json rename to src/generated/resources/data/ars_nouveau/recipe/sourceberry_to_purple.json index 741ee5f880..67461f695b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourceberry_to_purple.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourceberry_to_purple.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "minecraft:purple_dye" + "count": 1, + "id": "minecraft:purple_dye" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone.json similarity index 60% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone.json index a2693cca42..2eb6f7e89c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone.json @@ -3,10 +3,10 @@ "category": "misc", "key": { "x": { - "tag": "forge:stone" + "tag": "c:stones" }, "y": { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" } }, "pattern": [ @@ -16,7 +16,6 @@ ], "result": { "count": 8, - "item": "ars_nouveau:sourcestone" - }, - "show_notification": true + "id": "ars_nouveau:sourcestone" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_1.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_1.json similarity index 56% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_1.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_1.json index 83b11d98ea..a4f8a0a9e4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_1.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:sourcestone_mosaic" + "result": { + "count": 1, + "id": "ars_nouveau:sourcestone_mosaic" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_10.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_10.json similarity index 56% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_10.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_10.json index 8fa11e14e1..cdd6fe0fbf 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_10.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_10.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:smooth_sourcestone" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_sourcestone" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_11.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_11.json similarity index 52% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_11.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_11.json index 74ce4a1905..107e83d25b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_11.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_11.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:smooth_sourcestone_small_bricks" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_sourcestone_small_bricks" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_12.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_12.json similarity index 54% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_12.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_12.json index 56cc104790..89c3da15a7 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_12.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_12.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:gilded_sourcestone_mosaic" + "result": { + "count": 1, + "id": "ars_nouveau:gilded_sourcestone_mosaic" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_13.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_13.json similarity index 52% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_13.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_13.json index 688f3817f0..5025b655a8 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_13.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_13.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:gilded_sourcestone_basketweave" + "result": { + "count": 1, + "id": "ars_nouveau:gilded_sourcestone_basketweave" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_14.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_14.json similarity index 52% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_14.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_14.json index 2015419ca3..e56081c241 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_14.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_14.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:gilded_sourcestone_alternating" + "result": { + "count": 1, + "id": "ars_nouveau:gilded_sourcestone_alternating" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_15.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_15.json similarity index 52% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_15.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_15.json index 89b4e9c67f..7c8026ee18 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_15.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_15.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:gilded_sourcestone_large_bricks" + "result": { + "count": 1, + "id": "ars_nouveau:gilded_sourcestone_large_bricks" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_16.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_16.json similarity index 52% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_16.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_16.json index ac0bbff406..461cdfa8d7 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_16.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_16.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:gilded_sourcestone_small_bricks" + "result": { + "count": 1, + "id": "ars_nouveau:gilded_sourcestone_small_bricks" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_17.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_17.json similarity index 52% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_17.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_17.json index 68fb28d29d..9ec21fd170 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_17.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_17.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:smooth_gilded_sourcestone_mosaic" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_gilded_sourcestone_mosaic" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_18.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_18.json similarity index 51% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_18.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_18.json index 0d150778db..f574f3aa0d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_18.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_18.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:smooth_gilded_sourcestone_basketweave" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_gilded_sourcestone_basketweave" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_19.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_19.json similarity index 51% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_19.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_19.json index 33be60f627..f40d6f51df 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_19.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_19.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:smooth_gilded_sourcestone_alternating" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_gilded_sourcestone_alternating" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_2.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_2.json similarity index 54% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_2.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_2.json index 858615e51a..3b5a98ba1c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_2.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:sourcestone_basketweave" + "result": { + "count": 1, + "id": "ars_nouveau:sourcestone_basketweave" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_20.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_20.json similarity index 50% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_20.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_20.json index d879379163..b542a93388 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_20.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_20.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:smooth_gilded_sourcestone_large_bricks" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_gilded_sourcestone_large_bricks" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_21.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_21.json similarity index 50% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_21.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_21.json index b93d9c9781..f5ad3ad156 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_21.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_21.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:smooth_gilded_sourcestone_small_bricks" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_gilded_sourcestone_small_bricks" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_3.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_3.json similarity index 54% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_3.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_3.json index 1fc782b999..a53b908acc 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_3.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:sourcestone_alternating" + "result": { + "count": 1, + "id": "ars_nouveau:sourcestone_alternating" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_4.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_4.json similarity index 54% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_4.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_4.json index f8885dc375..865bacaf34 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_4.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:sourcestone_large_bricks" + "result": { + "count": 1, + "id": "ars_nouveau:sourcestone_large_bricks" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_5.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_5.json similarity index 54% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_5.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_5.json index 71c6bee95f..4fcfeaccac 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_5.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_5.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:sourcestone_small_bricks" + "result": { + "count": 1, + "id": "ars_nouveau:sourcestone_small_bricks" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_6.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_6.json similarity index 52% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_6.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_6.json index 3e954c0073..95a453e250 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_6.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_6.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:smooth_sourcestone_basketweave" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_sourcestone_basketweave" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_7.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_7.json similarity index 54% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_7.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_7.json index 8da3d72c78..705927c6a8 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_7.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_7.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:smooth_sourcestone_mosaic" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_sourcestone_mosaic" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_8.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_8.json similarity index 52% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_8.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_8.json index e809265d0f..941022bd25 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_8.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_8.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:smooth_sourcestone_alternating" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_sourcestone_alternating" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_9.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_9.json similarity index 52% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_9.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_9.json index dee0d0b451..1e8eb5fde1 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_9.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_9.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone" }, - "result": "ars_nouveau:smooth_sourcestone_large_bricks" + "result": { + "count": 1, + "id": "ars_nouveau:smooth_sourcestone_large_bricks" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_alternating_slab.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_alternating_slab.json similarity index 73% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_alternating_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_alternating_slab.json index 65b6dd2e59..44f33d7b8d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_alternating_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_alternating_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:sourcestone_alternating_slab" - }, - "show_notification": true + "id": "ars_nouveau:sourcestone_alternating_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_alternating_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_alternating_stairs.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_alternating_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_alternating_stairs.json index d1f4c76b57..344a53c501 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_alternating_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_alternating_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:sourcestone_alternating_stairs" - }, - "show_notification": true + "id": "ars_nouveau:sourcestone_alternating_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_alternating_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_alternating_stone_cutterslab.json similarity index 56% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_alternating_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_alternating_stone_cutterslab.json index 978c68e603..56e1bc895b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_alternating_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_alternating_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:sourcestone_alternating" }, - "result": "ars_nouveau:sourcestone_alternating_slab" + "result": { + "count": 2, + "id": "ars_nouveau:sourcestone_alternating_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_alternating_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_alternating_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_alternating_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_alternating_stonecutter_stair.json index 9ae7ea7a47..2b84268c9f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_alternating_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_alternating_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone_alternating" }, - "result": "ars_nouveau:sourcestone_alternating_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:sourcestone_alternating_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_alternating_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_alternating_to_sourcestone.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_alternating_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_alternating_to_sourcestone.json index e2986b7ef8..4d0e99e3f3 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_alternating_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_alternating_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_basketweave_slab.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_basketweave_slab.json similarity index 73% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_basketweave_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_basketweave_slab.json index 08ff1ed7fa..90c3748bd4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_basketweave_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_basketweave_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:sourcestone_basketweave_slab" - }, - "show_notification": true + "id": "ars_nouveau:sourcestone_basketweave_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_basketweave_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_basketweave_stairs.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_basketweave_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_basketweave_stairs.json index 8c785f6aa1..adcc9c3675 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_basketweave_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_basketweave_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:sourcestone_basketweave_stairs" - }, - "show_notification": true + "id": "ars_nouveau:sourcestone_basketweave_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_basketweave_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_basketweave_stone_cutterslab.json similarity index 56% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_basketweave_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_basketweave_stone_cutterslab.json index 8d5d5e62ed..87dc85b4db 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_basketweave_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_basketweave_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:sourcestone_basketweave" }, - "result": "ars_nouveau:sourcestone_basketweave_slab" + "result": { + "count": 2, + "id": "ars_nouveau:sourcestone_basketweave_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_basketweave_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_basketweave_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_basketweave_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_basketweave_stonecutter_stair.json index 5580a38d7a..51f95f5c28 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_basketweave_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_basketweave_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone_basketweave" }, - "result": "ars_nouveau:sourcestone_basketweave_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:sourcestone_basketweave_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_basketweave_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_basketweave_to_sourcestone.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_basketweave_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_basketweave_to_sourcestone.json index 74a5f52145..8ef2efe765 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_basketweave_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_basketweave_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_large_bricks_slab.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_large_bricks_slab.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_large_bricks_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_large_bricks_slab.json index 2fb1e2cb40..ef2a9f23e4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_large_bricks_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_large_bricks_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:sourcestone_large_bricks_slab" - }, - "show_notification": true + "id": "ars_nouveau:sourcestone_large_bricks_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_large_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_large_bricks_stairs.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_large_bricks_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_large_bricks_stairs.json index 3a164effd0..ea2bb54f49 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_large_bricks_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_large_bricks_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:sourcestone_large_bricks_stairs" - }, - "show_notification": true + "id": "ars_nouveau:sourcestone_large_bricks_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_large_bricks_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_large_bricks_stone_cutterslab.json similarity index 56% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_large_bricks_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_large_bricks_stone_cutterslab.json index 7192b5f797..bfd211c0a2 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_large_bricks_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_large_bricks_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:sourcestone_large_bricks" }, - "result": "ars_nouveau:sourcestone_large_bricks_slab" + "result": { + "count": 2, + "id": "ars_nouveau:sourcestone_large_bricks_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_large_bricks_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_large_bricks_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_large_bricks_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_large_bricks_stonecutter_stair.json index 0a1f20ec1a..c9c23375c0 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_large_bricks_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_large_bricks_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone_large_bricks" }, - "result": "ars_nouveau:sourcestone_large_bricks_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:sourcestone_large_bricks_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_large_bricks_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_large_bricks_to_sourcestone.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_large_bricks_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_large_bricks_to_sourcestone.json index 1a779e3768..dcc37443e3 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_large_bricks_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_large_bricks_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_mosaic_slab.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_mosaic_slab.json similarity index 73% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_mosaic_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_mosaic_slab.json index 072b101ea2..26f3811243 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_mosaic_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_mosaic_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:sourcestone_mosaic_slab" - }, - "show_notification": true + "id": "ars_nouveau:sourcestone_mosaic_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_mosaic_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_mosaic_stairs.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_mosaic_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_mosaic_stairs.json index eb46058020..6879b5b755 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_mosaic_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_mosaic_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:sourcestone_mosaic_stairs" - }, - "show_notification": true + "id": "ars_nouveau:sourcestone_mosaic_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_mosaic_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_mosaic_stone_cutterslab.json similarity index 56% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_mosaic_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_mosaic_stone_cutterslab.json index f562f903f9..361f75ecab 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_mosaic_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_mosaic_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:sourcestone_mosaic" }, - "result": "ars_nouveau:sourcestone_mosaic_slab" + "result": { + "count": 2, + "id": "ars_nouveau:sourcestone_mosaic_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_mosaic_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_mosaic_stonecutter_stair.json similarity index 56% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_mosaic_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_mosaic_stonecutter_stair.json index c61a377060..c4c250bc3b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_mosaic_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_mosaic_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone_mosaic" }, - "result": "ars_nouveau:sourcestone_mosaic_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:sourcestone_mosaic_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_mosaic_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_mosaic_to_sourcestone.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_mosaic_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_mosaic_to_sourcestone.json index 6d591a53d6..5c2f9694d8 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_mosaic_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_mosaic_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_sconce.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_sconce.json similarity index 70% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_sconce.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_sconce.json index 666ed0dea3..3b8929da77 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_sconce.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_sconce.json @@ -3,7 +3,7 @@ "category": "misc", "ingredients": [ { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { "item": "ars_nouveau:sourcestone" @@ -13,6 +13,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone_sconce" + "count": 1, + "id": "ars_nouveau:sourcestone_sconce" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_small_bricks_slab.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_small_bricks_slab.json similarity index 72% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_small_bricks_slab.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_small_bricks_slab.json index 35d758c66a..ab12db25c6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_small_bricks_slab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_small_bricks_slab.json @@ -12,7 +12,6 @@ ], "result": { "count": 6, - "item": "ars_nouveau:sourcestone_small_bricks_slab" - }, - "show_notification": true + "id": "ars_nouveau:sourcestone_small_bricks_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_small_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_small_bricks_stairs.json similarity index 71% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_small_bricks_stairs.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_small_bricks_stairs.json index df2f5bb4f6..0cce6e3e7c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_small_bricks_stairs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_small_bricks_stairs.json @@ -13,7 +13,6 @@ ], "result": { "count": 4, - "item": "ars_nouveau:sourcestone_small_bricks_stairs" - }, - "show_notification": true + "id": "ars_nouveau:sourcestone_small_bricks_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_small_bricks_stone_cutterslab.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_small_bricks_stone_cutterslab.json similarity index 56% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_small_bricks_stone_cutterslab.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_small_bricks_stone_cutterslab.json index 3f943df257..b4527e1425 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_small_bricks_stone_cutterslab.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_small_bricks_stone_cutterslab.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 2, "ingredient": { "item": "ars_nouveau:sourcestone_small_bricks" }, - "result": "ars_nouveau:sourcestone_small_bricks_slab" + "result": { + "count": 2, + "id": "ars_nouveau:sourcestone_small_bricks_slab" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_small_bricks_stonecutter_stair.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_small_bricks_stonecutter_stair.json similarity index 55% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_small_bricks_stonecutter_stair.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_small_bricks_stonecutter_stair.json index e596ca03a3..3709aea09b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_small_bricks_stonecutter_stair.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_small_bricks_stonecutter_stair.json @@ -1,8 +1,10 @@ { "type": "minecraft:stonecutting", - "count": 1, "ingredient": { "item": "ars_nouveau:sourcestone_small_bricks" }, - "result": "ars_nouveau:sourcestone_small_bricks_stairs" + "result": { + "count": 1, + "id": "ars_nouveau:sourcestone_small_bricks_stairs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_small_bricks_to_sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_small_bricks_to_sourcestone.json similarity index 76% rename from src/generated/resources/data/ars_nouveau/recipes/sourcestone_small_bricks_to_sourcestone.json rename to src/generated/resources/data/ars_nouveau/recipe/sourcestone_small_bricks_to_sourcestone.json index 1473695b54..41a90cfac6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sourcestone_small_bricks_to_sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_small_bricks_to_sourcestone.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:sourcestone" + "count": 1, + "id": "ars_nouveau:sourcestone" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/spell_prism.json b/src/generated/resources/data/ars_nouveau/recipe/spell_prism.json similarity index 62% rename from src/generated/resources/data/ars_nouveau/recipes/spell_prism.json rename to src/generated/resources/data/ars_nouveau/recipe/spell_prism.json index cd34333fb3..7118f3d9ca 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/spell_prism.json +++ b/src/generated/resources/data/ars_nouveau/recipe/spell_prism.json @@ -3,10 +3,10 @@ "category": "misc", "key": { "g": { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, "n": { - "tag": "forge:storage_blocks/quartz" + "tag": "minecraft:storage_blocks/quartz" }, "x": { "item": "ars_nouveau:archwood_planks" @@ -18,7 +18,7 @@ "gxg" ], "result": { - "item": "ars_nouveau:spell_prism" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:spell_prism" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/spike_to_arrow.json b/src/generated/resources/data/ars_nouveau/recipe/spike_to_arrow.json similarity index 83% rename from src/generated/resources/data/ars_nouveau/recipes/spike_to_arrow.json rename to src/generated/resources/data/ars_nouveau/recipe/spike_to_arrow.json index 7450dcd2ca..ead92d6843 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/spike_to_arrow.json +++ b/src/generated/resources/data/ars_nouveau/recipe/spike_to_arrow.json @@ -19,7 +19,6 @@ ], "result": { "count": 32, - "item": "minecraft:arrow" - }, - "show_notification": true + "id": "minecraft:arrow" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/spike_to_dye.json b/src/generated/resources/data/ars_nouveau/recipe/spike_to_dye.json similarity index 83% rename from src/generated/resources/data/ars_nouveau/recipes/spike_to_dye.json rename to src/generated/resources/data/ars_nouveau/recipe/spike_to_dye.json index ed6305268b..ee8d5e9b6b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/spike_to_dye.json +++ b/src/generated/resources/data/ars_nouveau/recipe/spike_to_dye.json @@ -8,6 +8,6 @@ ], "result": { "count": 5, - "item": "minecraft:orange_dye" + "id": "minecraft:orange_dye" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/starbuncle_shades.json b/src/generated/resources/data/ars_nouveau/recipe/starbuncle_shades.json similarity index 75% rename from src/generated/resources/data/ars_nouveau/recipes/starbuncle_shades.json rename to src/generated/resources/data/ars_nouveau/recipe/starbuncle_shades.json index fc9658b0fe..0f1562b1ac 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/starbuncle_shades.json +++ b/src/generated/resources/data/ars_nouveau/recipe/starbuncle_shades.json @@ -13,7 +13,7 @@ "xyx" ], "result": { - "item": "ars_nouveau:starbuncle_shades" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:starbuncle_shades" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/stripped_blue_archwood_wood.json b/src/generated/resources/data/ars_nouveau/recipe/stripped_blue_archwood_wood.json similarity index 73% rename from src/generated/resources/data/ars_nouveau/recipes/stripped_blue_archwood_wood.json rename to src/generated/resources/data/ars_nouveau/recipe/stripped_blue_archwood_wood.json index bada696b2a..0ac022669d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/stripped_blue_archwood_wood.json +++ b/src/generated/resources/data/ars_nouveau/recipe/stripped_blue_archwood_wood.json @@ -13,7 +13,6 @@ ], "result": { "count": 3, - "item": "ars_nouveau:stripped_blue_archwood_wood" - }, - "show_notification": true + "id": "ars_nouveau:stripped_blue_archwood_wood" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/stripped_green_archwood_wood.json b/src/generated/resources/data/ars_nouveau/recipe/stripped_green_archwood_wood.json similarity index 73% rename from src/generated/resources/data/ars_nouveau/recipes/stripped_green_archwood_wood.json rename to src/generated/resources/data/ars_nouveau/recipe/stripped_green_archwood_wood.json index 394011546a..f8da3b4c72 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/stripped_green_archwood_wood.json +++ b/src/generated/resources/data/ars_nouveau/recipe/stripped_green_archwood_wood.json @@ -13,7 +13,6 @@ ], "result": { "count": 3, - "item": "ars_nouveau:stripped_green_archwood_wood" - }, - "show_notification": true + "id": "ars_nouveau:stripped_green_archwood_wood" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/stripped_purple_archwood_wood.json b/src/generated/resources/data/ars_nouveau/recipe/stripped_purple_archwood_wood.json similarity index 73% rename from src/generated/resources/data/ars_nouveau/recipes/stripped_purple_archwood_wood.json rename to src/generated/resources/data/ars_nouveau/recipe/stripped_purple_archwood_wood.json index 3020e1a838..bf8b59eb9f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/stripped_purple_archwood_wood.json +++ b/src/generated/resources/data/ars_nouveau/recipe/stripped_purple_archwood_wood.json @@ -13,7 +13,6 @@ ], "result": { "count": 3, - "item": "ars_nouveau:stripped_purple_archwood_wood" - }, - "show_notification": true + "id": "ars_nouveau:stripped_purple_archwood_wood" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/stripped_red_archwood_wood.json b/src/generated/resources/data/ars_nouveau/recipe/stripped_red_archwood_wood.json similarity index 73% rename from src/generated/resources/data/ars_nouveau/recipes/stripped_red_archwood_wood.json rename to src/generated/resources/data/ars_nouveau/recipe/stripped_red_archwood_wood.json index 1ff669b185..1c62143d94 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/stripped_red_archwood_wood.json +++ b/src/generated/resources/data/ars_nouveau/recipe/stripped_red_archwood_wood.json @@ -13,7 +13,6 @@ ], "result": { "count": 3, - "item": "ars_nouveau:stripped_red_archwood_wood" - }, - "show_notification": true + "id": "ars_nouveau:stripped_red_archwood_wood" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sunrise_2.json b/src/generated/resources/data/ars_nouveau/recipe/sunrise_2.json similarity index 79% rename from src/generated/resources/data/ars_nouveau/recipes/sunrise_2.json rename to src/generated/resources/data/ars_nouveau/recipe/sunrise_2.json index cf4ac9b5be..b862a401a6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sunrise_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sunrise_2.json @@ -10,6 +10,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_sunrise" + "count": 1, + "id": "ars_nouveau:ritual_sunrise" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/vitalic_sourcelink.json b/src/generated/resources/data/ars_nouveau/recipe/vitalic_sourcelink.json similarity index 63% rename from src/generated/resources/data/ars_nouveau/recipes/vitalic_sourcelink.json rename to src/generated/resources/data/ars_nouveau/recipe/vitalic_sourcelink.json index abd9ea7ce9..6bbde35855 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/vitalic_sourcelink.json +++ b/src/generated/resources/data/ars_nouveau/recipe/vitalic_sourcelink.json @@ -3,13 +3,13 @@ "category": "misc", "key": { "g": { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, "i": { "item": "minecraft:glistering_melon_slice" }, "s": { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" } }, "pattern": [ @@ -18,7 +18,7 @@ " s " ], "result": { - "item": "ars_nouveau:vitalic_sourcelink" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:vitalic_sourcelink" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/void_prism.json b/src/generated/resources/data/ars_nouveau/recipe/void_prism.json similarity index 68% rename from src/generated/resources/data/ars_nouveau/recipes/void_prism.json rename to src/generated/resources/data/ars_nouveau/recipe/void_prism.json index 50c460c8be..60f8610b8b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/void_prism.json +++ b/src/generated/resources/data/ars_nouveau/recipe/void_prism.json @@ -3,7 +3,7 @@ "category": "misc", "key": { "x": { - "tag": "forge:obsidian" + "tag": "c:obsidians" }, "y": { "item": "ars_nouveau:spell_prism" @@ -15,7 +15,7 @@ "xxx" ], "result": { - "item": "ars_nouveau:void_prism" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:void_prism" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/volcanic_sourcelink.json b/src/generated/resources/data/ars_nouveau/recipe/volcanic_sourcelink.json similarity index 62% rename from src/generated/resources/data/ars_nouveau/recipes/volcanic_sourcelink.json rename to src/generated/resources/data/ars_nouveau/recipe/volcanic_sourcelink.json index 4fe96b2fec..1ac681fbe3 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/volcanic_sourcelink.json +++ b/src/generated/resources/data/ars_nouveau/recipe/volcanic_sourcelink.json @@ -3,13 +3,13 @@ "category": "misc", "key": { "g": { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, "i": { "item": "minecraft:lava_bucket" }, "s": { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" } }, "pattern": [ @@ -18,7 +18,7 @@ " s " ], "result": { - "item": "ars_nouveau:volcanic_sourcelink" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:volcanic_sourcelink" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/warp_scroll.json b/src/generated/resources/data/ars_nouveau/recipe/warp_scroll.json new file mode 100644 index 0000000000..e1c02fcda8 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/warp_scroll.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "c:gems/lapis" + }, + { + "tag": "c:gems/lapis" + }, + { + "tag": "c:gems/lapis" + }, + { + "tag": "c:gems/lapis" + }, + { + "item": "ars_nouveau:blank_parchment" + }, + { + "tag": "neoforge:gems/source" + }, + { + "tag": "neoforge:gems/source" + }, + { + "tag": "neoforge:gems/source" + }, + { + "tag": "neoforge:gems/source" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:warp_scroll" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/water_essence_to_bucket.json b/src/generated/resources/data/ars_nouveau/recipe/water_essence_to_bucket.json similarity index 80% rename from src/generated/resources/data/ars_nouveau/recipes/water_essence_to_bucket.json rename to src/generated/resources/data/ars_nouveau/recipe/water_essence_to_bucket.json index b458fde1c8..b7a8ccbed0 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/water_essence_to_bucket.json +++ b/src/generated/resources/data/ars_nouveau/recipe/water_essence_to_bucket.json @@ -10,6 +10,7 @@ } ], "result": { - "item": "minecraft:water_bucket" + "count": 1, + "id": "minecraft:water_bucket" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/water_essence_to_obsidian.json b/src/generated/resources/data/ars_nouveau/recipe/water_essence_to_obsidian.json similarity index 81% rename from src/generated/resources/data/ars_nouveau/recipes/water_essence_to_obsidian.json rename to src/generated/resources/data/ars_nouveau/recipe/water_essence_to_obsidian.json index 6a6399b3d3..87558cda22 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/water_essence_to_obsidian.json +++ b/src/generated/resources/data/ars_nouveau/recipe/water_essence_to_obsidian.json @@ -10,6 +10,7 @@ } ], "result": { - "item": "minecraft:obsidian" + "count": 1, + "id": "minecraft:obsidian" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/wilden_summon_alt.json b/src/generated/resources/data/ars_nouveau/recipe/wilden_summon_alt.json similarity index 85% rename from src/generated/resources/data/ars_nouveau/recipes/wilden_summon_alt.json rename to src/generated/resources/data/ars_nouveau/recipe/wilden_summon_alt.json index 0b342651bd..0d17be719d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/wilden_summon_alt.json +++ b/src/generated/resources/data/ars_nouveau/recipe/wilden_summon_alt.json @@ -19,6 +19,7 @@ } ], "result": { - "item": "ars_nouveau:ritual_wilden_summon" + "count": 1, + "id": "ars_nouveau:ritual_wilden_summon" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/wing_to_leather.json b/src/generated/resources/data/ars_nouveau/recipe/wing_to_leather.json similarity index 77% rename from src/generated/resources/data/ars_nouveau/recipes/wing_to_leather.json rename to src/generated/resources/data/ars_nouveau/recipe/wing_to_leather.json index e47e9f7c21..a7ac1f3fc2 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/wing_to_leather.json +++ b/src/generated/resources/data/ars_nouveau/recipe/wing_to_leather.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "minecraft:leather" + "count": 1, + "id": "minecraft:leather" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/wipe_spell_parchment.json b/src/generated/resources/data/ars_nouveau/recipe/wipe_spell_parchment.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/recipes/wipe_spell_parchment.json rename to src/generated/resources/data/ars_nouveau/recipe/wipe_spell_parchment.json index 394717428c..5978ba8cbb 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/wipe_spell_parchment.json +++ b/src/generated/resources/data/ars_nouveau/recipe/wipe_spell_parchment.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:blank_parchment" + "count": 1, + "id": "ars_nouveau:blank_parchment" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/wipe_starby_shard.json b/src/generated/resources/data/ars_nouveau/recipe/wipe_starby_shard.json similarity index 74% rename from src/generated/resources/data/ars_nouveau/recipes/wipe_starby_shard.json rename to src/generated/resources/data/ars_nouveau/recipe/wipe_starby_shard.json index 95b53c14bf..23cb11151c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/wipe_starby_shard.json +++ b/src/generated/resources/data/ars_nouveau/recipe/wipe_starby_shard.json @@ -7,6 +7,7 @@ } ], "result": { - "item": "ars_nouveau:starbuncle_shards" + "count": 1, + "id": "ars_nouveau:starbuncle_shards" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/wixie_hat.json b/src/generated/resources/data/ars_nouveau/recipe/wixie_hat.json similarity index 68% rename from src/generated/resources/data/ars_nouveau/recipes/wixie_hat.json rename to src/generated/resources/data/ars_nouveau/recipe/wixie_hat.json index 9f3de83d7d..26165bf242 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/wixie_hat.json +++ b/src/generated/resources/data/ars_nouveau/recipe/wixie_hat.json @@ -6,7 +6,7 @@ "item": "ars_nouveau:magebloom_fiber" }, "y": { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" } }, "pattern": [ @@ -15,7 +15,7 @@ "xxx" ], "result": { - "item": "ars_nouveau:wixie_hat" - }, - "show_notification": true + "count": 1, + "id": "ars_nouveau:wixie_hat" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/worn_notebook.json b/src/generated/resources/data/ars_nouveau/recipe/worn_notebook.json similarity index 66% rename from src/generated/resources/data/ars_nouveau/recipes/worn_notebook.json rename to src/generated/resources/data/ars_nouveau/recipe/worn_notebook.json index 69b984cd0e..80dcf4cccd 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/worn_notebook.json +++ b/src/generated/resources/data/ars_nouveau/recipe/worn_notebook.json @@ -3,13 +3,14 @@ "category": "misc", "ingredients": [ { - "tag": "forge:gems/lapis" + "tag": "c:gems/lapis" }, { "item": "minecraft:book" } ], "result": { - "item": "ars_nouveau:worn_notebook" + "count": 1, + "id": "ars_nouveau:worn_notebook" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/yellow_sbed.json b/src/generated/resources/data/ars_nouveau/recipe/yellow_sbed.json similarity index 67% rename from src/generated/resources/data/ars_nouveau/recipes/yellow_sbed.json rename to src/generated/resources/data/ars_nouveau/recipe/yellow_sbed.json index e76e3e66af..ca1fd110b3 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/yellow_sbed.json +++ b/src/generated/resources/data/ars_nouveau/recipe/yellow_sbed.json @@ -6,10 +6,11 @@ "tag": "ars_nouveau:summon_bed" }, { - "tag": "forge:dyes/yellow" + "tag": "c:dyes/yellow" } ], "result": { - "item": "ars_nouveau:yellow_sbed" + "count": 1, + "id": "ars_nouveau:yellow_sbed" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/abjuration_essence.json b/src/generated/resources/data/ars_nouveau/recipes/abjuration_essence.json new file mode 100644 index 0000000000..810328da6d --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/abjuration_essence.json @@ -0,0 +1,21 @@ +{ + "input": { + "tag": "neoforge:gems/source" + }, + "output": { + "count": 1, + "id": "ars_nouveau:abjuration_essence" + }, + "pedestalItems": [ + { + "item": "minecraft:fermented_spider_eye" + }, + { + "item": "minecraft:sugar" + }, + { + "item": "minecraft:milk_bucket" + } + ], + "source": 2000 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/air_essence.json b/src/generated/resources/data/ars_nouveau/recipes/air_essence.json new file mode 100644 index 0000000000..3e110e712f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/air_essence.json @@ -0,0 +1,21 @@ +{ + "input": { + "tag": "neoforge:gems/source" + }, + "output": { + "count": 1, + "id": "ars_nouveau:air_essence" + }, + "pedestalItems": [ + { + "item": "minecraft:feather" + }, + { + "item": "ars_nouveau:wilden_wing" + }, + { + "tag": "minecraft:arrows" + } + ], + "source": 2000 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/alchemists_crown.json b/src/generated/resources/data/ars_nouveau/recipes/alchemists_crown.json index ec3746a7f3..50ebbc707a 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/alchemists_crown.json +++ b/src/generated/resources/data/ars_nouveau/recipes/alchemists_crown.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:alchemists_crown" - }, "pedestalItems": [ { "item": "minecraft:glass_bottle" @@ -15,10 +11,12 @@ "item": "minecraft:glass_bottle" } ], - "reagent": [ - { - "item": "minecraft:golden_helmet" - } - ], + "reagent": { + "item": "minecraft:golden_helmet" + }, + "result": { + "count": 1, + "id": "ars_nouveau:alchemists_crown" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/imbuement_amethyst.json b/src/generated/resources/data/ars_nouveau/recipes/amethyst.json similarity index 53% rename from src/generated/resources/data/ars_nouveau/recipes/imbuement_amethyst.json rename to src/generated/resources/data/ars_nouveau/recipes/amethyst.json index 9af31d7ae1..65060c2227 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/imbuement_amethyst.json +++ b/src/generated/resources/data/ars_nouveau/recipes/amethyst.json @@ -1,10 +1,11 @@ { - "type": "ars_nouveau:imbuement", - "count": 1, "input": { "item": "minecraft:amethyst_shard" }, - "output": "ars_nouveau:source_gem", + "output": { + "count": 1, + "id": "ars_nouveau:source_gem" + }, "pedestalItems": [], "source": 500 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/imbuement_amethyst_block.json b/src/generated/resources/data/ars_nouveau/recipes/amethyst_block.json similarity index 51% rename from src/generated/resources/data/ars_nouveau/recipes/imbuement_amethyst_block.json rename to src/generated/resources/data/ars_nouveau/recipes/amethyst_block.json index cc2a0775cc..1049850c5b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/imbuement_amethyst_block.json +++ b/src/generated/resources/data/ars_nouveau/recipes/amethyst_block.json @@ -1,10 +1,11 @@ { - "type": "ars_nouveau:imbuement", - "count": 1, "input": { "item": "minecraft:amethyst_block" }, - "output": "ars_nouveau:source_gem_block", + "output": { + "count": 1, + "id": "ars_nouveau:source_gem_block" + }, "pedestalItems": [], "source": 2000 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/amplify_arrow.json b/src/generated/resources/data/ars_nouveau/recipes/amplify_arrow.json new file mode 100644 index 0000000000..8a78177b7d --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/amplify_arrow.json @@ -0,0 +1,21 @@ +{ + "input": { + "tag": "minecraft:arrows" + }, + "output": { + "count": 1, + "id": "ars_nouveau:amplify_arrow" + }, + "pedestalItems": [ + { + "item": "ars_nouveau:source_gem" + }, + { + "item": "ars_nouveau:air_essence" + }, + { + "tag": "c:gems/diamond" + } + ], + "source": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/amulet_of_mana_boost.json b/src/generated/resources/data/ars_nouveau/recipes/amulet_of_mana_boost.json index 1c5acf3236..329acaa7a2 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/amulet_of_mana_boost.json +++ b/src/generated/resources/data/ars_nouveau/recipes/amulet_of_mana_boost.json @@ -1,39 +1,37 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:amulet_of_mana_boost" - }, "pedestalItems": [ { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" - } - ], - "reagent": [ - { - "item": "ars_nouveau:dull_trinket" + "tag": "neoforge:gems/source" } ], + "reagent": { + "item": "ars_nouveau:dull_trinket" + }, + "result": { + "count": 1, + "id": "ars_nouveau:amulet_of_mana_boost" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/amulet_of_mana_regen.json b/src/generated/resources/data/ars_nouveau/recipes/amulet_of_mana_regen.json index 1aba0ae4b6..2f98eb21e6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/amulet_of_mana_regen.json +++ b/src/generated/resources/data/ars_nouveau/recipes/amulet_of_mana_regen.json @@ -1,39 +1,37 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:amulet_of_mana_regen" - }, "pedestalItems": [ { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" - } - ], - "reagent": [ - { - "item": "ars_nouveau:dull_trinket" + "tag": "neoforge:gems/source" } ], + "reagent": { + "item": "ars_nouveau:dull_trinket" + }, + "result": { + "count": 1, + "id": "ars_nouveau:amulet_of_mana_regen" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/aqua_affinity_1.json b/src/generated/resources/data/ars_nouveau/recipes/aqua_affinity_1.json index 1f775a21f6..ebb4e925de 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/aqua_affinity_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/aqua_affinity_1.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:aqua_affinity", "level": 1, "pedestalItems": [ { - "item": { - "tag": "minecraft:fishes" - } + "tag": "minecraft:fishes" }, { - "item": { - "tag": "minecraft:fishes" - } + "tag": "minecraft:fishes" }, { - "item": { - "tag": "minecraft:fishes" - } + "tag": "minecraft:fishes" }, { - "item": { - "tag": "minecraft:fishes" - } + "tag": "minecraft:fishes" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/arcanist_boots.json b/src/generated/resources/data/ars_nouveau/recipes/arcanist_boots.json index 207553a6fb..e83fbbd6ac 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/arcanist_boots.json +++ b/src/generated/resources/data/ars_nouveau/recipes/arcanist_boots.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:arcanist_boots" - }, "pedestalItems": [ { "item": "ars_nouveau:magebloom_fiber" @@ -18,10 +14,12 @@ "item": "ars_nouveau:magebloom_fiber" } ], - "reagent": [ - { - "item": "minecraft:iron_boots" - } - ], + "reagent": { + "item": "minecraft:iron_boots" + }, + "result": { + "count": 1, + "id": "ars_nouveau:arcanist_boots" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/arcanist_hood.json b/src/generated/resources/data/ars_nouveau/recipes/arcanist_hood.json index 941b59c64c..ff81257ecd 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/arcanist_hood.json +++ b/src/generated/resources/data/ars_nouveau/recipes/arcanist_hood.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:arcanist_hood" - }, "pedestalItems": [ { "item": "ars_nouveau:magebloom_fiber" @@ -18,10 +14,12 @@ "item": "ars_nouveau:magebloom_fiber" } ], - "reagent": [ - { - "item": "minecraft:iron_helmet" - } - ], + "reagent": { + "item": "minecraft:iron_helmet" + }, + "result": { + "count": 1, + "id": "ars_nouveau:arcanist_hood" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/arcanist_leggings.json b/src/generated/resources/data/ars_nouveau/recipes/arcanist_leggings.json index d130be7624..e4c98d4da3 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/arcanist_leggings.json +++ b/src/generated/resources/data/ars_nouveau/recipes/arcanist_leggings.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:arcanist_leggings" - }, "pedestalItems": [ { "item": "ars_nouveau:magebloom_fiber" @@ -18,10 +14,12 @@ "item": "ars_nouveau:magebloom_fiber" } ], - "reagent": [ - { - "item": "minecraft:iron_leggings" - } - ], + "reagent": { + "item": "minecraft:iron_leggings" + }, + "result": { + "count": 1, + "id": "ars_nouveau:arcanist_leggings" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/arcanist_robes.json b/src/generated/resources/data/ars_nouveau/recipes/arcanist_robes.json index 1fa7aeeac2..37f0158fda 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/arcanist_robes.json +++ b/src/generated/resources/data/ars_nouveau/recipes/arcanist_robes.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:arcanist_robes" - }, "pedestalItems": [ { "item": "ars_nouveau:magebloom_fiber" @@ -18,10 +14,12 @@ "item": "ars_nouveau:magebloom_fiber" } ], - "reagent": [ - { - "item": "minecraft:iron_chestplate" - } - ], + "reagent": { + "item": "minecraft:iron_chestplate" + }, + "result": { + "count": 1, + "id": "ars_nouveau:arcanist_robes" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_1.json b/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_1.json index 6c8e099e58..59672dfbad 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_1.json @@ -1,27 +1,18 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:bane_of_arthropods", "level": 1, "pedestalItems": [ { - "item": { - "item": "minecraft:spider_eye" - } + "item": "minecraft:spider_eye" }, { - "item": { - "item": "minecraft:spider_eye" - } + "item": "minecraft:spider_eye" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_2.json b/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_2.json index 006b4f142d..6f7f078afb 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_2.json @@ -1,32 +1,21 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:bane_of_arthropods", "level": 2, "pedestalItems": [ { - "item": { - "item": "minecraft:spider_eye" - } + "item": "minecraft:spider_eye" }, { - "item": { - "item": "minecraft:spider_eye" - } + "item": "minecraft:spider_eye" }, { - "item": { - "item": "minecraft:spider_eye" - } + "item": "minecraft:spider_eye" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_3.json b/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_3.json index 7e365c6808..b07fdb3f89 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_3.json @@ -1,37 +1,24 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:bane_of_arthropods", "level": 3, "pedestalItems": [ { - "item": { - "item": "minecraft:fermented_spider_eye" - } + "item": "minecraft:fermented_spider_eye" }, { - "item": { - "item": "minecraft:fermented_spider_eye" - } + "item": "minecraft:fermented_spider_eye" }, { - "item": { - "item": "minecraft:fermented_spider_eye" - } + "item": "minecraft:fermented_spider_eye" }, { - "item": { - "item": "minecraft:fermented_spider_eye" - } + "item": "minecraft:fermented_spider_eye" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_4.json b/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_4.json index 60bf793f9e..b0c8d942ca 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_4.json +++ b/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_4.json @@ -1,42 +1,27 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:bane_of_arthropods", "level": 4, "pedestalItems": [ { - "item": { - "item": "minecraft:fermented_spider_eye" - } + "item": "minecraft:fermented_spider_eye" }, { - "item": { - "item": "minecraft:fermented_spider_eye" - } + "item": "minecraft:fermented_spider_eye" }, { - "item": { - "item": "minecraft:fermented_spider_eye" - } + "item": "minecraft:fermented_spider_eye" }, { - "item": { - "item": "minecraft:fermented_spider_eye" - } + "item": "minecraft:fermented_spider_eye" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 6500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_5.json b/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_5.json index 4334d235fe..a4cfa27e65 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_5.json +++ b/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_5.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:bane_of_arthropods", "level": 5, "pedestalItems": [ { - "item": { - "item": "minecraft:fermented_spider_eye" - } + "item": "minecraft:fermented_spider_eye" }, { - "item": { - "item": "minecraft:fermented_spider_eye" - } + "item": "minecraft:fermented_spider_eye" }, { - "item": { - "item": "minecraft:fermented_spider_eye" - } + "item": "minecraft:fermented_spider_eye" }, { - "item": { - "item": "minecraft:fermented_spider_eye" - } + "item": "minecraft:fermented_spider_eye" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 8000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/battlemage_boots.json b/src/generated/resources/data/ars_nouveau/recipes/battlemage_boots.json index 5cb3cc0a84..d74301b26e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/battlemage_boots.json +++ b/src/generated/resources/data/ars_nouveau/recipes/battlemage_boots.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:battlemage_boots" - }, "pedestalItems": [ { "item": "ars_nouveau:magebloom_fiber" @@ -18,10 +14,12 @@ "item": "ars_nouveau:magebloom_fiber" } ], - "reagent": [ - { - "item": "minecraft:diamond_boots" - } - ], + "reagent": { + "item": "minecraft:diamond_boots" + }, + "result": { + "count": 1, + "id": "ars_nouveau:battlemage_boots" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/battlemage_hood.json b/src/generated/resources/data/ars_nouveau/recipes/battlemage_hood.json index 0e96177cd6..656ada6b4a 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/battlemage_hood.json +++ b/src/generated/resources/data/ars_nouveau/recipes/battlemage_hood.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:battlemage_hood" - }, "pedestalItems": [ { "item": "ars_nouveau:magebloom_fiber" @@ -18,10 +14,12 @@ "item": "ars_nouveau:magebloom_fiber" } ], - "reagent": [ - { - "item": "minecraft:diamond_helmet" - } - ], + "reagent": { + "item": "minecraft:diamond_helmet" + }, + "result": { + "count": 1, + "id": "ars_nouveau:battlemage_hood" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/battlemage_leggings.json b/src/generated/resources/data/ars_nouveau/recipes/battlemage_leggings.json index 8937082f12..bccf241e1f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/battlemage_leggings.json +++ b/src/generated/resources/data/ars_nouveau/recipes/battlemage_leggings.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:battlemage_leggings" - }, "pedestalItems": [ { "item": "ars_nouveau:magebloom_fiber" @@ -18,10 +14,12 @@ "item": "ars_nouveau:magebloom_fiber" } ], - "reagent": [ - { - "item": "minecraft:diamond_leggings" - } - ], + "reagent": { + "item": "minecraft:diamond_leggings" + }, + "result": { + "count": 1, + "id": "ars_nouveau:battlemage_leggings" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/battlemage_robes.json b/src/generated/resources/data/ars_nouveau/recipes/battlemage_robes.json index d26857d947..5cb3991772 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/battlemage_robes.json +++ b/src/generated/resources/data/ars_nouveau/recipes/battlemage_robes.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:battlemage_robes" - }, "pedestalItems": [ { "item": "ars_nouveau:magebloom_fiber" @@ -18,10 +14,12 @@ "item": "ars_nouveau:magebloom_fiber" } ], - "reagent": [ - { - "item": "minecraft:diamond_chestplate" - } - ], + "reagent": { + "item": "minecraft:diamond_chestplate" + }, + "result": { + "count": 1, + "id": "ars_nouveau:battlemage_robes" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/belt_of_levitation.json b/src/generated/resources/data/ars_nouveau/recipes/belt_of_levitation.json index 6c16ef0aa1..2eabdcc7a1 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/belt_of_levitation.json +++ b/src/generated/resources/data/ars_nouveau/recipes/belt_of_levitation.json @@ -1,21 +1,17 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:belt_of_levitation" - }, "pedestalItems": [ { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { "item": "minecraft:feather" @@ -30,10 +26,12 @@ "item": "ars_nouveau:air_essence" } ], - "reagent": [ - { - "item": "ars_nouveau:mundane_belt" - } - ], + "reagent": { + "item": "ars_nouveau:mundane_belt" + }, + "result": { + "count": 1, + "id": "ars_nouveau:belt_of_levitation" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/belt_of_unstable_gifts.json b/src/generated/resources/data/ars_nouveau/recipes/belt_of_unstable_gifts.json index d6f6df5c90..f96e96a150 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/belt_of_unstable_gifts.json +++ b/src/generated/resources/data/ars_nouveau/recipes/belt_of_unstable_gifts.json @@ -1,39 +1,37 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:belt_of_unstable_gifts" - }, "pedestalItems": [ { "item": "minecraft:sugar" }, { - "tag": "forge:crops/nether_wart" + "tag": "c:crops/nether_wart" }, { - "tag": "forge:rods/blaze" + "tag": "c:rods/blaze" }, { - "tag": "forge:dusts/glowstone" + "tag": "c:dusts/glowstone" }, { "item": "minecraft:fermented_spider_eye" }, { - "tag": "forge:dusts/redstone" + "tag": "c:dusts/redstone" }, { "item": "minecraft:brewing_stand" }, { - "tag": "forge:feathers" - } - ], - "reagent": [ - { - "item": "ars_nouveau:mundane_belt" + "tag": "c:feathers" } ], + "reagent": { + "item": "ars_nouveau:mundane_belt" + }, + "result": { + "count": 1, + "id": "ars_nouveau:belt_of_unstable_gifts" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/blast_protection_1.json b/src/generated/resources/data/ars_nouveau/recipes/blast_protection_1.json index ea460171eb..59b8714bda 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/blast_protection_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/blast_protection_1.json @@ -1,22 +1,15 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:blast_protection", "level": 1, "pedestalItems": [ { - "item": { - "tag": "forge:storage_blocks/iron" - } + "tag": "c:storage_blocks/iron" }, { - "item": { - "tag": "forge:storage_blocks/iron" - } + "tag": "c:storage_blocks/iron" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/blast_protection_2.json b/src/generated/resources/data/ars_nouveau/recipes/blast_protection_2.json index aa1a2294fa..c3090d81a3 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/blast_protection_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/blast_protection_2.json @@ -1,32 +1,21 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:blast_protection", "level": 2, "pedestalItems": [ { - "item": { - "tag": "forge:storage_blocks/iron" - } + "tag": "c:storage_blocks/iron" }, { - "item": { - "tag": "forge:storage_blocks/iron" - } + "tag": "c:storage_blocks/iron" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 4000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/blast_protection_3.json b/src/generated/resources/data/ars_nouveau/recipes/blast_protection_3.json index 6558f0320b..19ec3e872f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/blast_protection_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/blast_protection_3.json @@ -1,37 +1,24 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:blast_protection", "level": 3, "pedestalItems": [ { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:obsidian" - } + "tag": "c:obsidians" }, { - "item": { - "tag": "forge:obsidian" - } + "tag": "c:obsidians" } ], "sourceCost": 6000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/blast_protection_4.json b/src/generated/resources/data/ars_nouveau/recipes/blast_protection_4.json index dea39f38f2..82de55fe6b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/blast_protection_4.json +++ b/src/generated/resources/data/ars_nouveau/recipes/blast_protection_4.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:blast_protection", "level": 4, "pedestalItems": [ { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/gold" - } + "tag": "c:storage_blocks/gold" }, { - "item": { - "tag": "forge:storage_blocks/gold" - } + "tag": "c:storage_blocks/gold" } ], "sourceCost": 8000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/blue_dye.json b/src/generated/resources/data/ars_nouveau/recipes/blue_dye.json new file mode 100644 index 0000000000..7d1cb8d0c5 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/blue_dye.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:cornflower" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 2, + "id": "minecraft:blue_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/brazier_relay.json b/src/generated/resources/data/ars_nouveau/recipes/brazier_relay.json index 160f4f174f..b4308efcdb 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/brazier_relay.json +++ b/src/generated/resources/data/ars_nouveau/recipes/brazier_relay.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:brazier_relay" - }, "pedestalItems": [ { "item": "ars_nouveau:manipulation_essence" @@ -15,10 +11,12 @@ "item": "ars_nouveau:manipulation_essence" } ], - "reagent": [ - { - "item": "ars_nouveau:ritual_brazier" - } - ], + "reagent": { + "item": "ars_nouveau:ritual_brazier" + }, + "result": { + "count": 1, + "id": "ars_nouveau:brazier_relay" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/brown_dye.json b/src/generated/resources/data/ars_nouveau/recipes/brown_dye.json new file mode 100644 index 0000000000..dfe031c9b6 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/brown_dye.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:cocoa_beans" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 2, + "id": "minecraft:brown_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/budding_conversion/budding_amethyst.json b/src/generated/resources/data/ars_nouveau/recipes/budding_conversion/budding_amethyst.json index 222a5b3512..077538d059 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/budding_conversion/budding_amethyst.json +++ b/src/generated/resources/data/ars_nouveau/recipes/budding_conversion/budding_amethyst.json @@ -1,6 +1,4 @@ { - "type": "ars_nouveau:budding_conversion", - "id": "ars_nouveau:budding_amethyst", "input": "minecraft:amethyst_block", "result": "minecraft:budding_amethyst" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/burst.json b/src/generated/resources/data/ars_nouveau/recipes/burst.json index 38cfaa7281..09cf3f17c8 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/burst.json +++ b/src/generated/resources/data/ars_nouveau/recipes/burst.json @@ -1,43 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 160, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "minecraft:tnt" - } - }, - { - "item": { - "item": "minecraft:tnt" - } - }, - { - "item": { - "item": "minecraft:tnt" - } - }, - { - "item": { - "item": "minecraft:tnt" - } - }, - { - "item": { - "item": "minecraft:tnt" - } - }, - { - "item": { - "item": "minecraft:firework_star" - } - } - ], - "output": "ars_nouveau:burst" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:burst" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/cobblestone.json b/src/generated/resources/data/ars_nouveau/recipes/cobblestone.json new file mode 100644 index 0000000000..71038c203d --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/cobblestone.json @@ -0,0 +1,15 @@ +{ + "input": { + "tag": "c:cobblestones" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 1, + "id": "minecraft:gravel" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/conjuration_essence.json b/src/generated/resources/data/ars_nouveau/recipes/conjuration_essence.json new file mode 100644 index 0000000000..dcb111be98 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/conjuration_essence.json @@ -0,0 +1,21 @@ +{ + "input": { + "tag": "neoforge:gems/source" + }, + "output": { + "count": 1, + "id": "ars_nouveau:conjuration_essence" + }, + "pedestalItems": [ + { + "item": "ars_nouveau:wilden_horn" + }, + { + "item": "ars_nouveau:starbuncle_shards" + }, + { + "item": "minecraft:book" + } + ], + "source": 2000 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_blue_dye.json b/src/generated/resources/data/ars_nouveau/recipes/crush_blue_dye.json deleted file mode 100644 index 3d6c3ae577..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_blue_dye.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:cornflower" - }, - "output": [ - { - "chance": 1.0, - "count": 2, - "item": "minecraft:blue_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_brown_dye.json b/src/generated/resources/data/ars_nouveau/recipes/crush_brown_dye.json deleted file mode 100644 index 2e00fe4b1d..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_brown_dye.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:cocoa_beans" - }, - "output": [ - { - "chance": 1.0, - "count": 2, - "item": "minecraft:brown_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_cobblestone.json b/src/generated/resources/data/ars_nouveau/recipes/crush_cobblestone.json deleted file mode 100644 index 569866e3da..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_cobblestone.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "tag": "forge:cobblestone" - }, - "output": [ - { - "chance": 1.0, - "count": 1, - "item": "minecraft:gravel", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_glowstone_block_to_dust.json b/src/generated/resources/data/ars_nouveau/recipes/crush_glowstone_block_to_dust.json deleted file mode 100644 index 7570d46cf7..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_glowstone_block_to_dust.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:glowstone" - }, - "output": [ - { - "chance": 1.0, - "count": 4, - "item": "minecraft:glowstone_dust", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_gravel.json b/src/generated/resources/data/ars_nouveau/recipes/crush_gravel.json deleted file mode 100644 index c2347c7b06..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_gravel.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "tag": "forge:gravel" - }, - "output": [ - { - "chance": 1.0, - "count": 1, - "item": "minecraft:sand", - "maxRange": 1 - }, - { - "chance": 0.02, - "count": 1, - "item": "minecraft:flint", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_light_blue_dye.json b/src/generated/resources/data/ars_nouveau/recipes/crush_light_blue_dye.json deleted file mode 100644 index ce07aac4d8..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_light_blue_dye.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:blue_orchid" - }, - "output": [ - { - "chance": 1.0, - "count": 2, - "item": "minecraft:light_blue_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_light_gray_dye_azure.json b/src/generated/resources/data/ars_nouveau/recipes/crush_light_gray_dye_azure.json deleted file mode 100644 index 1607468d00..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_light_gray_dye_azure.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:azure_bluet" - }, - "output": [ - { - "chance": 1.0, - "count": 2, - "item": "minecraft:light_gray_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_light_gray_dye_oxeye.json b/src/generated/resources/data/ars_nouveau/recipes/crush_light_gray_dye_oxeye.json deleted file mode 100644 index 22b65a465f..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_light_gray_dye_oxeye.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:oxeye_daisy" - }, - "output": [ - { - "chance": 1.0, - "count": 2, - "item": "minecraft:light_gray_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_light_gray_dye_tulip.json b/src/generated/resources/data/ars_nouveau/recipes/crush_light_gray_dye_tulip.json deleted file mode 100644 index ef91a3ec8c..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_light_gray_dye_tulip.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:white_tulip" - }, - "output": [ - { - "chance": 1.0, - "count": 2, - "item": "minecraft:light_gray_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_magenta_dye.json b/src/generated/resources/data/ars_nouveau/recipes/crush_magenta_dye.json deleted file mode 100644 index 80b15fea5a..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_magenta_dye.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:allium" - }, - "output": [ - { - "chance": 1.0, - "count": 2, - "item": "minecraft:magenta_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_magenta_dye_lilac.json b/src/generated/resources/data/ars_nouveau/recipes/crush_magenta_dye_lilac.json deleted file mode 100644 index 68c0ca78c3..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_magenta_dye_lilac.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:lilac" - }, - "output": [ - { - "chance": 1.0, - "count": 4, - "item": "minecraft:magenta_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_orange_dye.json b/src/generated/resources/data/ars_nouveau/recipes/crush_orange_dye.json deleted file mode 100644 index 0dd02841f3..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_orange_dye.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:orange_tulip" - }, - "output": [ - { - "chance": 1.0, - "count": 2, - "item": "minecraft:orange_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_pink_dye.json b/src/generated/resources/data/ars_nouveau/recipes/crush_pink_dye.json deleted file mode 100644 index aa20a69e2d..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_pink_dye.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:pink_tulip" - }, - "output": [ - { - "chance": 1.0, - "count": 2, - "item": "minecraft:pink_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_pink_dye_peony.json b/src/generated/resources/data/ars_nouveau/recipes/crush_pink_dye_peony.json deleted file mode 100644 index 434d953d4d..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_pink_dye_peony.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:peony" - }, - "output": [ - { - "chance": 1.0, - "count": 4, - "item": "minecraft:pink_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_quartz_block_to_quartz.json b/src/generated/resources/data/ars_nouveau/recipes/crush_quartz_block_to_quartz.json deleted file mode 100644 index db4b1c8b12..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_quartz_block_to_quartz.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "tag": "forge:storage_blocks/quartz" - }, - "output": [ - { - "chance": 1.0, - "count": 4, - "item": "minecraft:quartz", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_red_dye_beetroot.json b/src/generated/resources/data/ars_nouveau/recipes/crush_red_dye_beetroot.json deleted file mode 100644 index 448406f68a..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_red_dye_beetroot.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:beetroot" - }, - "output": [ - { - "chance": 1.0, - "count": 2, - "item": "minecraft:red_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_red_dye_poppy.json b/src/generated/resources/data/ars_nouveau/recipes/crush_red_dye_poppy.json deleted file mode 100644 index deabf82b20..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_red_dye_poppy.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:poppy" - }, - "output": [ - { - "chance": 1.0, - "count": 2, - "item": "minecraft:red_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_red_dye_rose_bush.json b/src/generated/resources/data/ars_nouveau/recipes/crush_red_dye_rose_bush.json deleted file mode 100644 index 8398331c32..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_red_dye_rose_bush.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:rose_bush" - }, - "output": [ - { - "chance": 1.0, - "count": 4, - "item": "minecraft:red_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_red_dye_tulip.json b/src/generated/resources/data/ars_nouveau/recipes/crush_red_dye_tulip.json deleted file mode 100644 index c5bee897d5..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_red_dye_tulip.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:red_tulip" - }, - "output": [ - { - "chance": 1.0, - "count": 2, - "item": "minecraft:red_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_sandstone_to_sand.json b/src/generated/resources/data/ars_nouveau/recipes/crush_sandstone_to_sand.json deleted file mode 100644 index 400740f9fd..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_sandstone_to_sand.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:sandstone" - }, - "output": [ - { - "chance": 1.0, - "count": 1, - "item": "minecraft:sand", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_stone.json b/src/generated/resources/data/ars_nouveau/recipes/crush_stone.json deleted file mode 100644 index 8cd6149b8c..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_stone.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "tag": "forge:stone" - }, - "output": [ - { - "chance": 1.0, - "count": 1, - "item": "minecraft:gravel", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_sugar_cane.json b/src/generated/resources/data/ars_nouveau/recipes/crush_sugar_cane.json deleted file mode 100644 index bbb4869ae3..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_sugar_cane.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:sugar_cane" - }, - "output": [ - { - "chance": 1.0, - "count": 2, - "item": "minecraft:sugar", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_terracotta.json b/src/generated/resources/data/ars_nouveau/recipes/crush_terracotta.json deleted file mode 100644 index b47cafe674..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_terracotta.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:terracotta" - }, - "output": [ - { - "chance": 1.0, - "count": 1, - "item": "minecraft:red_sand", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_white_dye.json b/src/generated/resources/data/ars_nouveau/recipes/crush_white_dye.json deleted file mode 100644 index fea16e7ee8..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_white_dye.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:lily_of_the_valley" - }, - "output": [ - { - "chance": 1.0, - "count": 2, - "item": "minecraft:white_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_yellow_dye.json b/src/generated/resources/data/ars_nouveau/recipes/crush_yellow_dye.json deleted file mode 100644 index 1029537596..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_yellow_dye.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:dandelion" - }, - "output": [ - { - "chance": 1.0, - "count": 2, - "item": "minecraft:yellow_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/crush_yellow_dye_sunflower.json b/src/generated/resources/data/ars_nouveau/recipes/crush_yellow_dye_sunflower.json deleted file mode 100644 index 65c9c54c21..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/crush_yellow_dye_sunflower.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "ars_nouveau:crush", - "input": { - "item": "minecraft:sunflower" - }, - "output": [ - { - "chance": 1.0, - "count": 4, - "item": "minecraft:yellow_dye", - "maxRange": 1 - } - ], - "skip_block_place": false -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/depth_strider_1.json b/src/generated/resources/data/ars_nouveau/recipes/depth_strider_1.json index 6b1ac619e5..1d84baf848 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/depth_strider_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/depth_strider_1.json @@ -1,27 +1,18 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:depth_strider", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 3000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/depth_strider_2.json b/src/generated/resources/data/ars_nouveau/recipes/depth_strider_2.json index 7609c69245..18634a2fca 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/depth_strider_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/depth_strider_2.json @@ -1,37 +1,24 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:depth_strider", "level": 2, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "item": "minecraft:prismarine_shard" - } + "item": "minecraft:prismarine_shard" }, { - "item": { - "item": "minecraft:prismarine_shard" - } + "item": "minecraft:prismarine_shard" } ], "sourceCost": 6000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/depth_strider_3.json b/src/generated/resources/data/ars_nouveau/recipes/depth_strider_3.json index b4f045465e..5a793d6a10 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/depth_strider_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/depth_strider_3.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:depth_strider", "level": 3, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "item": "minecraft:nautilus_shell" - } + "item": "minecraft:nautilus_shell" } ], "sourceCost": 9000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/dispel_entity/blaze_powder.json b/src/generated/resources/data/ars_nouveau/recipes/dispel_entity/blaze_powder.json index ab8e49bf72..3f9c094f3c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/dispel_entity/blaze_powder.json +++ b/src/generated/resources/data/ars_nouveau/recipes/dispel_entity/blaze_powder.json @@ -1,7 +1,5 @@ { - "type": "ars_nouveau:dispel_entity", "entity": "minecraft:blaze", - "id": "ars_nouveau:blaze_powder", "loot_conditions": [ { "condition": "minecraft:entity_properties", diff --git a/src/generated/resources/data/ars_nouveau/recipes/dominion_wand.json b/src/generated/resources/data/ars_nouveau/recipes/dominion_wand.json index e1988eabcf..c39b82d5bc 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/dominion_wand.json +++ b/src/generated/resources/data/ars_nouveau/recipes/dominion_wand.json @@ -1,24 +1,22 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:dominion_wand" - }, "pedestalItems": [ { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:ingots/gold" - } - ], - "reagent": [ - { - "item": "minecraft:stick" + "tag": "c:ingots/gold" } ], + "reagent": { + "item": "minecraft:stick" + }, + "result": { + "count": 1, + "id": "ars_nouveau:dominion_wand" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/drygmy_charm.json b/src/generated/resources/data/ars_nouveau/recipes/drygmy_charm.json index 1ce7eac9c2..27403c0bc6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/drygmy_charm.json +++ b/src/generated/resources/data/ars_nouveau/recipes/drygmy_charm.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:drygmy_charm" - }, "pedestalItems": [ { "tag": "minecraft:fishes" @@ -18,22 +14,24 @@ "item": "minecraft:carrot" }, { - "tag": "forge:seeds" + "tag": "c:seeds" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" - } - ], - "reagent": [ - { - "item": "ars_nouveau:drygmy_shard" + "tag": "neoforge:gems/source" } ], + "reagent": { + "item": "ars_nouveau:drygmy_shard" + }, + "result": { + "count": 1, + "id": "ars_nouveau:drygmy_charm" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dye_apprentice_spell_book.json b/src/generated/resources/data/ars_nouveau/recipes/dye_apprentice_spell_book.json deleted file mode 100644 index e36f9e1208..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/dye_apprentice_spell_book.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "ars_nouveau:dye", - "ingredients": [ - { - "tag": "forge:dyes" - }, - { - "item": "ars_nouveau:apprentice_spell_book" - } - ], - "result": { - "item": "ars_nouveau:apprentice_spell_book" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dye_arcanist_boots.json b/src/generated/resources/data/ars_nouveau/recipes/dye_arcanist_boots.json deleted file mode 100644 index 3d114e0004..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/dye_arcanist_boots.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "ars_nouveau:dye", - "ingredients": [ - { - "tag": "forge:dyes" - }, - { - "item": "ars_nouveau:arcanist_boots" - } - ], - "result": { - "item": "ars_nouveau:arcanist_boots" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dye_arcanist_hood.json b/src/generated/resources/data/ars_nouveau/recipes/dye_arcanist_hood.json deleted file mode 100644 index 59d2f9ae05..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/dye_arcanist_hood.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "ars_nouveau:dye", - "ingredients": [ - { - "tag": "forge:dyes" - }, - { - "item": "ars_nouveau:arcanist_hood" - } - ], - "result": { - "item": "ars_nouveau:arcanist_hood" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dye_arcanist_leggings.json b/src/generated/resources/data/ars_nouveau/recipes/dye_arcanist_leggings.json deleted file mode 100644 index 2b6d5696a3..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/dye_arcanist_leggings.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "ars_nouveau:dye", - "ingredients": [ - { - "tag": "forge:dyes" - }, - { - "item": "ars_nouveau:arcanist_leggings" - } - ], - "result": { - "item": "ars_nouveau:arcanist_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dye_arcanist_robes.json b/src/generated/resources/data/ars_nouveau/recipes/dye_arcanist_robes.json deleted file mode 100644 index 152f3fa20b..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/dye_arcanist_robes.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "ars_nouveau:dye", - "ingredients": [ - { - "tag": "forge:dyes" - }, - { - "item": "ars_nouveau:arcanist_robes" - } - ], - "result": { - "item": "ars_nouveau:arcanist_robes" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dye_archmage_spell_book.json b/src/generated/resources/data/ars_nouveau/recipes/dye_archmage_spell_book.json deleted file mode 100644 index 6881a3f5ea..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/dye_archmage_spell_book.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "ars_nouveau:dye", - "ingredients": [ - { - "tag": "forge:dyes" - }, - { - "item": "ars_nouveau:archmage_spell_book" - } - ], - "result": { - "item": "ars_nouveau:archmage_spell_book" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dye_battlemage_boots.json b/src/generated/resources/data/ars_nouveau/recipes/dye_battlemage_boots.json deleted file mode 100644 index aa96899281..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/dye_battlemage_boots.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "ars_nouveau:dye", - "ingredients": [ - { - "tag": "forge:dyes" - }, - { - "item": "ars_nouveau:battlemage_boots" - } - ], - "result": { - "item": "ars_nouveau:battlemage_boots" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dye_battlemage_hood.json b/src/generated/resources/data/ars_nouveau/recipes/dye_battlemage_hood.json deleted file mode 100644 index 027c5868d5..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/dye_battlemage_hood.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "ars_nouveau:dye", - "ingredients": [ - { - "tag": "forge:dyes" - }, - { - "item": "ars_nouveau:battlemage_hood" - } - ], - "result": { - "item": "ars_nouveau:battlemage_hood" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dye_battlemage_leggings.json b/src/generated/resources/data/ars_nouveau/recipes/dye_battlemage_leggings.json deleted file mode 100644 index 76f7f2345e..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/dye_battlemage_leggings.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "ars_nouveau:dye", - "ingredients": [ - { - "tag": "forge:dyes" - }, - { - "item": "ars_nouveau:battlemage_leggings" - } - ], - "result": { - "item": "ars_nouveau:battlemage_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dye_battlemage_robes.json b/src/generated/resources/data/ars_nouveau/recipes/dye_battlemage_robes.json deleted file mode 100644 index 9ecb0470a2..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/dye_battlemage_robes.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "ars_nouveau:dye", - "ingredients": [ - { - "tag": "forge:dyes" - }, - { - "item": "ars_nouveau:battlemage_robes" - } - ], - "result": { - "item": "ars_nouveau:battlemage_robes" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dye_novice_spell_book.json b/src/generated/resources/data/ars_nouveau/recipes/dye_novice_spell_book.json deleted file mode 100644 index ffb8831209..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/dye_novice_spell_book.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "ars_nouveau:dye", - "ingredients": [ - { - "tag": "forge:dyes" - }, - { - "item": "ars_nouveau:novice_spell_book" - } - ], - "result": { - "item": "ars_nouveau:novice_spell_book" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dye_sorcerer_boots.json b/src/generated/resources/data/ars_nouveau/recipes/dye_sorcerer_boots.json deleted file mode 100644 index 1d723562e2..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/dye_sorcerer_boots.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "ars_nouveau:dye", - "ingredients": [ - { - "tag": "forge:dyes" - }, - { - "item": "ars_nouveau:sorcerer_boots" - } - ], - "result": { - "item": "ars_nouveau:sorcerer_boots" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dye_sorcerer_hood.json b/src/generated/resources/data/ars_nouveau/recipes/dye_sorcerer_hood.json deleted file mode 100644 index e13132bc37..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/dye_sorcerer_hood.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "ars_nouveau:dye", - "ingredients": [ - { - "tag": "forge:dyes" - }, - { - "item": "ars_nouveau:sorcerer_hood" - } - ], - "result": { - "item": "ars_nouveau:sorcerer_hood" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dye_sorcerer_leggings.json b/src/generated/resources/data/ars_nouveau/recipes/dye_sorcerer_leggings.json deleted file mode 100644 index 6163aa0680..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/dye_sorcerer_leggings.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "ars_nouveau:dye", - "ingredients": [ - { - "tag": "forge:dyes" - }, - { - "item": "ars_nouveau:sorcerer_leggings" - } - ], - "result": { - "item": "ars_nouveau:sorcerer_leggings" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/dye_sorcerer_robes.json b/src/generated/resources/data/ars_nouveau/recipes/dye_sorcerer_robes.json deleted file mode 100644 index 0c83403a8f..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/dye_sorcerer_robes.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "ars_nouveau:dye", - "ingredients": [ - { - "tag": "forge:dyes" - }, - { - "item": "ars_nouveau:sorcerer_robes" - } - ], - "result": { - "item": "ars_nouveau:sorcerer_robes" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/earth_essence.json b/src/generated/resources/data/ars_nouveau/recipes/earth_essence.json new file mode 100644 index 0000000000..19d0b55be2 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/earth_essence.json @@ -0,0 +1,21 @@ +{ + "input": { + "tag": "neoforge:gems/source" + }, + "output": { + "count": 1, + "id": "ars_nouveau:earth_essence" + }, + "pedestalItems": [ + { + "tag": "c:ingots/iron" + }, + { + "tag": "c:seeds" + }, + { + "tag": "minecraft:dirt" + } + ], + "source": 2000 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/efficiency_1.json b/src/generated/resources/data/ars_nouveau/recipes/efficiency_1.json index 8307aa4d6b..f8da270896 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/efficiency_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/efficiency_1.json @@ -1,27 +1,18 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:efficiency", "level": 1, "pedestalItems": [ { - "item": { - "item": "minecraft:sugar" - } + "item": "minecraft:sugar" }, { - "item": { - "item": "minecraft:iron_pickaxe" - } + "item": "minecraft:iron_pickaxe" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/efficiency_2.json b/src/generated/resources/data/ars_nouveau/recipes/efficiency_2.json index 678ace037c..58649e18e5 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/efficiency_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/efficiency_2.json @@ -1,27 +1,18 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:efficiency", "level": 2, "pedestalItems": [ { - "item": { - "tag": "forge:storage_blocks/redstone" - } + "tag": "c:storage_blocks/redstone" }, { - "item": { - "item": "minecraft:golden_pickaxe" - } + "item": "minecraft:golden_pickaxe" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/efficiency_3.json b/src/generated/resources/data/ars_nouveau/recipes/efficiency_3.json index db3ef491c4..4859c2a00f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/efficiency_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/efficiency_3.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:efficiency", "level": 3, "pedestalItems": [ { - "item": { - "tag": "forge:storage_blocks/redstone" - } + "tag": "c:storage_blocks/redstone" }, { - "item": { - "tag": "forge:storage_blocks/redstone" - } + "tag": "c:storage_blocks/redstone" }, { - "item": { - "item": "minecraft:golden_pickaxe" - } + "item": "minecraft:golden_pickaxe" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:obsidian" - } + "tag": "c:obsidians" }, { - "item": { - "tag": "forge:obsidian" - } + "tag": "c:obsidians" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/efficiency_4.json b/src/generated/resources/data/ars_nouveau/recipes/efficiency_4.json index b0a7b05f14..c97e1018d9 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/efficiency_4.json +++ b/src/generated/resources/data/ars_nouveau/recipes/efficiency_4.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:efficiency", "level": 4, "pedestalItems": [ { - "item": { - "tag": "forge:storage_blocks/redstone" - } + "tag": "c:storage_blocks/redstone" }, { - "item": { - "tag": "forge:storage_blocks/redstone" - } + "tag": "c:storage_blocks/redstone" }, { - "item": { - "item": "minecraft:diamond_pickaxe" - } + "item": "minecraft:diamond_pickaxe" }, { - "item": { - "item": "minecraft:iron_shovel" - } + "item": "minecraft:iron_shovel" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:obsidian" - } + "tag": "c:obsidians" }, { - "item": { - "tag": "forge:obsidian" - } + "tag": "c:obsidians" } ], "sourceCost": 6500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/efficiency_5.json b/src/generated/resources/data/ars_nouveau/recipes/efficiency_5.json index ea1da1a983..dc65ab5913 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/efficiency_5.json +++ b/src/generated/resources/data/ars_nouveau/recipes/efficiency_5.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:efficiency", "level": 5, "pedestalItems": [ { - "item": { - "tag": "forge:storage_blocks/redstone" - } + "tag": "c:storage_blocks/redstone" }, { - "item": { - "tag": "forge:storage_blocks/redstone" - } + "tag": "c:storage_blocks/redstone" }, { - "item": { - "item": "minecraft:diamond_pickaxe" - } + "item": "minecraft:diamond_pickaxe" }, { - "item": { - "item": "minecraft:diamond_shovel" - } + "item": "minecraft:diamond_shovel" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 8000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/enchanters_eye.json b/src/generated/resources/data/ars_nouveau/recipes/enchanters_eye.json index 83547735f3..510916ac4e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/enchanters_eye.json +++ b/src/generated/resources/data/ars_nouveau/recipes/enchanters_eye.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:enchanters_eye" - }, "pedestalItems": [ { "item": "minecraft:blaze_powder" @@ -18,22 +14,24 @@ "item": "minecraft:blaze_powder" }, { - "tag": "forge:ender_pearls" + "tag": "c:ender_pearls" }, { - "tag": "forge:ender_pearls" + "tag": "c:ender_pearls" }, { - "tag": "forge:ender_pearls" + "tag": "c:ender_pearls" }, { - "tag": "forge:ender_pearls" - } - ], - "reagent": [ - { - "item": "ars_nouveau:scryers_crystal" + "tag": "c:ender_pearls" } ], + "reagent": { + "item": "ars_nouveau:scryers_crystal" + }, + "result": { + "count": 1, + "id": "ars_nouveau:enchanters_eye" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/enchanters_mirror.json b/src/generated/resources/data/ars_nouveau/recipes/enchanters_mirror.json index 9a14208de0..0b183cb6f9 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/enchanters_mirror.json +++ b/src/generated/resources/data/ars_nouveau/recipes/enchanters_mirror.json @@ -1,15 +1,11 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:enchanters_mirror" - }, "pedestalItems": [ { - "tag": "forge:glass" + "tag": "c:glass_blocks" }, { - "tag": "forge:glass" + "tag": "c:glass_blocks" }, { "item": "ars_nouveau:manipulation_essence" @@ -18,22 +14,24 @@ "item": "ars_nouveau:manipulation_essence" }, { - "tag": "forge:logs/archwood" + "tag": "neoforge:logs/archwood" }, { - "tag": "forge:logs/archwood" + "tag": "neoforge:logs/archwood" }, { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { - "tag": "forge:ingots/gold" - } - ], - "reagent": [ - { - "tag": "forge:storage_blocks/source" + "tag": "c:ingots/gold" } ], + "reagent": { + "tag": "neoforge:storage_blocks/source" + }, + "result": { + "count": 1, + "id": "ars_nouveau:enchanters_mirror" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/enchanters_shield.json b/src/generated/resources/data/ars_nouveau/recipes/enchanters_shield.json index b38d325f9b..811d3793c4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/enchanters_shield.json +++ b/src/generated/resources/data/ars_nouveau/recipes/enchanters_shield.json @@ -1,27 +1,25 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:enchanters_shield" - }, "pedestalItems": [ { - "tag": "forge:storage_blocks/gold" + "tag": "c:storage_blocks/gold" }, { - "tag": "forge:storage_blocks/gold" + "tag": "c:storage_blocks/gold" }, { - "tag": "forge:storage_blocks/source" + "tag": "neoforge:storage_blocks/source" }, { - "tag": "forge:storage_blocks/source" - } - ], - "reagent": [ - { - "item": "minecraft:shield" + "tag": "neoforge:storage_blocks/source" } ], + "reagent": { + "item": "minecraft:shield" + }, + "result": { + "count": 1, + "id": "ars_nouveau:enchanters_shield" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/enchanters_sword.json b/src/generated/resources/data/ars_nouveau/recipes/enchanters_sword.json index de1a23cc9e..7c227a6f0d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/enchanters_sword.json +++ b/src/generated/resources/data/ars_nouveau/recipes/enchanters_sword.json @@ -1,30 +1,28 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:enchanters_sword" - }, "pedestalItems": [ { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { - "tag": "forge:storage_blocks/gold" + "tag": "c:storage_blocks/gold" }, { - "tag": "forge:storage_blocks/gold" + "tag": "c:storage_blocks/gold" }, { - "tag": "forge:storage_blocks/source" + "tag": "neoforge:storage_blocks/source" }, { - "tag": "forge:storage_blocks/source" - } - ], - "reagent": [ - { - "item": "minecraft:diamond_sword" + "tag": "neoforge:storage_blocks/source" } ], + "reagent": { + "item": "minecraft:diamond_sword" + }, + "result": { + "count": 1, + "id": "ars_nouveau:enchanters_sword" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/feather_falling_1.json b/src/generated/resources/data/ars_nouveau/recipes/feather_falling_1.json index 88e7e1213f..3de6df3807 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/feather_falling_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/feather_falling_1.json @@ -1,27 +1,18 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:feather_falling", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "tag": "forge:slimeballs" - } + "tag": "c:slimeballs" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/feather_falling_2.json b/src/generated/resources/data/ars_nouveau/recipes/feather_falling_2.json index 308dbca4a1..9bdba15414 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/feather_falling_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/feather_falling_2.json @@ -1,32 +1,21 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:feather_falling", "level": 2, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "tag": "forge:slimeballs" - } + "tag": "c:slimeballs" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/feather_falling_3.json b/src/generated/resources/data/ars_nouveau/recipes/feather_falling_3.json index 4c74d9ef99..03c371ba56 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/feather_falling_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/feather_falling_3.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:feather_falling", "level": 3, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "tag": "forge:slimeballs" - } + "tag": "c:slimeballs" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/feather_falling_4.json b/src/generated/resources/data/ars_nouveau/recipes/feather_falling_4.json index 345be87a5f..193de68f0f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/feather_falling_4.json +++ b/src/generated/resources/data/ars_nouveau/recipes/feather_falling_4.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:feather_falling", "level": 4, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 6500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_aspect_1.json b/src/generated/resources/data/ars_nouveau/recipes/fire_aspect_1.json index 028839c882..8a86f1ce66 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/fire_aspect_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/fire_aspect_1.json @@ -1,32 +1,21 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fire_aspect", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:fire_essence" - } + "item": "ars_nouveau:fire_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_aspect_2.json b/src/generated/resources/data/ars_nouveau/recipes/fire_aspect_2.json index 8ceb285afa..747413300e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/fire_aspect_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/fire_aspect_2.json @@ -1,37 +1,24 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fire_aspect", "level": 2, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:fire_essence" - } + "item": "ars_nouveau:fire_essence" }, { - "item": { - "item": "ars_nouveau:fire_essence" - } + "item": "ars_nouveau:fire_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 4000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_essence.json b/src/generated/resources/data/ars_nouveau/recipes/fire_essence.json new file mode 100644 index 0000000000..0dae4a86e6 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/fire_essence.json @@ -0,0 +1,21 @@ +{ + "input": { + "tag": "neoforge:gems/source" + }, + "output": { + "count": 1, + "id": "ars_nouveau:fire_essence" + }, + "pedestalItems": [ + { + "item": "minecraft:flint_and_steel" + }, + { + "item": "minecraft:torch" + }, + { + "item": "minecraft:gunpowder" + } + ], + "source": 2000 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_protection_1.json b/src/generated/resources/data/ars_nouveau/recipes/fire_protection_1.json index e1f9ee7e61..e754b89781 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/fire_protection_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/fire_protection_1.json @@ -1,27 +1,18 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fire_protection", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:fire_essence" - } + "item": "ars_nouveau:fire_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_protection_2.json b/src/generated/resources/data/ars_nouveau/recipes/fire_protection_2.json index 186b1acf07..7f8c61d871 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/fire_protection_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/fire_protection_2.json @@ -1,32 +1,21 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fire_protection", "level": 2, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:fire_essence" - } + "item": "ars_nouveau:fire_essence" }, { - "item": { - "item": "ars_nouveau:fire_essence" - } + "item": "ars_nouveau:fire_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_protection_3.json b/src/generated/resources/data/ars_nouveau/recipes/fire_protection_3.json index 8bcbeeaeae..7074339e5d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/fire_protection_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/fire_protection_3.json @@ -1,42 +1,27 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fire_protection", "level": 3, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:fire_essence" - } + "item": "ars_nouveau:fire_essence" }, { - "item": { - "item": "ars_nouveau:fire_essence" - } + "item": "ars_nouveau:fire_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:rods/blaze" - } + "tag": "c:rods/blaze" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_protection_4.json b/src/generated/resources/data/ars_nouveau/recipes/fire_protection_4.json index 026d7429d5..9f42600cdb 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/fire_protection_4.json +++ b/src/generated/resources/data/ars_nouveau/recipes/fire_protection_4.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fire_protection", "level": 4, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:fire_essence" - } + "item": "ars_nouveau:fire_essence" }, { - "item": { - "item": "ars_nouveau:fire_essence" - } + "item": "ars_nouveau:fire_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:rods/blaze" - } + "tag": "c:rods/blaze" }, { - "item": { - "tag": "forge:rods/blaze" - } + "tag": "c:rods/blaze" } ], "sourceCost": 6500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_protection_5.json b/src/generated/resources/data/ars_nouveau/recipes/fire_protection_5.json index 5f499c5873..1d7416a7cb 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/fire_protection_5.json +++ b/src/generated/resources/data/ars_nouveau/recipes/fire_protection_5.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fire_protection", "level": 5, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:fire_essence" - } + "item": "ars_nouveau:fire_essence" }, { - "item": { - "item": "ars_nouveau:fire_essence" - } + "item": "ars_nouveau:fire_essence" }, { - "item": { - "item": "ars_nouveau:fire_essence" - } + "item": "ars_nouveau:fire_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:rods/blaze" - } + "tag": "c:rods/blaze" } ], "sourceCost": 8000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/first_armor_upgrade.json b/src/generated/resources/data/ars_nouveau/recipes/first_armor_upgrade.json new file mode 100644 index 0000000000..499903783e --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/first_armor_upgrade.json @@ -0,0 +1,12 @@ +{ + "pedestalItems": [ + { + "tag": "c:rods/blaze" + }, + { + "tag": "c:rods/blaze" + } + ], + "sourceCost": 2500, + "tier": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/flame_1.json b/src/generated/resources/data/ars_nouveau/recipes/flame_1.json index 6190f7bbb5..313f30890a 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/flame_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/flame_1.json @@ -1,22 +1,15 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:flame", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:fire_essence" - } + "item": "ars_nouveau:fire_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "tag": "forge:rods/blaze" - } + "tag": "c:rods/blaze" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/fortune_1.json b/src/generated/resources/data/ars_nouveau/recipes/fortune_1.json index 1c49cf3a41..ea464dbdf1 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/fortune_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/fortune_1.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fortune", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:earth_essence" - } + "item": "ars_nouveau:earth_essence" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 6000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/fortune_2.json b/src/generated/resources/data/ars_nouveau/recipes/fortune_2.json index a8d5609e12..21f09c0763 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/fortune_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/fortune_2.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fortune", "level": 2, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:earth_essence" - } + "item": "ars_nouveau:earth_essence" }, { - "item": { - "item": "ars_nouveau:earth_essence" - } + "item": "ars_nouveau:earth_essence" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 8000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/fortune_3.json b/src/generated/resources/data/ars_nouveau/recipes/fortune_3.json index 1ae1c555e0..024143690d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/fortune_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/fortune_3.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fortune", "level": 3, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:earth_essence" - } + "item": "ars_nouveau:earth_essence" }, { - "item": { - "item": "ars_nouveau:earth_essence" - } + "item": "ars_nouveau:earth_essence" }, { - "item": { - "item": "ars_nouveau:earth_essence" - } + "item": "ars_nouveau:earth_essence" }, { - "item": { - "tag": "forge:storage_blocks/diamond" - } + "tag": "c:storage_blocks/diamond" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 9000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/glowstone_block_to_dust.json b/src/generated/resources/data/ars_nouveau/recipes/glowstone_block_to_dust.json new file mode 100644 index 0000000000..c7eb90f3a1 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/glowstone_block_to_dust.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:glowstone" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 4, + "id": "minecraft:glowstone_dust" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_accelerate.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_accelerate.json index 2a642aba81..f812dfd99b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_accelerate.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_accelerate.json @@ -1,23 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "minecraft:powered_rail" - } - }, - { - "item": { - "item": "minecraft:sugar" - } - }, - { - "item": { - "item": "minecraft:clock" - } - } - ], - "output": "ars_nouveau:glyph_accelerate" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_accelerate" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_amplify.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_amplify.json index 45561b7b5b..3357d4ac71 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_amplify.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_amplify.json @@ -1,13 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "minecraft:diamond_pickaxe" - } - } - ], - "output": "ars_nouveau:glyph_amplify" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_amplify" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_animate_block.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_animate_block.json index 6a0d2289d9..366ae9c0b0 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_animate_block.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_animate_block.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:conjuration_essence" - } - }, - { - "item": { - "tag": "forge:obsidian" - } - }, - { - "item": { - "tag": "forge:obsidian" - } - }, - { - "item": { - "tag": "forge:obsidian" - } - } - ], - "output": "ars_nouveau:glyph_animate_block" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_animate_block" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_aoe.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_aoe.json index 54a754935a..1fed07c498 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_aoe.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_aoe.json @@ -1,13 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "minecraft:firework_star" - } - } - ], - "output": "ars_nouveau:glyph_aoe" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_aoe" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_blink.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_blink.json index 1adda91fd9..048fe58e43 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_blink.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_blink.json @@ -1,33 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 160, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "tag": "forge:ender_pearls" - } - }, - { - "item": { - "tag": "forge:ender_pearls" - } - }, - { - "item": { - "tag": "forge:ender_pearls" - } - }, - { - "item": { - "tag": "forge:ender_pearls" - } - } - ], - "output": "ars_nouveau:glyph_blink" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_blink" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_bounce.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_bounce.json index 4e1301d013..dc3db44ec4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_bounce.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_bounce.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:abjuration_essence" - } - }, - { - "item": { - "tag": "forge:slimeballs" - } - }, - { - "item": { - "tag": "forge:slimeballs" - } - }, - { - "item": { - "tag": "forge:slimeballs" - } - } - ], - "output": "ars_nouveau:glyph_bounce" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_bounce" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_break.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_break.json index ac87a26a25..46e1297edf 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_break.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_break.json @@ -1,13 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "minecraft:iron_pickaxe" - } - } - ], - "output": "ars_nouveau:glyph_break" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_break" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_cold_snap.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_cold_snap.json index 4eeb59f2bf..1e7655316c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_cold_snap.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_cold_snap.json @@ -1,23 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:water_essence" - } - }, - { - "item": { - "item": "minecraft:powder_snow_bucket" - } - }, - { - "item": { - "item": "minecraft:ice" - } - } - ], - "output": "ars_nouveau:glyph_cold_snap" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_cold_snap" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_conjure_water.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_conjure_water.json index d157e8c1c3..d858d69f42 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_conjure_water.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_conjure_water.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:water_essence" - } - }, - { - "item": { - "item": "minecraft:water_bucket" - } - } - ], - "output": "ars_nouveau:glyph_conjure_water" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_conjure_water" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_craft.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_craft.json index 354998880f..3e568713fa 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_craft.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_craft.json @@ -1,13 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "minecraft:crafting_table" - } - } - ], - "output": "ars_nouveau:glyph_craft" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_craft" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_crush.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_crush.json index d2e4fee201..8f6a427b42 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_crush.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_crush.json @@ -1,23 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:earth_essence" - } - }, - { - "item": { - "item": "minecraft:grindstone" - } - }, - { - "item": { - "item": "minecraft:piston" - } - } - ], - "output": "ars_nouveau:glyph_crush" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_crush" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_cut.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_cut.json index 63278ce131..9816adeb18 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_cut.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_cut.json @@ -1,23 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "minecraft:shears" - } - }, - { - "item": { - "item": "minecraft:iron_sword" - } - } - ], - "output": "ars_nouveau:glyph_cut" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_cut" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_dampen.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_dampen.json index 02700628f2..407d9c2487 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_dampen.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_dampen.json @@ -1,13 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "minecraft:nether_brick" - } - } - ], - "output": "ars_nouveau:glyph_dampen" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_dampen" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_decelerate.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_decelerate.json index d9225160e6..c045701cbc 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_decelerate.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_decelerate.json @@ -1,23 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "minecraft:soul_sand" - } - }, - { - "item": { - "item": "minecraft:cobweb" - } - }, - { - "item": { - "item": "minecraft:clock" - } - } - ], - "output": "ars_nouveau:glyph_decelerate" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_decelerate" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_delay.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_delay.json index c4f4d28672..7c35dfdcc3 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_delay.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_delay.json @@ -1,23 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "minecraft:repeater" - } - }, - { - "item": { - "item": "minecraft:clock" - } - } - ], - "output": "ars_nouveau:glyph_delay" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_delay" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_dispel.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_dispel.json index be13a323bb..f10f6397d0 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_dispel.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_dispel.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:abjuration_essence" - } - }, - { - "item": { - "item": "minecraft:milk_bucket" - } - }, - { - "item": { - "item": "minecraft:milk_bucket" - } - }, - { - "item": { - "item": "minecraft:milk_bucket" - } - } - ], - "output": "ars_nouveau:glyph_dispel" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_dispel" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_duration_down.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_duration_down.json index a201e2ed94..9967cb1309 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_duration_down.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_duration_down.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "minecraft:clock" - } - }, - { - "item": { - "item": "minecraft:glowstone_dust" - } - } - ], - "output": "ars_nouveau:glyph_duration_down" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_duration_down" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_ender_inventory.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_ender_inventory.json index 5359e7101f..5a09b11948 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_ender_inventory.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_ender_inventory.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "minecraft:ender_chest" - } - } - ], - "output": "ars_nouveau:glyph_ender_inventory" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_ender_inventory" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_evaporate.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_evaporate.json index fc59b9b6b5..9a1c04554c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_evaporate.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_evaporate.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "minecraft:sponge" - } - }, - { - "item": { - "item": "minecraft:sponge" - } - }, - { - "item": { - "item": "minecraft:sponge" - } - } - ], - "output": "ars_nouveau:glyph_evaporate" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_evaporate" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_exchange.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_exchange.json index ce64730938..e4fbc13c40 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_exchange.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_exchange.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "minecraft:emerald_block" - } - }, - { - "item": { - "tag": "forge:ender_pearls" - } - }, - { - "item": { - "tag": "forge:ender_pearls" - } - } - ], - "output": "ars_nouveau:glyph_exchange" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_exchange" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_explosion.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_explosion.json index 8c07a040d8..45763cf52c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_explosion.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_explosion.json @@ -1,33 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:fire_essence" - } - }, - { - "item": { - "item": "minecraft:tnt" - } - }, - { - "item": { - "item": "minecraft:tnt" - } - }, - { - "item": { - "item": "minecraft:tnt" - } - }, - { - "item": { - "item": "minecraft:fire_charge" - } - } - ], - "output": "ars_nouveau:glyph_explosion" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_explosion" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_extend_time.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_extend_time.json index 8e12d0c9f7..3d3afa97b3 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_extend_time.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_extend_time.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "minecraft:clock" - } - }, - { - "item": { - "tag": "forge:storage_blocks/redstone" - } - } - ], - "output": "ars_nouveau:glyph_extend_time" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_extend_time" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_extract.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_extract.json index 09c0135126..3cfb25d561 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_extract.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_extract.json @@ -1,13 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "minecraft:emerald" - } - } - ], - "output": "ars_nouveau:glyph_extract" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_extract" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_fangs.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_fangs.json index a675231ada..44382e75d4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_fangs.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_fangs.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 160, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:conjuration_essence" - } - }, - { - "item": { - "item": "minecraft:prismarine_shard" - } - }, - { - "item": { - "item": "minecraft:prismarine_shard" - } - }, - { - "item": { - "item": "minecraft:totem_of_undying" - } - } - ], - "output": "ars_nouveau:glyph_fangs" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_fangs" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_fell.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_fell.json index daad2e3282..2d2325e42d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_fell.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_fell.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:earth_essence" - } - }, - { - "item": { - "item": "minecraft:diamond_axe" - } - } - ], - "output": "ars_nouveau:glyph_fell" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_fell" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_firework.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_firework.json index 640e1581a4..5441b99502 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_firework.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_firework.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:fire_essence" - } - }, - { - "item": { - "item": "minecraft:firework_rocket" - } - }, - { - "item": { - "item": "minecraft:firework_rocket" - } - }, - { - "item": { - "item": "minecraft:firework_star" - } - } - ], - "output": "ars_nouveau:glyph_firework" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_firework" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_flare.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_flare.json index 5967836825..6fd9bfe383 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_flare.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_flare.json @@ -1,38 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:fire_essence" - } - }, - { - "item": { - "item": "minecraft:flint_and_steel" - } - }, - { - "item": { - "item": "minecraft:flint_and_steel" - } - }, - { - "item": { - "item": "minecraft:fire_charge" - } - }, - { - "item": { - "item": "minecraft:fire_charge" - } - }, - { - "item": { - "item": "minecraft:blaze_rod" - } - } - ], - "output": "ars_nouveau:glyph_flare" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_flare" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_fortune.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_fortune.json index bd534dffd4..ee8e6a964d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_fortune.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_fortune.json @@ -1,13 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "minecraft:rabbit_foot" - } - } - ], - "output": "ars_nouveau:glyph_fortune" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_fortune" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_freeze.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_freeze.json index b379cf42f3..ef5202c550 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_freeze.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_freeze.json @@ -1,23 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:water_essence" - } - }, - { - "item": { - "item": "minecraft:snow_block" - } - }, - { - "item": { - "item": "minecraft:snow_block" - } - } - ], - "output": "ars_nouveau:glyph_freeze" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_freeze" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_glide.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_glide.json index 29c4d3f2de..a1c367990d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_glide.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_glide.json @@ -1,33 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 160, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:air_essence" - } - }, - { - "item": { - "item": "minecraft:elytra" - } - }, - { - "item": { - "tag": "forge:gems/diamond" - } - }, - { - "item": { - "tag": "forge:gems/diamond" - } - }, - { - "item": { - "tag": "forge:gems/diamond" - } - } - ], - "output": "ars_nouveau:glyph_glide" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_glide" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_gravity.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_gravity.json index 25a29d5b4c..3f2c4cf657 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_gravity.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_gravity.json @@ -1,38 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:air_essence" - } - }, - { - "item": { - "item": "minecraft:anvil" - } - }, - { - "item": { - "item": "minecraft:anvil" - } - }, - { - "item": { - "tag": "forge:feathers" - } - }, - { - "item": { - "tag": "forge:feathers" - } - }, - { - "item": { - "tag": "forge:feathers" - } - } - ], - "output": "ars_nouveau:glyph_gravity" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_gravity" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_grow.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_grow.json index 9175c273a9..51adedbf15 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_grow.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_grow.json @@ -1,53 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:earth_essence" - } - }, - { - "item": { - "item": "minecraft:bone_block" - } - }, - { - "item": { - "item": "minecraft:bone_block" - } - }, - { - "item": { - "item": "minecraft:bone_block" - } - }, - { - "item": { - "item": "minecraft:bone_block" - } - }, - { - "item": { - "item": "minecraft:bone_block" - } - }, - { - "item": { - "tag": "forge:seeds" - } - }, - { - "item": { - "tag": "forge:seeds" - } - }, - { - "item": { - "tag": "forge:seeds" - } - } - ], - "output": "ars_nouveau:glyph_grow" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_grow" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_gust.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_gust.json index d109c8a0dc..42f8cf6ec8 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_gust.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_gust.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:air_essence" - } - }, - { - "item": { - "item": "minecraft:piston" - } - }, - { - "item": { - "item": "minecraft:piston" - } - }, - { - "item": { - "item": "minecraft:piston" - } - } - ], - "output": "ars_nouveau:glyph_gust" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_gust" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_harm.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_harm.json index 9b41123efc..a78b3b2c7b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_harm.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_harm.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:earth_essence" - } - }, - { - "item": { - "item": "minecraft:iron_sword" - } - }, - { - "item": { - "item": "minecraft:iron_sword" - } - }, - { - "item": { - "item": "minecraft:iron_sword" - } - } - ], - "output": "ars_nouveau:glyph_harm" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_harm" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_harvest.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_harvest.json index 71e665c9ba..4308f491f4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_harvest.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_harvest.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:earth_essence" - } - }, - { - "item": { - "item": "minecraft:iron_hoe" - } - } - ], - "output": "ars_nouveau:glyph_harvest" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_harvest" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_heal.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_heal.json index 61a51a3be9..faed6bd4b1 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_heal.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_heal.json @@ -1,38 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:abjuration_essence" - } - }, - { - "item": { - "item": "minecraft:glistering_melon_slice" - } - }, - { - "item": { - "item": "minecraft:glistering_melon_slice" - } - }, - { - "item": { - "item": "minecraft:glistering_melon_slice" - } - }, - { - "item": { - "item": "minecraft:glistering_melon_slice" - } - }, - { - "item": { - "item": "minecraft:golden_apple" - } - } - ], - "output": "ars_nouveau:glyph_heal" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_heal" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_hex.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_hex.json index c63b388983..dc6dc52f8e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_hex.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_hex.json @@ -1,38 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 160, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:abjuration_essence" - } - }, - { - "item": { - "item": "minecraft:fermented_spider_eye" - } - }, - { - "item": { - "item": "minecraft:blaze_rod" - } - }, - { - "item": { - "item": "minecraft:blaze_rod" - } - }, - { - "item": { - "item": "minecraft:blaze_rod" - } - }, - { - "item": { - "item": "minecraft:wither_rose" - } - } - ], - "output": "ars_nouveau:glyph_hex" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_hex" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_ignite.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_ignite.json index 4a94f16da2..5102a70601 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_ignite.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_ignite.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "minecraft:flint_and_steel" - } - }, - { - "item": { - "tag": "minecraft:coals" - } - }, - { - "item": { - "tag": "minecraft:coals" - } - }, - { - "item": { - "tag": "minecraft:coals" - } - } - ], - "output": "ars_nouveau:glyph_ignite" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_ignite" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_infuse.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_infuse.json index a95bf60351..1d12c9bc40 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_infuse.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_infuse.json @@ -1,23 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:abjuration_essence" - } - }, - { - "item": { - "item": "minecraft:glass_bottle" - } - }, - { - "item": { - "tag": "forge:rods/blaze" - } - } - ], - "output": "ars_nouveau:glyph_infuse" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_infuse" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_intangible.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_intangible.json index f39b265741..2774cf040f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_intangible.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_intangible.json @@ -1,38 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 160, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "minecraft:phantom_membrane" - } - }, - { - "item": { - "item": "minecraft:phantom_membrane" - } - }, - { - "item": { - "item": "minecraft:phantom_membrane" - } - }, - { - "item": { - "tag": "forge:ender_pearls" - } - }, - { - "item": { - "tag": "forge:ender_pearls" - } - } - ], - "output": "ars_nouveau:glyph_intangible" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_intangible" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_interact.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_interact.json index d099635ecb..594fdfac49 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_interact.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_interact.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "minecraft:lever" - } - }, - { - "item": { - "tag": "minecraft:wooden_pressure_plates" - } - }, - { - "item": { - "tag": "minecraft:buttons" - } - } - ], - "output": "ars_nouveau:glyph_interact" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_interact" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_invisibility.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_invisibility.json index b0c40793a6..6f2e0c085e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_invisibility.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_invisibility.json @@ -1,23 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:abjuration_essence" - } - }, - { - "item": { - "item": "minecraft:fermented_spider_eye" - } - }, - { - "item": { - "tag": "forge:rods/blaze" - } - } - ], - "output": "ars_nouveau:glyph_invisibility" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_invisibility" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_launch.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_launch.json index 38154378c8..cfc923bd48 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_launch.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_launch.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:air_essence" - } - }, - { - "item": { - "item": "minecraft:rabbit_hide" - } - }, - { - "item": { - "item": "minecraft:rabbit_hide" - } - }, - { - "item": { - "item": "minecraft:rabbit_hide" - } - } - ], - "output": "ars_nouveau:glyph_launch" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_launch" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_leap.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_leap.json index e5f66bca40..4d6a21811c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_leap.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_leap.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:air_essence" - } - }, - { - "item": { - "item": "ars_nouveau:wilden_wing" - } - }, - { - "item": { - "item": "ars_nouveau:wilden_wing" - } - }, - { - "item": { - "item": "ars_nouveau:wilden_wing" - } - } - ], - "output": "ars_nouveau:glyph_leap" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_leap" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_light.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_light.json index a77faf680d..d3ec97c68c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_light.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_light.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "minecraft:lantern" - } - }, - { - "item": { - "item": "minecraft:torch" - } - } - ], - "output": "ars_nouveau:glyph_light" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_light" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_lightning.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_lightning.json index 965a137a64..5edc3f182e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_lightning.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_lightning.json @@ -1,33 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 160, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:air_essence" - } - }, - { - "item": { - "item": "minecraft:lightning_rod" - } - }, - { - "item": { - "item": "minecraft:lightning_rod" - } - }, - { - "item": { - "item": "minecraft:lightning_rod" - } - }, - { - "item": { - "item": "minecraft:heart_of_the_sea" - } - } - ], - "output": "ars_nouveau:glyph_lightning" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_lightning" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_linger.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_linger.json index 721c3dae3b..bdc1e78e9b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_linger.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_linger.json @@ -1,33 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 160, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "minecraft:dragon_breath" - } - }, - { - "item": { - "tag": "forge:storage_blocks/diamond" - } - }, - { - "item": { - "tag": "forge:rods/blaze" - } - }, - { - "item": { - "tag": "forge:rods/blaze" - } - } - ], - "output": "ars_nouveau:glyph_linger" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_linger" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_name.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_name.json index 3ad599a836..ceabb09655 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_name.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_name.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "minecraft:name_tag" - } - } - ], - "output": "ars_nouveau:glyph_name" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_name" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_orbit.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_orbit.json index 4a6dc6d4b0..a9e44bc176 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_orbit.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_orbit.json @@ -1,23 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 160, - "inputItems": [ - { - "item": { - "item": "minecraft:compass" - } - }, - { - "item": { - "item": "minecraft:ender_eye" - } - }, - { - "item": { - "tag": "forge:rods/blaze" - } - } - ], - "output": "ars_nouveau:glyph_orbit" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_orbit" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_phantom_block.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_phantom_block.json index 4d60b088b9..4d31ea5dc9 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_phantom_block.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_phantom_block.json @@ -1,48 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "tag": "forge:glass" - } - }, - { - "item": { - "tag": "forge:glass" - } - }, - { - "item": { - "tag": "forge:glass" - } - }, - { - "item": { - "tag": "forge:glass" - } - }, - { - "item": { - "tag": "forge:glass" - } - }, - { - "item": { - "tag": "forge:glass" - } - }, - { - "item": { - "tag": "forge:glass" - } - }, - { - "item": { - "tag": "forge:glass" - } - } - ], - "output": "ars_nouveau:glyph_phantom_block" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_phantom_block" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_pickup.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_pickup.json index c94cbaa802..03cf541bb1 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_pickup.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_pickup.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "minecraft:hopper" - } - }, - { - "item": { - "item": "minecraft:hopper" - } - } - ], - "output": "ars_nouveau:glyph_pickup" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_pickup" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_pierce.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_pierce.json index 09f912cff6..f29a6396d5 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_pierce.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_pierce.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "minecraft:arrow" - } - }, - { - "item": { - "item": "ars_nouveau:wilden_spike" - } - } - ], - "output": "ars_nouveau:glyph_pierce" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_pierce" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_place_block.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_place_block.json index 0b332515e5..9419e301dc 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_place_block.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_place_block.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "minecraft:dispenser" - } - } - ], - "output": "ars_nouveau:glyph_place_block" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_place_block" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_projectile.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_projectile.json index bc4d3820c1..fd13aa220f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_projectile.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_projectile.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "minecraft:fletching_table" - } - }, - { - "item": { - "item": "minecraft:arrow" - } - } - ], - "output": "ars_nouveau:glyph_projectile" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_projectile" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_pull.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_pull.json index 9e1035c5f4..a40342fa6d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_pull.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_pull.json @@ -1,13 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "minecraft:fishing_rod" - } - } - ], - "output": "ars_nouveau:glyph_pull" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_pull" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_randomize.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_randomize.json index 75b3e226a2..73bb9a2cb4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_randomize.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_randomize.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "minecraft:pink_carpet" - } - }, - { - "item": { - "item": "minecraft:pink_carpet" - } - } - ], - "output": "ars_nouveau:glyph_randomize" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_randomize" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_redstone_signal.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_redstone_signal.json index a00856ee36..a8eae0fceb 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_redstone_signal.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_redstone_signal.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "tag": "forge:storage_blocks/redstone" - } - }, - { - "item": { - "tag": "forge:storage_blocks/redstone" - } - }, - { - "item": { - "tag": "forge:storage_blocks/redstone" - } - } - ], - "output": "ars_nouveau:glyph_redstone_signal" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_redstone_signal" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_rotate.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_rotate.json index d6e5023558..74c1f79cf5 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_rotate.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_rotate.json @@ -1,13 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - } - ], - "output": "ars_nouveau:glyph_rotate" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_rotate" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_rune.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_rune.json index dc3a1d3ec7..9f1c17100c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_rune.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_rune.json @@ -1,23 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "ars_nouveau:runic_chalk" - } - }, - { - "item": { - "item": "minecraft:tripwire_hook" - } - } - ], - "output": "ars_nouveau:glyph_rune" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_rune" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_self.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_self.json index c04c52449f..d1009035d2 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_self.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_self.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "tag": "minecraft:wooden_pressure_plates" - } - }, - { - "item": { - "item": "minecraft:iron_chestplate" - } - } - ], - "output": "ars_nouveau:glyph_self" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_self" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_sense_magic.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_sense_magic.json index 3a46d8f9ad..c8059b5fce 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_sense_magic.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_sense_magic.json @@ -1,23 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:abjuration_essence" - } - }, - { - "item": { - "item": "ars_nouveau:dowsing_rod" - } - }, - { - "item": { - "item": "ars_nouveau:starbuncle_shards" - } - } - ], - "output": "ars_nouveau:glyph_sense_magic" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_sense_magic" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_sensitive.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_sensitive.json index 0f17b08f8f..2a190d2ac0 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_sensitive.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_sensitive.json @@ -1,23 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "minecraft:scaffolding" - } - }, - { - "item": { - "item": "minecraft:poppy" - } - }, - { - "item": { - "item": "minecraft:water_bucket" - } - } - ], - "output": "ars_nouveau:glyph_sensitive" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_sensitive" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_slowfall.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_slowfall.json index 314bdab69d..2f5151629f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_slowfall.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_slowfall.json @@ -1,43 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:air_essence" - } - }, - { - "item": { - "item": "ars_nouveau:wilden_wing" - } - }, - { - "item": { - "item": "minecraft:feather" - } - }, - { - "item": { - "item": "minecraft:feather" - } - }, - { - "item": { - "item": "minecraft:feather" - } - }, - { - "item": { - "tag": "forge:rods/blaze" - } - }, - { - "item": { - "tag": "forge:crops/nether_wart" - } - } - ], - "output": "ars_nouveau:glyph_slowfall" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_slowfall" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_smelt.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_smelt.json index ff1fce6d4d..ade8a407d2 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_smelt.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_smelt.json @@ -1,38 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:fire_essence" - } - }, - { - "item": { - "item": "minecraft:blast_furnace" - } - }, - { - "item": { - "item": "minecraft:blast_furnace" - } - }, - { - "item": { - "item": "minecraft:blast_furnace" - } - }, - { - "item": { - "item": "minecraft:blast_furnace" - } - }, - { - "item": { - "tag": "forge:rods/blaze" - } - } - ], - "output": "ars_nouveau:glyph_smelt" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_smelt" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_snare.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_snare.json index 0d09ec149a..4edf7fd7c0 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_snare.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_snare.json @@ -1,33 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:earth_essence" - } - }, - { - "item": { - "item": "minecraft:cobweb" - } - }, - { - "item": { - "item": "minecraft:cobweb" - } - }, - { - "item": { - "item": "minecraft:cobweb" - } - }, - { - "item": { - "item": "minecraft:cobweb" - } - } - ], - "output": "ars_nouveau:glyph_snare" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_snare" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_split.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_split.json index 5b0e00bb61..c77b467d18 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_split.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_split.json @@ -1,23 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 160, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:relay_splitter" - } - }, - { - "item": { - "item": "ars_nouveau:wilden_spike" - } - }, - { - "item": { - "item": "minecraft:stonecutter" - } - } - ], - "output": "ars_nouveau:glyph_split" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_split" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_decoy.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_decoy.json index 3ff72d1f91..ac8bbd4cfe 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_decoy.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_decoy.json @@ -1,33 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 160, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:conjuration_essence" - } - }, - { - "item": { - "item": "minecraft:armor_stand" - } - }, - { - "item": { - "item": "minecraft:armor_stand" - } - }, - { - "item": { - "item": "minecraft:armor_stand" - } - }, - { - "item": { - "item": "minecraft:armor_stand" - } - } - ], - "output": "ars_nouveau:glyph_summon_decoy" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_summon_decoy" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_steed.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_steed.json index ab5e6c397a..9490deabfd 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_steed.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_steed.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "minecraft:leather" - } - }, - { - "item": { - "item": "minecraft:leather" - } - }, - { - "item": { - "item": "minecraft:leather" - } - }, - { - "item": { - "item": "minecraft:leather" - } - } - ], - "output": "ars_nouveau:glyph_summon_steed" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_summon_steed" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_undead.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_undead.json index 06dcf298ab..458ac5f45c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_undead.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_undead.json @@ -1,23 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 160, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:conjuration_essence" - } - }, - { - "item": { - "item": "minecraft:bone" - } - }, - { - "item": { - "item": "minecraft:wither_skeleton_skull" - } - } - ], - "output": "ars_nouveau:glyph_summon_undead" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_summon_undead" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_vex.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_vex.json index 052fd7ef76..6739b70f31 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_vex.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_vex.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 160, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:conjuration_essence" - } - }, - { - "item": { - "item": "minecraft:totem_of_undying" - } - } - ], - "output": "ars_nouveau:glyph_summon_vex" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_summon_vex" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_wolves.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_wolves.json index bc296bedf0..8b97f9a00c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_wolves.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_wolves.json @@ -1,48 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:conjuration_essence" - } - }, - { - "item": { - "item": "minecraft:bone" - } - }, - { - "item": { - "item": "minecraft:bone" - } - }, - { - "item": { - "item": "minecraft:bone" - } - }, - { - "item": { - "item": "ars_nouveau:wilden_wing" - } - }, - { - "item": { - "item": "ars_nouveau:wilden_wing" - } - }, - { - "item": { - "item": "ars_nouveau:wilden_wing" - } - }, - { - "item": { - "item": "ars_nouveau:wilden_wing" - } - } - ], - "output": "ars_nouveau:glyph_summon_wolves" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_summon_wolves" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_toss.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_toss.json index b395b88147..efbade53fc 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_toss.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_toss.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "minecraft:dropper" - } - } - ], - "output": "ars_nouveau:glyph_toss" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_toss" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_touch.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_touch.json index e66373a4f2..567b73e20f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_touch.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_touch.json @@ -1,13 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "tag": "minecraft:buttons" - } - } - ], - "output": "ars_nouveau:glyph_touch" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_touch" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_underfoot.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_underfoot.json index 7440968f3c..4c90792231 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_underfoot.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_underfoot.json @@ -1,18 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "minecraft:iron_boots" - } - }, - { - "item": { - "tag": "minecraft:wooden_pressure_plates" - } - } - ], - "output": "ars_nouveau:glyph_underfoot" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_underfoot" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_wall.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_wall.json index 324e52b587..26777284ec 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_wall.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_wall.json @@ -1,33 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 160, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "minecraft:dragon_breath" - } - }, - { - "item": { - "tag": "forge:storage_blocks/diamond" - } - }, - { - "item": { - "tag": "forge:rods/blaze" - } - }, - { - "item": { - "tag": "forge:rods/blaze" - } - } - ], - "output": "ars_nouveau:glyph_wall" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_wall" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_wind_shear.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_wind_shear.json index 4c5649b670..6ad2f95255 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_wind_shear.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_wind_shear.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 55, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:air_essence" - } - }, - { - "item": { - "item": "minecraft:iron_sword" - } - }, - { - "item": { - "item": "minecraft:iron_sword" - } - }, - { - "item": { - "item": "minecraft:iron_sword" - } - } - ], - "output": "ars_nouveau:glyph_wind_shear" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_wind_shear" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_wither.json b/src/generated/resources/data/ars_nouveau/recipes/glyph_wither.json index 1ffcb8cbc1..d1029fcc35 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/glyph_wither.json +++ b/src/generated/resources/data/ars_nouveau/recipes/glyph_wither.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 160, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:abjuration_essence" - } - }, - { - "item": { - "item": "minecraft:wither_skeleton_skull" - } - }, - { - "item": { - "item": "minecraft:wither_skeleton_skull" - } - }, - { - "item": { - "item": "minecraft:wither_skeleton_skull" - } - } - ], - "output": "ars_nouveau:glyph_wither" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_wither" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/gravel.json b/src/generated/resources/data/ars_nouveau/recipes/gravel.json new file mode 100644 index 0000000000..88eaa2dc10 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/gravel.json @@ -0,0 +1,23 @@ +{ + "input": { + "tag": "c:gravels" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 1, + "id": "minecraft:sand" + } + }, + { + "chance": 0.02, + "maxRange": 1, + "stack": { + "count": 1, + "id": "minecraft:flint" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/imbuement_abjuration_essence.json b/src/generated/resources/data/ars_nouveau/recipes/imbuement_abjuration_essence.json deleted file mode 100644 index 41e1dee6ea..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/imbuement_abjuration_essence.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "ars_nouveau:imbuement", - "count": 1, - "input": { - "tag": "forge:gems/source" - }, - "output": "ars_nouveau:abjuration_essence", - "pedestalItems": [ - { - "item": { - "item": "minecraft:fermented_spider_eye" - } - }, - { - "item": { - "item": "minecraft:sugar" - } - }, - { - "item": { - "item": "minecraft:milk_bucket" - } - } - ], - "source": 2000 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/imbuement_air_essence.json b/src/generated/resources/data/ars_nouveau/recipes/imbuement_air_essence.json deleted file mode 100644 index 152e00a7dd..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/imbuement_air_essence.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "ars_nouveau:imbuement", - "count": 1, - "input": { - "tag": "forge:gems/source" - }, - "output": "ars_nouveau:air_essence", - "pedestalItems": [ - { - "item": { - "item": "minecraft:feather" - } - }, - { - "item": { - "item": "ars_nouveau:wilden_wing" - } - }, - { - "item": { - "tag": "minecraft:arrows" - } - } - ], - "source": 2000 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/imbuement_amplify_arrow.json b/src/generated/resources/data/ars_nouveau/recipes/imbuement_amplify_arrow.json deleted file mode 100644 index f169e46b10..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/imbuement_amplify_arrow.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "ars_nouveau:imbuement", - "count": 1, - "input": { - "tag": "minecraft:arrows" - }, - "output": "ars_nouveau:amplify_arrow", - "pedestalItems": [ - { - "item": { - "item": "ars_nouveau:source_gem" - } - }, - { - "item": { - "item": "ars_nouveau:air_essence" - } - }, - { - "item": { - "tag": "forge:gems/diamond" - } - } - ], - "source": 100 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/imbuement_conjuration_essence.json b/src/generated/resources/data/ars_nouveau/recipes/imbuement_conjuration_essence.json deleted file mode 100644 index 71bafa5dc6..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/imbuement_conjuration_essence.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "ars_nouveau:imbuement", - "count": 1, - "input": { - "tag": "forge:gems/source" - }, - "output": "ars_nouveau:conjuration_essence", - "pedestalItems": [ - { - "item": { - "item": "ars_nouveau:wilden_horn" - } - }, - { - "item": { - "item": "ars_nouveau:starbuncle_shards" - } - }, - { - "item": { - "item": "minecraft:book" - } - } - ], - "source": 2000 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/imbuement_earth_essence.json b/src/generated/resources/data/ars_nouveau/recipes/imbuement_earth_essence.json deleted file mode 100644 index 43466775ce..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/imbuement_earth_essence.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "ars_nouveau:imbuement", - "count": 1, - "input": { - "tag": "forge:gems/source" - }, - "output": "ars_nouveau:earth_essence", - "pedestalItems": [ - { - "item": { - "tag": "forge:ingots/iron" - } - }, - { - "item": { - "tag": "forge:seeds" - } - }, - { - "item": { - "tag": "minecraft:dirt" - } - } - ], - "source": 2000 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/imbuement_fire_essence.json b/src/generated/resources/data/ars_nouveau/recipes/imbuement_fire_essence.json deleted file mode 100644 index 38dd3c9603..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/imbuement_fire_essence.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "ars_nouveau:imbuement", - "count": 1, - "input": { - "tag": "forge:gems/source" - }, - "output": "ars_nouveau:fire_essence", - "pedestalItems": [ - { - "item": { - "item": "minecraft:flint_and_steel" - } - }, - { - "item": { - "item": "minecraft:torch" - } - }, - { - "item": { - "item": "minecraft:gunpowder" - } - } - ], - "source": 2000 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/imbuement_lapis.json b/src/generated/resources/data/ars_nouveau/recipes/imbuement_lapis.json deleted file mode 100644 index 109f6e44be..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/imbuement_lapis.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "type": "ars_nouveau:imbuement", - "count": 1, - "input": { - "tag": "forge:gems/lapis" - }, - "output": "ars_nouveau:source_gem", - "pedestalItems": [], - "source": 500 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/imbuement_manipulation_essence.json b/src/generated/resources/data/ars_nouveau/recipes/imbuement_manipulation_essence.json deleted file mode 100644 index 71041a0d7b..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/imbuement_manipulation_essence.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "ars_nouveau:imbuement", - "count": 1, - "input": { - "tag": "forge:gems/source" - }, - "output": "ars_nouveau:manipulation_essence", - "pedestalItems": [ - { - "item": { - "item": "minecraft:stone_button" - } - }, - { - "item": { - "item": "minecraft:redstone" - } - }, - { - "item": { - "item": "minecraft:clock" - } - } - ], - "source": 2000 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/imbuement_pierce_arrow.json b/src/generated/resources/data/ars_nouveau/recipes/imbuement_pierce_arrow.json deleted file mode 100644 index 61ee903704..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/imbuement_pierce_arrow.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "ars_nouveau:imbuement", - "count": 1, - "input": { - "tag": "minecraft:arrows" - }, - "output": "ars_nouveau:pierce_arrow", - "pedestalItems": [ - { - "item": { - "item": "ars_nouveau:source_gem" - } - }, - { - "item": { - "item": "ars_nouveau:air_essence" - } - }, - { - "item": { - "item": "ars_nouveau:wilden_spike" - } - } - ], - "source": 100 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/imbuement_split_arrow.json b/src/generated/resources/data/ars_nouveau/recipes/imbuement_split_arrow.json deleted file mode 100644 index a0b88ac5c9..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/imbuement_split_arrow.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "ars_nouveau:imbuement", - "count": 1, - "input": { - "tag": "minecraft:arrows" - }, - "output": "ars_nouveau:split_arrow", - "pedestalItems": [ - { - "item": { - "item": "ars_nouveau:source_gem" - } - }, - { - "item": { - "item": "ars_nouveau:air_essence" - } - }, - { - "item": { - "item": "ars_nouveau:wilden_horn" - } - } - ], - "source": 100 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/imbuement_water_essence.json b/src/generated/resources/data/ars_nouveau/recipes/imbuement_water_essence.json deleted file mode 100644 index a2bcaa8865..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/imbuement_water_essence.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "ars_nouveau:imbuement", - "count": 1, - "input": { - "tag": "forge:gems/source" - }, - "output": "ars_nouveau:water_essence", - "pedestalItems": [ - { - "item": { - "item": "minecraft:water_bucket" - } - }, - { - "item": { - "item": "minecraft:snow_block" - } - }, - { - "item": { - "item": "minecraft:kelp" - } - } - ], - "source": 2000 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/infinity_1.json b/src/generated/resources/data/ars_nouveau/recipes/infinity_1.json index 60b7e6037c..e4fd1d3b61 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/infinity_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/infinity_1.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:infinity", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "tag": "forge:storage_blocks/diamond" - } + "tag": "c:storage_blocks/diamond" } ], "sourceCost": 9000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/jar_of_light.json b/src/generated/resources/data/ars_nouveau/recipes/jar_of_light.json index 92a725f8d7..e8c602538d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/jar_of_light.json +++ b/src/generated/resources/data/ars_nouveau/recipes/jar_of_light.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:jar_of_light" - }, "pedestalItems": [ { "item": "minecraft:glowstone" @@ -24,16 +20,18 @@ "item": "minecraft:redstone_lamp" }, { - "tag": "forge:glass" + "tag": "c:glass_blocks" }, { - "tag": "forge:glass" - } - ], - "reagent": [ - { - "item": "minecraft:glass_bottle" + "tag": "c:glass_blocks" } ], + "reagent": { + "item": "minecraft:glass_bottle" + }, + "result": { + "count": 1, + "id": "ars_nouveau:jar_of_light" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/jump_ring.json b/src/generated/resources/data/ars_nouveau/recipes/jump_ring.json index 2045091978..0ca0fdde6f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/jump_ring.json +++ b/src/generated/resources/data/ars_nouveau/recipes/jump_ring.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:jump_ring" - }, "pedestalItems": [ { "item": "ars_nouveau:wilden_wing" @@ -18,10 +14,12 @@ "item": "ars_nouveau:air_essence" } ], - "reagent": [ - { - "item": "ars_nouveau:ring_of_potential" - } - ], + "reagent": { + "item": "ars_nouveau:ring_of_potential" + }, + "result": { + "count": 1, + "id": "ars_nouveau:jump_ring" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/knockback_1.json b/src/generated/resources/data/ars_nouveau/recipes/knockback_1.json index f6968b7000..05fc33c202 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/knockback_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/knockback_1.json @@ -1,27 +1,18 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:knockback", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/knockback_2.json b/src/generated/resources/data/ars_nouveau/recipes/knockback_2.json index 2e4a45884a..de5beb2ed5 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/knockback_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/knockback_2.json @@ -1,32 +1,21 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:knockback", "level": 2, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 4000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/lapis.json b/src/generated/resources/data/ars_nouveau/recipes/lapis.json new file mode 100644 index 0000000000..97e5e993a8 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/lapis.json @@ -0,0 +1,11 @@ +{ + "input": { + "tag": "c:gems/lapis" + }, + "output": { + "count": 1, + "id": "ars_nouveau:source_gem" + }, + "pedestalItems": [], + "source": 500 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/light_blue_dye.json b/src/generated/resources/data/ars_nouveau/recipes/light_blue_dye.json new file mode 100644 index 0000000000..87c100532e --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/light_blue_dye.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:blue_orchid" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 2, + "id": "minecraft:light_blue_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_azure.json b/src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_azure.json new file mode 100644 index 0000000000..6099691164 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_azure.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:azure_bluet" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 2, + "id": "minecraft:light_gray_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_oxeye.json b/src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_oxeye.json new file mode 100644 index 0000000000..c326265924 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_oxeye.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:oxeye_daisy" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 2, + "id": "minecraft:light_gray_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_tulip.json b/src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_tulip.json new file mode 100644 index 0000000000..72b4f9429b --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_tulip.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:white_tulip" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 2, + "id": "minecraft:light_gray_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/lingering_flask_cannon.json b/src/generated/resources/data/ars_nouveau/recipes/lingering_flask_cannon.json index f506e8c119..a373bb7cbf 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/lingering_flask_cannon.json +++ b/src/generated/resources/data/ars_nouveau/recipes/lingering_flask_cannon.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:lingering_flask_cannon" - }, "pedestalItems": [ { "item": "minecraft:dragon_breath" @@ -15,10 +11,12 @@ "item": "ars_nouveau:air_essence" } ], - "reagent": [ - { - "item": "ars_nouveau:splash_flask_cannon" - } - ], + "reagent": { + "item": "ars_nouveau:splash_flask_cannon" + }, + "result": { + "count": 1, + "id": "ars_nouveau:lingering_flask_cannon" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/looting_1.json b/src/generated/resources/data/ars_nouveau/recipes/looting_1.json index b98a29f2f2..f666424baf 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/looting_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/looting_1.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:looting", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:earth_essence" - } + "item": "ars_nouveau:earth_essence" }, { - "item": { - "tag": "forge:gems/emerald" - } + "tag": "c:gems/emerald" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 6000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/looting_2.json b/src/generated/resources/data/ars_nouveau/recipes/looting_2.json index 181b3a1347..2022573276 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/looting_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/looting_2.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:looting", "level": 2, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:earth_essence" - } + "item": "ars_nouveau:earth_essence" }, { - "item": { - "item": "ars_nouveau:earth_essence" - } + "item": "ars_nouveau:earth_essence" }, { - "item": { - "tag": "forge:gems/emerald" - } + "tag": "c:gems/emerald" }, { - "item": { - "tag": "forge:gems/emerald" - } + "tag": "c:gems/emerald" }, { - "item": { - "tag": "forge:gems/emerald" - } + "tag": "c:gems/emerald" }, { - "item": { - "tag": "forge:gems/emerald" - } + "tag": "c:gems/emerald" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 8000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/looting_3.json b/src/generated/resources/data/ars_nouveau/recipes/looting_3.json index 09c1c8cd70..31506b02cc 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/looting_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/looting_3.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:looting", "level": 3, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:earth_essence" - } + "item": "ars_nouveau:earth_essence" }, { - "item": { - "item": "ars_nouveau:earth_essence" - } + "item": "ars_nouveau:earth_essence" }, { - "item": { - "item": "ars_nouveau:earth_essence" - } + "item": "ars_nouveau:earth_essence" }, { - "item": { - "tag": "forge:storage_blocks/emerald" - } + "tag": "c:storage_blocks/emerald" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 9000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/magebloom_crop.json b/src/generated/resources/data/ars_nouveau/recipes/magebloom_crop.json index 8d48647da2..f5eeeedacf 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/magebloom_crop.json +++ b/src/generated/resources/data/ars_nouveau/recipes/magebloom_crop.json @@ -1,27 +1,25 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:magebloom_crop" - }, "pedestalItems": [ { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" - } - ], - "reagent": [ - { - "tag": "forge:seeds" + "tag": "neoforge:gems/source" } ], + "reagent": { + "tag": "c:seeds" + }, + "result": { + "count": 1, + "id": "ars_nouveau:magebloom_crop" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/magenta_dye.json b/src/generated/resources/data/ars_nouveau/recipes/magenta_dye.json new file mode 100644 index 0000000000..b0b98ec438 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/magenta_dye.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:allium" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 2, + "id": "minecraft:magenta_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/magenta_dye_lilac.json b/src/generated/resources/data/ars_nouveau/recipes/magenta_dye_lilac.json new file mode 100644 index 0000000000..231b4a1d57 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/magenta_dye_lilac.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:lilac" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 4, + "id": "minecraft:magenta_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/mana_boost_1.json b/src/generated/resources/data/ars_nouveau/recipes/mana_boost_1.json index 1000d5eb56..6cddbe0b26 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/mana_boost_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/mana_boost_1.json @@ -1,32 +1,21 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:mana_boost", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:sourceberry_bush" - } + "item": "ars_nouveau:sourceberry_bush" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/mana_boost_2.json b/src/generated/resources/data/ars_nouveau/recipes/mana_boost_2.json index ffe14563c7..b537afa183 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/mana_boost_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/mana_boost_2.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:mana_boost", "level": 2, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:sourceberry_bush" - } + "item": "ars_nouveau:sourceberry_bush" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/mana_boost_3.json b/src/generated/resources/data/ars_nouveau/recipes/mana_boost_3.json index c8154bf08b..6e9c86e15e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/mana_boost_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/mana_boost_3.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:mana_boost", "level": 3, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:sourceberry_bush" - } + "item": "ars_nouveau:sourceberry_bush" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/mana_regen_1.json b/src/generated/resources/data/ars_nouveau/recipes/mana_regen_1.json index 757fa80b5f..9b7e2f61f3 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/mana_regen_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/mana_regen_1.json @@ -1,37 +1,24 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:mana_regen", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:sourceberry_bush" - } + "item": "ars_nouveau:sourceberry_bush" }, { - "item": { - "item": "ars_nouveau:sourceberry_bush" - } + "item": "ars_nouveau:sourceberry_bush" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/mana_regen_2.json b/src/generated/resources/data/ars_nouveau/recipes/mana_regen_2.json index 683b539bdb..494ced4dd3 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/mana_regen_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/mana_regen_2.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:mana_regen", "level": 2, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:sourceberry_bush" - } + "item": "ars_nouveau:sourceberry_bush" }, { - "item": { - "item": "ars_nouveau:sourceberry_bush" - } + "item": "ars_nouveau:sourceberry_bush" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/mana_regen_3.json b/src/generated/resources/data/ars_nouveau/recipes/mana_regen_3.json index b623e4d44c..42bfd7dce4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/mana_regen_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/mana_regen_3.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:mana_regen", "level": 3, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:sourceberry_bush" - } + "item": "ars_nouveau:sourceberry_bush" }, { - "item": { - "item": "ars_nouveau:sourceberry_bush" - } + "item": "ars_nouveau:sourceberry_bush" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence.json b/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence.json new file mode 100644 index 0000000000..f1bf0a23b8 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence.json @@ -0,0 +1,21 @@ +{ + "input": { + "tag": "neoforge:gems/source" + }, + "output": { + "count": 1, + "id": "ars_nouveau:manipulation_essence" + }, + "pedestalItems": [ + { + "item": "minecraft:stone_button" + }, + { + "item": "minecraft:redstone" + }, + { + "item": "minecraft:clock" + } + ], + "source": 2000 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/multishot_1.json b/src/generated/resources/data/ars_nouveau/recipes/multishot_1.json index 0fb5795da9..2a1fb47055 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/multishot_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/multishot_1.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:multishot", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 9000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/orange_dye.json b/src/generated/resources/data/ars_nouveau/recipes/orange_dye.json new file mode 100644 index 0000000000..3bbbdc6b39 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/orange_dye.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:orange_tulip" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 2, + "id": "minecraft:orange_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/pierce_arrow.json b/src/generated/resources/data/ars_nouveau/recipes/pierce_arrow.json new file mode 100644 index 0000000000..cff100d0a5 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/pierce_arrow.json @@ -0,0 +1,21 @@ +{ + "input": { + "tag": "minecraft:arrows" + }, + "output": { + "count": 1, + "id": "ars_nouveau:pierce_arrow" + }, + "pedestalItems": [ + { + "item": "ars_nouveau:source_gem" + }, + { + "item": "ars_nouveau:air_essence" + }, + { + "item": "ars_nouveau:wilden_spike" + } + ], + "source": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/piercing_1.json b/src/generated/resources/data/ars_nouveau/recipes/piercing_1.json index 59652efc5f..8e7debdec9 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/piercing_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/piercing_1.json @@ -1,32 +1,21 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:piercing", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 2500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/piercing_2.json b/src/generated/resources/data/ars_nouveau/recipes/piercing_2.json index 9e42d735bf..eea67b4fc8 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/piercing_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/piercing_2.json @@ -1,37 +1,24 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:piercing", "level": 2, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/piercing_3.json b/src/generated/resources/data/ars_nouveau/recipes/piercing_3.json index 30e31855c1..0b8a4742b1 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/piercing_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/piercing_3.json @@ -1,42 +1,27 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:piercing", "level": 3, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 7500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/piercing_4.json b/src/generated/resources/data/ars_nouveau/recipes/piercing_4.json index 98ecf55466..f6ee5992c3 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/piercing_4.json +++ b/src/generated/resources/data/ars_nouveau/recipes/piercing_4.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:piercing", "level": 4, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 9000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/pink_dye.json b/src/generated/resources/data/ars_nouveau/recipes/pink_dye.json new file mode 100644 index 0000000000..f93f927f9f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/pink_dye.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:pink_tulip" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 2, + "id": "minecraft:pink_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/pink_dye_peony.json b/src/generated/resources/data/ars_nouveau/recipes/pink_dye_peony.json new file mode 100644 index 0000000000..0d96ffbfa9 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/pink_dye_peony.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:peony" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 4, + "id": "minecraft:pink_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/potion_diffuser.json b/src/generated/resources/data/ars_nouveau/recipes/potion_diffuser.json index aa2e54c74c..f990b03715 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/potion_diffuser.json +++ b/src/generated/resources/data/ars_nouveau/recipes/potion_diffuser.json @@ -1,18 +1,14 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:potion_diffuser" - }, "pedestalItems": [ { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { "item": "ars_nouveau:archwood_planks" @@ -24,10 +20,12 @@ "item": "ars_nouveau:archwood_planks" } ], - "reagent": [ - { - "item": "minecraft:campfire" - } - ], + "reagent": { + "item": "minecraft:campfire" + }, + "result": { + "count": 1, + "id": "ars_nouveau:potion_diffuser" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/potion_flask.json b/src/generated/resources/data/ars_nouveau/recipes/potion_flask.json index e2a0ba2c7d..b5147c7042 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/potion_flask.json +++ b/src/generated/resources/data/ars_nouveau/recipes/potion_flask.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:potion_flask" - }, "pedestalItems": [ { "item": "ars_nouveau:abjuration_essence" @@ -12,16 +8,18 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "forge:storage_blocks/source" + "tag": "neoforge:storage_blocks/source" }, { - "tag": "forge:storage_blocks/gold" - } - ], - "reagent": [ - { - "item": "minecraft:glass_bottle" + "tag": "c:storage_blocks/gold" } ], + "reagent": { + "item": "minecraft:glass_bottle" + }, + "result": { + "count": 1, + "id": "ars_nouveau:potion_flask" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/potion_flask_amplify.json b/src/generated/resources/data/ars_nouveau/recipes/potion_flask_amplify.json index ce8520c44e..7cdd86a17f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/potion_flask_amplify.json +++ b/src/generated/resources/data/ars_nouveau/recipes/potion_flask_amplify.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:potion_flask_amplify" - }, "pedestalItems": [ { "item": "ars_nouveau:abjuration_essence" @@ -30,10 +26,12 @@ "item": "ars_nouveau:abjuration_essence" } ], - "reagent": [ - { - "item": "ars_nouveau:potion_flask" - } - ], + "reagent": { + "item": "ars_nouveau:potion_flask" + }, + "result": { + "count": 1, + "id": "ars_nouveau:potion_flask_amplify" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/potion_flask_extend_time.json b/src/generated/resources/data/ars_nouveau/recipes/potion_flask_extend_time.json index dca0ccbef1..2cf67bcb42 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/potion_flask_extend_time.json +++ b/src/generated/resources/data/ars_nouveau/recipes/potion_flask_extend_time.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:potion_flask_extend_time" - }, "pedestalItems": [ { "item": "ars_nouveau:manipulation_essence" @@ -30,10 +26,12 @@ "item": "ars_nouveau:manipulation_essence" } ], - "reagent": [ - { - "item": "ars_nouveau:potion_flask" - } - ], + "reagent": { + "item": "ars_nouveau:potion_flask" + }, + "result": { + "count": 1, + "id": "ars_nouveau:potion_flask_extend_time" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/potion_melder.json b/src/generated/resources/data/ars_nouveau/recipes/potion_melder.json index f570d4290b..baed1e3800 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/potion_melder.json +++ b/src/generated/resources/data/ars_nouveau/recipes/potion_melder.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:potion_melder" - }, "pedestalItems": [ { "item": "ars_nouveau:abjuration_essence" @@ -12,28 +8,30 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "forge:storage_blocks/gold" + "tag": "c:storage_blocks/gold" }, { - "tag": "forge:storage_blocks/gold" + "tag": "c:storage_blocks/gold" }, { - "tag": "forge:rods/blaze" + "tag": "c:rods/blaze" }, { - "tag": "forge:rods/blaze" + "tag": "c:rods/blaze" }, { - "tag": "forge:rods/blaze" + "tag": "c:rods/blaze" }, { - "tag": "forge:rods/blaze" - } - ], - "reagent": [ - { - "item": "ars_nouveau:potion_jar" + "tag": "c:rods/blaze" } ], + "reagent": { + "item": "ars_nouveau:potion_jar" + }, + "result": { + "count": 1, + "id": "ars_nouveau:potion_melder" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/power_1.json b/src/generated/resources/data/ars_nouveau/recipes/power_1.json index 65937eb0c0..a29231e5a7 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/power_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/power_1.json @@ -1,22 +1,15 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:power", "level": 1, "pedestalItems": [ { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/power_2.json b/src/generated/resources/data/ars_nouveau/recipes/power_2.json index 4ff116d9f5..2560a1ec51 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/power_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/power_2.json @@ -1,32 +1,21 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:power", "level": 2, "pedestalItems": [ { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/power_3.json b/src/generated/resources/data/ars_nouveau/recipes/power_3.json index 52a291f9a1..2dee7561f1 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/power_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/power_3.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:power", "level": 3, "pedestalItems": [ { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/power_4.json b/src/generated/resources/data/ars_nouveau/recipes/power_4.json index 84f7c6e6a9..7cae887a01 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/power_4.json +++ b/src/generated/resources/data/ars_nouveau/recipes/power_4.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:power", "level": 4, "pedestalItems": [ { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 6500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/power_5.json b/src/generated/resources/data/ars_nouveau/recipes/power_5.json index 3c51b033b7..000bb6584d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/power_5.json +++ b/src/generated/resources/data/ars_nouveau/recipes/power_5.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:power", "level": 5, "pedestalItems": [ { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 9000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_1.json b/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_1.json index a3f35d3130..7db8c3fb14 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_1.json @@ -1,32 +1,21 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:projectile_protection", "level": 1, "pedestalItems": [ { - "item": { - "item": "minecraft:arrow" - } + "item": "minecraft:arrow" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_2.json b/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_2.json index 3cc6f5b2fb..79abaff93e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_2.json @@ -1,37 +1,24 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:projectile_protection", "level": 2, "pedestalItems": [ { - "item": { - "item": "minecraft:arrow" - } + "item": "minecraft:arrow" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_3.json b/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_3.json index f1c6164b1f..7f7d1c4d1c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_3.json @@ -1,42 +1,27 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:projectile_protection", "level": 3, "pedestalItems": [ { - "item": { - "item": "minecraft:arrow" - } + "item": "minecraft:arrow" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_4.json b/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_4.json index 449a4b2233..4bb7f7b2dd 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_4.json +++ b/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_4.json @@ -1,42 +1,27 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:projectile_protection", "level": 4, "pedestalItems": [ { - "item": { - "item": "minecraft:arrow" - } + "item": "minecraft:arrow" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 6500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_5.json b/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_5.json index 6636a9ae60..8b3c74e854 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_5.json +++ b/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_5.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:projectile_protection", "level": 5, "pedestalItems": [ { - "item": { - "item": "minecraft:arrow" - } + "item": "minecraft:arrow" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 8000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/protection_1.json b/src/generated/resources/data/ars_nouveau/recipes/protection_1.json index a0e2390a15..a4432c063c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/protection_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/protection_1.json @@ -1,32 +1,21 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:protection", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/protection_2.json b/src/generated/resources/data/ars_nouveau/recipes/protection_2.json index 43967594d0..cd1a5a6314 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/protection_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/protection_2.json @@ -1,42 +1,27 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:protection", "level": 2, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/protection_3.json b/src/generated/resources/data/ars_nouveau/recipes/protection_3.json index 13c88f6d5d..7c916072e7 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/protection_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/protection_3.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:protection", "level": 3, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/protection_4.json b/src/generated/resources/data/ars_nouveau/recipes/protection_4.json index 4d33121321..8dd77e3a3f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/protection_4.json +++ b/src/generated/resources/data/ars_nouveau/recipes/protection_4.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:protection", "level": 4, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 6500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/protection_5.json b/src/generated/resources/data/ars_nouveau/recipes/protection_5.json index ec733e6878..8dc6257e65 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/protection_5.json +++ b/src/generated/resources/data/ars_nouveau/recipes/protection_5.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:protection", "level": 5, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/diamond" - } + "tag": "c:storage_blocks/diamond" } ], "sourceCost": 8000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/punch_1.json b/src/generated/resources/data/ars_nouveau/recipes/punch_1.json index 76da7d6fe0..86703bcb6d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/punch_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/punch_1.json @@ -1,27 +1,18 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:punch", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/punch_2.json b/src/generated/resources/data/ars_nouveau/recipes/punch_2.json index a347fa5cdd..dc1475a898 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/punch_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/punch_2.json @@ -1,32 +1,21 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:punch", "level": 2, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 4000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/quartz_block_to_quartz.json b/src/generated/resources/data/ars_nouveau/recipes/quartz_block_to_quartz.json new file mode 100644 index 0000000000..536fe4c97f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/quartz_block_to_quartz.json @@ -0,0 +1,15 @@ +{ + "input": { + "tag": "minecraft:storage_blocks/quartz" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 4, + "id": "minecraft:quartz" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/quick_charge_1.json b/src/generated/resources/data/ars_nouveau/recipes/quick_charge_1.json index e9354f2f54..3d8b90e8cc 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/quick_charge_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/quick_charge_1.json @@ -1,27 +1,18 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:quick_charge", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/quick_charge_2.json b/src/generated/resources/data/ars_nouveau/recipes/quick_charge_2.json index 074bd0d480..46db12f751 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/quick_charge_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/quick_charge_2.json @@ -1,32 +1,21 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:quick_charge", "level": 2, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 4000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/quick_charge_3.json b/src/generated/resources/data/ars_nouveau/recipes/quick_charge_3.json index 15948bf705..58b31ced90 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/quick_charge_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/quick_charge_3.json @@ -1,37 +1,24 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:quick_charge", "level": 3, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 6000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/reactive.json b/src/generated/resources/data/ars_nouveau/recipes/reactive.json new file mode 100644 index 0000000000..504a38076c --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/reactive.json @@ -0,0 +1,14 @@ +{ + "pedestalItems": [ + { + "item": "ars_nouveau:spell_parchment" + }, + { + "tag": "c:storage_blocks/lapis" + }, + { + "tag": "neoforge:storage_blocks/source" + } + ], + "sourceCost": 3000 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/reactive_1.json b/src/generated/resources/data/ars_nouveau/recipes/reactive_1.json deleted file mode 100644 index aa6310fc5b..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/reactive_1.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "ars_nouveau:reactive_enchantment", - "pedestalItems": [ - { - "item": { - "item": "ars_nouveau:spell_parchment" - } - }, - { - "item": { - "tag": "forge:storage_blocks/lapis" - } - }, - { - "item": { - "tag": "forge:storage_blocks/source" - } - } - ], - "sourceCost": 3000 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/reactive_2.json b/src/generated/resources/data/ars_nouveau/recipes/reactive_2.json index aa02407e28..401203536c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/reactive_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/reactive_2.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:reactive", "level": 2, "pedestalItems": [ { - "item": { - "item": "minecraft:blaze_powder" - } + "item": "minecraft:blaze_powder" }, { - "item": { - "item": "minecraft:blaze_powder" - } + "item": "minecraft:blaze_powder" }, { - "item": { - "item": "minecraft:blaze_powder" - } + "item": "minecraft:blaze_powder" }, { - "item": { - "item": "minecraft:blaze_powder" - } + "item": "minecraft:blaze_powder" }, { - "item": { - "item": "ars_nouveau:air_essence" - } + "item": "ars_nouveau:air_essence" }, { - "item": { - "item": "ars_nouveau:earth_essence" - } + "item": "ars_nouveau:earth_essence" }, { - "item": { - "item": "ars_nouveau:fire_essence" - } + "item": "ars_nouveau:fire_essence" }, { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" } ], "sourceCost": 6000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/reactive_3.json b/src/generated/resources/data/ars_nouveau/recipes/reactive_3.json index b498abb66a..1ff7e9c23a 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/reactive_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/reactive_3.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:reactive", "level": 3, "pedestalItems": [ { - "item": { - "tag": "forge:gems/emerald" - } + "tag": "c:gems/emerald" }, { - "item": { - "tag": "forge:gems/emerald" - } + "tag": "c:gems/emerald" }, { - "item": { - "tag": "forge:gems/emerald" - } + "tag": "c:gems/emerald" }, { - "item": { - "tag": "forge:gems/emerald" - } + "tag": "c:gems/emerald" }, { - "item": { - "tag": "forge:ender_pearls" - } + "tag": "c:ender_pearls" }, { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "item": "ars_nouveau:conjuration_essence" - } + "item": "ars_nouveau:conjuration_essence" }, { - "item": { - "item": "ars_nouveau:manipulation_essence" - } + "item": "ars_nouveau:manipulation_essence" } ], "sourceCost": 9000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/reactive_4.json b/src/generated/resources/data/ars_nouveau/recipes/reactive_4.json index 056556758b..cc9345c7ba 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/reactive_4.json +++ b/src/generated/resources/data/ars_nouveau/recipes/reactive_4.json @@ -1,37 +1,24 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:reactive", "level": 4, "pedestalItems": [ { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:ender_pearls" - } + "tag": "c:ender_pearls" }, { - "item": { - "item": "ars_nouveau:wilden_tribute" - } + "item": "ars_nouveau:wilden_tribute" } ], "sourceCost": 9000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/red_dye_beetroot.json b/src/generated/resources/data/ars_nouveau/recipes/red_dye_beetroot.json new file mode 100644 index 0000000000..97c5995f03 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/red_dye_beetroot.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:beetroot" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 2, + "id": "minecraft:red_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/red_dye_poppy.json b/src/generated/resources/data/ars_nouveau/recipes/red_dye_poppy.json new file mode 100644 index 0000000000..d24926ac8f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/red_dye_poppy.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:poppy" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 2, + "id": "minecraft:red_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/red_dye_rose_bush.json b/src/generated/resources/data/ars_nouveau/recipes/red_dye_rose_bush.json new file mode 100644 index 0000000000..4417611ea5 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/red_dye_rose_bush.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:rose_bush" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 4, + "id": "minecraft:red_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/red_dye_tulip.json b/src/generated/resources/data/ars_nouveau/recipes/red_dye_tulip.json new file mode 100644 index 0000000000..e5701bb587 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/red_dye_tulip.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:red_tulip" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 2, + "id": "minecraft:red_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/relay_collector.json b/src/generated/resources/data/ars_nouveau/recipes/relay_collector.json index 63f17734b9..48cecb8966 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/relay_collector.json +++ b/src/generated/resources/data/ars_nouveau/recipes/relay_collector.json @@ -1,27 +1,25 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:relay_collector" - }, "pedestalItems": [ { - "tag": "forge:chests" + "tag": "c:chests" }, { - "tag": "forge:chests" + "tag": "c:chests" }, { - "tag": "forge:chests" + "tag": "c:chests" }, { - "tag": "forge:chests" - } - ], - "reagent": [ - { - "item": "ars_nouveau:relay" + "tag": "c:chests" } ], + "reagent": { + "item": "ars_nouveau:relay" + }, + "result": { + "count": 1, + "id": "ars_nouveau:relay_collector" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/relay_deposit.json b/src/generated/resources/data/ars_nouveau/recipes/relay_deposit.json index cdbf51e6a9..28556f903e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/relay_deposit.json +++ b/src/generated/resources/data/ars_nouveau/recipes/relay_deposit.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:relay_deposit" - }, "pedestalItems": [ { "item": "minecraft:hopper" @@ -18,10 +14,12 @@ "item": "minecraft:hopper" } ], - "reagent": [ - { - "item": "ars_nouveau:relay" - } - ], + "reagent": { + "item": "ars_nouveau:relay" + }, + "result": { + "count": 1, + "id": "ars_nouveau:relay_deposit" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/relay_splitter.json b/src/generated/resources/data/ars_nouveau/recipes/relay_splitter.json index 33105fca62..9bfdcf8458 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/relay_splitter.json +++ b/src/generated/resources/data/ars_nouveau/recipes/relay_splitter.json @@ -1,39 +1,37 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:relay_splitter" - }, "pedestalItems": [ { - "tag": "forge:gems/quartz" + "tag": "c:gems/quartz" }, { - "tag": "forge:gems/quartz" + "tag": "c:gems/quartz" }, { - "tag": "forge:gems/quartz" + "tag": "c:gems/quartz" }, { - "tag": "forge:gems/quartz" + "tag": "c:gems/quartz" }, { - "tag": "forge:gems/lapis" + "tag": "c:gems/lapis" }, { - "tag": "forge:gems/lapis" + "tag": "c:gems/lapis" }, { - "tag": "forge:gems/lapis" + "tag": "c:gems/lapis" }, { - "tag": "forge:gems/lapis" - } - ], - "reagent": [ - { - "item": "ars_nouveau:relay" + "tag": "c:gems/lapis" } ], + "reagent": { + "item": "ars_nouveau:relay" + }, + "result": { + "count": 1, + "id": "ars_nouveau:relay_splitter" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/relay_warp.json b/src/generated/resources/data/ars_nouveau/recipes/relay_warp.json index 3e37d0666f..f0ab6f1957 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/relay_warp.json +++ b/src/generated/resources/data/ars_nouveau/recipes/relay_warp.json @@ -1,21 +1,17 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:relay_warp" - }, "pedestalItems": [ { - "tag": "forge:ender_pearls" + "tag": "c:ender_pearls" }, { - "tag": "forge:ender_pearls" + "tag": "c:ender_pearls" }, { - "tag": "forge:ender_pearls" + "tag": "c:ender_pearls" }, { - "tag": "forge:ender_pearls" + "tag": "c:ender_pearls" }, { "item": "minecraft:popped_chorus_fruit" @@ -30,10 +26,12 @@ "item": "minecraft:popped_chorus_fruit" } ], - "reagent": [ - { - "item": "ars_nouveau:relay" - } - ], + "reagent": { + "item": "ars_nouveau:relay" + }, + "result": { + "count": 1, + "id": "ars_nouveau:relay_warp" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/reset.json b/src/generated/resources/data/ars_nouveau/recipes/reset.json index ebc240cd34..ff5e4e82a4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/reset.json +++ b/src/generated/resources/data/ars_nouveau/recipes/reset.json @@ -1,13 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "minecraft:target" - } - } - ], - "output": "ars_nouveau:reset" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:reset" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/respiration_1.json b/src/generated/resources/data/ars_nouveau/recipes/respiration_1.json index 79b23d838c..fe1193a618 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/respiration_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/respiration_1.json @@ -1,22 +1,15 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:respiration", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 3000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/respiration_2.json b/src/generated/resources/data/ars_nouveau/recipes/respiration_2.json index e273c1e705..c17f391921 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/respiration_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/respiration_2.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:respiration", "level": 2, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 6000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/respiration_3.json b/src/generated/resources/data/ars_nouveau/recipes/respiration_3.json index 5917ba205c..9cf8402473 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/respiration_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/respiration_3.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:respiration", "level": 3, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "item": "ars_nouveau:water_essence" - } + "item": "ars_nouveau:water_essence" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" } ], "sourceCost": 9000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/rewind.json b/src/generated/resources/data/ars_nouveau/recipes/rewind.json index 3dd9eb7a6c..1d965153bc 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/rewind.json +++ b/src/generated/resources/data/ars_nouveau/recipes/rewind.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 160, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "minecraft:clock" - } - }, - { - "item": { - "item": "minecraft:clock" - } - }, - { - "item": { - "item": "minecraft:clock" - } - } - ], - "output": "ars_nouveau:rewind" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:rewind" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ring_of_greater_discount.json b/src/generated/resources/data/ars_nouveau/recipes/ring_of_greater_discount.json index 4f8cb058c7..0ce7704009 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ring_of_greater_discount.json +++ b/src/generated/resources/data/ars_nouveau/recipes/ring_of_greater_discount.json @@ -1,39 +1,37 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:ring_of_greater_discount" - }, "pedestalItems": [ { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { - "tag": "forge:rods/blaze" + "tag": "c:rods/blaze" }, { - "tag": "forge:rods/blaze" + "tag": "c:rods/blaze" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" - } - ], - "reagent": [ - { - "item": "ars_nouveau:ring_of_lesser_discount" + "tag": "neoforge:gems/source" } ], + "reagent": { + "item": "ars_nouveau:ring_of_lesser_discount" + }, + "result": { + "count": 1, + "id": "ars_nouveau:ring_of_greater_discount" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/ring_of_lesser_discount.json b/src/generated/resources/data/ars_nouveau/recipes/ring_of_lesser_discount.json index 2cffc16639..92cc04af0d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/ring_of_lesser_discount.json +++ b/src/generated/resources/data/ars_nouveau/recipes/ring_of_lesser_discount.json @@ -1,39 +1,37 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:ring_of_lesser_discount" - }, "pedestalItems": [ { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { - "tag": "forge:ender_pearls" + "tag": "c:ender_pearls" }, { - "tag": "forge:ender_pearls" + "tag": "c:ender_pearls" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" - } - ], - "reagent": [ - { - "item": "ars_nouveau:ring_of_potential" + "tag": "neoforge:gems/source" } ], + "reagent": { + "item": "ars_nouveau:ring_of_potential" + }, + "result": { + "count": 1, + "id": "ars_nouveau:ring_of_lesser_discount" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sandstone_to_sand.json b/src/generated/resources/data/ars_nouveau/recipes/sandstone_to_sand.json new file mode 100644 index 0000000000..ee30b53d3f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/sandstone_to_sand.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:sandstone" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 1, + "id": "minecraft:sand" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/amethyst_blocks.json b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/amethyst_blocks.json index dd5025ee2f..dc53d9e534 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/amethyst_blocks.json +++ b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/amethyst_blocks.json @@ -1,6 +1,4 @@ { - "type": "ars_nouveau:scry_ritual", - "augment": "forge:storage_blocks/amethyst", - "highlight": "forge:storage_blocks/amethyst", - "id": "ars_nouveau:amethyst_blocks" + "augment": "neoforge:storage_blocks/amethyst", + "highlight": "neoforge:storage_blocks/amethyst" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/amethyst_gems.json b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/amethyst_gems.json index e949ca2ca7..db5a6f48e5 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/amethyst_gems.json +++ b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/amethyst_gems.json @@ -1,6 +1,4 @@ { - "type": "ars_nouveau:scry_ritual", - "augment": "forge:gems/amethyst", - "highlight": "forge:storage_blocks/amethyst", - "id": "ars_nouveau:amethyst_gems" + "augment": "neoforge:gems/amethyst", + "highlight": "neoforge:storage_blocks/amethyst" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/coal_ores.json b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/coal_ores.json index 23cb252705..606fcce43d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/coal_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/coal_ores.json @@ -1,6 +1,4 @@ { - "type": "ars_nouveau:scry_ritual", - "augment": "forge:ores/coal", - "highlight": "forge:ores/coal", - "id": "ars_nouveau:coal_ores" + "augment": "neoforge:ores/coal", + "highlight": "neoforge:ores/coal" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/copper_ores.json b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/copper_ores.json index e54da89e4a..b3c03b1c40 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/copper_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/copper_ores.json @@ -1,6 +1,4 @@ { - "type": "ars_nouveau:scry_ritual", - "augment": "forge:ores/copper", - "highlight": "forge:ores/copper", - "id": "ars_nouveau:copper_ores" + "augment": "neoforge:ores/copper", + "highlight": "neoforge:ores/copper" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/diamond_ores.json b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/diamond_ores.json index 114c25b04c..ad0d84d724 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/diamond_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/diamond_ores.json @@ -1,6 +1,4 @@ { - "type": "ars_nouveau:scry_ritual", - "augment": "forge:ores/diamond", - "highlight": "forge:ores/diamond", - "id": "ars_nouveau:diamond_ores" + "augment": "neoforge:ores/diamond", + "highlight": "neoforge:ores/diamond" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/emerald_ores.json b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/emerald_ores.json index f0d97d4dd6..bee2fb1f18 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/emerald_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/emerald_ores.json @@ -1,6 +1,4 @@ { - "type": "ars_nouveau:scry_ritual", - "augment": "forge:ores/emerald", - "highlight": "forge:ores/emerald", - "id": "ars_nouveau:emerald_ores" + "augment": "neoforge:ores/emerald", + "highlight": "neoforge:ores/emerald" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/gold_ores.json b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/gold_ores.json index 95d061d4dc..5bc0c807d0 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/gold_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/gold_ores.json @@ -1,6 +1,4 @@ { - "type": "ars_nouveau:scry_ritual", - "augment": "forge:ores/gold", - "highlight": "forge:ores/gold", - "id": "ars_nouveau:gold_ores" + "augment": "neoforge:ores/gold", + "highlight": "neoforge:ores/gold" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/iron_ores.json b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/iron_ores.json index 3a513ca34a..b81c3ac228 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/iron_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/iron_ores.json @@ -1,6 +1,4 @@ { - "type": "ars_nouveau:scry_ritual", - "augment": "forge:ores/iron", - "highlight": "forge:ores/iron", - "id": "ars_nouveau:iron_ores" + "augment": "neoforge:ores/iron", + "highlight": "neoforge:ores/iron" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/lapis_ores.json b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/lapis_ores.json index fde00d0c51..fdbfe4593c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/lapis_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/lapis_ores.json @@ -1,6 +1,4 @@ { - "type": "ars_nouveau:scry_ritual", - "augment": "forge:ores/lapis", - "highlight": "forge:ores/lapis", - "id": "ars_nouveau:lapis_ores" + "augment": "neoforge:ores/lapis", + "highlight": "neoforge:ores/lapis" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/netherite_scrap_ores.json b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/netherite_scrap_ores.json index b5380bb96f..0ad525db2d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/netherite_scrap_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/netherite_scrap_ores.json @@ -1,6 +1,4 @@ { - "type": "ars_nouveau:scry_ritual", - "augment": "forge:ores/netherite_scrap", - "highlight": "forge:ores/netherite_scrap", - "id": "ars_nouveau:netherite_scrap_ores" + "augment": "neoforge:ores/netherite_scrap", + "highlight": "neoforge:ores/netherite_scrap" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/quartz_ores.json b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/quartz_ores.json index 6b8124c898..b63ccc45ff 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/quartz_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/quartz_ores.json @@ -1,6 +1,4 @@ { - "type": "ars_nouveau:scry_ritual", - "augment": "forge:ores/quartz", - "highlight": "forge:ores/quartz", - "id": "ars_nouveau:quartz_ores" + "augment": "neoforge:ores/quartz", + "highlight": "neoforge:ores/quartz" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/redstone_ores.json b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/redstone_ores.json index a672b641b9..acc5ed339f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/redstone_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/redstone_ores.json @@ -1,6 +1,4 @@ { - "type": "ars_nouveau:scry_ritual", - "augment": "forge:ores/redstone", - "highlight": "forge:ores/redstone", - "id": "ars_nouveau:redstone_ores" + "augment": "neoforge:ores/redstone", + "highlight": "neoforge:ores/redstone" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/scryers_oculus.json b/src/generated/resources/data/ars_nouveau/recipes/scryers_oculus.json index 4320045ff7..a21aff613e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/scryers_oculus.json +++ b/src/generated/resources/data/ars_nouveau/recipes/scryers_oculus.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:scryers_oculus" - }, "pedestalItems": [ { "item": "minecraft:observer" @@ -12,16 +8,18 @@ "item": "minecraft:spyglass" }, { - "tag": "forge:storage_blocks/source" + "tag": "neoforge:storage_blocks/source" }, { - "tag": "forge:gems/diamond" - } - ], - "reagent": [ - { - "item": "minecraft:ender_eye" + "tag": "c:gems/diamond" } ], + "reagent": { + "item": "minecraft:ender_eye" + }, + "result": { + "count": 1, + "id": "ars_nouveau:scryers_oculus" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/second_armor_upgrade.json b/src/generated/resources/data/ars_nouveau/recipes/second_armor_upgrade.json new file mode 100644 index 0000000000..d00ef35d90 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/second_armor_upgrade.json @@ -0,0 +1,15 @@ +{ + "pedestalItems": [ + { + "tag": "c:ender_pearls" + }, + { + "tag": "c:ender_pearls" + }, + { + "item": "minecraft:chorus_fruit" + } + ], + "sourceCost": 5000, + "tier": 2 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/shapers_focus.json b/src/generated/resources/data/ars_nouveau/recipes/shapers_focus.json index 78ebf4faf5..48a39ecaaf 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/shapers_focus.json +++ b/src/generated/resources/data/ars_nouveau/recipes/shapers_focus.json @@ -1,12 +1,8 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:shapers_focus" - }, "pedestalItems": [ { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { "item": "minecraft:piston" @@ -15,13 +11,15 @@ "item": "minecraft:slime_block" }, { - "tag": "forge:gems/diamond" - } - ], - "reagent": [ - { - "item": "ars_nouveau:manipulation_essence" + "tag": "c:gems/diamond" } ], + "reagent": { + "item": "ars_nouveau:manipulation_essence" + }, + "result": { + "count": 1, + "id": "ars_nouveau:shapers_focus" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sharpness_1.json b/src/generated/resources/data/ars_nouveau/recipes/sharpness_1.json index 571903f27a..6b7a23f36c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sharpness_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/sharpness_1.json @@ -1,27 +1,18 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:sharpness", "level": 1, "pedestalItems": [ { - "item": { - "tag": "forge:storage_blocks/quartz" - } + "item": "minecraft:quartz_block" }, { - "item": { - "tag": "forge:storage_blocks/quartz" - } + "item": "minecraft:quartz_block" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/sharpness_2.json b/src/generated/resources/data/ars_nouveau/recipes/sharpness_2.json index 1e09d6e1c5..5bfd21b01b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sharpness_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/sharpness_2.json @@ -1,32 +1,21 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:sharpness", "level": 2, "pedestalItems": [ { - "item": { - "tag": "forge:storage_blocks/quartz" - } + "item": "minecraft:quartz_block" }, { - "item": { - "tag": "forge:storage_blocks/quartz" - } + "item": "minecraft:quartz_block" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/sharpness_3.json b/src/generated/resources/data/ars_nouveau/recipes/sharpness_3.json index b245cad4be..38a97c3b4c 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sharpness_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/sharpness_3.json @@ -1,27 +1,18 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:sharpness", "level": 3, "pedestalItems": [ { - "item": { - "tag": "forge:storage_blocks/quartz" - } + "item": "minecraft:quartz_block" }, { - "item": { - "tag": "forge:storage_blocks/quartz" - } + "item": "minecraft:quartz_block" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/sharpness_4.json b/src/generated/resources/data/ars_nouveau/recipes/sharpness_4.json index 5cac1bdd32..7a77f504cc 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sharpness_4.json +++ b/src/generated/resources/data/ars_nouveau/recipes/sharpness_4.json @@ -1,32 +1,21 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:sharpness", "level": 4, "pedestalItems": [ { - "item": { - "tag": "forge:storage_blocks/quartz" - } + "item": "minecraft:quartz_block" }, { - "item": { - "tag": "forge:storage_blocks/quartz" - } + "item": "minecraft:quartz_block" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 6500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/sharpness_5.json b/src/generated/resources/data/ars_nouveau/recipes/sharpness_5.json index 270f84c096..2ad79a3ce4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sharpness_5.json +++ b/src/generated/resources/data/ars_nouveau/recipes/sharpness_5.json @@ -1,37 +1,24 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:sharpness", "level": 5, "pedestalItems": [ { - "item": { - "tag": "forge:storage_blocks/quartz" - } + "item": "minecraft:quartz_block" }, { - "item": { - "tag": "forge:storage_blocks/quartz" - } + "item": "minecraft:quartz_block" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 8000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/silk_touch_1.json b/src/generated/resources/data/ars_nouveau/recipes/silk_touch_1.json index 4962c209a3..0b5470644a 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/silk_touch_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/silk_touch_1.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:silk_touch", "level": 1, "pedestalItems": [ { - "item": { - "tag": "forge:gems/emerald" - } + "tag": "c:gems/emerald" }, { - "item": { - "tag": "forge:gems/emerald" - } + "tag": "c:gems/emerald" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 9000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/smite_1.json b/src/generated/resources/data/ars_nouveau/recipes/smite_1.json index a66e3d0cdb..98b5c7675d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smite_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/smite_1.json @@ -1,27 +1,18 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:smite", "level": 1, "pedestalItems": [ { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/smite_2.json b/src/generated/resources/data/ars_nouveau/recipes/smite_2.json index fd49b9be64..df0691a88f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smite_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/smite_2.json @@ -1,32 +1,21 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:smite", "level": 2, "pedestalItems": [ { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/smite_3.json b/src/generated/resources/data/ars_nouveau/recipes/smite_3.json index 31a39e819e..f68cd4c339 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smite_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/smite_3.json @@ -1,37 +1,24 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:smite", "level": 3, "pedestalItems": [ { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/smite_4.json b/src/generated/resources/data/ars_nouveau/recipes/smite_4.json index 2e3be24d3f..79f05bc699 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smite_4.json +++ b/src/generated/resources/data/ars_nouveau/recipes/smite_4.json @@ -1,42 +1,27 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:smite", "level": 4, "pedestalItems": [ { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 6500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/smite_5.json b/src/generated/resources/data/ars_nouveau/recipes/smite_5.json index 5f33b6419f..e1b3e0a9af 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/smite_5.json +++ b/src/generated/resources/data/ars_nouveau/recipes/smite_5.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:smite", "level": 5, "pedestalItems": [ { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "item": "minecraft:bone_block" - } + "item": "minecraft:bone_block" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 8000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/sorcerer_boots.json b/src/generated/resources/data/ars_nouveau/recipes/sorcerer_boots.json index 2b05c58f56..fd3dce2614 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sorcerer_boots.json +++ b/src/generated/resources/data/ars_nouveau/recipes/sorcerer_boots.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:sorcerer_boots" - }, "pedestalItems": [ { "item": "ars_nouveau:magebloom_fiber" @@ -18,10 +14,12 @@ "item": "ars_nouveau:magebloom_fiber" } ], - "reagent": [ - { - "item": "minecraft:golden_boots" - } - ], + "reagent": { + "item": "minecraft:golden_boots" + }, + "result": { + "count": 1, + "id": "ars_nouveau:sorcerer_boots" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sorcerer_hood.json b/src/generated/resources/data/ars_nouveau/recipes/sorcerer_hood.json index 7cbe1f1b06..75f8775a05 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sorcerer_hood.json +++ b/src/generated/resources/data/ars_nouveau/recipes/sorcerer_hood.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:sorcerer_hood" - }, "pedestalItems": [ { "item": "ars_nouveau:magebloom_fiber" @@ -18,10 +14,12 @@ "item": "ars_nouveau:magebloom_fiber" } ], - "reagent": [ - { - "item": "minecraft:golden_helmet" - } - ], + "reagent": { + "item": "minecraft:golden_helmet" + }, + "result": { + "count": 1, + "id": "ars_nouveau:sorcerer_hood" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sorcerer_leggings.json b/src/generated/resources/data/ars_nouveau/recipes/sorcerer_leggings.json index 00b256452b..a2be1bf20a 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sorcerer_leggings.json +++ b/src/generated/resources/data/ars_nouveau/recipes/sorcerer_leggings.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:sorcerer_leggings" - }, "pedestalItems": [ { "item": "ars_nouveau:magebloom_fiber" @@ -18,10 +14,12 @@ "item": "ars_nouveau:magebloom_fiber" } ], - "reagent": [ - { - "item": "minecraft:golden_leggings" - } - ], + "reagent": { + "item": "minecraft:golden_leggings" + }, + "result": { + "count": 1, + "id": "ars_nouveau:sorcerer_leggings" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sorcerer_robes.json b/src/generated/resources/data/ars_nouveau/recipes/sorcerer_robes.json index 752f54d45e..dd9c7b3b67 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/sorcerer_robes.json +++ b/src/generated/resources/data/ars_nouveau/recipes/sorcerer_robes.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:sorcerer_robes" - }, "pedestalItems": [ { "item": "ars_nouveau:magebloom_fiber" @@ -18,10 +14,12 @@ "item": "ars_nouveau:magebloom_fiber" } ], - "reagent": [ - { - "item": "minecraft:golden_chestplate" - } - ], + "reagent": { + "item": "minecraft:golden_chestplate" + }, + "result": { + "count": 1, + "id": "ars_nouveau:sorcerer_robes" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/spell_bow.json b/src/generated/resources/data/ars_nouveau/recipes/spell_bow.json index dd364e994a..43c09f9344 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/spell_bow.json +++ b/src/generated/resources/data/ars_nouveau/recipes/spell_bow.json @@ -1,24 +1,22 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:spell_bow" - }, "pedestalItems": [ { - "tag": "forge:storage_blocks/source" + "tag": "neoforge:storage_blocks/source" }, { - "tag": "forge:storage_blocks/gold" + "tag": "c:storage_blocks/gold" }, { "item": "ars_nouveau:manipulation_essence" } ], - "reagent": [ - { - "item": "minecraft:bow" - } - ], + "reagent": { + "item": "minecraft:bow" + }, + "result": { + "count": 1, + "id": "ars_nouveau:spell_bow" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/spell_crossbow.json b/src/generated/resources/data/ars_nouveau/recipes/spell_crossbow.json index 4e33daf78d..aa0557c8f2 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/spell_crossbow.json +++ b/src/generated/resources/data/ars_nouveau/recipes/spell_crossbow.json @@ -1,24 +1,22 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:spell_crossbow" - }, "pedestalItems": [ { - "tag": "forge:storage_blocks/gold" + "tag": "c:storage_blocks/gold" }, { "item": "ars_nouveau:manipulation_essence" }, { - "tag": "forge:storage_blocks/source" - } - ], - "reagent": [ - { - "item": "minecraft:crossbow" + "tag": "neoforge:storage_blocks/source" } ], + "reagent": { + "item": "minecraft:crossbow" + }, + "result": { + "count": 1, + "id": "ars_nouveau:spell_crossbow" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/spell_sensor.json b/src/generated/resources/data/ars_nouveau/recipes/spell_sensor.json index c79518cb62..377bd91b6f 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/spell_sensor.json +++ b/src/generated/resources/data/ars_nouveau/recipes/spell_sensor.json @@ -1,14 +1,12 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:spell_sensor" - }, "pedestalItems": [], - "reagent": [ - { - "item": "minecraft:sculk_sensor" - } - ], + "reagent": { + "item": "minecraft:sculk_sensor" + }, + "result": { + "count": 1, + "id": "ars_nouveau:spell_sensor" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/spell_turret.json b/src/generated/resources/data/ars_nouveau/recipes/spell_turret.json index 4cb2632be2..c9f71a9ec2 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/spell_turret.json +++ b/src/generated/resources/data/ars_nouveau/recipes/spell_turret.json @@ -1,24 +1,22 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:spell_turret" - }, "pedestalItems": [ { - "tag": "forge:storage_blocks/source" + "tag": "neoforge:storage_blocks/source" }, { - "tag": "forge:rods/blaze" + "tag": "c:rods/blaze" }, { - "tag": "forge:rods/blaze" - } - ], - "reagent": [ - { - "item": "ars_nouveau:basic_spell_turret" + "tag": "c:rods/blaze" } ], + "reagent": { + "item": "ars_nouveau:basic_spell_turret" + }, + "result": { + "count": 1, + "id": "ars_nouveau:spell_turret" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/spell_write.json b/src/generated/resources/data/ars_nouveau/recipes/spell_write.json index a21e219483..6037254797 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/spell_write.json +++ b/src/generated/resources/data/ars_nouveau/recipes/spell_write.json @@ -1,11 +1,8 @@ { - "type": "ars_nouveau:spell_write", "pedestalItems": [ { - "item": { - "item": "ars_nouveau:spell_parchment" - } + "item": "ars_nouveau:spell_parchment" } ], - "sourceCost": 0 + "sourceCost": 3000 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/splash_flask_cannon.json b/src/generated/resources/data/ars_nouveau/recipes/splash_flask_cannon.json index 189383e4aa..b85bf2abb0 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/splash_flask_cannon.json +++ b/src/generated/resources/data/ars_nouveau/recipes/splash_flask_cannon.json @@ -1,39 +1,37 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:splash_flask_cannon" - }, "pedestalItems": [ { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { - "tag": "forge:rods/blaze" + "tag": "c:rods/blaze" }, { - "tag": "forge:rods/blaze" + "tag": "c:rods/blaze" }, { - "tag": "forge:gunpowder" + "tag": "c:gunpowders" }, { - "tag": "forge:gunpowder" + "tag": "c:gunpowders" }, { - "tag": "forge:gunpowder" + "tag": "c:gunpowders" }, { - "tag": "forge:gunpowder" - } - ], - "reagent": [ - { - "item": "minecraft:dispenser" + "tag": "c:gunpowders" } ], + "reagent": { + "item": "minecraft:dispenser" + }, + "result": { + "count": 1, + "id": "ars_nouveau:splash_flask_cannon" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/split_arrow.json b/src/generated/resources/data/ars_nouveau/recipes/split_arrow.json new file mode 100644 index 0000000000..26ad9229f0 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/split_arrow.json @@ -0,0 +1,21 @@ +{ + "input": { + "tag": "minecraft:arrows" + }, + "output": { + "count": 1, + "id": "ars_nouveau:split_arrow" + }, + "pedestalItems": [ + { + "item": "ars_nouveau:source_gem" + }, + { + "item": "ars_nouveau:air_essence" + }, + { + "item": "ars_nouveau:wilden_horn" + } + ], + "source": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/stable_warp_scroll.json b/src/generated/resources/data/ars_nouveau/recipes/stable_warp_scroll.json index eca7dcb40a..60b63026cc 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/stable_warp_scroll.json +++ b/src/generated/resources/data/ars_nouveau/recipes/stable_warp_scroll.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:stable_warp_scroll" - }, "pedestalItems": [ { "item": "minecraft:blaze_powder" @@ -18,16 +14,18 @@ "item": "minecraft:blaze_powder" }, { - "tag": "forge:ender_pearls" + "tag": "c:ender_pearls" }, { - "tag": "forge:ender_pearls" - } - ], - "reagent": [ - { - "item": "ars_nouveau:warp_scroll" + "tag": "c:ender_pearls" } ], + "reagent": { + "item": "ars_nouveau:warp_scroll" + }, + "result": { + "count": 1, + "id": "ars_nouveau:stable_warp_scroll" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/starbuncle_charm.json b/src/generated/resources/data/ars_nouveau/recipes/starbuncle_charm.json index af51a80c71..b7d43ac5c9 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/starbuncle_charm.json +++ b/src/generated/resources/data/ars_nouveau/recipes/starbuncle_charm.json @@ -1,27 +1,25 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "item": "ars_nouveau:starbuncle_charm" - }, "pedestalItems": [ { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { - "tag": "forge:ingots/gold" - } - ], - "reagent": [ - { - "item": "ars_nouveau:starbuncle_shards" + "tag": "c:ingots/gold" } ], + "reagent": { + "item": "ars_nouveau:starbuncle_shards" + }, + "result": { + "count": 1, + "id": "ars_nouveau:starbuncle_charm" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/stone.json b/src/generated/resources/data/ars_nouveau/recipes/stone.json new file mode 100644 index 0000000000..81e9a7c69a --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/stone.json @@ -0,0 +1,15 @@ +{ + "input": { + "tag": "c:stones" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 1, + "id": "minecraft:gravel" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/storage_lectern.json b/src/generated/resources/data/ars_nouveau/recipes/storage_lectern.json index 28f4aaf3a2..e16d8e1763 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/storage_lectern.json +++ b/src/generated/resources/data/ars_nouveau/recipes/storage_lectern.json @@ -1,27 +1,25 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:storage_lectern" - }, "pedestalItems": [ { - "tag": "forge:chests" + "tag": "c:chests" }, { - "tag": "forge:chests" + "tag": "c:chests" }, { - "tag": "forge:chests" + "tag": "c:chests" }, { - "tag": "forge:chests" - } - ], - "reagent": [ - { - "item": "minecraft:lectern" + "tag": "c:chests" } ], + "reagent": { + "item": "minecraft:lectern" + }, + "result": { + "count": 1, + "id": "ars_nouveau:storage_lectern" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sugar_cane.json b/src/generated/resources/data/ars_nouveau/recipes/sugar_cane.json new file mode 100644 index 0000000000..d87f2b1907 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/sugar_cane.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:sugar_cane" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 2, + "id": "minecraft:sugar" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/summon_focus.json b/src/generated/resources/data/ars_nouveau/recipes/summon_focus.json index 244340f2e0..2f3a385d20 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/summon_focus.json +++ b/src/generated/resources/data/ars_nouveau/recipes/summon_focus.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:summon_focus" - }, "pedestalItems": [ { "item": "ars_nouveau:wilden_horn" @@ -18,13 +14,15 @@ "item": "ars_nouveau:wilden_tribute" }, { - "tag": "forge:ingots/gold" - } - ], - "reagent": [ - { - "tag": "forge:storage_blocks/source" + "tag": "c:ingots/gold" } ], + "reagent": { + "tag": "neoforge:storage_blocks/source" + }, + "result": { + "count": 1, + "id": "ars_nouveau:summon_focus" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/summon_ritual/bats.json b/src/generated/resources/data/ars_nouveau/recipes/summon_ritual/bats.json index c8a2c75724..3dd57abd16 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/summon_ritual/bats.json +++ b/src/generated/resources/data/ars_nouveau/recipes/summon_ritual/bats.json @@ -1,5 +1,4 @@ { - "type": "ars_nouveau:summon_ritual", "augment": { "item": "minecraft:amethyst_shard" }, @@ -10,5 +9,7 @@ "weight": 1 } ], - "source": "MOB_LIST" + "source": { + "mobSource": "MOB_LIST" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sweeping_1.json b/src/generated/resources/data/ars_nouveau/recipes/sweeping_1.json deleted file mode 100644 index bfd7e9acaa..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/sweeping_1.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "ars_nouveau:enchantment", - "enchantment": "minecraft:sweeping", - "level": 1, - "pedestalItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "tag": "forge:storage_blocks/source" - } - }, - { - "item": { - "tag": "forge:storage_blocks/lapis" - } - } - ], - "sourceCost": 2000 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sweeping_2.json b/src/generated/resources/data/ars_nouveau/recipes/sweeping_2.json deleted file mode 100644 index b643a15062..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/sweeping_2.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "type": "ars_nouveau:enchantment", - "enchantment": "minecraft:sweeping", - "level": 2, - "pedestalItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "tag": "forge:storage_blocks/source" - } - }, - { - "item": { - "tag": "forge:storage_blocks/source" - } - }, - { - "item": { - "tag": "forge:storage_blocks/lapis" - } - }, - { - "item": { - "tag": "forge:storage_blocks/lapis" - } - } - ], - "sourceCost": 3500 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sweeping_3.json b/src/generated/resources/data/ars_nouveau/recipes/sweeping_3.json deleted file mode 100644 index 74490f1d78..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/sweeping_3.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "type": "ars_nouveau:enchantment", - "enchantment": "minecraft:sweeping", - "level": 3, - "pedestalItems": [ - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "item": "ars_nouveau:manipulation_essence" - } - }, - { - "item": { - "tag": "forge:storage_blocks/source" - } - }, - { - "item": { - "tag": "forge:storage_blocks/source" - } - }, - { - "item": { - "tag": "forge:storage_blocks/lapis" - } - }, - { - "item": { - "tag": "forge:storage_blocks/lapis" - } - }, - { - "item": { - "tag": "forge:storage_blocks/lapis" - } - } - ], - "sourceCost": 5000 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_1.json b/src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_1.json new file mode 100644 index 0000000000..f20d20eda1 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_1.json @@ -0,0 +1,16 @@ +{ + "enchantment": "minecraft:sweeping_edge", + "level": 1, + "pedestalItems": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "tag": "neoforge:storage_blocks/source" + }, + { + "tag": "c:storage_blocks/lapis" + } + ], + "sourceCost": 2000 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_2.json b/src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_2.json new file mode 100644 index 0000000000..4298f74d1c --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_2.json @@ -0,0 +1,25 @@ +{ + "enchantment": "minecraft:sweeping_edge", + "level": 2, + "pedestalItems": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "tag": "neoforge:storage_blocks/source" + }, + { + "tag": "neoforge:storage_blocks/source" + }, + { + "tag": "c:storage_blocks/lapis" + }, + { + "tag": "c:storage_blocks/lapis" + } + ], + "sourceCost": 3500 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_3.json b/src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_3.json new file mode 100644 index 0000000000..4016e072ef --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_3.json @@ -0,0 +1,31 @@ +{ + "enchantment": "minecraft:sweeping_edge", + "level": 3, + "pedestalItems": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "tag": "neoforge:storage_blocks/source" + }, + { + "tag": "neoforge:storage_blocks/source" + }, + { + "tag": "c:storage_blocks/lapis" + }, + { + "tag": "c:storage_blocks/lapis" + }, + { + "tag": "c:storage_blocks/lapis" + } + ], + "sourceCost": 5000 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/terracotta.json b/src/generated/resources/data/ars_nouveau/recipes/terracotta.json new file mode 100644 index 0000000000..e69b6fdca8 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/terracotta.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:terracotta" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 1, + "id": "minecraft:red_sand" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thorns_1.json b/src/generated/resources/data/ars_nouveau/recipes/thorns_1.json index 9216ff5a8f..456b2bae9e 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thorns_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thorns_1.json @@ -1,22 +1,15 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:thorns", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:wilden_spike" - } + "item": "ars_nouveau:wilden_spike" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/thorns_2.json b/src/generated/resources/data/ars_nouveau/recipes/thorns_2.json index 48d8406686..889531fcaf 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thorns_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thorns_2.json @@ -1,37 +1,24 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:thorns", "level": 2, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:wilden_spike" - } + "item": "ars_nouveau:wilden_spike" }, { - "item": { - "item": "ars_nouveau:wilden_spike" - } + "item": "ars_nouveau:wilden_spike" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/thorns_3.json b/src/generated/resources/data/ars_nouveau/recipes/thorns_3.json index b1984802bb..2f1e8cf715 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thorns_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thorns_3.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:thorns", "level": 3, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:wilden_spike" - } + "item": "ars_nouveau:wilden_spike" }, { - "item": { - "item": "ars_nouveau:wilden_spike" - } + "item": "ars_nouveau:wilden_spike" }, { - "item": { - "item": "ars_nouveau:wilden_spike" - } + "item": "ars_nouveau:wilden_spike" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_amethyst_golem.json b/src/generated/resources/data/ars_nouveau/recipes/thread_amethyst_golem.json index 95e666eb17..895fcb7875 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_amethyst_golem.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_amethyst_golem.json @@ -1,24 +1,22 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_amethyst_golem" - }, "pedestalItems": [ { - "tag": "forge:obsidian" + "tag": "c:obsidians" }, { - "tag": "forge:obsidian" + "tag": "c:obsidians" }, { - "tag": "forge:obsidian" - } - ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" + "tag": "c:obsidians" } ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_amethyst_golem" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_chilling.json b/src/generated/resources/data/ars_nouveau/recipes/thread_chilling.json index 9fd3057eeb..61705d81e6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_chilling.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_chilling.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_chilling" - }, "pedestalItems": [ { "item": "minecraft:blue_ice" @@ -18,10 +14,12 @@ "item": "minecraft:powder_snow_bucket" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_chilling" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_depths.json b/src/generated/resources/data/ars_nouveau/recipes/thread_depths.json index b70f44fc2f..0c444fb969 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_depths.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_depths.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_depths" - }, "pedestalItems": [ { "tag": "minecraft:fishes" @@ -24,10 +20,12 @@ "item": "minecraft:pufferfish" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_depths" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_drygmy.json b/src/generated/resources/data/ars_nouveau/recipes/thread_drygmy.json index fb90f8aeb0..aa66201a90 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_drygmy.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_drygmy.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_drygmy" - }, "pedestalItems": [ { "item": "ars_nouveau:drygmy_shard" @@ -24,10 +20,12 @@ "item": "minecraft:rabbit_foot" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_drygmy" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_feather.json b/src/generated/resources/data/ars_nouveau/recipes/thread_feather.json index 9fc782fddf..a88b72c018 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_feather.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_feather.json @@ -1,21 +1,17 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_feather" - }, "pedestalItems": [ { - "tag": "forge:feathers" + "tag": "c:feathers" }, { - "tag": "forge:feathers" + "tag": "c:feathers" }, { - "tag": "forge:feathers" + "tag": "c:feathers" }, { - "tag": "forge:feathers" + "tag": "c:feathers" }, { "item": "ars_nouveau:abjuration_essence" @@ -24,10 +20,12 @@ "item": "ars_nouveau:abjuration_essence" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_feather" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_gliding.json b/src/generated/resources/data/ars_nouveau/recipes/thread_gliding.json index 087697d926..f858c274cd 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_gliding.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_gliding.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_gliding" - }, "pedestalItems": [ { "item": "ars_nouveau:air_essence" @@ -15,10 +11,12 @@ "item": "minecraft:elytra" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_gliding" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_heights.json b/src/generated/resources/data/ars_nouveau/recipes/thread_heights.json index db6e83e41d..f1ef2e4dc3 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_heights.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_heights.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_heights" - }, "pedestalItems": [ { "item": "minecraft:spider_eye" @@ -24,10 +20,12 @@ "item": "ars_nouveau:air_essence" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_heights" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_high_step.json b/src/generated/resources/data/ars_nouveau/recipes/thread_high_step.json index 4ff9f2d698..befedf1c35 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_high_step.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_high_step.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_high_step" - }, "pedestalItems": [ { "item": "ars_nouveau:air_essence" @@ -15,10 +11,12 @@ "item": "ars_nouveau:air_essence" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_high_step" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_immolation.json b/src/generated/resources/data/ars_nouveau/recipes/thread_immolation.json index 0f43ec1845..7001a15f40 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_immolation.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_immolation.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_immolation" - }, "pedestalItems": [ { "item": "ars_nouveau:fire_essence" @@ -15,10 +11,12 @@ "item": "ars_nouveau:fire_essence" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_immolation" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_kindling.json b/src/generated/resources/data/ars_nouveau/recipes/thread_kindling.json index a92812e12f..7007c7302d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_kindling.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_kindling.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_kindling" - }, "pedestalItems": [ { "item": "minecraft:magma_cream" @@ -15,10 +11,12 @@ "item": "minecraft:fire_charge" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_kindling" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_life_drain.json b/src/generated/resources/data/ars_nouveau/recipes/thread_life_drain.json index d02a7a2945..0d8d44bd69 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_life_drain.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_life_drain.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_life_drain" - }, "pedestalItems": [ { "item": "ars_nouveau:mendosteen_pod" @@ -18,10 +14,12 @@ "item": "ars_nouveau:abjuration_essence" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_life_drain" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_magic_capacity.json b/src/generated/resources/data/ars_nouveau/recipes/thread_magic_capacity.json index 9806252b82..8492f58dd4 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_magic_capacity.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_magic_capacity.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_magic_capacity" - }, "pedestalItems": [ { "item": "ars_nouveau:sourceberry_bush" @@ -24,10 +20,12 @@ "item": "ars_nouveau:magebloom" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_magic_capacity" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_repairing.json b/src/generated/resources/data/ars_nouveau/recipes/thread_repairing.json index dd170837ed..85a945c4ca 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_repairing.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_repairing.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_repairing" - }, "pedestalItems": [ { "item": "minecraft:anvil" @@ -15,10 +11,12 @@ "item": "ars_nouveau:manipulation_essence" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_repairing" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_spellpower.json b/src/generated/resources/data/ars_nouveau/recipes/thread_spellpower.json index 86ec55928b..f87f0f9a4b 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_spellpower.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_spellpower.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_spellpower" - }, "pedestalItems": [ { "item": "ars_nouveau:fire_essence" @@ -30,10 +26,12 @@ "item": "ars_nouveau:conjuration_essence" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_spellpower" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_starbuncle.json b/src/generated/resources/data/ars_nouveau/recipes/thread_starbuncle.json index 47c4b44395..61a60f77cf 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_starbuncle.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_starbuncle.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_starbuncle" - }, "pedestalItems": [ { "item": "ars_nouveau:starbuncle_shards" @@ -30,10 +26,12 @@ "item": "ars_nouveau:manipulation_essence" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_starbuncle" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_undying.json b/src/generated/resources/data/ars_nouveau/recipes/thread_undying.json index fd47935fbb..a8ba1f57fa 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_undying.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_undying.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_undying" - }, "pedestalItems": [ { "item": "minecraft:totem_of_undying" @@ -18,10 +14,12 @@ "item": "ars_nouveau:abjuration_essence" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_undying" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_warding.json b/src/generated/resources/data/ars_nouveau/recipes/thread_warding.json index 2d846d8679..04faa14312 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_warding.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_warding.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_warding" - }, "pedestalItems": [ { "item": "ars_nouveau:magebloom_fiber" @@ -30,10 +26,12 @@ "item": "ars_nouveau:magebloom_fiber" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_warding" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_whirlisprig.json b/src/generated/resources/data/ars_nouveau/recipes/thread_whirlisprig.json index 14940103c7..aded414566 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_whirlisprig.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_whirlisprig.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_whirlisprig" - }, "pedestalItems": [ { "item": "ars_nouveau:whirlisprig_shards" @@ -24,10 +20,12 @@ "item": "minecraft:golden_apple" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_whirlisprig" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_wixie.json b/src/generated/resources/data/ars_nouveau/recipes/thread_wixie.json index 7bdaa6a895..557a1342ec 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/thread_wixie.json +++ b/src/generated/resources/data/ars_nouveau/recipes/thread_wixie.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:thread_wixie" - }, "pedestalItems": [ { "item": "ars_nouveau:wixie_shards" @@ -21,19 +17,21 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "forge:crops/nether_wart" + "tag": "c:crops/nether_wart" }, { - "tag": "forge:crops/nether_wart" + "tag": "c:crops/nether_wart" }, { "item": "minecraft:blaze_rod" } ], - "reagent": [ - { - "item": "ars_nouveau:blank_thread" - } - ], + "reagent": { + "item": "ars_nouveau:blank_thread" + }, + "result": { + "count": 1, + "id": "ars_nouveau:thread_wixie" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/timer_spell_turret.json b/src/generated/resources/data/ars_nouveau/recipes/timer_spell_turret.json index 29952d2725..907bc8e060 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/timer_spell_turret.json +++ b/src/generated/resources/data/ars_nouveau/recipes/timer_spell_turret.json @@ -1,18 +1,16 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:timer_spell_turret" - }, "pedestalItems": [ { "item": "minecraft:clock" } ], - "reagent": [ - { - "item": "ars_nouveau:basic_spell_turret" - } - ], + "reagent": { + "item": "ars_nouveau:basic_spell_turret" + }, + "result": { + "count": 1, + "id": "ars_nouveau:timer_spell_turret" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/arachne_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/arachne_tome.json deleted file mode 100644 index 83362f6d0d..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/arachne_tome.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 25, - "red": 255 - }, - "flavour_text": "Creates three snaring projectiles.", - "name": "Arachne's Weaving", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_projectile", - "ars_nouveau:glyph_split", - "ars_nouveau:glyph_split", - "ars_nouveau:glyph_snare", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_extend_time" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/aurellia_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/aurellia_tome.json deleted file mode 100644 index 732b5aa178..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/aurellia_tome.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 203, - "green": 119, - "red": 255 - }, - "flavour_text": "The bite from this storm is worse than its bark.", - "name": "Aurellia's Bite Storm", - "sound": { - "family": "ars_nouveau:tempestry_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_projectile", - "ars_nouveau:glyph_linger", - "ars_nouveau:glyph_sensitive", - "ars_nouveau:glyph_fangs", - "ars_nouveau:glyph_lightning", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_extend_time" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/bailey_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/bailey_tome.json deleted file mode 100644 index 2eb40894e1..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/bailey_tome.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 25, - "red": 255 - }, - "flavour_text": "To the MOOn", - "name": "Bailey's Bovine Rocket", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_projectile", - "ars_nouveau:glyph_launch", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_delay", - "ars_nouveau:glyph_explosion", - "ars_nouveau:glyph_amplify" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/chems_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/chems_tome.json deleted file mode 100644 index 632672f41b..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/chems_tome.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 248, - "green": 207, - "red": 61 - }, - "flavour_text": "Smothers an area with runes that launch entities upward. Do NOT get covered in the Repulsion Runes.", - "name": "Chem's Scientific Repulsion Runes", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_projectile", - "ars_nouveau:glyph_linger", - "ars_nouveau:glyph_sensitive", - "ars_nouveau:glyph_rune", - "ars_nouveau:glyph_launch", - "ars_nouveau:glyph_launch", - "ars_nouveau:glyph_launch", - "ars_nouveau:glyph_launch" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/darkfira_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/darkfira_tome.json deleted file mode 100644 index 89307eb989..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/darkfira_tome.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 255, - "green": 255, - "red": 25 - }, - "flavour_text": "Encases your enemies or friends in a tomb of ice. Guaranteed to leave them shocked and confused.", - "name": "Darkfira's Flash Freeze", - "sound": { - "family": "ars_nouveau:tempestry_family", - "pitch": 1.9, - "volume": 1.69 - }, - "spell": [ - "ars_nouveau:glyph_projectile", - "ars_nouveau:burst", - "ars_nouveau:glyph_sensitive", - "ars_nouveau:glyph_aoe", - "ars_nouveau:glyph_aoe", - "ars_nouveau:glyph_aoe", - "ars_nouveau:glyph_conjure_water", - "ars_nouveau:glyph_freeze", - "ars_nouveau:glyph_lightning", - "ars_nouveau:glyph_amplify" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/farfalla_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/farfalla_tome.json deleted file mode 100644 index a4946eb54f..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/farfalla_tome.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 25, - "red": 255 - }, - "flavour_text": "Creates a fire that quickly freezes to ice.", - "name": "Farfalla's Frosty Flames", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_projectile", - "ars_nouveau:glyph_ignite", - "ars_nouveau:glyph_delay", - "ars_nouveau:glyph_conjure_water", - "ars_nouveau:glyph_freeze" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/fireball_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/fireball_tome.json deleted file mode 100644 index 36e186dcb6..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/fireball_tome.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 25, - "red": 255 - }, - "flavour_text": "A classic.", - "name": "Fireball!", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_projectile", - "ars_nouveau:glyph_ignite", - "ars_nouveau:glyph_explosion", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_aoe", - "ars_nouveau:glyph_aoe" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/glow_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/glow_tome.json deleted file mode 100644 index 6d97f49160..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/glow_tome.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 25, - "red": 255 - }, - "flavour_text": "Snares the target and grants other targets Glowing.", - "name": "Glow Trap", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_touch", - "ars_nouveau:glyph_rune", - "ars_nouveau:glyph_snare", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_light" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/gootastic_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/gootastic_tome.json deleted file mode 100644 index d5c037ebb4..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/gootastic_tome.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 25, - "red": 255 - }, - "flavour_text": "The squid's Lovecraftian roots appear to make it immune.", - "name": "Gootastic's Telekinetic Fishing Rod", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_projectile", - "ars_nouveau:glyph_launch", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_delay", - "ars_nouveau:glyph_pull", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_amplify" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/ivy_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/ivy_tome.json deleted file mode 100644 index 426394926c..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/ivy_tome.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 105, - "red": 255 - }, - "flavour_text": "Now you never have to be lonely again! You will always have a friend with you! Feel free to change their name to whatever you want! :D", - "name": "Ivy", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_touch", - "ars_nouveau:glyph_animate_block", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_name" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/kirin_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/kirin_tome.json deleted file mode 100644 index d12422c690..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/kirin_tome.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 255, - "green": 255, - "red": 25 - }, - "flavour_text": "Heroes are so straightforward, so easily befuddled...", - "name": "KirinDave's Sinister Switch", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_self", - "ars_nouveau:glyph_summon_decoy", - "ars_nouveau:glyph_blink", - "ars_nouveau:glyph_amplify" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/lyrellion_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/lyrellion_tome.json deleted file mode 100644 index 0e03eb9233..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/lyrellion_tome.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 25, - "red": 255 - }, - "flavour_text": "You. Shall. Not. Pass.", - "name": "Lyrellion’s Wall of Force", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_projectile", - "ars_nouveau:glyph_accelerate", - "ars_nouveau:glyph_wall", - "ars_nouveau:glyph_sensitive", - "ars_nouveau:glyph_phantom_block", - "ars_nouveau:glyph_pierce", - "ars_nouveau:glyph_amplify" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/othy_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/othy_tome.json deleted file mode 100644 index a4f97d29d9..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/othy_tome.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 255, - "green": 255, - "red": 255 - }, - "flavour_text": "Swarm your enemies with bladed spirits.", - "name": "Othy's Misdirection", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_self", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_summon_decoy", - "ars_nouveau:glyph_blink", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_amplify" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/poseidon_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/poseidon_tome.json deleted file mode 100644 index 0cf99a50c0..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/poseidon_tome.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 255, - "green": 1, - "red": 1 - }, - "flavour_text": "Fire at a body of water to create a Ice bubble in the depths.", - "name": "Poseidon's Refuge", - "sound": { - "family": "ars_nouveau:tempestry_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_projectile", - "ars_nouveau:glyph_sensitive", - "ars_nouveau:glyph_light", - "ars_nouveau:burst", - "ars_nouveau:glyph_aoe", - "ars_nouveau:glyph_aoe", - "ars_nouveau:glyph_sensitive", - "ars_nouveau:glyph_freeze", - "ars_nouveau:glyph_break", - "ars_nouveau:glyph_freeze" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/renew_rune_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/renew_rune_tome.json deleted file mode 100644 index 28bf100264..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/renew_rune_tome.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 25, - "red": 255 - }, - "flavour_text": "Cures status effects and heals the user.", - "name": "Rune of Renewing", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_touch", - "ars_nouveau:glyph_rune", - "ars_nouveau:glyph_dispel", - "ars_nouveau:glyph_heal", - "ars_nouveau:glyph_amplify" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/shadow_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/shadow_tome.json deleted file mode 100644 index 8e44b51611..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/shadow_tome.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 25, - "red": 255 - }, - "flavour_text": "Creates a temporary tunnel of blocks.", - "name": "The Shadow's Temporary Tunnel", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_touch", - "ars_nouveau:glyph_intangible", - "ars_nouveau:glyph_aoe", - "ars_nouveau:glyph_aoe", - "ars_nouveau:glyph_pierce", - "ars_nouveau:glyph_pierce", - "ars_nouveau:glyph_pierce", - "ars_nouveau:glyph_pierce", - "ars_nouveau:glyph_pierce", - "ars_nouveau:glyph_extend_time" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/silvanus_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/silvanus_tome.json deleted file mode 100644 index 27fc8c5043..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/silvanus_tome.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 1, - "green": 255, - "red": 1 - }, - "flavour_text": "When you want to go deeper but just don't have the torches", - "name": "Emergency Flair", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_touch", - "ars_nouveau:glyph_light", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_extend_time" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/spinoftw_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/spinoftw_tome.json deleted file mode 100644 index ae6cf079a9..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/spinoftw_tome.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 1, - "green": 90, - "red": 225 - }, - "flavour_text": " A utility spell to aid you in your adventures", - "name": "You were hurt, but you're fine", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_self", - "ars_nouveau:glyph_conjure_water", - "ars_nouveau:glyph_heal", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_phantom_block", - "ars_nouveau:glyph_aoe", - "ars_nouveau:glyph_aoe", - "ars_nouveau:glyph_aoe" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/takeoff_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/takeoff_tome.json deleted file mode 100644 index 4e5bdfdb39..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/takeoff_tome.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 25, - "red": 255 - }, - "flavour_text": "Launches the caster into the air and grants temporary elytra flight!", - "name": "Takeoff!", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_self", - "ars_nouveau:glyph_launch", - "ars_nouveau:glyph_launch", - "ars_nouveau:glyph_glide", - "ars_nouveau:glyph_duration_down" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/toxin_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/toxin_tome.json deleted file mode 100644 index fc2b05d2a0..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/toxin_tome.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 25, - "red": 255 - }, - "flavour_text": "Poisons that target and causes them to take additional damage from all sources.", - "name": "Potent Toxin", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_projectile", - "ars_nouveau:glyph_hex", - "ars_nouveau:glyph_harm", - "ars_nouveau:glyph_extend_time" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/uni_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/uni_tome.json deleted file mode 100644 index 14185c049f..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/uni_tome.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 25, - "red": 255 - }, - "flavour_text": "Stay away!", - "name": "Uni's Windshield", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_self", - "ars_nouveau:glyph_orbit", - "ars_nouveau:glyph_gust", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_amplify" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/vault_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/vault_tome.json deleted file mode 100644 index 20b54d2a94..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/vault_tome.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 25, - "red": 255 - }, - "flavour_text": "Sometimes you just need to get over that wall.", - "name": "Vault", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_self", - "ars_nouveau:glyph_launch", - "ars_nouveau:glyph_delay", - "ars_nouveau:glyph_leap", - "ars_nouveau:glyph_slowfall" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/warp_impact_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/warp_impact_tome.json deleted file mode 100644 index e04fd19951..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/warp_impact_tome.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 25, - "red": 255 - }, - "flavour_text": "Teleportation, with style!", - "name": "Warp Impact", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_projectile", - "ars_nouveau:glyph_blink", - "ars_nouveau:glyph_explosion", - "ars_nouveau:glyph_aoe" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/xacris_2_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/xacris_2_tome.json deleted file mode 100644 index 366e7fac3b..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/xacris_2_tome.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 255, - "green": 255, - "red": 25 - }, - "flavour_text": "Light up the sky", - "name": "Xacris's Firework Display", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_projectile", - "ars_nouveau:glyph_wall", - "ars_nouveau:glyph_sensitive", - "ars_nouveau:glyph_aoe", - "ars_nouveau:glyph_firework", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_extend_time", - "ars_nouveau:glyph_amplify" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/xacris_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/xacris_tome.json deleted file mode 100644 index 6877551eec..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/xacris_tome.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 25, - "red": 255 - }, - "flavour_text": "Builds a small hut around the user.", - "name": "Xacris' Tiny Hut", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_underfoot", - "ars_nouveau:glyph_phantom_block", - "ars_nouveau:glyph_aoe", - "ars_nouveau:glyph_aoe", - "ars_nouveau:glyph_aoe", - "ars_nouveau:glyph_pierce", - "ars_nouveau:glyph_pierce", - "ars_nouveau:glyph_pierce" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/tomes/yeet_tome.json b/src/generated/resources/data/ars_nouveau/recipes/tomes/yeet_tome.json deleted file mode 100644 index 844348d0e9..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/tomes/yeet_tome.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "type": "ars_nouveau:caster_tome", - "color": { - "type": "ars_nouveau:constant", - "blue": 180, - "green": 25, - "red": 255 - }, - "flavour_text": "Summons orbiting projectiles that will launch nearby enemies.", - "name": "Knocked out of Orbit", - "sound": { - "family": "ars_nouveau:fire_family", - "pitch": 1.0, - "volume": 1.0 - }, - "spell": [ - "ars_nouveau:glyph_self", - "ars_nouveau:glyph_orbit", - "ars_nouveau:glyph_launch", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_delay", - "ars_nouveau:glyph_gust", - "ars_nouveau:glyph_amplify", - "ars_nouveau:glyph_amplify" - ], - "tome_type": "ars_nouveau:caster_tome" -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/unbreaking_1.json b/src/generated/resources/data/ars_nouveau/recipes/unbreaking_1.json index 90b85696d1..a07a5fd0fc 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/unbreaking_1.json +++ b/src/generated/resources/data/ars_nouveau/recipes/unbreaking_1.json @@ -1,27 +1,18 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:unbreaking", "level": 1, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/unbreaking_2.json b/src/generated/resources/data/ars_nouveau/recipes/unbreaking_2.json index 1694808b3e..37c79dc8e5 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/unbreaking_2.json +++ b/src/generated/resources/data/ars_nouveau/recipes/unbreaking_2.json @@ -1,37 +1,24 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:unbreaking", "level": 2, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipes/unbreaking_3.json b/src/generated/resources/data/ars_nouveau/recipes/unbreaking_3.json index bb92d5d880..d994506507 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/unbreaking_3.json +++ b/src/generated/resources/data/ars_nouveau/recipes/unbreaking_3.json @@ -1,47 +1,30 @@ { - "type": "ars_nouveau:enchantment", "enchantment": "minecraft:unbreaking", "level": 3, "pedestalItems": [ { - "item": { - "item": "ars_nouveau:abjuration_essence" - } + "item": "ars_nouveau:abjuration_essence" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:gems/diamond" - } + "tag": "c:gems/diamond" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/source" - } + "tag": "neoforge:storage_blocks/source" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" }, { - "item": { - "tag": "forge:storage_blocks/lapis" - } + "tag": "c:storage_blocks/lapis" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipes/upgrade_1.json b/src/generated/resources/data/ars_nouveau/recipes/upgrade_1.json deleted file mode 100644 index cf61aef4ec..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/upgrade_1.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "ars_nouveau:armor_upgrade", - "pedestalItems": [ - { - "item": { - "tag": "forge:rods/blaze" - } - }, - { - "item": { - "tag": "forge:rods/blaze" - } - } - ], - "sourceCost": 2500, - "tier": 1 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/upgrade_2.json b/src/generated/resources/data/ars_nouveau/recipes/upgrade_2.json deleted file mode 100644 index 3af5d87456..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/upgrade_2.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "ars_nouveau:armor_upgrade", - "pedestalItems": [ - { - "item": { - "tag": "forge:ender_pearls" - } - }, - { - "item": { - "tag": "forge:ender_pearls" - } - }, - { - "item": { - "item": "minecraft:chorus_fruit" - } - } - ], - "sourceCost": 5000, - "tier": 2 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/void_jar.json b/src/generated/resources/data/ars_nouveau/recipes/void_jar.json index cc3d9b0f0e..a7545f03bd 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/void_jar.json +++ b/src/generated/resources/data/ars_nouveau/recipes/void_jar.json @@ -1,9 +1,5 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:void_jar" - }, "pedestalItems": [ { "item": "minecraft:lava_bucket" @@ -15,13 +11,15 @@ "item": "ars_nouveau:allow_scroll" }, { - "tag": "forge:ender_pearls" - } - ], - "reagent": [ - { - "item": "minecraft:glass_bottle" + "tag": "c:ender_pearls" } ], + "reagent": { + "item": "minecraft:glass_bottle" + }, + "result": { + "count": 1, + "id": "ars_nouveau:void_jar" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/wand.json b/src/generated/resources/data/ars_nouveau/recipes/wand.json index e41bd1d62c..dc35f23889 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/wand.json +++ b/src/generated/resources/data/ars_nouveau/recipes/wand.json @@ -1,27 +1,23 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:wand" - }, "pedestalItems": [ { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, { "item": "ars_nouveau:air_essence" @@ -30,10 +26,12 @@ "item": "ars_nouveau:manipulation_essence" } ], - "reagent": [ - { - "tag": "forge:logs/archwood" - } - ], + "reagent": { + "tag": "neoforge:logs/archwood" + }, + "result": { + "count": 1, + "id": "ars_nouveau:wand" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/warp_scroll.json b/src/generated/resources/data/ars_nouveau/recipes/warp_scroll.json deleted file mode 100644 index 508f5f18a3..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipes/warp_scroll.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "tag": "forge:gems/lapis" - }, - { - "tag": "forge:gems/lapis" - }, - { - "tag": "forge:gems/lapis" - }, - { - "tag": "forge:gems/lapis" - }, - { - "item": "ars_nouveau:blank_parchment" - }, - { - "tag": "forge:gems/source" - }, - { - "tag": "forge:gems/source" - }, - { - "tag": "forge:gems/source" - }, - { - "tag": "forge:gems/source" - } - ], - "result": { - "item": "ars_nouveau:warp_scroll" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/warp_scroll_copy.json b/src/generated/resources/data/ars_nouveau/recipes/warp_scroll_copy.json index cb08e4f905..7b9ab0123d 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/warp_scroll_copy.json +++ b/src/generated/resources/data/ars_nouveau/recipes/warp_scroll_copy.json @@ -1,19 +1,16 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, - "output": { - "count": 2, - "item": "ars_nouveau:warp_scroll" - }, "pedestalItems": [ { "item": "ars_nouveau:warp_scroll" } ], - "reagent": [ - { - "item": "ars_nouveau:warp_scroll" - } - ], + "reagent": { + "item": "ars_nouveau:warp_scroll" + }, + "result": { + "count": 2, + "id": "ars_nouveau:warp_scroll" + }, "sourceCost": 1000 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/water_essence.json b/src/generated/resources/data/ars_nouveau/recipes/water_essence.json new file mode 100644 index 0000000000..76bafcd9c8 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/water_essence.json @@ -0,0 +1,21 @@ +{ + "input": { + "tag": "neoforge:gems/source" + }, + "output": { + "count": 1, + "id": "ars_nouveau:water_essence" + }, + "pedestalItems": [ + { + "item": "minecraft:water_bucket" + }, + { + "item": "minecraft:snow_block" + }, + { + "item": "minecraft:kelp" + } + ], + "source": 2000 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/whirlisprig_charm.json b/src/generated/resources/data/ars_nouveau/recipes/whirlisprig_charm.json index 4a80f4d89f..0cbb5e00d9 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/whirlisprig_charm.json +++ b/src/generated/resources/data/ars_nouveau/recipes/whirlisprig_charm.json @@ -1,12 +1,8 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:whirlisprig_charm" - }, "pedestalItems": [ { - "tag": "forge:gems/source" + "tag": "neoforge:gems/source" }, { "item": "ars_nouveau:magebloom_crop" @@ -15,7 +11,7 @@ "item": "ars_nouveau:magebloom" }, { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, { "item": "minecraft:oak_sapling" @@ -27,13 +23,15 @@ "item": "minecraft:birch_sapling" }, { - "tag": "forge:seeds/wheat" - } - ], - "reagent": [ - { - "item": "ars_nouveau:whirlisprig_shards" + "tag": "c:seeds/wheat" } ], + "reagent": { + "item": "ars_nouveau:whirlisprig_shards" + }, + "result": { + "count": 1, + "id": "ars_nouveau:whirlisprig_charm" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/white_dye.json b/src/generated/resources/data/ars_nouveau/recipes/white_dye.json new file mode 100644 index 0000000000..7280e38873 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/white_dye.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:lily_of_the_valley" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 2, + "id": "minecraft:white_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/wixie_charm.json b/src/generated/resources/data/ars_nouveau/recipes/wixie_charm.json index a094eb07d7..4ba70c6cb6 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/wixie_charm.json +++ b/src/generated/resources/data/ars_nouveau/recipes/wixie_charm.json @@ -1,15 +1,11 @@ { - "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, - "output": { - "item": "ars_nouveau:wixie_charm" - }, "pedestalItems": [ { "tag": "minecraft:saplings" }, { - "tag": "forge:gems/emerald" + "tag": "c:gems/emerald" }, { "item": "minecraft:crafting_table" @@ -18,10 +14,12 @@ "item": "minecraft:brewing_stand" } ], - "reagent": [ - { - "item": "ars_nouveau:wixie_shards" - } - ], + "reagent": { + "item": "ars_nouveau:wixie_shards" + }, + "result": { + "count": 1, + "id": "ars_nouveau:wixie_charm" + }, "sourceCost": 0 } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/wololo.json b/src/generated/resources/data/ars_nouveau/recipes/wololo.json index f5b72ea8a1..dfe43001a2 100644 --- a/src/generated/resources/data/ars_nouveau/recipes/wololo.json +++ b/src/generated/resources/data/ars_nouveau/recipes/wololo.json @@ -1,28 +1,9 @@ { "type": "ars_nouveau:glyph", - "count": 1, "exp": 27, - "inputItems": [ - { - "item": { - "item": "ars_nouveau:abjuration_essence" - } - }, - { - "item": { - "tag": "forge:dyes" - } - }, - { - "item": { - "tag": "forge:dyes" - } - }, - { - "item": { - "tag": "forge:dyes" - } - } - ], - "output": "ars_nouveau:wololo" + "inputs": [], + "output": { + "count": 1, + "id": "ars_nouveau:wololo" + } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/yellow_dye.json b/src/generated/resources/data/ars_nouveau/recipes/yellow_dye.json new file mode 100644 index 0000000000..4c39f048a8 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/yellow_dye.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:dandelion" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 2, + "id": "minecraft:yellow_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipes/yellow_dye_sunflower.json b/src/generated/resources/data/ars_nouveau/recipes/yellow_dye_sunflower.json new file mode 100644 index 0000000000..59a8d8d102 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipes/yellow_dye_sunflower.json @@ -0,0 +1,15 @@ +{ + "input": { + "item": "minecraft:sunflower" + }, + "output": [ + { + "chance": 1.0, + "maxRange": 1, + "stack": { + "count": 4, + "id": "minecraft:yellow_dye" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/an_decorative.json b/src/generated/resources/data/ars_nouveau/tags/block/an_decorative.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/an_decorative.json rename to src/generated/resources/data/ars_nouveau/tags/block/an_decorative.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/blazing_logs.json b/src/generated/resources/data/ars_nouveau/tags/block/blazing_logs.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/blazing_logs.json rename to src/generated/resources/data/ars_nouveau/tags/block/blazing_logs.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/break_blacklist.json b/src/generated/resources/data/ars_nouveau/tags/block/break_blacklist.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/break_blacklist.json rename to src/generated/resources/data/ars_nouveau/tags/block/break_blacklist.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/break_with_pickaxe.json b/src/generated/resources/data/ars_nouveau/tags/block/break_with_pickaxe.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/break_with_pickaxe.json rename to src/generated/resources/data/ars_nouveau/tags/block/break_with_pickaxe.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/cascading_logs.json b/src/generated/resources/data/ars_nouveau/tags/block/cascading_logs.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/cascading_logs.json rename to src/generated/resources/data/ars_nouveau/tags/block/cascading_logs.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/dowsing_rod.json b/src/generated/resources/data/ars_nouveau/tags/block/dowsing_rod.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/dowsing_rod.json rename to src/generated/resources/data/ars_nouveau/tags/block/dowsing_rod.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/flourishing_logs.json b/src/generated/resources/data/ars_nouveau/tags/block/flourishing_logs.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/flourishing_logs.json rename to src/generated/resources/data/ars_nouveau/tags/block/flourishing_logs.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/golem/budding.json b/src/generated/resources/data/ars_nouveau/tags/block/golem/budding.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/golem/budding.json rename to src/generated/resources/data/ars_nouveau/tags/block/golem/budding.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/golem/cluster.json b/src/generated/resources/data/ars_nouveau/tags/block/golem/cluster.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/golem/cluster.json rename to src/generated/resources/data/ars_nouveau/tags/block/golem/cluster.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/gravity_blacklist.json b/src/generated/resources/data/ars_nouveau/tags/block/gravity_blacklist.json similarity index 66% rename from src/generated/resources/data/ars_nouveau/tags/blocks/gravity_blacklist.json rename to src/generated/resources/data/ars_nouveau/tags/block/gravity_blacklist.json index 360f94027d..5c760e99bb 100644 --- a/src/generated/resources/data/ars_nouveau/tags/blocks/gravity_blacklist.json +++ b/src/generated/resources/data/ars_nouveau/tags/block/gravity_blacklist.json @@ -2,6 +2,6 @@ "values": [ "minecraft:bedrock", "ars_nouveau:mage_block", - "#forge:relocation_not_supported" + "#c:relocation_not_supported" ] } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/harvest/fellable.json b/src/generated/resources/data/ars_nouveau/tags/block/harvest/fellable.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/harvest/fellable.json rename to src/generated/resources/data/ars_nouveau/tags/block/harvest/fellable.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/harvest/foliage.json b/src/generated/resources/data/ars_nouveau/tags/block/harvest/foliage.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/harvest/foliage.json rename to src/generated/resources/data/ars_nouveau/tags/block/harvest/foliage.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/harvest/stems.json b/src/generated/resources/data/ars_nouveau/tags/block/harvest/stems.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/harvest/stems.json rename to src/generated/resources/data/ars_nouveau/tags/block/harvest/stems.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/ignore_tile.json b/src/generated/resources/data/ars_nouveau/tags/block/ignore_tile.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/ignore_tile.json rename to src/generated/resources/data/ars_nouveau/tags/block/ignore_tile.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/interact_blacklist.json b/src/generated/resources/data/ars_nouveau/tags/block/interact_blacklist.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/interact_blacklist.json rename to src/generated/resources/data/ars_nouveau/tags/block/interact_blacklist.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/magic_plants.json b/src/generated/resources/data/ars_nouveau/tags/block/magic_plants.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/magic_plants.json rename to src/generated/resources/data/ars_nouveau/tags/block/magic_plants.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/magic_saplings.json b/src/generated/resources/data/ars_nouveau/tags/block/magic_saplings.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/magic_saplings.json rename to src/generated/resources/data/ars_nouveau/tags/block/magic_saplings.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/no_break_drop.json b/src/generated/resources/data/ars_nouveau/tags/block/no_break_drop.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/no_break_drop.json rename to src/generated/resources/data/ars_nouveau/tags/block/no_break_drop.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/occludes_spell_sensor.json b/src/generated/resources/data/ars_nouveau/tags/block/occludes_spell_sensor.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/occludes_spell_sensor.json rename to src/generated/resources/data/ars_nouveau/tags/block/occludes_spell_sensor.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/storage/autopull_disabled.json b/src/generated/resources/data/ars_nouveau/tags/block/storage/autopull_disabled.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/storage/autopull_disabled.json rename to src/generated/resources/data/ars_nouveau/tags/block/storage/autopull_disabled.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/summon_bed.json b/src/generated/resources/data/ars_nouveau/tags/block/summon_bed.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/summon_bed.json rename to src/generated/resources/data/ars_nouveau/tags/block/summon_bed.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/summon_sleepable.json b/src/generated/resources/data/ars_nouveau/tags/block/summon_sleepable.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/summon_sleepable.json rename to src/generated/resources/data/ars_nouveau/tags/block/summon_sleepable.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/vexing_logs.json b/src/generated/resources/data/ars_nouveau/tags/block/vexing_logs.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/vexing_logs.json rename to src/generated/resources/data/ars_nouveau/tags/block/vexing_logs.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/whirlisprig/greatly_likes.json b/src/generated/resources/data/ars_nouveau/tags/block/whirlisprig/greatly_likes.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/whirlisprig/greatly_likes.json rename to src/generated/resources/data/ars_nouveau/tags/block/whirlisprig/greatly_likes.json diff --git a/src/generated/resources/data/ars_nouveau/tags/blocks/whirlisprig/kinda_likes.json b/src/generated/resources/data/ars_nouveau/tags/block/whirlisprig/kinda_likes.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/blocks/whirlisprig/kinda_likes.json rename to src/generated/resources/data/ars_nouveau/tags/block/whirlisprig/kinda_likes.json diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_types/an_hostile.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/an_hostile.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/entity_types/an_hostile.json rename to src/generated/resources/data/ars_nouveau/tags/entity_type/an_hostile.json diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_types/animal_summon_blacklist.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/animal_summon_blacklist.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/entity_types/animal_summon_blacklist.json rename to src/generated/resources/data/ars_nouveau/tags/entity_type/animal_summon_blacklist.json diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_types/berry_blacklist.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/berry_blacklist.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/entity_types/berry_blacklist.json rename to src/generated/resources/data/ars_nouveau/tags/entity_type/berry_blacklist.json diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_types/disintegration_blacklist.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/disintegration_blacklist.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/entity_types/disintegration_blacklist.json rename to src/generated/resources/data/ars_nouveau/tags/entity_type/disintegration_blacklist.json diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_types/disintegration_whitelist.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/disintegration_whitelist.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/entity_types/disintegration_whitelist.json rename to src/generated/resources/data/ars_nouveau/tags/entity_type/disintegration_whitelist.json diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_types/drygmy_blacklist.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/drygmy_blacklist.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/entity_types/drygmy_blacklist.json rename to src/generated/resources/data/ars_nouveau/tags/entity_type/drygmy_blacklist.json diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_types/familiar.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/familiar.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/entity_types/familiar.json rename to src/generated/resources/data/ars_nouveau/tags/entity_type/familiar.json diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_types/jar_blacklist.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/jar_blacklist.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/entity_types/jar_blacklist.json rename to src/generated/resources/data/ars_nouveau/tags/entity_type/jar_blacklist.json diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_types/jar_release_blacklist.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/jar_release_blacklist.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/entity_types/jar_release_blacklist.json rename to src/generated/resources/data/ars_nouveau/tags/entity_type/jar_release_blacklist.json diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_types/jar_whitelist.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/jar_whitelist.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/entity_types/jar_whitelist.json rename to src/generated/resources/data/ars_nouveau/tags/entity_type/jar_whitelist.json diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_types/lingering_blacklist.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/lingering_blacklist.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/entity_types/lingering_blacklist.json rename to src/generated/resources/data/ars_nouveau/tags/entity_type/lingering_blacklist.json diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_types/magic_find.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/magic_find.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/entity_types/magic_find.json rename to src/generated/resources/data/ars_nouveau/tags/entity_type/magic_find.json diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_types/rewind_blacklist.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/rewind_blacklist.json similarity index 51% rename from src/generated/resources/data/ars_nouveau/tags/entity_types/rewind_blacklist.json rename to src/generated/resources/data/ars_nouveau/tags/entity_type/rewind_blacklist.json index e80aa5aa66..d591fc0243 100644 --- a/src/generated/resources/data/ars_nouveau/tags/entity_types/rewind_blacklist.json +++ b/src/generated/resources/data/ars_nouveau/tags/entity_type/rewind_blacklist.json @@ -1,5 +1,5 @@ { "values": [ - "#forge:bosses" + "#c:bosses" ] } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_types/spell_can_hit.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/spell_can_hit.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/entity_types/spell_can_hit.json rename to src/generated/resources/data/ars_nouveau/tags/entity_type/spell_can_hit.json diff --git a/src/generated/resources/data/ars_nouveau/tags/items/golem/shard.json b/src/generated/resources/data/ars_nouveau/tags/item/golem/shard.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/items/golem/shard.json rename to src/generated/resources/data/ars_nouveau/tags/item/golem/shard.json diff --git a/src/generated/resources/data/ars_nouveau/tags/items/interact_jar_blacklist.json b/src/generated/resources/data/ars_nouveau/tags/item/interact_jar_blacklist.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/items/interact_jar_blacklist.json rename to src/generated/resources/data/ars_nouveau/tags/item/interact_jar_blacklist.json diff --git a/src/generated/resources/data/ars_nouveau/tags/items/magic_food.json b/src/generated/resources/data/ars_nouveau/tags/item/magic_food.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/items/magic_food.json rename to src/generated/resources/data/ars_nouveau/tags/item/magic_food.json diff --git a/src/generated/resources/data/ars_nouveau/tags/items/magic_shards.json b/src/generated/resources/data/ars_nouveau/tags/item/magic_shards.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/items/magic_shards.json rename to src/generated/resources/data/ars_nouveau/tags/item/magic_shards.json diff --git a/src/generated/resources/data/ars_nouveau/tags/items/ritual_loot_blacklist.json b/src/generated/resources/data/ars_nouveau/tags/item/ritual_loot_blacklist.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/items/ritual_loot_blacklist.json rename to src/generated/resources/data/ars_nouveau/tags/item/ritual_loot_blacklist.json diff --git a/src/generated/resources/data/ars_nouveau/tags/items/ritual_trade_blacklist.json b/src/generated/resources/data/ars_nouveau/tags/item/ritual_trade_blacklist.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/items/ritual_trade_blacklist.json rename to src/generated/resources/data/ars_nouveau/tags/item/ritual_trade_blacklist.json diff --git a/src/generated/resources/data/ars_nouveau/tags/items/shady_wizard_fruits.json b/src/generated/resources/data/ars_nouveau/tags/item/shady_wizard_fruits.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/items/shady_wizard_fruits.json rename to src/generated/resources/data/ars_nouveau/tags/item/shady_wizard_fruits.json diff --git a/src/generated/resources/data/ars_nouveau/tags/items/summon_bed.json b/src/generated/resources/data/ars_nouveau/tags/item/summon_bed.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/items/summon_bed.json rename to src/generated/resources/data/ars_nouveau/tags/item/summon_bed.json diff --git a/src/generated/resources/data/ars_nouveau/tags/items/whirlisprig/denied_drop.json b/src/generated/resources/data/ars_nouveau/tags/item/whirlisprig/denied_drop.json similarity index 69% rename from src/generated/resources/data/ars_nouveau/tags/items/whirlisprig/denied_drop.json rename to src/generated/resources/data/ars_nouveau/tags/item/whirlisprig/denied_drop.json index 9bc07bf48f..09faceee34 100644 --- a/src/generated/resources/data/ars_nouveau/tags/items/whirlisprig/denied_drop.json +++ b/src/generated/resources/data/ars_nouveau/tags/item/whirlisprig/denied_drop.json @@ -1,6 +1,6 @@ { "values": [ "minecraft:dirt", - "#forge:seeds" + "#c:seeds" ] } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/tags/items/wilden_drop.json b/src/generated/resources/data/ars_nouveau/tags/item/wilden_drop.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/tags/items/wilden_drop.json rename to src/generated/resources/data/ars_nouveau/tags/item/wilden_drop.json diff --git a/src/generated/resources/data/ars_nouveau/tags/worldgen/biome/no_mob_spawn.json b/src/generated/resources/data/ars_nouveau/tags/worldgen/biome/no_mob_spawn.json index cf5b88033b..1a6efc23b6 100644 --- a/src/generated/resources/data/ars_nouveau/tags/worldgen/biome/no_mob_spawn.json +++ b/src/generated/resources/data/ars_nouveau/tags/worldgen/biome/no_mob_spawn.json @@ -1,6 +1,6 @@ { "values": [ - "#forge:is_mushroom", + "#c:is_mushroom", "minecraft:deep_dark" ] } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/worldgen/biome/archwood_forest.json b/src/generated/resources/data/ars_nouveau/worldgen/biome/archwood_forest.json index 9ba0dc516f..b6ea44105e 100644 --- a/src/generated/resources/data/ars_nouveau/worldgen/biome/archwood_forest.json +++ b/src/generated/resources/data/ars_nouveau/worldgen/biome/archwood_forest.json @@ -64,6 +64,7 @@ "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", + "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", diff --git a/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/blazing_tree.json b/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/blazing_tree.json index 383be223f4..b45addfefd 100644 --- a/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/blazing_tree.json +++ b/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/blazing_tree.json @@ -13,17 +13,13 @@ "height": 0, "offset": { "type": "minecraft:uniform", - "value": { - "max_inclusive": 0, - "min_inclusive": 0 - } + "max_inclusive": 0, + "min_inclusive": 0 }, "radius": { "type": "minecraft:uniform", - "value": { - "max_inclusive": 0, - "min_inclusive": 0 - } + "max_inclusive": 0, + "min_inclusive": 0 } }, "foliage_provider": { diff --git a/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/cascading_tree.json b/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/cascading_tree.json index 706f04259c..c1d6cce8b3 100644 --- a/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/cascading_tree.json +++ b/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/cascading_tree.json @@ -13,17 +13,13 @@ "height": 0, "offset": { "type": "minecraft:uniform", - "value": { - "max_inclusive": 0, - "min_inclusive": 0 - } + "max_inclusive": 0, + "min_inclusive": 0 }, "radius": { "type": "minecraft:uniform", - "value": { - "max_inclusive": 0, - "min_inclusive": 0 - } + "max_inclusive": 0, + "min_inclusive": 0 } }, "foliage_provider": { diff --git a/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/flourishing_tree.json b/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/flourishing_tree.json index 2fa2b72839..70eb59ac64 100644 --- a/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/flourishing_tree.json +++ b/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/flourishing_tree.json @@ -13,17 +13,13 @@ "height": 0, "offset": { "type": "minecraft:uniform", - "value": { - "max_inclusive": 0, - "min_inclusive": 0 - } + "max_inclusive": 0, + "min_inclusive": 0 }, "radius": { "type": "minecraft:uniform", - "value": { - "max_inclusive": 0, - "min_inclusive": 0 - } + "max_inclusive": 0, + "min_inclusive": 0 } }, "foliage_provider": { diff --git a/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/natural_blazing_tree.json b/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/natural_blazing_tree.json index 8614b14905..5f42a27582 100644 --- a/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/natural_blazing_tree.json +++ b/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/natural_blazing_tree.json @@ -13,17 +13,13 @@ "height": 0, "offset": { "type": "minecraft:uniform", - "value": { - "max_inclusive": 0, - "min_inclusive": 0 - } + "max_inclusive": 0, + "min_inclusive": 0 }, "radius": { "type": "minecraft:uniform", - "value": { - "max_inclusive": 0, - "min_inclusive": 0 - } + "max_inclusive": 0, + "min_inclusive": 0 } }, "foliage_provider": { diff --git a/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/natural_cascading_tree.json b/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/natural_cascading_tree.json index 900d025a1b..cf378f8b68 100644 --- a/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/natural_cascading_tree.json +++ b/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/natural_cascading_tree.json @@ -13,17 +13,13 @@ "height": 0, "offset": { "type": "minecraft:uniform", - "value": { - "max_inclusive": 0, - "min_inclusive": 0 - } + "max_inclusive": 0, + "min_inclusive": 0 }, "radius": { "type": "minecraft:uniform", - "value": { - "max_inclusive": 0, - "min_inclusive": 0 - } + "max_inclusive": 0, + "min_inclusive": 0 } }, "foliage_provider": { diff --git a/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/natural_flourishing_tree.json b/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/natural_flourishing_tree.json index 0de3012dd8..2dcfc3a464 100644 --- a/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/natural_flourishing_tree.json +++ b/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/natural_flourishing_tree.json @@ -13,17 +13,13 @@ "height": 0, "offset": { "type": "minecraft:uniform", - "value": { - "max_inclusive": 0, - "min_inclusive": 0 - } + "max_inclusive": 0, + "min_inclusive": 0 }, "radius": { "type": "minecraft:uniform", - "value": { - "max_inclusive": 0, - "min_inclusive": 0 - } + "max_inclusive": 0, + "min_inclusive": 0 } }, "foliage_provider": { diff --git a/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/natural_vexing_tree.json b/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/natural_vexing_tree.json index 8b029fb327..b2bef13486 100644 --- a/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/natural_vexing_tree.json +++ b/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/natural_vexing_tree.json @@ -13,17 +13,13 @@ "height": 0, "offset": { "type": "minecraft:uniform", - "value": { - "max_inclusive": 0, - "min_inclusive": 0 - } + "max_inclusive": 0, + "min_inclusive": 0 }, "radius": { "type": "minecraft:uniform", - "value": { - "max_inclusive": 0, - "min_inclusive": 0 - } + "max_inclusive": 0, + "min_inclusive": 0 } }, "foliage_provider": { diff --git a/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/vexing_tree.json b/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/vexing_tree.json index d829a9dbfc..27d7196c89 100644 --- a/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/vexing_tree.json +++ b/src/generated/resources/data/ars_nouveau/worldgen/configured_feature/vexing_tree.json @@ -13,17 +13,13 @@ "height": 0, "offset": { "type": "minecraft:uniform", - "value": { - "max_inclusive": 0, - "min_inclusive": 0 - } + "max_inclusive": 0, + "min_inclusive": 0 }, "radius": { "type": "minecraft:uniform", - "value": { - "max_inclusive": 0, - "min_inclusive": 0 - } + "max_inclusive": 0, + "min_inclusive": 0 } }, "foliage_provider": { diff --git a/src/generated/resources/data/forge/tags/blocks/chests.json b/src/generated/resources/data/c/tags/block/chests.json similarity index 100% rename from src/generated/resources/data/forge/tags/blocks/chests.json rename to src/generated/resources/data/c/tags/block/chests.json diff --git a/src/generated/resources/data/forge/tags/blocks/chests/wooden.json b/src/generated/resources/data/c/tags/block/chests/wooden.json similarity index 100% rename from src/generated/resources/data/forge/tags/blocks/chests/wooden.json rename to src/generated/resources/data/c/tags/block/chests/wooden.json diff --git a/src/generated/resources/data/forge/tags/blocks/fence_gates.json b/src/generated/resources/data/c/tags/block/fence_gates.json similarity index 100% rename from src/generated/resources/data/forge/tags/blocks/fence_gates.json rename to src/generated/resources/data/c/tags/block/fence_gates.json diff --git a/src/generated/resources/data/forge/tags/blocks/fence_gates/wooden.json b/src/generated/resources/data/c/tags/block/fence_gates/wooden.json similarity index 100% rename from src/generated/resources/data/forge/tags/blocks/fence_gates/wooden.json rename to src/generated/resources/data/c/tags/block/fence_gates/wooden.json diff --git a/src/generated/resources/data/forge/tags/blocks/fences.json b/src/generated/resources/data/c/tags/block/fences.json similarity index 100% rename from src/generated/resources/data/forge/tags/blocks/fences.json rename to src/generated/resources/data/c/tags/block/fences.json diff --git a/src/generated/resources/data/forge/tags/blocks/fences/wooden.json b/src/generated/resources/data/c/tags/block/fences/wooden.json similarity index 100% rename from src/generated/resources/data/forge/tags/blocks/fences/wooden.json rename to src/generated/resources/data/c/tags/block/fences/wooden.json diff --git a/src/generated/resources/data/forge/tags/blocks/relocation_not_supported.json b/src/generated/resources/data/c/tags/block/relocation_not_supported.json similarity index 100% rename from src/generated/resources/data/forge/tags/blocks/relocation_not_supported.json rename to src/generated/resources/data/c/tags/block/relocation_not_supported.json diff --git a/src/generated/resources/data/forge/tags/damage_type/is_magic.json b/src/generated/resources/data/c/tags/damage_type/is_magic.json similarity index 100% rename from src/generated/resources/data/forge/tags/damage_type/is_magic.json rename to src/generated/resources/data/c/tags/damage_type/is_magic.json diff --git a/src/generated/resources/data/forge/tags/entity_types/bosses.json b/src/generated/resources/data/c/tags/entity_type/bosses.json similarity index 100% rename from src/generated/resources/data/forge/tags/entity_types/bosses.json rename to src/generated/resources/data/c/tags/entity_type/bosses.json diff --git a/src/generated/resources/data/forge/tags/items/armors.json b/src/generated/resources/data/c/tags/item/armors.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/armors.json rename to src/generated/resources/data/c/tags/item/armors.json diff --git a/src/generated/resources/data/forge/tags/items/chests.json b/src/generated/resources/data/c/tags/item/chests.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/chests.json rename to src/generated/resources/data/c/tags/item/chests.json diff --git a/src/generated/resources/data/forge/tags/items/chests/wooden.json b/src/generated/resources/data/c/tags/item/chests/wooden.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/chests/wooden.json rename to src/generated/resources/data/c/tags/item/chests/wooden.json diff --git a/src/generated/resources/data/forge/tags/items/crops.json b/src/generated/resources/data/c/tags/item/crops.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/crops.json rename to src/generated/resources/data/c/tags/item/crops.json diff --git a/src/generated/resources/data/forge/tags/items/fence_gates.json b/src/generated/resources/data/c/tags/item/fence_gates.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/fence_gates.json rename to src/generated/resources/data/c/tags/item/fence_gates.json diff --git a/src/generated/resources/data/forge/tags/items/fence_gates/wooden.json b/src/generated/resources/data/c/tags/item/fence_gates/wooden.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/fence_gates/wooden.json rename to src/generated/resources/data/c/tags/item/fence_gates/wooden.json diff --git a/src/generated/resources/data/forge/tags/items/fences.json b/src/generated/resources/data/c/tags/item/fences.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/fences.json rename to src/generated/resources/data/c/tags/item/fences.json diff --git a/src/generated/resources/data/forge/tags/items/fences/wooden.json b/src/generated/resources/data/c/tags/item/fences/wooden.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/fences/wooden.json rename to src/generated/resources/data/c/tags/item/fences/wooden.json diff --git a/src/generated/resources/data/forge/tags/items/fruits/berry.json b/src/generated/resources/data/c/tags/item/fruits/berry.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/fruits/berry.json rename to src/generated/resources/data/c/tags/item/fruits/berry.json diff --git a/src/generated/resources/data/forge/tags/items/gems.json b/src/generated/resources/data/c/tags/item/gems.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/gems.json rename to src/generated/resources/data/c/tags/item/gems.json diff --git a/src/generated/resources/data/minecraft/tags/items/music_discs.json b/src/generated/resources/data/c/tags/item/music_discs.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/music_discs.json rename to src/generated/resources/data/c/tags/item/music_discs.json diff --git a/src/generated/resources/data/forge/tags/items/planks/archwood.json b/src/generated/resources/data/c/tags/item/planks/archwood.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/planks/archwood.json rename to src/generated/resources/data/c/tags/item/planks/archwood.json diff --git a/src/generated/resources/data/forge/tags/items/seeds.json b/src/generated/resources/data/c/tags/item/seeds.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/seeds.json rename to src/generated/resources/data/c/tags/item/seeds.json diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks.json b/src/generated/resources/data/c/tags/item/storage_blocks.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/storage_blocks.json rename to src/generated/resources/data/c/tags/item/storage_blocks.json diff --git a/src/generated/resources/data/forge/tags/items/tools/shields.json b/src/generated/resources/data/c/tags/item/tools/shield.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/tools/shields.json rename to src/generated/resources/data/c/tags/item/tools/shield.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/bee_growables.json b/src/generated/resources/data/minecraft/tags/block/bee_growables.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/bee_growables.json rename to src/generated/resources/data/minecraft/tags/block/bee_growables.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/buttons.json b/src/generated/resources/data/minecraft/tags/block/buttons.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/buttons.json rename to src/generated/resources/data/minecraft/tags/block/buttons.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/crops.json b/src/generated/resources/data/minecraft/tags/block/crops.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/crops.json rename to src/generated/resources/data/minecraft/tags/block/crops.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/doors.json b/src/generated/resources/data/minecraft/tags/block/doors.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/doors.json rename to src/generated/resources/data/minecraft/tags/block/doors.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/fence_gates.json b/src/generated/resources/data/minecraft/tags/block/fence_gates.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/fence_gates.json rename to src/generated/resources/data/minecraft/tags/block/fence_gates.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/fences.json b/src/generated/resources/data/minecraft/tags/block/fences.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/fences.json rename to src/generated/resources/data/minecraft/tags/block/fences.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/fire.json b/src/generated/resources/data/minecraft/tags/block/fire.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/fire.json rename to src/generated/resources/data/minecraft/tags/block/fire.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/leaves.json b/src/generated/resources/data/minecraft/tags/block/leaves.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/leaves.json rename to src/generated/resources/data/minecraft/tags/block/leaves.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/leaves/archwood_leaves.json b/src/generated/resources/data/minecraft/tags/block/leaves/archwood_leaves.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/leaves/archwood_leaves.json rename to src/generated/resources/data/minecraft/tags/block/leaves/archwood_leaves.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/logs.json b/src/generated/resources/data/minecraft/tags/block/logs.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/logs.json rename to src/generated/resources/data/minecraft/tags/block/logs.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json b/src/generated/resources/data/minecraft/tags/block/logs_that_burn.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json rename to src/generated/resources/data/minecraft/tags/block/logs_that_burn.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/block/mineable/axe.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json rename to src/generated/resources/data/minecraft/tags/block/mineable/axe.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/hoe.json b/src/generated/resources/data/minecraft/tags/block/mineable/hoe.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/mineable/hoe.json rename to src/generated/resources/data/minecraft/tags/block/mineable/hoe.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json rename to src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/planks.json b/src/generated/resources/data/minecraft/tags/block/planks.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/planks.json rename to src/generated/resources/data/minecraft/tags/block/planks.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/portals.json b/src/generated/resources/data/minecraft/tags/block/portals.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/portals.json rename to src/generated/resources/data/minecraft/tags/block/portals.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/saplings.json b/src/generated/resources/data/minecraft/tags/block/saplings.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/saplings.json rename to src/generated/resources/data/minecraft/tags/block/saplings.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/slabs.json b/src/generated/resources/data/minecraft/tags/block/slabs.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/slabs.json rename to src/generated/resources/data/minecraft/tags/block/slabs.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/stairs.json b/src/generated/resources/data/minecraft/tags/block/stairs.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/stairs.json rename to src/generated/resources/data/minecraft/tags/block/stairs.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/trapdoors.json b/src/generated/resources/data/minecraft/tags/block/trapdoors.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/trapdoors.json rename to src/generated/resources/data/minecraft/tags/block/trapdoors.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_buttons.json b/src/generated/resources/data/minecraft/tags/block/wooden_buttons.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/wooden_buttons.json rename to src/generated/resources/data/minecraft/tags/block/wooden_buttons.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_doors.json b/src/generated/resources/data/minecraft/tags/block/wooden_doors.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/wooden_doors.json rename to src/generated/resources/data/minecraft/tags/block/wooden_doors.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_fences.json b/src/generated/resources/data/minecraft/tags/block/wooden_fences.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/wooden_fences.json rename to src/generated/resources/data/minecraft/tags/block/wooden_fences.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_slabs.json b/src/generated/resources/data/minecraft/tags/block/wooden_slabs.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/wooden_slabs.json rename to src/generated/resources/data/minecraft/tags/block/wooden_slabs.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_stairs.json b/src/generated/resources/data/minecraft/tags/block/wooden_stairs.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/wooden_stairs.json rename to src/generated/resources/data/minecraft/tags/block/wooden_stairs.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_trapdoors.json b/src/generated/resources/data/minecraft/tags/block/wooden_trapdoors.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/wooden_trapdoors.json rename to src/generated/resources/data/minecraft/tags/block/wooden_trapdoors.json diff --git a/src/generated/resources/data/minecraft/tags/items/beacon_payment_items.json b/src/generated/resources/data/minecraft/tags/item/beacon_payment_items.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/beacon_payment_items.json rename to src/generated/resources/data/minecraft/tags/item/beacon_payment_items.json diff --git a/src/generated/resources/data/minecraft/tags/items/bookshelf_books.json b/src/generated/resources/data/minecraft/tags/item/bookshelf_books.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/bookshelf_books.json rename to src/generated/resources/data/minecraft/tags/item/bookshelf_books.json diff --git a/src/generated/resources/data/minecraft/tags/items/buttons.json b/src/generated/resources/data/minecraft/tags/item/buttons.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/buttons.json rename to src/generated/resources/data/minecraft/tags/item/buttons.json diff --git a/src/generated/resources/data/forge/tags/items/armors/chestplates.json b/src/generated/resources/data/minecraft/tags/item/chest_armor.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/armors/chestplates.json rename to src/generated/resources/data/minecraft/tags/item/chest_armor.json diff --git a/src/generated/resources/data/minecraft/tags/items/doors.json b/src/generated/resources/data/minecraft/tags/item/doors.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/doors.json rename to src/generated/resources/data/minecraft/tags/item/doors.json diff --git a/src/generated/resources/data/minecraft/tags/items/fences.json b/src/generated/resources/data/minecraft/tags/item/fences.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/fences.json rename to src/generated/resources/data/minecraft/tags/item/fences.json diff --git a/src/generated/resources/data/forge/tags/items/armors/boots.json b/src/generated/resources/data/minecraft/tags/item/foot_armor.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/armors/boots.json rename to src/generated/resources/data/minecraft/tags/item/foot_armor.json diff --git a/src/generated/resources/data/forge/tags/items/armors/helmets.json b/src/generated/resources/data/minecraft/tags/item/head_armor.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/armors/helmets.json rename to src/generated/resources/data/minecraft/tags/item/head_armor.json diff --git a/src/generated/resources/data/minecraft/tags/items/leaves.json b/src/generated/resources/data/minecraft/tags/item/leaves.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/leaves.json rename to src/generated/resources/data/minecraft/tags/item/leaves.json diff --git a/src/generated/resources/data/minecraft/tags/items/lectern_books.json b/src/generated/resources/data/minecraft/tags/item/lectern_books.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/lectern_books.json rename to src/generated/resources/data/minecraft/tags/item/lectern_books.json diff --git a/src/generated/resources/data/forge/tags/items/armors/leggings.json b/src/generated/resources/data/minecraft/tags/item/leg_armor.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/armors/leggings.json rename to src/generated/resources/data/minecraft/tags/item/leg_armor.json diff --git a/src/generated/resources/data/minecraft/tags/items/logs.json b/src/generated/resources/data/minecraft/tags/item/logs.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/logs.json rename to src/generated/resources/data/minecraft/tags/item/logs.json diff --git a/src/generated/resources/data/minecraft/tags/items/logs_that_burn.json b/src/generated/resources/data/minecraft/tags/item/logs_that_burn.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/logs_that_burn.json rename to src/generated/resources/data/minecraft/tags/item/logs_that_burn.json diff --git a/src/generated/resources/data/minecraft/tags/items/planks.json b/src/generated/resources/data/minecraft/tags/item/planks.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/planks.json rename to src/generated/resources/data/minecraft/tags/item/planks.json diff --git a/src/generated/resources/data/minecraft/tags/items/saplings.json b/src/generated/resources/data/minecraft/tags/item/saplings.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/saplings.json rename to src/generated/resources/data/minecraft/tags/item/saplings.json diff --git a/src/generated/resources/data/minecraft/tags/items/slabs.json b/src/generated/resources/data/minecraft/tags/item/slabs.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/slabs.json rename to src/generated/resources/data/minecraft/tags/item/slabs.json diff --git a/src/generated/resources/data/minecraft/tags/items/stairs.json b/src/generated/resources/data/minecraft/tags/item/stairs.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/stairs.json rename to src/generated/resources/data/minecraft/tags/item/stairs.json diff --git a/src/generated/resources/data/minecraft/tags/items/swords.json b/src/generated/resources/data/minecraft/tags/item/swords.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/swords.json rename to src/generated/resources/data/minecraft/tags/item/swords.json diff --git a/src/generated/resources/data/minecraft/tags/items/trapdoors.json b/src/generated/resources/data/minecraft/tags/item/trapdoors.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/trapdoors.json rename to src/generated/resources/data/minecraft/tags/item/trapdoors.json diff --git a/src/generated/resources/data/minecraft/tags/items/wooden_buttons.json b/src/generated/resources/data/minecraft/tags/item/wooden_buttons.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/wooden_buttons.json rename to src/generated/resources/data/minecraft/tags/item/wooden_buttons.json diff --git a/src/generated/resources/data/minecraft/tags/items/wooden_doors.json b/src/generated/resources/data/minecraft/tags/item/wooden_doors.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/wooden_doors.json rename to src/generated/resources/data/minecraft/tags/item/wooden_doors.json diff --git a/src/generated/resources/data/minecraft/tags/items/wooden_fences.json b/src/generated/resources/data/minecraft/tags/item/wooden_fences.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/wooden_fences.json rename to src/generated/resources/data/minecraft/tags/item/wooden_fences.json diff --git a/src/generated/resources/data/minecraft/tags/items/wooden_pressure_plates.json b/src/generated/resources/data/minecraft/tags/item/wooden_pressure_plates.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/wooden_pressure_plates.json rename to src/generated/resources/data/minecraft/tags/item/wooden_pressure_plates.json diff --git a/src/generated/resources/data/minecraft/tags/items/wooden_slabs.json b/src/generated/resources/data/minecraft/tags/item/wooden_slabs.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/wooden_slabs.json rename to src/generated/resources/data/minecraft/tags/item/wooden_slabs.json diff --git a/src/generated/resources/data/minecraft/tags/items/wooden_stairs.json b/src/generated/resources/data/minecraft/tags/item/wooden_stairs.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/wooden_stairs.json rename to src/generated/resources/data/minecraft/tags/item/wooden_stairs.json diff --git a/src/generated/resources/data/minecraft/tags/items/wooden_trapdoors.json b/src/generated/resources/data/minecraft/tags/item/wooden_trapdoors.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/items/wooden_trapdoors.json rename to src/generated/resources/data/minecraft/tags/item/wooden_trapdoors.json diff --git a/src/generated/resources/data/neoforge/data_maps/item/compostables.json b/src/generated/resources/data/neoforge/data_maps/item/compostables.json new file mode 100644 index 0000000000..b94e136af6 --- /dev/null +++ b/src/generated/resources/data/neoforge/data_maps/item/compostables.json @@ -0,0 +1,49 @@ +{ + "values": { + "ars_nouveau:bastion_pod": { + "chance": 0.65 + }, + "ars_nouveau:blue_archwood_leaves": { + "chance": 0.3 + }, + "ars_nouveau:blue_archwood_sapling": { + "chance": 0.3 + }, + "ars_nouveau:bombegranate_pod": { + "chance": 0.65 + }, + "ars_nouveau:frostaya_pod": { + "chance": 0.65 + }, + "ars_nouveau:green_archwood_leaves": { + "chance": 0.3 + }, + "ars_nouveau:green_archwood_sapling": { + "chance": 0.3 + }, + "ars_nouveau:magebloom": { + "chance": 0.65 + }, + "ars_nouveau:magebloom_crop": { + "chance": 0.65 + }, + "ars_nouveau:mendosteen_pod": { + "chance": 0.65 + }, + "ars_nouveau:purple_archwood_leaves": { + "chance": 0.3 + }, + "ars_nouveau:purple_archwood_sapling": { + "chance": 0.3 + }, + "ars_nouveau:red_archwood_leaves": { + "chance": 0.3 + }, + "ars_nouveau:red_archwood_sapling": { + "chance": 0.3 + }, + "ars_nouveau:sourceberry_bush": { + "chance": 0.3 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/bushes.json b/src/generated/resources/data/neoforge/tags/block/bushes.json similarity index 100% rename from src/generated/resources/data/forge/tags/blocks/bushes.json rename to src/generated/resources/data/neoforge/tags/block/bushes.json diff --git a/src/generated/resources/data/forge/tags/items/gems/source.json b/src/generated/resources/data/neoforge/tags/item/gems/source.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/gems/source.json rename to src/generated/resources/data/neoforge/tags/item/gems/source.json diff --git a/src/generated/resources/data/forge/tags/items/logs/archwood.json b/src/generated/resources/data/neoforge/tags/item/logs/archwood.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/logs/archwood.json rename to src/generated/resources/data/neoforge/tags/item/logs/archwood.json diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks/source.json b/src/generated/resources/data/neoforge/tags/item/storage_blocks/source.json similarity index 100% rename from src/generated/resources/data/forge/tags/items/storage_blocks/source.json rename to src/generated/resources/data/neoforge/tags/item/storage_blocks/source.json diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java b/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java index b268f3b509..f4ccd23df8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java @@ -16,7 +16,6 @@ public class SpellSound { public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - ResourceLocation.CODEC.fieldOf("id").forGetter(s -> s.id), SoundEvent.CODEC.fieldOf("soundEvent").forGetter(s -> s.soundEvent), ComponentSerialization.CODEC.fieldOf("soundName").forGetter(s -> s.soundName) ).apply(instance, SpellSound::new)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java index e20183c0d7..edad116c98 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java @@ -17,7 +17,6 @@ import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.common.NeoForge; -import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; public class ManaUtil { @@ -59,8 +58,8 @@ public int getRealMax() { // UUIDs for the configurable bonus on mana attributes, to include them in multiplier calculations. // Only updated if the value changes. - static final ResourceLocation MAX_MANA_MODIFIER = ArsNouveau.prefix("MAX_MANA_MOD"); - static final ResourceLocation MANA_REGEN_MODIFIER = ArsNouveau.prefix("MANA_REGEN_MOD"); + static final ResourceLocation MAX_MANA_MODIFIER = ArsNouveau.prefix("max_mana_mod"); + static final ResourceLocation MANA_REGEN_MODIFIER = ArsNouveau.prefix("max_regen_mod"); // Calculate Max Mana & Mana Reserve to keep track of the mana reserved by familiars & co. public static Mana calcMaxMana(Player e) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ANAdvancements.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AdvancementProvider.java similarity index 61% rename from src/main/java/com/hollingsworth/arsnouveau/common/datagen/ANAdvancements.java rename to src/main/java/com/hollingsworth/arsnouveau/common/datagen/AdvancementProvider.java index 1740782959..7cbcb4bb86 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ANAdvancements.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AdvancementProvider.java @@ -3,14 +3,14 @@ import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; -import net.neoforged.neoforge.common.data.AdvancementProvider; import net.neoforged.neoforge.common.data.ExistingFileHelper; + import java.util.List; import java.util.concurrent.CompletableFuture; -public class ANAdvancements extends AdvancementProvider { +public class AdvancementProvider extends net.neoforged.neoforge.common.data.AdvancementProvider { - public ANAdvancements(PackOutput output, CompletableFuture registries, ExistingFileHelper existingFileHelper) { + public AdvancementProvider(PackOutput output, CompletableFuture registries, ExistingFileHelper existingFileHelper) { super(output, registries, existingFileHelper, List.of(new com.hollingsworth.arsnouveau.common.datagen.advancement.ANAdvancements())); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java index 6d70c232c7..f905a95d17 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java @@ -15,10 +15,11 @@ @EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD) public class ModDatagen { public static CompletableFuture registries; + public static PackOutput output; @SubscribeEvent public static void datagen(GatherDataEvent event) { APIRegistry.postInit(); - PackOutput output = event.getGenerator().getPackOutput(); + output = event.getGenerator().getPackOutput(); CompletableFuture provider = event.getLookupProvider(); ExistingFileHelper fileHelper = event.getExistingFileHelper(); ModDatagen.registries = provider; @@ -39,8 +40,10 @@ public static void datagen(GatherDataEvent event) { event.getGenerator().addProvider(event.includeServer(), new PlacedFeatureTagProvider(output, provider, fileHelper)); event.getGenerator().addProvider(event.includeServer(), new PotionEffectTagProvider(output, provider, fileHelper)); event.getGenerator().addProvider(event.includeServer(), new DyeRecipeDatagen(event.getGenerator())); - event.getGenerator().addProvider(event.includeServer(), new ANAdvancements(output, provider, fileHelper)); - event.getGenerator().addProvider(event.includeServer(), new CasterTomeProvider(event.getGenerator())); +// event.getGenerator().addProvider(event.includeServer(), new SimpleAdvancements(event.getGenerator())); + +// event.getGenerator().addProvider(event.includeServer(), new AdvancementProvider(output, provider, fileHelper)); +// event.getGenerator().addProvider(event.includeServer(), new CasterTomeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new SummonRitualProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new BuddingConversionProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new ScryRitualProvider(event.getGenerator())); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java index c6aaaae4f6..0086d5ecf5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java @@ -140,25 +140,33 @@ public MutableComponent getComponent(String type){ * Tries to resolve the parent of this advancement, if possible. Returns true on success. */ public boolean canBuild(Function pParentLookup) { - return this.parentId != null; + if (this.parentId == null) { + return true; + } else { + if (this.parent == null) { + this.parent = pParentLookup.apply(this.parentId); + } + + return this.parent != null; + } } public Advancement build() { - if (!this.canBuild((p_138407_) -> { - return null; - })) { - throw new IllegalStateException("Tried to build incomplete advancement!"); - } else { - if (this.requirements == null) { - this.requirements = this.requirementsStrategy.create(this.criteria.keySet()); - } - return new Advancement(Optional.ofNullable(this.parentId), Optional.ofNullable(this.display), this.rewards, this.criteria, this.requirements, false); + if (this.requirements == null) { + this.requirements = this.requirementsStrategy.create(this.criteria.keySet()); + } + if(this.criteria.isEmpty()){ + throw new IllegalStateException("Advancement " + fileKey + " has no criteria " + this); } + + return new Advancement(Optional.ofNullable(this.parentId), Optional.ofNullable(this.display), this.rewards, this.criteria, this.requirements, false); + } public AdvancementHolder save(Consumer pConsumer, ResourceLocation pId) { - AdvancementHolder advancement = new AdvancementHolder(pId, this.build()); + var adv = this.build(); + AdvancementHolder advancement = new AdvancementHolder(pId, adv); pConsumer.accept(advancement); return advancement; } @@ -168,7 +176,7 @@ public AdvancementHolder save(Consumer pConsumer) { } public String toString() { - return "Task Advancement{parentId=" + this.parentId + ", display=" + this.display + ", rewards=" + this.rewards + ", criteria=" + this.criteria + ", requirements=" + this.requirements.toString() + "}"; + return "Task Advancement{parentId=" + this.parentId + ", display=" + this.display + ", rewards=" + this.rewards + ", criteria=" + this.criteria + ", requirements=" + this.requirements + "}"; } public Map> getCriteria() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/SimpleAdvancements.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/SimpleAdvancements.java new file mode 100644 index 0000000000..3311a6c2bf --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/SimpleAdvancements.java @@ -0,0 +1,44 @@ +package com.hollingsworth.arsnouveau.common.datagen.advancement; + +import com.hollingsworth.arsnouveau.common.datagen.ModDatagen; +import com.hollingsworth.arsnouveau.common.datagen.SimpleDataProvider; +import com.mojang.serialization.JsonOps; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataGenerator; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +public class SimpleAdvancements extends SimpleDataProvider { + + public SimpleAdvancements(DataGenerator dataGenerator) { + super(dataGenerator); + } + + @Override + public void collectJsons(CachedOutput pOutput) { + List holders = new ArrayList<>(); + var advancements = new ANAdvancements(); + advancements.generate(null, holders::add, null); + + for(AdvancementHolder holder : holders){ + + Path path = getRecipePath(ModDatagen.output.getOutputFolder(), holder.id().getPath()); + saveStable(pOutput, Advancement.CODEC.encodeStart(JsonOps.INSTANCE, holder.value()).getOrThrow(), path); + } + + } + + private static Path getRecipePath(Path pathIn, String str) { + return pathIn.resolve("data/ars_nouveau/advancements/" + str + ".json"); + } + + + @Override + public String getName() { + return ""; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java index c25476b4c9..4fe2ed8bf0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import com.hollingsworth.arsnouveau.client.registry.ModParticles; +import com.hollingsworth.arsnouveau.common.advancement.ANCriteriaTriggers; import com.hollingsworth.arsnouveau.common.world.tree.MagicTrunkPlacer; import com.hollingsworth.arsnouveau.setup.registry.*; import net.minecraft.core.registries.Registries; @@ -49,7 +50,7 @@ public static void registers(IEventBus modEventBus) { StructureRegistry.STRUCTURES.register(modEventBus); StructureRegistry.STRUCTURE_PROCESSOR.register(modEventBus); MaterialRegistry.MATERIALS.register(modEventBus); - + ANCriteriaTriggers.TRIGGERS.register(modEventBus); MenuRegistry.MENU_REG.register(modEventBus); VillagerRegistry.POIs.register(modEventBus); VillagerRegistry.VILLAGERS.register(modEventBus); @@ -58,12 +59,12 @@ public static void registers(IEventBus modEventBus) { } public static void registerEvents(RegisterEvent event) { - if (event.getRegistryKey().equals(Registries.BLOCK.registryKey())) { + event.register(Registries.BLOCK, helper ->{ BlockRegistry.onBlocksRegistry(); - } - if (event.getRegistryKey().equals(Registries.BLOCK.registryKey())) { + }); + event.register(Registries.ITEM, helper ->{ BlockRegistry.onBlockItemsRegistry(); ItemsRegistry.onItemRegistry(); - } + }); } } From ca5dca66193fa191a5f1d4393859eb72ebeb6570 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 6 Jul 2024 18:23:28 -0500 Subject: [PATCH 030/363] fix mixins, spell saving --- build.gradle | 4 +- .../arsnouveau/api/ArsNouveauAPI.java | 3 +- .../api/sound/ConfiguredSpellSound.java | 36 ++++---- .../arsnouveau/api/sound/SpellSound.java | 23 ++--- .../api/spell/AbstractSpellPart.java | 24 +++++ .../arsnouveau/api/spell/ISpellCaster.java | 3 +- .../arsnouveau/api/spell/Spell.java | 90 +++++++++---------- .../arsnouveau/api/spell/SpellCaster.java | 79 +++++++++++----- .../arsnouveau/api/spell/SpellContext.java | 4 +- .../arsnouveau/api/spell/SpellResolver.java | 2 +- .../arsnouveau/api/spell/SpellSlotMap.java | 46 ++++++++++ .../client/events/ClientEvents.java | 25 +++--- .../client/gui/book/GuiSpellBook.java | 4 +- .../client/gui/book/InfinityGuiSpellBook.java | 4 +- .../client/particle/ParticleColor.java | 18 ++++ .../common/block/BasicSpellTurret.java | 2 +- .../common/block/tile/RuneTile.java | 7 +- .../arsnouveau/common/entity/Starbuncle.java | 2 +- .../common/event/ReactiveEvents.java | 36 ++++---- .../arsnouveau/common/items/CasterTome.java | 5 +- .../common/items/EnchantersSword.java | 3 +- .../arsnouveau/common/items/SpellBook.java | 4 +- .../arsnouveau/common/items/SpellBow.java | 3 +- .../common/items/SpellParchment.java | 5 +- .../common/items/StarbuncleShard.java | 4 +- .../arsnouveau/common/items/Wand.java | 3 +- .../common/items/data/ReactiveCasterData.java | 14 +-- .../common/items/data/ScryCasterData.java | 13 +-- .../items/data/StarbuncleCharmData.java | 28 ++++-- .../common/items/data/TomeCasterData.java | 16 ++-- .../common/mixin/ChatComponentAccessor.java | 4 +- .../common/mixin/PotionRecipeMixin.java | 16 ---- .../mixin/camera/TrackedEntityMixin.java | 2 +- .../structure/StructureTemplateAccessor.java | 3 - .../network/PacketClientDelayEffect.java | 5 +- .../common/network/PacketSetSound.java | 5 +- .../common/network/PacketUpdateCaster.java | 13 ++- .../common/spell/effect/EffectRune.java | 2 +- .../setup/registry/APIRegistry.java | 7 -- .../setup/registry/CreativeTabRegistry.java | 24 ++--- .../setup/registry/ItemsRegistry.java | 7 +- .../setup/registry/SoundRegistry.java | 12 +-- .../resources/META-INF/accesstransformer.cfg | 1 + .../resources/META-INF/neoforge.mods.toml | 2 + src/main/resources/ars_nouveau.mixins.json | 3 +- 45 files changed, 358 insertions(+), 258 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSlotMap.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/mixin/PotionRecipeMixin.java diff --git a/build.gradle b/build.gradle index 2d5fcdad57..3f6a94ac9e 100644 --- a/build.gradle +++ b/build.gradle @@ -112,10 +112,10 @@ dependencies { compileOnly "com.illusivesoulworks.caelus:caelus-neoforge:${caelus_version}:api" compileOnly "mezz.jei:jei-1.21-neoforge-api:${jei_version}" - localRuntime "mezz.jei:jei-1.21-neoforge:${jei_version}" +// localRuntime "mezz.jei:jei-1.21-neoforge:${jei_version}" implementation 'com.github.glitchfiend:TerraBlender-neoforge:1.21-4.0.0.0' implementation "curse.maven:jade-324717:5444008" - implementation 'top.theillusivec4.curios:curios-neoforge:9.0.3+1.21' + implementation 'top.theillusivec4.curios:curios-neoforge:9.0.4+1.21' } //tasks.withType(ProcessResources).configureEach { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/ArsNouveauAPI.java b/src/main/java/com/hollingsworth/arsnouveau/api/ArsNouveauAPI.java index 9c17a06670..494a6e985b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/ArsNouveauAPI.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/ArsNouveauAPI.java @@ -5,7 +5,6 @@ import com.hollingsworth.arsnouveau.api.scrying.IScryer; import com.hollingsworth.arsnouveau.api.spell.ISpellValidator; import com.hollingsworth.arsnouveau.common.crafting.recipes.IEnchantingRecipe; -import com.hollingsworth.arsnouveau.common.mixin.PotionRecipeMixin; import com.hollingsworth.arsnouveau.common.spell.validation.StandardSpellValidator; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.alchemy.Potion; @@ -75,7 +74,7 @@ public List getAllPotionRecipes(Level world) { if (ib instanceof BrewingRecipe brewingRecipe) brewingRecipes.add(brewingRecipe); }); - for(PotionBrewing.Mix mix : PotionRecipeMixin.mixList()){ + for(PotionBrewing.Mix mix : world.potionBrewing().potionMixes){ brewingRecipes.add(new BrewingRecipe( PotionIngredient.fromPotion(mix.from()), mix.ingredient(), diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/sound/ConfiguredSpellSound.java b/src/main/java/com/hollingsworth/arsnouveau/api/sound/ConfiguredSpellSound.java index e309574aa2..4b80aafa4d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/sound/ConfiguredSpellSound.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/sound/ConfiguredSpellSound.java @@ -4,7 +4,8 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import javax.annotation.Nullable; import java.util.Objects; @@ -12,11 +13,25 @@ public class ConfiguredSpellSound implements Cloneable{ public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - SpellSound.CODEC.codec().fieldOf("sound").forGetter(s -> s.sound), + SpellSound.CODEC.codec().optionalFieldOf("sound", SoundRegistry.DEFAULT_SPELL_SOUND).forGetter(s -> s.sound), Codec.FLOAT.optionalFieldOf("volume", 1.0f).forGetter(s -> s.volume), Codec.FLOAT.optionalFieldOf("pitch", 1.0f).forGetter(s -> s.pitch) ).apply(instance, ConfiguredSpellSound::new)); + public static final StreamCodec STREAM = StreamCodec.of( + (buf, val) -> { + SpellSound.STREAM.encode(buf, val.getSound()); + buf.writeFloat(val.getVolume()); + buf.writeFloat(val.getPitch()); + }, + buf -> { + SpellSound sound = SpellSound.STREAM.decode(buf); + float volume = buf.readFloat(); + float pitch = buf.readFloat(); + return new ConfiguredSpellSound(sound, volume, pitch); + } + ); + public static ConfiguredSpellSound EMPTY = new ConfiguredSpellSound(SoundRegistry.EMPTY_SPELL_SOUND, 1, 1); // If the user wants no sound, make it empty. public static ConfiguredSpellSound DEFAULT = new ConfiguredSpellSound(SoundRegistry.DEFAULT_SPELL_SOUND, 1, 1); // The default sound to be returned for null casters. @@ -29,26 +44,11 @@ public ConfiguredSpellSound(SpellSound sound) { } public ConfiguredSpellSound(@Nullable SpellSound spellSound, float aFloat, float aFloat1) { - this.sound = spellSound; + this.sound = spellSound ; this.volume = aFloat; this.pitch = aFloat1; } - public CompoundTag serialize() { - CompoundTag tag = new CompoundTag(); - tag.put("soundTag", sound == null ? new CompoundTag() : sound.serialize()); - tag.putFloat("volume", volume); - tag.putFloat("pitch", pitch); - return tag; - } - - public static ConfiguredSpellSound fromTag(CompoundTag tag) { - SpellSound sound = SpellSound.fromTag(tag.getCompound("soundTag")); - float volume = tag.getFloat("volume"); - float pitch = tag.getFloat("pitch"); - return new ConfiguredSpellSound(sound, volume, pitch); - } - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java b/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java index f4ccd23df8..2a7ff355bd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java @@ -4,13 +4,13 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.Holder; -import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; -import javax.annotation.Nullable; import java.util.Objects; public class SpellSound { @@ -20,6 +20,11 @@ public class SpellSound { ComponentSerialization.CODEC.fieldOf("soundName").forGetter(s -> s.soundName) ).apply(instance, SpellSound::new)); + public static StreamCodec STREAM = StreamCodec.of( + (buf, val) -> buf.writeResourceLocation(val.id), + buf -> SpellSoundRegistry.getSpellSoundsRegistry().get(buf.readResourceLocation()) + ); + private ResourceLocation id; private Holder soundEvent; @@ -60,20 +65,6 @@ public void setSoundName(Component soundName) { this.soundName = soundName; } - public CompoundTag serialize() { - CompoundTag tag = new CompoundTag(); - tag.putString("id", id.toString()); - return tag; - } - - public static @Nullable SpellSound fromTag(CompoundTag tag) { - if (!tag.contains("id")) - return null; - - ResourceLocation id = ResourceLocation.tryParse(tag.getString("id")); - return SpellSoundRegistry.getSpellSoundsRegistry().get(id); - } - public ResourceLocation getTexturePath() { return ResourceLocation.fromNamespaceAndPath(this.id.getNamespace(), "textures/sounds/" + this.id.getPath() + ".png"); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java index 5fac9287c1..ce41c4e250 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java @@ -5,7 +5,9 @@ import com.hollingsworth.arsnouveau.common.items.Glyph; import com.hollingsworth.arsnouveau.common.util.SpellPartConfigUtil; import com.mojang.serialization.Codec; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; @@ -19,6 +21,28 @@ public abstract class AbstractSpellPart implements Comparable { public static final Codec CODEC = ResourceLocation.CODEC.xmap(GlyphRegistry::getSpellPart, AbstractSpellPart::getRegistryName); + public static final StreamCodec STREAM = StreamCodec.of( + (buf, val) -> buf.writeResourceLocation(val.getRegistryName()), + buf -> GlyphRegistry.getSpellPart(buf.readResourceLocation()) + ); + + public static final StreamCodec> STREAM_LIST = StreamCodec.of( + (buf, val) -> { + buf.writeInt(val.size()); + for (AbstractSpellPart part : val) { + AbstractSpellPart.STREAM.encode(buf, part); + } + }, + buf -> { + int size = buf.readInt(); + List parts = new CopyOnWriteArrayList<>(); + for (int i = 0; i < size; i++) { + parts.add(AbstractSpellPart.STREAM.decode(buf)); + } + return parts; + } + ); + private final ResourceLocation registryName; public String name; public Glyph glyphItem; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCaster.java index 8ed85005c0..6aae452c37 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCaster.java @@ -32,7 +32,6 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -import java.util.Map; /** * An interface for handling NBT as it relates to items that may cast spells. @@ -128,7 +127,7 @@ default T setSpellName(String name){ String getFlavorText(); - Map getSpells(); + SpellSlotMap getSpells(); @NotNull default Spell getSpell(Level world, LivingEntity playerEntity, InteractionHand hand, ISpellCaster caster) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java index 9cafcbd618..94b9cd60f2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java @@ -2,12 +2,12 @@ import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; -import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.Util; -import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; import org.jetbrains.annotations.NotNull; @@ -16,8 +16,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; -public class Spell implements Cloneable { +public class Spell { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( Codec.STRING.fieldOf("name").forGetter(s -> s.name), @@ -26,24 +27,40 @@ public class Spell implements Cloneable { Codec.list(AbstractSpellPart.CODEC).fieldOf("recipe").forGetter(s -> s.recipe) ).apply(instance, Spell::new)); - private List recipe = new ArrayList<>(); - private String name = ""; - private ParticleColor color = ParticleColor.defaultParticleColor(); - private ConfiguredSpellSound sound = ConfiguredSpellSound.DEFAULT; + public static final StreamCodec STREAM = StreamCodec.of( + (buf, val) -> { + buf.writeUtf(val.name); + ParticleColor.STREAM.encode(buf, val.color); + ConfiguredSpellSound.STREAM.encode(buf, val.sound); + AbstractSpellPart.STREAM_LIST.encode(buf, val.recipe); + }, + buf -> { + String name = buf.readUtf(); + ParticleColor color = ParticleColor.STREAM.decode(buf); + ConfiguredSpellSound sound = ConfiguredSpellSound.STREAM.decode(buf); + List recipe = AbstractSpellPart.STREAM_LIST.decode(buf); + return new Spell(name, color, sound, recipe); + } + ); + + + private final List recipe; + private final String name; + private final ParticleColor color; + private final ConfiguredSpellSound sound; - public Spell(List recipe) { - this.recipe = recipe == null ? new ArrayList<>() : new ArrayList<>(recipe); // Safe check for tiles initializing a null - } public Spell() { + this("", ParticleColor.defaultParticleColor(), ConfiguredSpellSound.DEFAULT, new ArrayList<>()); } public Spell(AbstractSpellPart... spellParts) { - super(); - recipe.addAll(Arrays.asList(spellParts)); + this(Arrays.asList(spellParts)); } - + public Spell(List recipe) { + this("", ParticleColor.defaultParticleColor(), ConfiguredSpellSound.DEFAULT, recipe); + } public Spell(String name, ParticleColor color, ConfiguredSpellSound configuredSpellSound, List abstractSpellParts) { this.name = name; @@ -108,8 +125,7 @@ public Spell withColor(@NotNull ParticleColor color) { } public Spell withSound(@NotNull ConfiguredSpellSound sound){ - this.sound = sound; - return this; + return new Spell(name, color, sound, recipe); } public ParticleColor color(){ @@ -177,25 +193,6 @@ public boolean isEmpty() { return recipe == null || recipe.isEmpty(); } - public CompoundTag serialize() { - CompoundTag tag = new CompoundTag(); - tag.putString("name", name); - tag.put("spellColor", color.serialize()); - tag.put("sound", sound.serialize()); - CompoundTag recipeTag = new CompoundTag(); - for (int i = 0; i < recipe.size(); i++) { - AbstractSpellPart part = recipe.get(i); - recipeTag.putString("part" + i, part.getRegistryName().toString()); - } - recipeTag.putInt("size", recipe.size()); - tag.put("recipe", recipeTag); - return tag; - } - - public static Spell fromTag(@Nullable CompoundTag tag) { - return tag == null ? new Spell() : ANCodecs.decode(Spell.CODEC.codec(), tag); - } - public String getDisplayString() { StringBuilder str = new StringBuilder(); @@ -235,22 +232,21 @@ public List serializeRecipe(){ return this.recipe.stream().map(AbstractSpellPart::getRegistryName).toList(); } + public Mutable mutable(){ + return new Mutable(new ArrayList<>(recipe), name, color, sound); + } + @Override - public Spell clone() { - try { - // TODO: Make above cloneable - Spell clone = (Spell) super.clone(); - clone.recipe = new ArrayList<>(this.recipe); - clone.color = this.color.clone(); - clone.sound = this.sound; - return clone; - } catch (CloneNotSupportedException e) { - throw new AssertionError(); - } + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Spell spell = (Spell) o; + return Objects.equals(recipe, spell.recipe) && Objects.equals(name, spell.name) && Objects.equals(color, spell.color) && Objects.equals(sound, spell.sound); } - public Mutable mutable(){ - return new Mutable(new ArrayList<>(recipe), name, color, sound); + @Override + public int hashCode() { + return Objects.hash(recipe, name, color, sound); } public static class Mutable{ diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java index ae9616ce12..8877845be5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java @@ -3,61 +3,74 @@ import com.google.common.collect.ImmutableMap; import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; -import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; -import com.mojang.datafixers.util.Function5; +import com.mojang.datafixers.util.Function6; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.Util; import net.minecraft.core.component.DataComponentType; import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.TooltipProvider; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; -import java.util.Map; +import java.util.Objects; +import java.util.function.Consumer; -public class SpellCaster implements ISpellCaster { +public class SpellCaster implements ISpellCaster, TooltipProvider { - public static final MapCodec DEFAULT_CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - Codec.INT.optionalFieldOf("current_slot", 0).forGetter(s -> s.slot), - Codec.STRING.optionalFieldOf("flavor_text", "").forGetter(s -> s.flavorText), - Codec.BOOL.optionalFieldOf("is_hidden", false).forGetter(s -> s.isHidden), - Codec.STRING.optionalFieldOf("hidden_text", "").forGetter(s -> s.hiddenText), - Codec.INT.optionalFieldOf("max_slots", 1).forGetter(s -> s.maxSlots) - ).apply(instance, SpellCaster::new)); + public static final MapCodec DEFAULT_CODEC = createCodec(SpellCaster::new); - public static final StreamCodec DEFAULT_STREAM = CheatSerializer.create(SpellCaster.DEFAULT_CODEC); + public static final StreamCodec DEFAULT_STREAM = createStream(SpellCaster::new); - public static MapCodec createCodec(Function5 constructor) { + public static MapCodec createCodec(Function6 constructor) { return RecordCodecBuilder.mapCodec(instance -> instance.group( Codec.INT.optionalFieldOf("current_slot", 0).forGetter(s -> s.slot), Codec.STRING.optionalFieldOf("flavor_text", "").forGetter(s -> s.flavorText), Codec.BOOL.optionalFieldOf("is_hidden", false).forGetter(s -> s.isHidden), Codec.STRING.optionalFieldOf("hidden_text", "").forGetter(s -> s.hiddenText), - Codec.INT.optionalFieldOf("max_slots", 1).forGetter(s -> s.maxSlots) + Codec.INT.optionalFieldOf("max_slots", 1).forGetter(s -> s.maxSlots), + SpellSlotMap.CODEC.optionalFieldOf("spells", new SpellSlotMap(ImmutableMap.of())).forGetter(s -> s.spells) ).apply(instance, constructor)); } - protected final Map spells; + public static StreamCodec createStream(Function6 constructor) { + return StreamCodec.composite(ByteBufCodecs.INT, s -> s.slot, ByteBufCodecs.STRING_UTF8, s -> s.flavorText, + ByteBufCodecs.BOOL, s -> s.isHidden, ByteBufCodecs.STRING_UTF8, s -> s.hiddenText, ByteBufCodecs.INT, s -> s.maxSlots, SpellSlotMap.STREAM, s -> s.spells, + constructor); + } + + protected final SpellSlotMap spells; protected final int slot; protected final String flavorText; protected final boolean isHidden; protected final String hiddenText; protected final int maxSlots; + public SpellCaster(){ + this(0, "", false, "", 1); + } + + public SpellCaster(int maxSlots){ + this(0, "", false, "", maxSlots); + } + public SpellCaster(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots) { - this(slot, flavorText, isHidden, hiddenText, maxSlots, ImmutableMap.of()); + this(slot, flavorText, isHidden, hiddenText, maxSlots, new SpellSlotMap(ImmutableMap.of())); } - public SpellCaster(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, Map spells){ + public SpellCaster(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, SpellSlotMap spells){ this.slot = slot; this.flavorText = flavorText; this.isHidden = isHidden; this.hiddenText = hiddenText; - this.spells = ImmutableMap.copyOf(spells); + this.spells = spells; this.maxSlots = maxSlots; } @@ -94,7 +107,7 @@ public SpellCaster setCurrentSlot(int slot) { @Override public SpellCaster setSpell(Spell spell, int slot) { - return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, Util.copyAndPut(this.spells, slot, spell)); + return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, spells.put(slot, spell)); } @Override @@ -115,7 +128,7 @@ public String getSpellName(int slot) { @Override public SpellCaster setSpellName(String name, int slot) { var spell = this.getSpell(slot); - return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, Util.copyAndPut(this.spells, slot, new Spell(name, spell.color(), spell.sound(), new ArrayList<>(spell.unsafeList())))); + return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, spells.put(slot, new Spell(name, spell.color(), spell.sound(), new ArrayList<>(spell.unsafeList())))); } @Override @@ -146,7 +159,7 @@ public String getFlavorText() { @Override public SpellCaster setColor(ParticleColor color, int slot) { var spell = this.getSpell(slot); - return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, Util.copyAndPut(this.spells, slot, new Spell(spell.name(), color, spell.sound(), new ArrayList<>(spell.unsafeList())))); + return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, this.spells.put(slot, new Spell(spell.name(), color, spell.sound(), new ArrayList<>(spell.unsafeList())))); } @NotNull @@ -158,7 +171,7 @@ public ConfiguredSpellSound getSound(int slot) { @Override public SpellCaster setSound(ConfiguredSpellSound sound, int slot) { var spell = this.getSpell(slot); - return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, Util.copyAndPut(this.spells, slot, new Spell(spell.name(), spell.color(), sound, new ArrayList<>(spell.unsafeList())))); + return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, this.spells.put(slot, new Spell(spell.name(), spell.color(), sound, new ArrayList<>(spell.unsafeList())))); } @NotNull @@ -168,7 +181,7 @@ public ParticleColor getColor() { } @Override - public Map getSpells() { + public SpellSlotMap getSpells() { return spells; } @@ -179,4 +192,22 @@ public DataComponentType getComponentType() { public void saveToStack(ItemStack stack){ stack.set(this.getComponentType(), this); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SpellCaster caster = (SpellCaster) o; + return slot == caster.slot && isHidden == caster.isHidden && maxSlots == caster.maxSlots && Objects.equals(spells, caster.spells) && Objects.equals(flavorText, caster.flavorText) && Objects.equals(hiddenText, caster.hiddenText); + } + + @Override + public int hashCode() { + return Objects.hash(spells, slot, flavorText, isHidden, hiddenText, maxSlots); + } + + @Override + public void addToTooltip(Item.TooltipContext pContext, Consumer pTooltipAdder, TooltipFlag pTooltipFlag) { + + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java index 2d12e38d8d..036edbe7bf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java @@ -242,7 +242,7 @@ public boolean isDelayed(){ * Returns a new copy of the spell with the recipe set to the remainder of the unresolved spell. */ public @NotNull Spell getRemainingSpell() { - Spell.Mutable remainder = getSpell().clone().mutable(); + Spell.Mutable remainder = getSpell().mutable(); var spell = getSpell().mutable(); if (getCurrentIndex() >= spell.recipe.size()) return remainder.setRecipe(new ArrayList<>()).immutable(); @@ -258,7 +258,7 @@ public boolean isDelayed(){ public SpellContext clone() { try { SpellContext clone = (SpellContext) super.clone(); - clone.spell = this.spell.clone(); + clone.spell = this.spell; clone.colors = this.colors.clone(); clone.tag = this.tag.copy(); clone.caster = this.caster; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java index ea7491eed1..1e52d3e42f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java @@ -245,7 +245,7 @@ public SpellResolver clone() { clone.spellContext = spellContext.clone(); clone.previousResolver = this.previousResolver != null ? this.previousResolver.clone() : null; clone.castType = this.castType; - clone.spell = this.spell.clone(); + clone.spell = this.spell; clone.silent = this.silent; clone.hitResult = this.hitResult; return clone; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSlotMap.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSlotMap.java new file mode 100644 index 0000000000..be203cd2c4 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSlotMap.java @@ -0,0 +1,46 @@ +package com.hollingsworth.arsnouveau.api.spell; + +import com.mojang.serialization.Codec; +import net.minecraft.Util; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; + +import java.util.HashMap; +import java.util.Map; + +public record SpellSlotMap(Map slots) { + + public static final Codec CODEC = Codec.unboundedMap(Codec.INT, Spell.CODEC.codec()).xmap(SpellSlotMap::new, SpellSlotMap::slots); + public static final StreamCodec STREAM = StreamCodec.ofMember((val, buf) ->{ + var entries = val.slots.entrySet(); + buf.writeInt(entries.size()); + + for (var entry : entries) { + buf.writeInt(entry.getKey()); + Spell.STREAM.encode(buf, entry.getValue()); + } + + + }, (buf) -> { + int size = buf.readInt(); + Map slots = Util.make(new HashMap<>(), map -> { + for (int i = 0; i < size; i++) { + int key = buf.readInt(); + Spell value = Spell.STREAM.decode(buf); + map.put(key, value); + } + }); + return new SpellSlotMap(slots); + }); + public Spell getOrDefault(int slot, Spell spell) { + return slots.getOrDefault(slot, spell); + } + + public Spell get(int slot) { + return slots.get(slot); + } + + public SpellSlotMap put(int slot, Spell spell){ + return new SpellSlotMap(Util.copyAndPut(slots, slot, spell)); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java index 0cdaabbeb9..ba7fe6a048 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java @@ -1,15 +1,11 @@ package com.hollingsworth.arsnouveau.client.events; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.spell.Spell; -import com.hollingsworth.arsnouveau.client.ClientInfo; import com.hollingsworth.arsnouveau.client.gui.PatchouliTooltipEvent; import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; import com.hollingsworth.arsnouveau.common.block.tile.GhostWeaveTile; import com.hollingsworth.arsnouveau.common.block.tile.SkyBlockTile; -import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; -import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.contents.TranslatableContents; @@ -26,8 +22,6 @@ import net.neoforged.neoforge.client.gui.VanillaGuiLayers; import net.neoforged.neoforge.event.entity.player.ItemTooltipEvent; -import java.util.Collections; - @EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID) public class ClientEvents { @@ -75,15 +69,16 @@ public static void overlayEvent(RenderGuiLayerEvent.Pre event) { @SubscribeEvent public static void onTooltip(final ItemTooltipEvent event) { ItemStack stack = event.getItemStack(); - int level = stack.getEnchantmentLevel(event.getEntity().level.holderOrThrow(EnchantmentRegistry.REACTIVE_ENCHANTMENT)); - var reactiveCaster = stack.get(DataComponentRegistry.REACTIVE_CASTER); - - if (reactiveCaster != null && level > 0 && reactiveCaster.getSpell().isValid()) { - Spell spell = reactiveCaster.getSpell(); - event.getToolTip().add(Component.literal(spell.getDisplayString())); - } - - Collections.addAll(event.getToolTip(), ClientInfo.storageTooltip); + //todo: reenable reactive +// int level = stack.getEnchantmentLevel(event.getEntity().level.holderOrThrow(EnchantmentRegistry.REACTIVE_ENCHANTMENT)); +// var reactiveCaster = stack.get(DataComponentRegistry.REACTIVE_CASTER); +// +// if (reactiveCaster != null && level > 0 && reactiveCaster.getSpell().isValid()) { +// Spell spell = reactiveCaster.getSpell(); +// event.getToolTip().add(Component.literal(spell.getDisplayString())); +// } +// +// Collections.addAll(event.getToolTip(), ClientInfo.storageTooltip); } public static Component localize(String key, Object... params) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index 83b93e24c2..34d3041045 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -489,14 +489,14 @@ public void clear(Button button) { public void onCreateClick(Button button) { validate(); if (validationErrors.isEmpty()) { - Spell spell = new Spell(); + Spell.Mutable spell = new Spell().mutable(); for (CraftingButton slot : craftingCells) { AbstractSpellPart spellPart = slot.getAbstractSpellPart(); if (spellPart != null) { spell.add(spellPart); } } - Networking.sendToServer(new PacketUpdateCaster(spell, this.selectedSpellSlot, this.spell_name.getValue(), hand == InteractionHand.MAIN_HAND)); + Networking.sendToServer(new PacketUpdateCaster(spell.immutable(), this.selectedSpellSlot, this.spell_name.getValue(), hand == InteractionHand.MAIN_HAND)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java index 306e0598ce..d82e055f25 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java @@ -563,14 +563,14 @@ public void clear(Button button) { public void onCreateClick(Button button) { validate(); if (validationErrors.isEmpty()) { - Spell spell = new Spell(); + Spell.Mutable spell = new Spell().mutable(); for (AbstractSpellPart spellPart : this.spell) { if (spellPart != null) { spell.add(spellPart); } } - Networking.sendToServer(new PacketUpdateCaster(spell, this.selectedSpellSlot, this.spell_name.getValue(), hand == InteractionHand.MAIN_HAND)); + Networking.sendToServer(new PacketUpdateCaster(spell.immutable(), this.selectedSpellSlot, this.spell_name.getValue(), hand == InteractionHand.MAIN_HAND)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java index 1a545e8ac9..6da50d71a6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java @@ -7,6 +7,8 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; @@ -24,6 +26,22 @@ public class ParticleColor implements IParticleColor, Cloneable { Codec.INT.fieldOf("b").forGetter(ParticleColor::getBlueInt) ).apply(instance, ParticleColorRegistry::from)); + public static final StreamCodec STREAM = StreamCodec.of( + (buf, val) -> { + buf.writeResourceLocation(val.getRegistryName()); + buf.writeInt(val.getRedInt()); + buf.writeInt(val.getGreenInt()); + buf.writeInt(val.getBlueInt()); + }, + buf -> { + ResourceLocation id = buf.readResourceLocation(); + int r = buf.readInt(); + int g = buf.readInt(); + int b = buf.readInt(); + return ParticleColorRegistry.from(id, r, g, b); + } + ); + public static final ResourceLocation ID = ArsNouveau.prefix( "constant"); public static final ParticleColor DEFAULT = new ParticleColor(255, 25, 180); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java index 4f580bae18..be6b4c364f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java @@ -197,7 +197,7 @@ protected ItemInteractionResult useItemOn(ItemStack pStack, BlockState state, Le } if (worldIn.getBlockEntity(pos) instanceof BasicSpellTurretTile tile) { tile.spellCaster.copyFromCaster(SpellCasterRegistry.from(stack)); - tile.spellCaster.setSpell(spell.clone()); + tile.spellCaster.setSpell(spell); tile.updateBlock(); PortUtil.sendMessage(player, Component.translatable("ars_nouveau.alert.spell_set")); worldIn.sendBlockUpdated(pos, state, state, 2); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java index fda54cf431..dcfb70132c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java @@ -14,6 +14,7 @@ import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.block.RuneBlock; import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModPotions; @@ -55,7 +56,7 @@ public RuneTile(BlockPos pos, BlockState state) { } public void setSpell(Spell spell) { - this.spell = spell.clone(); + this.spell = spell; updateBlock(); } @@ -90,7 +91,7 @@ public void castSpell(Entity entity) { @Override public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); - tag.put("spell", spell.serialize()); + tag.put("spell", ANCodecs.encode(Spell.CODEC.codec(), spell)); tag.putBoolean("charged", isCharged); tag.putBoolean("redstone", disabled); tag.putBoolean("temp", isTemporary); @@ -103,7 +104,7 @@ public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { @Override protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.loadAdditional(tag, pRegistries); - this.spell = Spell.fromTag(tag.getCompound("spell")); + this.spell = ANCodecs.decode(Spell.CODEC.codec(), tag.getCompound("spell")); this.isCharged = tag.getBoolean("charged"); this.disabled = tag.getBoolean("redstone"); this.isTemporary = tag.getBoolean("temp"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 01cdccdbd3..b10192407a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -589,7 +589,7 @@ public void readAdditionalSaveData(CompoundTag tag) { public void addAdditionalSaveData(CompoundTag tag) { super.addAdditionalSaveData(tag); tag.put("starbuncleData", data.immutable().toTag(level)); - if (getHeldStack() != null) { + if (!getHeldStack().isEmpty()) { Tag itemTag = getHeldStack().save(level.registryAccess()); tag.put("held", itemTag); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java index 70847a9dfe..aab616ee6e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ReactiveEvents.java @@ -1,12 +1,6 @@ package com.hollingsworth.arsnouveau.common.event; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.common.network.Networking; -import com.hollingsworth.arsnouveau.common.network.PacketReactiveSpell; -import com.hollingsworth.arsnouveau.common.util.HolderHelper; -import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; -import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; -import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -31,11 +25,12 @@ public static void livingHitEvent(LivingDamageEvent.Post e) { } public static void castSpell(LivingEntity playerIn, ItemStack stack) { - int level = stack.getEnchantmentLevel(playerIn.level.holderOrThrow(EnchantmentRegistry.REACTIVE_ENCHANTMENT)); - var reactiveCaster = stack.get(DataComponentRegistry.REACTIVE_CASTER); - if (level * .25 >= Math.random() && reactiveCaster != null && reactiveCaster.getSpell().isValid()) { - reactiveCaster.castSpell(playerIn.getCommandSenderWorld(), playerIn, InteractionHand.MAIN_HAND, null); - } + //todo: reenable reactive +// int level = stack.getEnchantmentLevel(playerIn.level.holderOrThrow(EnchantmentRegistry.REACTIVE_ENCHANTMENT)); +// var reactiveCaster = stack.get(DataComponentRegistry.REACTIVE_CASTER); +// if (level * .25 >= Math.random() && reactiveCaster != null && reactiveCaster.getSpell().isValid()) { +// reactiveCaster.castSpell(playerIn.getCommandSenderWorld(), playerIn, InteractionHand.MAIN_HAND, null); +// } } @SubscribeEvent @@ -50,18 +45,21 @@ public static void leftClickBlock(PlayerInteractEvent.LeftClickBlock e) { @SubscribeEvent public static void playerAttackEntity(AttackEntityEvent e) { - Player entity = e.getEntity(); - - if (entity == null || entity.getCommandSenderWorld().isClientSide) - return; - ItemStack s = e.getEntity().getMainHandItem(); - castSpell(entity, s); + //todo: reenable reactive +// Player entity = e.getEntity(); +// +// if (entity == null || entity.getCommandSenderWorld().isClientSide) +// return; +// ItemStack s = e.getEntity().getMainHandItem(); +// castSpell(entity, s); } @SubscribeEvent public static void leftClickAir(PlayerInteractEvent.LeftClickEmpty e) { - if (e.getItemStack().getEnchantmentLevel(HolderHelper.unwrap(e.getLevel(), EnchantmentRegistry.REACTIVE_ENCHANTMENT)) > 0) - Networking.sendToServer(new PacketReactiveSpell()); + //todo: reenable reactive } +// if (e.getItemStack().getEnchantmentLevel(HolderHelper.unwrap(e.getLevel(), EnchantmentRegistry.REACTIVE_ENCHANTMENT)) > 0) +// Networking.sendToServer(new PacketReactiveSpell()); +// } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java index 708bc92ddc..1651625440 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java @@ -4,8 +4,11 @@ import com.hollingsworth.arsnouveau.api.mana.IManaDiscountEquipment; import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.spell.Spell; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; import com.hollingsworth.arsnouveau.setup.config.Config; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.BlockPos; @@ -31,7 +34,7 @@ public CasterTome(Properties properties) { } public CasterTome() { - super(); + super(ItemsRegistry.defaultItemProperties().component(DataComponentRegistry.SPELL_CASTER, new SpellCaster())); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java index bbeca25945..1ec973cd63 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java @@ -11,6 +11,7 @@ import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; @@ -43,7 +44,7 @@ public EnchantersSword(Tier iItemTier, int baseDamage, float baseAttackSpeed) { } public EnchantersSword(Tier iItemTier, int baseDamage, float baseAttackSpeed, Properties properties) { - super(iItemTier, properties.component(DataComponents.TOOL, createToolProperties()).attributes(SwordItem.createAttributes(iItemTier, baseDamage, baseAttackSpeed))); + super(iItemTier, properties.component(DataComponents.TOOL, createToolProperties()).attributes(SwordItem.createAttributes(iItemTier, baseDamage, baseAttackSpeed)).component(DataComponentRegistry.SPELL_CASTER, new SpellCaster())); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java index 0ccd86c61b..f7cd5a1168 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java @@ -20,6 +20,7 @@ import com.hollingsworth.arsnouveau.common.network.PacketSetBookMode; import com.hollingsworth.arsnouveau.setup.config.ServerConfig; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.ChatFormatting; import net.minecraft.client.KeyMapping; @@ -57,8 +58,7 @@ public class SpellBook extends ModItem implements GeoItem, ICasterTool, IDyeable AnimatableInstanceCache factory = GeckoLibUtil.createInstanceCache(this); public SpellBook(SpellTier tier) { - super(new Item.Properties().stacksTo(1)); - this.tier = tier; + this(new Item.Properties().stacksTo(1).component(DataComponentRegistry.SPELL_CASTER, new SpellCaster(10)), tier); } public SpellBook(Properties properties, SpellTier tier) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java index d637ef29a7..430f09951b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java @@ -10,6 +10,7 @@ import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; import com.hollingsworth.arsnouveau.common.util.HolderHelper; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.network.chat.Component; @@ -42,7 +43,7 @@ public SpellBow(Properties properties) { } public SpellBow() { - this(ItemsRegistry.defaultItemProperties().stacksTo(1)); + this(ItemsRegistry.defaultItemProperties().stacksTo(1).component(DataComponentRegistry.SPELL_CASTER, new SpellCaster())); } public boolean canPlayerCastSpell(ItemStack bow, Player playerentity) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java index a3de7bd6e2..af3e6d647b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java @@ -2,8 +2,11 @@ import com.hollingsworth.arsnouveau.api.item.ICasterTool; import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; import com.hollingsworth.arsnouveau.setup.config.Config; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import net.minecraft.world.inventory.tooltip.TooltipComponent; @@ -21,7 +24,7 @@ public SpellParchment(Properties properties) { } public SpellParchment() { - super(); + super(ItemsRegistry.defaultItemProperties().component(DataComponentRegistry.SPELL_CASTER, new SpellCaster())); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java index 983fa29a3e..4c788be073 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java @@ -21,9 +21,7 @@ public StarbuncleShard(){ public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { StarbuncleCharmData data = stack.get(DataComponentRegistry.STARBUNCLE_DATA); if(data != null){ - if (data.name != null) { - tooltip2.add(data.name); - } + data.name.ifPresent(tooltip2::add); if(data.adopter != null){ tooltip2.add(Component.translatable("ars_nouveau.adopter", data.adopter).withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java index 04eb3e336f..2a69d8b140 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java @@ -6,6 +6,7 @@ import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAccelerate; import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; @@ -36,7 +37,7 @@ public Wand(Properties properties) { } public Wand() { - super(new Item.Properties().stacksTo(1)); + super(new Item.Properties().stacksTo(1).component(DataComponentRegistry.SPELL_CASTER, new SpellCaster())); } private

PlayState predicate(AnimationState

event) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ReactiveCasterData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ReactiveCasterData.java index abeda46edf..f04998f643 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ReactiveCasterData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ReactiveCasterData.java @@ -1,8 +1,9 @@ package com.hollingsworth.arsnouveau.common.items.data; import com.hollingsworth.arsnouveau.api.spell.*; -import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.mojang.serialization.MapCodec; +import net.minecraft.core.component.DataComponentType; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.InteractionHand; @@ -11,18 +12,16 @@ import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.util.FakePlayer; -import java.util.Map; - public class ReactiveCasterData extends SpellCaster { public static MapCodec CODEC = SpellCaster.createCodec(ReactiveCasterData::new); - public static StreamCodec STREAM_CODEC = CheatSerializer.create(ReactiveCasterData.CODEC.codec()); + public static StreamCodec STREAM_CODEC = createStream(ReactiveCasterData::new); public ReactiveCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots) { super(slot, flavorText, isHidden, hiddenText, maxSlots); } - public ReactiveCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, Map spells) { + public ReactiveCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, SpellSlotMap spells) { super(slot, flavorText, isHidden, hiddenText, maxSlots, spells); } @@ -33,4 +32,9 @@ public SpellResolver getSpellResolver(SpellContext context, Level worldIn, Livin } return super.getSpellResolver(context, worldIn, playerIn, handIn); } + + @Override + public DataComponentType getComponentType() { + return DataComponentRegistry.REACTIVE_CASTER.get(); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java index 9b849ef11a..ec8749e5b2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java @@ -7,7 +7,6 @@ import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.PlayerCaster; import com.hollingsworth.arsnouveau.common.block.BasicSpellTurret; import com.hollingsworth.arsnouveau.common.block.ScryerCrystal; -import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; import com.hollingsworth.arsnouveau.common.items.ScryerScroll; import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; import com.hollingsworth.arsnouveau.common.util.PortUtil; @@ -16,6 +15,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Position; +import net.minecraft.core.component.DataComponentType; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.codec.StreamCodec; @@ -31,19 +31,17 @@ import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; -import java.util.Map; - public class ScryCasterData extends SpellCaster { public static final MapCodec CODEC = createCodec(ScryCasterData::new); - public static final StreamCodec STREAM_CODEC = CheatSerializer.create(CODEC); + public static final StreamCodec STREAM_CODEC = createStream(ScryCasterData::new); public ScryCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots) { super(slot, flavorText, isHidden, hiddenText, maxSlots); } - public ScryCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, Map spells) { + public ScryCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, SpellSlotMap spells) { super(slot, flavorText, isHidden, hiddenText, maxSlots, spells); } @@ -104,4 +102,9 @@ public InteractionResultHolder castSpell(Level worldIn, LivingEntity playSound(entity.getOnPos(), worldIn, entity, getCurrentSound(), SoundSource.PLAYERS); return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); } + + @Override + public DataComponentType getComponentType() { + return DataComponentRegistry.SCRY_CASTER.get(); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java index e3e916a305..e91b43b697 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java @@ -24,14 +24,15 @@ import net.minecraft.world.item.component.TooltipProvider; import net.minecraft.world.level.block.Block; +import java.util.Optional; import java.util.function.Consumer; public class StarbuncleCharmData implements NBTComponent, TooltipProvider { public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - ComponentSerialization.CODEC.fieldOf("name").forGetter(data -> data.name), + ComponentSerialization.CODEC.optionalFieldOf("name").forGetter(data -> data.name), Codec.STRING.optionalFieldOf("color", DyeColor.ORANGE.getName()).forGetter(data -> data.color), - Block.CODEC.fieldOf("path").forGetter(data -> data.pathBlock), +// Block.CODEC.fieldOf("path").forGetter(data -> data.pathBlock), BlockPos.CODEC.optionalFieldOf("bed", BlockPos.ZERO).forGetter(data -> data.bedPos == null ? BlockPos.ZERO : data.bedPos), ItemStack.CODEC.optionalFieldOf("cosmetic", ItemStack.EMPTY).forGetter(data -> data.cosmetic), CompoundTag.CODEC.optionalFieldOf("behavior", new CompoundTag()).forGetter(data -> data.behaviorTag), @@ -40,7 +41,7 @@ public class StarbuncleCharmData implements NBTComponent, T ).apply(instance, StarbuncleCharmData::new)); public static StreamCodec STREAM_CODEC = CheatSerializer.create(CODEC); - public final Component name; + public final Optional name; public final String color; public final ItemStack cosmetic; public final Block pathBlock; @@ -49,7 +50,18 @@ public class StarbuncleCharmData implements NBTComponent, T public final String adopter; public final String bio; - public StarbuncleCharmData(Component name, String color, Block pathBlock, BlockPos bedPos, ItemStack cosmetic, CompoundTag behaviorTag, String adopter, String bio) { + public StarbuncleCharmData(Optional name, String color, BlockPos bedPos, ItemStack cosmetic, CompoundTag behaviorTag, String adopter, String bio) { + this.name = name; + this.color = color; + this.cosmetic = cosmetic; + this.pathBlock = null; + this.bedPos = bedPos; + this.behaviorTag = behaviorTag; + this.adopter = adopter; + this.bio = bio; + } + + public StarbuncleCharmData(Optional name, String color, Block pathBlock, BlockPos bedPos, ItemStack cosmetic, CompoundTag behaviorTag, String adopter, String bio) { this.name = name; this.color = color; this.cosmetic = cosmetic; @@ -71,13 +83,13 @@ public Codec getCodec() { } public Mutable mutable() { - return new Mutable(name, color, cosmetic, pathBlock, bedPos, behaviorTag, adopter, bio); + return new Mutable(name.orElse(null), color, cosmetic, pathBlock, bedPos, behaviorTag, adopter, bio); } @Override public void addToTooltip(Item.TooltipContext context, Consumer tooltip2, TooltipFlag pTooltipFlag) { - if (name != null) { - tooltip2.accept(name); + if (!name.isEmpty()) { + tooltip2.accept(name.get()); } if(adopter != null){ tooltip2.accept(Component.translatable("ars_nouveau.adopter", adopter).withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); @@ -124,7 +136,7 @@ public Mutable() { } public StarbuncleCharmData immutable() { - return new StarbuncleCharmData(name, color, pathBlock, bedPos, cosmetic, behaviorTag, adopter, bio); + return new StarbuncleCharmData(Optional.ofNullable(name), color, pathBlock, bedPos, cosmetic, behaviorTag, adopter, bio); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java index 1bb8787656..07b70bcc40 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java @@ -1,16 +1,17 @@ package com.hollingsworth.arsnouveau.common.items.data; import com.hollingsworth.arsnouveau.api.mana.IManaCap; -import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.api.spell.SpellContext; import com.hollingsworth.arsnouveau.api.spell.SpellResolver; -import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; +import com.hollingsworth.arsnouveau.api.spell.SpellSlotMap; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.NotEnoughManaPacket; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.mojang.serialization.MapCodec; +import net.minecraft.core.component.DataComponentType; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.codec.StreamCodec; @@ -20,19 +21,17 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import java.util.Map; - public class TomeCasterData extends SpellCaster { public static final MapCodec CODEC = SpellCaster.createCodec(TomeCasterData::new); - public static final StreamCodec STREAM_CODEC = CheatSerializer.create(TomeCasterData.CODEC); + public static final StreamCodec STREAM_CODEC = createStream(TomeCasterData::new); public TomeCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots) { super(slot, flavorText, isHidden, hiddenText, maxSlots); } - public TomeCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, Map spells) { + public TomeCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, SpellSlotMap spells) { super(slot, flavorText, isHidden, hiddenText, maxSlots, spells); } @@ -56,4 +55,9 @@ protected boolean enoughMana(LivingEntity entity) { }; } + + @Override + public DataComponentType getComponentType() { + return DataComponentRegistry.TOME_CASTER.get(); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/ChatComponentAccessor.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/ChatComponentAccessor.java index 25b3c79ca8..ee190e829f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/ChatComponentAccessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/ChatComponentAccessor.java @@ -9,8 +9,8 @@ @Mixin(ChatComponent.class) public interface ChatComponentAccessor { - @Accessor - List getRecentChat(); +// @Accessor +// List getRecentChat(); @Accessor List getAllMessages(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/PotionRecipeMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/PotionRecipeMixin.java deleted file mode 100644 index 53f73b6841..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/PotionRecipeMixin.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.hollingsworth.arsnouveau.common.mixin; - -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.Accessor; - -import java.util.List; - -@Mixin(PotionBrewing.class) -public interface PotionRecipeMixin { - @Accessor("potionMixes") - static List> mixList() { - throw new AssertionError(); - } -} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/TrackedEntityMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/TrackedEntityMixin.java index 7b273923a2..6755b44b4d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/TrackedEntityMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/TrackedEntityMixin.java @@ -39,7 +39,7 @@ public abstract class TrackedEntityMixin { * shouldBeSent */ @Inject(method = "updatePlayer", at = @At(value = "FIELD", target = "Lnet/minecraft/world/phys/Vec3;x:D", ordinal = 0), locals = LocalCapture.CAPTURE_FAILSOFT) - private void onUpdatePlayer(ServerPlayer player, CallbackInfo callback, Vec3 unused, double viewDistance) { + private void onUpdatePlayer(ServerPlayer player, CallbackInfo ci, Vec3 vec3, int i, double d0, Vec3 unused, double viewDistance) { if (CameraUtil.isPlayerMountedOnCamera(player)) { Vec3 relativePosToCamera = player.getCamera().position().subtract(entity.position()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/structure/StructureTemplateAccessor.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/structure/StructureTemplateAccessor.java index 77d0ecb93d..bc35953e80 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/structure/StructureTemplateAccessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/structure/StructureTemplateAccessor.java @@ -12,7 +12,4 @@ public interface StructureTemplateAccessor { @Accessor("entityInfoList") List getEntityInfoList(); - @Accessor - List getPalettes(); - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientDelayEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientDelayEffect.java index 454e92e538..31eacdd7f0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientDelayEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientDelayEffect.java @@ -6,6 +6,7 @@ import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.api.spell.SpellContext; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.LivingCaster; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -36,7 +37,7 @@ public class PacketClientDelayEffect extends AbstractPacket{ //Decoder public PacketClientDelayEffect(RegistryFriendlyByteBuf buf) { duration = buf.readInt(); - spell = Spell.fromTag(buf.readNbt()); + spell = ANCodecs.decode(Spell.CODEC.codec(), buf.readNbt()); shooterID = buf.readInt(); hitEntityID = buf.readInt(); if (hitEntityID == -1) { @@ -47,7 +48,7 @@ public PacketClientDelayEffect(RegistryFriendlyByteBuf buf) { //Encoder public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeInt(duration); - buf.writeNbt(spell.serialize()); + buf.writeNbt(ANCodecs.encode(Spell.CODEC.codec(), spell)); buf.writeInt(shooterID); buf.writeInt(hitEntityID); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java index 15e29f1df1..4bacbc9ffc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.common.items.SpellBook; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; @@ -30,14 +31,14 @@ public PacketSetSound(int castSlot, ConfiguredSpellSound sound, boolean mainHand public PacketSetSound(RegistryFriendlyByteBuf buf) { castSlot = buf.readInt(); CompoundTag tag = buf.readNbt(); - sound = tag == null ? ConfiguredSpellSound.DEFAULT : ConfiguredSpellSound.fromTag(tag); + sound = tag == null ? ConfiguredSpellSound.DEFAULT : ANCodecs.decode(ConfiguredSpellSound.CODEC.codec(), tag); mainHand = buf.readBoolean(); } //Encoder public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeInt(castSlot); - buf.writeNbt(sound.serialize()); + buf.writeNbt(ANCodecs.encode(ConfiguredSpellSound.CODEC.codec(), sound)); buf.writeBoolean(mainHand); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java index 2455595a99..8fa8f811df 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java @@ -3,8 +3,9 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.item.ICasterTool; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.spell.Spell; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; @@ -31,7 +32,7 @@ public PacketUpdateCaster(Spell spellRecipe, int cast_slot, String spellName, bo //Decoder public PacketUpdateCaster(RegistryFriendlyByteBuf buf) { - spellRecipe = Spell.fromTag(buf.readNbt()); + spellRecipe = ANCodecs.decode(Spell.CODEC.codec(), buf.readNbt()); cast_slot = buf.readInt(); spellName = buf.readUtf(32767); this.mainHand = buf.readBoolean(); @@ -39,7 +40,7 @@ public PacketUpdateCaster(RegistryFriendlyByteBuf buf) { //Encoder public void toBytes(RegistryFriendlyByteBuf buf) { - buf.writeNbt(spellRecipe.serialize()); + buf.writeNbt(ANCodecs.encode(Spell.CODEC.codec(), spellRecipe)); buf.writeInt(cast_slot); buf.writeUtf(spellName); buf.writeBoolean(mainHand); @@ -52,12 +53,10 @@ public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer playe if(!(stack.getItem() instanceof ICasterTool)) return; if (spellRecipe != null) { - ISpellCaster caster = SpellCasterRegistry.from(stack); - caster.setCurrentSlot(cast_slot); + SpellCaster caster = SpellCasterRegistry.from(stack); // Update just the recipe, don't overwrite the entire spell. var spell = caster.getSpell(cast_slot).mutable().setRecipe(new ArrayList<>(spellRecipe.unsafeList())); - caster.setSpell(spell.immutable(), cast_slot); - caster.setSpellName(spellName, cast_slot); + caster.setCurrentSlot(cast_slot).setSpell(spell.immutable(), cast_slot).setSpellName(spellName, cast_slot).saveToStack(stack); Networking.sendToPlayerClient(new PacketUpdateBookGUI(stack), player); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRune.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRune.java index 588b79e40f..bb9bffb789 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRune.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRune.java @@ -44,7 +44,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull runeTile.uuid = shooter.getUUID(); } runeTile.isTemporary = true; - Spell newSpell = newContext.getSpell().clone(); + Spell newSpell = newContext.getSpell(); var mutable = newSpell.mutable(); mutable.recipe.add(0, MethodTouch.INSTANCE); runeTile.spell = mutable.immutable(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java index 436e08a4c2..47a1817f99 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java @@ -11,7 +11,6 @@ import com.hollingsworth.arsnouveau.api.scrying.IScryer; import com.hollingsworth.arsnouveau.api.scrying.SingleBlockScryer; import com.hollingsworth.arsnouveau.api.scrying.TagScryer; -import com.hollingsworth.arsnouveau.api.sound.SpellSound; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import com.hollingsworth.arsnouveau.common.block.tile.MobJarTile; import com.hollingsworth.arsnouveau.common.familiars.*; @@ -25,7 +24,6 @@ import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; import com.hollingsworth.arsnouveau.common.spell.method.MethodUnderfoot; import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.player.Player; @@ -263,11 +261,6 @@ public static void postInit() { Arrays.asList(PerkSlot.ONE, PerkSlot.TWO, PerkSlot.THREE) )); - SoundRegistry.DEFAULT_SPELL_SOUND = new SpellSound(SoundRegistry.DEFAULT_FAMILY, Component.translatable("ars_nouveau.sound.default_family")); - SoundRegistry.EMPTY_SPELL_SOUND = new SpellSound(SoundRegistry.EMPTY_SOUND_FAMILY, Component.translatable("ars_nouveau.sound.empty")); - SoundRegistry.GAIA_SPELL_SOUND = new SpellSound(SoundRegistry.GAIA_FAMILY, Component.translatable("ars_nouveau.sound.gaia_family")); - SoundRegistry.TEMPESTRY_SPELL_SOUND = new SpellSound(SoundRegistry.TEMPESTRY_FAMILY, Component.translatable("ars_nouveau.sound.tempestry_family")); - SoundRegistry.FIRE_SPELL_SOUND = new SpellSound(SoundRegistry.FIRE_FAMILY, Component.translatable("ars_nouveau.sound.fire_family")); SpellSoundRegistry.registerSpellSound(SoundRegistry.DEFAULT_SPELL_SOUND); SpellSoundRegistry.registerSpellSound(SoundRegistry.EMPTY_SPELL_SOUND); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CreativeTabRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CreativeTabRegistry.java index 39c8b75b54..d579ef86e9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CreativeTabRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CreativeTabRegistry.java @@ -1,16 +1,10 @@ package com.hollingsworth.arsnouveau.setup.registry; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.registry.FamiliarRegistry; import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; -import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; -import com.hollingsworth.arsnouveau.api.registry.RitualRegistry; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; -import com.hollingsworth.arsnouveau.common.items.FamiliarScript; import com.hollingsworth.arsnouveau.common.items.Glyph; -import com.hollingsworth.arsnouveau.common.items.PerkItem; -import com.hollingsworth.arsnouveau.common.items.RitualTablet; import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; @@ -44,15 +38,15 @@ public class CreativeTabRegistry { output.accept(entry.get().getDefaultInstance()); } } - for (PerkItem perk : PerkRegistry.getPerkItemMap().values()) { - output.accept(perk.getDefaultInstance()); - } - for (RitualTablet ritual : RitualRegistry.getRitualItemMap().values()) { - output.accept(ritual.getDefaultInstance()); - } - for (FamiliarScript familiar : FamiliarRegistry.getFamiliarScriptMap().values()) { - output.accept(familiar.getDefaultInstance()); - } +// for (PerkItem perk : PerkRegistry.getPerkItemMap().values()) { +// output.accept(perk.getDefaultInstance()); +// } +// for (RitualTablet ritual : RitualRegistry.getRitualItemMap().values()) { +// output.accept(ritual.getDefaultInstance()); +// } +// for (FamiliarScript familiar : FamiliarRegistry.getFamiliarScriptMap().values()) { +// output.accept(familiar.getDefaultInstance()); +// } }).withTabsBefore(CreativeModeTabs.SPAWN_EGGS) .build()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java index 4bddbd9bc8..cfca2f1ff8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java @@ -8,6 +8,7 @@ import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; import com.hollingsworth.arsnouveau.api.registry.RitualRegistry; import com.hollingsworth.arsnouveau.api.ritual.AbstractRitual; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.api.spell.SpellTier; import com.hollingsworth.arsnouveau.common.armor.AnimatedMagicArmor; import com.hollingsworth.arsnouveau.common.items.*; @@ -182,7 +183,7 @@ public int getValue() { public static final ItemRegistryWrapper SHAPERS_FOCUS = register(LibItemNames.SHAPERS_FOCUS, () -> new ShapersFocus(defaultItemProperties().stacksTo(1))); public static final ItemRegistryWrapper SOURCE_BERRY_PIE = register(LibItemNames.SOURCE_BERRY_PIE, () -> new ModItem(defaultItemProperties().food(SOURCE_PIE_FOOD)).withTooltip(Component.translatable("tooltip.ars_nouveau.source_food"))); public static final ItemRegistryWrapper SOURCE_BERRY_ROLL = register(LibItemNames.SOURCE_BERRY_ROLL, () -> new ModItem(defaultItemProperties().food(SOURCE_ROLL_FOOD)).withTooltip(Component.translatable("tooltip.ars_nouveau.source_food"))); - public static final ItemRegistryWrapper ENCHANTERS_MIRROR = register(LibItemNames.ENCHANTERS_MIRROR, () -> new EnchantersMirror(defaultItemProperties().stacksTo(1))); + public static final ItemRegistryWrapper ENCHANTERS_MIRROR = register(LibItemNames.ENCHANTERS_MIRROR, () -> new EnchantersMirror(defaultItemProperties().stacksTo(1).component(DataComponentRegistry.SPELL_CASTER, new SpellCaster()))); public static final ItemRegistryWrapper SORCERER_BOOTS = register(LibItemNames.SORCERER_BOOTS, () -> AnimatedMagicArmor.light(ArmorItem.Type.BOOTS)); public static final ItemRegistryWrapper SORCERER_LEGGINGS = register(LibItemNames.SORCERER_LEGGINGS, () -> AnimatedMagicArmor.light(ArmorItem.Type.LEGGINGS)); public static final ItemRegistryWrapper SORCERER_ROBES = register(LibItemNames.SORCERER_ROBES, () -> AnimatedMagicArmor.light(ArmorItem.Type.CHESTPLATE)); @@ -215,9 +216,9 @@ public int getValue() { public static final ItemRegistryWrapper SOUND_OF_GLASS = register(LibItemNames.SOUND_OF_GLASS, () -> new Item(defaultItemProperties().stacksTo(1).rarity(Rarity.RARE))); public static final ItemRegistryWrapper WILD_HUNT = register(LibItemNames.FIREL_WILD_HUNT, () -> new Item(defaultItemProperties().stacksTo(1).rarity(Rarity.RARE))); public static final ItemRegistryWrapper STARBY_GIFY = register(LibItemNames.STARBY_GIFT, () -> new Present(defaultItemProperties().rarity(Rarity.EPIC))); - public static final ItemRegistryWrapper SPELL_CROSSBOW = register(LibItemNames.SPELL_CROSSBOW, () -> new SpellCrossbow(defaultItemProperties().stacksTo(1))); + public static final ItemRegistryWrapper SPELL_CROSSBOW = register(LibItemNames.SPELL_CROSSBOW, () -> new SpellCrossbow(defaultItemProperties().stacksTo(1).component(DataComponentRegistry.SPELL_CASTER, new SpellCaster()))); public static final ItemRegistryWrapper STABLE_WARP_SCROLL = register(LibItemNames.STABLE_WARP_SCROLL, () -> new StableWarpScroll(defaultItemProperties().stacksTo(1))); - public static final ItemRegistryWrapper SCRY_CASTER = register(LibItemNames.SCRY_CASTER, () -> new ScryCaster(defaultItemProperties().stacksTo(1))); + public static final ItemRegistryWrapper SCRY_CASTER = register(LibItemNames.SCRY_CASTER, () -> new ScryCaster(defaultItemProperties().stacksTo(1).component(DataComponentRegistry.SPELL_CASTER, new SpellCaster()))); public static final ItemRegistryWrapper JUMP_RING = register(LibItemNames.JUMP_RING, JumpingRing::new); public static ItemRegistryWrapper register(String name, Supplier item) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java index 10debb7d27..1240ee6373 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java @@ -3,7 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.sound.SpellSound; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.network.chat.Component; import net.minecraft.sounds.SoundEvent; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; @@ -34,11 +34,11 @@ public class SoundRegistry { public static DeferredHolder SOUND_OF_GLASS = SOUND_REG.register("thistle_the_sound_of_glass", () -> makeSound("thistle_the_sound_of_glass")); - public static SpellSound DEFAULT_SPELL_SOUND; - public static SpellSound EMPTY_SPELL_SOUND; - public static SpellSound GAIA_SPELL_SOUND; - public static SpellSound TEMPESTRY_SPELL_SOUND; - public static SpellSound FIRE_SPELL_SOUND; + public static SpellSound DEFAULT_SPELL_SOUND = new SpellSound(SoundRegistry.DEFAULT_FAMILY, Component.translatable("ars_nouveau.sound.default_family")); + public static SpellSound EMPTY_SPELL_SOUND = new SpellSound(SoundRegistry.EMPTY_SOUND_FAMILY, Component.translatable("ars_nouveau.sound.empty")); + public static SpellSound GAIA_SPELL_SOUND = new SpellSound(SoundRegistry.GAIA_FAMILY, Component.translatable("ars_nouveau.sound.gaia_family")); + public static SpellSound TEMPESTRY_SPELL_SOUND = new SpellSound(SoundRegistry.TEMPESTRY_FAMILY, Component.translatable("ars_nouveau.sound.tempestry_family")); + public static SpellSound FIRE_SPELL_SOUND = new SpellSound(SoundRegistry.FIRE_FAMILY, Component.translatable("ars_nouveau.sound.fire_family")); static SoundEvent makeSound(String name) { return SoundEvent.createVariableRangeEvent(ArsNouveau.prefix( name)); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 9d1ca905a3..5a8bcf5a9f 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -2,6 +2,7 @@ public-f net.minecraft.world.entity.ai.goal.GoalSelector availableGoals public net.minecraft.world.entity.Entity position public net.minecraft.client.gui.components.EditBox * public net.minecraft.world.entity.projectile.AbstractArrow knockbackStrength # knockbackStrength +public net.minecraft.world.item.alchemy.PotionBrewing potionMixes # potionMixes public net.minecraft.world.item.alchemy.PotionBrewing m_43513_(Lnet/minecraft/world/item/alchemy/Potion;Lnet/minecraft/world/item/Item;Lnet/minecraft/world/item/alchemy/Potion;)V # addMix public net.minecraft.world.item.alchemy.PotionBrewing$Mix public net.minecraft.world.level.Explosion * diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml index 4f84395cc0..aa68d5e145 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -48,3 +48,5 @@ license="GNU GENERAL PUBLIC LICENSE" versionRange="[4.2.1,)" ordering="AFTER" side="BOTH" +[[mixins]] + config="ars_nouveau.mixins.json" \ No newline at end of file diff --git a/src/main/resources/ars_nouveau.mixins.json b/src/main/resources/ars_nouveau.mixins.json index c883f687be..6c2c135676 100644 --- a/src/main/resources/ars_nouveau.mixins.json +++ b/src/main/resources/ars_nouveau.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "com.hollingsworth.arsnouveau.common.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "refmap": "ars_nouveau.refmap.json", "plugin": "com.hollingsworth.arsnouveau.common.mixin.MixinPlugin", "client": [ @@ -20,7 +20,6 @@ "DamageSourceMixin", "LivingAccessor", "MobAccessor", - "PotionRecipeMixin", "PufferfishAccessor", "camera.ANServerPlayerMixin", "camera.ChunkMapMixin", From e9c653baab1f52bd01c9c23e759a67c801bdf664 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 7 Jul 2024 08:46:16 -0500 Subject: [PATCH 031/363] readd publishing --- build.gradle | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/build.gradle b/build.gradle index 3f6a94ac9e..2d95dd5e17 100644 --- a/build.gradle +++ b/build.gradle @@ -139,6 +139,39 @@ dependencies { // } //} +publishing { + publications { + mavenJava(MavenPublication) { + groupId project.group + artifactId project.archivesBaseName + version project.version + from components.java + // Allows the maven pom file to be modified. + pom.withXml { + + // Go through all the dependencies. + asNode().dependencies.dependency.each { dep -> + + println 'Surpressing artifact ' + dep.artifactId.last().value().last() + ' from maven dependencies.' + assert dep.parent().remove(dep) + } + } + } + } + repositories { + maven { + url "file://" + System.getenv("local_maven") + } + } +} + +// 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. +tasks.withType(GenerateModuleMetadata) { + enabled = false +} + tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation } From 8bd9b444cde13b555fcc7605f96bd4b1b58b4db5 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 7 Jul 2024 09:03:34 -0500 Subject: [PATCH 032/363] fix book GUI, projectile spawning --- .../arsnouveau/client/gui/book/BaseBook.java | 10 +++++++++- .../arsnouveau/client/gui/book/GuiSpellBook.java | 1 - .../common/entity/EntityProjectileSpell.java | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java index 6e0cbf762f..835265d19c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java @@ -8,6 +8,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Renderable; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -76,11 +77,18 @@ public void drawScreenAfterScale(GuiGraphics graphics, int mouseX, int mouseY, f drawBackgroundElements(graphics, mouseX, mouseY, partialTicks); drawForegroundElements(mouseX, mouseY, partialTicks); poseStack.popPose(); - super.render(graphics, mouseX, mouseY, partialTicks); + for (Renderable renderable : this.renderables) { + renderable.render(graphics, mouseX, mouseY, partialTicks); + } drawTooltip(graphics, mouseX, mouseY); } public BookSlider buildSlider(int x, int y, Component prefix, Component suffix, double currentVal) { return new BookSlider(x, y, 100, 20, prefix, suffix, 1.0D, 255.0D, currentVal, 1, 1, true); } + + @Override + protected void renderBlurredBackground(float pPartialTick) { + + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index 34d3041045..6187693b12 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -202,7 +202,6 @@ public int getNumPages() { return (int) Math.ceil((double) displayedGlyphs.size() / 58); } - private void layoutAllGlyphs(int page) { clearButtons(glyphButtons); formTextRow = 0; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java index 78773edf6c..642456e54b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java @@ -128,6 +128,7 @@ public HitResult getHitResult() { @Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); pBuilder.define(OWNER_ID, -1); } From 7f8d03a412e0895dce6710d52c76c0eb53456e92 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 7 Jul 2024 10:05:33 -0500 Subject: [PATCH 033/363] update jenkins jdk --- Jenkinsfile | 2 +- build.gradle | 17 ----------------- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 43679473b0..82f2c0295e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -3,7 +3,7 @@ pipeline { agent any tools { - jdk "jdk-17.0.1" + jdk "jdk-21" } stages { stage('Clean') { diff --git a/build.gradle b/build.gradle index 2d95dd5e17..70cd41e3c2 100644 --- a/build.gradle +++ b/build.gradle @@ -146,16 +146,6 @@ publishing { artifactId project.archivesBaseName version project.version from components.java - // Allows the maven pom file to be modified. - pom.withXml { - - // Go through all the dependencies. - asNode().dependencies.dependency.each { dep -> - - println 'Surpressing artifact ' + dep.artifactId.last().value().last() + ' from maven dependencies.' - assert dep.parent().remove(dep) - } - } } } repositories { @@ -165,13 +155,6 @@ publishing { } } -// 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. -tasks.withType(GenerateModuleMetadata) { - enabled = false -} - tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation } From 8a42a91dff60d94e303662d58254f591d42fde58 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 7 Jul 2024 11:39:10 -0500 Subject: [PATCH 034/363] Fix spellCaster serialization, empty itemstack crashes on save --- .../arsnouveau/api/item/ICasterTool.java | 23 +---------- .../api/registry/DynamicTooltipRegistry.java | 25 ++++++++++++ .../arsnouveau/api/spell/SpellCaster.java | 19 ++++++++- .../arsnouveau/api/spell/SpellSlotMap.java | 6 +-- .../client/events/ClientEvents.java | 2 + .../common/block/tile/AlterationTile.java | 10 +++-- .../common/block/tile/ImbuementTile.java | 2 +- .../common/block/tile/ScribesTile.java | 6 ++- .../common/block/tile/SingleItemTile.java | 2 +- .../common/block/tile/WixieCauldronTile.java | 2 +- .../common/items/AnnotatedCodex.java | 22 +++++----- .../arsnouveau/common/items/CasterTome.java | 14 ++++--- .../arsnouveau/common/items/ModItem.java | 1 + .../common/items/SpellParchment.java | 11 ++--- .../common/items/data/CodexData.java | 40 +++++++++++++++---- .../common/items/data/ScryCasterData.java | 4 ++ .../common/items/data/TomeCasterData.java | 4 ++ .../arsnouveau/common/util/ANCodecs.java | 22 ++++++++-- .../setup/registry/APIRegistry.java | 2 + .../setup/registry/ItemsRegistry.java | 3 +- 20 files changed, 149 insertions(+), 71 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/registry/DynamicTooltipRegistry.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java index 97ef9bb6ca..6424ed2db0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java @@ -2,7 +2,6 @@ import com.hollingsworth.arsnouveau.api.client.IDisplayMana; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.spell.ItemCasterProvider; import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.api.spell.SpellCaster; @@ -10,11 +9,8 @@ import com.hollingsworth.arsnouveau.common.items.SpellParchment; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; -import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; @@ -102,22 +98,7 @@ default boolean shouldDisplay(ItemStack stack) { } default void getInformation(ItemStack stack, Item.TooltipContext context, List tooltip2, TooltipFlag flagIn) { - ISpellCaster caster = getSpellCaster(stack); - - if (caster.getSpell().isEmpty()) { - tooltip2.add(Component.translatable("ars_nouveau.tooltip.can_inscribe")); - return; - } - if (!caster.getSpellName().isEmpty()) { - tooltip2.add(Component.literal(caster.getSpellName())); - } - if (caster.isSpellHidden()) { - tooltip2.add(Component.literal(caster.getHiddenRecipe()).withStyle(Style.EMPTY.withFont(ResourceLocation.fromNamespaceAndPath("minecraft", "alt")).withColor(ChatFormatting.GOLD))); - } else { - Spell spell = caster.getSpell(); - tooltip2.add(Component.literal(spell.getDisplayString())); - } - if (!caster.getFlavorText().isEmpty()) - tooltip2.add(Component.literal(caster.getFlavorText()).withStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.BLUE))); + SpellCaster caster = getSpellCaster(stack); + stack.addToTooltip(caster.getComponentType(), context, tooltip2::add, flagIn); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/DynamicTooltipRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/DynamicTooltipRegistry.java new file mode 100644 index 0000000000..4844ae7fa6 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/DynamicTooltipRegistry.java @@ -0,0 +1,25 @@ +package com.hollingsworth.arsnouveau.api.registry; + +import net.minecraft.core.component.DataComponentType; +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 java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; + +public class DynamicTooltipRegistry { + private static Set dataTypes = ConcurrentHashMap.newKeySet(); + + public static void register(DataComponentType type){ + dataTypes.add(type); + } + + public static void appendTooltips(ItemStack stack, Item.TooltipContext context, Consumer adder, TooltipFlag flag){ + for(DataComponentType type : dataTypes){ + stack.addToTooltip(type, context, adder, flag); + } + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java index 8877845be5..ec9c7d2c3c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java @@ -8,11 +8,14 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.ChatFormatting; import net.minecraft.core.component.DataComponentType; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; @@ -208,6 +211,20 @@ public int hashCode() { @Override public void addToTooltip(Item.TooltipContext pContext, Consumer pTooltipAdder, TooltipFlag pTooltipFlag) { - + if (getSpell().isEmpty()) { + pTooltipAdder.accept(Component.translatable("ars_nouveau.tooltip.can_inscribe")); + return; + } + if (!getSpellName().isEmpty()) { + pTooltipAdder.accept(Component.literal(getSpellName())); + } + if (isSpellHidden()) { + pTooltipAdder.accept(Component.literal(getHiddenRecipe()).withStyle(Style.EMPTY.withFont(ResourceLocation.fromNamespaceAndPath("minecraft", "alt")).withColor(ChatFormatting.GOLD))); + } else { + Spell spell = getSpell(); + pTooltipAdder.accept(Component.literal(spell.getDisplayString())); + } + if (!getFlavorText().isEmpty()) + pTooltipAdder.accept(Component.literal(getFlavorText()).withStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.BLUE))); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSlotMap.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSlotMap.java index be203cd2c4..5890422852 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSlotMap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSlotMap.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.api.spell; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.mojang.serialization.Codec; import net.minecraft.Util; import net.minecraft.network.RegistryFriendlyByteBuf; @@ -10,7 +11,8 @@ public record SpellSlotMap(Map slots) { - public static final Codec CODEC = Codec.unboundedMap(Codec.INT, Spell.CODEC.codec()).xmap(SpellSlotMap::new, SpellSlotMap::slots); + public static final Codec CODEC = ANCodecs.intMap(Spell.CODEC.codec(), SpellSlotMap::new, SpellSlotMap::slots); + public static final StreamCodec STREAM = StreamCodec.ofMember((val, buf) ->{ var entries = val.slots.entrySet(); buf.writeInt(entries.size()); @@ -19,8 +21,6 @@ public record SpellSlotMap(Map slots) { buf.writeInt(entry.getKey()); Spell.STREAM.encode(buf, entry.getValue()); } - - }, (buf) -> { int size = buf.readInt(); Map slots = Util.make(new HashMap<>(), map -> { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java index ba7fe6a048..ca943c032e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.client.events; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.registry.DynamicTooltipRegistry; import com.hollingsworth.arsnouveau.client.gui.PatchouliTooltipEvent; import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; @@ -69,6 +70,7 @@ public static void overlayEvent(RenderGuiLayerEvent.Pre event) { @SubscribeEvent public static void onTooltip(final ItemTooltipEvent event) { ItemStack stack = event.getItemStack(); + DynamicTooltipRegistry.appendTooltips(stack, event.getContext(), event.getToolTip()::add, event.getFlags()); //todo: reenable reactive // int level = stack.getEnchantmentLevel(event.getEntity().level.holderOrThrow(EnchantmentRegistry.REACTIVE_ENCHANTMENT)); // var reactiveCaster = stack.get(DataComponentRegistry.REACTIVE_CASTER); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java index 2415b0b0c0..9f4c0d0ac9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java @@ -159,8 +159,10 @@ public void dropItems(){ @Override protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); - Tag armorTag = armorStack.save(pRegistries); - tag.put("armorStack", armorTag); + if(!armorStack.isEmpty()) { + Tag armorTag = armorStack.save(pRegistries); + tag.put("armorStack", armorTag); + } tag.putInt("numPerks", perkList.size()); int count = 0; for(ItemStack i : perkList){ @@ -174,7 +176,9 @@ protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries @Override protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.loadAdditional(compound, pRegistries); - this.armorStack = ItemStack.parseOptional(pRegistries, compound.getCompound("armorStack")); + if(compound.contains("armorStack")) { + this.armorStack = ItemStack.parseOptional(pRegistries, compound.getCompound("armorStack")); + } int count = compound.getInt("numPerks"); perkList = new ArrayList<>(); for(int i = 0; i < count; i++){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java index ac449e4113..4e9784c6d1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java @@ -169,7 +169,7 @@ protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries @Override protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); - if (stack != null) { + if (!stack.isEmpty()) { Tag reagentTag = stack.save(pRegistries); tag.put("itemStack", reagentTag); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java index 27463dda97..6580bdde67 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java @@ -265,7 +265,9 @@ public void onWanded(Player playerEntity) { @Override protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.loadAdditional(compound, pRegistries); - stack = ItemStack.parseOptional(pRegistries, (CompoundTag) compound.get("itemStack")); + if(compound.contains("itemStack")) { + stack = ItemStack.parseOptional(pRegistries, compound.getCompound("itemStack")); + } if (compound.contains("recipe")) { recipeID = ResourceLocation.tryParse(compound.getString("recipe")); } @@ -280,7 +282,7 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis @Override public void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.saveAdditional(compound, pRegistries); - if (stack != null) { + if (!stack.isEmpty()) { Tag reagentTag = stack.save(pRegistries); compound.put("itemStack", reagentTag); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java index 6a04bb2761..d54e2d2bb0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java @@ -99,7 +99,7 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis @Override public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); - if (stack != null) { + if (!stack.isEmpty()) { Tag stackTag = stack.save(pRegistries); tag.put("itemStack", stackTag); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java index 074b1ed511..cc469d3d5d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java @@ -370,7 +370,7 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis public void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.saveAdditional(compound, pRegistries); - if (setStack != null) { + if (setStack != null && !setStack.isEmpty()) { Tag itemTag = setStack.save(pRegistries); compound.put("crafting", itemTag); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java index e4de17700c..e835b96504 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java @@ -14,13 +14,16 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; +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.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Optional; public class AnnotatedCodex extends ModItem { @@ -29,7 +32,7 @@ public AnnotatedCodex(Properties properties) { } public AnnotatedCodex() { - this(ItemsRegistry.defaultItemProperties().stacksTo(1)); + this(ItemsRegistry.defaultItemProperties().stacksTo(1).component(DataComponentRegistry.CODEX_DATA, new CodexData(Optional.empty(), null, List.of()))); } public int getUnlockLevelCost(Collection spellParts) { @@ -42,7 +45,7 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte if (pPlayer.level.isClientSide) return super.use(pLevel, pPlayer, pUsedHand); ItemStack stack = pPlayer.getItemInHand(pUsedHand); - CodexData data = stack.getOrDefault(DataComponentRegistry.CODEX_DATA, new CodexData((String) null, null, List.of())); + CodexData data = stack.get(DataComponentRegistry.CODEX_DATA); IPlayerCap playerCap = CapabilityRegistry.getPlayerDataCap(pPlayer).orElse(null); if (playerCap == null) @@ -50,7 +53,7 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte Collection known = playerCap.getKnownGlyphs(); Collection storedGlyphs = data.glyphIds().stream().map(GlyphRegistry::getSpellPart).toList(); - if (data.uuid() == null) { // Player writing to codex + if (!data.wasRecorded()) { // Player writing to codex int levelCost = getUnlockLevelCost(playerCap.getKnownGlyphs()); int expCost = ScribesTile.getExperienceForLevel(levelCost); if (expCost > ScribesTile.getTotalPlayerExperience(pPlayer)) { @@ -77,7 +80,7 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte pPlayer.giveExperiencePoints(-expCost); var newData = new CodexData(pPlayer.getUUID(), pPlayer.getName().getString(), playerCap.getKnownGlyphs().stream().map(AbstractSpellPart::getRegistryName).toList()); stack.set(DataComponentRegistry.CODEX_DATA, newData); - + PortUtil.sendMessageNoSpam(pPlayer, Component.translatable("ars_nouveau.updated_codex")); } } else { @@ -104,15 +107,8 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte } @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(ItemStack stack, @Nullable Item.TooltipContext context, List tooltip2, TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); - CodexData data = stack.getOrDefault(DataComponentRegistry.CODEX_DATA, new CodexData((String) null, null, List.of())); - if (data.glyphIds().isEmpty()) { - tooltip2.add(Component.translatable("ars_nouveau.codex_tooltip")); - } else { - tooltip2.add(Component.translatable("ars_nouveau.contains_glyphs", data.glyphIds().size())); - } - if (data.playerName() != null) - tooltip2.add(Component.translatable("ars_nouveau.recorded_by", data.playerName())); + stack.addToTooltip(DataComponentRegistry.CODEX_DATA, context, tooltip2::add, flagIn); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java index 1651625440..adb39c1891 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java @@ -2,10 +2,10 @@ import com.hollingsworth.arsnouveau.api.item.ICasterTool; import com.hollingsworth.arsnouveau.api.mana.IManaDiscountEquipment; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; +import com.hollingsworth.arsnouveau.common.items.data.TomeCasterData; import com.hollingsworth.arsnouveau.setup.config.Config; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; @@ -34,7 +34,7 @@ public CasterTome(Properties properties) { } public CasterTome() { - super(ItemsRegistry.defaultItemProperties().component(DataComponentRegistry.SPELL_CASTER, new SpellCaster())); + super(ItemsRegistry.defaultItemProperties().component(DataComponentRegistry.TOME_CASTER, new TomeCasterData())); } @Override @@ -45,7 +45,7 @@ public boolean onScribe(Level world, BlockPos pos, Player player, InteractionHan @Override public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); - ISpellCaster caster = getSpellCaster(stack); + SpellCaster caster = getSpellCaster(stack); Spell spell = caster.getSpell(); return caster.castSpell(worldIn, playerIn, handIn, Component.empty(), spell); } @@ -54,7 +54,7 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { if (context == null) return; - ISpellCaster caster = getSpellCaster(stack); + SpellCaster caster = getSpellCaster(stack); if (Config.GLYPH_TOOLTIPS.get() || Screen.hasShiftDown()) { if (caster.isSpellHidden()) { @@ -62,7 +62,9 @@ public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, L } if (!caster.getFlavorText().isEmpty()) tooltip2.add(Component.literal(caster.getFlavorText()).withStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.BLUE))); - } else getInformation(stack, context, tooltip2, flagIn); + } else{ + getInformation(stack, context, tooltip2, flagIn); + } tooltip2.add(Component.translatable("tooltip.ars_nouveau.caster_tome")); @@ -76,7 +78,7 @@ public int getManaDiscount(ItemStack i, Spell spell) { @Override public Optional getTooltipImage(ItemStack pStack) { - ISpellCaster caster = getSpellCaster(pStack); + SpellCaster caster = getSpellCaster(pStack); if (!Screen.hasShiftDown() && Config.GLYPH_TOOLTIPS.get() && !caster.isSpellHidden() && !caster.getSpell().isEmpty()) return Optional.of(new SpellTooltip(caster)); return Optional.empty(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java index f76c7aa487..4265e15268 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java @@ -46,6 +46,7 @@ public ModItem withRarity(Rarity rarity) { @OnlyIn(Dist.CLIENT) @Override public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); if (tooltip != null && !tooltip.isEmpty()) { tooltip2.addAll(tooltip); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java index af3e6d647b..7cecb1190d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java @@ -1,7 +1,6 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.item.ICasterTool; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; import com.hollingsworth.arsnouveau.setup.config.Config; @@ -29,23 +28,19 @@ public SpellParchment() { @Override public Component getName(ItemStack pStack) { - ISpellCaster caster = getSpellCaster(pStack); + SpellCaster caster = getSpellCaster(pStack); return caster.getSpellName().isEmpty() ? super.getName(pStack) : Component.literal(caster.getSpellName()); } @Override public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { - ISpellCaster caster = getSpellCaster(stack); - - if (!Config.GLYPH_TOOLTIPS.get() || Screen.hasShiftDown() || caster.isSpellHidden() || caster.getSpell().isEmpty()) - getInformation(stack, context, tooltip2, flagIn); - + stack.addToTooltip(DataComponentRegistry.SPELL_CASTER, context, tooltip2::add, flagIn); super.appendHoverText(stack, context, tooltip2, flagIn); } @Override public Optional getTooltipImage(ItemStack pStack) { - ISpellCaster caster = getSpellCaster(pStack); + SpellCaster caster = getSpellCaster(pStack); if (Config.GLYPH_TOOLTIPS.get() && !Screen.hasShiftDown() && !caster.isSpellHidden() && !caster.getSpell().isEmpty()) return Optional.of(new SpellTooltip(caster)); return Optional.empty(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/CodexData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/CodexData.java index 432ebe88fa..e7da6d9d86 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/CodexData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/CodexData.java @@ -3,26 +3,52 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.NonNullList; +import net.minecraft.core.UUIDUtil; import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.TooltipProvider; import java.util.List; +import java.util.Optional; import java.util.UUID; +import java.util.function.Consumer; -public record CodexData(UUID uuid, String playerName, List glyphIds) { +public record CodexData(Optional uuid, String playerName, List glyphIds) implements TooltipProvider { public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - Codec.STRING.optionalFieldOf("uuid", "").forGetter(i -> i.uuid.toString()), - Codec.STRING.fieldOf("playerName").forGetter(CodexData::playerName), + UUIDUtil.CODEC.optionalFieldOf("uuid").forGetter(CodexData::uuid), + Codec.STRING.optionalFieldOf("playerName", "").forGetter(CodexData::playerName), Codec.list(ResourceLocation.CODEC).fieldOf("glyphIds").forGetter(CodexData::glyphIds) ).apply(instance, CodexData::new)); - public static StreamCodec STREAM = StreamCodec.composite(ByteBufCodecs.STRING_UTF8, i-> i.uuid().toString(), ByteBufCodecs.STRING_UTF8, CodexData::playerName, ResourceLocation.STREAM_CODEC.apply( - ByteBufCodecs.collection(NonNullList::createWithCapacity) + public static StreamCodec STREAM = StreamCodec.composite( + UUIDUtil.STREAM_CODEC.apply(ByteBufCodecs::optional), + CodexData::uuid, + ByteBufCodecs.STRING_UTF8, + CodexData::playerName, + ResourceLocation.STREAM_CODEC.apply(ByteBufCodecs.collection(NonNullList::createWithCapacity) ), CodexData::glyphIds, CodexData::new); - public CodexData(String uuid, String playerName, List glyphIds) { - this(UUID.fromString(uuid), playerName, glyphIds); + public CodexData(UUID uuid, String playerName, List glyphIds) { + this(Optional.of(uuid), playerName, glyphIds); + } + + public boolean wasRecorded(){ + return uuid.isPresent() && playerName != null && !playerName.isEmpty() && !uuid.get().equals(UUID.fromString("")); + } + + @Override + public void addToTooltip(Item.TooltipContext pContext, Consumer pTooltipAdder, TooltipFlag pTooltipFlag) { + if (this.glyphIds().isEmpty()) { + pTooltipAdder.accept(Component.translatable("ars_nouveau.codex_tooltip")); + } else { + pTooltipAdder.accept(Component.translatable("ars_nouveau.contains_glyphs", glyphIds().size())); + } + if (this.wasRecorded()) + pTooltipAdder.accept(Component.translatable("ars_nouveau.recorded_by", playerName())); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java index ec8749e5b2..8a72456fb7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java @@ -37,6 +37,10 @@ public class ScryCasterData extends SpellCaster { public static final StreamCodec STREAM_CODEC = createStream(ScryCasterData::new); + public ScryCasterData() { + super(); + } + public ScryCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots) { super(slot, flavorText, isHidden, hiddenText, maxSlots); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java index 07b70bcc40..1a9517cd35 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java @@ -27,6 +27,10 @@ public class TomeCasterData extends SpellCaster { public static final StreamCodec STREAM_CODEC = createStream(TomeCasterData::new); + public TomeCasterData() { + super(); + } + public TomeCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots) { super(slot, flavorText, isHidden, hiddenText, maxSlots); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java index d1aca4c160..5ed106bd07 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java @@ -8,7 +8,9 @@ import net.minecraft.nbt.Tag; import net.minecraft.world.phys.Vec2; -import java.util.UUID; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; public class ANCodecs { @@ -17,8 +19,6 @@ public class ANCodecs { Codec.FLOAT.fieldOf("y").forGetter(v -> v.y) ).apply(instance, Vec2::new)); - public static Codec UUID_CODEC = Codec.STRING.xmap(UUID::fromString, UUID::toString); - public static Tag encode(Codec codec, T value){ return codec.encodeStart(NbtOps.INSTANCE, value).getOrThrow(); } @@ -30,4 +30,20 @@ public static T decode(Codec codec, Tag tag){ public static JsonElement toJson(Codec codec, T value){ return codec.encodeStart(JsonOps.INSTANCE, value).getOrThrow(); } + + /** + * Creates an unbounded map codec that uses integer keys. + */ + public static Codec intMap(Codec codec, Function, Obj> constructor, Function> intMap){ + return Codec.unboundedMap(Codec.STRING, codec).xmap((stringMap) ->{ + Map map = new HashMap<>(stringMap.size()); + stringMap.forEach((key, value) -> map.put(Integer.parseInt(key), value)); + return constructor.apply(map); + }, obj -> { + var ints = intMap.apply(obj); + Map stringMap = new HashMap<>(ints.size()); + ints.forEach((key, value) -> stringMap.put(key.toString(), value)); + return stringMap; + }); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java index 47a1817f99..ed5b69ce17 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java @@ -293,6 +293,8 @@ public void use(BlockState state, Level world, BlockPos pos, Player player, Inte } } }); + + DynamicTooltipRegistry.register(DataComponentRegistry.REACTIVE_CASTER.get()); } public static void registerFamiliar(AbstractFamiliarHolder familiar) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java index cfca2f1ff8..3bd14856a7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java @@ -13,6 +13,7 @@ import com.hollingsworth.arsnouveau.common.armor.AnimatedMagicArmor; import com.hollingsworth.arsnouveau.common.items.*; import com.hollingsworth.arsnouveau.common.items.curios.*; +import com.hollingsworth.arsnouveau.common.items.data.ScryCasterData; import com.hollingsworth.arsnouveau.common.items.itemscrolls.AllowItemScroll; import com.hollingsworth.arsnouveau.common.items.itemscrolls.DenyItemScroll; import com.hollingsworth.arsnouveau.common.items.itemscrolls.MimicItemScroll; @@ -218,7 +219,7 @@ public int getValue() { public static final ItemRegistryWrapper STARBY_GIFY = register(LibItemNames.STARBY_GIFT, () -> new Present(defaultItemProperties().rarity(Rarity.EPIC))); public static final ItemRegistryWrapper SPELL_CROSSBOW = register(LibItemNames.SPELL_CROSSBOW, () -> new SpellCrossbow(defaultItemProperties().stacksTo(1).component(DataComponentRegistry.SPELL_CASTER, new SpellCaster()))); public static final ItemRegistryWrapper STABLE_WARP_SCROLL = register(LibItemNames.STABLE_WARP_SCROLL, () -> new StableWarpScroll(defaultItemProperties().stacksTo(1))); - public static final ItemRegistryWrapper SCRY_CASTER = register(LibItemNames.SCRY_CASTER, () -> new ScryCaster(defaultItemProperties().stacksTo(1).component(DataComponentRegistry.SPELL_CASTER, new SpellCaster()))); + public static final ItemRegistryWrapper SCRY_CASTER = register(LibItemNames.SCRY_CASTER, () -> new ScryCaster(defaultItemProperties().stacksTo(1).component(DataComponentRegistry.SCRY_CASTER, new ScryCasterData()))); public static final ItemRegistryWrapper JUMP_RING = register(LibItemNames.JUMP_RING, JumpingRing::new); public static ItemRegistryWrapper register(String name, Supplier item) { From 7695703cb98ed17d501822df325fce277bdab4b0 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 7 Jul 2024 11:55:16 -0500 Subject: [PATCH 035/363] fix custom recipes pointing to recipes instead of recipe --- .../366e6cedc97b567a76524805ff813b15bef0b4f4 | 4 +- .../43f70b1d0fc3650d25dddf44c6efffef1900bb18 | 54 +-- .../457d401e850e914fe39c053c4aa175787ef49774 | 26 +- .../57a62c95f59bc5868cffb1d040840f0d715117bd | 4 +- .../abe0934abf823d33d3e88ae408c1d215f03f6bdc | 4 +- .../af617d50f86666f21b24a8919c1c50aad8faa4f8 | 28 +- .../e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 | 352 +++++++++--------- .../f0f2bcace349d412215f006e6183aa56b9316c3c | 164 ++++---- .../abjuration_essence.json | 0 .../{recipes => recipe}/air_essence.json | 0 .../{recipes => recipe}/alchemists_crown.json | 0 .../{recipes => recipe}/amethyst.json | 0 .../{recipes => recipe}/amethyst_block.json | 0 .../{recipes => recipe}/amplify_arrow.json | 0 .../amulet_of_mana_boost.json | 0 .../amulet_of_mana_regen.json | 0 .../{recipes => recipe}/aqua_affinity_1.json | 0 .../{recipes => recipe}/arcanist_boots.json | 0 .../{recipes => recipe}/arcanist_hood.json | 0 .../arcanist_leggings.json | 0 .../{recipes => recipe}/arcanist_robes.json | 0 .../bane_of_arthropods_1.json | 0 .../bane_of_arthropods_2.json | 0 .../bane_of_arthropods_3.json | 0 .../bane_of_arthropods_4.json | 0 .../bane_of_arthropods_5.json | 0 .../{recipes => recipe}/battlemage_boots.json | 0 .../{recipes => recipe}/battlemage_hood.json | 0 .../battlemage_leggings.json | 0 .../{recipes => recipe}/battlemage_robes.json | 0 .../belt_of_levitation.json | 0 .../belt_of_unstable_gifts.json | 0 .../blast_protection_1.json | 0 .../blast_protection_2.json | 0 .../blast_protection_3.json | 0 .../blast_protection_4.json | 0 .../{recipes => recipe}/blue_dye.json | 0 .../{recipes => recipe}/brazier_relay.json | 0 .../{recipes => recipe}/brown_dye.json | 0 .../budding_conversion/budding_amethyst.json | 0 .../{recipes => recipe}/burst.json | 0 .../{recipes => recipe}/cobblestone.json | 0 .../conjuration_essence.json | 0 .../{recipes => recipe}/depth_strider_1.json | 0 .../{recipes => recipe}/depth_strider_2.json | 0 .../{recipes => recipe}/depth_strider_3.json | 0 .../dispel_entity/blaze_powder.json | 0 .../{recipes => recipe}/dominion_wand.json | 0 .../{recipes => recipe}/drygmy_charm.json | 0 .../{recipes => recipe}/earth_essence.json | 0 .../{recipes => recipe}/efficiency_1.json | 0 .../{recipes => recipe}/efficiency_2.json | 0 .../{recipes => recipe}/efficiency_3.json | 0 .../{recipes => recipe}/efficiency_4.json | 0 .../{recipes => recipe}/efficiency_5.json | 0 .../{recipes => recipe}/enchanters_eye.json | 0 .../enchanters_mirror.json | 0 .../enchanters_shield.json | 0 .../{recipes => recipe}/enchanters_sword.json | 0 .../feather_falling_1.json | 0 .../feather_falling_2.json | 0 .../feather_falling_3.json | 0 .../feather_falling_4.json | 0 .../{recipes => recipe}/fire_aspect_1.json | 0 .../{recipes => recipe}/fire_aspect_2.json | 0 .../{recipes => recipe}/fire_essence.json | 0 .../fire_protection_1.json | 0 .../fire_protection_2.json | 0 .../fire_protection_3.json | 0 .../fire_protection_4.json | 0 .../fire_protection_5.json | 0 .../first_armor_upgrade.json | 0 .../{recipes => recipe}/flame_1.json | 0 .../{recipes => recipe}/fortune_1.json | 0 .../{recipes => recipe}/fortune_2.json | 0 .../{recipes => recipe}/fortune_3.json | 0 .../glowstone_block_to_dust.json | 0 .../{recipes => recipe}/glyph_accelerate.json | 0 .../{recipes => recipe}/glyph_amplify.json | 0 .../glyph_animate_block.json | 0 .../{recipes => recipe}/glyph_aoe.json | 0 .../{recipes => recipe}/glyph_blink.json | 0 .../{recipes => recipe}/glyph_bounce.json | 0 .../{recipes => recipe}/glyph_break.json | 0 .../{recipes => recipe}/glyph_cold_snap.json | 0 .../glyph_conjure_water.json | 0 .../{recipes => recipe}/glyph_craft.json | 0 .../{recipes => recipe}/glyph_crush.json | 0 .../{recipes => recipe}/glyph_cut.json | 0 .../{recipes => recipe}/glyph_dampen.json | 0 .../{recipes => recipe}/glyph_decelerate.json | 0 .../{recipes => recipe}/glyph_delay.json | 0 .../{recipes => recipe}/glyph_dispel.json | 0 .../glyph_duration_down.json | 0 .../glyph_ender_inventory.json | 0 .../{recipes => recipe}/glyph_evaporate.json | 0 .../{recipes => recipe}/glyph_exchange.json | 0 .../{recipes => recipe}/glyph_explosion.json | 0 .../glyph_extend_time.json | 0 .../{recipes => recipe}/glyph_extract.json | 0 .../{recipes => recipe}/glyph_fangs.json | 0 .../{recipes => recipe}/glyph_fell.json | 0 .../{recipes => recipe}/glyph_firework.json | 0 .../{recipes => recipe}/glyph_flare.json | 0 .../{recipes => recipe}/glyph_fortune.json | 0 .../{recipes => recipe}/glyph_freeze.json | 0 .../{recipes => recipe}/glyph_glide.json | 0 .../{recipes => recipe}/glyph_gravity.json | 0 .../{recipes => recipe}/glyph_grow.json | 0 .../{recipes => recipe}/glyph_gust.json | 0 .../{recipes => recipe}/glyph_harm.json | 0 .../{recipes => recipe}/glyph_harvest.json | 0 .../{recipes => recipe}/glyph_heal.json | 0 .../{recipes => recipe}/glyph_hex.json | 0 .../{recipes => recipe}/glyph_ignite.json | 0 .../{recipes => recipe}/glyph_infuse.json | 0 .../{recipes => recipe}/glyph_intangible.json | 0 .../{recipes => recipe}/glyph_interact.json | 0 .../glyph_invisibility.json | 0 .../{recipes => recipe}/glyph_launch.json | 0 .../{recipes => recipe}/glyph_leap.json | 0 .../{recipes => recipe}/glyph_light.json | 0 .../{recipes => recipe}/glyph_lightning.json | 0 .../{recipes => recipe}/glyph_linger.json | 0 .../{recipes => recipe}/glyph_name.json | 0 .../{recipes => recipe}/glyph_orbit.json | 0 .../glyph_phantom_block.json | 0 .../{recipes => recipe}/glyph_pickup.json | 0 .../{recipes => recipe}/glyph_pierce.json | 0 .../glyph_place_block.json | 0 .../{recipes => recipe}/glyph_projectile.json | 0 .../{recipes => recipe}/glyph_pull.json | 0 .../{recipes => recipe}/glyph_randomize.json | 0 .../glyph_redstone_signal.json | 0 .../{recipes => recipe}/glyph_rotate.json | 0 .../{recipes => recipe}/glyph_rune.json | 0 .../{recipes => recipe}/glyph_self.json | 0 .../glyph_sense_magic.json | 0 .../{recipes => recipe}/glyph_sensitive.json | 0 .../{recipes => recipe}/glyph_slowfall.json | 0 .../{recipes => recipe}/glyph_smelt.json | 0 .../{recipes => recipe}/glyph_snare.json | 0 .../{recipes => recipe}/glyph_split.json | 0 .../glyph_summon_decoy.json | 0 .../glyph_summon_steed.json | 0 .../glyph_summon_undead.json | 0 .../{recipes => recipe}/glyph_summon_vex.json | 0 .../glyph_summon_wolves.json | 0 .../{recipes => recipe}/glyph_toss.json | 0 .../{recipes => recipe}/glyph_touch.json | 0 .../{recipes => recipe}/glyph_underfoot.json | 0 .../{recipes => recipe}/glyph_wall.json | 0 .../{recipes => recipe}/glyph_wind_shear.json | 0 .../{recipes => recipe}/glyph_wither.json | 0 .../{recipes => recipe}/gravel.json | 0 .../{recipes => recipe}/infinity_1.json | 0 .../{recipes => recipe}/jar_of_light.json | 0 .../{recipes => recipe}/jump_ring.json | 0 .../{recipes => recipe}/knockback_1.json | 0 .../{recipes => recipe}/knockback_2.json | 0 .../{recipes => recipe}/lapis.json | 0 .../{recipes => recipe}/light_blue_dye.json | 0 .../light_gray_dye_azure.json | 0 .../light_gray_dye_oxeye.json | 0 .../light_gray_dye_tulip.json | 0 .../lingering_flask_cannon.json | 0 .../{recipes => recipe}/looting_1.json | 0 .../{recipes => recipe}/looting_2.json | 0 .../{recipes => recipe}/looting_3.json | 0 .../{recipes => recipe}/magebloom_crop.json | 0 .../{recipes => recipe}/magenta_dye.json | 0 .../magenta_dye_lilac.json | 0 .../{recipes => recipe}/mana_boost_1.json | 0 .../{recipes => recipe}/mana_boost_2.json | 0 .../{recipes => recipe}/mana_boost_3.json | 0 .../{recipes => recipe}/mana_regen_1.json | 0 .../{recipes => recipe}/mana_regen_2.json | 0 .../{recipes => recipe}/mana_regen_3.json | 0 .../manipulation_essence.json | 0 .../{recipes => recipe}/multishot_1.json | 0 .../{recipes => recipe}/orange_dye.json | 0 .../{recipes => recipe}/pierce_arrow.json | 0 .../{recipes => recipe}/piercing_1.json | 0 .../{recipes => recipe}/piercing_2.json | 0 .../{recipes => recipe}/piercing_3.json | 0 .../{recipes => recipe}/piercing_4.json | 0 .../{recipes => recipe}/pink_dye.json | 0 .../{recipes => recipe}/pink_dye_peony.json | 0 .../{recipes => recipe}/potion_diffuser.json | 0 .../{recipes => recipe}/potion_flask.json | 0 .../potion_flask_amplify.json | 0 .../potion_flask_extend_time.json | 0 .../{recipes => recipe}/potion_melder.json | 0 .../{recipes => recipe}/power_1.json | 0 .../{recipes => recipe}/power_2.json | 0 .../{recipes => recipe}/power_3.json | 0 .../{recipes => recipe}/power_4.json | 0 .../{recipes => recipe}/power_5.json | 0 .../projectile_protection_1.json | 0 .../projectile_protection_2.json | 0 .../projectile_protection_3.json | 0 .../projectile_protection_4.json | 0 .../projectile_protection_5.json | 0 .../{recipes => recipe}/protection_1.json | 0 .../{recipes => recipe}/protection_2.json | 0 .../{recipes => recipe}/protection_3.json | 0 .../{recipes => recipe}/protection_4.json | 0 .../{recipes => recipe}/protection_5.json | 0 .../{recipes => recipe}/punch_1.json | 0 .../{recipes => recipe}/punch_2.json | 0 .../quartz_block_to_quartz.json | 0 .../{recipes => recipe}/quick_charge_1.json | 0 .../{recipes => recipe}/quick_charge_2.json | 0 .../{recipes => recipe}/quick_charge_3.json | 0 .../{recipes => recipe}/reactive.json | 0 .../{recipes => recipe}/reactive_2.json | 0 .../{recipes => recipe}/reactive_3.json | 0 .../{recipes => recipe}/reactive_4.json | 0 .../{recipes => recipe}/red_dye_beetroot.json | 0 .../{recipes => recipe}/red_dye_poppy.json | 0 .../red_dye_rose_bush.json | 0 .../{recipes => recipe}/red_dye_tulip.json | 0 .../{recipes => recipe}/relay_collector.json | 0 .../{recipes => recipe}/relay_deposit.json | 0 .../{recipes => recipe}/relay_splitter.json | 0 .../{recipes => recipe}/relay_warp.json | 0 .../{recipes => recipe}/reset.json | 0 .../{recipes => recipe}/respiration_1.json | 0 .../{recipes => recipe}/respiration_2.json | 0 .../{recipes => recipe}/respiration_3.json | 0 .../{recipes => recipe}/rewind.json | 0 .../ring_of_greater_discount.json | 0 .../ring_of_lesser_discount.json | 0 .../sandstone_to_sand.json | 0 .../scry_ritual/amethyst_blocks.json | 0 .../scry_ritual/amethyst_gems.json | 0 .../scry_ritual/coal_ores.json | 0 .../scry_ritual/copper_ores.json | 0 .../scry_ritual/diamond_ores.json | 0 .../scry_ritual/emerald_ores.json | 0 .../scry_ritual/gold_ores.json | 0 .../scry_ritual/iron_ores.json | 0 .../scry_ritual/lapis_ores.json | 0 .../scry_ritual/netherite_scrap_ores.json | 0 .../scry_ritual/quartz_ores.json | 0 .../scry_ritual/redstone_ores.json | 0 .../{recipes => recipe}/scryers_oculus.json | 0 .../second_armor_upgrade.json | 0 .../{recipes => recipe}/shapers_focus.json | 0 .../{recipes => recipe}/sharpness_1.json | 0 .../{recipes => recipe}/sharpness_2.json | 0 .../{recipes => recipe}/sharpness_3.json | 0 .../{recipes => recipe}/sharpness_4.json | 0 .../{recipes => recipe}/sharpness_5.json | 0 .../{recipes => recipe}/silk_touch_1.json | 0 .../{recipes => recipe}/smite_1.json | 0 .../{recipes => recipe}/smite_2.json | 0 .../{recipes => recipe}/smite_3.json | 0 .../{recipes => recipe}/smite_4.json | 0 .../{recipes => recipe}/smite_5.json | 0 .../{recipes => recipe}/sorcerer_boots.json | 0 .../{recipes => recipe}/sorcerer_hood.json | 0 .../sorcerer_leggings.json | 0 .../{recipes => recipe}/sorcerer_robes.json | 0 .../{recipes => recipe}/spell_bow.json | 0 .../{recipes => recipe}/spell_crossbow.json | 0 .../{recipes => recipe}/spell_sensor.json | 0 .../{recipes => recipe}/spell_turret.json | 0 .../{recipes => recipe}/spell_write.json | 0 .../splash_flask_cannon.json | 0 .../{recipes => recipe}/split_arrow.json | 0 .../stable_warp_scroll.json | 0 .../{recipes => recipe}/starbuncle_charm.json | 0 .../{recipes => recipe}/stone.json | 0 .../{recipes => recipe}/storage_lectern.json | 0 .../{recipes => recipe}/sugar_cane.json | 0 .../{recipes => recipe}/summon_focus.json | 0 .../summon_ritual/bats.json | 0 .../{recipes => recipe}/sweeping_edge_1.json | 0 .../{recipes => recipe}/sweeping_edge_2.json | 0 .../{recipes => recipe}/sweeping_edge_3.json | 0 .../{recipes => recipe}/terracotta.json | 0 .../{recipes => recipe}/thorns_1.json | 0 .../{recipes => recipe}/thorns_2.json | 0 .../{recipes => recipe}/thorns_3.json | 0 .../thread_amethyst_golem.json | 0 .../{recipes => recipe}/thread_chilling.json | 0 .../{recipes => recipe}/thread_depths.json | 0 .../{recipes => recipe}/thread_drygmy.json | 0 .../{recipes => recipe}/thread_feather.json | 0 .../{recipes => recipe}/thread_gliding.json | 0 .../{recipes => recipe}/thread_heights.json | 0 .../{recipes => recipe}/thread_high_step.json | 0 .../thread_immolation.json | 0 .../{recipes => recipe}/thread_kindling.json | 0 .../thread_life_drain.json | 0 .../thread_magic_capacity.json | 0 .../{recipes => recipe}/thread_repairing.json | 0 .../thread_spellpower.json | 0 .../thread_starbuncle.json | 0 .../{recipes => recipe}/thread_undying.json | 0 .../{recipes => recipe}/thread_warding.json | 0 .../thread_whirlisprig.json | 0 .../{recipes => recipe}/thread_wixie.json | 0 .../timer_spell_turret.json | 0 .../{recipes => recipe}/unbreaking_1.json | 0 .../{recipes => recipe}/unbreaking_2.json | 0 .../{recipes => recipe}/unbreaking_3.json | 0 .../{recipes => recipe}/void_jar.json | 0 .../ars_nouveau/{recipes => recipe}/wand.json | 0 .../{recipes => recipe}/warp_scroll_copy.json | 0 .../{recipes => recipe}/water_essence.json | 0 .../whirlisprig_charm.json | 0 .../{recipes => recipe}/white_dye.json | 0 .../{recipes => recipe}/wixie_charm.json | 0 .../{recipes => recipe}/wololo.json | 0 .../{recipes => recipe}/yellow_dye.json | 0 .../yellow_dye_sunflower.json | 0 .../datagen/ApparatusRecipeProvider.java | 2 +- .../datagen/BuddingConversionProvider.java | 2 +- .../common/datagen/CasterTomeProvider.java | 2 +- .../common/datagen/CrushRecipeProvider.java | 2 +- .../common/datagen/DispelEntityProvider.java | 2 +- .../common/datagen/GlyphRecipeProvider.java | 2 +- .../datagen/ImbuementRecipeProvider.java | 3 +- .../common/datagen/ScryRitualProvider.java | 2 +- .../common/datagen/SummonRitualProvider.java | 2 +- 327 files changed, 328 insertions(+), 327 deletions(-) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/abjuration_essence.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/air_essence.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/alchemists_crown.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/amethyst.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/amethyst_block.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/amplify_arrow.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/amulet_of_mana_boost.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/amulet_of_mana_regen.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/aqua_affinity_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/arcanist_boots.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/arcanist_hood.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/arcanist_leggings.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/arcanist_robes.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/bane_of_arthropods_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/bane_of_arthropods_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/bane_of_arthropods_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/bane_of_arthropods_4.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/bane_of_arthropods_5.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/battlemage_boots.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/battlemage_hood.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/battlemage_leggings.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/battlemage_robes.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/belt_of_levitation.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/belt_of_unstable_gifts.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/blast_protection_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/blast_protection_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/blast_protection_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/blast_protection_4.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/blue_dye.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/brazier_relay.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/brown_dye.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/budding_conversion/budding_amethyst.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/burst.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/cobblestone.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/conjuration_essence.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/depth_strider_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/depth_strider_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/depth_strider_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/dispel_entity/blaze_powder.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/dominion_wand.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/drygmy_charm.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/earth_essence.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/efficiency_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/efficiency_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/efficiency_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/efficiency_4.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/efficiency_5.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/enchanters_eye.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/enchanters_mirror.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/enchanters_shield.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/enchanters_sword.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/feather_falling_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/feather_falling_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/feather_falling_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/feather_falling_4.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/fire_aspect_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/fire_aspect_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/fire_essence.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/fire_protection_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/fire_protection_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/fire_protection_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/fire_protection_4.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/fire_protection_5.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/first_armor_upgrade.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/flame_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/fortune_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/fortune_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/fortune_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glowstone_block_to_dust.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_accelerate.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_amplify.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_animate_block.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_aoe.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_blink.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_bounce.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_break.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_cold_snap.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_conjure_water.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_craft.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_crush.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_cut.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_dampen.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_decelerate.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_delay.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_dispel.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_duration_down.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_ender_inventory.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_evaporate.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_exchange.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_explosion.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_extend_time.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_extract.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_fangs.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_fell.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_firework.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_flare.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_fortune.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_freeze.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_glide.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_gravity.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_grow.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_gust.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_harm.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_harvest.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_heal.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_hex.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_ignite.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_infuse.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_intangible.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_interact.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_invisibility.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_launch.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_leap.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_light.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_lightning.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_linger.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_name.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_orbit.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_phantom_block.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_pickup.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_pierce.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_place_block.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_projectile.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_pull.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_randomize.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_redstone_signal.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_rotate.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_rune.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_self.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_sense_magic.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_sensitive.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_slowfall.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_smelt.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_snare.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_split.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_summon_decoy.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_summon_steed.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_summon_undead.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_summon_vex.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_summon_wolves.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_toss.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_touch.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_underfoot.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_wall.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_wind_shear.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/glyph_wither.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/gravel.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/infinity_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/jar_of_light.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/jump_ring.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/knockback_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/knockback_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/lapis.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/light_blue_dye.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/light_gray_dye_azure.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/light_gray_dye_oxeye.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/light_gray_dye_tulip.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/lingering_flask_cannon.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/looting_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/looting_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/looting_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/magebloom_crop.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/magenta_dye.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/magenta_dye_lilac.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/mana_boost_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/mana_boost_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/mana_boost_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/mana_regen_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/mana_regen_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/mana_regen_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/manipulation_essence.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/multishot_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/orange_dye.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/pierce_arrow.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/piercing_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/piercing_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/piercing_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/piercing_4.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/pink_dye.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/pink_dye_peony.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/potion_diffuser.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/potion_flask.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/potion_flask_amplify.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/potion_flask_extend_time.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/potion_melder.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/power_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/power_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/power_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/power_4.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/power_5.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/projectile_protection_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/projectile_protection_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/projectile_protection_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/projectile_protection_4.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/projectile_protection_5.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/protection_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/protection_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/protection_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/protection_4.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/protection_5.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/punch_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/punch_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/quartz_block_to_quartz.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/quick_charge_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/quick_charge_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/quick_charge_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/reactive.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/reactive_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/reactive_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/reactive_4.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/red_dye_beetroot.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/red_dye_poppy.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/red_dye_rose_bush.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/red_dye_tulip.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/relay_collector.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/relay_deposit.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/relay_splitter.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/relay_warp.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/reset.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/respiration_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/respiration_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/respiration_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/rewind.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ring_of_greater_discount.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/ring_of_lesser_discount.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sandstone_to_sand.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/scry_ritual/amethyst_blocks.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/scry_ritual/amethyst_gems.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/scry_ritual/coal_ores.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/scry_ritual/copper_ores.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/scry_ritual/diamond_ores.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/scry_ritual/emerald_ores.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/scry_ritual/gold_ores.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/scry_ritual/iron_ores.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/scry_ritual/lapis_ores.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/scry_ritual/netherite_scrap_ores.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/scry_ritual/quartz_ores.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/scry_ritual/redstone_ores.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/scryers_oculus.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/second_armor_upgrade.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/shapers_focus.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sharpness_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sharpness_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sharpness_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sharpness_4.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sharpness_5.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/silk_touch_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smite_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smite_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smite_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smite_4.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/smite_5.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sorcerer_boots.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sorcerer_hood.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sorcerer_leggings.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sorcerer_robes.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/spell_bow.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/spell_crossbow.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/spell_sensor.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/spell_turret.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/spell_write.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/splash_flask_cannon.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/split_arrow.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/stable_warp_scroll.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/starbuncle_charm.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/stone.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/storage_lectern.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sugar_cane.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/summon_focus.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/summon_ritual/bats.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sweeping_edge_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sweeping_edge_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/sweeping_edge_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/terracotta.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thorns_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thorns_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thorns_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_amethyst_golem.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_chilling.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_depths.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_drygmy.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_feather.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_gliding.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_heights.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_high_step.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_immolation.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_kindling.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_life_drain.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_magic_capacity.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_repairing.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_spellpower.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_starbuncle.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_undying.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_warding.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_whirlisprig.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/thread_wixie.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/timer_spell_turret.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/unbreaking_1.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/unbreaking_2.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/unbreaking_3.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/void_jar.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/wand.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/warp_scroll_copy.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/water_essence.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/whirlisprig_charm.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/white_dye.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/wixie_charm.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/wololo.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/yellow_dye.json (100%) rename src/generated/resources/data/ars_nouveau/{recipes => recipe}/yellow_dye_sunflower.json (100%) diff --git a/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 b/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 index ae85aecbe9..65b13c5861 100644 --- a/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 +++ b/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 @@ -1,2 +1,2 @@ -// 1.21 2024-07-05T22:41:47.5651639 Dispel Entity Datagen -2b2866dbb0114991a01e7a8e47a99deeeb46c536 data/ars_nouveau/recipes/dispel_entity/blaze_powder.json +// 1.21 2024-07-07T11:53:40.7840663 Dispel Entity Datagen +2b2866dbb0114991a01e7a8e47a99deeeb46c536 data/ars_nouveau/recipe/dispel_entity/blaze_powder.json diff --git a/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 b/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 index 6d24b71b0a..764dc43ad2 100644 --- a/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 +++ b/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 @@ -1,27 +1,27 @@ -// 1.21 2024-07-05T22:41:47.5641633 Crush -fe168ce4aeb994be41509cf040d4934c0da0729c data/ars_nouveau/recipes/blue_dye.json -484ecb6d278aedfcc0fb112d90973631171cc78d data/ars_nouveau/recipes/brown_dye.json -6a91f645a9a8acd469ee3ae9be3b5a58f4440ea9 data/ars_nouveau/recipes/cobblestone.json -b57fd21f55173dbfbbdaccce01dc75aee89dcc1b data/ars_nouveau/recipes/glowstone_block_to_dust.json -b66add34a9522eb33302383bc0e4b24a5ab8d956 data/ars_nouveau/recipes/gravel.json -85d82d266ab47916861ba5a154bfa2c4052a49ea data/ars_nouveau/recipes/light_blue_dye.json -70aaf3d10df25f414d66ff8aab7fc959d2a34d25 data/ars_nouveau/recipes/light_gray_dye_azure.json -ed30d14e551881ecd8259b04c20e5b188607b0ab data/ars_nouveau/recipes/light_gray_dye_oxeye.json -beaef70f77bfdabe6182314dba6076e5ded40931 data/ars_nouveau/recipes/light_gray_dye_tulip.json -f263c70ce3f048f852195e687a4a56f622930583 data/ars_nouveau/recipes/magenta_dye.json -30057c3ad58e30919dbc7aeaf48f909e12f5c22e data/ars_nouveau/recipes/magenta_dye_lilac.json -c949a74b9e2eb9ed2cd8baebc46b09478dbe524f data/ars_nouveau/recipes/orange_dye.json -0966d33727af8e0759307a91e291ddc54bda129f data/ars_nouveau/recipes/pink_dye.json -3d43b26b78b728e472208d08befaa7793d436b6c data/ars_nouveau/recipes/pink_dye_peony.json -1bfea1bad5c8279b9a7e4eeec4dfd9a0860f0d56 data/ars_nouveau/recipes/quartz_block_to_quartz.json -2fb2e37a483f9a44c61e1211223d307e15d6755c data/ars_nouveau/recipes/red_dye_beetroot.json -21615074b45085577dd4baf935e1cab2457871a7 data/ars_nouveau/recipes/red_dye_poppy.json -359263c4bf5840bfffcc0868a4682667aaf031f1 data/ars_nouveau/recipes/red_dye_rose_bush.json -877cb67cb7077dadeed4fd1e5cb1ee7146f240da data/ars_nouveau/recipes/red_dye_tulip.json -a71613c06c515d519c73a2fa4c6a13846fcc2809 data/ars_nouveau/recipes/sandstone_to_sand.json -ed909eaa1111d45bcf3b93c2af927c162fd94a8a data/ars_nouveau/recipes/stone.json -3a1839fec755ba01156720a96a0b689a7e185aae data/ars_nouveau/recipes/sugar_cane.json -1c434ab9cb4e8cd46e2a89a17e9a9f6aef4bba6a data/ars_nouveau/recipes/terracotta.json -c80a31b9729d5d5406024f9c25d948b14947aaac data/ars_nouveau/recipes/white_dye.json -c9350c3ec8456a40b8190697bf22b83e32011648 data/ars_nouveau/recipes/yellow_dye.json -947543c9865c485a164cd4ccc7ad70c037a5c335 data/ars_nouveau/recipes/yellow_dye_sunflower.json +// 1.21 2024-07-07T11:53:40.7835585 Crush +fe168ce4aeb994be41509cf040d4934c0da0729c data/ars_nouveau/recipe/blue_dye.json +484ecb6d278aedfcc0fb112d90973631171cc78d data/ars_nouveau/recipe/brown_dye.json +6a91f645a9a8acd469ee3ae9be3b5a58f4440ea9 data/ars_nouveau/recipe/cobblestone.json +b57fd21f55173dbfbbdaccce01dc75aee89dcc1b data/ars_nouveau/recipe/glowstone_block_to_dust.json +b66add34a9522eb33302383bc0e4b24a5ab8d956 data/ars_nouveau/recipe/gravel.json +85d82d266ab47916861ba5a154bfa2c4052a49ea data/ars_nouveau/recipe/light_blue_dye.json +70aaf3d10df25f414d66ff8aab7fc959d2a34d25 data/ars_nouveau/recipe/light_gray_dye_azure.json +ed30d14e551881ecd8259b04c20e5b188607b0ab data/ars_nouveau/recipe/light_gray_dye_oxeye.json +beaef70f77bfdabe6182314dba6076e5ded40931 data/ars_nouveau/recipe/light_gray_dye_tulip.json +f263c70ce3f048f852195e687a4a56f622930583 data/ars_nouveau/recipe/magenta_dye.json +30057c3ad58e30919dbc7aeaf48f909e12f5c22e data/ars_nouveau/recipe/magenta_dye_lilac.json +c949a74b9e2eb9ed2cd8baebc46b09478dbe524f data/ars_nouveau/recipe/orange_dye.json +0966d33727af8e0759307a91e291ddc54bda129f data/ars_nouveau/recipe/pink_dye.json +3d43b26b78b728e472208d08befaa7793d436b6c data/ars_nouveau/recipe/pink_dye_peony.json +1bfea1bad5c8279b9a7e4eeec4dfd9a0860f0d56 data/ars_nouveau/recipe/quartz_block_to_quartz.json +2fb2e37a483f9a44c61e1211223d307e15d6755c data/ars_nouveau/recipe/red_dye_beetroot.json +21615074b45085577dd4baf935e1cab2457871a7 data/ars_nouveau/recipe/red_dye_poppy.json +359263c4bf5840bfffcc0868a4682667aaf031f1 data/ars_nouveau/recipe/red_dye_rose_bush.json +877cb67cb7077dadeed4fd1e5cb1ee7146f240da data/ars_nouveau/recipe/red_dye_tulip.json +a71613c06c515d519c73a2fa4c6a13846fcc2809 data/ars_nouveau/recipe/sandstone_to_sand.json +ed909eaa1111d45bcf3b93c2af927c162fd94a8a data/ars_nouveau/recipe/stone.json +3a1839fec755ba01156720a96a0b689a7e185aae data/ars_nouveau/recipe/sugar_cane.json +1c434ab9cb4e8cd46e2a89a17e9a9f6aef4bba6a data/ars_nouveau/recipe/terracotta.json +c80a31b9729d5d5406024f9c25d948b14947aaac data/ars_nouveau/recipe/white_dye.json +c9350c3ec8456a40b8190697bf22b83e32011648 data/ars_nouveau/recipe/yellow_dye.json +947543c9865c485a164cd4ccc7ad70c037a5c335 data/ars_nouveau/recipe/yellow_dye_sunflower.json diff --git a/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 b/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 index 327d399818..d5e39979f7 100644 --- a/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 +++ b/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 @@ -1,13 +1,13 @@ -// 1.21 2024-07-05T22:41:47.5631625 Scry Ritual Datagen -695e6271a4560287aac86ae20873ccf9f7e42929 data/ars_nouveau/recipes/scry_ritual/amethyst_blocks.json -43c47bef5ee1e37a66c36501bfbd81aa093119a0 data/ars_nouveau/recipes/scry_ritual/amethyst_gems.json -498a70fc13f765f5b231c5636569be2bd4b5fa88 data/ars_nouveau/recipes/scry_ritual/coal_ores.json -5c3ca7c082ce229ecbf6b7d7aa2d1b0ac1dfc0e0 data/ars_nouveau/recipes/scry_ritual/copper_ores.json -f4da61f7f1a6a3de589754068a6cc921738c04b1 data/ars_nouveau/recipes/scry_ritual/diamond_ores.json -8203d577c10448ce828b64f4e0d4ee516777aec2 data/ars_nouveau/recipes/scry_ritual/emerald_ores.json -cdb2c98b7fa1f74a4738191595138fd1bcf2f14e data/ars_nouveau/recipes/scry_ritual/gold_ores.json -f602a7106d08a693e2f8a9f389f802426737fd0a data/ars_nouveau/recipes/scry_ritual/iron_ores.json -d3ef057f3a0b80f59da3aedf0f66075d93df4c1c data/ars_nouveau/recipes/scry_ritual/lapis_ores.json -d531c324568ca9469d7e833d5e4550982437f0ec data/ars_nouveau/recipes/scry_ritual/netherite_scrap_ores.json -831457a367560779bd257f382a063d1614edbf95 data/ars_nouveau/recipes/scry_ritual/quartz_ores.json -32a4a18d1567a78e396430fc5ecc83ea9ff42645 data/ars_nouveau/recipes/scry_ritual/redstone_ores.json +// 1.21 2024-07-07T11:53:40.7825589 Scry Ritual Datagen +695e6271a4560287aac86ae20873ccf9f7e42929 data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json +43c47bef5ee1e37a66c36501bfbd81aa093119a0 data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json +498a70fc13f765f5b231c5636569be2bd4b5fa88 data/ars_nouveau/recipe/scry_ritual/coal_ores.json +5c3ca7c082ce229ecbf6b7d7aa2d1b0ac1dfc0e0 data/ars_nouveau/recipe/scry_ritual/copper_ores.json +f4da61f7f1a6a3de589754068a6cc921738c04b1 data/ars_nouveau/recipe/scry_ritual/diamond_ores.json +8203d577c10448ce828b64f4e0d4ee516777aec2 data/ars_nouveau/recipe/scry_ritual/emerald_ores.json +cdb2c98b7fa1f74a4738191595138fd1bcf2f14e data/ars_nouveau/recipe/scry_ritual/gold_ores.json +f602a7106d08a693e2f8a9f389f802426737fd0a data/ars_nouveau/recipe/scry_ritual/iron_ores.json +d3ef057f3a0b80f59da3aedf0f66075d93df4c1c data/ars_nouveau/recipe/scry_ritual/lapis_ores.json +d531c324568ca9469d7e833d5e4550982437f0ec data/ars_nouveau/recipe/scry_ritual/netherite_scrap_ores.json +831457a367560779bd257f382a063d1614edbf95 data/ars_nouveau/recipe/scry_ritual/quartz_ores.json +32a4a18d1567a78e396430fc5ecc83ea9ff42645 data/ars_nouveau/recipe/scry_ritual/redstone_ores.json diff --git a/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd b/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd index b5e30a8fb1..b633e63758 100644 --- a/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd +++ b/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd @@ -1,2 +1,2 @@ -// 1.21 2024-07-05T22:41:47.5546454 Summon Ritual Datagen -bbb35bb1987fe1d0410f4cc51a3b08c5baaf4058 data/ars_nouveau/recipes/summon_ritual/bats.json +// 1.21 2024-07-07T11:53:40.7815603 Summon Ritual Datagen +bbb35bb1987fe1d0410f4cc51a3b08c5baaf4058 data/ars_nouveau/recipe/summon_ritual/bats.json diff --git a/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc b/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc index 8484cd165b..f4f3c5b607 100644 --- a/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc +++ b/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc @@ -1,2 +1,2 @@ -// 1.21 2024-07-05T22:41:47.5431199 Budding Conversion Datagen -10ac984d2cfbd22599c15cbee3b5718147466f24 data/ars_nouveau/recipes/budding_conversion/budding_amethyst.json +// 1.21 2024-07-07T11:53:40.7795574 Budding Conversion Datagen +10ac984d2cfbd22599c15cbee3b5718147466f24 data/ars_nouveau/recipe/budding_conversion/budding_amethyst.json diff --git a/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 b/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 index 5c61b2376c..cf85defce0 100644 --- a/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 +++ b/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 @@ -1,14 +1,14 @@ -// 1.21 2024-07-05T22:41:47.5461209 Imbuement -974c697181074e040d9d4ebf686b5a90f5def841 data/ars_nouveau/recipes/abjuration_essence.json -ddd8adaffaa8c57e9c166ec4a16c84c4bfb9d82e data/ars_nouveau/recipes/air_essence.json -da10a2f3438ac30b12dd724204bdc7d9dd8289b9 data/ars_nouveau/recipes/amethyst.json -6523b4dc44b09c5423d7c64ff3051438966c5d66 data/ars_nouveau/recipes/amethyst_block.json -115d647a6d4cf519c16da4504e8c8db17f3d5ebc data/ars_nouveau/recipes/amplify_arrow.json -881dccacec3cb203aac682071dafa404e6657149 data/ars_nouveau/recipes/conjuration_essence.json -fe7e60a935b2906e4e10cba135a1948bc5f3a243 data/ars_nouveau/recipes/earth_essence.json -2269915429ba66392d9dbe7b51bb86b2ab820b1b data/ars_nouveau/recipes/fire_essence.json -555d6f245c68358aaf85965d96ec261d92b83a1e data/ars_nouveau/recipes/lapis.json -828ad058c94024260d1bcbf171a9e73cca114b89 data/ars_nouveau/recipes/manipulation_essence.json -1282caff28b4599947022e1981dadcafde2ff6e5 data/ars_nouveau/recipes/pierce_arrow.json -863697816f215752a637966c1f14ef65f5cc6402 data/ars_nouveau/recipes/split_arrow.json -6bd51ed6a5394ebe4b1a7b1557a45eeb34d61c4e data/ars_nouveau/recipes/water_essence.json +// 1.21 2024-07-07T11:53:40.7805602 Imbuement +974c697181074e040d9d4ebf686b5a90f5def841 data/ars_nouveau/recipe/abjuration_essence.json +ddd8adaffaa8c57e9c166ec4a16c84c4bfb9d82e data/ars_nouveau/recipe/air_essence.json +da10a2f3438ac30b12dd724204bdc7d9dd8289b9 data/ars_nouveau/recipe/amethyst.json +6523b4dc44b09c5423d7c64ff3051438966c5d66 data/ars_nouveau/recipe/amethyst_block.json +115d647a6d4cf519c16da4504e8c8db17f3d5ebc data/ars_nouveau/recipe/amplify_arrow.json +881dccacec3cb203aac682071dafa404e6657149 data/ars_nouveau/recipe/conjuration_essence.json +fe7e60a935b2906e4e10cba135a1948bc5f3a243 data/ars_nouveau/recipe/earth_essence.json +2269915429ba66392d9dbe7b51bb86b2ab820b1b data/ars_nouveau/recipe/fire_essence.json +555d6f245c68358aaf85965d96ec261d92b83a1e data/ars_nouveau/recipe/lapis.json +828ad058c94024260d1bcbf171a9e73cca114b89 data/ars_nouveau/recipe/manipulation_essence.json +1282caff28b4599947022e1981dadcafde2ff6e5 data/ars_nouveau/recipe/pierce_arrow.json +863697816f215752a637966c1f14ef65f5cc6402 data/ars_nouveau/recipe/split_arrow.json +6bd51ed6a5394ebe4b1a7b1557a45eeb34d61c4e data/ars_nouveau/recipe/water_essence.json diff --git a/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 b/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 index 9bc6083e39..7d2c13771e 100644 --- a/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 +++ b/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 @@ -1,176 +1,176 @@ -// 1.21 2024-07-05T22:41:47.5411155 Apparatus -fb72ed4841264600c52f467c5f2a03ef440a38cb data/ars_nouveau/recipes/alchemists_crown.json -a20b2c86d4399461eaab73edce04323cd3cdc697 data/ars_nouveau/recipes/amulet_of_mana_boost.json -37cae95a78f283e24bedae76534f827c68ba7dd5 data/ars_nouveau/recipes/amulet_of_mana_regen.json -3c3ca7d3b3faa68920b91edce159d18e267abd17 data/ars_nouveau/recipes/aqua_affinity_1.json -4bb885be0907769cdbb71c5a6bc247a10a108bee data/ars_nouveau/recipes/arcanist_boots.json -e01b67707c4965ab890a062c99d50a84bea34461 data/ars_nouveau/recipes/arcanist_hood.json -27daf0b298e5e3859abe32a37373c2f5575a19fe data/ars_nouveau/recipes/arcanist_leggings.json -4224ee563775c88e8c3170bec4eaf388222d6e88 data/ars_nouveau/recipes/arcanist_robes.json -836f88aafe65f5ca70ec225d10f33a1b81dcb388 data/ars_nouveau/recipes/bane_of_arthropods_1.json -7d8d894e7120120f64dc1bcf8fbe33e391146d81 data/ars_nouveau/recipes/bane_of_arthropods_2.json -e4f6fc7200faae766e672f714f190534eff46f5f data/ars_nouveau/recipes/bane_of_arthropods_3.json -ac8c1049cf330496589a63da84fbce561ca817d0 data/ars_nouveau/recipes/bane_of_arthropods_4.json -8763e62776c9ea399194ec666a7ecab826e42185 data/ars_nouveau/recipes/bane_of_arthropods_5.json -efbcfaec39b9f98810bd8fb914289d8c8d920bf8 data/ars_nouveau/recipes/battlemage_boots.json -f194dfc7114c2de9edac4c4ce03e80d8f166aef4 data/ars_nouveau/recipes/battlemage_hood.json -a3105ce016f168cd35f07374b2998971fd6cd9a4 data/ars_nouveau/recipes/battlemage_leggings.json -72313f6dd5f25699d2c1248568952a7b07f55aa7 data/ars_nouveau/recipes/battlemage_robes.json -2f909917745a053b12d96383c01cf16e176246ab data/ars_nouveau/recipes/belt_of_levitation.json -c00e61b0d908051fa11076a67bbad509f22d7882 data/ars_nouveau/recipes/belt_of_unstable_gifts.json -2f3cb27b0a5ad0ffc8980523286f8219c35ca28d data/ars_nouveau/recipes/blast_protection_1.json -0db81d38de1f268e7a1297d0df35b0e11c6d5d54 data/ars_nouveau/recipes/blast_protection_2.json -73a0028e7b35e130e84619657dd694cc217f5685 data/ars_nouveau/recipes/blast_protection_3.json -f7f455dd70ea2c1567983620bd5ef77e183e93ec data/ars_nouveau/recipes/blast_protection_4.json -5241f9a54f8f217641347d189dc09ca9332252a3 data/ars_nouveau/recipes/brazier_relay.json -b39745ef3c086965c1a9e526f556353875261902 data/ars_nouveau/recipes/depth_strider_1.json -c9e83203147d08d92f4c623c4bbd1be3ffe14cb7 data/ars_nouveau/recipes/depth_strider_2.json -f9cec31b747fdfba29153bb62a19a60bfbcf376c data/ars_nouveau/recipes/depth_strider_3.json -a84d7d4a1358ca424f3f3233eb071b8fd7252281 data/ars_nouveau/recipes/dominion_wand.json -3a584f734506921105848c29b99124a896201c0b data/ars_nouveau/recipes/drygmy_charm.json -20ba7d0ed572ff4601a3347a9d7dcdf02790aa3e data/ars_nouveau/recipes/efficiency_1.json -f35e1bd98bf7be6d18a2d6a5d0d37ed2967feb10 data/ars_nouveau/recipes/efficiency_2.json -06ebaa07668833986508f2486cfdd1663d23d942 data/ars_nouveau/recipes/efficiency_3.json -ca4032c5216d4036407bd11b66c8e4c9d318892d data/ars_nouveau/recipes/efficiency_4.json -9573fc0c5ac7c54376524cdc828877655547b4bb data/ars_nouveau/recipes/efficiency_5.json -4778856ebc7b6e16b707f3874d0780879fc9de58 data/ars_nouveau/recipes/enchanters_eye.json -a984f0a5fa46d034b53917e190ca973c5799d95a data/ars_nouveau/recipes/enchanters_mirror.json -d1361bef3b5a881a23ea8ce9a41e69b81d2b0f7b data/ars_nouveau/recipes/enchanters_shield.json -c1c6dab35abdb2448ec9c86797a3226720908961 data/ars_nouveau/recipes/enchanters_sword.json -c9742f93a27a3d4fbb39f87786a6da625fbdbe93 data/ars_nouveau/recipes/feather_falling_1.json -b84415cf0d72fa5dcfcb646b603133d1df95e3ec data/ars_nouveau/recipes/feather_falling_2.json -c8d454d4720b6a6249cc9917b7a2a1692916d265 data/ars_nouveau/recipes/feather_falling_3.json -60e4a34f9624b7206c7446f264fa322a2258ae09 data/ars_nouveau/recipes/feather_falling_4.json -9b45c91132e66e72b411740e43bd68a504fd16f4 data/ars_nouveau/recipes/fire_aspect_1.json -c97610865013e5e4484fb3fb806f1b07e84443b5 data/ars_nouveau/recipes/fire_aspect_2.json -ea20e4c2b57851bb7d916dbc20ed4237ef5d2694 data/ars_nouveau/recipes/fire_protection_1.json -d62e1cbf1e93b621b5616ab5b1f5dbeda6750fb9 data/ars_nouveau/recipes/fire_protection_2.json -8ed43885c76be58dc964f6b6785bc4d86c92d69f data/ars_nouveau/recipes/fire_protection_3.json -8b2b2a014044e4d1e34f4652145c4a4988d99ecd data/ars_nouveau/recipes/fire_protection_4.json -be0f61a87d68ff18022d6641cb41c642a606ef92 data/ars_nouveau/recipes/fire_protection_5.json -d7ba28ce9e84739524af257b5fd9e0f967389631 data/ars_nouveau/recipes/first_armor_upgrade.json -8cc2eafe96e3570b0f0580650b072e33bd474960 data/ars_nouveau/recipes/flame_1.json -9e6e433a01950ae0b24c139a1b24dbc56266b92a data/ars_nouveau/recipes/fortune_1.json -9981a4e919c62d834548fdc7f67346f710a05cbf data/ars_nouveau/recipes/fortune_2.json -373414b2253612d371fc97a94a53d9dbf87563df data/ars_nouveau/recipes/fortune_3.json -6f91076bd12652d475a11306f009ba31cea8e348 data/ars_nouveau/recipes/infinity_1.json -54af5f9dae88edff870af8c7da2ca460a190c8fd data/ars_nouveau/recipes/jar_of_light.json -4fc7dba3b56892ace79cf167e4e771ae97137da1 data/ars_nouveau/recipes/jump_ring.json -6af4709c8b8a5fe042ce6ad4822541a96690948c data/ars_nouveau/recipes/knockback_1.json -3bba1b55de1f2b5621af044b03d2a788a4f7aec3 data/ars_nouveau/recipes/knockback_2.json -415023665c08999aa1069b92ddda02ecac00f1b1 data/ars_nouveau/recipes/lingering_flask_cannon.json -398d2e9bed0a267ebb0cb6873776338089e7fb5c data/ars_nouveau/recipes/looting_1.json -ee228546696ced85f9490ce9da08cf7a0a6ac4ba data/ars_nouveau/recipes/looting_2.json -e5ae08c2f47d0cda8af711e6fdbc21c43b445217 data/ars_nouveau/recipes/looting_3.json -37ab56d8d94804b98eea95e3ec4a5db17c49b0f5 data/ars_nouveau/recipes/magebloom_crop.json -6523a5c4dd039bc8fe3bda029d8ce7e7b61c35fa data/ars_nouveau/recipes/mana_boost_1.json -e63fa11ec0cdfb453cdad6eb23a625a74c80bbac data/ars_nouveau/recipes/mana_boost_2.json -51a5ced96b1fd86b52a9403dc02c613b97fd5d95 data/ars_nouveau/recipes/mana_boost_3.json -949a0513b78d2e757d99d4830279a37c00dc59d7 data/ars_nouveau/recipes/mana_regen_1.json -e31d6c99de9494b0dd7cd99328a52901183c52a0 data/ars_nouveau/recipes/mana_regen_2.json -0ed170543581cba1ff4f1590b7ef1d1444a7c1eb data/ars_nouveau/recipes/mana_regen_3.json -c8351e79728ba327e6b20dada8c371e0ce642d05 data/ars_nouveau/recipes/multishot_1.json -136fcdb50195cb46c57bf2a6934879d0ee0c986d data/ars_nouveau/recipes/piercing_1.json -7be6cc46e8c935b1558eb64439c6586c55929dc9 data/ars_nouveau/recipes/piercing_2.json -15731b82f78f06d0b45268bc0f384d7d1632a94d data/ars_nouveau/recipes/piercing_3.json -5e613451e8dcc3037a8e2e27f623cbe317923f23 data/ars_nouveau/recipes/piercing_4.json -24636ce003b15cdadc23ecb7f0ae96e99e48e1f9 data/ars_nouveau/recipes/potion_diffuser.json -d46ddfcd500e082dd23c2bd419ab39c9404ccf1e data/ars_nouveau/recipes/potion_flask.json -f6556751116a1335bbce68ca3891bd4ff135a079 data/ars_nouveau/recipes/potion_flask_amplify.json -41b3f96ee5fd919d2db71ca0ad0fdbc191e1eebe data/ars_nouveau/recipes/potion_flask_extend_time.json -f5857569dca9a51e79d54bc40f1a61a4f9fdc4c2 data/ars_nouveau/recipes/potion_melder.json -1bf1edef9f01d6386afd84c9b3442330f6b44272 data/ars_nouveau/recipes/power_1.json -fd4f92f95c4153d9544d8b621269ea5d66383f3d data/ars_nouveau/recipes/power_2.json -4a2436e69d9429db5eea62c26ccd7d2bbd4759db data/ars_nouveau/recipes/power_3.json -edec15450793c872f73af1a89796cf7d36326fce data/ars_nouveau/recipes/power_4.json -ee211ae3eb2864c842b398d5496d66bbb15882d1 data/ars_nouveau/recipes/power_5.json -b442abbdd012b59a16a8f369faded364177a2688 data/ars_nouveau/recipes/projectile_protection_1.json -e36f7a2ad97fa70c74d93eee1277fd862ce9f9c3 data/ars_nouveau/recipes/projectile_protection_2.json -a9d521d5658d4fc759556468c2d6ce2f7bb3babf data/ars_nouveau/recipes/projectile_protection_3.json -4527c879e9543624cbd49c677422f1bcdf77859d data/ars_nouveau/recipes/projectile_protection_4.json -b96befa3dd8ce69edde26310cb0d610b0ec0e512 data/ars_nouveau/recipes/projectile_protection_5.json -f2f1b0fe3b4ec8d7fced37e3f71ee17dc1eccb8b data/ars_nouveau/recipes/protection_1.json -aeab337473e8300929c44ee4a02cd7e04d69d029 data/ars_nouveau/recipes/protection_2.json -597f9e8587d320a02377ea76ead9999c03df1931 data/ars_nouveau/recipes/protection_3.json -84e9441d9c4bdb0c829569f96635a0100db4c1e8 data/ars_nouveau/recipes/protection_4.json -590ffda2fb09414779c01eceea08da6aac78f965 data/ars_nouveau/recipes/protection_5.json -94f6bb8c547fcc36bbb56a25dd146153ea776a19 data/ars_nouveau/recipes/punch_1.json -f492d4cae146653d3d3dba3ef12c23501848d6f5 data/ars_nouveau/recipes/punch_2.json -314322ca49b6c68038a64dd591ab2cc8c1c794d0 data/ars_nouveau/recipes/quick_charge_1.json -d7dcd72e99895701e20df052bd7df87488abb774 data/ars_nouveau/recipes/quick_charge_2.json -11e0eb139b7539d0f7b12dad730dd1c983287623 data/ars_nouveau/recipes/quick_charge_3.json -ce8fc7478cb7c46d3c069099b007a0d0cefce4c7 data/ars_nouveau/recipes/reactive.json -f24b312ca6b9c6fa83eeb6d106370bab76eac2a9 data/ars_nouveau/recipes/reactive_2.json -51941f8dc7728de8f91d382d29f67ad1b0ee56a0 data/ars_nouveau/recipes/reactive_3.json -be41ac9628db4fac57839c2ee59c1cab6621d002 data/ars_nouveau/recipes/reactive_4.json -729c1b99be46dccff5ecef88529fedb3c3ad6600 data/ars_nouveau/recipes/relay_collector.json -9626aed3cfb65ac73e0369aaab5fac731d8797ad data/ars_nouveau/recipes/relay_deposit.json -67ebb7c1e627e0e555fc1843ec9e93b74cdeb0c6 data/ars_nouveau/recipes/relay_splitter.json -facba97725c9567e1114c938c91a7301268d32be data/ars_nouveau/recipes/relay_warp.json -7bf7e1c54873c01a8710bf3f3596552e7a82b2fd data/ars_nouveau/recipes/respiration_1.json -447c42afe8c28cd97513fbd0595a449316077982 data/ars_nouveau/recipes/respiration_2.json -1e7ce9f4616f86d76e71d1298f3464e5ded813bd data/ars_nouveau/recipes/respiration_3.json -4a14bf05b33d0216566f78384421bb412876fafd data/ars_nouveau/recipes/ring_of_greater_discount.json -8806af9377ef69b7d2443aa76ea17dfd68ae2dee data/ars_nouveau/recipes/ring_of_lesser_discount.json -6f03c848b9b537e9e56cc6da6deb285a38adb8ab data/ars_nouveau/recipes/scryers_oculus.json -f0940942eece51d48b5141a671419fc47b64c792 data/ars_nouveau/recipes/second_armor_upgrade.json -0f273466b72acc20bc5fe007e7d19acaca9e7f3a data/ars_nouveau/recipes/shapers_focus.json -edd9f6e7a2c5e7f57ff82adf9a70585910312360 data/ars_nouveau/recipes/sharpness_1.json -786d4ec17b76aec0201c374cbfd32bd7520a1bd2 data/ars_nouveau/recipes/sharpness_2.json -870f4a35f2ec26a9d348ec36f753cad264588fe9 data/ars_nouveau/recipes/sharpness_3.json -9cf5eea51dfc1db4ce8dc8a5cd341c0e1b271793 data/ars_nouveau/recipes/sharpness_4.json -bca5b12e4bb61ff53bd8442b72e395c1895ceed7 data/ars_nouveau/recipes/sharpness_5.json -e59728e2a10112af6d9b18292b8ee8919409f1b7 data/ars_nouveau/recipes/silk_touch_1.json -cedeb7a384c1597624a7dcdf09fcb444e3c2e881 data/ars_nouveau/recipes/smite_1.json -ab79dfed1d55dccf493a4885423d28c332b4401b data/ars_nouveau/recipes/smite_2.json -eddb9e7681694d9c7df156d6b8edd7d1cfc439dd data/ars_nouveau/recipes/smite_3.json -10e6ba9c28f88386fb85d9aa9a6bf9fb9282b552 data/ars_nouveau/recipes/smite_4.json -b75ee0a9fbeae85fde264e136c14467210e0bbd7 data/ars_nouveau/recipes/smite_5.json -94e7fb147d453bb70a5771dbe221e3c75b505cd3 data/ars_nouveau/recipes/sorcerer_boots.json -89d4ec865cb6c4f84a2b92f531b7bf5f2f254bda data/ars_nouveau/recipes/sorcerer_hood.json -02ef475aeac5bb43ea6ac147c8d366cff5411aa5 data/ars_nouveau/recipes/sorcerer_leggings.json -95fbe3adce48d9c0cac8267f3be1c03d1f189027 data/ars_nouveau/recipes/sorcerer_robes.json -b39dd805b19f2b16914a520230959c2c6c65c825 data/ars_nouveau/recipes/spell_bow.json -f8323767064c376cb90e04d61b27e2ef9da523b1 data/ars_nouveau/recipes/spell_crossbow.json -be82ae84c0ebbfdfbe719a94d14818f7bffe7b99 data/ars_nouveau/recipes/spell_sensor.json -65e4c7cc88cdf662f3e6c6d5e2a3b1713a46c16d data/ars_nouveau/recipes/spell_turret.json -8b74efc903e7fd30e9be0a3bf50dc811b227ac1b data/ars_nouveau/recipes/spell_write.json -faff46a4612cca552249ac69d3cdb8d67c299a19 data/ars_nouveau/recipes/splash_flask_cannon.json -7f21540a5bdb3d65984eec8a61a4e78f9cf1edfe data/ars_nouveau/recipes/stable_warp_scroll.json -8d5f0c39e86ad2255dfa6850fc02df88823f3f55 data/ars_nouveau/recipes/starbuncle_charm.json -ff7f37fabc6f5e1e9286f95a67aa8f41fec14963 data/ars_nouveau/recipes/storage_lectern.json -f8e7cd194d9cb5c6aa56a70b93ae831f0d420ac7 data/ars_nouveau/recipes/summon_focus.json -82ac616ba3ffbc862e5bce4d6a3a592c4aab4e69 data/ars_nouveau/recipes/sweeping_edge_1.json -465d3415cbfb4906da456a35f16f7cfcd6d94fb7 data/ars_nouveau/recipes/sweeping_edge_2.json -c279614bf63100e9c1f3832b971cfc62ccec86be data/ars_nouveau/recipes/sweeping_edge_3.json -7a8c06788707cf87a52606561556ed2d5796af7e data/ars_nouveau/recipes/thorns_1.json -6d66dfcb9b044c91c59ecfee257b3444ceab5ca0 data/ars_nouveau/recipes/thorns_2.json -f0a934796f04c228a5acc8458c350edceba733e8 data/ars_nouveau/recipes/thorns_3.json -9e54d82da1da081044c46ba528e282ef680bbf4f data/ars_nouveau/recipes/thread_amethyst_golem.json -31b91d2dcde117b1e63c757d9b6c502fb3f9cbfc data/ars_nouveau/recipes/thread_chilling.json -e12e5d8abfeca1d77177f099e099b2a673c0b507 data/ars_nouveau/recipes/thread_depths.json -206065144c7a2b27fe83824b81ed4de131dafccd data/ars_nouveau/recipes/thread_drygmy.json -036fbe60a5ceab2389343cd9bf269196a507c21d data/ars_nouveau/recipes/thread_feather.json -2cbb8df5e30297af6336a24dc58e0502fef02a42 data/ars_nouveau/recipes/thread_gliding.json -ddbe9f0a66cde1fc6d0da2b27c7145d0e7874a78 data/ars_nouveau/recipes/thread_heights.json -83b148515f0687dddfbb730c3edbefa98f86abc6 data/ars_nouveau/recipes/thread_high_step.json -20e017e91d313e59032b5e7f23aa69930384f8a8 data/ars_nouveau/recipes/thread_immolation.json -8ded4b4995884f924bc05d39976f0e8092984a5a data/ars_nouveau/recipes/thread_kindling.json -e1f904ed98b8038868d0445b35c7fc8cdc534024 data/ars_nouveau/recipes/thread_life_drain.json -ccd0369f5106f228ec923319b32f6ac6d370c8c5 data/ars_nouveau/recipes/thread_magic_capacity.json -ed7eafe49de50eb5cd865d29f786ea2a76df02f0 data/ars_nouveau/recipes/thread_repairing.json -b7497d22af35b79a8bcf30644be7301bde408fb5 data/ars_nouveau/recipes/thread_spellpower.json -24fb3d52e1bfe932469c5eb74a0c59c445df77e9 data/ars_nouveau/recipes/thread_starbuncle.json -b5480513683ac166c8f3ac8d973cb24b29d918fc data/ars_nouveau/recipes/thread_undying.json -68a80f65febc886f3ee09deff19fdc72e6bf1442 data/ars_nouveau/recipes/thread_warding.json -56db861c10828de84d8c8fe9c4f5cfbec622751a data/ars_nouveau/recipes/thread_whirlisprig.json -495fe90ec4b2c80444611a169db9ee421b77ae9c data/ars_nouveau/recipes/thread_wixie.json -87a1e549710354e03939b5a88685f15ee5eb995b data/ars_nouveau/recipes/timer_spell_turret.json -69180aa1d418f1bf68eeda49e2d7f573c914a51d data/ars_nouveau/recipes/unbreaking_1.json -240061b982b2b457462622b1b48f676dc83e9be6 data/ars_nouveau/recipes/unbreaking_2.json -e2f19fc062070e24ae35597c096eb691766b551c data/ars_nouveau/recipes/unbreaking_3.json -366114e867ab11ec19a9c13e3e8f88a4b681ec10 data/ars_nouveau/recipes/void_jar.json -b9c3afd44505bf198b797a2b5f46ce9a5ed3f18b data/ars_nouveau/recipes/wand.json -55df26b1d3d21a7d0240837aa404ad7f1bd3e0de data/ars_nouveau/recipes/warp_scroll_copy.json -d403242b22926cd16ad7047d9b8891d7f5a487ff data/ars_nouveau/recipes/whirlisprig_charm.json -c89e7cfa113958b729e50ac301a002d524989a5d data/ars_nouveau/recipes/wixie_charm.json +// 1.21 2024-07-07T11:53:40.7775578 Apparatus +fb72ed4841264600c52f467c5f2a03ef440a38cb data/ars_nouveau/recipe/alchemists_crown.json +a20b2c86d4399461eaab73edce04323cd3cdc697 data/ars_nouveau/recipe/amulet_of_mana_boost.json +37cae95a78f283e24bedae76534f827c68ba7dd5 data/ars_nouveau/recipe/amulet_of_mana_regen.json +3c3ca7d3b3faa68920b91edce159d18e267abd17 data/ars_nouveau/recipe/aqua_affinity_1.json +4bb885be0907769cdbb71c5a6bc247a10a108bee data/ars_nouveau/recipe/arcanist_boots.json +e01b67707c4965ab890a062c99d50a84bea34461 data/ars_nouveau/recipe/arcanist_hood.json +27daf0b298e5e3859abe32a37373c2f5575a19fe data/ars_nouveau/recipe/arcanist_leggings.json +4224ee563775c88e8c3170bec4eaf388222d6e88 data/ars_nouveau/recipe/arcanist_robes.json +836f88aafe65f5ca70ec225d10f33a1b81dcb388 data/ars_nouveau/recipe/bane_of_arthropods_1.json +7d8d894e7120120f64dc1bcf8fbe33e391146d81 data/ars_nouveau/recipe/bane_of_arthropods_2.json +e4f6fc7200faae766e672f714f190534eff46f5f data/ars_nouveau/recipe/bane_of_arthropods_3.json +ac8c1049cf330496589a63da84fbce561ca817d0 data/ars_nouveau/recipe/bane_of_arthropods_4.json +8763e62776c9ea399194ec666a7ecab826e42185 data/ars_nouveau/recipe/bane_of_arthropods_5.json +efbcfaec39b9f98810bd8fb914289d8c8d920bf8 data/ars_nouveau/recipe/battlemage_boots.json +f194dfc7114c2de9edac4c4ce03e80d8f166aef4 data/ars_nouveau/recipe/battlemage_hood.json +a3105ce016f168cd35f07374b2998971fd6cd9a4 data/ars_nouveau/recipe/battlemage_leggings.json +72313f6dd5f25699d2c1248568952a7b07f55aa7 data/ars_nouveau/recipe/battlemage_robes.json +2f909917745a053b12d96383c01cf16e176246ab data/ars_nouveau/recipe/belt_of_levitation.json +c00e61b0d908051fa11076a67bbad509f22d7882 data/ars_nouveau/recipe/belt_of_unstable_gifts.json +2f3cb27b0a5ad0ffc8980523286f8219c35ca28d data/ars_nouveau/recipe/blast_protection_1.json +0db81d38de1f268e7a1297d0df35b0e11c6d5d54 data/ars_nouveau/recipe/blast_protection_2.json +73a0028e7b35e130e84619657dd694cc217f5685 data/ars_nouveau/recipe/blast_protection_3.json +f7f455dd70ea2c1567983620bd5ef77e183e93ec data/ars_nouveau/recipe/blast_protection_4.json +5241f9a54f8f217641347d189dc09ca9332252a3 data/ars_nouveau/recipe/brazier_relay.json +b39745ef3c086965c1a9e526f556353875261902 data/ars_nouveau/recipe/depth_strider_1.json +c9e83203147d08d92f4c623c4bbd1be3ffe14cb7 data/ars_nouveau/recipe/depth_strider_2.json +f9cec31b747fdfba29153bb62a19a60bfbcf376c data/ars_nouveau/recipe/depth_strider_3.json +a84d7d4a1358ca424f3f3233eb071b8fd7252281 data/ars_nouveau/recipe/dominion_wand.json +3a584f734506921105848c29b99124a896201c0b data/ars_nouveau/recipe/drygmy_charm.json +20ba7d0ed572ff4601a3347a9d7dcdf02790aa3e data/ars_nouveau/recipe/efficiency_1.json +f35e1bd98bf7be6d18a2d6a5d0d37ed2967feb10 data/ars_nouveau/recipe/efficiency_2.json +06ebaa07668833986508f2486cfdd1663d23d942 data/ars_nouveau/recipe/efficiency_3.json +ca4032c5216d4036407bd11b66c8e4c9d318892d data/ars_nouveau/recipe/efficiency_4.json +9573fc0c5ac7c54376524cdc828877655547b4bb data/ars_nouveau/recipe/efficiency_5.json +4778856ebc7b6e16b707f3874d0780879fc9de58 data/ars_nouveau/recipe/enchanters_eye.json +a984f0a5fa46d034b53917e190ca973c5799d95a data/ars_nouveau/recipe/enchanters_mirror.json +d1361bef3b5a881a23ea8ce9a41e69b81d2b0f7b data/ars_nouveau/recipe/enchanters_shield.json +c1c6dab35abdb2448ec9c86797a3226720908961 data/ars_nouveau/recipe/enchanters_sword.json +c9742f93a27a3d4fbb39f87786a6da625fbdbe93 data/ars_nouveau/recipe/feather_falling_1.json +b84415cf0d72fa5dcfcb646b603133d1df95e3ec data/ars_nouveau/recipe/feather_falling_2.json +c8d454d4720b6a6249cc9917b7a2a1692916d265 data/ars_nouveau/recipe/feather_falling_3.json +60e4a34f9624b7206c7446f264fa322a2258ae09 data/ars_nouveau/recipe/feather_falling_4.json +9b45c91132e66e72b411740e43bd68a504fd16f4 data/ars_nouveau/recipe/fire_aspect_1.json +c97610865013e5e4484fb3fb806f1b07e84443b5 data/ars_nouveau/recipe/fire_aspect_2.json +ea20e4c2b57851bb7d916dbc20ed4237ef5d2694 data/ars_nouveau/recipe/fire_protection_1.json +d62e1cbf1e93b621b5616ab5b1f5dbeda6750fb9 data/ars_nouveau/recipe/fire_protection_2.json +8ed43885c76be58dc964f6b6785bc4d86c92d69f data/ars_nouveau/recipe/fire_protection_3.json +8b2b2a014044e4d1e34f4652145c4a4988d99ecd data/ars_nouveau/recipe/fire_protection_4.json +be0f61a87d68ff18022d6641cb41c642a606ef92 data/ars_nouveau/recipe/fire_protection_5.json +d7ba28ce9e84739524af257b5fd9e0f967389631 data/ars_nouveau/recipe/first_armor_upgrade.json +8cc2eafe96e3570b0f0580650b072e33bd474960 data/ars_nouveau/recipe/flame_1.json +9e6e433a01950ae0b24c139a1b24dbc56266b92a data/ars_nouveau/recipe/fortune_1.json +9981a4e919c62d834548fdc7f67346f710a05cbf data/ars_nouveau/recipe/fortune_2.json +373414b2253612d371fc97a94a53d9dbf87563df data/ars_nouveau/recipe/fortune_3.json +6f91076bd12652d475a11306f009ba31cea8e348 data/ars_nouveau/recipe/infinity_1.json +54af5f9dae88edff870af8c7da2ca460a190c8fd data/ars_nouveau/recipe/jar_of_light.json +4fc7dba3b56892ace79cf167e4e771ae97137da1 data/ars_nouveau/recipe/jump_ring.json +6af4709c8b8a5fe042ce6ad4822541a96690948c data/ars_nouveau/recipe/knockback_1.json +3bba1b55de1f2b5621af044b03d2a788a4f7aec3 data/ars_nouveau/recipe/knockback_2.json +415023665c08999aa1069b92ddda02ecac00f1b1 data/ars_nouveau/recipe/lingering_flask_cannon.json +398d2e9bed0a267ebb0cb6873776338089e7fb5c data/ars_nouveau/recipe/looting_1.json +ee228546696ced85f9490ce9da08cf7a0a6ac4ba data/ars_nouveau/recipe/looting_2.json +e5ae08c2f47d0cda8af711e6fdbc21c43b445217 data/ars_nouveau/recipe/looting_3.json +37ab56d8d94804b98eea95e3ec4a5db17c49b0f5 data/ars_nouveau/recipe/magebloom_crop.json +6523a5c4dd039bc8fe3bda029d8ce7e7b61c35fa data/ars_nouveau/recipe/mana_boost_1.json +e63fa11ec0cdfb453cdad6eb23a625a74c80bbac data/ars_nouveau/recipe/mana_boost_2.json +51a5ced96b1fd86b52a9403dc02c613b97fd5d95 data/ars_nouveau/recipe/mana_boost_3.json +949a0513b78d2e757d99d4830279a37c00dc59d7 data/ars_nouveau/recipe/mana_regen_1.json +e31d6c99de9494b0dd7cd99328a52901183c52a0 data/ars_nouveau/recipe/mana_regen_2.json +0ed170543581cba1ff4f1590b7ef1d1444a7c1eb data/ars_nouveau/recipe/mana_regen_3.json +c8351e79728ba327e6b20dada8c371e0ce642d05 data/ars_nouveau/recipe/multishot_1.json +136fcdb50195cb46c57bf2a6934879d0ee0c986d data/ars_nouveau/recipe/piercing_1.json +7be6cc46e8c935b1558eb64439c6586c55929dc9 data/ars_nouveau/recipe/piercing_2.json +15731b82f78f06d0b45268bc0f384d7d1632a94d data/ars_nouveau/recipe/piercing_3.json +5e613451e8dcc3037a8e2e27f623cbe317923f23 data/ars_nouveau/recipe/piercing_4.json +24636ce003b15cdadc23ecb7f0ae96e99e48e1f9 data/ars_nouveau/recipe/potion_diffuser.json +d46ddfcd500e082dd23c2bd419ab39c9404ccf1e data/ars_nouveau/recipe/potion_flask.json +f6556751116a1335bbce68ca3891bd4ff135a079 data/ars_nouveau/recipe/potion_flask_amplify.json +41b3f96ee5fd919d2db71ca0ad0fdbc191e1eebe data/ars_nouveau/recipe/potion_flask_extend_time.json +f5857569dca9a51e79d54bc40f1a61a4f9fdc4c2 data/ars_nouveau/recipe/potion_melder.json +1bf1edef9f01d6386afd84c9b3442330f6b44272 data/ars_nouveau/recipe/power_1.json +fd4f92f95c4153d9544d8b621269ea5d66383f3d data/ars_nouveau/recipe/power_2.json +4a2436e69d9429db5eea62c26ccd7d2bbd4759db data/ars_nouveau/recipe/power_3.json +edec15450793c872f73af1a89796cf7d36326fce data/ars_nouveau/recipe/power_4.json +ee211ae3eb2864c842b398d5496d66bbb15882d1 data/ars_nouveau/recipe/power_5.json +b442abbdd012b59a16a8f369faded364177a2688 data/ars_nouveau/recipe/projectile_protection_1.json +e36f7a2ad97fa70c74d93eee1277fd862ce9f9c3 data/ars_nouveau/recipe/projectile_protection_2.json +a9d521d5658d4fc759556468c2d6ce2f7bb3babf data/ars_nouveau/recipe/projectile_protection_3.json +4527c879e9543624cbd49c677422f1bcdf77859d data/ars_nouveau/recipe/projectile_protection_4.json +b96befa3dd8ce69edde26310cb0d610b0ec0e512 data/ars_nouveau/recipe/projectile_protection_5.json +f2f1b0fe3b4ec8d7fced37e3f71ee17dc1eccb8b data/ars_nouveau/recipe/protection_1.json +aeab337473e8300929c44ee4a02cd7e04d69d029 data/ars_nouveau/recipe/protection_2.json +597f9e8587d320a02377ea76ead9999c03df1931 data/ars_nouveau/recipe/protection_3.json +84e9441d9c4bdb0c829569f96635a0100db4c1e8 data/ars_nouveau/recipe/protection_4.json +590ffda2fb09414779c01eceea08da6aac78f965 data/ars_nouveau/recipe/protection_5.json +94f6bb8c547fcc36bbb56a25dd146153ea776a19 data/ars_nouveau/recipe/punch_1.json +f492d4cae146653d3d3dba3ef12c23501848d6f5 data/ars_nouveau/recipe/punch_2.json +314322ca49b6c68038a64dd591ab2cc8c1c794d0 data/ars_nouveau/recipe/quick_charge_1.json +d7dcd72e99895701e20df052bd7df87488abb774 data/ars_nouveau/recipe/quick_charge_2.json +11e0eb139b7539d0f7b12dad730dd1c983287623 data/ars_nouveau/recipe/quick_charge_3.json +ce8fc7478cb7c46d3c069099b007a0d0cefce4c7 data/ars_nouveau/recipe/reactive.json +f24b312ca6b9c6fa83eeb6d106370bab76eac2a9 data/ars_nouveau/recipe/reactive_2.json +51941f8dc7728de8f91d382d29f67ad1b0ee56a0 data/ars_nouveau/recipe/reactive_3.json +be41ac9628db4fac57839c2ee59c1cab6621d002 data/ars_nouveau/recipe/reactive_4.json +729c1b99be46dccff5ecef88529fedb3c3ad6600 data/ars_nouveau/recipe/relay_collector.json +9626aed3cfb65ac73e0369aaab5fac731d8797ad data/ars_nouveau/recipe/relay_deposit.json +67ebb7c1e627e0e555fc1843ec9e93b74cdeb0c6 data/ars_nouveau/recipe/relay_splitter.json +facba97725c9567e1114c938c91a7301268d32be data/ars_nouveau/recipe/relay_warp.json +7bf7e1c54873c01a8710bf3f3596552e7a82b2fd data/ars_nouveau/recipe/respiration_1.json +447c42afe8c28cd97513fbd0595a449316077982 data/ars_nouveau/recipe/respiration_2.json +1e7ce9f4616f86d76e71d1298f3464e5ded813bd data/ars_nouveau/recipe/respiration_3.json +4a14bf05b33d0216566f78384421bb412876fafd data/ars_nouveau/recipe/ring_of_greater_discount.json +8806af9377ef69b7d2443aa76ea17dfd68ae2dee data/ars_nouveau/recipe/ring_of_lesser_discount.json +6f03c848b9b537e9e56cc6da6deb285a38adb8ab data/ars_nouveau/recipe/scryers_oculus.json +f0940942eece51d48b5141a671419fc47b64c792 data/ars_nouveau/recipe/second_armor_upgrade.json +0f273466b72acc20bc5fe007e7d19acaca9e7f3a data/ars_nouveau/recipe/shapers_focus.json +edd9f6e7a2c5e7f57ff82adf9a70585910312360 data/ars_nouveau/recipe/sharpness_1.json +786d4ec17b76aec0201c374cbfd32bd7520a1bd2 data/ars_nouveau/recipe/sharpness_2.json +870f4a35f2ec26a9d348ec36f753cad264588fe9 data/ars_nouveau/recipe/sharpness_3.json +9cf5eea51dfc1db4ce8dc8a5cd341c0e1b271793 data/ars_nouveau/recipe/sharpness_4.json +bca5b12e4bb61ff53bd8442b72e395c1895ceed7 data/ars_nouveau/recipe/sharpness_5.json +e59728e2a10112af6d9b18292b8ee8919409f1b7 data/ars_nouveau/recipe/silk_touch_1.json +cedeb7a384c1597624a7dcdf09fcb444e3c2e881 data/ars_nouveau/recipe/smite_1.json +ab79dfed1d55dccf493a4885423d28c332b4401b data/ars_nouveau/recipe/smite_2.json +eddb9e7681694d9c7df156d6b8edd7d1cfc439dd data/ars_nouveau/recipe/smite_3.json +10e6ba9c28f88386fb85d9aa9a6bf9fb9282b552 data/ars_nouveau/recipe/smite_4.json +b75ee0a9fbeae85fde264e136c14467210e0bbd7 data/ars_nouveau/recipe/smite_5.json +94e7fb147d453bb70a5771dbe221e3c75b505cd3 data/ars_nouveau/recipe/sorcerer_boots.json +89d4ec865cb6c4f84a2b92f531b7bf5f2f254bda data/ars_nouveau/recipe/sorcerer_hood.json +02ef475aeac5bb43ea6ac147c8d366cff5411aa5 data/ars_nouveau/recipe/sorcerer_leggings.json +95fbe3adce48d9c0cac8267f3be1c03d1f189027 data/ars_nouveau/recipe/sorcerer_robes.json +b39dd805b19f2b16914a520230959c2c6c65c825 data/ars_nouveau/recipe/spell_bow.json +f8323767064c376cb90e04d61b27e2ef9da523b1 data/ars_nouveau/recipe/spell_crossbow.json +be82ae84c0ebbfdfbe719a94d14818f7bffe7b99 data/ars_nouveau/recipe/spell_sensor.json +65e4c7cc88cdf662f3e6c6d5e2a3b1713a46c16d data/ars_nouveau/recipe/spell_turret.json +8b74efc903e7fd30e9be0a3bf50dc811b227ac1b data/ars_nouveau/recipe/spell_write.json +faff46a4612cca552249ac69d3cdb8d67c299a19 data/ars_nouveau/recipe/splash_flask_cannon.json +7f21540a5bdb3d65984eec8a61a4e78f9cf1edfe data/ars_nouveau/recipe/stable_warp_scroll.json +8d5f0c39e86ad2255dfa6850fc02df88823f3f55 data/ars_nouveau/recipe/starbuncle_charm.json +ff7f37fabc6f5e1e9286f95a67aa8f41fec14963 data/ars_nouveau/recipe/storage_lectern.json +f8e7cd194d9cb5c6aa56a70b93ae831f0d420ac7 data/ars_nouveau/recipe/summon_focus.json +82ac616ba3ffbc862e5bce4d6a3a592c4aab4e69 data/ars_nouveau/recipe/sweeping_edge_1.json +465d3415cbfb4906da456a35f16f7cfcd6d94fb7 data/ars_nouveau/recipe/sweeping_edge_2.json +c279614bf63100e9c1f3832b971cfc62ccec86be data/ars_nouveau/recipe/sweeping_edge_3.json +7a8c06788707cf87a52606561556ed2d5796af7e data/ars_nouveau/recipe/thorns_1.json +6d66dfcb9b044c91c59ecfee257b3444ceab5ca0 data/ars_nouveau/recipe/thorns_2.json +f0a934796f04c228a5acc8458c350edceba733e8 data/ars_nouveau/recipe/thorns_3.json +9e54d82da1da081044c46ba528e282ef680bbf4f data/ars_nouveau/recipe/thread_amethyst_golem.json +31b91d2dcde117b1e63c757d9b6c502fb3f9cbfc data/ars_nouveau/recipe/thread_chilling.json +e12e5d8abfeca1d77177f099e099b2a673c0b507 data/ars_nouveau/recipe/thread_depths.json +206065144c7a2b27fe83824b81ed4de131dafccd data/ars_nouveau/recipe/thread_drygmy.json +036fbe60a5ceab2389343cd9bf269196a507c21d data/ars_nouveau/recipe/thread_feather.json +2cbb8df5e30297af6336a24dc58e0502fef02a42 data/ars_nouveau/recipe/thread_gliding.json +ddbe9f0a66cde1fc6d0da2b27c7145d0e7874a78 data/ars_nouveau/recipe/thread_heights.json +83b148515f0687dddfbb730c3edbefa98f86abc6 data/ars_nouveau/recipe/thread_high_step.json +20e017e91d313e59032b5e7f23aa69930384f8a8 data/ars_nouveau/recipe/thread_immolation.json +8ded4b4995884f924bc05d39976f0e8092984a5a data/ars_nouveau/recipe/thread_kindling.json +e1f904ed98b8038868d0445b35c7fc8cdc534024 data/ars_nouveau/recipe/thread_life_drain.json +ccd0369f5106f228ec923319b32f6ac6d370c8c5 data/ars_nouveau/recipe/thread_magic_capacity.json +ed7eafe49de50eb5cd865d29f786ea2a76df02f0 data/ars_nouveau/recipe/thread_repairing.json +b7497d22af35b79a8bcf30644be7301bde408fb5 data/ars_nouveau/recipe/thread_spellpower.json +24fb3d52e1bfe932469c5eb74a0c59c445df77e9 data/ars_nouveau/recipe/thread_starbuncle.json +b5480513683ac166c8f3ac8d973cb24b29d918fc data/ars_nouveau/recipe/thread_undying.json +68a80f65febc886f3ee09deff19fdc72e6bf1442 data/ars_nouveau/recipe/thread_warding.json +56db861c10828de84d8c8fe9c4f5cfbec622751a data/ars_nouveau/recipe/thread_whirlisprig.json +495fe90ec4b2c80444611a169db9ee421b77ae9c data/ars_nouveau/recipe/thread_wixie.json +87a1e549710354e03939b5a88685f15ee5eb995b data/ars_nouveau/recipe/timer_spell_turret.json +69180aa1d418f1bf68eeda49e2d7f573c914a51d data/ars_nouveau/recipe/unbreaking_1.json +240061b982b2b457462622b1b48f676dc83e9be6 data/ars_nouveau/recipe/unbreaking_2.json +e2f19fc062070e24ae35597c096eb691766b551c data/ars_nouveau/recipe/unbreaking_3.json +366114e867ab11ec19a9c13e3e8f88a4b681ec10 data/ars_nouveau/recipe/void_jar.json +b9c3afd44505bf198b797a2b5f46ce9a5ed3f18b data/ars_nouveau/recipe/wand.json +55df26b1d3d21a7d0240837aa404ad7f1bd3e0de data/ars_nouveau/recipe/warp_scroll_copy.json +d403242b22926cd16ad7047d9b8891d7f5a487ff data/ars_nouveau/recipe/whirlisprig_charm.json +c89e7cfa113958b729e50ac301a002d524989a5d data/ars_nouveau/recipe/wixie_charm.json diff --git a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c index c3e82eac83..8ccc9d6168 100644 --- a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c +++ b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c @@ -1,82 +1,82 @@ -// 1.21 2024-07-05T22:41:47.5280938 Glyph Recipes -e4ef5c317ca1bb6d7ff64e6e65dbd41428eb9717 data/ars_nouveau/recipes/burst.json -9913a7b479e3ac1c0da2614ffae49ebaf026e6f7 data/ars_nouveau/recipes/glyph_accelerate.json -7032acba1fd2e577cec1e9e3a48331c862522b38 data/ars_nouveau/recipes/glyph_amplify.json -0e9bff6dbf895ba80b0bd5bcde200152032a087c data/ars_nouveau/recipes/glyph_animate_block.json -8bd925d7db4de20b8622eb3d39fcc082ac4d25fd data/ars_nouveau/recipes/glyph_aoe.json -15b965d4e21561025f9c74225ce5f9299abfe2ea data/ars_nouveau/recipes/glyph_blink.json -8de13db95f7d14dbf144d5cb3aaf705a45d195c8 data/ars_nouveau/recipes/glyph_bounce.json -c12a30b265277c1e793045454de09509a70564ba data/ars_nouveau/recipes/glyph_break.json -ffbb7d49317cff93082873399be237a2508e3695 data/ars_nouveau/recipes/glyph_cold_snap.json -45a9f8b6f07e6532ded8011f48a931a036c4c3d7 data/ars_nouveau/recipes/glyph_conjure_water.json -f6b8f292e7d187f2b21b7c87e113f6f1aeef29fb data/ars_nouveau/recipes/glyph_craft.json -81d95aba0686c38f16c8746ca016be871df8d1ea data/ars_nouveau/recipes/glyph_crush.json -88ea95676a6b9fd44d9da33d7f505241dea82e78 data/ars_nouveau/recipes/glyph_cut.json -3cad5c66a601dacf6bb5d08f31ec6b98b9391514 data/ars_nouveau/recipes/glyph_dampen.json -8a008779d3add831619a4081b16a4c9bea2dfe0f data/ars_nouveau/recipes/glyph_decelerate.json -23a4e63c84e9b3cbc9c972cf768ebb2b8bcea765 data/ars_nouveau/recipes/glyph_delay.json -e82372cc310cfc6f749b6eec86e238b6815801f6 data/ars_nouveau/recipes/glyph_dispel.json -4daa3b4f4849bfa6b17cc87ec029181f83eb115b data/ars_nouveau/recipes/glyph_duration_down.json -59ce04f1c3bd86741e586cbe21a8e232817de060 data/ars_nouveau/recipes/glyph_ender_inventory.json -c7d88c8b291fb8a16d644b0a123e52afbabe82e5 data/ars_nouveau/recipes/glyph_evaporate.json -3178a5019d00ca334d8b0f3a3de2a7e72f3a1a73 data/ars_nouveau/recipes/glyph_exchange.json -f4e201d11e39459b017809128a699e8604790c52 data/ars_nouveau/recipes/glyph_explosion.json -ab103fd6bf4c5125ed473191184c638168b79d13 data/ars_nouveau/recipes/glyph_extend_time.json -12e57017df0e322c9878840fdfff8d97a78ed2ec data/ars_nouveau/recipes/glyph_extract.json -9dce84836e77e0510301136613311b82147e23a9 data/ars_nouveau/recipes/glyph_fangs.json -14112a9c8c2aaaf5d482aa97c83d1f07f088c53d data/ars_nouveau/recipes/glyph_fell.json -409742ef2cf5d148f55c71a4a811551747569b60 data/ars_nouveau/recipes/glyph_firework.json -d1e68fdd9075b82c6829f19902989d5194e85b1f data/ars_nouveau/recipes/glyph_flare.json -db3cccf344ed76c5e73c6d1c7939495ea7bf2ff4 data/ars_nouveau/recipes/glyph_fortune.json -b156d1b81c65374e3ba9faedfb3d445d722e26ff data/ars_nouveau/recipes/glyph_freeze.json -fe4bc1ee1d457b7c3c6e8dd646f057688e493bf7 data/ars_nouveau/recipes/glyph_glide.json -56c8a1604b5a71e248db1a231cde67208bde3fa5 data/ars_nouveau/recipes/glyph_gravity.json -dd60a4ed00289c81dcccebad7b40bf5163243f60 data/ars_nouveau/recipes/glyph_grow.json -78ad0604b7b5127af60333497bd7627ea13c8e7c data/ars_nouveau/recipes/glyph_gust.json -febe999646d4a63714754ee8a9ad1ebeab97911c data/ars_nouveau/recipes/glyph_harm.json -9dbc6193bd7d3bf47eec6728c9ded37fc16216a9 data/ars_nouveau/recipes/glyph_harvest.json -053e9548d8b4748a43e7c6ec1408095f40952537 data/ars_nouveau/recipes/glyph_heal.json -8a6053bd3bb15e8fe990c6dc35f92e7e1271966e data/ars_nouveau/recipes/glyph_hex.json -06d96b9d2a92aacbccf400ebfc2e794376394e82 data/ars_nouveau/recipes/glyph_ignite.json -4b9d7ff36ab385619aebee5ad77417b20e0b356e data/ars_nouveau/recipes/glyph_infuse.json -35c08f159f0b64ef31645294bb57621c96942476 data/ars_nouveau/recipes/glyph_intangible.json -74110848bfcbd802ce0bb9e64913bff220e61081 data/ars_nouveau/recipes/glyph_interact.json -d68657caa28efee45bc9864ee1f48523c1e275c2 data/ars_nouveau/recipes/glyph_invisibility.json -888d6bcc4870ca81f5f764dbdb1c8f41a1828375 data/ars_nouveau/recipes/glyph_launch.json -ba8fbf41205c71635b2f83160f3807aa1365f668 data/ars_nouveau/recipes/glyph_leap.json -8826bf4f65d755e461ef9711ea7687caa41c8d0e data/ars_nouveau/recipes/glyph_light.json -071bbf896c39e6af31d79586f7797f3fa9f49223 data/ars_nouveau/recipes/glyph_lightning.json -45cb2b91645f64b35d5fe2d623d656e02020cfb0 data/ars_nouveau/recipes/glyph_linger.json -cd597326b462b00c4cb3e00e20b57848b8544c6d data/ars_nouveau/recipes/glyph_name.json -0fb93f333f3006cbffb7c6a768fbc9e4f9f011de data/ars_nouveau/recipes/glyph_orbit.json -8edfd26bba8f546ffd6b115ef8b8bedca85c1c37 data/ars_nouveau/recipes/glyph_phantom_block.json -92a3da8010db95c33d5ad2e28988149dd52024ac data/ars_nouveau/recipes/glyph_pickup.json -f74bb17bfe562f93d8436498878f5d98adff115b data/ars_nouveau/recipes/glyph_pierce.json -bc6028c06d2c6725c45822a80490ee9850a9818c data/ars_nouveau/recipes/glyph_place_block.json -66f999c678a78ae79763a2ef17822fdb7a5e0003 data/ars_nouveau/recipes/glyph_projectile.json -3952cc5e5c1648af8183f048ab4f1f45491cc7e5 data/ars_nouveau/recipes/glyph_pull.json -44ee117ed99d031c5b53b43167cb9eb7bb23277d data/ars_nouveau/recipes/glyph_randomize.json -b8d19e6007f734228ff5c3cc77a47739d0e22c3d data/ars_nouveau/recipes/glyph_redstone_signal.json -4fd550580851766be4ff0c2890d1c50f17699000 data/ars_nouveau/recipes/glyph_rotate.json -666a060411ed52137c2b3fb7a6c09a6d967d4a97 data/ars_nouveau/recipes/glyph_rune.json -f881f9e2e66389c7476338d9dac2499718b21c33 data/ars_nouveau/recipes/glyph_self.json -2b08d1ded4ef1b5c692f25ea4c9ab18f41677056 data/ars_nouveau/recipes/glyph_sense_magic.json -bffd66f9ba9907dce9e3a92c0316e14a92c1e77a data/ars_nouveau/recipes/glyph_sensitive.json -886f2211c9bfd0c105c13fa4c16c5ed7f983677f data/ars_nouveau/recipes/glyph_slowfall.json -e23f69d25ee927e35ec2d27415654635a57699d3 data/ars_nouveau/recipes/glyph_smelt.json -665ec7348ec90589ed28c638582a6e378a1f4a65 data/ars_nouveau/recipes/glyph_snare.json -b5bba37bd4768ea3f083378fbf9cab84ba7a6f8e data/ars_nouveau/recipes/glyph_split.json -3be4d85a117ac02fb085bf0e05398bd750c02c19 data/ars_nouveau/recipes/glyph_summon_decoy.json -353218b388d951fc2626c957eef2ceef40dc552e data/ars_nouveau/recipes/glyph_summon_steed.json -cb52a0151b23d440d7cb408c57da81521b6a3240 data/ars_nouveau/recipes/glyph_summon_undead.json -9106bd510401b2d4b322a8fcff280aefb5b7c8e3 data/ars_nouveau/recipes/glyph_summon_vex.json -882e1bb46ced8b0b5cdabec1efb9b6e501ac84d1 data/ars_nouveau/recipes/glyph_summon_wolves.json -5c4d580cb5c5d23ee861e9877cec17b525c33232 data/ars_nouveau/recipes/glyph_toss.json -6203889841c33fad76490d252c49d44cf5480a4f data/ars_nouveau/recipes/glyph_touch.json -73cac8ef303a09fc4d4983667634473c6ec2ba93 data/ars_nouveau/recipes/glyph_underfoot.json -73fcc563c61d67a8d13fcf3173792f5870d81332 data/ars_nouveau/recipes/glyph_wall.json -56be773111a9c8c80e4a58e7fb31330b9a263bee data/ars_nouveau/recipes/glyph_wind_shear.json -6872442625e3e5c91a8212221b0d42e1bad4d196 data/ars_nouveau/recipes/glyph_wither.json -90c1991b4da7582d59891b3779966c08f2b4b11d data/ars_nouveau/recipes/reset.json -1e7ed0579d489e3f57ce351e43bc3466ca8925a5 data/ars_nouveau/recipes/rewind.json -bae3dc70f49ed0abc765dfd63e7321a1eb5101cc data/ars_nouveau/recipes/wololo.json +// 1.21 2024-07-07T11:53:40.7740417 Glyph Recipes +e4ef5c317ca1bb6d7ff64e6e65dbd41428eb9717 data/ars_nouveau/recipe/burst.json +9913a7b479e3ac1c0da2614ffae49ebaf026e6f7 data/ars_nouveau/recipe/glyph_accelerate.json +7032acba1fd2e577cec1e9e3a48331c862522b38 data/ars_nouveau/recipe/glyph_amplify.json +0e9bff6dbf895ba80b0bd5bcde200152032a087c data/ars_nouveau/recipe/glyph_animate_block.json +8bd925d7db4de20b8622eb3d39fcc082ac4d25fd data/ars_nouveau/recipe/glyph_aoe.json +15b965d4e21561025f9c74225ce5f9299abfe2ea data/ars_nouveau/recipe/glyph_blink.json +8de13db95f7d14dbf144d5cb3aaf705a45d195c8 data/ars_nouveau/recipe/glyph_bounce.json +c12a30b265277c1e793045454de09509a70564ba data/ars_nouveau/recipe/glyph_break.json +ffbb7d49317cff93082873399be237a2508e3695 data/ars_nouveau/recipe/glyph_cold_snap.json +45a9f8b6f07e6532ded8011f48a931a036c4c3d7 data/ars_nouveau/recipe/glyph_conjure_water.json +f6b8f292e7d187f2b21b7c87e113f6f1aeef29fb data/ars_nouveau/recipe/glyph_craft.json +81d95aba0686c38f16c8746ca016be871df8d1ea data/ars_nouveau/recipe/glyph_crush.json +88ea95676a6b9fd44d9da33d7f505241dea82e78 data/ars_nouveau/recipe/glyph_cut.json +3cad5c66a601dacf6bb5d08f31ec6b98b9391514 data/ars_nouveau/recipe/glyph_dampen.json +8a008779d3add831619a4081b16a4c9bea2dfe0f data/ars_nouveau/recipe/glyph_decelerate.json +23a4e63c84e9b3cbc9c972cf768ebb2b8bcea765 data/ars_nouveau/recipe/glyph_delay.json +e82372cc310cfc6f749b6eec86e238b6815801f6 data/ars_nouveau/recipe/glyph_dispel.json +4daa3b4f4849bfa6b17cc87ec029181f83eb115b data/ars_nouveau/recipe/glyph_duration_down.json +59ce04f1c3bd86741e586cbe21a8e232817de060 data/ars_nouveau/recipe/glyph_ender_inventory.json +c7d88c8b291fb8a16d644b0a123e52afbabe82e5 data/ars_nouveau/recipe/glyph_evaporate.json +3178a5019d00ca334d8b0f3a3de2a7e72f3a1a73 data/ars_nouveau/recipe/glyph_exchange.json +f4e201d11e39459b017809128a699e8604790c52 data/ars_nouveau/recipe/glyph_explosion.json +ab103fd6bf4c5125ed473191184c638168b79d13 data/ars_nouveau/recipe/glyph_extend_time.json +12e57017df0e322c9878840fdfff8d97a78ed2ec data/ars_nouveau/recipe/glyph_extract.json +9dce84836e77e0510301136613311b82147e23a9 data/ars_nouveau/recipe/glyph_fangs.json +14112a9c8c2aaaf5d482aa97c83d1f07f088c53d data/ars_nouveau/recipe/glyph_fell.json +409742ef2cf5d148f55c71a4a811551747569b60 data/ars_nouveau/recipe/glyph_firework.json +d1e68fdd9075b82c6829f19902989d5194e85b1f data/ars_nouveau/recipe/glyph_flare.json +db3cccf344ed76c5e73c6d1c7939495ea7bf2ff4 data/ars_nouveau/recipe/glyph_fortune.json +b156d1b81c65374e3ba9faedfb3d445d722e26ff data/ars_nouveau/recipe/glyph_freeze.json +fe4bc1ee1d457b7c3c6e8dd646f057688e493bf7 data/ars_nouveau/recipe/glyph_glide.json +56c8a1604b5a71e248db1a231cde67208bde3fa5 data/ars_nouveau/recipe/glyph_gravity.json +dd60a4ed00289c81dcccebad7b40bf5163243f60 data/ars_nouveau/recipe/glyph_grow.json +78ad0604b7b5127af60333497bd7627ea13c8e7c data/ars_nouveau/recipe/glyph_gust.json +febe999646d4a63714754ee8a9ad1ebeab97911c data/ars_nouveau/recipe/glyph_harm.json +9dbc6193bd7d3bf47eec6728c9ded37fc16216a9 data/ars_nouveau/recipe/glyph_harvest.json +053e9548d8b4748a43e7c6ec1408095f40952537 data/ars_nouveau/recipe/glyph_heal.json +8a6053bd3bb15e8fe990c6dc35f92e7e1271966e data/ars_nouveau/recipe/glyph_hex.json +06d96b9d2a92aacbccf400ebfc2e794376394e82 data/ars_nouveau/recipe/glyph_ignite.json +4b9d7ff36ab385619aebee5ad77417b20e0b356e data/ars_nouveau/recipe/glyph_infuse.json +35c08f159f0b64ef31645294bb57621c96942476 data/ars_nouveau/recipe/glyph_intangible.json +74110848bfcbd802ce0bb9e64913bff220e61081 data/ars_nouveau/recipe/glyph_interact.json +d68657caa28efee45bc9864ee1f48523c1e275c2 data/ars_nouveau/recipe/glyph_invisibility.json +888d6bcc4870ca81f5f764dbdb1c8f41a1828375 data/ars_nouveau/recipe/glyph_launch.json +ba8fbf41205c71635b2f83160f3807aa1365f668 data/ars_nouveau/recipe/glyph_leap.json +8826bf4f65d755e461ef9711ea7687caa41c8d0e data/ars_nouveau/recipe/glyph_light.json +071bbf896c39e6af31d79586f7797f3fa9f49223 data/ars_nouveau/recipe/glyph_lightning.json +45cb2b91645f64b35d5fe2d623d656e02020cfb0 data/ars_nouveau/recipe/glyph_linger.json +cd597326b462b00c4cb3e00e20b57848b8544c6d data/ars_nouveau/recipe/glyph_name.json +0fb93f333f3006cbffb7c6a768fbc9e4f9f011de data/ars_nouveau/recipe/glyph_orbit.json +8edfd26bba8f546ffd6b115ef8b8bedca85c1c37 data/ars_nouveau/recipe/glyph_phantom_block.json +92a3da8010db95c33d5ad2e28988149dd52024ac data/ars_nouveau/recipe/glyph_pickup.json +f74bb17bfe562f93d8436498878f5d98adff115b data/ars_nouveau/recipe/glyph_pierce.json +bc6028c06d2c6725c45822a80490ee9850a9818c data/ars_nouveau/recipe/glyph_place_block.json +66f999c678a78ae79763a2ef17822fdb7a5e0003 data/ars_nouveau/recipe/glyph_projectile.json +3952cc5e5c1648af8183f048ab4f1f45491cc7e5 data/ars_nouveau/recipe/glyph_pull.json +44ee117ed99d031c5b53b43167cb9eb7bb23277d data/ars_nouveau/recipe/glyph_randomize.json +b8d19e6007f734228ff5c3cc77a47739d0e22c3d data/ars_nouveau/recipe/glyph_redstone_signal.json +4fd550580851766be4ff0c2890d1c50f17699000 data/ars_nouveau/recipe/glyph_rotate.json +666a060411ed52137c2b3fb7a6c09a6d967d4a97 data/ars_nouveau/recipe/glyph_rune.json +f881f9e2e66389c7476338d9dac2499718b21c33 data/ars_nouveau/recipe/glyph_self.json +2b08d1ded4ef1b5c692f25ea4c9ab18f41677056 data/ars_nouveau/recipe/glyph_sense_magic.json +bffd66f9ba9907dce9e3a92c0316e14a92c1e77a data/ars_nouveau/recipe/glyph_sensitive.json +886f2211c9bfd0c105c13fa4c16c5ed7f983677f data/ars_nouveau/recipe/glyph_slowfall.json +e23f69d25ee927e35ec2d27415654635a57699d3 data/ars_nouveau/recipe/glyph_smelt.json +665ec7348ec90589ed28c638582a6e378a1f4a65 data/ars_nouveau/recipe/glyph_snare.json +b5bba37bd4768ea3f083378fbf9cab84ba7a6f8e data/ars_nouveau/recipe/glyph_split.json +3be4d85a117ac02fb085bf0e05398bd750c02c19 data/ars_nouveau/recipe/glyph_summon_decoy.json +353218b388d951fc2626c957eef2ceef40dc552e data/ars_nouveau/recipe/glyph_summon_steed.json +cb52a0151b23d440d7cb408c57da81521b6a3240 data/ars_nouveau/recipe/glyph_summon_undead.json +9106bd510401b2d4b322a8fcff280aefb5b7c8e3 data/ars_nouveau/recipe/glyph_summon_vex.json +882e1bb46ced8b0b5cdabec1efb9b6e501ac84d1 data/ars_nouveau/recipe/glyph_summon_wolves.json +5c4d580cb5c5d23ee861e9877cec17b525c33232 data/ars_nouveau/recipe/glyph_toss.json +6203889841c33fad76490d252c49d44cf5480a4f data/ars_nouveau/recipe/glyph_touch.json +73cac8ef303a09fc4d4983667634473c6ec2ba93 data/ars_nouveau/recipe/glyph_underfoot.json +73fcc563c61d67a8d13fcf3173792f5870d81332 data/ars_nouveau/recipe/glyph_wall.json +56be773111a9c8c80e4a58e7fb31330b9a263bee data/ars_nouveau/recipe/glyph_wind_shear.json +6872442625e3e5c91a8212221b0d42e1bad4d196 data/ars_nouveau/recipe/glyph_wither.json +90c1991b4da7582d59891b3779966c08f2b4b11d data/ars_nouveau/recipe/reset.json +1e7ed0579d489e3f57ce351e43bc3466ca8925a5 data/ars_nouveau/recipe/rewind.json +bae3dc70f49ed0abc765dfd63e7321a1eb5101cc data/ars_nouveau/recipe/wololo.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/abjuration_essence.json b/src/generated/resources/data/ars_nouveau/recipe/abjuration_essence.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/abjuration_essence.json rename to src/generated/resources/data/ars_nouveau/recipe/abjuration_essence.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/air_essence.json b/src/generated/resources/data/ars_nouveau/recipe/air_essence.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/air_essence.json rename to src/generated/resources/data/ars_nouveau/recipe/air_essence.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/alchemists_crown.json b/src/generated/resources/data/ars_nouveau/recipe/alchemists_crown.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/alchemists_crown.json rename to src/generated/resources/data/ars_nouveau/recipe/alchemists_crown.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/amethyst.json b/src/generated/resources/data/ars_nouveau/recipe/amethyst.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/amethyst.json rename to src/generated/resources/data/ars_nouveau/recipe/amethyst.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/amethyst_block.json b/src/generated/resources/data/ars_nouveau/recipe/amethyst_block.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/amethyst_block.json rename to src/generated/resources/data/ars_nouveau/recipe/amethyst_block.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/amplify_arrow.json b/src/generated/resources/data/ars_nouveau/recipe/amplify_arrow.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/amplify_arrow.json rename to src/generated/resources/data/ars_nouveau/recipe/amplify_arrow.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/amulet_of_mana_boost.json b/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_boost.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/amulet_of_mana_boost.json rename to src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_boost.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/amulet_of_mana_regen.json b/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_regen.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/amulet_of_mana_regen.json rename to src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_regen.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/aqua_affinity_1.json b/src/generated/resources/data/ars_nouveau/recipe/aqua_affinity_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/aqua_affinity_1.json rename to src/generated/resources/data/ars_nouveau/recipe/aqua_affinity_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/arcanist_boots.json b/src/generated/resources/data/ars_nouveau/recipe/arcanist_boots.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/arcanist_boots.json rename to src/generated/resources/data/ars_nouveau/recipe/arcanist_boots.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/arcanist_hood.json b/src/generated/resources/data/ars_nouveau/recipe/arcanist_hood.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/arcanist_hood.json rename to src/generated/resources/data/ars_nouveau/recipe/arcanist_hood.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/arcanist_leggings.json b/src/generated/resources/data/ars_nouveau/recipe/arcanist_leggings.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/arcanist_leggings.json rename to src/generated/resources/data/ars_nouveau/recipe/arcanist_leggings.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/arcanist_robes.json b/src/generated/resources/data/ars_nouveau/recipe/arcanist_robes.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/arcanist_robes.json rename to src/generated/resources/data/ars_nouveau/recipe/arcanist_robes.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_1.json b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_1.json rename to src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_2.json b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_2.json rename to src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_3.json b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_3.json rename to src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_4.json b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_4.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_4.json rename to src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_4.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_5.json b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_5.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/bane_of_arthropods_5.json rename to src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_5.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/battlemage_boots.json b/src/generated/resources/data/ars_nouveau/recipe/battlemage_boots.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/battlemage_boots.json rename to src/generated/resources/data/ars_nouveau/recipe/battlemage_boots.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/battlemage_hood.json b/src/generated/resources/data/ars_nouveau/recipe/battlemage_hood.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/battlemage_hood.json rename to src/generated/resources/data/ars_nouveau/recipe/battlemage_hood.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/battlemage_leggings.json b/src/generated/resources/data/ars_nouveau/recipe/battlemage_leggings.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/battlemage_leggings.json rename to src/generated/resources/data/ars_nouveau/recipe/battlemage_leggings.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/battlemage_robes.json b/src/generated/resources/data/ars_nouveau/recipe/battlemage_robes.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/battlemage_robes.json rename to src/generated/resources/data/ars_nouveau/recipe/battlemage_robes.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/belt_of_levitation.json b/src/generated/resources/data/ars_nouveau/recipe/belt_of_levitation.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/belt_of_levitation.json rename to src/generated/resources/data/ars_nouveau/recipe/belt_of_levitation.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/belt_of_unstable_gifts.json b/src/generated/resources/data/ars_nouveau/recipe/belt_of_unstable_gifts.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/belt_of_unstable_gifts.json rename to src/generated/resources/data/ars_nouveau/recipe/belt_of_unstable_gifts.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/blast_protection_1.json b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/blast_protection_1.json rename to src/generated/resources/data/ars_nouveau/recipe/blast_protection_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/blast_protection_2.json b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/blast_protection_2.json rename to src/generated/resources/data/ars_nouveau/recipe/blast_protection_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/blast_protection_3.json b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/blast_protection_3.json rename to src/generated/resources/data/ars_nouveau/recipe/blast_protection_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/blast_protection_4.json b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_4.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/blast_protection_4.json rename to src/generated/resources/data/ars_nouveau/recipe/blast_protection_4.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/blue_dye.json b/src/generated/resources/data/ars_nouveau/recipe/blue_dye.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/blue_dye.json rename to src/generated/resources/data/ars_nouveau/recipe/blue_dye.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/brazier_relay.json b/src/generated/resources/data/ars_nouveau/recipe/brazier_relay.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/brazier_relay.json rename to src/generated/resources/data/ars_nouveau/recipe/brazier_relay.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/brown_dye.json b/src/generated/resources/data/ars_nouveau/recipe/brown_dye.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/brown_dye.json rename to src/generated/resources/data/ars_nouveau/recipe/brown_dye.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/budding_conversion/budding_amethyst.json b/src/generated/resources/data/ars_nouveau/recipe/budding_conversion/budding_amethyst.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/budding_conversion/budding_amethyst.json rename to src/generated/resources/data/ars_nouveau/recipe/budding_conversion/budding_amethyst.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/burst.json b/src/generated/resources/data/ars_nouveau/recipe/burst.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/burst.json rename to src/generated/resources/data/ars_nouveau/recipe/burst.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/cobblestone.json b/src/generated/resources/data/ars_nouveau/recipe/cobblestone.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/cobblestone.json rename to src/generated/resources/data/ars_nouveau/recipe/cobblestone.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/conjuration_essence.json b/src/generated/resources/data/ars_nouveau/recipe/conjuration_essence.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/conjuration_essence.json rename to src/generated/resources/data/ars_nouveau/recipe/conjuration_essence.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/depth_strider_1.json b/src/generated/resources/data/ars_nouveau/recipe/depth_strider_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/depth_strider_1.json rename to src/generated/resources/data/ars_nouveau/recipe/depth_strider_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/depth_strider_2.json b/src/generated/resources/data/ars_nouveau/recipe/depth_strider_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/depth_strider_2.json rename to src/generated/resources/data/ars_nouveau/recipe/depth_strider_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/depth_strider_3.json b/src/generated/resources/data/ars_nouveau/recipe/depth_strider_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/depth_strider_3.json rename to src/generated/resources/data/ars_nouveau/recipe/depth_strider_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/dispel_entity/blaze_powder.json b/src/generated/resources/data/ars_nouveau/recipe/dispel_entity/blaze_powder.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/dispel_entity/blaze_powder.json rename to src/generated/resources/data/ars_nouveau/recipe/dispel_entity/blaze_powder.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/dominion_wand.json b/src/generated/resources/data/ars_nouveau/recipe/dominion_wand.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/dominion_wand.json rename to src/generated/resources/data/ars_nouveau/recipe/dominion_wand.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/drygmy_charm.json b/src/generated/resources/data/ars_nouveau/recipe/drygmy_charm.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/drygmy_charm.json rename to src/generated/resources/data/ars_nouveau/recipe/drygmy_charm.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/earth_essence.json b/src/generated/resources/data/ars_nouveau/recipe/earth_essence.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/earth_essence.json rename to src/generated/resources/data/ars_nouveau/recipe/earth_essence.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/efficiency_1.json b/src/generated/resources/data/ars_nouveau/recipe/efficiency_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/efficiency_1.json rename to src/generated/resources/data/ars_nouveau/recipe/efficiency_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/efficiency_2.json b/src/generated/resources/data/ars_nouveau/recipe/efficiency_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/efficiency_2.json rename to src/generated/resources/data/ars_nouveau/recipe/efficiency_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/efficiency_3.json b/src/generated/resources/data/ars_nouveau/recipe/efficiency_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/efficiency_3.json rename to src/generated/resources/data/ars_nouveau/recipe/efficiency_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/efficiency_4.json b/src/generated/resources/data/ars_nouveau/recipe/efficiency_4.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/efficiency_4.json rename to src/generated/resources/data/ars_nouveau/recipe/efficiency_4.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/efficiency_5.json b/src/generated/resources/data/ars_nouveau/recipe/efficiency_5.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/efficiency_5.json rename to src/generated/resources/data/ars_nouveau/recipe/efficiency_5.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/enchanters_eye.json b/src/generated/resources/data/ars_nouveau/recipe/enchanters_eye.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/enchanters_eye.json rename to src/generated/resources/data/ars_nouveau/recipe/enchanters_eye.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/enchanters_mirror.json b/src/generated/resources/data/ars_nouveau/recipe/enchanters_mirror.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/enchanters_mirror.json rename to src/generated/resources/data/ars_nouveau/recipe/enchanters_mirror.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/enchanters_shield.json b/src/generated/resources/data/ars_nouveau/recipe/enchanters_shield.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/enchanters_shield.json rename to src/generated/resources/data/ars_nouveau/recipe/enchanters_shield.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/enchanters_sword.json b/src/generated/resources/data/ars_nouveau/recipe/enchanters_sword.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/enchanters_sword.json rename to src/generated/resources/data/ars_nouveau/recipe/enchanters_sword.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/feather_falling_1.json b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/feather_falling_1.json rename to src/generated/resources/data/ars_nouveau/recipe/feather_falling_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/feather_falling_2.json b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/feather_falling_2.json rename to src/generated/resources/data/ars_nouveau/recipe/feather_falling_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/feather_falling_3.json b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/feather_falling_3.json rename to src/generated/resources/data/ars_nouveau/recipe/feather_falling_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/feather_falling_4.json b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_4.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/feather_falling_4.json rename to src/generated/resources/data/ars_nouveau/recipe/feather_falling_4.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_aspect_1.json b/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/fire_aspect_1.json rename to src/generated/resources/data/ars_nouveau/recipe/fire_aspect_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_aspect_2.json b/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/fire_aspect_2.json rename to src/generated/resources/data/ars_nouveau/recipe/fire_aspect_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_essence.json b/src/generated/resources/data/ars_nouveau/recipe/fire_essence.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/fire_essence.json rename to src/generated/resources/data/ars_nouveau/recipe/fire_essence.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_protection_1.json b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/fire_protection_1.json rename to src/generated/resources/data/ars_nouveau/recipe/fire_protection_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_protection_2.json b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/fire_protection_2.json rename to src/generated/resources/data/ars_nouveau/recipe/fire_protection_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_protection_3.json b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/fire_protection_3.json rename to src/generated/resources/data/ars_nouveau/recipe/fire_protection_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_protection_4.json b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_4.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/fire_protection_4.json rename to src/generated/resources/data/ars_nouveau/recipe/fire_protection_4.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/fire_protection_5.json b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_5.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/fire_protection_5.json rename to src/generated/resources/data/ars_nouveau/recipe/fire_protection_5.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/first_armor_upgrade.json b/src/generated/resources/data/ars_nouveau/recipe/first_armor_upgrade.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/first_armor_upgrade.json rename to src/generated/resources/data/ars_nouveau/recipe/first_armor_upgrade.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/flame_1.json b/src/generated/resources/data/ars_nouveau/recipe/flame_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/flame_1.json rename to src/generated/resources/data/ars_nouveau/recipe/flame_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/fortune_1.json b/src/generated/resources/data/ars_nouveau/recipe/fortune_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/fortune_1.json rename to src/generated/resources/data/ars_nouveau/recipe/fortune_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/fortune_2.json b/src/generated/resources/data/ars_nouveau/recipe/fortune_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/fortune_2.json rename to src/generated/resources/data/ars_nouveau/recipe/fortune_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/fortune_3.json b/src/generated/resources/data/ars_nouveau/recipe/fortune_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/fortune_3.json rename to src/generated/resources/data/ars_nouveau/recipe/fortune_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glowstone_block_to_dust.json b/src/generated/resources/data/ars_nouveau/recipe/glowstone_block_to_dust.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glowstone_block_to_dust.json rename to src/generated/resources/data/ars_nouveau/recipe/glowstone_block_to_dust.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_accelerate.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_accelerate.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_accelerate.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_accelerate.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_amplify.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_amplify.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_amplify.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_amplify.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_animate_block.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_animate_block.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_animate_block.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_animate_block.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_aoe.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_aoe.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_aoe.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_aoe.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_blink.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_blink.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_blink.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_blink.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_bounce.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_bounce.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_bounce.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_bounce.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_break.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_break.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_break.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_break.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_cold_snap.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_cold_snap.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_cold_snap.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_cold_snap.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_conjure_water.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_conjure_water.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_conjure_water.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_conjure_water.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_craft.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_craft.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_craft.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_craft.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_crush.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_crush.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_crush.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_crush.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_cut.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_cut.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_cut.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_cut.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_dampen.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_dampen.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_dampen.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_dampen.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_decelerate.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_decelerate.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_decelerate.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_decelerate.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_delay.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_delay.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_delay.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_delay.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_dispel.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_dispel.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_dispel.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_dispel.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_duration_down.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_duration_down.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_duration_down.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_duration_down.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_ender_inventory.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_ender_inventory.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_ender_inventory.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_ender_inventory.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_evaporate.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_evaporate.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_evaporate.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_evaporate.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_exchange.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_exchange.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_exchange.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_exchange.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_explosion.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_explosion.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_explosion.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_explosion.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_extend_time.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_extend_time.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_extend_time.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_extend_time.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_extract.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_extract.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_extract.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_extract.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_fangs.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_fangs.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_fangs.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_fangs.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_fell.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_fell.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_fell.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_fell.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_firework.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_firework.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_firework.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_firework.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_flare.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_flare.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_flare.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_flare.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_fortune.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_fortune.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_fortune.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_fortune.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_freeze.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_freeze.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_freeze.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_freeze.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_glide.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_glide.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_glide.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_glide.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_gravity.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_gravity.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_gravity.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_gravity.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_grow.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_grow.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_grow.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_grow.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_gust.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_gust.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_gust.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_gust.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_harm.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_harm.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_harm.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_harm.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_harvest.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_harvest.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_harvest.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_harvest.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_heal.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_heal.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_heal.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_heal.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_hex.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_hex.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_hex.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_hex.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_ignite.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_ignite.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_ignite.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_ignite.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_infuse.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_infuse.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_infuse.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_infuse.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_intangible.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_intangible.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_intangible.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_intangible.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_interact.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_interact.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_interact.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_interact.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_invisibility.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_invisibility.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_invisibility.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_invisibility.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_launch.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_launch.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_launch.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_launch.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_leap.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_leap.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_leap.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_leap.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_light.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_light.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_light.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_light.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_lightning.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_lightning.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_lightning.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_lightning.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_linger.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_linger.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_linger.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_linger.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_name.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_name.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_name.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_name.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_orbit.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_orbit.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_orbit.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_orbit.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_phantom_block.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_phantom_block.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_phantom_block.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_phantom_block.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_pickup.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_pickup.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_pickup.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_pickup.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_pierce.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_pierce.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_pierce.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_pierce.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_place_block.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_place_block.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_place_block.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_place_block.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_projectile.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_projectile.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_projectile.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_projectile.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_pull.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_pull.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_pull.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_pull.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_randomize.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_randomize.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_randomize.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_randomize.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_redstone_signal.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_redstone_signal.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_redstone_signal.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_redstone_signal.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_rotate.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_rotate.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_rotate.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_rotate.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_rune.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_rune.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_rune.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_rune.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_self.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_self.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_self.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_self.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_sense_magic.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_sense_magic.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_sense_magic.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_sense_magic.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_sensitive.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_sensitive.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_sensitive.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_sensitive.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_slowfall.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_slowfall.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_slowfall.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_slowfall.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_smelt.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_smelt.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_smelt.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_smelt.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_snare.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_snare.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_snare.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_snare.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_split.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_split.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_split.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_split.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_decoy.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_decoy.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_summon_decoy.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_summon_decoy.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_steed.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_steed.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_summon_steed.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_summon_steed.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_undead.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_undead.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_summon_undead.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_summon_undead.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_vex.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_vex.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_summon_vex.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_summon_vex.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_summon_wolves.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_wolves.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_summon_wolves.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_summon_wolves.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_toss.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_toss.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_toss.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_toss.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_touch.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_touch.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_touch.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_touch.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_underfoot.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_underfoot.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_underfoot.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_underfoot.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_wall.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_wall.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_wall.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_wall.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_wind_shear.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_wind_shear.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_wind_shear.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_wind_shear.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/glyph_wither.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_wither.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/glyph_wither.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_wither.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/gravel.json b/src/generated/resources/data/ars_nouveau/recipe/gravel.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/gravel.json rename to src/generated/resources/data/ars_nouveau/recipe/gravel.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/infinity_1.json b/src/generated/resources/data/ars_nouveau/recipe/infinity_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/infinity_1.json rename to src/generated/resources/data/ars_nouveau/recipe/infinity_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/jar_of_light.json b/src/generated/resources/data/ars_nouveau/recipe/jar_of_light.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/jar_of_light.json rename to src/generated/resources/data/ars_nouveau/recipe/jar_of_light.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/jump_ring.json b/src/generated/resources/data/ars_nouveau/recipe/jump_ring.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/jump_ring.json rename to src/generated/resources/data/ars_nouveau/recipe/jump_ring.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/knockback_1.json b/src/generated/resources/data/ars_nouveau/recipe/knockback_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/knockback_1.json rename to src/generated/resources/data/ars_nouveau/recipe/knockback_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/knockback_2.json b/src/generated/resources/data/ars_nouveau/recipe/knockback_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/knockback_2.json rename to src/generated/resources/data/ars_nouveau/recipe/knockback_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/lapis.json b/src/generated/resources/data/ars_nouveau/recipe/lapis.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/lapis.json rename to src/generated/resources/data/ars_nouveau/recipe/lapis.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/light_blue_dye.json b/src/generated/resources/data/ars_nouveau/recipe/light_blue_dye.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/light_blue_dye.json rename to src/generated/resources/data/ars_nouveau/recipe/light_blue_dye.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_azure.json b/src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_azure.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_azure.json rename to src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_azure.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_oxeye.json b/src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_oxeye.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_oxeye.json rename to src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_oxeye.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_tulip.json b/src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_tulip.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/light_gray_dye_tulip.json rename to src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_tulip.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/lingering_flask_cannon.json b/src/generated/resources/data/ars_nouveau/recipe/lingering_flask_cannon.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/lingering_flask_cannon.json rename to src/generated/resources/data/ars_nouveau/recipe/lingering_flask_cannon.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/looting_1.json b/src/generated/resources/data/ars_nouveau/recipe/looting_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/looting_1.json rename to src/generated/resources/data/ars_nouveau/recipe/looting_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/looting_2.json b/src/generated/resources/data/ars_nouveau/recipe/looting_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/looting_2.json rename to src/generated/resources/data/ars_nouveau/recipe/looting_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/looting_3.json b/src/generated/resources/data/ars_nouveau/recipe/looting_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/looting_3.json rename to src/generated/resources/data/ars_nouveau/recipe/looting_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/magebloom_crop.json b/src/generated/resources/data/ars_nouveau/recipe/magebloom_crop.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/magebloom_crop.json rename to src/generated/resources/data/ars_nouveau/recipe/magebloom_crop.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/magenta_dye.json b/src/generated/resources/data/ars_nouveau/recipe/magenta_dye.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/magenta_dye.json rename to src/generated/resources/data/ars_nouveau/recipe/magenta_dye.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/magenta_dye_lilac.json b/src/generated/resources/data/ars_nouveau/recipe/magenta_dye_lilac.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/magenta_dye_lilac.json rename to src/generated/resources/data/ars_nouveau/recipe/magenta_dye_lilac.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/mana_boost_1.json b/src/generated/resources/data/ars_nouveau/recipe/mana_boost_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/mana_boost_1.json rename to src/generated/resources/data/ars_nouveau/recipe/mana_boost_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/mana_boost_2.json b/src/generated/resources/data/ars_nouveau/recipe/mana_boost_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/mana_boost_2.json rename to src/generated/resources/data/ars_nouveau/recipe/mana_boost_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/mana_boost_3.json b/src/generated/resources/data/ars_nouveau/recipe/mana_boost_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/mana_boost_3.json rename to src/generated/resources/data/ars_nouveau/recipe/mana_boost_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/mana_regen_1.json b/src/generated/resources/data/ars_nouveau/recipe/mana_regen_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/mana_regen_1.json rename to src/generated/resources/data/ars_nouveau/recipe/mana_regen_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/mana_regen_2.json b/src/generated/resources/data/ars_nouveau/recipe/mana_regen_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/mana_regen_2.json rename to src/generated/resources/data/ars_nouveau/recipe/mana_regen_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/mana_regen_3.json b/src/generated/resources/data/ars_nouveau/recipe/mana_regen_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/mana_regen_3.json rename to src/generated/resources/data/ars_nouveau/recipe/mana_regen_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/manipulation_essence.json b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/manipulation_essence.json rename to src/generated/resources/data/ars_nouveau/recipe/manipulation_essence.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/multishot_1.json b/src/generated/resources/data/ars_nouveau/recipe/multishot_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/multishot_1.json rename to src/generated/resources/data/ars_nouveau/recipe/multishot_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/orange_dye.json b/src/generated/resources/data/ars_nouveau/recipe/orange_dye.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/orange_dye.json rename to src/generated/resources/data/ars_nouveau/recipe/orange_dye.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/pierce_arrow.json b/src/generated/resources/data/ars_nouveau/recipe/pierce_arrow.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/pierce_arrow.json rename to src/generated/resources/data/ars_nouveau/recipe/pierce_arrow.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/piercing_1.json b/src/generated/resources/data/ars_nouveau/recipe/piercing_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/piercing_1.json rename to src/generated/resources/data/ars_nouveau/recipe/piercing_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/piercing_2.json b/src/generated/resources/data/ars_nouveau/recipe/piercing_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/piercing_2.json rename to src/generated/resources/data/ars_nouveau/recipe/piercing_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/piercing_3.json b/src/generated/resources/data/ars_nouveau/recipe/piercing_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/piercing_3.json rename to src/generated/resources/data/ars_nouveau/recipe/piercing_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/piercing_4.json b/src/generated/resources/data/ars_nouveau/recipe/piercing_4.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/piercing_4.json rename to src/generated/resources/data/ars_nouveau/recipe/piercing_4.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/pink_dye.json b/src/generated/resources/data/ars_nouveau/recipe/pink_dye.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/pink_dye.json rename to src/generated/resources/data/ars_nouveau/recipe/pink_dye.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/pink_dye_peony.json b/src/generated/resources/data/ars_nouveau/recipe/pink_dye_peony.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/pink_dye_peony.json rename to src/generated/resources/data/ars_nouveau/recipe/pink_dye_peony.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/potion_diffuser.json b/src/generated/resources/data/ars_nouveau/recipe/potion_diffuser.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/potion_diffuser.json rename to src/generated/resources/data/ars_nouveau/recipe/potion_diffuser.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/potion_flask.json b/src/generated/resources/data/ars_nouveau/recipe/potion_flask.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/potion_flask.json rename to src/generated/resources/data/ars_nouveau/recipe/potion_flask.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/potion_flask_amplify.json b/src/generated/resources/data/ars_nouveau/recipe/potion_flask_amplify.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/potion_flask_amplify.json rename to src/generated/resources/data/ars_nouveau/recipe/potion_flask_amplify.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/potion_flask_extend_time.json b/src/generated/resources/data/ars_nouveau/recipe/potion_flask_extend_time.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/potion_flask_extend_time.json rename to src/generated/resources/data/ars_nouveau/recipe/potion_flask_extend_time.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/potion_melder.json b/src/generated/resources/data/ars_nouveau/recipe/potion_melder.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/potion_melder.json rename to src/generated/resources/data/ars_nouveau/recipe/potion_melder.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/power_1.json b/src/generated/resources/data/ars_nouveau/recipe/power_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/power_1.json rename to src/generated/resources/data/ars_nouveau/recipe/power_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/power_2.json b/src/generated/resources/data/ars_nouveau/recipe/power_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/power_2.json rename to src/generated/resources/data/ars_nouveau/recipe/power_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/power_3.json b/src/generated/resources/data/ars_nouveau/recipe/power_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/power_3.json rename to src/generated/resources/data/ars_nouveau/recipe/power_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/power_4.json b/src/generated/resources/data/ars_nouveau/recipe/power_4.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/power_4.json rename to src/generated/resources/data/ars_nouveau/recipe/power_4.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/power_5.json b/src/generated/resources/data/ars_nouveau/recipe/power_5.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/power_5.json rename to src/generated/resources/data/ars_nouveau/recipe/power_5.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_1.json b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/projectile_protection_1.json rename to src/generated/resources/data/ars_nouveau/recipe/projectile_protection_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_2.json b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/projectile_protection_2.json rename to src/generated/resources/data/ars_nouveau/recipe/projectile_protection_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_3.json b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/projectile_protection_3.json rename to src/generated/resources/data/ars_nouveau/recipe/projectile_protection_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_4.json b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_4.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/projectile_protection_4.json rename to src/generated/resources/data/ars_nouveau/recipe/projectile_protection_4.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/projectile_protection_5.json b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_5.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/projectile_protection_5.json rename to src/generated/resources/data/ars_nouveau/recipe/projectile_protection_5.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/protection_1.json b/src/generated/resources/data/ars_nouveau/recipe/protection_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/protection_1.json rename to src/generated/resources/data/ars_nouveau/recipe/protection_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/protection_2.json b/src/generated/resources/data/ars_nouveau/recipe/protection_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/protection_2.json rename to src/generated/resources/data/ars_nouveau/recipe/protection_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/protection_3.json b/src/generated/resources/data/ars_nouveau/recipe/protection_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/protection_3.json rename to src/generated/resources/data/ars_nouveau/recipe/protection_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/protection_4.json b/src/generated/resources/data/ars_nouveau/recipe/protection_4.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/protection_4.json rename to src/generated/resources/data/ars_nouveau/recipe/protection_4.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/protection_5.json b/src/generated/resources/data/ars_nouveau/recipe/protection_5.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/protection_5.json rename to src/generated/resources/data/ars_nouveau/recipe/protection_5.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/punch_1.json b/src/generated/resources/data/ars_nouveau/recipe/punch_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/punch_1.json rename to src/generated/resources/data/ars_nouveau/recipe/punch_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/punch_2.json b/src/generated/resources/data/ars_nouveau/recipe/punch_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/punch_2.json rename to src/generated/resources/data/ars_nouveau/recipe/punch_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/quartz_block_to_quartz.json b/src/generated/resources/data/ars_nouveau/recipe/quartz_block_to_quartz.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/quartz_block_to_quartz.json rename to src/generated/resources/data/ars_nouveau/recipe/quartz_block_to_quartz.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/quick_charge_1.json b/src/generated/resources/data/ars_nouveau/recipe/quick_charge_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/quick_charge_1.json rename to src/generated/resources/data/ars_nouveau/recipe/quick_charge_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/quick_charge_2.json b/src/generated/resources/data/ars_nouveau/recipe/quick_charge_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/quick_charge_2.json rename to src/generated/resources/data/ars_nouveau/recipe/quick_charge_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/quick_charge_3.json b/src/generated/resources/data/ars_nouveau/recipe/quick_charge_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/quick_charge_3.json rename to src/generated/resources/data/ars_nouveau/recipe/quick_charge_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/reactive.json b/src/generated/resources/data/ars_nouveau/recipe/reactive.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/reactive.json rename to src/generated/resources/data/ars_nouveau/recipe/reactive.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/reactive_2.json b/src/generated/resources/data/ars_nouveau/recipe/reactive_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/reactive_2.json rename to src/generated/resources/data/ars_nouveau/recipe/reactive_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/reactive_3.json b/src/generated/resources/data/ars_nouveau/recipe/reactive_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/reactive_3.json rename to src/generated/resources/data/ars_nouveau/recipe/reactive_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/reactive_4.json b/src/generated/resources/data/ars_nouveau/recipe/reactive_4.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/reactive_4.json rename to src/generated/resources/data/ars_nouveau/recipe/reactive_4.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/red_dye_beetroot.json b/src/generated/resources/data/ars_nouveau/recipe/red_dye_beetroot.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/red_dye_beetroot.json rename to src/generated/resources/data/ars_nouveau/recipe/red_dye_beetroot.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/red_dye_poppy.json b/src/generated/resources/data/ars_nouveau/recipe/red_dye_poppy.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/red_dye_poppy.json rename to src/generated/resources/data/ars_nouveau/recipe/red_dye_poppy.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/red_dye_rose_bush.json b/src/generated/resources/data/ars_nouveau/recipe/red_dye_rose_bush.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/red_dye_rose_bush.json rename to src/generated/resources/data/ars_nouveau/recipe/red_dye_rose_bush.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/red_dye_tulip.json b/src/generated/resources/data/ars_nouveau/recipe/red_dye_tulip.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/red_dye_tulip.json rename to src/generated/resources/data/ars_nouveau/recipe/red_dye_tulip.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/relay_collector.json b/src/generated/resources/data/ars_nouveau/recipe/relay_collector.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/relay_collector.json rename to src/generated/resources/data/ars_nouveau/recipe/relay_collector.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/relay_deposit.json b/src/generated/resources/data/ars_nouveau/recipe/relay_deposit.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/relay_deposit.json rename to src/generated/resources/data/ars_nouveau/recipe/relay_deposit.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/relay_splitter.json b/src/generated/resources/data/ars_nouveau/recipe/relay_splitter.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/relay_splitter.json rename to src/generated/resources/data/ars_nouveau/recipe/relay_splitter.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/relay_warp.json b/src/generated/resources/data/ars_nouveau/recipe/relay_warp.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/relay_warp.json rename to src/generated/resources/data/ars_nouveau/recipe/relay_warp.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/reset.json b/src/generated/resources/data/ars_nouveau/recipe/reset.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/reset.json rename to src/generated/resources/data/ars_nouveau/recipe/reset.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/respiration_1.json b/src/generated/resources/data/ars_nouveau/recipe/respiration_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/respiration_1.json rename to src/generated/resources/data/ars_nouveau/recipe/respiration_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/respiration_2.json b/src/generated/resources/data/ars_nouveau/recipe/respiration_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/respiration_2.json rename to src/generated/resources/data/ars_nouveau/recipe/respiration_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/respiration_3.json b/src/generated/resources/data/ars_nouveau/recipe/respiration_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/respiration_3.json rename to src/generated/resources/data/ars_nouveau/recipe/respiration_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/rewind.json b/src/generated/resources/data/ars_nouveau/recipe/rewind.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/rewind.json rename to src/generated/resources/data/ars_nouveau/recipe/rewind.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/ring_of_greater_discount.json b/src/generated/resources/data/ars_nouveau/recipe/ring_of_greater_discount.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/ring_of_greater_discount.json rename to src/generated/resources/data/ars_nouveau/recipe/ring_of_greater_discount.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/ring_of_lesser_discount.json b/src/generated/resources/data/ars_nouveau/recipe/ring_of_lesser_discount.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/ring_of_lesser_discount.json rename to src/generated/resources/data/ars_nouveau/recipe/ring_of_lesser_discount.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/sandstone_to_sand.json b/src/generated/resources/data/ars_nouveau/recipe/sandstone_to_sand.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/sandstone_to_sand.json rename to src/generated/resources/data/ars_nouveau/recipe/sandstone_to_sand.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/amethyst_blocks.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/scry_ritual/amethyst_blocks.json rename to src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/amethyst_gems.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/scry_ritual/amethyst_gems.json rename to src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/coal_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/coal_ores.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/scry_ritual/coal_ores.json rename to src/generated/resources/data/ars_nouveau/recipe/scry_ritual/coal_ores.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/copper_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/copper_ores.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/scry_ritual/copper_ores.json rename to src/generated/resources/data/ars_nouveau/recipe/scry_ritual/copper_ores.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/diamond_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/diamond_ores.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/scry_ritual/diamond_ores.json rename to src/generated/resources/data/ars_nouveau/recipe/scry_ritual/diamond_ores.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/emerald_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/emerald_ores.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/scry_ritual/emerald_ores.json rename to src/generated/resources/data/ars_nouveau/recipe/scry_ritual/emerald_ores.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/gold_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/gold_ores.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/scry_ritual/gold_ores.json rename to src/generated/resources/data/ars_nouveau/recipe/scry_ritual/gold_ores.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/iron_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/iron_ores.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/scry_ritual/iron_ores.json rename to src/generated/resources/data/ars_nouveau/recipe/scry_ritual/iron_ores.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/lapis_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/lapis_ores.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/scry_ritual/lapis_ores.json rename to src/generated/resources/data/ars_nouveau/recipe/scry_ritual/lapis_ores.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/netherite_scrap_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/netherite_scrap_ores.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/scry_ritual/netherite_scrap_ores.json rename to src/generated/resources/data/ars_nouveau/recipe/scry_ritual/netherite_scrap_ores.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/quartz_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/quartz_ores.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/scry_ritual/quartz_ores.json rename to src/generated/resources/data/ars_nouveau/recipe/scry_ritual/quartz_ores.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/scry_ritual/redstone_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/redstone_ores.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/scry_ritual/redstone_ores.json rename to src/generated/resources/data/ars_nouveau/recipe/scry_ritual/redstone_ores.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/scryers_oculus.json b/src/generated/resources/data/ars_nouveau/recipe/scryers_oculus.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/scryers_oculus.json rename to src/generated/resources/data/ars_nouveau/recipe/scryers_oculus.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/second_armor_upgrade.json b/src/generated/resources/data/ars_nouveau/recipe/second_armor_upgrade.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/second_armor_upgrade.json rename to src/generated/resources/data/ars_nouveau/recipe/second_armor_upgrade.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/shapers_focus.json b/src/generated/resources/data/ars_nouveau/recipe/shapers_focus.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/shapers_focus.json rename to src/generated/resources/data/ars_nouveau/recipe/shapers_focus.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/sharpness_1.json b/src/generated/resources/data/ars_nouveau/recipe/sharpness_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/sharpness_1.json rename to src/generated/resources/data/ars_nouveau/recipe/sharpness_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/sharpness_2.json b/src/generated/resources/data/ars_nouveau/recipe/sharpness_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/sharpness_2.json rename to src/generated/resources/data/ars_nouveau/recipe/sharpness_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/sharpness_3.json b/src/generated/resources/data/ars_nouveau/recipe/sharpness_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/sharpness_3.json rename to src/generated/resources/data/ars_nouveau/recipe/sharpness_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/sharpness_4.json b/src/generated/resources/data/ars_nouveau/recipe/sharpness_4.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/sharpness_4.json rename to src/generated/resources/data/ars_nouveau/recipe/sharpness_4.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/sharpness_5.json b/src/generated/resources/data/ars_nouveau/recipe/sharpness_5.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/sharpness_5.json rename to src/generated/resources/data/ars_nouveau/recipe/sharpness_5.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/silk_touch_1.json b/src/generated/resources/data/ars_nouveau/recipe/silk_touch_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/silk_touch_1.json rename to src/generated/resources/data/ars_nouveau/recipe/silk_touch_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/smite_1.json b/src/generated/resources/data/ars_nouveau/recipe/smite_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/smite_1.json rename to src/generated/resources/data/ars_nouveau/recipe/smite_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/smite_2.json b/src/generated/resources/data/ars_nouveau/recipe/smite_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/smite_2.json rename to src/generated/resources/data/ars_nouveau/recipe/smite_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/smite_3.json b/src/generated/resources/data/ars_nouveau/recipe/smite_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/smite_3.json rename to src/generated/resources/data/ars_nouveau/recipe/smite_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/smite_4.json b/src/generated/resources/data/ars_nouveau/recipe/smite_4.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/smite_4.json rename to src/generated/resources/data/ars_nouveau/recipe/smite_4.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/smite_5.json b/src/generated/resources/data/ars_nouveau/recipe/smite_5.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/smite_5.json rename to src/generated/resources/data/ars_nouveau/recipe/smite_5.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/sorcerer_boots.json b/src/generated/resources/data/ars_nouveau/recipe/sorcerer_boots.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/sorcerer_boots.json rename to src/generated/resources/data/ars_nouveau/recipe/sorcerer_boots.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/sorcerer_hood.json b/src/generated/resources/data/ars_nouveau/recipe/sorcerer_hood.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/sorcerer_hood.json rename to src/generated/resources/data/ars_nouveau/recipe/sorcerer_hood.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/sorcerer_leggings.json b/src/generated/resources/data/ars_nouveau/recipe/sorcerer_leggings.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/sorcerer_leggings.json rename to src/generated/resources/data/ars_nouveau/recipe/sorcerer_leggings.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/sorcerer_robes.json b/src/generated/resources/data/ars_nouveau/recipe/sorcerer_robes.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/sorcerer_robes.json rename to src/generated/resources/data/ars_nouveau/recipe/sorcerer_robes.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/spell_bow.json b/src/generated/resources/data/ars_nouveau/recipe/spell_bow.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/spell_bow.json rename to src/generated/resources/data/ars_nouveau/recipe/spell_bow.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/spell_crossbow.json b/src/generated/resources/data/ars_nouveau/recipe/spell_crossbow.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/spell_crossbow.json rename to src/generated/resources/data/ars_nouveau/recipe/spell_crossbow.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/spell_sensor.json b/src/generated/resources/data/ars_nouveau/recipe/spell_sensor.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/spell_sensor.json rename to src/generated/resources/data/ars_nouveau/recipe/spell_sensor.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/spell_turret.json b/src/generated/resources/data/ars_nouveau/recipe/spell_turret.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/spell_turret.json rename to src/generated/resources/data/ars_nouveau/recipe/spell_turret.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/spell_write.json b/src/generated/resources/data/ars_nouveau/recipe/spell_write.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/spell_write.json rename to src/generated/resources/data/ars_nouveau/recipe/spell_write.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/splash_flask_cannon.json b/src/generated/resources/data/ars_nouveau/recipe/splash_flask_cannon.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/splash_flask_cannon.json rename to src/generated/resources/data/ars_nouveau/recipe/splash_flask_cannon.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/split_arrow.json b/src/generated/resources/data/ars_nouveau/recipe/split_arrow.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/split_arrow.json rename to src/generated/resources/data/ars_nouveau/recipe/split_arrow.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/stable_warp_scroll.json b/src/generated/resources/data/ars_nouveau/recipe/stable_warp_scroll.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/stable_warp_scroll.json rename to src/generated/resources/data/ars_nouveau/recipe/stable_warp_scroll.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/starbuncle_charm.json b/src/generated/resources/data/ars_nouveau/recipe/starbuncle_charm.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/starbuncle_charm.json rename to src/generated/resources/data/ars_nouveau/recipe/starbuncle_charm.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/stone.json b/src/generated/resources/data/ars_nouveau/recipe/stone.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/stone.json rename to src/generated/resources/data/ars_nouveau/recipe/stone.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/storage_lectern.json b/src/generated/resources/data/ars_nouveau/recipe/storage_lectern.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/storage_lectern.json rename to src/generated/resources/data/ars_nouveau/recipe/storage_lectern.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/sugar_cane.json b/src/generated/resources/data/ars_nouveau/recipe/sugar_cane.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/sugar_cane.json rename to src/generated/resources/data/ars_nouveau/recipe/sugar_cane.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/summon_focus.json b/src/generated/resources/data/ars_nouveau/recipe/summon_focus.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/summon_focus.json rename to src/generated/resources/data/ars_nouveau/recipe/summon_focus.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/summon_ritual/bats.json b/src/generated/resources/data/ars_nouveau/recipe/summon_ritual/bats.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/summon_ritual/bats.json rename to src/generated/resources/data/ars_nouveau/recipe/summon_ritual/bats.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_1.json b/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_1.json rename to src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_2.json b/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_2.json rename to src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_3.json b/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/sweeping_edge_3.json rename to src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/terracotta.json b/src/generated/resources/data/ars_nouveau/recipe/terracotta.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/terracotta.json rename to src/generated/resources/data/ars_nouveau/recipe/terracotta.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thorns_1.json b/src/generated/resources/data/ars_nouveau/recipe/thorns_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thorns_1.json rename to src/generated/resources/data/ars_nouveau/recipe/thorns_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thorns_2.json b/src/generated/resources/data/ars_nouveau/recipe/thorns_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thorns_2.json rename to src/generated/resources/data/ars_nouveau/recipe/thorns_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thorns_3.json b/src/generated/resources/data/ars_nouveau/recipe/thorns_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thorns_3.json rename to src/generated/resources/data/ars_nouveau/recipe/thorns_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_amethyst_golem.json b/src/generated/resources/data/ars_nouveau/recipe/thread_amethyst_golem.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_amethyst_golem.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_amethyst_golem.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_chilling.json b/src/generated/resources/data/ars_nouveau/recipe/thread_chilling.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_chilling.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_chilling.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_depths.json b/src/generated/resources/data/ars_nouveau/recipe/thread_depths.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_depths.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_depths.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_drygmy.json b/src/generated/resources/data/ars_nouveau/recipe/thread_drygmy.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_drygmy.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_drygmy.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_feather.json b/src/generated/resources/data/ars_nouveau/recipe/thread_feather.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_feather.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_feather.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_gliding.json b/src/generated/resources/data/ars_nouveau/recipe/thread_gliding.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_gliding.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_gliding.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_heights.json b/src/generated/resources/data/ars_nouveau/recipe/thread_heights.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_heights.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_heights.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_high_step.json b/src/generated/resources/data/ars_nouveau/recipe/thread_high_step.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_high_step.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_high_step.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_immolation.json b/src/generated/resources/data/ars_nouveau/recipe/thread_immolation.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_immolation.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_immolation.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_kindling.json b/src/generated/resources/data/ars_nouveau/recipe/thread_kindling.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_kindling.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_kindling.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_life_drain.json b/src/generated/resources/data/ars_nouveau/recipe/thread_life_drain.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_life_drain.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_life_drain.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_magic_capacity.json b/src/generated/resources/data/ars_nouveau/recipe/thread_magic_capacity.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_magic_capacity.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_magic_capacity.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_repairing.json b/src/generated/resources/data/ars_nouveau/recipe/thread_repairing.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_repairing.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_repairing.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_spellpower.json b/src/generated/resources/data/ars_nouveau/recipe/thread_spellpower.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_spellpower.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_spellpower.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_starbuncle.json b/src/generated/resources/data/ars_nouveau/recipe/thread_starbuncle.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_starbuncle.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_starbuncle.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_undying.json b/src/generated/resources/data/ars_nouveau/recipe/thread_undying.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_undying.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_undying.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_warding.json b/src/generated/resources/data/ars_nouveau/recipe/thread_warding.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_warding.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_warding.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_whirlisprig.json b/src/generated/resources/data/ars_nouveau/recipe/thread_whirlisprig.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_whirlisprig.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_whirlisprig.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/thread_wixie.json b/src/generated/resources/data/ars_nouveau/recipe/thread_wixie.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/thread_wixie.json rename to src/generated/resources/data/ars_nouveau/recipe/thread_wixie.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/timer_spell_turret.json b/src/generated/resources/data/ars_nouveau/recipe/timer_spell_turret.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/timer_spell_turret.json rename to src/generated/resources/data/ars_nouveau/recipe/timer_spell_turret.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/unbreaking_1.json b/src/generated/resources/data/ars_nouveau/recipe/unbreaking_1.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/unbreaking_1.json rename to src/generated/resources/data/ars_nouveau/recipe/unbreaking_1.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/unbreaking_2.json b/src/generated/resources/data/ars_nouveau/recipe/unbreaking_2.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/unbreaking_2.json rename to src/generated/resources/data/ars_nouveau/recipe/unbreaking_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/unbreaking_3.json b/src/generated/resources/data/ars_nouveau/recipe/unbreaking_3.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/unbreaking_3.json rename to src/generated/resources/data/ars_nouveau/recipe/unbreaking_3.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/void_jar.json b/src/generated/resources/data/ars_nouveau/recipe/void_jar.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/void_jar.json rename to src/generated/resources/data/ars_nouveau/recipe/void_jar.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/wand.json b/src/generated/resources/data/ars_nouveau/recipe/wand.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/wand.json rename to src/generated/resources/data/ars_nouveau/recipe/wand.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/warp_scroll_copy.json b/src/generated/resources/data/ars_nouveau/recipe/warp_scroll_copy.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/warp_scroll_copy.json rename to src/generated/resources/data/ars_nouveau/recipe/warp_scroll_copy.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/water_essence.json b/src/generated/resources/data/ars_nouveau/recipe/water_essence.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/water_essence.json rename to src/generated/resources/data/ars_nouveau/recipe/water_essence.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/whirlisprig_charm.json b/src/generated/resources/data/ars_nouveau/recipe/whirlisprig_charm.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/whirlisprig_charm.json rename to src/generated/resources/data/ars_nouveau/recipe/whirlisprig_charm.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/white_dye.json b/src/generated/resources/data/ars_nouveau/recipe/white_dye.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/white_dye.json rename to src/generated/resources/data/ars_nouveau/recipe/white_dye.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/wixie_charm.json b/src/generated/resources/data/ars_nouveau/recipe/wixie_charm.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/wixie_charm.json rename to src/generated/resources/data/ars_nouveau/recipe/wixie_charm.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/wololo.json b/src/generated/resources/data/ars_nouveau/recipe/wololo.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/wololo.json rename to src/generated/resources/data/ars_nouveau/recipe/wololo.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/yellow_dye.json b/src/generated/resources/data/ars_nouveau/recipe/yellow_dye.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/yellow_dye.json rename to src/generated/resources/data/ars_nouveau/recipe/yellow_dye.json diff --git a/src/generated/resources/data/ars_nouveau/recipes/yellow_dye_sunflower.json b/src/generated/resources/data/ars_nouveau/recipe/yellow_dye_sunflower.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipes/yellow_dye_sunflower.json rename to src/generated/resources/data/ars_nouveau/recipe/yellow_dye_sunflower.json diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java index c1d6160613..62a89161d2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java @@ -1119,7 +1119,7 @@ protected static Path getRecipePath(Path pathIn, Item item) { } protected static Path getRecipePath(Path pathIn, String str) { - return pathIn.resolve("data/ars_nouveau/recipes/" + str + ".json"); + return pathIn.resolve("data/ars_nouveau/recipe/" + str + ".json"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java index 31eb381e2e..b4bf08fb9a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java @@ -39,7 +39,7 @@ public record Wrapper(ResourceLocation location, BuddingConversionRecipe recipe) } protected static Path getRecipePath(Path path, String id) { - return path.resolve("data/ars_nouveau/recipes/budding_conversion/" + id + ".json"); + return path.resolve("data/ars_nouveau/recipe/budding_conversion/" + id + ".json"); } /** diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java index 7ce269b08f..74f40c125e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java @@ -262,7 +262,7 @@ public void collectJsons(CachedOutput pOutput) { } protected Path getRecipePath(Path pathIn, String str) { - return pathIn.resolve("data/ars_nouveau/recipes/tomes/" + str + ".json"); + return pathIn.resolve("data/ars_nouveau/recipe/tomes/" + str + ".json"); } public CasterRecipeWrapper buildTome(String id, String name, Spell spell, String flavorText) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CrushRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CrushRecipeProvider.java index a73d3a2e9a..0fe8e2e672 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CrushRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CrushRecipeProvider.java @@ -89,7 +89,7 @@ public CrushRecipe asRecipe() { } private static Path getRecipePath(Path pathIn, String str) { - return pathIn.resolve("data/ars_nouveau/recipes/" + str + ".json"); + return pathIn.resolve("data/ars_nouveau/recipe/" + str + ".json"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java index 5a3dd20ffc..1a5bb2202e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java @@ -46,7 +46,7 @@ public record Wrapper(ResourceLocation location, DispelEntityRecipe recipe){ } protected static Path getRecipePath(Path path, String id) { - return path.resolve("data/ars_nouveau/recipes/dispel_entity/" + id + ".json"); + return path.resolve("data/ars_nouveau/recipe/dispel_entity/" + id + ".json"); } /** diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java index 60fe3c29e2..10b0de636c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java @@ -155,7 +155,7 @@ public int getExpFromTier(AbstractSpellPart spellPart) { } protected static Path getScribeGlyphPath(Path pathIn, Item glyph) { - return pathIn.resolve("data/ars_nouveau/recipes/" + getRegistryName(glyph).getPath() + ".json"); + return pathIn.resolve("data/ars_nouveau/recipe/" + getRegistryName(glyph).getPath() + ".json"); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java index f1c51000dc..671e1ab1c3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java @@ -12,6 +12,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.neoforged.neoforge.common.Tags; + import java.nio.file.Path; import java.util.ArrayList; import java.util.List; @@ -90,7 +91,7 @@ public void collectJsons(CachedOutput pOutput) { } private static Path getRecipePath(Path pathIn, String str) { - return pathIn.resolve("data/ars_nouveau/recipes/" + str + ".json"); + return pathIn.resolve("data/ars_nouveau/recipe/" + str + ".json"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java index 57192942c1..00e8cbcc0c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java @@ -60,7 +60,7 @@ private ResourceLocation forgeTag(String path) { } protected static Path getRecipePath(Path path, String id) { - return path.resolve("data/ars_nouveau/recipes/scry_ritual/" + id + ".json"); + return path.resolve("data/ars_nouveau/recipe/scry_ritual/" + id + ".json"); } /** diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java index 4d8c385c1f..6fef9dd38c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java @@ -40,7 +40,7 @@ protected void addEntries() { } protected static Path getRecipePath(Path path, String id) { - return path.resolve("data/ars_nouveau/recipes/summon_ritual/" + id + ".json"); + return path.resolve("data/ars_nouveau/recipe/summon_ritual/" + id + ".json"); } /** From 01251cb164b140e3abe6532ca343a57de6159a4e Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 7 Jul 2024 11:57:36 -0500 Subject: [PATCH 036/363] fix main data recipe folder --- .../{recipes => recipe}/apprentice_spell_book_upgrade.json | 0 .../{recipes => recipe}/archmage_spell_book_upgrade.json | 0 .../data/ars_nouveau/{recipes => recipe}/novice_spell_book.json | 0 .../ars_nouveau/{recipes => recipe}/potion_flask_amp_fill.json | 0 .../ars_nouveau/{recipes => recipe}/potion_flask_et_fill.json | 0 .../data/ars_nouveau/{recipes => recipe}/potion_flask_fill.json | 0 .../ars_nouveau/{recipes => recipe}/reset_stable_warp_scroll.json | 0 .../data/ars_nouveau/{recipes => recipe}/reset_warp_scroll.json | 0 .../data/ars_nouveau/{recipes => recipe}/tomes/alex_tome.json | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/data/ars_nouveau/{recipes => recipe}/apprentice_spell_book_upgrade.json (100%) rename src/main/resources/data/ars_nouveau/{recipes => recipe}/archmage_spell_book_upgrade.json (100%) rename src/main/resources/data/ars_nouveau/{recipes => recipe}/novice_spell_book.json (100%) rename src/main/resources/data/ars_nouveau/{recipes => recipe}/potion_flask_amp_fill.json (100%) rename src/main/resources/data/ars_nouveau/{recipes => recipe}/potion_flask_et_fill.json (100%) rename src/main/resources/data/ars_nouveau/{recipes => recipe}/potion_flask_fill.json (100%) rename src/main/resources/data/ars_nouveau/{recipes => recipe}/reset_stable_warp_scroll.json (100%) rename src/main/resources/data/ars_nouveau/{recipes => recipe}/reset_warp_scroll.json (100%) rename src/main/resources/data/ars_nouveau/{recipes => recipe}/tomes/alex_tome.json (100%) diff --git a/src/main/resources/data/ars_nouveau/recipes/apprentice_spell_book_upgrade.json b/src/main/resources/data/ars_nouveau/recipe/apprentice_spell_book_upgrade.json similarity index 100% rename from src/main/resources/data/ars_nouveau/recipes/apprentice_spell_book_upgrade.json rename to src/main/resources/data/ars_nouveau/recipe/apprentice_spell_book_upgrade.json diff --git a/src/main/resources/data/ars_nouveau/recipes/archmage_spell_book_upgrade.json b/src/main/resources/data/ars_nouveau/recipe/archmage_spell_book_upgrade.json similarity index 100% rename from src/main/resources/data/ars_nouveau/recipes/archmage_spell_book_upgrade.json rename to src/main/resources/data/ars_nouveau/recipe/archmage_spell_book_upgrade.json diff --git a/src/main/resources/data/ars_nouveau/recipes/novice_spell_book.json b/src/main/resources/data/ars_nouveau/recipe/novice_spell_book.json similarity index 100% rename from src/main/resources/data/ars_nouveau/recipes/novice_spell_book.json rename to src/main/resources/data/ars_nouveau/recipe/novice_spell_book.json diff --git a/src/main/resources/data/ars_nouveau/recipes/potion_flask_amp_fill.json b/src/main/resources/data/ars_nouveau/recipe/potion_flask_amp_fill.json similarity index 100% rename from src/main/resources/data/ars_nouveau/recipes/potion_flask_amp_fill.json rename to src/main/resources/data/ars_nouveau/recipe/potion_flask_amp_fill.json diff --git a/src/main/resources/data/ars_nouveau/recipes/potion_flask_et_fill.json b/src/main/resources/data/ars_nouveau/recipe/potion_flask_et_fill.json similarity index 100% rename from src/main/resources/data/ars_nouveau/recipes/potion_flask_et_fill.json rename to src/main/resources/data/ars_nouveau/recipe/potion_flask_et_fill.json diff --git a/src/main/resources/data/ars_nouveau/recipes/potion_flask_fill.json b/src/main/resources/data/ars_nouveau/recipe/potion_flask_fill.json similarity index 100% rename from src/main/resources/data/ars_nouveau/recipes/potion_flask_fill.json rename to src/main/resources/data/ars_nouveau/recipe/potion_flask_fill.json diff --git a/src/main/resources/data/ars_nouveau/recipes/reset_stable_warp_scroll.json b/src/main/resources/data/ars_nouveau/recipe/reset_stable_warp_scroll.json similarity index 100% rename from src/main/resources/data/ars_nouveau/recipes/reset_stable_warp_scroll.json rename to src/main/resources/data/ars_nouveau/recipe/reset_stable_warp_scroll.json diff --git a/src/main/resources/data/ars_nouveau/recipes/reset_warp_scroll.json b/src/main/resources/data/ars_nouveau/recipe/reset_warp_scroll.json similarity index 100% rename from src/main/resources/data/ars_nouveau/recipes/reset_warp_scroll.json rename to src/main/resources/data/ars_nouveau/recipe/reset_warp_scroll.json diff --git a/src/main/resources/data/ars_nouveau/recipes/tomes/alex_tome.json b/src/main/resources/data/ars_nouveau/recipe/tomes/alex_tome.json similarity index 100% rename from src/main/resources/data/ars_nouveau/recipes/tomes/alex_tome.json rename to src/main/resources/data/ars_nouveau/recipe/tomes/alex_tome.json From 615d287c3ae26d44f4ec556d9acc10fbfebfe971 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 7 Jul 2024 12:37:29 -0500 Subject: [PATCH 037/363] Fix book edit packets and radial menu --- .../arsnouveau/api/spell/SpellCaster.java | 8 ++-- .../arsnouveau/common/items/SpellBook.java | 6 +-- .../common/network/AbstractPacket.java | 2 +- .../arsnouveau/common/network/Networking.java | 4 +- .../common/network/PacketOpenSpellBook.java | 6 +-- .../common/network/PacketSetBookMode.java | 47 ------------------- .../common/network/PacketSetCasterSlot.java | 42 +++++++++++++++++ .../common/network/PacketSetSound.java | 14 ++---- .../network/PacketUpdateSpellSoundAll.java | 10 ++-- 9 files changed, 65 insertions(+), 74 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetCasterSlot.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java index ec9c7d2c3c..d8eee1b45d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java @@ -110,7 +110,7 @@ public SpellCaster setCurrentSlot(int slot) { @Override public SpellCaster setSpell(Spell spell, int slot) { - return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, spells.put(slot, spell)); + return new SpellCaster(this.slot, flavorText, isHidden, hiddenText, maxSlots, spells.put(slot, spell)); } @Override @@ -131,7 +131,7 @@ public String getSpellName(int slot) { @Override public SpellCaster setSpellName(String name, int slot) { var spell = this.getSpell(slot); - return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, spells.put(slot, new Spell(name, spell.color(), spell.sound(), new ArrayList<>(spell.unsafeList())))); + return new SpellCaster(this.slot, flavorText, isHidden, hiddenText, maxSlots, spells.put(slot, new Spell(name, spell.color(), spell.sound(), new ArrayList<>(spell.unsafeList())))); } @Override @@ -162,7 +162,7 @@ public String getFlavorText() { @Override public SpellCaster setColor(ParticleColor color, int slot) { var spell = this.getSpell(slot); - return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, this.spells.put(slot, new Spell(spell.name(), color, spell.sound(), new ArrayList<>(spell.unsafeList())))); + return new SpellCaster(this.slot, flavorText, isHidden, hiddenText, maxSlots, this.spells.put(slot, new Spell(spell.name(), color, spell.sound(), new ArrayList<>(spell.unsafeList())))); } @NotNull @@ -174,7 +174,7 @@ public ConfiguredSpellSound getSound(int slot) { @Override public SpellCaster setSound(ConfiguredSpellSound sound, int slot) { var spell = this.getSpell(slot); - return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, this.spells.put(slot, new Spell(spell.name(), spell.color(), sound, new ArrayList<>(spell.unsafeList())))); + return new SpellCaster(this.slot, flavorText, isHidden, hiddenText, maxSlots, this.spells.put(slot, new Spell(spell.name(), spell.color(), sound, new ArrayList<>(spell.unsafeList())))); } @NotNull diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java index f7cd5a1168..a67c5cd38c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java @@ -17,7 +17,7 @@ import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; import com.hollingsworth.arsnouveau.common.crafting.recipes.IDyeable; import com.hollingsworth.arsnouveau.common.network.Networking; -import com.hollingsworth.arsnouveau.common.network.PacketSetBookMode; +import com.hollingsworth.arsnouveau.common.network.PacketSetCasterSlot; import com.hollingsworth.arsnouveau.setup.config.ServerConfig; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; @@ -156,9 +156,7 @@ public void onRadialKeyPressed(ItemStack stack, Player player) { public RadialMenu getRadialMenuProviderForSpellpart(ItemStack itemStack) { return new RadialMenu<>((int slot) -> { - SpellCaster caster = SpellCasterRegistry.from(itemStack); - caster.setCurrentSlot(slot); - Networking.sendToServer(new PacketSetBookMode(caster)); + Networking.sendToServer(new PacketSetCasterSlot(slot)); }, getRadialMenuSlotsForSpellpart(itemStack), RenderUtils::drawSpellPart, diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/AbstractPacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/AbstractPacket.java index 0f5b31d791..a28902f769 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/AbstractPacket.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/AbstractPacket.java @@ -11,7 +11,7 @@ public abstract class AbstractPacket implements CustomPacketPayload { public AbstractPacket(){} - public abstract void toBytes(RegistryFriendlyByteBuf buf); + void toBytes(RegistryFriendlyByteBuf buf){} public void onClientReceived(Minecraft minecraft, Player player){} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java index a0ef46b043..024898b1c7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java @@ -26,7 +26,7 @@ public static int nextID() { public static void register(final RegisterPayloadHandlersEvent event) { // Sets the current network version final PayloadRegistrar reg = event.registrar("1"); - reg.playToServer(PacketOpenSpellBook.TYPE, PacketOpenSpellBook.CODEC, Networking::handle); + reg.playToClient(PacketOpenSpellBook.TYPE, PacketOpenSpellBook.CODEC, Networking::handle); reg.playToClient(ChangeBiomePacket.TYPE, ChangeBiomePacket.CODEC, Networking::handle); reg.playToServer(PacketSetLauncher.TYPE, PacketSetLauncher.CODEC, Networking::handle); reg.playToServer(ClientToServerStoragePacket.TYPE, ClientToServerStoragePacket.CODEC, Networking::handle); @@ -50,7 +50,7 @@ public static void register(final RegisterPayloadHandlersEvent event) { reg.playToClient(PacketOpenGlyphCraft.TYPE, PacketOpenGlyphCraft.CODEC, Networking::handle); reg.playToServer(PacketQuickCast.TYPE, PacketQuickCast.CODEC, Networking::handle); reg.playToServer(PacketReactiveSpell.TYPE, PacketReactiveSpell.CODEC, Networking::handle); - reg.playToServer(PacketSetBookMode.TYPE, PacketSetBookMode.CODEC, Networking::handle); + reg.playToServer(PacketSetCasterSlot.TYPE, PacketSetCasterSlot.CODEC, Networking::handle); reg.playToClient(PacketSetCameraView.TYPE, PacketSetCameraView.CODEC, Networking::handle); reg.playToServer(PacketSetScribeRecipe.TYPE, PacketSetScribeRecipe.CODEC, Networking::handle); reg.playToServer(PacketSetSound.TYPE, PacketSetSound.CODEC, Networking::handle); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenSpellBook.java index 48dfcb1614..c0a4240e3d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenSpellBook.java @@ -4,12 +4,12 @@ import com.hollingsworth.arsnouveau.client.gui.book.GuiSpellBook; import com.hollingsworth.arsnouveau.client.gui.book.InfinityGuiSpellBook; import com.hollingsworth.arsnouveau.setup.config.ServerConfig; +import net.minecraft.client.Minecraft; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; public class PacketOpenSpellBook extends AbstractPacket{ @@ -37,7 +37,7 @@ public PacketOpenSpellBook(InteractionHand hand) { } @Override - public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + public void onClientReceived(Minecraft minecraft, Player player) { InteractionHand hand = isMainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; if (ServerConfig.INFINITE_SPELLS.get()) InfinityGuiSpellBook.open(hand); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java deleted file mode 100644 index 8e450e8a17..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetBookMode.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.hollingsworth.arsnouveau.common.network; - -import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; -import com.hollingsworth.arsnouveau.api.util.StackUtil; -import com.hollingsworth.arsnouveau.common.items.SpellBook; -import com.hollingsworth.arsnouveau.common.util.ANCodecs; -import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.item.ItemStack; - -public class PacketSetBookMode extends AbstractPacket{ - public static final Type TYPE = new Type<>(ArsNouveau.prefix("set_book_mode")); - public static final StreamCodec CODEC = StreamCodec.ofMember(PacketSetBookMode::toBytes, PacketSetBookMode::new); - public SpellCaster spellCaster; - - //Decoder - public PacketSetBookMode(RegistryFriendlyByteBuf buf) { - spellCaster = ANCodecs.decode(SpellCaster.DEFAULT_CODEC.codec(), buf.readNbt()); - } - - //Encoder - public void toBytes(RegistryFriendlyByteBuf buf) { - buf.writeNbt(ANCodecs.encode(SpellCaster.DEFAULT_CODEC.codec(), spellCaster)); - } - - public PacketSetBookMode(SpellCaster spellCaster) { - this.spellCaster = spellCaster; - } - - @Override - public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { - ItemStack stack = StackUtil.getHeldSpellbook(player); - if (stack.getItem() instanceof SpellBook) { - stack.set(DataComponentRegistry.SPELL_CASTER, spellCaster); - } - } - - @Override - public Type type() { - return TYPE; - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetCasterSlot.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetCasterSlot.java new file mode 100644 index 0000000000..a5f2b5b1c6 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetCasterSlot.java @@ -0,0 +1,42 @@ +package com.hollingsworth.arsnouveau.common.network; + +import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; +import com.hollingsworth.arsnouveau.api.spell.SpellCaster; +import com.hollingsworth.arsnouveau.api.util.StackUtil; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; + +public class PacketSetCasterSlot extends AbstractPacket{ + public static final Type TYPE = new Type<>(ArsNouveau.prefix("set_book_mode")); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.INT, + s -> s.slot, + PacketSetCasterSlot::new + ); + + public int slot; + + public PacketSetCasterSlot(int slot) { + this.slot = slot; + } + + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + ItemStack stack = StackUtil.getHeldSpellbook(player); + SpellCaster caster = SpellCasterRegistry.from(stack); + if(caster != null){ + caster.setCurrentSlot(slot).saveToStack(stack); + } + } + + @Override + public Type type() { + return TYPE; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java index 4bacbc9ffc..0243231287 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetSound.java @@ -3,10 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.common.items.SpellBook; -import com.hollingsworth.arsnouveau.common.util.ANCodecs; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; @@ -14,6 +11,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; public class PacketSetSound extends AbstractPacket{ public static final Type TYPE = new Type<>(ArsNouveau.prefix("set_sound")); @@ -21,7 +19,7 @@ public class PacketSetSound extends AbstractPacket{ int castSlot; ConfiguredSpellSound sound; boolean mainHand; - public PacketSetSound(int castSlot, ConfiguredSpellSound sound, boolean mainHand) { + public PacketSetSound(int castSlot, @NotNull ConfiguredSpellSound sound, boolean mainHand) { this.castSlot = castSlot; this.sound = sound; this.mainHand = mainHand; @@ -30,15 +28,14 @@ public PacketSetSound(int castSlot, ConfiguredSpellSound sound, boolean mainHand //Decoder public PacketSetSound(RegistryFriendlyByteBuf buf) { castSlot = buf.readInt(); - CompoundTag tag = buf.readNbt(); - sound = tag == null ? ConfiguredSpellSound.DEFAULT : ANCodecs.decode(ConfiguredSpellSound.CODEC.codec(), tag); + sound = ConfiguredSpellSound.STREAM.decode(buf); mainHand = buf.readBoolean(); } //Encoder public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeInt(castSlot); - buf.writeNbt(ANCodecs.encode(ConfiguredSpellSound.CODEC.codec(), sound)); + ConfiguredSpellSound.STREAM.encode(buf, sound); buf.writeBoolean(mainHand); } @@ -46,8 +43,7 @@ public void toBytes(RegistryFriendlyByteBuf buf) { public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { ItemStack stack = player.getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); if (stack.getItem() instanceof SpellBook) { - SpellCaster caster = SpellCasterRegistry.from(stack); - caster.setSound(sound, castSlot); + SpellCasterRegistry.from(stack).setSound(sound, castSlot).saveToStack(stack); Networking.sendToPlayerClient(new PacketUpdateBookGUI(stack), player); Networking.sendToPlayerClient(new PacketOpenSpellBook(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND), player); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java index 322cc4b52f..ef0a49d4b3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java @@ -7,6 +7,7 @@ import com.hollingsworth.arsnouveau.common.items.SpellBook; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; @@ -26,10 +27,6 @@ public PacketUpdateSpellSoundAll(RegistryFriendlyByteBuf buf) { super(buf); } - public void toBytes(RegistryFriendlyByteBuf buf) { - super.toBytes(buf); - } - @Override public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { ItemStack stack = player.getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); @@ -43,4 +40,9 @@ public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer playe Networking.sendToPlayerClient(new PacketOpenSpellBook(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND), player); } } + + @Override + public Type type() { + return TYPE; + } } From bf5d547ef8f0d32f55c5263437bbf491449449b4 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 7 Jul 2024 12:53:14 -0500 Subject: [PATCH 038/363] fix use animations --- .../arsnouveau/common/items/FlaskCannon.java | 19 ++++--------------- .../arsnouveau/common/items/PotionFlask.java | 6 ++---- .../arsnouveau/common/items/SpellBook.java | 16 +--------------- 3 files changed, 7 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java index 41ba431568..5a15d9739d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java @@ -28,7 +28,10 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.ThrownPotion; -import net.minecraft.world.item.*; +import net.minecraft.world.item.ArrowItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.PotionItem; import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; @@ -99,20 +102,6 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte public abstract ItemStack getThrownStack(Level pLevel, Player pPlayer, InteractionHand pHand, ItemStack launcherStack); - /** - * How long it takes to use or consume an item - */ - public int getUseDuration(ItemStack stack) { - return 72000; - } - - /** - * returns the action that specifies what animation to play when the item is being used - */ - public UseAnim getUseAnimation(ItemStack stack) { - return UseAnim.BOW; - } - @Override public boolean doesSneakBypassUse(ItemStack stack, LevelReader world, BlockPos pos, Player player) { return true; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java index 35fc7fe797..06b28bd876 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java @@ -125,10 +125,8 @@ public float getXpRepairRatio(ItemStack stack) { return 0.0f; } - /** - * How long it takes to use or consume an item - */ - public int getUseDuration(ItemStack stack) { + @Override + public int getUseDuration(ItemStack pStack, LivingEntity p_344979_) { return 32; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java index a67c5cd38c..409cc82a4b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java @@ -31,12 +31,10 @@ import net.minecraft.network.chat.Style; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.item.UseAnim; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.neoforged.api.distmarker.Dist; @@ -81,23 +79,11 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In } } } - ISpellCaster caster = getSpellCaster(stack); + SpellCaster caster = getSpellCaster(stack); return caster.castSpell(worldIn, playerIn, handIn, Component.translatable("ars_nouveau.invalid_spell")); } - @Override - public int getUseDuration(ItemStack pStack, LivingEntity p_344979_) { - return 72000; - } - - /** - * returns the action that specifies what animation to play when the items is being used - */ - public UseAnim getUseAnimation(ItemStack stack) { - return UseAnim.BOW; - } - @Override public boolean doesSneakBypassUse(ItemStack stack, LevelReader world, BlockPos pos, Player player) { return true; From c7a8a605ff6e6e2efebc38cf6bbd8def231ca6a8 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 7 Jul 2024 16:19:37 -0500 Subject: [PATCH 039/363] fix glyph recipe datagen --- .../f0f2bcace349d412215f006e6183aa56b9316c3c | 164 +++++++++--------- .../data/ars_nouveau/recipe/burst.json | 24 ++- .../ars_nouveau/recipe/glyph_accelerate.json | 12 +- .../ars_nouveau/recipe/glyph_amplify.json | 6 +- .../recipe/glyph_animate_block.json | 15 +- .../data/ars_nouveau/recipe/glyph_aoe.json | 6 +- .../data/ars_nouveau/recipe/glyph_blink.json | 18 +- .../data/ars_nouveau/recipe/glyph_bounce.json | 15 +- .../data/ars_nouveau/recipe/glyph_break.json | 6 +- .../ars_nouveau/recipe/glyph_cold_snap.json | 12 +- .../recipe/glyph_conjure_water.json | 9 +- .../data/ars_nouveau/recipe/glyph_craft.json | 6 +- .../data/ars_nouveau/recipe/glyph_crush.json | 12 +- .../data/ars_nouveau/recipe/glyph_cut.json | 12 +- .../data/ars_nouveau/recipe/glyph_dampen.json | 6 +- .../ars_nouveau/recipe/glyph_decelerate.json | 12 +- .../data/ars_nouveau/recipe/glyph_delay.json | 12 +- .../data/ars_nouveau/recipe/glyph_dispel.json | 15 +- .../recipe/glyph_duration_down.json | 9 +- .../recipe/glyph_ender_inventory.json | 9 +- .../ars_nouveau/recipe/glyph_evaporate.json | 15 +- .../ars_nouveau/recipe/glyph_exchange.json | 15 +- .../ars_nouveau/recipe/glyph_explosion.json | 18 +- .../ars_nouveau/recipe/glyph_extend_time.json | 9 +- .../ars_nouveau/recipe/glyph_extract.json | 6 +- .../data/ars_nouveau/recipe/glyph_fangs.json | 15 +- .../data/ars_nouveau/recipe/glyph_fell.json | 9 +- .../ars_nouveau/recipe/glyph_firework.json | 15 +- .../data/ars_nouveau/recipe/glyph_flare.json | 21 ++- .../ars_nouveau/recipe/glyph_fortune.json | 6 +- .../data/ars_nouveau/recipe/glyph_freeze.json | 12 +- .../data/ars_nouveau/recipe/glyph_glide.json | 18 +- .../ars_nouveau/recipe/glyph_gravity.json | 21 ++- .../data/ars_nouveau/recipe/glyph_grow.json | 30 +++- .../data/ars_nouveau/recipe/glyph_gust.json | 15 +- .../data/ars_nouveau/recipe/glyph_harm.json | 15 +- .../ars_nouveau/recipe/glyph_harvest.json | 9 +- .../data/ars_nouveau/recipe/glyph_heal.json | 21 ++- .../data/ars_nouveau/recipe/glyph_hex.json | 21 ++- .../data/ars_nouveau/recipe/glyph_ignite.json | 15 +- .../data/ars_nouveau/recipe/glyph_infuse.json | 12 +- .../ars_nouveau/recipe/glyph_intangible.json | 21 ++- .../ars_nouveau/recipe/glyph_interact.json | 15 +- .../recipe/glyph_invisibility.json | 12 +- .../data/ars_nouveau/recipe/glyph_launch.json | 15 +- .../data/ars_nouveau/recipe/glyph_leap.json | 15 +- .../data/ars_nouveau/recipe/glyph_light.json | 9 +- .../ars_nouveau/recipe/glyph_lightning.json | 18 +- .../data/ars_nouveau/recipe/glyph_linger.json | 18 +- .../data/ars_nouveau/recipe/glyph_name.json | 9 +- .../data/ars_nouveau/recipe/glyph_orbit.json | 12 +- .../recipe/glyph_phantom_block.json | 27 ++- .../data/ars_nouveau/recipe/glyph_pickup.json | 9 +- .../data/ars_nouveau/recipe/glyph_pierce.json | 9 +- .../ars_nouveau/recipe/glyph_place_block.json | 9 +- .../ars_nouveau/recipe/glyph_projectile.json | 9 +- .../data/ars_nouveau/recipe/glyph_pull.json | 6 +- .../ars_nouveau/recipe/glyph_randomize.json | 9 +- .../recipe/glyph_redstone_signal.json | 15 +- .../data/ars_nouveau/recipe/glyph_rotate.json | 6 +- .../data/ars_nouveau/recipe/glyph_rune.json | 12 +- .../data/ars_nouveau/recipe/glyph_self.json | 9 +- .../ars_nouveau/recipe/glyph_sense_magic.json | 12 +- .../ars_nouveau/recipe/glyph_sensitive.json | 12 +- .../ars_nouveau/recipe/glyph_slowfall.json | 24 ++- .../data/ars_nouveau/recipe/glyph_smelt.json | 21 ++- .../data/ars_nouveau/recipe/glyph_snare.json | 18 +- .../data/ars_nouveau/recipe/glyph_split.json | 12 +- .../recipe/glyph_summon_decoy.json | 18 +- .../recipe/glyph_summon_steed.json | 15 +- .../recipe/glyph_summon_undead.json | 12 +- .../ars_nouveau/recipe/glyph_summon_vex.json | 9 +- .../recipe/glyph_summon_wolves.json | 27 ++- .../data/ars_nouveau/recipe/glyph_toss.json | 9 +- .../data/ars_nouveau/recipe/glyph_touch.json | 6 +- .../ars_nouveau/recipe/glyph_underfoot.json | 9 +- .../data/ars_nouveau/recipe/glyph_wall.json | 18 +- .../ars_nouveau/recipe/glyph_wind_shear.json | 15 +- .../data/ars_nouveau/recipe/glyph_wither.json | 15 +- .../data/ars_nouveau/recipe/reset.json | 6 +- .../data/ars_nouveau/recipe/rewind.json | 15 +- .../data/ars_nouveau/recipe/wololo.json | 15 +- .../common/crafting/recipes/GlyphRecipe.java | 2 +- .../setup/registry/RecipeRegistry.java | 3 +- 84 files changed, 1090 insertions(+), 165 deletions(-) diff --git a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c index 8ccc9d6168..303f292786 100644 --- a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c +++ b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c @@ -1,82 +1,82 @@ -// 1.21 2024-07-07T11:53:40.7740417 Glyph Recipes -e4ef5c317ca1bb6d7ff64e6e65dbd41428eb9717 data/ars_nouveau/recipe/burst.json -9913a7b479e3ac1c0da2614ffae49ebaf026e6f7 data/ars_nouveau/recipe/glyph_accelerate.json -7032acba1fd2e577cec1e9e3a48331c862522b38 data/ars_nouveau/recipe/glyph_amplify.json -0e9bff6dbf895ba80b0bd5bcde200152032a087c data/ars_nouveau/recipe/glyph_animate_block.json -8bd925d7db4de20b8622eb3d39fcc082ac4d25fd data/ars_nouveau/recipe/glyph_aoe.json -15b965d4e21561025f9c74225ce5f9299abfe2ea data/ars_nouveau/recipe/glyph_blink.json -8de13db95f7d14dbf144d5cb3aaf705a45d195c8 data/ars_nouveau/recipe/glyph_bounce.json -c12a30b265277c1e793045454de09509a70564ba data/ars_nouveau/recipe/glyph_break.json -ffbb7d49317cff93082873399be237a2508e3695 data/ars_nouveau/recipe/glyph_cold_snap.json -45a9f8b6f07e6532ded8011f48a931a036c4c3d7 data/ars_nouveau/recipe/glyph_conjure_water.json -f6b8f292e7d187f2b21b7c87e113f6f1aeef29fb data/ars_nouveau/recipe/glyph_craft.json -81d95aba0686c38f16c8746ca016be871df8d1ea data/ars_nouveau/recipe/glyph_crush.json -88ea95676a6b9fd44d9da33d7f505241dea82e78 data/ars_nouveau/recipe/glyph_cut.json -3cad5c66a601dacf6bb5d08f31ec6b98b9391514 data/ars_nouveau/recipe/glyph_dampen.json -8a008779d3add831619a4081b16a4c9bea2dfe0f data/ars_nouveau/recipe/glyph_decelerate.json -23a4e63c84e9b3cbc9c972cf768ebb2b8bcea765 data/ars_nouveau/recipe/glyph_delay.json -e82372cc310cfc6f749b6eec86e238b6815801f6 data/ars_nouveau/recipe/glyph_dispel.json -4daa3b4f4849bfa6b17cc87ec029181f83eb115b data/ars_nouveau/recipe/glyph_duration_down.json -59ce04f1c3bd86741e586cbe21a8e232817de060 data/ars_nouveau/recipe/glyph_ender_inventory.json -c7d88c8b291fb8a16d644b0a123e52afbabe82e5 data/ars_nouveau/recipe/glyph_evaporate.json -3178a5019d00ca334d8b0f3a3de2a7e72f3a1a73 data/ars_nouveau/recipe/glyph_exchange.json -f4e201d11e39459b017809128a699e8604790c52 data/ars_nouveau/recipe/glyph_explosion.json -ab103fd6bf4c5125ed473191184c638168b79d13 data/ars_nouveau/recipe/glyph_extend_time.json -12e57017df0e322c9878840fdfff8d97a78ed2ec data/ars_nouveau/recipe/glyph_extract.json -9dce84836e77e0510301136613311b82147e23a9 data/ars_nouveau/recipe/glyph_fangs.json -14112a9c8c2aaaf5d482aa97c83d1f07f088c53d data/ars_nouveau/recipe/glyph_fell.json -409742ef2cf5d148f55c71a4a811551747569b60 data/ars_nouveau/recipe/glyph_firework.json -d1e68fdd9075b82c6829f19902989d5194e85b1f data/ars_nouveau/recipe/glyph_flare.json -db3cccf344ed76c5e73c6d1c7939495ea7bf2ff4 data/ars_nouveau/recipe/glyph_fortune.json -b156d1b81c65374e3ba9faedfb3d445d722e26ff data/ars_nouveau/recipe/glyph_freeze.json -fe4bc1ee1d457b7c3c6e8dd646f057688e493bf7 data/ars_nouveau/recipe/glyph_glide.json -56c8a1604b5a71e248db1a231cde67208bde3fa5 data/ars_nouveau/recipe/glyph_gravity.json -dd60a4ed00289c81dcccebad7b40bf5163243f60 data/ars_nouveau/recipe/glyph_grow.json -78ad0604b7b5127af60333497bd7627ea13c8e7c data/ars_nouveau/recipe/glyph_gust.json -febe999646d4a63714754ee8a9ad1ebeab97911c data/ars_nouveau/recipe/glyph_harm.json -9dbc6193bd7d3bf47eec6728c9ded37fc16216a9 data/ars_nouveau/recipe/glyph_harvest.json -053e9548d8b4748a43e7c6ec1408095f40952537 data/ars_nouveau/recipe/glyph_heal.json -8a6053bd3bb15e8fe990c6dc35f92e7e1271966e data/ars_nouveau/recipe/glyph_hex.json -06d96b9d2a92aacbccf400ebfc2e794376394e82 data/ars_nouveau/recipe/glyph_ignite.json -4b9d7ff36ab385619aebee5ad77417b20e0b356e data/ars_nouveau/recipe/glyph_infuse.json -35c08f159f0b64ef31645294bb57621c96942476 data/ars_nouveau/recipe/glyph_intangible.json -74110848bfcbd802ce0bb9e64913bff220e61081 data/ars_nouveau/recipe/glyph_interact.json -d68657caa28efee45bc9864ee1f48523c1e275c2 data/ars_nouveau/recipe/glyph_invisibility.json -888d6bcc4870ca81f5f764dbdb1c8f41a1828375 data/ars_nouveau/recipe/glyph_launch.json -ba8fbf41205c71635b2f83160f3807aa1365f668 data/ars_nouveau/recipe/glyph_leap.json -8826bf4f65d755e461ef9711ea7687caa41c8d0e data/ars_nouveau/recipe/glyph_light.json -071bbf896c39e6af31d79586f7797f3fa9f49223 data/ars_nouveau/recipe/glyph_lightning.json -45cb2b91645f64b35d5fe2d623d656e02020cfb0 data/ars_nouveau/recipe/glyph_linger.json -cd597326b462b00c4cb3e00e20b57848b8544c6d data/ars_nouveau/recipe/glyph_name.json -0fb93f333f3006cbffb7c6a768fbc9e4f9f011de data/ars_nouveau/recipe/glyph_orbit.json -8edfd26bba8f546ffd6b115ef8b8bedca85c1c37 data/ars_nouveau/recipe/glyph_phantom_block.json -92a3da8010db95c33d5ad2e28988149dd52024ac data/ars_nouveau/recipe/glyph_pickup.json -f74bb17bfe562f93d8436498878f5d98adff115b data/ars_nouveau/recipe/glyph_pierce.json -bc6028c06d2c6725c45822a80490ee9850a9818c data/ars_nouveau/recipe/glyph_place_block.json -66f999c678a78ae79763a2ef17822fdb7a5e0003 data/ars_nouveau/recipe/glyph_projectile.json -3952cc5e5c1648af8183f048ab4f1f45491cc7e5 data/ars_nouveau/recipe/glyph_pull.json -44ee117ed99d031c5b53b43167cb9eb7bb23277d data/ars_nouveau/recipe/glyph_randomize.json -b8d19e6007f734228ff5c3cc77a47739d0e22c3d data/ars_nouveau/recipe/glyph_redstone_signal.json -4fd550580851766be4ff0c2890d1c50f17699000 data/ars_nouveau/recipe/glyph_rotate.json -666a060411ed52137c2b3fb7a6c09a6d967d4a97 data/ars_nouveau/recipe/glyph_rune.json -f881f9e2e66389c7476338d9dac2499718b21c33 data/ars_nouveau/recipe/glyph_self.json -2b08d1ded4ef1b5c692f25ea4c9ab18f41677056 data/ars_nouveau/recipe/glyph_sense_magic.json -bffd66f9ba9907dce9e3a92c0316e14a92c1e77a data/ars_nouveau/recipe/glyph_sensitive.json -886f2211c9bfd0c105c13fa4c16c5ed7f983677f data/ars_nouveau/recipe/glyph_slowfall.json -e23f69d25ee927e35ec2d27415654635a57699d3 data/ars_nouveau/recipe/glyph_smelt.json -665ec7348ec90589ed28c638582a6e378a1f4a65 data/ars_nouveau/recipe/glyph_snare.json -b5bba37bd4768ea3f083378fbf9cab84ba7a6f8e data/ars_nouveau/recipe/glyph_split.json -3be4d85a117ac02fb085bf0e05398bd750c02c19 data/ars_nouveau/recipe/glyph_summon_decoy.json -353218b388d951fc2626c957eef2ceef40dc552e data/ars_nouveau/recipe/glyph_summon_steed.json -cb52a0151b23d440d7cb408c57da81521b6a3240 data/ars_nouveau/recipe/glyph_summon_undead.json -9106bd510401b2d4b322a8fcff280aefb5b7c8e3 data/ars_nouveau/recipe/glyph_summon_vex.json -882e1bb46ced8b0b5cdabec1efb9b6e501ac84d1 data/ars_nouveau/recipe/glyph_summon_wolves.json -5c4d580cb5c5d23ee861e9877cec17b525c33232 data/ars_nouveau/recipe/glyph_toss.json -6203889841c33fad76490d252c49d44cf5480a4f data/ars_nouveau/recipe/glyph_touch.json -73cac8ef303a09fc4d4983667634473c6ec2ba93 data/ars_nouveau/recipe/glyph_underfoot.json -73fcc563c61d67a8d13fcf3173792f5870d81332 data/ars_nouveau/recipe/glyph_wall.json -56be773111a9c8c80e4a58e7fb31330b9a263bee data/ars_nouveau/recipe/glyph_wind_shear.json -6872442625e3e5c91a8212221b0d42e1bad4d196 data/ars_nouveau/recipe/glyph_wither.json -90c1991b4da7582d59891b3779966c08f2b4b11d data/ars_nouveau/recipe/reset.json -1e7ed0579d489e3f57ce351e43bc3466ca8925a5 data/ars_nouveau/recipe/rewind.json -bae3dc70f49ed0abc765dfd63e7321a1eb5101cc data/ars_nouveau/recipe/wololo.json +// 1.21 2024-07-07T16:19:18.1720621 Glyph Recipes +900813bd9305050aab1ba6e11465baee4b4d6d92 data/ars_nouveau/recipe/burst.json +231d9f126c606465601e36e83948dda99a508834 data/ars_nouveau/recipe/glyph_accelerate.json +dbad772acd31382cfcf19c7f276da5f91354dfcf data/ars_nouveau/recipe/glyph_amplify.json +1a8499b67d1ce8614ef1d420106d32d27567eeb9 data/ars_nouveau/recipe/glyph_animate_block.json +232197139f5fa7a33b4e1d42c453833394a4c4ba data/ars_nouveau/recipe/glyph_aoe.json +c827180b8f5111736c1641e4683e63b3f764a80a data/ars_nouveau/recipe/glyph_blink.json +10e7f63b9784ce9693c7ec690dc13b21e9106297 data/ars_nouveau/recipe/glyph_bounce.json +6989360984c711d43b4e9175efbec3a23608db8e data/ars_nouveau/recipe/glyph_break.json +5a951b64a1a102d1e71ee5ba85524cf1877378d5 data/ars_nouveau/recipe/glyph_cold_snap.json +72ba14e65f67b1d570b69ec9ad7b99e59cd3f4b4 data/ars_nouveau/recipe/glyph_conjure_water.json +a8c81b73dd2931d4fafd62ad9a5cf1d3f625f0d4 data/ars_nouveau/recipe/glyph_craft.json +ab897cc6b68edf7d2365f61468932fcf60cbd1f4 data/ars_nouveau/recipe/glyph_crush.json +42bb3eea2f932857071a7e38f20e84ba81f482ff data/ars_nouveau/recipe/glyph_cut.json +b8fb5c3be6bed43b317f4b6b27f1910a239c594d data/ars_nouveau/recipe/glyph_dampen.json +4d25fb5ad590feac114cdaae11b3663c29fa4e4c data/ars_nouveau/recipe/glyph_decelerate.json +987bd77e5ab1c1b0436b08ae380af36eb7c6547c data/ars_nouveau/recipe/glyph_delay.json +9c6a87a8757c008c758f9ccf7887f8a58db05744 data/ars_nouveau/recipe/glyph_dispel.json +008ea29e5d898666148172f992a6ddd041bb47b0 data/ars_nouveau/recipe/glyph_duration_down.json +d4ae461ab45cdbbac689c764f298726683049a26 data/ars_nouveau/recipe/glyph_ender_inventory.json +cd873cf0d46f6ba4e2c998ed6d5a04ef597cf46c data/ars_nouveau/recipe/glyph_evaporate.json +d8d880345a737b8b24396aeef8352770ca90feab data/ars_nouveau/recipe/glyph_exchange.json +7568f1596bc768eea2ef1bda86dcd4f3a848ee4b data/ars_nouveau/recipe/glyph_explosion.json +6b8ea8aaae3fd2ca6c3c591327a0b808397259d0 data/ars_nouveau/recipe/glyph_extend_time.json +0e1e39590260c18ad420726df344e2e65d30fafa data/ars_nouveau/recipe/glyph_extract.json +07e73684b1ade6f98a368e443defda54d548c99f data/ars_nouveau/recipe/glyph_fangs.json +a81784afea6cfa82cd7708e94bd7c5c6ba02f017 data/ars_nouveau/recipe/glyph_fell.json +aa39ad2ae584abc4382a354b207a9cd026ff09d8 data/ars_nouveau/recipe/glyph_firework.json +5354678271392f1bba0c18a563a591c48c0df576 data/ars_nouveau/recipe/glyph_flare.json +c178c687f7aee57cff3a46e9b5dcd874bfb9c592 data/ars_nouveau/recipe/glyph_fortune.json +3b57b32e90f0e30fc169fcb165a9a891ffaaedf3 data/ars_nouveau/recipe/glyph_freeze.json +2f3d7dda111fd0caaa2a74ef1798f1b9d7687548 data/ars_nouveau/recipe/glyph_glide.json +58b14279016f94441c2df45760224754e2f25e63 data/ars_nouveau/recipe/glyph_gravity.json +c55af6d1555f2a7cae90a4e7b25d901f0e467181 data/ars_nouveau/recipe/glyph_grow.json +cb816f8988d010f3bceb7f24e26248f0076c2ea3 data/ars_nouveau/recipe/glyph_gust.json +7cd7b44e904811c1c1f063dbb2b12e1d0df8966f data/ars_nouveau/recipe/glyph_harm.json +35aa6f30e86f9f1ccd5de1133a19a20661149287 data/ars_nouveau/recipe/glyph_harvest.json +c4b55b257641d5e97be4b1b5f21ca56eb3403944 data/ars_nouveau/recipe/glyph_heal.json +2a8c46f95455ebf86020647b2e26820608d2128e data/ars_nouveau/recipe/glyph_hex.json +2b737657257b63876f188c39588fde7b316aa9dc data/ars_nouveau/recipe/glyph_ignite.json +7c3b09fcc5947d98b38d1a69a298201b882e77a0 data/ars_nouveau/recipe/glyph_infuse.json +b8ac8256861678647a80558a1aaa7c4703436d9c data/ars_nouveau/recipe/glyph_intangible.json +ae31357a9f8a0c3918322ac3c287263a8cfab5ac data/ars_nouveau/recipe/glyph_interact.json +0e7ac7ce215ce1e43eff2fc76d715548eed43526 data/ars_nouveau/recipe/glyph_invisibility.json +1ac6dc38d9cef8e101f9c4aba913061462b35973 data/ars_nouveau/recipe/glyph_launch.json +191be45e6b8e1a7a36c22314fafc0b53f3793fa0 data/ars_nouveau/recipe/glyph_leap.json +c769db20cc6e9dbcff0c0327e870b5e69176092b data/ars_nouveau/recipe/glyph_light.json +b4d02e99a79be1d9f2a1f134a68a8b891e3cd46a data/ars_nouveau/recipe/glyph_lightning.json +2df04f2acf02666969cb91de1041ef827f009f16 data/ars_nouveau/recipe/glyph_linger.json +a33daf748ab3dab2279e9a2da7c984c53f3e3e12 data/ars_nouveau/recipe/glyph_name.json +7911daac7df742c40d4fde6edc370d58c331461c data/ars_nouveau/recipe/glyph_orbit.json +395c37ef2bc2ec7a1195e046f0bf2ea575a05675 data/ars_nouveau/recipe/glyph_phantom_block.json +18f917d7d13955d3fe0a7a37181e6825c0186da4 data/ars_nouveau/recipe/glyph_pickup.json +2fbf32d7c45ee4783d83e24ffc87ee8702372415 data/ars_nouveau/recipe/glyph_pierce.json +96288b4456decd13d7fd768a0a62a2111797903d data/ars_nouveau/recipe/glyph_place_block.json +7429c6abe680095a97ee3155dc17b7faaa71e7cb data/ars_nouveau/recipe/glyph_projectile.json +1eb1af37b7715393e536308f211ffb0e6caba19a data/ars_nouveau/recipe/glyph_pull.json +69dd8532fe7b5dae62ec98abbe7711e9f5131a4c data/ars_nouveau/recipe/glyph_randomize.json +ea45f8d2be917a600d659aa540731fccb150264b data/ars_nouveau/recipe/glyph_redstone_signal.json +c520920d02f486e8f8c7fcb0412c365d7a7c012d data/ars_nouveau/recipe/glyph_rotate.json +1c66a7a6be218c3cbc7414a8440c70768627fb8c data/ars_nouveau/recipe/glyph_rune.json +b2f64840be388a3554da4378ee2bedf0aaa2f88a data/ars_nouveau/recipe/glyph_self.json +792225624855fbfca03f66bd9fbebdb7667b9563 data/ars_nouveau/recipe/glyph_sense_magic.json +969ff52182ee67595d7802b0805e7abc698d0465 data/ars_nouveau/recipe/glyph_sensitive.json +5fb2abe9c980b7ab9ab6038bfaee0f00b3e07786 data/ars_nouveau/recipe/glyph_slowfall.json +2712e80ff047431f2ff378a3954b3e93fb879e1a data/ars_nouveau/recipe/glyph_smelt.json +62a0cf6ce285c640c91a00807ba5a643e64cb4d9 data/ars_nouveau/recipe/glyph_snare.json +256490178cef30838be78dc288d3b1a321798993 data/ars_nouveau/recipe/glyph_split.json +e0ec2068e57d19949f8b7213387f96673ceb2085 data/ars_nouveau/recipe/glyph_summon_decoy.json +9dd317e86bfb62fcfb1665e0deb2016642cccd33 data/ars_nouveau/recipe/glyph_summon_steed.json +4dec31b0851b4090e0c9ba1f677cd485d67c7885 data/ars_nouveau/recipe/glyph_summon_undead.json +8bd6c68acdf6ec4fda4c2ab7ea2645adcd209357 data/ars_nouveau/recipe/glyph_summon_vex.json +bb56552835fa27efc459b95f60a02bb767c08661 data/ars_nouveau/recipe/glyph_summon_wolves.json +77340a1e0ace0df0ec3fc593bca81245c18b9746 data/ars_nouveau/recipe/glyph_toss.json +db19c804b364f5ff7c081e6f3f658effd5ba556a data/ars_nouveau/recipe/glyph_touch.json +cb00129024d9b53917b02aeca2f33e4eeae547d4 data/ars_nouveau/recipe/glyph_underfoot.json +39d5a88c68997e3f5fd6f172aacf29130da5beff data/ars_nouveau/recipe/glyph_wall.json +18575eed1eb8c235743d1b3e84a0073240d65d12 data/ars_nouveau/recipe/glyph_wind_shear.json +d1a64ab03f22393c77b75dbb271f2cc1ba2a416e data/ars_nouveau/recipe/glyph_wither.json +a40fe2e80c72faf58a0878e1b63bcee9ad6b39c4 data/ars_nouveau/recipe/reset.json +57e04103e141ca3d58341737ce5df01c3682be13 data/ars_nouveau/recipe/rewind.json +67a04eec7019ec33e114f5a5815fa93ae59bf684 data/ars_nouveau/recipe/wololo.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/burst.json b/src/generated/resources/data/ars_nouveau/recipe/burst.json index 09cf3f17c8..c8d56b7390 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/burst.json +++ b/src/generated/resources/data/ars_nouveau/recipe/burst.json @@ -1,7 +1,29 @@ { "type": "ars_nouveau:glyph", "exp": 160, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "minecraft:tnt" + }, + { + "item": "minecraft:tnt" + }, + { + "item": "minecraft:tnt" + }, + { + "item": "minecraft:tnt" + }, + { + "item": "minecraft:tnt" + }, + { + "item": "minecraft:firework_star" + } + ], "output": { "count": 1, "id": "ars_nouveau:burst" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_accelerate.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_accelerate.json index f812dfd99b..fcf6ae8bb2 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_accelerate.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_accelerate.json @@ -1,7 +1,17 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "minecraft:powered_rail" + }, + { + "item": "minecraft:sugar" + }, + { + "item": "minecraft:clock" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_accelerate" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_amplify.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_amplify.json index 3357d4ac71..a741af4643 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_amplify.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_amplify.json @@ -1,7 +1,11 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "minecraft:diamond_pickaxe" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_amplify" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_animate_block.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_animate_block.json index 366ae9c0b0..760a83a0aa 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_animate_block.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_animate_block.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:conjuration_essence" + }, + { + "tag": "c:obsidians" + }, + { + "tag": "c:obsidians" + }, + { + "tag": "c:obsidians" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_animate_block" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_aoe.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_aoe.json index 1fed07c498..c54891cf0a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_aoe.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_aoe.json @@ -1,7 +1,11 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "minecraft:firework_star" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_aoe" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_blink.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_blink.json index 048fe58e43..be9f8850a3 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_blink.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_blink.json @@ -1,7 +1,23 @@ { "type": "ars_nouveau:glyph", "exp": 160, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "tag": "c:ender_pearls" + }, + { + "tag": "c:ender_pearls" + }, + { + "tag": "c:ender_pearls" + }, + { + "tag": "c:ender_pearls" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_blink" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_bounce.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_bounce.json index dc3db44ec4..ec7b36bd86 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_bounce.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_bounce.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:abjuration_essence" + }, + { + "tag": "c:slimeballs" + }, + { + "tag": "c:slimeballs" + }, + { + "tag": "c:slimeballs" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_bounce" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_break.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_break.json index 46e1297edf..93ab022dbc 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_break.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_break.json @@ -1,7 +1,11 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "minecraft:iron_pickaxe" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_break" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_cold_snap.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_cold_snap.json index 1e7655316c..647dc16831 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_cold_snap.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_cold_snap.json @@ -1,7 +1,17 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:water_essence" + }, + { + "item": "minecraft:powder_snow_bucket" + }, + { + "item": "minecraft:ice" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_cold_snap" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_conjure_water.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_conjure_water.json index d858d69f42..d2c79a569c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_conjure_water.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_conjure_water.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:water_essence" + }, + { + "item": "minecraft:water_bucket" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_conjure_water" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_craft.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_craft.json index 3e568713fa..7ca5b88294 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_craft.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_craft.json @@ -1,7 +1,11 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "minecraft:crafting_table" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_craft" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_crush.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_crush.json index 8f6a427b42..ece2119ff7 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_crush.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_crush.json @@ -1,7 +1,17 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:earth_essence" + }, + { + "item": "minecraft:grindstone" + }, + { + "item": "minecraft:piston" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_crush" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_cut.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_cut.json index 9816adeb18..cc84e90a36 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_cut.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_cut.json @@ -1,7 +1,17 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "minecraft:shears" + }, + { + "item": "minecraft:iron_sword" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_cut" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_dampen.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_dampen.json index 407d9c2487..4c10374ce8 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_dampen.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_dampen.json @@ -1,7 +1,11 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "minecraft:nether_brick" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_dampen" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_decelerate.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_decelerate.json index c045701cbc..882f4e5eec 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_decelerate.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_decelerate.json @@ -1,7 +1,17 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "minecraft:soul_sand" + }, + { + "item": "minecraft:cobweb" + }, + { + "item": "minecraft:clock" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_decelerate" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_delay.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_delay.json index 7c35dfdcc3..fab924368f 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_delay.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_delay.json @@ -1,7 +1,17 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "minecraft:repeater" + }, + { + "item": "minecraft:clock" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_delay" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_dispel.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_dispel.json index f10f6397d0..7cb1ee3fca 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_dispel.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_dispel.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:abjuration_essence" + }, + { + "item": "minecraft:milk_bucket" + }, + { + "item": "minecraft:milk_bucket" + }, + { + "item": "minecraft:milk_bucket" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_dispel" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_duration_down.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_duration_down.json index 9967cb1309..0b38581a01 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_duration_down.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_duration_down.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "minecraft:clock" + }, + { + "item": "minecraft:glowstone_dust" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_duration_down" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_ender_inventory.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_ender_inventory.json index 5a09b11948..4ce994979a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_ender_inventory.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_ender_inventory.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "minecraft:ender_chest" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_ender_inventory" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_evaporate.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_evaporate.json index 9a1c04554c..0b7bf30586 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_evaporate.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_evaporate.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "minecraft:sponge" + }, + { + "item": "minecraft:sponge" + }, + { + "item": "minecraft:sponge" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_evaporate" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_exchange.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_exchange.json index e4fbc13c40..278e4a63a6 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_exchange.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_exchange.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "minecraft:emerald_block" + }, + { + "tag": "c:ender_pearls" + }, + { + "tag": "c:ender_pearls" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_exchange" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_explosion.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_explosion.json index 45763cf52c..663f511ee2 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_explosion.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_explosion.json @@ -1,7 +1,23 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:fire_essence" + }, + { + "item": "minecraft:tnt" + }, + { + "item": "minecraft:tnt" + }, + { + "item": "minecraft:tnt" + }, + { + "item": "minecraft:fire_charge" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_explosion" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_extend_time.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_extend_time.json index 3d3afa97b3..513afab88c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_extend_time.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_extend_time.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "minecraft:clock" + }, + { + "tag": "c:storage_blocks/redstone" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_extend_time" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_extract.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_extract.json index 3cfb25d561..02b210089b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_extract.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_extract.json @@ -1,7 +1,11 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "minecraft:emerald" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_extract" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_fangs.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_fangs.json index 44382e75d4..8bc49b3d08 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_fangs.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_fangs.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 160, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:conjuration_essence" + }, + { + "item": "minecraft:prismarine_shard" + }, + { + "item": "minecraft:prismarine_shard" + }, + { + "item": "minecraft:totem_of_undying" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_fangs" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_fell.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_fell.json index 2d2325e42d..9ce3c344a9 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_fell.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_fell.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:earth_essence" + }, + { + "item": "minecraft:diamond_axe" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_fell" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_firework.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_firework.json index 5441b99502..ea8bb77f40 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_firework.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_firework.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:fire_essence" + }, + { + "item": "minecraft:firework_rocket" + }, + { + "item": "minecraft:firework_rocket" + }, + { + "item": "minecraft:firework_star" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_firework" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_flare.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_flare.json index 6fd9bfe383..d9bcbf735d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_flare.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_flare.json @@ -1,7 +1,26 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:fire_essence" + }, + { + "item": "minecraft:flint_and_steel" + }, + { + "item": "minecraft:flint_and_steel" + }, + { + "item": "minecraft:fire_charge" + }, + { + "item": "minecraft:fire_charge" + }, + { + "item": "minecraft:blaze_rod" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_flare" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_fortune.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_fortune.json index ee8e6a964d..84209304de 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_fortune.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_fortune.json @@ -1,7 +1,11 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "minecraft:rabbit_foot" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_fortune" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_freeze.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_freeze.json index ef5202c550..79d0e651d3 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_freeze.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_freeze.json @@ -1,7 +1,17 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:water_essence" + }, + { + "item": "minecraft:snow_block" + }, + { + "item": "minecraft:snow_block" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_freeze" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_glide.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_glide.json index a1c367990d..ec6ed2bbab 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_glide.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_glide.json @@ -1,7 +1,23 @@ { "type": "ars_nouveau:glyph", "exp": 160, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:air_essence" + }, + { + "item": "minecraft:elytra" + }, + { + "tag": "c:gems/diamond" + }, + { + "tag": "c:gems/diamond" + }, + { + "tag": "c:gems/diamond" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_glide" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_gravity.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_gravity.json index 3f2c4cf657..6f2fc9e2ad 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_gravity.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_gravity.json @@ -1,7 +1,26 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:air_essence" + }, + { + "item": "minecraft:anvil" + }, + { + "item": "minecraft:anvil" + }, + { + "tag": "c:feathers" + }, + { + "tag": "c:feathers" + }, + { + "tag": "c:feathers" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_gravity" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_grow.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_grow.json index 51adedbf15..6109efa51a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_grow.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_grow.json @@ -1,7 +1,35 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:earth_essence" + }, + { + "item": "minecraft:bone_block" + }, + { + "item": "minecraft:bone_block" + }, + { + "item": "minecraft:bone_block" + }, + { + "item": "minecraft:bone_block" + }, + { + "item": "minecraft:bone_block" + }, + { + "tag": "c:seeds" + }, + { + "tag": "c:seeds" + }, + { + "tag": "c:seeds" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_grow" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_gust.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_gust.json index 42f8cf6ec8..cd8e1f21c6 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_gust.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_gust.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:air_essence" + }, + { + "item": "minecraft:piston" + }, + { + "item": "minecraft:piston" + }, + { + "item": "minecraft:piston" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_gust" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_harm.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_harm.json index a78b3b2c7b..704624ca82 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_harm.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_harm.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:earth_essence" + }, + { + "item": "minecraft:iron_sword" + }, + { + "item": "minecraft:iron_sword" + }, + { + "item": "minecraft:iron_sword" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_harm" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_harvest.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_harvest.json index 4308f491f4..12fd748e11 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_harvest.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_harvest.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:earth_essence" + }, + { + "item": "minecraft:iron_hoe" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_harvest" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_heal.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_heal.json index faed6bd4b1..741b325f37 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_heal.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_heal.json @@ -1,7 +1,26 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:abjuration_essence" + }, + { + "item": "minecraft:glistering_melon_slice" + }, + { + "item": "minecraft:glistering_melon_slice" + }, + { + "item": "minecraft:glistering_melon_slice" + }, + { + "item": "minecraft:glistering_melon_slice" + }, + { + "item": "minecraft:golden_apple" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_heal" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_hex.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_hex.json index dc6dc52f8e..6512e50beb 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_hex.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_hex.json @@ -1,7 +1,26 @@ { "type": "ars_nouveau:glyph", "exp": 160, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:abjuration_essence" + }, + { + "item": "minecraft:fermented_spider_eye" + }, + { + "item": "minecraft:blaze_rod" + }, + { + "item": "minecraft:blaze_rod" + }, + { + "item": "minecraft:blaze_rod" + }, + { + "item": "minecraft:wither_rose" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_hex" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_ignite.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_ignite.json index 5102a70601..a7b3c337f8 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_ignite.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_ignite.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "minecraft:flint_and_steel" + }, + { + "tag": "minecraft:coals" + }, + { + "tag": "minecraft:coals" + }, + { + "tag": "minecraft:coals" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_ignite" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_infuse.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_infuse.json index 1d12c9bc40..5f421c29ca 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_infuse.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_infuse.json @@ -1,7 +1,17 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:abjuration_essence" + }, + { + "item": "minecraft:glass_bottle" + }, + { + "tag": "c:rods/blaze" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_infuse" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_intangible.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_intangible.json index 2774cf040f..af64a991d7 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_intangible.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_intangible.json @@ -1,7 +1,26 @@ { "type": "ars_nouveau:glyph", "exp": 160, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "minecraft:phantom_membrane" + }, + { + "item": "minecraft:phantom_membrane" + }, + { + "item": "minecraft:phantom_membrane" + }, + { + "tag": "c:ender_pearls" + }, + { + "tag": "c:ender_pearls" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_intangible" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_interact.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_interact.json index 594fdfac49..1fc3c407bf 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_interact.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_interact.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "minecraft:lever" + }, + { + "tag": "minecraft:wooden_pressure_plates" + }, + { + "tag": "minecraft:buttons" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_interact" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_invisibility.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_invisibility.json index 6f2e0c085e..d1c7476b42 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_invisibility.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_invisibility.json @@ -1,7 +1,17 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:abjuration_essence" + }, + { + "item": "minecraft:fermented_spider_eye" + }, + { + "tag": "c:rods/blaze" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_invisibility" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_launch.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_launch.json index cfc923bd48..fa7ef798a7 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_launch.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_launch.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:air_essence" + }, + { + "item": "minecraft:rabbit_hide" + }, + { + "item": "minecraft:rabbit_hide" + }, + { + "item": "minecraft:rabbit_hide" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_launch" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_leap.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_leap.json index 4d6a21811c..6c3d3b2179 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_leap.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_leap.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:air_essence" + }, + { + "item": "ars_nouveau:wilden_wing" + }, + { + "item": "ars_nouveau:wilden_wing" + }, + { + "item": "ars_nouveau:wilden_wing" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_leap" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_light.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_light.json index d3ec97c68c..7695f9d6c6 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_light.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_light.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "minecraft:lantern" + }, + { + "item": "minecraft:torch" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_light" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_lightning.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_lightning.json index 5edc3f182e..aa7b9a4cd3 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_lightning.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_lightning.json @@ -1,7 +1,23 @@ { "type": "ars_nouveau:glyph", "exp": 160, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:air_essence" + }, + { + "item": "minecraft:lightning_rod" + }, + { + "item": "minecraft:lightning_rod" + }, + { + "item": "minecraft:lightning_rod" + }, + { + "item": "minecraft:heart_of_the_sea" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_lightning" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_linger.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_linger.json index bdc1e78e9b..7b7fe852cb 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_linger.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_linger.json @@ -1,7 +1,23 @@ { "type": "ars_nouveau:glyph", "exp": 160, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "minecraft:dragon_breath" + }, + { + "tag": "c:storage_blocks/diamond" + }, + { + "tag": "c:rods/blaze" + }, + { + "tag": "c:rods/blaze" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_linger" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_name.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_name.json index ceabb09655..d84ccad347 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_name.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_name.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "minecraft:name_tag" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_name" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_orbit.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_orbit.json index a9e44bc176..7fb0123ba6 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_orbit.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_orbit.json @@ -1,7 +1,17 @@ { "type": "ars_nouveau:glyph", "exp": 160, - "inputs": [], + "inputs": [ + { + "item": "minecraft:compass" + }, + { + "item": "minecraft:ender_eye" + }, + { + "tag": "c:rods/blaze" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_orbit" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_phantom_block.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_phantom_block.json index 4d31ea5dc9..e4bb6e54f4 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_phantom_block.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_phantom_block.json @@ -1,7 +1,32 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "tag": "c:glass_blocks" + }, + { + "tag": "c:glass_blocks" + }, + { + "tag": "c:glass_blocks" + }, + { + "tag": "c:glass_blocks" + }, + { + "tag": "c:glass_blocks" + }, + { + "tag": "c:glass_blocks" + }, + { + "tag": "c:glass_blocks" + }, + { + "tag": "c:glass_blocks" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_phantom_block" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_pickup.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_pickup.json index 03cf541bb1..a8faedc454 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_pickup.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_pickup.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "minecraft:hopper" + }, + { + "item": "minecraft:hopper" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_pickup" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_pierce.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_pierce.json index f29a6396d5..391da6e6cc 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_pierce.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_pierce.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "minecraft:arrow" + }, + { + "item": "ars_nouveau:wilden_spike" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_pierce" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_place_block.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_place_block.json index 9419e301dc..4739b9d361 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_place_block.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_place_block.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "minecraft:dispenser" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_place_block" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_projectile.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_projectile.json index fd13aa220f..5cbc11bdb0 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_projectile.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_projectile.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "minecraft:fletching_table" + }, + { + "item": "minecraft:arrow" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_projectile" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_pull.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_pull.json index a40342fa6d..627def7c32 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_pull.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_pull.json @@ -1,7 +1,11 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "minecraft:fishing_rod" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_pull" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_randomize.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_randomize.json index 73bb9a2cb4..ed652ad25a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_randomize.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_randomize.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "minecraft:pink_carpet" + }, + { + "item": "minecraft:pink_carpet" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_randomize" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_redstone_signal.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_redstone_signal.json index a8eae0fceb..15bdb5e20b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_redstone_signal.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_redstone_signal.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "tag": "c:storage_blocks/redstone" + }, + { + "tag": "c:storage_blocks/redstone" + }, + { + "tag": "c:storage_blocks/redstone" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_redstone_signal" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_rotate.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_rotate.json index 74c1f79cf5..0907f73ad4 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_rotate.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_rotate.json @@ -1,7 +1,11 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_rotate" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_rune.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_rune.json index 9f1c17100c..ca6bbd79b2 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_rune.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_rune.json @@ -1,7 +1,17 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "ars_nouveau:runic_chalk" + }, + { + "item": "minecraft:tripwire_hook" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_rune" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_self.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_self.json index d1009035d2..8f223110c8 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_self.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_self.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "tag": "minecraft:wooden_pressure_plates" + }, + { + "item": "minecraft:iron_chestplate" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_self" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_sense_magic.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_sense_magic.json index c8059b5fce..9db3262f2c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_sense_magic.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_sense_magic.json @@ -1,7 +1,17 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:abjuration_essence" + }, + { + "item": "ars_nouveau:dowsing_rod" + }, + { + "item": "ars_nouveau:starbuncle_shards" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_sense_magic" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_sensitive.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_sensitive.json index 2a190d2ac0..e5d356ca69 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_sensitive.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_sensitive.json @@ -1,7 +1,17 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "minecraft:scaffolding" + }, + { + "item": "minecraft:poppy" + }, + { + "item": "minecraft:water_bucket" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_sensitive" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_slowfall.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_slowfall.json index 2f5151629f..a6cb6a1908 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_slowfall.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_slowfall.json @@ -1,7 +1,29 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:air_essence" + }, + { + "item": "ars_nouveau:wilden_wing" + }, + { + "item": "minecraft:feather" + }, + { + "item": "minecraft:feather" + }, + { + "item": "minecraft:feather" + }, + { + "tag": "c:rods/blaze" + }, + { + "tag": "c:crops/nether_wart" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_slowfall" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_smelt.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_smelt.json index ade8a407d2..e8f10807ec 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_smelt.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_smelt.json @@ -1,7 +1,26 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:fire_essence" + }, + { + "item": "minecraft:blast_furnace" + }, + { + "item": "minecraft:blast_furnace" + }, + { + "item": "minecraft:blast_furnace" + }, + { + "item": "minecraft:blast_furnace" + }, + { + "tag": "c:rods/blaze" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_smelt" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_snare.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_snare.json index 4edf7fd7c0..43562ffa2a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_snare.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_snare.json @@ -1,7 +1,23 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:earth_essence" + }, + { + "item": "minecraft:cobweb" + }, + { + "item": "minecraft:cobweb" + }, + { + "item": "minecraft:cobweb" + }, + { + "item": "minecraft:cobweb" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_snare" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_split.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_split.json index c77b467d18..e6c2d0bffd 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_split.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_split.json @@ -1,7 +1,17 @@ { "type": "ars_nouveau:glyph", "exp": 160, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:relay_splitter" + }, + { + "item": "ars_nouveau:wilden_spike" + }, + { + "item": "minecraft:stonecutter" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_split" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_decoy.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_decoy.json index ac8bbd4cfe..d10ee5658f 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_decoy.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_decoy.json @@ -1,7 +1,23 @@ { "type": "ars_nouveau:glyph", "exp": 160, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:conjuration_essence" + }, + { + "item": "minecraft:armor_stand" + }, + { + "item": "minecraft:armor_stand" + }, + { + "item": "minecraft:armor_stand" + }, + { + "item": "minecraft:armor_stand" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_summon_decoy" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_steed.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_steed.json index 9490deabfd..2e5a9af747 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_steed.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_steed.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "minecraft:leather" + }, + { + "item": "minecraft:leather" + }, + { + "item": "minecraft:leather" + }, + { + "item": "minecraft:leather" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_summon_steed" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_undead.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_undead.json index 458ac5f45c..699cc9e7e8 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_undead.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_undead.json @@ -1,7 +1,17 @@ { "type": "ars_nouveau:glyph", "exp": 160, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:conjuration_essence" + }, + { + "item": "minecraft:bone" + }, + { + "item": "minecraft:wither_skeleton_skull" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_summon_undead" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_vex.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_vex.json index 6739b70f31..fd7468028e 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_vex.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_vex.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 160, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:conjuration_essence" + }, + { + "item": "minecraft:totem_of_undying" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_summon_vex" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_wolves.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_wolves.json index 8b97f9a00c..271bbb55b0 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_wolves.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_summon_wolves.json @@ -1,7 +1,32 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:conjuration_essence" + }, + { + "item": "minecraft:bone" + }, + { + "item": "minecraft:bone" + }, + { + "item": "minecraft:bone" + }, + { + "item": "ars_nouveau:wilden_wing" + }, + { + "item": "ars_nouveau:wilden_wing" + }, + { + "item": "ars_nouveau:wilden_wing" + }, + { + "item": "ars_nouveau:wilden_wing" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_summon_wolves" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_toss.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_toss.json index efbade53fc..52c57c74d6 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_toss.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_toss.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "minecraft:dropper" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_toss" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_touch.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_touch.json index 567b73e20f..782e1627cc 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_touch.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_touch.json @@ -1,7 +1,11 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "tag": "minecraft:buttons" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_touch" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_underfoot.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_underfoot.json index 4c90792231..0312a32626 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_underfoot.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_underfoot.json @@ -1,7 +1,14 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "minecraft:iron_boots" + }, + { + "tag": "minecraft:wooden_pressure_plates" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_underfoot" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_wall.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_wall.json index 26777284ec..d2afd8809d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_wall.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_wall.json @@ -1,7 +1,23 @@ { "type": "ars_nouveau:glyph", "exp": 160, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "minecraft:dragon_breath" + }, + { + "tag": "c:storage_blocks/diamond" + }, + { + "tag": "c:rods/blaze" + }, + { + "tag": "c:rods/blaze" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_wall" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_wind_shear.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_wind_shear.json index 6ad2f95255..857435cca5 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_wind_shear.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_wind_shear.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 55, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:air_essence" + }, + { + "item": "minecraft:iron_sword" + }, + { + "item": "minecraft:iron_sword" + }, + { + "item": "minecraft:iron_sword" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_wind_shear" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_wither.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_wither.json index d1029fcc35..8ccc9b08d0 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_wither.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_wither.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 160, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:abjuration_essence" + }, + { + "item": "minecraft:wither_skeleton_skull" + }, + { + "item": "minecraft:wither_skeleton_skull" + }, + { + "item": "minecraft:wither_skeleton_skull" + } + ], "output": { "count": 1, "id": "ars_nouveau:glyph_wither" diff --git a/src/generated/resources/data/ars_nouveau/recipe/reset.json b/src/generated/resources/data/ars_nouveau/recipe/reset.json index ff5e4e82a4..724faee232 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/reset.json +++ b/src/generated/resources/data/ars_nouveau/recipe/reset.json @@ -1,7 +1,11 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "minecraft:target" + } + ], "output": { "count": 1, "id": "ars_nouveau:reset" diff --git a/src/generated/resources/data/ars_nouveau/recipe/rewind.json b/src/generated/resources/data/ars_nouveau/recipe/rewind.json index 1d965153bc..eb69c2dceb 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/rewind.json +++ b/src/generated/resources/data/ars_nouveau/recipe/rewind.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 160, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:manipulation_essence" + }, + { + "item": "minecraft:clock" + }, + { + "item": "minecraft:clock" + }, + { + "item": "minecraft:clock" + } + ], "output": { "count": 1, "id": "ars_nouveau:rewind" diff --git a/src/generated/resources/data/ars_nouveau/recipe/wololo.json b/src/generated/resources/data/ars_nouveau/recipe/wololo.json index dfe43001a2..ab6fdd3456 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/wololo.json +++ b/src/generated/resources/data/ars_nouveau/recipe/wololo.json @@ -1,7 +1,20 @@ { "type": "ars_nouveau:glyph", "exp": 27, - "inputs": [], + "inputs": [ + { + "item": "ars_nouveau:abjuration_essence" + }, + { + "tag": "c:dyes" + }, + { + "tag": "c:dyes" + }, + { + "tag": "c:dyes" + } + ], "output": { "count": 1, "id": "ars_nouveau:wololo" diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java index e53b64587f..99c196e7a0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java @@ -154,7 +154,7 @@ public static GlyphRecipe fromNetwork(RegistryFriendlyByteBuf buffer) { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( ItemStack.CODEC.fieldOf("output").forGetter(GlyphRecipe::getOutput), - Ingredient.CODEC.listOf().fieldOf("inputs").forGetter(GlyphRecipe::getIngredients), + Ingredient.CODEC.listOf().fieldOf("inputs").forGetter(GlyphRecipe::getInputs), Codec.INT.fieldOf("exp").forGetter(GlyphRecipe::getExp) ).apply(instance, GlyphRecipe::new)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java index 7455743ca2..2b585aeab7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.setup.registry; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.crafting.recipes.*; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.item.crafting.Recipe; @@ -64,7 +65,7 @@ public class RecipeRegistry { public static final DeferredHolder, ModRecipeType> SPELL_WRITE_TYPE = RECIPE_TYPES.register(SPELL_WRITE_RECIPE_ID, () -> new ModRecipeType<>()); public static final DeferredHolder, SpellWriteRecipe.Serializer> SPELL_WRITE_RECIPE = RECIPE_SERIALIZERS.register(SPELL_WRITE_RECIPE_ID, () -> new SpellWriteRecipe.Serializer()); - public static final DeferredHolder, ModRecipeType> GLYPH_TYPE = RECIPE_TYPES.register(GLYPH_RECIPE_ID, () -> new ModRecipeType<>()); + public static final DeferredHolder, RecipeType> GLYPH_TYPE = RECIPE_TYPES.register(GLYPH_RECIPE_ID, () -> RecipeType.simple(ArsNouveau.prefix(GLYPH_RECIPE_ID))); public static final DeferredHolder, GlyphRecipe.Serializer> GLYPH_SERIALIZER = RECIPE_SERIALIZERS.register(GLYPH_RECIPE_ID, () -> new GlyphRecipe.Serializer()); public static final DeferredHolder, ModRecipeType> ARMOR_UPGRADE_TYPE = RECIPE_TYPES.register(ARMOR_RECIPE_ID, () -> new ModRecipeType<>()); From 9b0bfac1128712ce50082683188701b75af81033 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 7 Jul 2024 16:25:03 -0500 Subject: [PATCH 040/363] fix missing recipe types --- .../366e6cedc97b567a76524805ff813b15bef0b4f4 | 4 +- .../43f70b1d0fc3650d25dddf44c6efffef1900bb18 | 54 +-- .../457d401e850e914fe39c053c4aa175787ef49774 | 26 +- .../57a62c95f59bc5868cffb1d040840f0d715117bd | 4 +- .../abe0934abf823d33d3e88ae408c1d215f03f6bdc | 4 +- .../af617d50f86666f21b24a8919c1c50aad8faa4f8 | 28 +- .../cdae075e2d4d58384fe4d2075f6d5323fe5baa69 | 27 ++ .../e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 | 352 +++++++++--------- .../recipe/abjuration_essence.json | 1 + .../data/ars_nouveau/recipe/air_essence.json | 1 + .../ars_nouveau/recipe/alchemists_crown.json | 1 + .../data/ars_nouveau/recipe/amethyst.json | 1 + .../ars_nouveau/recipe/amethyst_block.json | 1 + .../ars_nouveau/recipe/amplify_arrow.json | 1 + .../recipe/amulet_of_mana_boost.json | 1 + .../recipe/amulet_of_mana_regen.json | 1 + .../ars_nouveau/recipe/aqua_affinity_1.json | 1 + .../ars_nouveau/recipe/arcanist_boots.json | 1 + .../ars_nouveau/recipe/arcanist_hood.json | 1 + .../ars_nouveau/recipe/arcanist_leggings.json | 1 + .../ars_nouveau/recipe/arcanist_robes.json | 1 + .../recipe/bane_of_arthropods_1.json | 1 + .../recipe/bane_of_arthropods_2.json | 1 + .../recipe/bane_of_arthropods_3.json | 1 + .../recipe/bane_of_arthropods_4.json | 1 + .../recipe/bane_of_arthropods_5.json | 1 + .../ars_nouveau/recipe/battlemage_boots.json | 1 + .../ars_nouveau/recipe/battlemage_hood.json | 1 + .../recipe/battlemage_leggings.json | 1 + .../ars_nouveau/recipe/battlemage_robes.json | 1 + .../recipe/belt_of_levitation.json | 1 + .../recipe/belt_of_unstable_gifts.json | 1 + .../recipe/blast_protection_1.json | 1 + .../recipe/blast_protection_2.json | 1 + .../recipe/blast_protection_3.json | 1 + .../recipe/blast_protection_4.json | 1 + .../data/ars_nouveau/recipe/blue_dye.json | 1 + .../ars_nouveau/recipe/brazier_relay.json | 1 + .../data/ars_nouveau/recipe/brown_dye.json | 1 + .../budding_conversion/budding_amethyst.json | 1 + .../data/ars_nouveau/recipe/cobblestone.json | 1 + .../recipe/conjuration_essence.json | 1 + .../ars_nouveau/recipe/depth_strider_1.json | 1 + .../ars_nouveau/recipe/depth_strider_2.json | 1 + .../ars_nouveau/recipe/depth_strider_3.json | 1 + .../recipe/dispel_entity/blaze_powder.json | 1 + .../ars_nouveau/recipe/dominion_wand.json | 1 + .../data/ars_nouveau/recipe/drygmy_charm.json | 1 + .../ars_nouveau/recipe/earth_essence.json | 1 + .../data/ars_nouveau/recipe/efficiency_1.json | 1 + .../data/ars_nouveau/recipe/efficiency_2.json | 1 + .../data/ars_nouveau/recipe/efficiency_3.json | 1 + .../data/ars_nouveau/recipe/efficiency_4.json | 1 + .../data/ars_nouveau/recipe/efficiency_5.json | 1 + .../ars_nouveau/recipe/enchanters_eye.json | 1 + .../ars_nouveau/recipe/enchanters_mirror.json | 1 + .../ars_nouveau/recipe/enchanters_shield.json | 1 + .../ars_nouveau/recipe/enchanters_sword.json | 1 + .../ars_nouveau/recipe/feather_falling_1.json | 1 + .../ars_nouveau/recipe/feather_falling_2.json | 1 + .../ars_nouveau/recipe/feather_falling_3.json | 1 + .../ars_nouveau/recipe/feather_falling_4.json | 1 + .../ars_nouveau/recipe/fire_aspect_1.json | 1 + .../ars_nouveau/recipe/fire_aspect_2.json | 1 + .../data/ars_nouveau/recipe/fire_essence.json | 1 + .../ars_nouveau/recipe/fire_protection_1.json | 1 + .../ars_nouveau/recipe/fire_protection_2.json | 1 + .../ars_nouveau/recipe/fire_protection_3.json | 1 + .../ars_nouveau/recipe/fire_protection_4.json | 1 + .../ars_nouveau/recipe/fire_protection_5.json | 1 + .../recipe/first_armor_upgrade.json | 1 + .../data/ars_nouveau/recipe/flame_1.json | 1 + .../data/ars_nouveau/recipe/fortune_1.json | 1 + .../data/ars_nouveau/recipe/fortune_2.json | 1 + .../data/ars_nouveau/recipe/fortune_3.json | 1 + .../recipe/glowstone_block_to_dust.json | 1 + .../data/ars_nouveau/recipe/gravel.json | 1 + .../data/ars_nouveau/recipe/infinity_1.json | 1 + .../data/ars_nouveau/recipe/jar_of_light.json | 1 + .../data/ars_nouveau/recipe/jump_ring.json | 1 + .../data/ars_nouveau/recipe/knockback_1.json | 1 + .../data/ars_nouveau/recipe/knockback_2.json | 1 + .../data/ars_nouveau/recipe/lapis.json | 1 + .../ars_nouveau/recipe/light_blue_dye.json | 1 + .../recipe/light_gray_dye_azure.json | 1 + .../recipe/light_gray_dye_oxeye.json | 1 + .../recipe/light_gray_dye_tulip.json | 1 + .../recipe/lingering_flask_cannon.json | 1 + .../data/ars_nouveau/recipe/looting_1.json | 1 + .../data/ars_nouveau/recipe/looting_2.json | 1 + .../data/ars_nouveau/recipe/looting_3.json | 1 + .../ars_nouveau/recipe/magebloom_crop.json | 1 + .../data/ars_nouveau/recipe/magenta_dye.json | 1 + .../ars_nouveau/recipe/magenta_dye_lilac.json | 1 + .../data/ars_nouveau/recipe/mana_boost_1.json | 1 + .../data/ars_nouveau/recipe/mana_boost_2.json | 1 + .../data/ars_nouveau/recipe/mana_boost_3.json | 1 + .../data/ars_nouveau/recipe/mana_regen_1.json | 1 + .../data/ars_nouveau/recipe/mana_regen_2.json | 1 + .../data/ars_nouveau/recipe/mana_regen_3.json | 1 + .../recipe/manipulation_essence.json | 1 + .../data/ars_nouveau/recipe/multishot_1.json | 1 + .../data/ars_nouveau/recipe/orange_dye.json | 1 + .../data/ars_nouveau/recipe/pierce_arrow.json | 1 + .../data/ars_nouveau/recipe/piercing_1.json | 1 + .../data/ars_nouveau/recipe/piercing_2.json | 1 + .../data/ars_nouveau/recipe/piercing_3.json | 1 + .../data/ars_nouveau/recipe/piercing_4.json | 1 + .../data/ars_nouveau/recipe/pink_dye.json | 1 + .../ars_nouveau/recipe/pink_dye_peony.json | 1 + .../ars_nouveau/recipe/potion_diffuser.json | 1 + .../data/ars_nouveau/recipe/potion_flask.json | 1 + .../recipe/potion_flask_amplify.json | 1 + .../recipe/potion_flask_extend_time.json | 1 + .../ars_nouveau/recipe/potion_melder.json | 1 + .../data/ars_nouveau/recipe/power_1.json | 1 + .../data/ars_nouveau/recipe/power_2.json | 1 + .../data/ars_nouveau/recipe/power_3.json | 1 + .../data/ars_nouveau/recipe/power_4.json | 1 + .../data/ars_nouveau/recipe/power_5.json | 1 + .../recipe/projectile_protection_1.json | 1 + .../recipe/projectile_protection_2.json | 1 + .../recipe/projectile_protection_3.json | 1 + .../recipe/projectile_protection_4.json | 1 + .../recipe/projectile_protection_5.json | 1 + .../data/ars_nouveau/recipe/protection_1.json | 1 + .../data/ars_nouveau/recipe/protection_2.json | 1 + .../data/ars_nouveau/recipe/protection_3.json | 1 + .../data/ars_nouveau/recipe/protection_4.json | 1 + .../data/ars_nouveau/recipe/protection_5.json | 1 + .../data/ars_nouveau/recipe/punch_1.json | 1 + .../data/ars_nouveau/recipe/punch_2.json | 1 + .../recipe/quartz_block_to_quartz.json | 1 + .../ars_nouveau/recipe/quick_charge_1.json | 1 + .../ars_nouveau/recipe/quick_charge_2.json | 1 + .../ars_nouveau/recipe/quick_charge_3.json | 1 + .../data/ars_nouveau/recipe/reactive.json | 1 + .../data/ars_nouveau/recipe/reactive_2.json | 1 + .../data/ars_nouveau/recipe/reactive_3.json | 1 + .../data/ars_nouveau/recipe/reactive_4.json | 1 + .../ars_nouveau/recipe/red_dye_beetroot.json | 1 + .../ars_nouveau/recipe/red_dye_poppy.json | 1 + .../ars_nouveau/recipe/red_dye_rose_bush.json | 1 + .../ars_nouveau/recipe/red_dye_tulip.json | 1 + .../ars_nouveau/recipe/relay_collector.json | 1 + .../ars_nouveau/recipe/relay_deposit.json | 1 + .../ars_nouveau/recipe/relay_splitter.json | 1 + .../data/ars_nouveau/recipe/relay_warp.json | 1 + .../ars_nouveau/recipe/respiration_1.json | 1 + .../ars_nouveau/recipe/respiration_2.json | 1 + .../ars_nouveau/recipe/respiration_3.json | 1 + .../recipe/ring_of_greater_discount.json | 1 + .../recipe/ring_of_lesser_discount.json | 1 + .../ars_nouveau/recipe/sandstone_to_sand.json | 1 + .../recipe/scry_ritual/amethyst_blocks.json | 1 + .../recipe/scry_ritual/amethyst_gems.json | 1 + .../recipe/scry_ritual/coal_ores.json | 1 + .../recipe/scry_ritual/copper_ores.json | 1 + .../recipe/scry_ritual/diamond_ores.json | 1 + .../recipe/scry_ritual/emerald_ores.json | 1 + .../recipe/scry_ritual/gold_ores.json | 1 + .../recipe/scry_ritual/iron_ores.json | 1 + .../recipe/scry_ritual/lapis_ores.json | 1 + .../scry_ritual/netherite_scrap_ores.json | 1 + .../recipe/scry_ritual/quartz_ores.json | 1 + .../recipe/scry_ritual/redstone_ores.json | 1 + .../ars_nouveau/recipe/scryers_oculus.json | 1 + .../recipe/second_armor_upgrade.json | 1 + .../ars_nouveau/recipe/shapers_focus.json | 1 + .../data/ars_nouveau/recipe/sharpness_1.json | 1 + .../data/ars_nouveau/recipe/sharpness_2.json | 1 + .../data/ars_nouveau/recipe/sharpness_3.json | 1 + .../data/ars_nouveau/recipe/sharpness_4.json | 1 + .../data/ars_nouveau/recipe/sharpness_5.json | 1 + .../data/ars_nouveau/recipe/silk_touch_1.json | 1 + .../data/ars_nouveau/recipe/smite_1.json | 1 + .../data/ars_nouveau/recipe/smite_2.json | 1 + .../data/ars_nouveau/recipe/smite_3.json | 1 + .../data/ars_nouveau/recipe/smite_4.json | 1 + .../data/ars_nouveau/recipe/smite_5.json | 1 + .../ars_nouveau/recipe/sorcerer_boots.json | 1 + .../ars_nouveau/recipe/sorcerer_hood.json | 1 + .../ars_nouveau/recipe/sorcerer_leggings.json | 1 + .../ars_nouveau/recipe/sorcerer_robes.json | 1 + .../data/ars_nouveau/recipe/spell_bow.json | 1 + .../ars_nouveau/recipe/spell_crossbow.json | 1 + .../data/ars_nouveau/recipe/spell_sensor.json | 1 + .../data/ars_nouveau/recipe/spell_turret.json | 1 + .../data/ars_nouveau/recipe/spell_write.json | 1 + .../recipe/splash_flask_cannon.json | 1 + .../data/ars_nouveau/recipe/split_arrow.json | 1 + .../recipe/stable_warp_scroll.json | 1 + .../ars_nouveau/recipe/starbuncle_charm.json | 1 + .../data/ars_nouveau/recipe/stone.json | 1 + .../ars_nouveau/recipe/storage_lectern.json | 1 + .../data/ars_nouveau/recipe/sugar_cane.json | 1 + .../data/ars_nouveau/recipe/summon_focus.json | 1 + .../recipe/summon_ritual/bats.json | 1 + .../ars_nouveau/recipe/sweeping_edge_1.json | 1 + .../ars_nouveau/recipe/sweeping_edge_2.json | 1 + .../ars_nouveau/recipe/sweeping_edge_3.json | 1 + .../data/ars_nouveau/recipe/terracotta.json | 1 + .../data/ars_nouveau/recipe/thorns_1.json | 1 + .../data/ars_nouveau/recipe/thorns_2.json | 1 + .../data/ars_nouveau/recipe/thorns_3.json | 1 + .../recipe/thread_amethyst_golem.json | 1 + .../ars_nouveau/recipe/thread_chilling.json | 1 + .../ars_nouveau/recipe/thread_depths.json | 1 + .../ars_nouveau/recipe/thread_drygmy.json | 1 + .../ars_nouveau/recipe/thread_feather.json | 1 + .../ars_nouveau/recipe/thread_gliding.json | 1 + .../ars_nouveau/recipe/thread_heights.json | 1 + .../ars_nouveau/recipe/thread_high_step.json | 1 + .../ars_nouveau/recipe/thread_immolation.json | 1 + .../ars_nouveau/recipe/thread_kindling.json | 1 + .../ars_nouveau/recipe/thread_life_drain.json | 1 + .../recipe/thread_magic_capacity.json | 1 + .../ars_nouveau/recipe/thread_repairing.json | 1 + .../ars_nouveau/recipe/thread_spellpower.json | 1 + .../ars_nouveau/recipe/thread_starbuncle.json | 1 + .../ars_nouveau/recipe/thread_undying.json | 1 + .../ars_nouveau/recipe/thread_warding.json | 1 + .../recipe/thread_whirlisprig.json | 1 + .../data/ars_nouveau/recipe/thread_wixie.json | 1 + .../recipe/timer_spell_turret.json | 1 + .../recipe/tomes/arachne_tome.json | 21 ++ .../recipe/tomes/aurellia_tome.json | 34 ++ .../ars_nouveau/recipe/tomes/bailey_tome.json | 22 ++ .../ars_nouveau/recipe/tomes/chems_tome.json | 23 ++ .../recipe/tomes/darkfira_tome.json | 36 ++ .../recipe/tomes/farfalla_tome.json | 20 + .../recipe/tomes/fireball_tome.json | 22 ++ .../ars_nouveau/recipe/tomes/glow_tome.json | 20 + .../recipe/tomes/gootastic_tome.json | 23 ++ .../ars_nouveau/recipe/tomes/ivy_tome.json | 25 ++ .../ars_nouveau/recipe/tomes/kirin_tome.json | 19 + .../recipe/tomes/lyrellion_tome.json | 22 ++ .../ars_nouveau/recipe/tomes/othy_tome.json | 21 ++ .../recipe/tomes/poseidon_tome.json | 34 ++ .../recipe/tomes/renew_rune_tome.json | 20 + .../ars_nouveau/recipe/tomes/shadow_tome.json | 25 ++ .../recipe/tomes/silvanus_tome.json | 20 + .../recipe/tomes/spinoftw_tome.json | 24 ++ .../recipe/tomes/takeoff_tome.json | 20 + .../ars_nouveau/recipe/tomes/toxin_tome.json | 19 + .../ars_nouveau/recipe/tomes/uni_tome.json | 26 ++ .../ars_nouveau/recipe/tomes/vault_tome.json | 20 + .../recipe/tomes/warp_impact_tome.json | 19 + .../recipe/tomes/xacris_2_tome.json | 25 ++ .../ars_nouveau/recipe/tomes/xacris_tome.json | 23 ++ .../ars_nouveau/recipe/tomes/yeet_tome.json | 24 ++ .../data/ars_nouveau/recipe/unbreaking_1.json | 1 + .../data/ars_nouveau/recipe/unbreaking_2.json | 1 + .../data/ars_nouveau/recipe/unbreaking_3.json | 1 + .../data/ars_nouveau/recipe/void_jar.json | 1 + .../data/ars_nouveau/recipe/wand.json | 1 + .../ars_nouveau/recipe/warp_scroll_copy.json | 1 + .../ars_nouveau/recipe/water_essence.json | 1 + .../ars_nouveau/recipe/whirlisprig_charm.json | 1 + .../data/ars_nouveau/recipe/white_dye.json | 1 + .../data/ars_nouveau/recipe/wixie_charm.json | 1 + .../data/ars_nouveau/recipe/yellow_dye.json | 1 + .../recipe/yellow_dye_sunflower.json | 1 + .../datagen/ApparatusRecipeBuilder.java | 11 +- .../datagen/ApparatusRecipeProvider.java | 9 +- .../datagen/BuddingConversionProvider.java | 2 +- .../common/datagen/CasterTomeProvider.java | 2 +- .../common/datagen/CrushRecipeProvider.java | 2 +- .../common/datagen/DispelEntityProvider.java | 2 +- .../datagen/ImbuementRecipeProvider.java | 2 +- .../arsnouveau/common/datagen/ModDatagen.java | 2 +- .../common/datagen/ScryRitualProvider.java | 2 +- .../common/datagen/SummonRitualProvider.java | 2 +- 273 files changed, 1117 insertions(+), 254 deletions(-) create mode 100644 src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/arachne_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/aurellia_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/bailey_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/chems_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/darkfira_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/farfalla_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/fireball_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/glow_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/gootastic_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/ivy_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/kirin_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/lyrellion_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/othy_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/poseidon_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/renew_rune_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/shadow_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/silvanus_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/spinoftw_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/takeoff_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/toxin_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/uni_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/vault_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/warp_impact_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/xacris_2_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/xacris_tome.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/yeet_tome.json diff --git a/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 b/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 index 65b13c5861..4438826562 100644 --- a/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 +++ b/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 @@ -1,2 +1,2 @@ -// 1.21 2024-07-07T11:53:40.7840663 Dispel Entity Datagen -2b2866dbb0114991a01e7a8e47a99deeeb46c536 data/ars_nouveau/recipe/dispel_entity/blaze_powder.json +// 1.21 2024-07-07T16:24:07.0958013 Dispel Entity Datagen +55a9fb696041d92f6546f9017307a9e660678713 data/ars_nouveau/recipe/dispel_entity/blaze_powder.json diff --git a/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 b/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 index 764dc43ad2..d10b6e0f5f 100644 --- a/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 +++ b/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 @@ -1,27 +1,27 @@ -// 1.21 2024-07-07T11:53:40.7835585 Crush -fe168ce4aeb994be41509cf040d4934c0da0729c data/ars_nouveau/recipe/blue_dye.json -484ecb6d278aedfcc0fb112d90973631171cc78d data/ars_nouveau/recipe/brown_dye.json -6a91f645a9a8acd469ee3ae9be3b5a58f4440ea9 data/ars_nouveau/recipe/cobblestone.json -b57fd21f55173dbfbbdaccce01dc75aee89dcc1b data/ars_nouveau/recipe/glowstone_block_to_dust.json -b66add34a9522eb33302383bc0e4b24a5ab8d956 data/ars_nouveau/recipe/gravel.json -85d82d266ab47916861ba5a154bfa2c4052a49ea data/ars_nouveau/recipe/light_blue_dye.json -70aaf3d10df25f414d66ff8aab7fc959d2a34d25 data/ars_nouveau/recipe/light_gray_dye_azure.json -ed30d14e551881ecd8259b04c20e5b188607b0ab data/ars_nouveau/recipe/light_gray_dye_oxeye.json -beaef70f77bfdabe6182314dba6076e5ded40931 data/ars_nouveau/recipe/light_gray_dye_tulip.json -f263c70ce3f048f852195e687a4a56f622930583 data/ars_nouveau/recipe/magenta_dye.json -30057c3ad58e30919dbc7aeaf48f909e12f5c22e data/ars_nouveau/recipe/magenta_dye_lilac.json -c949a74b9e2eb9ed2cd8baebc46b09478dbe524f data/ars_nouveau/recipe/orange_dye.json -0966d33727af8e0759307a91e291ddc54bda129f data/ars_nouveau/recipe/pink_dye.json -3d43b26b78b728e472208d08befaa7793d436b6c data/ars_nouveau/recipe/pink_dye_peony.json -1bfea1bad5c8279b9a7e4eeec4dfd9a0860f0d56 data/ars_nouveau/recipe/quartz_block_to_quartz.json -2fb2e37a483f9a44c61e1211223d307e15d6755c data/ars_nouveau/recipe/red_dye_beetroot.json -21615074b45085577dd4baf935e1cab2457871a7 data/ars_nouveau/recipe/red_dye_poppy.json -359263c4bf5840bfffcc0868a4682667aaf031f1 data/ars_nouveau/recipe/red_dye_rose_bush.json -877cb67cb7077dadeed4fd1e5cb1ee7146f240da data/ars_nouveau/recipe/red_dye_tulip.json -a71613c06c515d519c73a2fa4c6a13846fcc2809 data/ars_nouveau/recipe/sandstone_to_sand.json -ed909eaa1111d45bcf3b93c2af927c162fd94a8a data/ars_nouveau/recipe/stone.json -3a1839fec755ba01156720a96a0b689a7e185aae data/ars_nouveau/recipe/sugar_cane.json -1c434ab9cb4e8cd46e2a89a17e9a9f6aef4bba6a data/ars_nouveau/recipe/terracotta.json -c80a31b9729d5d5406024f9c25d948b14947aaac data/ars_nouveau/recipe/white_dye.json -c9350c3ec8456a40b8190697bf22b83e32011648 data/ars_nouveau/recipe/yellow_dye.json -947543c9865c485a164cd4ccc7ad70c037a5c335 data/ars_nouveau/recipe/yellow_dye_sunflower.json +// 1.21 2024-07-07T16:24:07.0947972 Crush +b74461afbe445ac042cd1d04298474b2403054ae data/ars_nouveau/recipe/blue_dye.json +0ba5aafe171e9aab7bec69520d99698d5829fd97 data/ars_nouveau/recipe/brown_dye.json +dfee25791763eafe3dacdb2ce45173e1f5862a70 data/ars_nouveau/recipe/cobblestone.json +575e3ab2056dfc4cb00e501183d434b2546fc4b3 data/ars_nouveau/recipe/glowstone_block_to_dust.json +eecc8bebf1941c82ff27d283a099c03f68ed67d8 data/ars_nouveau/recipe/gravel.json +2cf6331b235739fa53cb9deb8d1f443fb38945e3 data/ars_nouveau/recipe/light_blue_dye.json +99c405fb0d2166d0e63729f77caa3af3ebf4b5f1 data/ars_nouveau/recipe/light_gray_dye_azure.json +a92b1477f4702c10681fde040b44253850a7ce34 data/ars_nouveau/recipe/light_gray_dye_oxeye.json +5b00ea72107e83f811de998845aad586f676e030 data/ars_nouveau/recipe/light_gray_dye_tulip.json +4cfa47af390d267002d2ebef40acdd651f79d7b1 data/ars_nouveau/recipe/magenta_dye.json +b667cbe48d5657fbb6b93fb7ff87b7314edd4fb9 data/ars_nouveau/recipe/magenta_dye_lilac.json +fa479269c71bb00c91df23e08e2bf701c64dae9c data/ars_nouveau/recipe/orange_dye.json +dea87ef323ffd7180447688f935fe8afc1031abb data/ars_nouveau/recipe/pink_dye.json +78fa095a707a79aca21c05b7efec251ae1bddbf8 data/ars_nouveau/recipe/pink_dye_peony.json +683c09d8ed09d69a1044486d8d9fc3f65d9f5b17 data/ars_nouveau/recipe/quartz_block_to_quartz.json +5122d980c0da3a720e186ec2c1e490ca7c990333 data/ars_nouveau/recipe/red_dye_beetroot.json +8a755ef772635b520a59ade0adcd3528194416b4 data/ars_nouveau/recipe/red_dye_poppy.json +506b0eba7d9ea4066203c5161c4eac26a71a4c7a data/ars_nouveau/recipe/red_dye_rose_bush.json +fb1c188da8ef388b0aaca584ca10daec68f305ee data/ars_nouveau/recipe/red_dye_tulip.json +9a1165eca1937afd1b7431bc523511bd823da0e6 data/ars_nouveau/recipe/sandstone_to_sand.json +eaa3c40e651175f0f50826932b652454d1a87048 data/ars_nouveau/recipe/stone.json +ff2d3c2c1f91c33d1255753ac8c914399f2343df data/ars_nouveau/recipe/sugar_cane.json +4706b358283011cbc03f2f7aa1d2cf167d4cc350 data/ars_nouveau/recipe/terracotta.json +a378f13327fd0ae314a250c17bd8bb655d54ce34 data/ars_nouveau/recipe/white_dye.json +0e93db507585d02d55d44661d08bbc215f725d9d data/ars_nouveau/recipe/yellow_dye.json +97e2ebd7e70f26dde9172bb3d93e9329a8823aa3 data/ars_nouveau/recipe/yellow_dye_sunflower.json diff --git a/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 b/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 index d5e39979f7..04d72a75aa 100644 --- a/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 +++ b/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 @@ -1,13 +1,13 @@ -// 1.21 2024-07-07T11:53:40.7825589 Scry Ritual Datagen -695e6271a4560287aac86ae20873ccf9f7e42929 data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json -43c47bef5ee1e37a66c36501bfbd81aa093119a0 data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json -498a70fc13f765f5b231c5636569be2bd4b5fa88 data/ars_nouveau/recipe/scry_ritual/coal_ores.json -5c3ca7c082ce229ecbf6b7d7aa2d1b0ac1dfc0e0 data/ars_nouveau/recipe/scry_ritual/copper_ores.json -f4da61f7f1a6a3de589754068a6cc921738c04b1 data/ars_nouveau/recipe/scry_ritual/diamond_ores.json -8203d577c10448ce828b64f4e0d4ee516777aec2 data/ars_nouveau/recipe/scry_ritual/emerald_ores.json -cdb2c98b7fa1f74a4738191595138fd1bcf2f14e data/ars_nouveau/recipe/scry_ritual/gold_ores.json -f602a7106d08a693e2f8a9f389f802426737fd0a data/ars_nouveau/recipe/scry_ritual/iron_ores.json -d3ef057f3a0b80f59da3aedf0f66075d93df4c1c data/ars_nouveau/recipe/scry_ritual/lapis_ores.json -d531c324568ca9469d7e833d5e4550982437f0ec data/ars_nouveau/recipe/scry_ritual/netherite_scrap_ores.json -831457a367560779bd257f382a063d1614edbf95 data/ars_nouveau/recipe/scry_ritual/quartz_ores.json -32a4a18d1567a78e396430fc5ecc83ea9ff42645 data/ars_nouveau/recipe/scry_ritual/redstone_ores.json +// 1.21 2024-07-07T16:24:07.0947972 Scry Ritual Datagen +232f269b1fff184deb77cb619f1cfef3dbb29d1d data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json +b32750a842adeae968d1a3aee9cf1765d896245f data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json +8841bb51fbd86c8fdfd0a8b4ef5a2b6cdf8193a0 data/ars_nouveau/recipe/scry_ritual/coal_ores.json +f298efed24031a5c3e76cc7aa3bf12780e7ced44 data/ars_nouveau/recipe/scry_ritual/copper_ores.json +6e4838ee784bded813559cd2763915defa728d03 data/ars_nouveau/recipe/scry_ritual/diamond_ores.json +602741f50cdf86ba4ba7d2f0085fb35074428d90 data/ars_nouveau/recipe/scry_ritual/emerald_ores.json +a27d99ff76851390a38678f486ce0cc7aa6fb2e4 data/ars_nouveau/recipe/scry_ritual/gold_ores.json +38be1715642ea1e154f86070da87e8d306aa90e1 data/ars_nouveau/recipe/scry_ritual/iron_ores.json +29109a5f9c441d248b187a85e39088d556efa30b data/ars_nouveau/recipe/scry_ritual/lapis_ores.json +816125ded36044cff815e0ef33bb954bb113857e data/ars_nouveau/recipe/scry_ritual/netherite_scrap_ores.json +7eaec9c24128a2b446429d9b0d9114809684a727 data/ars_nouveau/recipe/scry_ritual/quartz_ores.json +9d1e8391c936d3ba734a903b4f68199fd2cb7c52 data/ars_nouveau/recipe/scry_ritual/redstone_ores.json diff --git a/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd b/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd index b633e63758..f94d129dd4 100644 --- a/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd +++ b/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd @@ -1,2 +1,2 @@ -// 1.21 2024-07-07T11:53:40.7815603 Summon Ritual Datagen -bbb35bb1987fe1d0410f4cc51a3b08c5baaf4058 data/ars_nouveau/recipe/summon_ritual/bats.json +// 1.21 2024-07-07T16:24:07.0932908 Summon Ritual Datagen +71d5df7266f203db9b869b49529b50e286ea662d data/ars_nouveau/recipe/summon_ritual/bats.json diff --git a/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc b/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc index f4f3c5b607..681b999833 100644 --- a/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc +++ b/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc @@ -1,2 +1,2 @@ -// 1.21 2024-07-07T11:53:40.7795574 Budding Conversion Datagen -10ac984d2cfbd22599c15cbee3b5718147466f24 data/ars_nouveau/recipe/budding_conversion/budding_amethyst.json +// 1.21 2024-07-07T16:24:07.0922909 Budding Conversion Datagen +bc1af13edf233755680b29b8951ea6dc71e98707 data/ars_nouveau/recipe/budding_conversion/budding_amethyst.json diff --git a/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 b/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 index cf85defce0..f964dc123a 100644 --- a/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 +++ b/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 @@ -1,14 +1,14 @@ -// 1.21 2024-07-07T11:53:40.7805602 Imbuement -974c697181074e040d9d4ebf686b5a90f5def841 data/ars_nouveau/recipe/abjuration_essence.json -ddd8adaffaa8c57e9c166ec4a16c84c4bfb9d82e data/ars_nouveau/recipe/air_essence.json -da10a2f3438ac30b12dd724204bdc7d9dd8289b9 data/ars_nouveau/recipe/amethyst.json -6523b4dc44b09c5423d7c64ff3051438966c5d66 data/ars_nouveau/recipe/amethyst_block.json -115d647a6d4cf519c16da4504e8c8db17f3d5ebc data/ars_nouveau/recipe/amplify_arrow.json -881dccacec3cb203aac682071dafa404e6657149 data/ars_nouveau/recipe/conjuration_essence.json -fe7e60a935b2906e4e10cba135a1948bc5f3a243 data/ars_nouveau/recipe/earth_essence.json -2269915429ba66392d9dbe7b51bb86b2ab820b1b data/ars_nouveau/recipe/fire_essence.json -555d6f245c68358aaf85965d96ec261d92b83a1e data/ars_nouveau/recipe/lapis.json -828ad058c94024260d1bcbf171a9e73cca114b89 data/ars_nouveau/recipe/manipulation_essence.json -1282caff28b4599947022e1981dadcafde2ff6e5 data/ars_nouveau/recipe/pierce_arrow.json -863697816f215752a637966c1f14ef65f5cc6402 data/ars_nouveau/recipe/split_arrow.json -6bd51ed6a5394ebe4b1a7b1557a45eeb34d61c4e data/ars_nouveau/recipe/water_essence.json +// 1.21 2024-07-07T16:24:07.0922909 Imbuement +6e961632461d03b6a326bc5e5b6f2363fd751372 data/ars_nouveau/recipe/abjuration_essence.json +78ba5b7234f21ac8eb5284531097cdeeb2e3dec3 data/ars_nouveau/recipe/air_essence.json +6d57a8685026b987a6012bb592cf26c3dba0e89c data/ars_nouveau/recipe/amethyst.json +5bce1f0b9b92a9acdf9b856dfccd8ff4fb933c67 data/ars_nouveau/recipe/amethyst_block.json +82af4f7ca94590a4c01cbc4e7ab7524f6b603ed9 data/ars_nouveau/recipe/amplify_arrow.json +d90c66a9136a21aa6bace193134fc798183b371c data/ars_nouveau/recipe/conjuration_essence.json +654ada3c74db0c9b91368ea69600dec6ccdcf86a data/ars_nouveau/recipe/earth_essence.json +f34b432647402199429520208ac2be01ca7a863a data/ars_nouveau/recipe/fire_essence.json +6ba22e7cf702e9be5ff66d6b28f62a61639679ce data/ars_nouveau/recipe/lapis.json +5a807ea6ff4091404cfdb2604f1127b92c669b03 data/ars_nouveau/recipe/manipulation_essence.json +4c1e38069e88502d94768dae302127da9f8efbfd data/ars_nouveau/recipe/pierce_arrow.json +7103454e5168ee74e4e2363a76d8c94733b90433 data/ars_nouveau/recipe/split_arrow.json +9204795ab5012a8d4ef3a00a307c1152fda73336 data/ars_nouveau/recipe/water_essence.json diff --git a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 new file mode 100644 index 0000000000..5b8bb6465e --- /dev/null +++ b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 @@ -0,0 +1,27 @@ +// 1.21 2024-07-07T16:24:07.0872914 Ars Nouveau Caster Tomes Datagen +dae41a867bde9258624fe4676128e8140f2e7fe4 data/ars_nouveau/recipe/tomes/arachne_tome.json +991d75b27429c69fdce017dc2c7d033872f1daa1 data/ars_nouveau/recipe/tomes/aurellia_tome.json +2027d79f560de6a1a7829a478f64ccd8f1723bc2 data/ars_nouveau/recipe/tomes/bailey_tome.json +0be05276a18b4cac328dc05898e560b28f7e3a31 data/ars_nouveau/recipe/tomes/chems_tome.json +30027158e8aaa2a82d186f245821355cbcf73d96 data/ars_nouveau/recipe/tomes/darkfira_tome.json +3c4d9ad61832042e38046f7763047126dbc320a0 data/ars_nouveau/recipe/tomes/farfalla_tome.json +f64772fb96f68b7865f64ee40a8718e1a2412fce data/ars_nouveau/recipe/tomes/fireball_tome.json +47410afb03915eaf6626f6cbfb872b647c9ea826 data/ars_nouveau/recipe/tomes/glow_tome.json +787770b1ff09200b5f0b8ad6b30236f532ed7687 data/ars_nouveau/recipe/tomes/gootastic_tome.json +fa2eefd9631a78bf8c31e4c9aad34a2517bb9736 data/ars_nouveau/recipe/tomes/ivy_tome.json +488adf82fa89d69891e333e9bb94290f8ff6b6b1 data/ars_nouveau/recipe/tomes/kirin_tome.json +9836505724bc647ab6d1f92f212ad618456c878c data/ars_nouveau/recipe/tomes/lyrellion_tome.json +d7ff05ccece42ac8ee440c7ef0d707e7c3f7e78b data/ars_nouveau/recipe/tomes/othy_tome.json +94662e20b5eb96453e7b898dc6506a18eb7a46d1 data/ars_nouveau/recipe/tomes/poseidon_tome.json +2a0f47cc40a8be0d2cd08db1a457463b10ed3cf9 data/ars_nouveau/recipe/tomes/renew_rune_tome.json +f50e62b11676774b3822a8cbd7acf1b0efe8df85 data/ars_nouveau/recipe/tomes/shadow_tome.json +a2701c983e0c938a26238d7707a1342cfb74d209 data/ars_nouveau/recipe/tomes/silvanus_tome.json +605a531f2ec2283e77813a283433ff7e10be8340 data/ars_nouveau/recipe/tomes/spinoftw_tome.json +f9bd322e0480d9727fb8b5286163370b3d6f9f3c data/ars_nouveau/recipe/tomes/takeoff_tome.json +d709ea8b46d9d67ee0095740a84645f80e5e1260 data/ars_nouveau/recipe/tomes/toxin_tome.json +966bfe77dcd335285472bd8b7a1b07e88555fd14 data/ars_nouveau/recipe/tomes/uni_tome.json +902b87a75b3feb454c214088587be3aacf8974a5 data/ars_nouveau/recipe/tomes/vault_tome.json +04a2e3eb1f94ccad819d6f6cf49a6b1e23e6ab1b data/ars_nouveau/recipe/tomes/warp_impact_tome.json +f854283682fc7abb17dc158e8383073b07ae96f0 data/ars_nouveau/recipe/tomes/xacris_2_tome.json +4b725a8d4df69200a345a12a58e432979883470e data/ars_nouveau/recipe/tomes/xacris_tome.json +61ac4334cc4de3037b7e803112439361f8d7800d data/ars_nouveau/recipe/tomes/yeet_tome.json diff --git a/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 b/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 index 7d2c13771e..ad2ca696df 100644 --- a/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 +++ b/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 @@ -1,176 +1,176 @@ -// 1.21 2024-07-07T11:53:40.7775578 Apparatus -fb72ed4841264600c52f467c5f2a03ef440a38cb data/ars_nouveau/recipe/alchemists_crown.json -a20b2c86d4399461eaab73edce04323cd3cdc697 data/ars_nouveau/recipe/amulet_of_mana_boost.json -37cae95a78f283e24bedae76534f827c68ba7dd5 data/ars_nouveau/recipe/amulet_of_mana_regen.json -3c3ca7d3b3faa68920b91edce159d18e267abd17 data/ars_nouveau/recipe/aqua_affinity_1.json -4bb885be0907769cdbb71c5a6bc247a10a108bee data/ars_nouveau/recipe/arcanist_boots.json -e01b67707c4965ab890a062c99d50a84bea34461 data/ars_nouveau/recipe/arcanist_hood.json -27daf0b298e5e3859abe32a37373c2f5575a19fe data/ars_nouveau/recipe/arcanist_leggings.json -4224ee563775c88e8c3170bec4eaf388222d6e88 data/ars_nouveau/recipe/arcanist_robes.json -836f88aafe65f5ca70ec225d10f33a1b81dcb388 data/ars_nouveau/recipe/bane_of_arthropods_1.json -7d8d894e7120120f64dc1bcf8fbe33e391146d81 data/ars_nouveau/recipe/bane_of_arthropods_2.json -e4f6fc7200faae766e672f714f190534eff46f5f data/ars_nouveau/recipe/bane_of_arthropods_3.json -ac8c1049cf330496589a63da84fbce561ca817d0 data/ars_nouveau/recipe/bane_of_arthropods_4.json -8763e62776c9ea399194ec666a7ecab826e42185 data/ars_nouveau/recipe/bane_of_arthropods_5.json -efbcfaec39b9f98810bd8fb914289d8c8d920bf8 data/ars_nouveau/recipe/battlemage_boots.json -f194dfc7114c2de9edac4c4ce03e80d8f166aef4 data/ars_nouveau/recipe/battlemage_hood.json -a3105ce016f168cd35f07374b2998971fd6cd9a4 data/ars_nouveau/recipe/battlemage_leggings.json -72313f6dd5f25699d2c1248568952a7b07f55aa7 data/ars_nouveau/recipe/battlemage_robes.json -2f909917745a053b12d96383c01cf16e176246ab data/ars_nouveau/recipe/belt_of_levitation.json -c00e61b0d908051fa11076a67bbad509f22d7882 data/ars_nouveau/recipe/belt_of_unstable_gifts.json -2f3cb27b0a5ad0ffc8980523286f8219c35ca28d data/ars_nouveau/recipe/blast_protection_1.json -0db81d38de1f268e7a1297d0df35b0e11c6d5d54 data/ars_nouveau/recipe/blast_protection_2.json -73a0028e7b35e130e84619657dd694cc217f5685 data/ars_nouveau/recipe/blast_protection_3.json -f7f455dd70ea2c1567983620bd5ef77e183e93ec data/ars_nouveau/recipe/blast_protection_4.json -5241f9a54f8f217641347d189dc09ca9332252a3 data/ars_nouveau/recipe/brazier_relay.json -b39745ef3c086965c1a9e526f556353875261902 data/ars_nouveau/recipe/depth_strider_1.json -c9e83203147d08d92f4c623c4bbd1be3ffe14cb7 data/ars_nouveau/recipe/depth_strider_2.json -f9cec31b747fdfba29153bb62a19a60bfbcf376c data/ars_nouveau/recipe/depth_strider_3.json -a84d7d4a1358ca424f3f3233eb071b8fd7252281 data/ars_nouveau/recipe/dominion_wand.json -3a584f734506921105848c29b99124a896201c0b data/ars_nouveau/recipe/drygmy_charm.json -20ba7d0ed572ff4601a3347a9d7dcdf02790aa3e data/ars_nouveau/recipe/efficiency_1.json -f35e1bd98bf7be6d18a2d6a5d0d37ed2967feb10 data/ars_nouveau/recipe/efficiency_2.json -06ebaa07668833986508f2486cfdd1663d23d942 data/ars_nouveau/recipe/efficiency_3.json -ca4032c5216d4036407bd11b66c8e4c9d318892d data/ars_nouveau/recipe/efficiency_4.json -9573fc0c5ac7c54376524cdc828877655547b4bb data/ars_nouveau/recipe/efficiency_5.json -4778856ebc7b6e16b707f3874d0780879fc9de58 data/ars_nouveau/recipe/enchanters_eye.json -a984f0a5fa46d034b53917e190ca973c5799d95a data/ars_nouveau/recipe/enchanters_mirror.json -d1361bef3b5a881a23ea8ce9a41e69b81d2b0f7b data/ars_nouveau/recipe/enchanters_shield.json -c1c6dab35abdb2448ec9c86797a3226720908961 data/ars_nouveau/recipe/enchanters_sword.json -c9742f93a27a3d4fbb39f87786a6da625fbdbe93 data/ars_nouveau/recipe/feather_falling_1.json -b84415cf0d72fa5dcfcb646b603133d1df95e3ec data/ars_nouveau/recipe/feather_falling_2.json -c8d454d4720b6a6249cc9917b7a2a1692916d265 data/ars_nouveau/recipe/feather_falling_3.json -60e4a34f9624b7206c7446f264fa322a2258ae09 data/ars_nouveau/recipe/feather_falling_4.json -9b45c91132e66e72b411740e43bd68a504fd16f4 data/ars_nouveau/recipe/fire_aspect_1.json -c97610865013e5e4484fb3fb806f1b07e84443b5 data/ars_nouveau/recipe/fire_aspect_2.json -ea20e4c2b57851bb7d916dbc20ed4237ef5d2694 data/ars_nouveau/recipe/fire_protection_1.json -d62e1cbf1e93b621b5616ab5b1f5dbeda6750fb9 data/ars_nouveau/recipe/fire_protection_2.json -8ed43885c76be58dc964f6b6785bc4d86c92d69f data/ars_nouveau/recipe/fire_protection_3.json -8b2b2a014044e4d1e34f4652145c4a4988d99ecd data/ars_nouveau/recipe/fire_protection_4.json -be0f61a87d68ff18022d6641cb41c642a606ef92 data/ars_nouveau/recipe/fire_protection_5.json -d7ba28ce9e84739524af257b5fd9e0f967389631 data/ars_nouveau/recipe/first_armor_upgrade.json -8cc2eafe96e3570b0f0580650b072e33bd474960 data/ars_nouveau/recipe/flame_1.json -9e6e433a01950ae0b24c139a1b24dbc56266b92a data/ars_nouveau/recipe/fortune_1.json -9981a4e919c62d834548fdc7f67346f710a05cbf data/ars_nouveau/recipe/fortune_2.json -373414b2253612d371fc97a94a53d9dbf87563df data/ars_nouveau/recipe/fortune_3.json -6f91076bd12652d475a11306f009ba31cea8e348 data/ars_nouveau/recipe/infinity_1.json -54af5f9dae88edff870af8c7da2ca460a190c8fd data/ars_nouveau/recipe/jar_of_light.json -4fc7dba3b56892ace79cf167e4e771ae97137da1 data/ars_nouveau/recipe/jump_ring.json -6af4709c8b8a5fe042ce6ad4822541a96690948c data/ars_nouveau/recipe/knockback_1.json -3bba1b55de1f2b5621af044b03d2a788a4f7aec3 data/ars_nouveau/recipe/knockback_2.json -415023665c08999aa1069b92ddda02ecac00f1b1 data/ars_nouveau/recipe/lingering_flask_cannon.json -398d2e9bed0a267ebb0cb6873776338089e7fb5c data/ars_nouveau/recipe/looting_1.json -ee228546696ced85f9490ce9da08cf7a0a6ac4ba data/ars_nouveau/recipe/looting_2.json -e5ae08c2f47d0cda8af711e6fdbc21c43b445217 data/ars_nouveau/recipe/looting_3.json -37ab56d8d94804b98eea95e3ec4a5db17c49b0f5 data/ars_nouveau/recipe/magebloom_crop.json -6523a5c4dd039bc8fe3bda029d8ce7e7b61c35fa data/ars_nouveau/recipe/mana_boost_1.json -e63fa11ec0cdfb453cdad6eb23a625a74c80bbac data/ars_nouveau/recipe/mana_boost_2.json -51a5ced96b1fd86b52a9403dc02c613b97fd5d95 data/ars_nouveau/recipe/mana_boost_3.json -949a0513b78d2e757d99d4830279a37c00dc59d7 data/ars_nouveau/recipe/mana_regen_1.json -e31d6c99de9494b0dd7cd99328a52901183c52a0 data/ars_nouveau/recipe/mana_regen_2.json -0ed170543581cba1ff4f1590b7ef1d1444a7c1eb data/ars_nouveau/recipe/mana_regen_3.json -c8351e79728ba327e6b20dada8c371e0ce642d05 data/ars_nouveau/recipe/multishot_1.json -136fcdb50195cb46c57bf2a6934879d0ee0c986d data/ars_nouveau/recipe/piercing_1.json -7be6cc46e8c935b1558eb64439c6586c55929dc9 data/ars_nouveau/recipe/piercing_2.json -15731b82f78f06d0b45268bc0f384d7d1632a94d data/ars_nouveau/recipe/piercing_3.json -5e613451e8dcc3037a8e2e27f623cbe317923f23 data/ars_nouveau/recipe/piercing_4.json -24636ce003b15cdadc23ecb7f0ae96e99e48e1f9 data/ars_nouveau/recipe/potion_diffuser.json -d46ddfcd500e082dd23c2bd419ab39c9404ccf1e data/ars_nouveau/recipe/potion_flask.json -f6556751116a1335bbce68ca3891bd4ff135a079 data/ars_nouveau/recipe/potion_flask_amplify.json -41b3f96ee5fd919d2db71ca0ad0fdbc191e1eebe data/ars_nouveau/recipe/potion_flask_extend_time.json -f5857569dca9a51e79d54bc40f1a61a4f9fdc4c2 data/ars_nouveau/recipe/potion_melder.json -1bf1edef9f01d6386afd84c9b3442330f6b44272 data/ars_nouveau/recipe/power_1.json -fd4f92f95c4153d9544d8b621269ea5d66383f3d data/ars_nouveau/recipe/power_2.json -4a2436e69d9429db5eea62c26ccd7d2bbd4759db data/ars_nouveau/recipe/power_3.json -edec15450793c872f73af1a89796cf7d36326fce data/ars_nouveau/recipe/power_4.json -ee211ae3eb2864c842b398d5496d66bbb15882d1 data/ars_nouveau/recipe/power_5.json -b442abbdd012b59a16a8f369faded364177a2688 data/ars_nouveau/recipe/projectile_protection_1.json -e36f7a2ad97fa70c74d93eee1277fd862ce9f9c3 data/ars_nouveau/recipe/projectile_protection_2.json -a9d521d5658d4fc759556468c2d6ce2f7bb3babf data/ars_nouveau/recipe/projectile_protection_3.json -4527c879e9543624cbd49c677422f1bcdf77859d data/ars_nouveau/recipe/projectile_protection_4.json -b96befa3dd8ce69edde26310cb0d610b0ec0e512 data/ars_nouveau/recipe/projectile_protection_5.json -f2f1b0fe3b4ec8d7fced37e3f71ee17dc1eccb8b data/ars_nouveau/recipe/protection_1.json -aeab337473e8300929c44ee4a02cd7e04d69d029 data/ars_nouveau/recipe/protection_2.json -597f9e8587d320a02377ea76ead9999c03df1931 data/ars_nouveau/recipe/protection_3.json -84e9441d9c4bdb0c829569f96635a0100db4c1e8 data/ars_nouveau/recipe/protection_4.json -590ffda2fb09414779c01eceea08da6aac78f965 data/ars_nouveau/recipe/protection_5.json -94f6bb8c547fcc36bbb56a25dd146153ea776a19 data/ars_nouveau/recipe/punch_1.json -f492d4cae146653d3d3dba3ef12c23501848d6f5 data/ars_nouveau/recipe/punch_2.json -314322ca49b6c68038a64dd591ab2cc8c1c794d0 data/ars_nouveau/recipe/quick_charge_1.json -d7dcd72e99895701e20df052bd7df87488abb774 data/ars_nouveau/recipe/quick_charge_2.json -11e0eb139b7539d0f7b12dad730dd1c983287623 data/ars_nouveau/recipe/quick_charge_3.json -ce8fc7478cb7c46d3c069099b007a0d0cefce4c7 data/ars_nouveau/recipe/reactive.json -f24b312ca6b9c6fa83eeb6d106370bab76eac2a9 data/ars_nouveau/recipe/reactive_2.json -51941f8dc7728de8f91d382d29f67ad1b0ee56a0 data/ars_nouveau/recipe/reactive_3.json -be41ac9628db4fac57839c2ee59c1cab6621d002 data/ars_nouveau/recipe/reactive_4.json -729c1b99be46dccff5ecef88529fedb3c3ad6600 data/ars_nouveau/recipe/relay_collector.json -9626aed3cfb65ac73e0369aaab5fac731d8797ad data/ars_nouveau/recipe/relay_deposit.json -67ebb7c1e627e0e555fc1843ec9e93b74cdeb0c6 data/ars_nouveau/recipe/relay_splitter.json -facba97725c9567e1114c938c91a7301268d32be data/ars_nouveau/recipe/relay_warp.json -7bf7e1c54873c01a8710bf3f3596552e7a82b2fd data/ars_nouveau/recipe/respiration_1.json -447c42afe8c28cd97513fbd0595a449316077982 data/ars_nouveau/recipe/respiration_2.json -1e7ce9f4616f86d76e71d1298f3464e5ded813bd data/ars_nouveau/recipe/respiration_3.json -4a14bf05b33d0216566f78384421bb412876fafd data/ars_nouveau/recipe/ring_of_greater_discount.json -8806af9377ef69b7d2443aa76ea17dfd68ae2dee data/ars_nouveau/recipe/ring_of_lesser_discount.json -6f03c848b9b537e9e56cc6da6deb285a38adb8ab data/ars_nouveau/recipe/scryers_oculus.json -f0940942eece51d48b5141a671419fc47b64c792 data/ars_nouveau/recipe/second_armor_upgrade.json -0f273466b72acc20bc5fe007e7d19acaca9e7f3a data/ars_nouveau/recipe/shapers_focus.json -edd9f6e7a2c5e7f57ff82adf9a70585910312360 data/ars_nouveau/recipe/sharpness_1.json -786d4ec17b76aec0201c374cbfd32bd7520a1bd2 data/ars_nouveau/recipe/sharpness_2.json -870f4a35f2ec26a9d348ec36f753cad264588fe9 data/ars_nouveau/recipe/sharpness_3.json -9cf5eea51dfc1db4ce8dc8a5cd341c0e1b271793 data/ars_nouveau/recipe/sharpness_4.json -bca5b12e4bb61ff53bd8442b72e395c1895ceed7 data/ars_nouveau/recipe/sharpness_5.json -e59728e2a10112af6d9b18292b8ee8919409f1b7 data/ars_nouveau/recipe/silk_touch_1.json -cedeb7a384c1597624a7dcdf09fcb444e3c2e881 data/ars_nouveau/recipe/smite_1.json -ab79dfed1d55dccf493a4885423d28c332b4401b data/ars_nouveau/recipe/smite_2.json -eddb9e7681694d9c7df156d6b8edd7d1cfc439dd data/ars_nouveau/recipe/smite_3.json -10e6ba9c28f88386fb85d9aa9a6bf9fb9282b552 data/ars_nouveau/recipe/smite_4.json -b75ee0a9fbeae85fde264e136c14467210e0bbd7 data/ars_nouveau/recipe/smite_5.json -94e7fb147d453bb70a5771dbe221e3c75b505cd3 data/ars_nouveau/recipe/sorcerer_boots.json -89d4ec865cb6c4f84a2b92f531b7bf5f2f254bda data/ars_nouveau/recipe/sorcerer_hood.json -02ef475aeac5bb43ea6ac147c8d366cff5411aa5 data/ars_nouveau/recipe/sorcerer_leggings.json -95fbe3adce48d9c0cac8267f3be1c03d1f189027 data/ars_nouveau/recipe/sorcerer_robes.json -b39dd805b19f2b16914a520230959c2c6c65c825 data/ars_nouveau/recipe/spell_bow.json -f8323767064c376cb90e04d61b27e2ef9da523b1 data/ars_nouveau/recipe/spell_crossbow.json -be82ae84c0ebbfdfbe719a94d14818f7bffe7b99 data/ars_nouveau/recipe/spell_sensor.json -65e4c7cc88cdf662f3e6c6d5e2a3b1713a46c16d data/ars_nouveau/recipe/spell_turret.json -8b74efc903e7fd30e9be0a3bf50dc811b227ac1b data/ars_nouveau/recipe/spell_write.json -faff46a4612cca552249ac69d3cdb8d67c299a19 data/ars_nouveau/recipe/splash_flask_cannon.json -7f21540a5bdb3d65984eec8a61a4e78f9cf1edfe data/ars_nouveau/recipe/stable_warp_scroll.json -8d5f0c39e86ad2255dfa6850fc02df88823f3f55 data/ars_nouveau/recipe/starbuncle_charm.json -ff7f37fabc6f5e1e9286f95a67aa8f41fec14963 data/ars_nouveau/recipe/storage_lectern.json -f8e7cd194d9cb5c6aa56a70b93ae831f0d420ac7 data/ars_nouveau/recipe/summon_focus.json -82ac616ba3ffbc862e5bce4d6a3a592c4aab4e69 data/ars_nouveau/recipe/sweeping_edge_1.json -465d3415cbfb4906da456a35f16f7cfcd6d94fb7 data/ars_nouveau/recipe/sweeping_edge_2.json -c279614bf63100e9c1f3832b971cfc62ccec86be data/ars_nouveau/recipe/sweeping_edge_3.json -7a8c06788707cf87a52606561556ed2d5796af7e data/ars_nouveau/recipe/thorns_1.json -6d66dfcb9b044c91c59ecfee257b3444ceab5ca0 data/ars_nouveau/recipe/thorns_2.json -f0a934796f04c228a5acc8458c350edceba733e8 data/ars_nouveau/recipe/thorns_3.json -9e54d82da1da081044c46ba528e282ef680bbf4f data/ars_nouveau/recipe/thread_amethyst_golem.json -31b91d2dcde117b1e63c757d9b6c502fb3f9cbfc data/ars_nouveau/recipe/thread_chilling.json -e12e5d8abfeca1d77177f099e099b2a673c0b507 data/ars_nouveau/recipe/thread_depths.json -206065144c7a2b27fe83824b81ed4de131dafccd data/ars_nouveau/recipe/thread_drygmy.json -036fbe60a5ceab2389343cd9bf269196a507c21d data/ars_nouveau/recipe/thread_feather.json -2cbb8df5e30297af6336a24dc58e0502fef02a42 data/ars_nouveau/recipe/thread_gliding.json -ddbe9f0a66cde1fc6d0da2b27c7145d0e7874a78 data/ars_nouveau/recipe/thread_heights.json -83b148515f0687dddfbb730c3edbefa98f86abc6 data/ars_nouveau/recipe/thread_high_step.json -20e017e91d313e59032b5e7f23aa69930384f8a8 data/ars_nouveau/recipe/thread_immolation.json -8ded4b4995884f924bc05d39976f0e8092984a5a data/ars_nouveau/recipe/thread_kindling.json -e1f904ed98b8038868d0445b35c7fc8cdc534024 data/ars_nouveau/recipe/thread_life_drain.json -ccd0369f5106f228ec923319b32f6ac6d370c8c5 data/ars_nouveau/recipe/thread_magic_capacity.json -ed7eafe49de50eb5cd865d29f786ea2a76df02f0 data/ars_nouveau/recipe/thread_repairing.json -b7497d22af35b79a8bcf30644be7301bde408fb5 data/ars_nouveau/recipe/thread_spellpower.json -24fb3d52e1bfe932469c5eb74a0c59c445df77e9 data/ars_nouveau/recipe/thread_starbuncle.json -b5480513683ac166c8f3ac8d973cb24b29d918fc data/ars_nouveau/recipe/thread_undying.json -68a80f65febc886f3ee09deff19fdc72e6bf1442 data/ars_nouveau/recipe/thread_warding.json -56db861c10828de84d8c8fe9c4f5cfbec622751a data/ars_nouveau/recipe/thread_whirlisprig.json -495fe90ec4b2c80444611a169db9ee421b77ae9c data/ars_nouveau/recipe/thread_wixie.json -87a1e549710354e03939b5a88685f15ee5eb995b data/ars_nouveau/recipe/timer_spell_turret.json -69180aa1d418f1bf68eeda49e2d7f573c914a51d data/ars_nouveau/recipe/unbreaking_1.json -240061b982b2b457462622b1b48f676dc83e9be6 data/ars_nouveau/recipe/unbreaking_2.json -e2f19fc062070e24ae35597c096eb691766b551c data/ars_nouveau/recipe/unbreaking_3.json -366114e867ab11ec19a9c13e3e8f88a4b681ec10 data/ars_nouveau/recipe/void_jar.json -b9c3afd44505bf198b797a2b5f46ce9a5ed3f18b data/ars_nouveau/recipe/wand.json -55df26b1d3d21a7d0240837aa404ad7f1bd3e0de data/ars_nouveau/recipe/warp_scroll_copy.json -d403242b22926cd16ad7047d9b8891d7f5a487ff data/ars_nouveau/recipe/whirlisprig_charm.json -c89e7cfa113958b729e50ac301a002d524989a5d data/ars_nouveau/recipe/wixie_charm.json +// 1.21 2024-07-07T16:24:07.0892912 Apparatus +adc3e3b582ab4d1fd6f29537bddaaecb9eaa0c2d data/ars_nouveau/recipe/alchemists_crown.json +c0b8211dd4aa5048b9408b5ae3bb42df184a218a data/ars_nouveau/recipe/amulet_of_mana_boost.json +04e95fa57004644ccb10c66974f34e38f3ef40c4 data/ars_nouveau/recipe/amulet_of_mana_regen.json +c7903c10d241ae32e21c2503bad9fcbf9cd2d68e data/ars_nouveau/recipe/aqua_affinity_1.json +96764d0d1d6065369fb46ddcfb990499e386dd24 data/ars_nouveau/recipe/arcanist_boots.json +ccbfd1ce265f3c21637747b7c34bb6ec877d621c data/ars_nouveau/recipe/arcanist_hood.json +d0f08dac1d7b5b3425d9df08cf446579311751f6 data/ars_nouveau/recipe/arcanist_leggings.json +9f811c123e1d73a606699a2a584db811ba362820 data/ars_nouveau/recipe/arcanist_robes.json +c2685fa7425b28a2214a70cd6709d8ea6632013b data/ars_nouveau/recipe/bane_of_arthropods_1.json +270331308c30919db45955292bdea990345bfcba data/ars_nouveau/recipe/bane_of_arthropods_2.json +5c3c462dfb21fd35d36b5721d05f455ff8b16b29 data/ars_nouveau/recipe/bane_of_arthropods_3.json +7df061c672b7cde4e94721d7b7f95e6446cfc152 data/ars_nouveau/recipe/bane_of_arthropods_4.json +1ce20a87cdee62e2fe40efc4b7759b39a1f3cf54 data/ars_nouveau/recipe/bane_of_arthropods_5.json +55ee89af0523501993d31dc7f4c1f53d16a45d79 data/ars_nouveau/recipe/battlemage_boots.json +db6cc03b8c0827571f8ed1b4ff28e560a00f624d data/ars_nouveau/recipe/battlemage_hood.json +80f55b2d64b5e90a9881119019c2fe4579f38fd1 data/ars_nouveau/recipe/battlemage_leggings.json +817efea3bd03f62a05b8237c37055658980da1ff data/ars_nouveau/recipe/battlemage_robes.json +513212420a63579f686068ddd83cad055772a60b data/ars_nouveau/recipe/belt_of_levitation.json +3e8803b889657fd206be6a5d3be96e430d6bad03 data/ars_nouveau/recipe/belt_of_unstable_gifts.json +bd291159ad9de2a17f05e205fdc30a4ec98c9cb0 data/ars_nouveau/recipe/blast_protection_1.json +22d7a9776b7a468bd9ad04594ab50e6640b28498 data/ars_nouveau/recipe/blast_protection_2.json +0e1d9224e9944898cddb6e37807a9db0e96e158d data/ars_nouveau/recipe/blast_protection_3.json +e27a5eb2238ed6cf85f7e49e9ad8fc5281de458e data/ars_nouveau/recipe/blast_protection_4.json +46bcd2e3d2267631de94dee8d44076cf5481332b data/ars_nouveau/recipe/brazier_relay.json +f0084bd997147acbae7dea267649414ef7e70cb1 data/ars_nouveau/recipe/depth_strider_1.json +cd5dffb6ead1bd7c3844b1c828d82455a0e84cda data/ars_nouveau/recipe/depth_strider_2.json +a17cc53c646cb611e850843c86e1ba5864b1e9dc data/ars_nouveau/recipe/depth_strider_3.json +37ecc47b3e1ae0a3c421e6f0f4f68600649760fb data/ars_nouveau/recipe/dominion_wand.json +a8c38051e5ebad721167b75d48000aa266b0a6b3 data/ars_nouveau/recipe/drygmy_charm.json +e090e7f262cc0373739085650e8eb0e3eb113d71 data/ars_nouveau/recipe/efficiency_1.json +6033cb96844662af7aeec4f9acaf45a0249eff48 data/ars_nouveau/recipe/efficiency_2.json +899b924d31dfdfc1a1ada96bcb7cd362bdcbf9cc data/ars_nouveau/recipe/efficiency_3.json +c9b8464f5d7f78072ab8bdd4456e207a28088771 data/ars_nouveau/recipe/efficiency_4.json +0bf51e7737df17e43ac7c27ec6a871391d3aeb32 data/ars_nouveau/recipe/efficiency_5.json +1177e27111938b858fe4cbe43a3c8267e315c57c data/ars_nouveau/recipe/enchanters_eye.json +c82f44864c4f3bd16211d30f6972c9088d119678 data/ars_nouveau/recipe/enchanters_mirror.json +3230b794ed1e8191c8b3efb9d02ae110565da5ce data/ars_nouveau/recipe/enchanters_shield.json +c7675ead108d9d798bc12e5ab69da871468818b3 data/ars_nouveau/recipe/enchanters_sword.json +b3b17d161dc1bd034222098ea21d57bcaa9f32e3 data/ars_nouveau/recipe/feather_falling_1.json +24838ac2041b0bb5ab33fb3269850a05db93538c data/ars_nouveau/recipe/feather_falling_2.json +0a46a44ec5fc1431636d67d9f4eaf33adec9a59f data/ars_nouveau/recipe/feather_falling_3.json +3d1a3d5d7126541f11bfa5571465503420845785 data/ars_nouveau/recipe/feather_falling_4.json +07297d5bcd8eb8cf769b29de69e04c75adbd470f data/ars_nouveau/recipe/fire_aspect_1.json +7e0a25bd3ddeacb56ef95e39bfb16cc191b5f3ca data/ars_nouveau/recipe/fire_aspect_2.json +34026b2d3cc388e48e837d633d1b3d917879c092 data/ars_nouveau/recipe/fire_protection_1.json +07361509c856336c7f63013f764ece80e3d675a0 data/ars_nouveau/recipe/fire_protection_2.json +a1ca345ee50e3a7aa17ebe5af1e8eccf6f1eabf8 data/ars_nouveau/recipe/fire_protection_3.json +bfff59426d532856853a0c4be40f53dc2743afa5 data/ars_nouveau/recipe/fire_protection_4.json +8793ee59ded74d4ef71c51b8b658955c849ce184 data/ars_nouveau/recipe/fire_protection_5.json +891a9103db5ab6a8e7fc019a0eabbafe6c400263 data/ars_nouveau/recipe/first_armor_upgrade.json +5ad83bd08d654192cdbbdeffdc7d3d29bcf138e7 data/ars_nouveau/recipe/flame_1.json +60d0ef222d29779a8a7a4f3f89c6a4dfb45426e7 data/ars_nouveau/recipe/fortune_1.json +332ea631e62861368f9f8815b0234288d99a24c3 data/ars_nouveau/recipe/fortune_2.json +a85d82f0987c559d883f47325adb184724c7e12d data/ars_nouveau/recipe/fortune_3.json +83baea4f1c4fd98b9ef02fb4be1d5eaa5bdc6583 data/ars_nouveau/recipe/infinity_1.json +d714a9e43538aa400e99ebda2de4dac2aeb315e6 data/ars_nouveau/recipe/jar_of_light.json +eed7cfd0f57e1b29f07d6f63f835a00f731ac18c data/ars_nouveau/recipe/jump_ring.json +0ec904b02e9d4d1138b33e5612fa7b47292de10f data/ars_nouveau/recipe/knockback_1.json +045e9c2a274ed482ee096b6ec4037215ef6e7292 data/ars_nouveau/recipe/knockback_2.json +a0fa0cf20066df47ac661b2eed172d114d693fb5 data/ars_nouveau/recipe/lingering_flask_cannon.json +7c06fa55b445caaacb922e1f9d48a6c15610534b data/ars_nouveau/recipe/looting_1.json +0d282841438348a1a629743cf16b8c089103e138 data/ars_nouveau/recipe/looting_2.json +e529a6d7f3b18a773a3722af790dfcf06c8b5f92 data/ars_nouveau/recipe/looting_3.json +a25d3e554e201e1966bcc016f10f13c82e59c1c0 data/ars_nouveau/recipe/magebloom_crop.json +02f0ec7b168e847064743c88cc873fd1de014a4d data/ars_nouveau/recipe/mana_boost_1.json +6933f4ce281c6cb19d09ddbc01234d28b1c37c25 data/ars_nouveau/recipe/mana_boost_2.json +4eb3128e8da4192ed575e1ed7eb4ead88dc999b0 data/ars_nouveau/recipe/mana_boost_3.json +6e6279a3c8c5fd1ba177e4c82b8aff2c690bd8e1 data/ars_nouveau/recipe/mana_regen_1.json +3cd4fe7e4109fe06d1c5d8736234543da4a73689 data/ars_nouveau/recipe/mana_regen_2.json +7f59dc065294ad51b4006a09cd2c59c08df70925 data/ars_nouveau/recipe/mana_regen_3.json +12fad32c9b5648229eb5030d03c3965bd097ba12 data/ars_nouveau/recipe/multishot_1.json +6d39b96ce70048c9b772faadaf43156da080a48c data/ars_nouveau/recipe/piercing_1.json +150294840f8028ffaff57c122a0c40345e35042a data/ars_nouveau/recipe/piercing_2.json +1a386179b77c3030f12ab945f056af2bc14562cf data/ars_nouveau/recipe/piercing_3.json +21b34ef546d674cc8d497e47bf943975bc3f3bb9 data/ars_nouveau/recipe/piercing_4.json +946b4f2c7226fb68ce62e48f64610e918a31417b data/ars_nouveau/recipe/potion_diffuser.json +b5b7698755d881317f24315ade8a30f27dd84f84 data/ars_nouveau/recipe/potion_flask.json +036e4f8c9ba8b1e91627021c43283ee08a15693d data/ars_nouveau/recipe/potion_flask_amplify.json +14373b9cbd4d828f577f37674813be308a39b711 data/ars_nouveau/recipe/potion_flask_extend_time.json +9607d38c036f878bc54cd4813c673c1c80f20e49 data/ars_nouveau/recipe/potion_melder.json +5f9e3b8280154539db4ef7d2205046e110eecf77 data/ars_nouveau/recipe/power_1.json +93318d756f8592e0123696ad21a0e9e924e02022 data/ars_nouveau/recipe/power_2.json +ebf25eeafaf1f617beb8e0e7486300ba680b8f34 data/ars_nouveau/recipe/power_3.json +00954478ee8e34dce91d764f1291828bfd2d0c76 data/ars_nouveau/recipe/power_4.json +c3e383cf1219515b6859261c88e195f04573a0af data/ars_nouveau/recipe/power_5.json +b080a3c1c3b090660dabb9e26c7b8972196b6915 data/ars_nouveau/recipe/projectile_protection_1.json +cbcc02cd5cebbe11666dfbccf4573d727a519f14 data/ars_nouveau/recipe/projectile_protection_2.json +bd36a6e55467a28689f6ae1154df52144ea6ac41 data/ars_nouveau/recipe/projectile_protection_3.json +f4260789b8d3f88ea51c8699faf334b1fae1dcb9 data/ars_nouveau/recipe/projectile_protection_4.json +b9474440a26f8aa7f4fece69b76417072cc5bbfa data/ars_nouveau/recipe/projectile_protection_5.json +525bb3a723cec3461b8581462e7dbcde2aed0a4a data/ars_nouveau/recipe/protection_1.json +19f411ca910e67898a6df6f30a883092d56d22e0 data/ars_nouveau/recipe/protection_2.json +d0b97eb377cfad2537c836ac5a858f1a8631949f data/ars_nouveau/recipe/protection_3.json +3e8b3d9328d5090d43e2d1adc8191ce3f0aecf19 data/ars_nouveau/recipe/protection_4.json +a94c38c55265345cdd8e490507194a302d6aa4c2 data/ars_nouveau/recipe/protection_5.json +74b575a1b366837c550a88aa2b7faf2f1a6f6294 data/ars_nouveau/recipe/punch_1.json +7881302755f7b430e1a47fffb0fa9b61255a6d4f data/ars_nouveau/recipe/punch_2.json +c676f30517b2985d9d16f1de47323e42124adff2 data/ars_nouveau/recipe/quick_charge_1.json +6d26004fa4f7cc97232eaf240e20f842add3211b data/ars_nouveau/recipe/quick_charge_2.json +2a899f087613df5da7263db621e085217b45bb77 data/ars_nouveau/recipe/quick_charge_3.json +a782baa08e8b6a0a8978e3e8728921f8b8531d8f data/ars_nouveau/recipe/reactive.json +f8d2a48ea7cbb131ffce8dfbeaa54e7c668be22f data/ars_nouveau/recipe/reactive_2.json +e1a23f3407ed876596ba65d5a38b32ea365db494 data/ars_nouveau/recipe/reactive_3.json +672d478694316122e6784152221af74d032d336a data/ars_nouveau/recipe/reactive_4.json +954bf970a853a1ea853b2cdd51dde2302fa49ea2 data/ars_nouveau/recipe/relay_collector.json +cd92ef2ff820bcbf43c00429923659e14ecc9f78 data/ars_nouveau/recipe/relay_deposit.json +a72c98dc52caaa8b2186f851b8f57f33fb349200 data/ars_nouveau/recipe/relay_splitter.json +758f93d64c237455314fb2b2b5c8d7d616c55967 data/ars_nouveau/recipe/relay_warp.json +1bc88a5e5a73599b28a31f7ded6f84633573c4ab data/ars_nouveau/recipe/respiration_1.json +13673a7495133822b4e62be512540eec6dc18b9c data/ars_nouveau/recipe/respiration_2.json +d739a322279380f8c3ac64100bf37423aac938b6 data/ars_nouveau/recipe/respiration_3.json +d0c7a1ef3cacdf869f8d51f068aecc03fd1528b6 data/ars_nouveau/recipe/ring_of_greater_discount.json +811f0b997c1651c7bf70f6082f0aa475012a85f7 data/ars_nouveau/recipe/ring_of_lesser_discount.json +74a4cad9721143d2284ffe915a9151a8390bcb42 data/ars_nouveau/recipe/scryers_oculus.json +ee32a2dac6a622671113f3ab1f9a723c1b27c0bf data/ars_nouveau/recipe/second_armor_upgrade.json +173ddd3af438bfd8b6d1e4ca37ae7df8993aaae8 data/ars_nouveau/recipe/shapers_focus.json +a43d0ca45475a2f321112b0af592f063828c9f2a data/ars_nouveau/recipe/sharpness_1.json +e24bb3cf7348a0d6e3a6941d10346b9938790060 data/ars_nouveau/recipe/sharpness_2.json +3571c706391ea234f29393ddb25485e0b4cbffd7 data/ars_nouveau/recipe/sharpness_3.json +dc4d90374183a39c28c58abebf5130a17111fe00 data/ars_nouveau/recipe/sharpness_4.json +6b488793612606c581dc70e0c7e968653312543c data/ars_nouveau/recipe/sharpness_5.json +a4ff93202c1ddf0e4f245e4364db205962baaf85 data/ars_nouveau/recipe/silk_touch_1.json +eed8e17b0fda6fe20817dd070b93e1e69e880bee data/ars_nouveau/recipe/smite_1.json +5f18b7fc7663630e4cb47ed944d7a5e72dfde0fb data/ars_nouveau/recipe/smite_2.json +5de675fc37fff5c8a5ebf3fc36df8b6bbbb2a0ce data/ars_nouveau/recipe/smite_3.json +1921d8199a1eddc2955fffa74a62b2a733332e4a data/ars_nouveau/recipe/smite_4.json +36fb70d672419e22b95b60d9f22756783f96872a data/ars_nouveau/recipe/smite_5.json +5890abc9dd6733e00b7cebdffacd0678c0ce1d5b data/ars_nouveau/recipe/sorcerer_boots.json +90635fd044ea07f1ace643ea91762bb3e94f19b5 data/ars_nouveau/recipe/sorcerer_hood.json +efdab074a439128fcb823de36e7818d9acecb442 data/ars_nouveau/recipe/sorcerer_leggings.json +24bcf391984d3d2876a2651f27fc368e4193339b data/ars_nouveau/recipe/sorcerer_robes.json +b6b31cc17392dafc634d008b9247ea2c18acafc6 data/ars_nouveau/recipe/spell_bow.json +2e0859c6d8ea9993ef169dccabacde80559415d9 data/ars_nouveau/recipe/spell_crossbow.json +d4a9d6c6cea711285eef80cf56774ce6f1816f47 data/ars_nouveau/recipe/spell_sensor.json +fd30ad5f262c0ecbc13c58a295d831f745b49aa7 data/ars_nouveau/recipe/spell_turret.json +13ef111444d4c98faaecb82de62c7e4c260ac457 data/ars_nouveau/recipe/spell_write.json +2d0007371e00dbf644b90cc0eadb70592f9033fb data/ars_nouveau/recipe/splash_flask_cannon.json +ecb2c1b5460c72e4e7cd7de78efc5f13d6623a41 data/ars_nouveau/recipe/stable_warp_scroll.json +0006d2de334ea83140b7a860ca693048d8d5866e data/ars_nouveau/recipe/starbuncle_charm.json +78aaf214ae173d9e3fe75d13f1da07d176855355 data/ars_nouveau/recipe/storage_lectern.json +2d19dd2cce6848d0afe670a99e6951d105d85a35 data/ars_nouveau/recipe/summon_focus.json +5280e9488fcc289e63becf29814a5c3eca484636 data/ars_nouveau/recipe/sweeping_edge_1.json +187de83398cd362e7a00874675361f4d30fb4d8f data/ars_nouveau/recipe/sweeping_edge_2.json +58d9dbb602eb56f14a151ee8fb25676c0418dc38 data/ars_nouveau/recipe/sweeping_edge_3.json +1469c1b7954ec12805296ea856665d43b98a796a data/ars_nouveau/recipe/thorns_1.json +5e5c2d09d1d57cdcd5fdf7d27bee81f260aedd44 data/ars_nouveau/recipe/thorns_2.json +10f7179165a127cfd3924618aee667a69fc6306c data/ars_nouveau/recipe/thorns_3.json +edacda871b183d1a339585fc8f902782100701c1 data/ars_nouveau/recipe/thread_amethyst_golem.json +f1397781e9783a88b148fd73d59b2e9ce839d380 data/ars_nouveau/recipe/thread_chilling.json +18fca0f8164800609527ffb8a65f269fc064d656 data/ars_nouveau/recipe/thread_depths.json +06d2efb2e02dd7be897f1cbf85f868236aae736b data/ars_nouveau/recipe/thread_drygmy.json +9e6fba712b5c7b7d4af4314175554c188550733e data/ars_nouveau/recipe/thread_feather.json +a9630999240dda8471118ea1298c47f6712dc905 data/ars_nouveau/recipe/thread_gliding.json +f0c497bc5ea24ad1eefb445df9dcc70348dfbc4d data/ars_nouveau/recipe/thread_heights.json +473c9ffbccd5573620bf4424a38e920363ff2e91 data/ars_nouveau/recipe/thread_high_step.json +06c5fb579d537f23c1f1e8cb85fdf78373f39a42 data/ars_nouveau/recipe/thread_immolation.json +5be71cc2182a095914d54136aedeb122f6f252bb data/ars_nouveau/recipe/thread_kindling.json +5ec36b06cdf8f1474c8654199dbc24a08d34c740 data/ars_nouveau/recipe/thread_life_drain.json +e63df50577eb5ef924f5d1e2c3881df3b4b6793c data/ars_nouveau/recipe/thread_magic_capacity.json +3a76e4548fd874fd875b5c97711785209d5c4e91 data/ars_nouveau/recipe/thread_repairing.json +93ff63c3d3e03c296bf7610f403863f68aefadb8 data/ars_nouveau/recipe/thread_spellpower.json +8e2fd516179da666c02f37ba5f223ed96109dfb0 data/ars_nouveau/recipe/thread_starbuncle.json +bdfa9e7d7be9d1ab936d8c37cf74b4a6ff5e8153 data/ars_nouveau/recipe/thread_undying.json +30f30169eb67b3bfa0890e0e0a70a5a964a148b7 data/ars_nouveau/recipe/thread_warding.json +b24cab06a489af2b77eb182eae3b644aa15ced2e data/ars_nouveau/recipe/thread_whirlisprig.json +7d29e5fb5849312821a060dc2909138b99418dd6 data/ars_nouveau/recipe/thread_wixie.json +616c14a7aba336d86ad3f4e80e72ff55e7b04dff data/ars_nouveau/recipe/timer_spell_turret.json +5bf61565ee331120e0613eadea62381c3322b813 data/ars_nouveau/recipe/unbreaking_1.json +f998bc09f336a101cdf892d25afc5cb44f6f1642 data/ars_nouveau/recipe/unbreaking_2.json +e7450372fe497b1005a69e8ba69b624ecb35e027 data/ars_nouveau/recipe/unbreaking_3.json +fcf211f490f9bba03511bb94d59ff606007e81fd data/ars_nouveau/recipe/void_jar.json +430f68e98c50dad8e62c4123299510d2861e2bf2 data/ars_nouveau/recipe/wand.json +39f2882ad3d4a7d3b822bf5a8f7b034c9ee093a7 data/ars_nouveau/recipe/warp_scroll_copy.json +67bf6c12adf504176f049230001088a137de0697 data/ars_nouveau/recipe/whirlisprig_charm.json +608aff1e7a08a5431bf22133fc2201f56ce3bcf0 data/ars_nouveau/recipe/wixie_charm.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/abjuration_essence.json b/src/generated/resources/data/ars_nouveau/recipe/abjuration_essence.json index 810328da6d..db45f7ed9a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/abjuration_essence.json +++ b/src/generated/resources/data/ars_nouveau/recipe/abjuration_essence.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:imbuement", "input": { "tag": "neoforge:gems/source" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/air_essence.json b/src/generated/resources/data/ars_nouveau/recipe/air_essence.json index 3e110e712f..ee16f19252 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/air_essence.json +++ b/src/generated/resources/data/ars_nouveau/recipe/air_essence.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:imbuement", "input": { "tag": "neoforge:gems/source" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/alchemists_crown.json b/src/generated/resources/data/ars_nouveau/recipe/alchemists_crown.json index 50ebbc707a..88854d1eb4 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/alchemists_crown.json +++ b/src/generated/resources/data/ars_nouveau/recipe/alchemists_crown.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/amethyst.json b/src/generated/resources/data/ars_nouveau/recipe/amethyst.json index 65060c2227..d507f1a84e 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/amethyst.json +++ b/src/generated/resources/data/ars_nouveau/recipe/amethyst.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:imbuement", "input": { "item": "minecraft:amethyst_shard" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/amethyst_block.json b/src/generated/resources/data/ars_nouveau/recipe/amethyst_block.json index 1049850c5b..2b2acf7c69 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/amethyst_block.json +++ b/src/generated/resources/data/ars_nouveau/recipe/amethyst_block.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:imbuement", "input": { "item": "minecraft:amethyst_block" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/amplify_arrow.json b/src/generated/resources/data/ars_nouveau/recipe/amplify_arrow.json index 8a78177b7d..2f0f4ec83d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/amplify_arrow.json +++ b/src/generated/resources/data/ars_nouveau/recipe/amplify_arrow.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:imbuement", "input": { "tag": "minecraft:arrows" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_boost.json b/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_boost.json index 329acaa7a2..149430fa49 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_boost.json +++ b/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_boost.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_regen.json b/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_regen.json index 2f98eb21e6..08d0f7b5d2 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_regen.json +++ b/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_regen.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/aqua_affinity_1.json b/src/generated/resources/data/ars_nouveau/recipe/aqua_affinity_1.json index ebb4e925de..ecc4645660 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/aqua_affinity_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/aqua_affinity_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:aqua_affinity", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/arcanist_boots.json b/src/generated/resources/data/ars_nouveau/recipe/arcanist_boots.json index e83fbbd6ac..a020576980 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/arcanist_boots.json +++ b/src/generated/resources/data/ars_nouveau/recipe/arcanist_boots.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/arcanist_hood.json b/src/generated/resources/data/ars_nouveau/recipe/arcanist_hood.json index ff81257ecd..e8ce25a4a7 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/arcanist_hood.json +++ b/src/generated/resources/data/ars_nouveau/recipe/arcanist_hood.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/arcanist_leggings.json b/src/generated/resources/data/ars_nouveau/recipe/arcanist_leggings.json index e4c98d4da3..edb716c3be 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/arcanist_leggings.json +++ b/src/generated/resources/data/ars_nouveau/recipe/arcanist_leggings.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/arcanist_robes.json b/src/generated/resources/data/ars_nouveau/recipe/arcanist_robes.json index 37f0158fda..e53c6e61a0 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/arcanist_robes.json +++ b/src/generated/resources/data/ars_nouveau/recipe/arcanist_robes.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_1.json b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_1.json index 59672dfbad..d48d4de812 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:bane_of_arthropods", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_2.json b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_2.json index 6f7f078afb..85b12fb248 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:bane_of_arthropods", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_3.json b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_3.json index b07fdb3f89..940a6af84d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:bane_of_arthropods", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_4.json b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_4.json index b0c8d942ca..ef93be8397 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_4.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:bane_of_arthropods", "level": 4, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_5.json b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_5.json index a4cfa27e65..9be5d7ff07 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_5.json +++ b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_5.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:bane_of_arthropods", "level": 5, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/battlemage_boots.json b/src/generated/resources/data/ars_nouveau/recipe/battlemage_boots.json index d74301b26e..7415ca10ab 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/battlemage_boots.json +++ b/src/generated/resources/data/ars_nouveau/recipe/battlemage_boots.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/battlemage_hood.json b/src/generated/resources/data/ars_nouveau/recipe/battlemage_hood.json index 656ada6b4a..0c2b890feb 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/battlemage_hood.json +++ b/src/generated/resources/data/ars_nouveau/recipe/battlemage_hood.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/battlemage_leggings.json b/src/generated/resources/data/ars_nouveau/recipe/battlemage_leggings.json index bccf241e1f..99c92b99bb 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/battlemage_leggings.json +++ b/src/generated/resources/data/ars_nouveau/recipe/battlemage_leggings.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/battlemage_robes.json b/src/generated/resources/data/ars_nouveau/recipe/battlemage_robes.json index 5cb3991772..7bca665d44 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/battlemage_robes.json +++ b/src/generated/resources/data/ars_nouveau/recipe/battlemage_robes.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/belt_of_levitation.json b/src/generated/resources/data/ars_nouveau/recipe/belt_of_levitation.json index 2eabdcc7a1..705f84d3b9 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/belt_of_levitation.json +++ b/src/generated/resources/data/ars_nouveau/recipe/belt_of_levitation.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/belt_of_unstable_gifts.json b/src/generated/resources/data/ars_nouveau/recipe/belt_of_unstable_gifts.json index f96e96a150..c0b2a5e360 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/belt_of_unstable_gifts.json +++ b/src/generated/resources/data/ars_nouveau/recipe/belt_of_unstable_gifts.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/blast_protection_1.json b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_1.json index 59b8714bda..df607c4e78 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/blast_protection_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:blast_protection", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/blast_protection_2.json b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_2.json index c3090d81a3..10a6493718 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/blast_protection_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:blast_protection", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/blast_protection_3.json b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_3.json index 19ec3e872f..754d643198 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/blast_protection_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:blast_protection", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/blast_protection_4.json b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_4.json index 82de55fe6b..c78ef4d481 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/blast_protection_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_4.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:blast_protection", "level": 4, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/blue_dye.json b/src/generated/resources/data/ars_nouveau/recipe/blue_dye.json index 7d1cb8d0c5..9690ccc519 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/blue_dye.json +++ b/src/generated/resources/data/ars_nouveau/recipe/blue_dye.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:cornflower" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/brazier_relay.json b/src/generated/resources/data/ars_nouveau/recipe/brazier_relay.json index b4308efcdb..072937ae36 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/brazier_relay.json +++ b/src/generated/resources/data/ars_nouveau/recipe/brazier_relay.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/brown_dye.json b/src/generated/resources/data/ars_nouveau/recipe/brown_dye.json index dfe031c9b6..deb0b03c45 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/brown_dye.json +++ b/src/generated/resources/data/ars_nouveau/recipe/brown_dye.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:cocoa_beans" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/budding_conversion/budding_amethyst.json b/src/generated/resources/data/ars_nouveau/recipe/budding_conversion/budding_amethyst.json index 077538d059..4f114b67ec 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/budding_conversion/budding_amethyst.json +++ b/src/generated/resources/data/ars_nouveau/recipe/budding_conversion/budding_amethyst.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:budding_conversion", "input": "minecraft:amethyst_block", "result": "minecraft:budding_amethyst" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/cobblestone.json b/src/generated/resources/data/ars_nouveau/recipe/cobblestone.json index 71038c203d..1f48a26c90 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/cobblestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/cobblestone.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "tag": "c:cobblestones" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/conjuration_essence.json b/src/generated/resources/data/ars_nouveau/recipe/conjuration_essence.json index dcb111be98..b102536934 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/conjuration_essence.json +++ b/src/generated/resources/data/ars_nouveau/recipe/conjuration_essence.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:imbuement", "input": { "tag": "neoforge:gems/source" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/depth_strider_1.json b/src/generated/resources/data/ars_nouveau/recipe/depth_strider_1.json index 1d84baf848..d8310895ac 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/depth_strider_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/depth_strider_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:depth_strider", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/depth_strider_2.json b/src/generated/resources/data/ars_nouveau/recipe/depth_strider_2.json index 18634a2fca..ba40d37bcd 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/depth_strider_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/depth_strider_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:depth_strider", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/depth_strider_3.json b/src/generated/resources/data/ars_nouveau/recipe/depth_strider_3.json index 5a793d6a10..c6ce234b1b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/depth_strider_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/depth_strider_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:depth_strider", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/dispel_entity/blaze_powder.json b/src/generated/resources/data/ars_nouveau/recipe/dispel_entity/blaze_powder.json index 3f9c094f3c..bb6749b489 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/dispel_entity/blaze_powder.json +++ b/src/generated/resources/data/ars_nouveau/recipe/dispel_entity/blaze_powder.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:dispel_entity", "entity": "minecraft:blaze", "loot_conditions": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/dominion_wand.json b/src/generated/resources/data/ars_nouveau/recipe/dominion_wand.json index c39b82d5bc..da65a120a1 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/dominion_wand.json +++ b/src/generated/resources/data/ars_nouveau/recipe/dominion_wand.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/drygmy_charm.json b/src/generated/resources/data/ars_nouveau/recipe/drygmy_charm.json index 27403c0bc6..4d3715f696 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/drygmy_charm.json +++ b/src/generated/resources/data/ars_nouveau/recipe/drygmy_charm.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/earth_essence.json b/src/generated/resources/data/ars_nouveau/recipe/earth_essence.json index 19d0b55be2..dfa380143f 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/earth_essence.json +++ b/src/generated/resources/data/ars_nouveau/recipe/earth_essence.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:imbuement", "input": { "tag": "neoforge:gems/source" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/efficiency_1.json b/src/generated/resources/data/ars_nouveau/recipe/efficiency_1.json index f8da270896..335fc3bbb7 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/efficiency_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/efficiency_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:efficiency", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/efficiency_2.json b/src/generated/resources/data/ars_nouveau/recipe/efficiency_2.json index 58649e18e5..ed81b74aba 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/efficiency_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/efficiency_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:efficiency", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/efficiency_3.json b/src/generated/resources/data/ars_nouveau/recipe/efficiency_3.json index 4859c2a00f..a9c0e55cf7 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/efficiency_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/efficiency_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:efficiency", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/efficiency_4.json b/src/generated/resources/data/ars_nouveau/recipe/efficiency_4.json index c97e1018d9..81fb4dd847 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/efficiency_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/efficiency_4.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:efficiency", "level": 4, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/efficiency_5.json b/src/generated/resources/data/ars_nouveau/recipe/efficiency_5.json index dc65ab5913..999830099c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/efficiency_5.json +++ b/src/generated/resources/data/ars_nouveau/recipe/efficiency_5.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:efficiency", "level": 5, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/enchanters_eye.json b/src/generated/resources/data/ars_nouveau/recipe/enchanters_eye.json index 510916ac4e..3547ba740a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/enchanters_eye.json +++ b/src/generated/resources/data/ars_nouveau/recipe/enchanters_eye.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/enchanters_mirror.json b/src/generated/resources/data/ars_nouveau/recipe/enchanters_mirror.json index 0b183cb6f9..adf316f1bc 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/enchanters_mirror.json +++ b/src/generated/resources/data/ars_nouveau/recipe/enchanters_mirror.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/enchanters_shield.json b/src/generated/resources/data/ars_nouveau/recipe/enchanters_shield.json index 811d3793c4..a68540f6ab 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/enchanters_shield.json +++ b/src/generated/resources/data/ars_nouveau/recipe/enchanters_shield.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/enchanters_sword.json b/src/generated/resources/data/ars_nouveau/recipe/enchanters_sword.json index 7c227a6f0d..9223e896ce 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/enchanters_sword.json +++ b/src/generated/resources/data/ars_nouveau/recipe/enchanters_sword.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_1.json b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_1.json index 3de6df3807..f32b67934a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:feather_falling", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_2.json b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_2.json index 9bdba15414..6c55e07a24 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:feather_falling", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_3.json b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_3.json index 03c371ba56..8a5307e318 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:feather_falling", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_4.json b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_4.json index 193de68f0f..bb052c9167 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_4.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:feather_falling", "level": 4, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_1.json b/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_1.json index 8a86f1ce66..40c63abb33 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fire_aspect", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_2.json b/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_2.json index 747413300e..dc218e39d1 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fire_aspect", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_essence.json b/src/generated/resources/data/ars_nouveau/recipe/fire_essence.json index 0dae4a86e6..f94ebcf017 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fire_essence.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_essence.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:imbuement", "input": { "tag": "neoforge:gems/source" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_1.json b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_1.json index e754b89781..72468dcc97 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fire_protection", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_2.json b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_2.json index 7f8c61d871..3df0750e0a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fire_protection", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_3.json b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_3.json index 7074339e5d..ae5761093e 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fire_protection", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_4.json b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_4.json index 9f42600cdb..e7375e8fc5 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_4.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fire_protection", "level": 4, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_5.json b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_5.json index 1d7416a7cb..506289f004 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_5.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_5.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fire_protection", "level": 5, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/first_armor_upgrade.json b/src/generated/resources/data/ars_nouveau/recipe/first_armor_upgrade.json index 499903783e..cad29426e1 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/first_armor_upgrade.json +++ b/src/generated/resources/data/ars_nouveau/recipe/first_armor_upgrade.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:armor_upgrade", "pedestalItems": [ { "tag": "c:rods/blaze" diff --git a/src/generated/resources/data/ars_nouveau/recipe/flame_1.json b/src/generated/resources/data/ars_nouveau/recipe/flame_1.json index 313f30890a..1a80e2604e 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/flame_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/flame_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:flame", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/fortune_1.json b/src/generated/resources/data/ars_nouveau/recipe/fortune_1.json index ea464dbdf1..780a23a34b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fortune_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fortune_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fortune", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/fortune_2.json b/src/generated/resources/data/ars_nouveau/recipe/fortune_2.json index 21f09c0763..0523375f1d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fortune_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fortune_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fortune", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/fortune_3.json b/src/generated/resources/data/ars_nouveau/recipe/fortune_3.json index 024143690d..ba275e9358 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fortune_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fortune_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:fortune", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/glowstone_block_to_dust.json b/src/generated/resources/data/ars_nouveau/recipe/glowstone_block_to_dust.json index c7eb90f3a1..1980680171 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glowstone_block_to_dust.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glowstone_block_to_dust.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:glowstone" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/gravel.json b/src/generated/resources/data/ars_nouveau/recipe/gravel.json index 88eaa2dc10..801d1106dc 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/gravel.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gravel.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "tag": "c:gravels" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/infinity_1.json b/src/generated/resources/data/ars_nouveau/recipe/infinity_1.json index e4fd1d3b61..492f67aa0e 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/infinity_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/infinity_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:infinity", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/jar_of_light.json b/src/generated/resources/data/ars_nouveau/recipe/jar_of_light.json index e8c602538d..c3ab1a8f55 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/jar_of_light.json +++ b/src/generated/resources/data/ars_nouveau/recipe/jar_of_light.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/jump_ring.json b/src/generated/resources/data/ars_nouveau/recipe/jump_ring.json index 0ca0fdde6f..5d245ebf9a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/jump_ring.json +++ b/src/generated/resources/data/ars_nouveau/recipe/jump_ring.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/knockback_1.json b/src/generated/resources/data/ars_nouveau/recipe/knockback_1.json index 05fc33c202..c8f2ee60b5 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/knockback_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/knockback_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:knockback", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/knockback_2.json b/src/generated/resources/data/ars_nouveau/recipe/knockback_2.json index de5beb2ed5..1ff81b1ed6 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/knockback_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/knockback_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:knockback", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/lapis.json b/src/generated/resources/data/ars_nouveau/recipe/lapis.json index 97e5e993a8..a26be5c317 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/lapis.json +++ b/src/generated/resources/data/ars_nouveau/recipe/lapis.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:imbuement", "input": { "tag": "c:gems/lapis" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/light_blue_dye.json b/src/generated/resources/data/ars_nouveau/recipe/light_blue_dye.json index 87c100532e..0a4fc4c46a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/light_blue_dye.json +++ b/src/generated/resources/data/ars_nouveau/recipe/light_blue_dye.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:blue_orchid" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_azure.json b/src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_azure.json index 6099691164..fe12bdaab9 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_azure.json +++ b/src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_azure.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:azure_bluet" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_oxeye.json b/src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_oxeye.json index c326265924..a8523525d4 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_oxeye.json +++ b/src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_oxeye.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:oxeye_daisy" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_tulip.json b/src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_tulip.json index 72b4f9429b..636307b15a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_tulip.json +++ b/src/generated/resources/data/ars_nouveau/recipe/light_gray_dye_tulip.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:white_tulip" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/lingering_flask_cannon.json b/src/generated/resources/data/ars_nouveau/recipe/lingering_flask_cannon.json index a373bb7cbf..8a966960e0 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/lingering_flask_cannon.json +++ b/src/generated/resources/data/ars_nouveau/recipe/lingering_flask_cannon.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/looting_1.json b/src/generated/resources/data/ars_nouveau/recipe/looting_1.json index f666424baf..520dafcd15 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/looting_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/looting_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:looting", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/looting_2.json b/src/generated/resources/data/ars_nouveau/recipe/looting_2.json index 2022573276..fbfb86b9c3 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/looting_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/looting_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:looting", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/looting_3.json b/src/generated/resources/data/ars_nouveau/recipe/looting_3.json index 31506b02cc..bc487c2c41 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/looting_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/looting_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:looting", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/magebloom_crop.json b/src/generated/resources/data/ars_nouveau/recipe/magebloom_crop.json index f5eeeedacf..0faa26f34e 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/magebloom_crop.json +++ b/src/generated/resources/data/ars_nouveau/recipe/magebloom_crop.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/magenta_dye.json b/src/generated/resources/data/ars_nouveau/recipe/magenta_dye.json index b0b98ec438..96ad1400ed 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/magenta_dye.json +++ b/src/generated/resources/data/ars_nouveau/recipe/magenta_dye.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:allium" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/magenta_dye_lilac.json b/src/generated/resources/data/ars_nouveau/recipe/magenta_dye_lilac.json index 231b4a1d57..d32db943b0 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/magenta_dye_lilac.json +++ b/src/generated/resources/data/ars_nouveau/recipe/magenta_dye_lilac.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:lilac" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/mana_boost_1.json b/src/generated/resources/data/ars_nouveau/recipe/mana_boost_1.json index 6cddbe0b26..47de33321e 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/mana_boost_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mana_boost_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:mana_boost", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/mana_boost_2.json b/src/generated/resources/data/ars_nouveau/recipe/mana_boost_2.json index b537afa183..5d7fa0a750 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/mana_boost_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mana_boost_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:mana_boost", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/mana_boost_3.json b/src/generated/resources/data/ars_nouveau/recipe/mana_boost_3.json index 6e9c86e15e..3ff0e92d2a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/mana_boost_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mana_boost_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:mana_boost", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/mana_regen_1.json b/src/generated/resources/data/ars_nouveau/recipe/mana_regen_1.json index 9b7e2f61f3..5c03297a35 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/mana_regen_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mana_regen_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:mana_regen", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/mana_regen_2.json b/src/generated/resources/data/ars_nouveau/recipe/mana_regen_2.json index 494ced4dd3..2e1240983c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/mana_regen_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mana_regen_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:mana_regen", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/mana_regen_3.json b/src/generated/resources/data/ars_nouveau/recipe/mana_regen_3.json index 42bfd7dce4..688d870722 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/mana_regen_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mana_regen_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:mana_regen", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence.json b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence.json index f1bf0a23b8..b6576d99c9 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence.json +++ b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:imbuement", "input": { "tag": "neoforge:gems/source" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/multishot_1.json b/src/generated/resources/data/ars_nouveau/recipe/multishot_1.json index 2a1fb47055..0ca8157600 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/multishot_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/multishot_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:multishot", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/orange_dye.json b/src/generated/resources/data/ars_nouveau/recipe/orange_dye.json index 3bbbdc6b39..408683fbce 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/orange_dye.json +++ b/src/generated/resources/data/ars_nouveau/recipe/orange_dye.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:orange_tulip" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/pierce_arrow.json b/src/generated/resources/data/ars_nouveau/recipe/pierce_arrow.json index cff100d0a5..9bb269b52b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/pierce_arrow.json +++ b/src/generated/resources/data/ars_nouveau/recipe/pierce_arrow.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:imbuement", "input": { "tag": "minecraft:arrows" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/piercing_1.json b/src/generated/resources/data/ars_nouveau/recipe/piercing_1.json index 8e7debdec9..08c7f8517d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/piercing_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/piercing_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:piercing", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/piercing_2.json b/src/generated/resources/data/ars_nouveau/recipe/piercing_2.json index eea67b4fc8..1874758554 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/piercing_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/piercing_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:piercing", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/piercing_3.json b/src/generated/resources/data/ars_nouveau/recipe/piercing_3.json index 0b8a4742b1..484193dbed 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/piercing_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/piercing_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:piercing", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/piercing_4.json b/src/generated/resources/data/ars_nouveau/recipe/piercing_4.json index f6ee5992c3..312ea4f0c2 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/piercing_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/piercing_4.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:piercing", "level": 4, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/pink_dye.json b/src/generated/resources/data/ars_nouveau/recipe/pink_dye.json index f93f927f9f..98e51b302d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/pink_dye.json +++ b/src/generated/resources/data/ars_nouveau/recipe/pink_dye.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:pink_tulip" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/pink_dye_peony.json b/src/generated/resources/data/ars_nouveau/recipe/pink_dye_peony.json index 0d96ffbfa9..219c644148 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/pink_dye_peony.json +++ b/src/generated/resources/data/ars_nouveau/recipe/pink_dye_peony.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:peony" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/potion_diffuser.json b/src/generated/resources/data/ars_nouveau/recipe/potion_diffuser.json index f990b03715..6fd9b4c482 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/potion_diffuser.json +++ b/src/generated/resources/data/ars_nouveau/recipe/potion_diffuser.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/potion_flask.json b/src/generated/resources/data/ars_nouveau/recipe/potion_flask.json index b5147c7042..6817c7dafa 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/potion_flask.json +++ b/src/generated/resources/data/ars_nouveau/recipe/potion_flask.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/potion_flask_amplify.json b/src/generated/resources/data/ars_nouveau/recipe/potion_flask_amplify.json index 7cdd86a17f..08108c4d66 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/potion_flask_amplify.json +++ b/src/generated/resources/data/ars_nouveau/recipe/potion_flask_amplify.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/potion_flask_extend_time.json b/src/generated/resources/data/ars_nouveau/recipe/potion_flask_extend_time.json index 2cf67bcb42..ee1269274b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/potion_flask_extend_time.json +++ b/src/generated/resources/data/ars_nouveau/recipe/potion_flask_extend_time.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/potion_melder.json b/src/generated/resources/data/ars_nouveau/recipe/potion_melder.json index baed1e3800..9b589a1006 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/potion_melder.json +++ b/src/generated/resources/data/ars_nouveau/recipe/potion_melder.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/power_1.json b/src/generated/resources/data/ars_nouveau/recipe/power_1.json index a29231e5a7..621869cc88 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/power_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/power_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:power", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/power_2.json b/src/generated/resources/data/ars_nouveau/recipe/power_2.json index 2560a1ec51..050c66726c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/power_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/power_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:power", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/power_3.json b/src/generated/resources/data/ars_nouveau/recipe/power_3.json index 2dee7561f1..0fe1df883a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/power_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/power_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:power", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/power_4.json b/src/generated/resources/data/ars_nouveau/recipe/power_4.json index 7cae887a01..eff02db24a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/power_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/power_4.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:power", "level": 4, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/power_5.json b/src/generated/resources/data/ars_nouveau/recipe/power_5.json index 000bb6584d..c0e8b4b1ad 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/power_5.json +++ b/src/generated/resources/data/ars_nouveau/recipe/power_5.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:power", "level": 5, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_1.json b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_1.json index 7db8c3fb14..597b2adfb2 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:projectile_protection", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_2.json b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_2.json index 79abaff93e..874819c728 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:projectile_protection", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_3.json b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_3.json index 7f7d1c4d1c..9b302ab522 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:projectile_protection", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_4.json b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_4.json index 4bb7f7b2dd..a40e71ded6 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_4.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:projectile_protection", "level": 4, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_5.json b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_5.json index 8b3c74e854..c371ccc053 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_5.json +++ b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_5.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:projectile_protection", "level": 5, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/protection_1.json b/src/generated/resources/data/ars_nouveau/recipe/protection_1.json index a4432c063c..1d914f54c0 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/protection_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/protection_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:protection", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/protection_2.json b/src/generated/resources/data/ars_nouveau/recipe/protection_2.json index cd1a5a6314..0e875350fb 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/protection_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/protection_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:protection", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/protection_3.json b/src/generated/resources/data/ars_nouveau/recipe/protection_3.json index 7c916072e7..a09444e40b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/protection_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/protection_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:protection", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/protection_4.json b/src/generated/resources/data/ars_nouveau/recipe/protection_4.json index 8dd77e3a3f..1a210c8020 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/protection_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/protection_4.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:protection", "level": 4, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/protection_5.json b/src/generated/resources/data/ars_nouveau/recipe/protection_5.json index 8dc6257e65..7ba84bb80a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/protection_5.json +++ b/src/generated/resources/data/ars_nouveau/recipe/protection_5.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:protection", "level": 5, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/punch_1.json b/src/generated/resources/data/ars_nouveau/recipe/punch_1.json index 86703bcb6d..e9fd011ce5 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/punch_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/punch_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:punch", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/punch_2.json b/src/generated/resources/data/ars_nouveau/recipe/punch_2.json index dc1475a898..10f8450938 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/punch_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/punch_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:punch", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/quartz_block_to_quartz.json b/src/generated/resources/data/ars_nouveau/recipe/quartz_block_to_quartz.json index 536fe4c97f..b706afe7c1 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/quartz_block_to_quartz.json +++ b/src/generated/resources/data/ars_nouveau/recipe/quartz_block_to_quartz.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "tag": "minecraft:storage_blocks/quartz" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/quick_charge_1.json b/src/generated/resources/data/ars_nouveau/recipe/quick_charge_1.json index 3d8b90e8cc..31b52be852 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/quick_charge_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/quick_charge_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:quick_charge", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/quick_charge_2.json b/src/generated/resources/data/ars_nouveau/recipe/quick_charge_2.json index 46db12f751..78b844adc5 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/quick_charge_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/quick_charge_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:quick_charge", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/quick_charge_3.json b/src/generated/resources/data/ars_nouveau/recipe/quick_charge_3.json index 58b31ced90..dc267d7d14 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/quick_charge_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/quick_charge_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:quick_charge", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/reactive.json b/src/generated/resources/data/ars_nouveau/recipe/reactive.json index 504a38076c..fabdbe537b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/reactive.json +++ b/src/generated/resources/data/ars_nouveau/recipe/reactive.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:reactive_enchantment", "pedestalItems": [ { "item": "ars_nouveau:spell_parchment" diff --git a/src/generated/resources/data/ars_nouveau/recipe/reactive_2.json b/src/generated/resources/data/ars_nouveau/recipe/reactive_2.json index 401203536c..72fd8fb1e4 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/reactive_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/reactive_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:reactive", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/reactive_3.json b/src/generated/resources/data/ars_nouveau/recipe/reactive_3.json index 1ff7e9c23a..66df97c084 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/reactive_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/reactive_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:reactive", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/reactive_4.json b/src/generated/resources/data/ars_nouveau/recipe/reactive_4.json index cc9345c7ba..50cd62773c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/reactive_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/reactive_4.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "ars_nouveau:reactive", "level": 4, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/red_dye_beetroot.json b/src/generated/resources/data/ars_nouveau/recipe/red_dye_beetroot.json index 97c5995f03..c00ab71cec 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/red_dye_beetroot.json +++ b/src/generated/resources/data/ars_nouveau/recipe/red_dye_beetroot.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:beetroot" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/red_dye_poppy.json b/src/generated/resources/data/ars_nouveau/recipe/red_dye_poppy.json index d24926ac8f..2469668733 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/red_dye_poppy.json +++ b/src/generated/resources/data/ars_nouveau/recipe/red_dye_poppy.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:poppy" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/red_dye_rose_bush.json b/src/generated/resources/data/ars_nouveau/recipe/red_dye_rose_bush.json index 4417611ea5..890e7c05c9 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/red_dye_rose_bush.json +++ b/src/generated/resources/data/ars_nouveau/recipe/red_dye_rose_bush.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:rose_bush" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/red_dye_tulip.json b/src/generated/resources/data/ars_nouveau/recipe/red_dye_tulip.json index e5701bb587..00eb6f6c26 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/red_dye_tulip.json +++ b/src/generated/resources/data/ars_nouveau/recipe/red_dye_tulip.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:red_tulip" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/relay_collector.json b/src/generated/resources/data/ars_nouveau/recipe/relay_collector.json index 48cecb8966..eaca330fd8 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/relay_collector.json +++ b/src/generated/resources/data/ars_nouveau/recipe/relay_collector.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/relay_deposit.json b/src/generated/resources/data/ars_nouveau/recipe/relay_deposit.json index 28556f903e..80d4436900 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/relay_deposit.json +++ b/src/generated/resources/data/ars_nouveau/recipe/relay_deposit.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/relay_splitter.json b/src/generated/resources/data/ars_nouveau/recipe/relay_splitter.json index 9bfdcf8458..abaa17010a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/relay_splitter.json +++ b/src/generated/resources/data/ars_nouveau/recipe/relay_splitter.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/relay_warp.json b/src/generated/resources/data/ars_nouveau/recipe/relay_warp.json index f0ab6f1957..0968dfbf0e 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/relay_warp.json +++ b/src/generated/resources/data/ars_nouveau/recipe/relay_warp.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/respiration_1.json b/src/generated/resources/data/ars_nouveau/recipe/respiration_1.json index fe1193a618..724d8c6900 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/respiration_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/respiration_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:respiration", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/respiration_2.json b/src/generated/resources/data/ars_nouveau/recipe/respiration_2.json index c17f391921..ebccb7e5e6 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/respiration_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/respiration_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:respiration", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/respiration_3.json b/src/generated/resources/data/ars_nouveau/recipe/respiration_3.json index 9cf8402473..9632c4ae87 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/respiration_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/respiration_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:respiration", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/ring_of_greater_discount.json b/src/generated/resources/data/ars_nouveau/recipe/ring_of_greater_discount.json index 0ce7704009..00c2c7d29d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/ring_of_greater_discount.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ring_of_greater_discount.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/ring_of_lesser_discount.json b/src/generated/resources/data/ars_nouveau/recipe/ring_of_lesser_discount.json index 92cc04af0d..d5e93f62de 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/ring_of_lesser_discount.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ring_of_lesser_discount.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/sandstone_to_sand.json b/src/generated/resources/data/ars_nouveau/recipe/sandstone_to_sand.json index ee30b53d3f..ce1b3611aa 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sandstone_to_sand.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sandstone_to_sand.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:sandstone" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json index dc53d9e534..223ad31e06 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:scry_ritual", "augment": "neoforge:storage_blocks/amethyst", "highlight": "neoforge:storage_blocks/amethyst" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json index db5a6f48e5..e83a9ca337 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:scry_ritual", "augment": "neoforge:gems/amethyst", "highlight": "neoforge:storage_blocks/amethyst" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/coal_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/coal_ores.json index 606fcce43d..ff307d2ff3 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/coal_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/coal_ores.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:scry_ritual", "augment": "neoforge:ores/coal", "highlight": "neoforge:ores/coal" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/copper_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/copper_ores.json index b3c03b1c40..4477e26e3e 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/copper_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/copper_ores.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:scry_ritual", "augment": "neoforge:ores/copper", "highlight": "neoforge:ores/copper" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/diamond_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/diamond_ores.json index ad0d84d724..6e751c177a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/diamond_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/diamond_ores.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:scry_ritual", "augment": "neoforge:ores/diamond", "highlight": "neoforge:ores/diamond" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/emerald_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/emerald_ores.json index bee2fb1f18..ec315d7027 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/emerald_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/emerald_ores.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:scry_ritual", "augment": "neoforge:ores/emerald", "highlight": "neoforge:ores/emerald" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/gold_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/gold_ores.json index 5bc0c807d0..65dd56861f 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/gold_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/gold_ores.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:scry_ritual", "augment": "neoforge:ores/gold", "highlight": "neoforge:ores/gold" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/iron_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/iron_ores.json index b81c3ac228..2e6e859fba 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/iron_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/iron_ores.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:scry_ritual", "augment": "neoforge:ores/iron", "highlight": "neoforge:ores/iron" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/lapis_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/lapis_ores.json index fdbfe4593c..3f2eea4a8d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/lapis_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/lapis_ores.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:scry_ritual", "augment": "neoforge:ores/lapis", "highlight": "neoforge:ores/lapis" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/netherite_scrap_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/netherite_scrap_ores.json index 0ad525db2d..91a8b3de4f 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/netherite_scrap_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/netherite_scrap_ores.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:scry_ritual", "augment": "neoforge:ores/netherite_scrap", "highlight": "neoforge:ores/netherite_scrap" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/quartz_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/quartz_ores.json index b63ccc45ff..f693060bc4 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/quartz_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/quartz_ores.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:scry_ritual", "augment": "neoforge:ores/quartz", "highlight": "neoforge:ores/quartz" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/redstone_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/redstone_ores.json index acc5ed339f..86f9121d87 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/redstone_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/redstone_ores.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:scry_ritual", "augment": "neoforge:ores/redstone", "highlight": "neoforge:ores/redstone" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scryers_oculus.json b/src/generated/resources/data/ars_nouveau/recipe/scryers_oculus.json index a21aff613e..f0eab2f320 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scryers_oculus.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scryers_oculus.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/second_armor_upgrade.json b/src/generated/resources/data/ars_nouveau/recipe/second_armor_upgrade.json index d00ef35d90..9834651087 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/second_armor_upgrade.json +++ b/src/generated/resources/data/ars_nouveau/recipe/second_armor_upgrade.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:armor_upgrade", "pedestalItems": [ { "tag": "c:ender_pearls" diff --git a/src/generated/resources/data/ars_nouveau/recipe/shapers_focus.json b/src/generated/resources/data/ars_nouveau/recipe/shapers_focus.json index 48a39ecaaf..7727ea3f22 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/shapers_focus.json +++ b/src/generated/resources/data/ars_nouveau/recipe/shapers_focus.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/sharpness_1.json b/src/generated/resources/data/ars_nouveau/recipe/sharpness_1.json index 6b7a23f36c..4097d8e6f0 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sharpness_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sharpness_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:sharpness", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/sharpness_2.json b/src/generated/resources/data/ars_nouveau/recipe/sharpness_2.json index 5bfd21b01b..5ae5350b05 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sharpness_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sharpness_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:sharpness", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/sharpness_3.json b/src/generated/resources/data/ars_nouveau/recipe/sharpness_3.json index 38a97c3b4c..8989cb5f9a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sharpness_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sharpness_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:sharpness", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/sharpness_4.json b/src/generated/resources/data/ars_nouveau/recipe/sharpness_4.json index 7a77f504cc..44dbb8d02e 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sharpness_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sharpness_4.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:sharpness", "level": 4, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/sharpness_5.json b/src/generated/resources/data/ars_nouveau/recipe/sharpness_5.json index 2ad79a3ce4..92e718ee15 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sharpness_5.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sharpness_5.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:sharpness", "level": 5, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/silk_touch_1.json b/src/generated/resources/data/ars_nouveau/recipe/silk_touch_1.json index 0b5470644a..12482b42ed 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/silk_touch_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/silk_touch_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:silk_touch", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/smite_1.json b/src/generated/resources/data/ars_nouveau/recipe/smite_1.json index 98b5c7675d..b13efd8f79 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/smite_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smite_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:smite", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/smite_2.json b/src/generated/resources/data/ars_nouveau/recipe/smite_2.json index df0691a88f..b388d6cb9f 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/smite_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smite_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:smite", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/smite_3.json b/src/generated/resources/data/ars_nouveau/recipe/smite_3.json index f68cd4c339..36534fae0d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/smite_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smite_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:smite", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/smite_4.json b/src/generated/resources/data/ars_nouveau/recipe/smite_4.json index 79f05bc699..22cd456a67 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/smite_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smite_4.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:smite", "level": 4, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/smite_5.json b/src/generated/resources/data/ars_nouveau/recipe/smite_5.json index e1b3e0a9af..04491888b8 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/smite_5.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smite_5.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:smite", "level": 5, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/sorcerer_boots.json b/src/generated/resources/data/ars_nouveau/recipe/sorcerer_boots.json index fd3dce2614..8aa7dbc24c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sorcerer_boots.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sorcerer_boots.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/sorcerer_hood.json b/src/generated/resources/data/ars_nouveau/recipe/sorcerer_hood.json index 75f8775a05..a5b943a0f1 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sorcerer_hood.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sorcerer_hood.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/sorcerer_leggings.json b/src/generated/resources/data/ars_nouveau/recipe/sorcerer_leggings.json index a2be1bf20a..dde8f32c3c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sorcerer_leggings.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sorcerer_leggings.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/sorcerer_robes.json b/src/generated/resources/data/ars_nouveau/recipe/sorcerer_robes.json index dd9c7b3b67..7708ad3ad2 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sorcerer_robes.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sorcerer_robes.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/spell_bow.json b/src/generated/resources/data/ars_nouveau/recipe/spell_bow.json index 43c09f9344..c78d0a0636 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/spell_bow.json +++ b/src/generated/resources/data/ars_nouveau/recipe/spell_bow.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/spell_crossbow.json b/src/generated/resources/data/ars_nouveau/recipe/spell_crossbow.json index aa0557c8f2..1097ed8bbf 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/spell_crossbow.json +++ b/src/generated/resources/data/ars_nouveau/recipe/spell_crossbow.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/spell_sensor.json b/src/generated/resources/data/ars_nouveau/recipe/spell_sensor.json index 377bd91b6f..08e4a2c671 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/spell_sensor.json +++ b/src/generated/resources/data/ars_nouveau/recipe/spell_sensor.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [], "reagent": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/spell_turret.json b/src/generated/resources/data/ars_nouveau/recipe/spell_turret.json index c9f71a9ec2..75a4ee015f 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/spell_turret.json +++ b/src/generated/resources/data/ars_nouveau/recipe/spell_turret.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/spell_write.json b/src/generated/resources/data/ars_nouveau/recipe/spell_write.json index 6037254797..787547bd55 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/spell_write.json +++ b/src/generated/resources/data/ars_nouveau/recipe/spell_write.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:spell_write", "pedestalItems": [ { "item": "ars_nouveau:spell_parchment" diff --git a/src/generated/resources/data/ars_nouveau/recipe/splash_flask_cannon.json b/src/generated/resources/data/ars_nouveau/recipe/splash_flask_cannon.json index b85bf2abb0..36b199c709 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/splash_flask_cannon.json +++ b/src/generated/resources/data/ars_nouveau/recipe/splash_flask_cannon.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/split_arrow.json b/src/generated/resources/data/ars_nouveau/recipe/split_arrow.json index 26ad9229f0..7322cadda1 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/split_arrow.json +++ b/src/generated/resources/data/ars_nouveau/recipe/split_arrow.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:imbuement", "input": { "tag": "minecraft:arrows" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/stable_warp_scroll.json b/src/generated/resources/data/ars_nouveau/recipe/stable_warp_scroll.json index 60b63026cc..2fd29710ca 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/stable_warp_scroll.json +++ b/src/generated/resources/data/ars_nouveau/recipe/stable_warp_scroll.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/starbuncle_charm.json b/src/generated/resources/data/ars_nouveau/recipe/starbuncle_charm.json index b7d43ac5c9..5ed234a5eb 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/starbuncle_charm.json +++ b/src/generated/resources/data/ars_nouveau/recipe/starbuncle_charm.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/stone.json b/src/generated/resources/data/ars_nouveau/recipe/stone.json index 81e9a7c69a..25c2355275 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/stone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/stone.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "tag": "c:stones" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/storage_lectern.json b/src/generated/resources/data/ars_nouveau/recipe/storage_lectern.json index e16d8e1763..76edc10deb 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/storage_lectern.json +++ b/src/generated/resources/data/ars_nouveau/recipe/storage_lectern.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/sugar_cane.json b/src/generated/resources/data/ars_nouveau/recipe/sugar_cane.json index d87f2b1907..19db6c8064 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sugar_cane.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sugar_cane.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:sugar_cane" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/summon_focus.json b/src/generated/resources/data/ars_nouveau/recipe/summon_focus.json index 2f3a385d20..3e7609d17e 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/summon_focus.json +++ b/src/generated/resources/data/ars_nouveau/recipe/summon_focus.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/summon_ritual/bats.json b/src/generated/resources/data/ars_nouveau/recipe/summon_ritual/bats.json index 3dd57abd16..e70f0e1684 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/summon_ritual/bats.json +++ b/src/generated/resources/data/ars_nouveau/recipe/summon_ritual/bats.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:summon_ritual", "augment": { "item": "minecraft:amethyst_shard" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_1.json b/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_1.json index f20d20eda1..76124f5f20 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:sweeping_edge", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_2.json b/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_2.json index 4298f74d1c..5662aab48a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:sweeping_edge", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_3.json b/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_3.json index 4016e072ef..0d2cf14347 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:sweeping_edge", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/terracotta.json b/src/generated/resources/data/ars_nouveau/recipe/terracotta.json index e69b6fdca8..0a7f9479d0 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/terracotta.json +++ b/src/generated/resources/data/ars_nouveau/recipe/terracotta.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:terracotta" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/thorns_1.json b/src/generated/resources/data/ars_nouveau/recipe/thorns_1.json index 456b2bae9e..b59d4fee54 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thorns_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thorns_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:thorns", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/thorns_2.json b/src/generated/resources/data/ars_nouveau/recipe/thorns_2.json index 889531fcaf..c7c1097203 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thorns_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thorns_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:thorns", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/thorns_3.json b/src/generated/resources/data/ars_nouveau/recipe/thorns_3.json index 2f1e8cf715..40d003e390 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thorns_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thorns_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:thorns", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_amethyst_golem.json b/src/generated/resources/data/ars_nouveau/recipe/thread_amethyst_golem.json index 895fcb7875..a70810151c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_amethyst_golem.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_amethyst_golem.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_chilling.json b/src/generated/resources/data/ars_nouveau/recipe/thread_chilling.json index 61705d81e6..2abc21f51c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_chilling.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_chilling.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_depths.json b/src/generated/resources/data/ars_nouveau/recipe/thread_depths.json index 0c444fb969..6e7cc2c993 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_depths.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_depths.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_drygmy.json b/src/generated/resources/data/ars_nouveau/recipe/thread_drygmy.json index aa66201a90..e6ed7a07b7 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_drygmy.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_drygmy.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_feather.json b/src/generated/resources/data/ars_nouveau/recipe/thread_feather.json index a88b72c018..d483e6a248 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_feather.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_feather.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_gliding.json b/src/generated/resources/data/ars_nouveau/recipe/thread_gliding.json index f858c274cd..4ebce4ceb3 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_gliding.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_gliding.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_heights.json b/src/generated/resources/data/ars_nouveau/recipe/thread_heights.json index f1ef2e4dc3..49167450ac 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_heights.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_heights.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_high_step.json b/src/generated/resources/data/ars_nouveau/recipe/thread_high_step.json index befedf1c35..6feead4487 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_high_step.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_high_step.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_immolation.json b/src/generated/resources/data/ars_nouveau/recipe/thread_immolation.json index 7001a15f40..fffe921649 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_immolation.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_immolation.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_kindling.json b/src/generated/resources/data/ars_nouveau/recipe/thread_kindling.json index 7007c7302d..01364b1f67 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_kindling.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_kindling.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_life_drain.json b/src/generated/resources/data/ars_nouveau/recipe/thread_life_drain.json index 0d8d44bd69..678f979d46 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_life_drain.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_life_drain.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_magic_capacity.json b/src/generated/resources/data/ars_nouveau/recipe/thread_magic_capacity.json index 8492f58dd4..5560ac2024 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_magic_capacity.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_magic_capacity.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_repairing.json b/src/generated/resources/data/ars_nouveau/recipe/thread_repairing.json index 85a945c4ca..7a1a555dba 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_repairing.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_repairing.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_spellpower.json b/src/generated/resources/data/ars_nouveau/recipe/thread_spellpower.json index f87f0f9a4b..67f8682c51 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_spellpower.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_spellpower.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_starbuncle.json b/src/generated/resources/data/ars_nouveau/recipe/thread_starbuncle.json index 61a60f77cf..9f7188b45f 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_starbuncle.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_starbuncle.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_undying.json b/src/generated/resources/data/ars_nouveau/recipe/thread_undying.json index a8ba1f57fa..99f0674d11 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_undying.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_undying.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_warding.json b/src/generated/resources/data/ars_nouveau/recipe/thread_warding.json index 04faa14312..5d1573f1ba 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_warding.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_warding.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_whirlisprig.json b/src/generated/resources/data/ars_nouveau/recipe/thread_whirlisprig.json index aded414566..9ec1c30a2c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_whirlisprig.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_whirlisprig.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/thread_wixie.json b/src/generated/resources/data/ars_nouveau/recipe/thread_wixie.json index 557a1342ec..c652b11ea2 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thread_wixie.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thread_wixie.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/timer_spell_turret.json b/src/generated/resources/data/ars_nouveau/recipe/timer_spell_turret.json index 907bc8e060..b865cb3d15 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/timer_spell_turret.json +++ b/src/generated/resources/data/ars_nouveau/recipe/timer_spell_turret.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/arachne_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/arachne_tome.json new file mode 100644 index 0000000000..83c7d60f8c --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/arachne_tome.json @@ -0,0 +1,21 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Creates three snaring projectiles.", + "name": "Arachne's Weaving", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_projectile", + "ars_nouveau:glyph_split", + "ars_nouveau:glyph_split", + "ars_nouveau:glyph_snare", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/aurellia_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/aurellia_tome.json new file mode 100644 index 0000000000..5215629fc7 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/aurellia_tome.json @@ -0,0 +1,34 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 203, + "g": 119, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "The bite from this storm is worse than its bark.", + "name": "Aurellia's Bite Storm", + "sound": { + "sound": { + "soundEvent": { + "sound_id": "ars_nouveau:tempestry_family" + }, + "soundName": { + "translate": "ars_nouveau.sound.tempestry_family" + } + } + }, + "spell": [ + "ars_nouveau:glyph_projectile", + "ars_nouveau:glyph_linger", + "ars_nouveau:glyph_sensitive", + "ars_nouveau:glyph_fangs", + "ars_nouveau:glyph_lightning", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/bailey_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/bailey_tome.json new file mode 100644 index 0000000000..3fd05d5483 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/bailey_tome.json @@ -0,0 +1,22 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "To the MOOn", + "name": "Bailey's Bovine Rocket", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_projectile", + "ars_nouveau:glyph_launch", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_delay", + "ars_nouveau:glyph_explosion", + "ars_nouveau:glyph_amplify" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/chems_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/chems_tome.json new file mode 100644 index 0000000000..dc520c8872 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/chems_tome.json @@ -0,0 +1,23 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 248, + "g": 207, + "id": "ars_nouveau:constant", + "r": 61 + }, + "flavour_text": "Smothers an area with runes that launch entities upward. Do NOT get covered in the Repulsion Runes.", + "name": "Chem's Scientific Repulsion Runes", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_projectile", + "ars_nouveau:glyph_linger", + "ars_nouveau:glyph_sensitive", + "ars_nouveau:glyph_rune", + "ars_nouveau:glyph_launch", + "ars_nouveau:glyph_launch", + "ars_nouveau:glyph_launch", + "ars_nouveau:glyph_launch" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/darkfira_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/darkfira_tome.json new file mode 100644 index 0000000000..bd24ccd10f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/darkfira_tome.json @@ -0,0 +1,36 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 255, + "g": 255, + "id": "ars_nouveau:constant", + "r": 25 + }, + "flavour_text": "Encases your enemies or friends in a tomb of ice. Guaranteed to leave them shocked and confused.", + "name": "Darkfira's Flash Freeze", + "sound": { + "pitch": 1.9, + "sound": { + "soundEvent": { + "sound_id": "ars_nouveau:tempestry_family" + }, + "soundName": { + "translate": "ars_nouveau.sound.tempestry_family" + } + }, + "volume": 1.69 + }, + "spell": [ + "ars_nouveau:glyph_projectile", + "ars_nouveau:burst", + "ars_nouveau:glyph_sensitive", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_conjure_water", + "ars_nouveau:glyph_freeze", + "ars_nouveau:glyph_lightning", + "ars_nouveau:glyph_amplify" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/farfalla_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/farfalla_tome.json new file mode 100644 index 0000000000..458e7f9272 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/farfalla_tome.json @@ -0,0 +1,20 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Creates a fire that quickly freezes to ice.", + "name": "Farfalla's Frosty Flames", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_projectile", + "ars_nouveau:glyph_ignite", + "ars_nouveau:glyph_delay", + "ars_nouveau:glyph_conjure_water", + "ars_nouveau:glyph_freeze" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/fireball_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/fireball_tome.json new file mode 100644 index 0000000000..dc1a8390c6 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/fireball_tome.json @@ -0,0 +1,22 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "A classic.", + "name": "Fireball!", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_projectile", + "ars_nouveau:glyph_ignite", + "ars_nouveau:glyph_explosion", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/glow_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/glow_tome.json new file mode 100644 index 0000000000..49b9b76267 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/glow_tome.json @@ -0,0 +1,20 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Snares the target and grants other targets Glowing.", + "name": "Glow Trap", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_touch", + "ars_nouveau:glyph_rune", + "ars_nouveau:glyph_snare", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_light" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/gootastic_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/gootastic_tome.json new file mode 100644 index 0000000000..73804e406a --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/gootastic_tome.json @@ -0,0 +1,23 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "The squid's Lovecraftian roots appear to make it immune.", + "name": "Gootastic's Telekinetic Fishing Rod", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_projectile", + "ars_nouveau:glyph_launch", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_delay", + "ars_nouveau:glyph_pull", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/ivy_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/ivy_tome.json new file mode 100644 index 0000000000..2e06541c79 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/ivy_tome.json @@ -0,0 +1,25 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 105, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Now you never have to be lonely again! You will always have a friend with you! Feel free to change their name to whatever you want! :D", + "name": "Ivy", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_touch", + "ars_nouveau:glyph_animate_block", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_name" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/kirin_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/kirin_tome.json new file mode 100644 index 0000000000..e121b7c9bc --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/kirin_tome.json @@ -0,0 +1,19 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 255, + "g": 255, + "id": "ars_nouveau:constant", + "r": 25 + }, + "flavour_text": "Heroes are so straightforward, so easily befuddled...", + "name": "KirinDave's Sinister Switch", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_self", + "ars_nouveau:glyph_summon_decoy", + "ars_nouveau:glyph_blink", + "ars_nouveau:glyph_amplify" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/lyrellion_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/lyrellion_tome.json new file mode 100644 index 0000000000..0a22ba6a80 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/lyrellion_tome.json @@ -0,0 +1,22 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "You. Shall. Not. Pass.", + "name": "Lyrellion’s Wall of Force", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_projectile", + "ars_nouveau:glyph_accelerate", + "ars_nouveau:glyph_wall", + "ars_nouveau:glyph_sensitive", + "ars_nouveau:glyph_phantom_block", + "ars_nouveau:glyph_pierce", + "ars_nouveau:glyph_amplify" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/othy_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/othy_tome.json new file mode 100644 index 0000000000..74f3697252 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/othy_tome.json @@ -0,0 +1,21 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 255, + "g": 255, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Swarm your enemies with bladed spirits.", + "name": "Othy's Misdirection", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_self", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_summon_decoy", + "ars_nouveau:glyph_blink", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/poseidon_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/poseidon_tome.json new file mode 100644 index 0000000000..d982d4a442 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/poseidon_tome.json @@ -0,0 +1,34 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 255, + "g": 1, + "id": "ars_nouveau:constant", + "r": 1 + }, + "flavour_text": "Fire at a body of water to create a Ice bubble in the depths.", + "name": "Poseidon's Refuge", + "sound": { + "sound": { + "soundEvent": { + "sound_id": "ars_nouveau:tempestry_family" + }, + "soundName": { + "translate": "ars_nouveau.sound.tempestry_family" + } + } + }, + "spell": [ + "ars_nouveau:glyph_projectile", + "ars_nouveau:glyph_sensitive", + "ars_nouveau:glyph_light", + "ars_nouveau:burst", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_sensitive", + "ars_nouveau:glyph_freeze", + "ars_nouveau:glyph_break", + "ars_nouveau:glyph_freeze" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/renew_rune_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/renew_rune_tome.json new file mode 100644 index 0000000000..46dd8fdd28 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/renew_rune_tome.json @@ -0,0 +1,20 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Cures status effects and heals the user.", + "name": "Rune of Renewing", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_touch", + "ars_nouveau:glyph_rune", + "ars_nouveau:glyph_dispel", + "ars_nouveau:glyph_heal", + "ars_nouveau:glyph_amplify" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/shadow_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/shadow_tome.json new file mode 100644 index 0000000000..6a2ced969d --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/shadow_tome.json @@ -0,0 +1,25 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Creates a temporary tunnel of blocks.", + "name": "The Shadow's Temporary Tunnel", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_touch", + "ars_nouveau:glyph_intangible", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_pierce", + "ars_nouveau:glyph_pierce", + "ars_nouveau:glyph_pierce", + "ars_nouveau:glyph_pierce", + "ars_nouveau:glyph_pierce", + "ars_nouveau:glyph_extend_time" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/silvanus_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/silvanus_tome.json new file mode 100644 index 0000000000..dabede6503 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/silvanus_tome.json @@ -0,0 +1,20 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 1, + "g": 255, + "id": "ars_nouveau:constant", + "r": 1 + }, + "flavour_text": "When you want to go deeper but just don't have the torches", + "name": "Emergency Flair", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_touch", + "ars_nouveau:glyph_light", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/spinoftw_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/spinoftw_tome.json new file mode 100644 index 0000000000..fa70b635cb --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/spinoftw_tome.json @@ -0,0 +1,24 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 1, + "g": 90, + "id": "ars_nouveau:constant", + "r": 225 + }, + "flavour_text": " A utility spell to aid you in your adventures", + "name": "You were hurt, but you're fine", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_self", + "ars_nouveau:glyph_conjure_water", + "ars_nouveau:glyph_heal", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_phantom_block", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/takeoff_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/takeoff_tome.json new file mode 100644 index 0000000000..81393c1a89 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/takeoff_tome.json @@ -0,0 +1,20 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Launches the caster into the air and grants temporary elytra flight!", + "name": "Takeoff!", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_self", + "ars_nouveau:glyph_launch", + "ars_nouveau:glyph_launch", + "ars_nouveau:glyph_glide", + "ars_nouveau:glyph_duration_down" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/toxin_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/toxin_tome.json new file mode 100644 index 0000000000..db5d94afff --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/toxin_tome.json @@ -0,0 +1,19 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Poisons that target and causes them to take additional damage from all sources.", + "name": "Potent Toxin", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_projectile", + "ars_nouveau:glyph_hex", + "ars_nouveau:glyph_harm", + "ars_nouveau:glyph_extend_time" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/uni_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/uni_tome.json new file mode 100644 index 0000000000..ab385fa024 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/uni_tome.json @@ -0,0 +1,26 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Stay away!", + "name": "Uni's Windshield", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_self", + "ars_nouveau:glyph_orbit", + "ars_nouveau:glyph_gust", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/vault_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/vault_tome.json new file mode 100644 index 0000000000..be3ac7966f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/vault_tome.json @@ -0,0 +1,20 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Sometimes you just need to get over that wall.", + "name": "Vault", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_self", + "ars_nouveau:glyph_launch", + "ars_nouveau:glyph_delay", + "ars_nouveau:glyph_leap", + "ars_nouveau:glyph_slowfall" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/warp_impact_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/warp_impact_tome.json new file mode 100644 index 0000000000..d5fbf1fc0a --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/warp_impact_tome.json @@ -0,0 +1,19 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Teleportation, with style!", + "name": "Warp Impact", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_projectile", + "ars_nouveau:glyph_blink", + "ars_nouveau:glyph_explosion", + "ars_nouveau:glyph_aoe" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/xacris_2_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/xacris_2_tome.json new file mode 100644 index 0000000000..f9e69e9441 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/xacris_2_tome.json @@ -0,0 +1,25 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 255, + "g": 255, + "id": "ars_nouveau:constant", + "r": 25 + }, + "flavour_text": "Light up the sky", + "name": "Xacris's Firework Display", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_projectile", + "ars_nouveau:glyph_wall", + "ars_nouveau:glyph_sensitive", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_firework", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_amplify" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/xacris_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/xacris_tome.json new file mode 100644 index 0000000000..c4e6fd604f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/xacris_tome.json @@ -0,0 +1,23 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Builds a small hut around the user.", + "name": "Xacris' Tiny Hut", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_underfoot", + "ars_nouveau:glyph_phantom_block", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_pierce", + "ars_nouveau:glyph_pierce", + "ars_nouveau:glyph_pierce" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/yeet_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/yeet_tome.json new file mode 100644 index 0000000000..4c0f446226 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/yeet_tome.json @@ -0,0 +1,24 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Summons orbiting projectiles that will launch nearby enemies.", + "name": "Knocked out of Orbit", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_self", + "ars_nouveau:glyph_orbit", + "ars_nouveau:glyph_launch", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_delay", + "ars_nouveau:glyph_gust", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/unbreaking_1.json b/src/generated/resources/data/ars_nouveau/recipe/unbreaking_1.json index a07a5fd0fc..024e1cb307 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/unbreaking_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/unbreaking_1.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:unbreaking", "level": 1, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/unbreaking_2.json b/src/generated/resources/data/ars_nouveau/recipe/unbreaking_2.json index 37c79dc8e5..82df1d7a91 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/unbreaking_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/unbreaking_2.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:unbreaking", "level": 2, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/unbreaking_3.json b/src/generated/resources/data/ars_nouveau/recipe/unbreaking_3.json index d994506507..613146e4f9 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/unbreaking_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/unbreaking_3.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchantment", "enchantment": "minecraft:unbreaking", "level": 3, "pedestalItems": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/void_jar.json b/src/generated/resources/data/ars_nouveau/recipe/void_jar.json index a7545f03bd..f24c8c94d8 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/void_jar.json +++ b/src/generated/resources/data/ars_nouveau/recipe/void_jar.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/wand.json b/src/generated/resources/data/ars_nouveau/recipe/wand.json index dc35f23889..00b0457606 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/wand.json +++ b/src/generated/resources/data/ars_nouveau/recipe/wand.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/warp_scroll_copy.json b/src/generated/resources/data/ars_nouveau/recipe/warp_scroll_copy.json index 7b9ab0123d..def1c52a76 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/warp_scroll_copy.json +++ b/src/generated/resources/data/ars_nouveau/recipe/warp_scroll_copy.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": true, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/water_essence.json b/src/generated/resources/data/ars_nouveau/recipe/water_essence.json index 76bafcd9c8..741c834581 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/water_essence.json +++ b/src/generated/resources/data/ars_nouveau/recipe/water_essence.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:imbuement", "input": { "tag": "neoforge:gems/source" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/whirlisprig_charm.json b/src/generated/resources/data/ars_nouveau/recipe/whirlisprig_charm.json index 0cbb5e00d9..8a838dd059 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/whirlisprig_charm.json +++ b/src/generated/resources/data/ars_nouveau/recipe/whirlisprig_charm.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/white_dye.json b/src/generated/resources/data/ars_nouveau/recipe/white_dye.json index 7280e38873..ebf3656710 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/white_dye.json +++ b/src/generated/resources/data/ars_nouveau/recipe/white_dye.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:lily_of_the_valley" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/wixie_charm.json b/src/generated/resources/data/ars_nouveau/recipe/wixie_charm.json index 4ba70c6cb6..5fcdb34202 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/wixie_charm.json +++ b/src/generated/resources/data/ars_nouveau/recipe/wixie_charm.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:enchanting_apparatus", "keepNbtOfReagent": false, "pedestalItems": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/yellow_dye.json b/src/generated/resources/data/ars_nouveau/recipe/yellow_dye.json index 4c39f048a8..fd4f08d40f 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/yellow_dye.json +++ b/src/generated/resources/data/ars_nouveau/recipe/yellow_dye.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:dandelion" }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/yellow_dye_sunflower.json b/src/generated/resources/data/ars_nouveau/recipe/yellow_dye_sunflower.json index 59a8d8d102..2a6de56264 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/yellow_dye_sunflower.json +++ b/src/generated/resources/data/ars_nouveau/recipe/yellow_dye_sunflower.json @@ -1,4 +1,5 @@ { + "type": "ars_nouveau:crush", "input": { "item": "minecraft:sunflower" }, diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java index 0652b14ba6..ce4560960b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeBuilder.java @@ -4,14 +4,15 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantingApparatusRecipe; import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantmentRecipe; +import com.mojang.serialization.Codec; import com.mojang.serialization.JsonOps; -import com.mojang.serialization.MapCodec; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.level.ItemLike; @@ -111,19 +112,19 @@ public RecipeWrapper build() { throw new IllegalStateException("Enchanting Apparatus Recipe has no result"); } - return new RecipeWrapper<>(id, new EnchantingApparatusRecipe(reagent, result, pedestalItems, sourceCost, keepNbtOfReagent), EnchantingApparatusRecipe.Serializer.CODEC); + return new RecipeWrapper<>(id, new EnchantingApparatusRecipe(reagent, result, pedestalItems, sourceCost, keepNbtOfReagent), EnchantingApparatusRecipe.CODEC); } public RecipeWrapper buildEnchantmentRecipe(ResourceKey enchantment, int level, int mana) { if(id == null || id.getPath().equals("empty")){ id = ArsNouveau.prefix(enchantment.location().getPath() + "_" + level); } - return new RecipeWrapper<>(id, new EnchantmentRecipe(this.pedestalItems, enchantment, level, mana), EnchantmentRecipe.Serializer.CODEC); + return new RecipeWrapper<>(id, new EnchantmentRecipe(this.pedestalItems, enchantment, level, mana), EnchantmentRecipe.CODEC); } - public record RecipeWrapper(ResourceLocation id, T recipe, MapCodec codec) { + public record RecipeWrapper(ResourceLocation id, T recipe, Codec> codec) { public JsonElement serialize() { - return codec().codec().encodeStart(JsonOps.INSTANCE, recipe).getOrThrow(); + return codec().encodeStart(JsonOps.INSTANCE, recipe).getOrThrow(); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java index 62a89161d2..acb0b1a6d9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java @@ -43,7 +43,6 @@ public void collectJsons(CachedOutput pOutput) { for (ApparatusRecipeBuilder.RecipeWrapper wrapper : recipes) { Path path = getRecipePath(output, wrapper.id().getPath()); saveStable(pOutput, wrapper.serialize(), path); - } } @@ -856,11 +855,11 @@ public void addEntries() { reactiveIngredients.add(RecipeDatagen.SOURCE_GEM_BLOCK); addRecipe(new ApparatusRecipeBuilder.RecipeWrapper<>(ArsNouveau.prefix("reactive"), new ReactiveEnchantmentRecipe(reactiveIngredients, 3000), - ReactiveEnchantmentRecipe.Serializer.CODEC)); + ReactiveEnchantmentRecipe.CODEC)); List spellWriteList = new ArrayList<>(); spellWriteList.add(Ingredient.of(ItemsRegistry.SPELL_PARCHMENT.get())); - addRecipe(new ApparatusRecipeBuilder.RecipeWrapper<>(ArsNouveau.prefix("spell_write"), new SpellWriteRecipe(spellWriteList, 3000), SpellWriteRecipe.Serializer.CODEC)); + addRecipe(new ApparatusRecipeBuilder.RecipeWrapper<>(ArsNouveau.prefix("spell_write"), new SpellWriteRecipe(spellWriteList, 3000), SpellWriteRecipe.CODEC)); addRecipe(builder() .withPedestalItem(4, Ingredient.of(Tags.Items.GEMS_DIAMOND)) @@ -908,10 +907,10 @@ public void addEntries() { addRecipe(new ApparatusRecipeBuilder.RecipeWrapper<>(ArsNouveau.prefix("first_armor_upgrade"), new ArmorUpgradeRecipe(List.of(Ingredient.of(Tags.Items.RODS_BLAZE), Ingredient.of(Tags.Items.RODS_BLAZE)), 2500, 1), - ArmorUpgradeRecipe.Serializer.CODEC)); + ArmorUpgradeRecipe.CODEC)); addRecipe(new ApparatusRecipeBuilder.RecipeWrapper<>(ArsNouveau.prefix("second_armor_upgrade"), new ArmorUpgradeRecipe(List.of(Ingredient.of(Tags.Items.ENDER_PEARLS), Ingredient.of(Tags.Items.ENDER_PEARLS), Ingredient.of(Items.CHORUS_FRUIT)), 5000, 2), - ArmorUpgradeRecipe.Serializer.CODEC)); + ArmorUpgradeRecipe.CODEC)); addRecipe(builder().withResult(getPerkItem(StarbunclePerk.INSTANCE.getRegistryName())) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java index b4bf08fb9a..60feb0571b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BuddingConversionProvider.java @@ -26,7 +26,7 @@ public void collectJsons(CachedOutput pOutput) { addEntries(); for (Wrapper recipe : recipes) { Path path = getRecipePath(output, recipe.location().getPath()); - saveStable(pOutput, ANCodecs.toJson(BuddingConversionRecipe.Serializer.CODEC.codec(), recipe.recipe), path); + saveStable(pOutput, ANCodecs.toJson(BuddingConversionRecipe.CODEC, recipe.recipe), path); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java index 74f40c125e..0ab998c388 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java @@ -257,7 +257,7 @@ public void collectJsons(CachedOutput pOutput) { for (CasterRecipeWrapper g : tomes) { Path path = getRecipePath(output, g.id().getPath()); - saveStable(pOutput, CasterTomeData.Serializer.CODEC.codec().encodeStart(JsonOps.INSTANCE, g.toData()).getOrThrow(), path); + saveStable(pOutput, CasterTomeData.CODEC.encodeStart(JsonOps.INSTANCE, g.toData()).getOrThrow(), path); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CrushRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CrushRecipeProvider.java index 0fe8e2e672..e93810998d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CrushRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CrushRecipeProvider.java @@ -60,7 +60,7 @@ public void collectJsons(CachedOutput pOutput) { for (CrushWrapper g : recipes) { Path path = getRecipePath(output, g.path.getPath()); - saveStable(pOutput, CrushRecipe.Serializer.CODEC.codec().encodeStart(JsonOps.INSTANCE, g.asRecipe()).getOrThrow(), path); + saveStable(pOutput, CrushRecipe.CODEC.encodeStart(JsonOps.INSTANCE, g.asRecipe()).getOrThrow(), path); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java index 1a5bb2202e..509a6763f5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DispelEntityProvider.java @@ -31,7 +31,7 @@ public void collectJsons(CachedOutput pOutput) { addEntries(); for (Wrapper recipe : recipes) { Path path = getRecipePath(output, recipe.location().getPath()); - saveStable(pOutput, DispelEntityRecipe.Serializer.CODEC.codec().encodeStart(JsonOps.INSTANCE, recipe.recipe).getOrThrow(), path); + saveStable(pOutput, DispelEntityRecipe.CODEC.encodeStart(JsonOps.INSTANCE, recipe.recipe).getOrThrow(), path); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java index 671e1ab1c3..c0b31ca24c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java @@ -33,7 +33,7 @@ public CompletableFuture run(CachedOutput pOutput) { return ModDatagen.registries.thenCompose((registry) -> { for (ImbuementRecipe g : recipes) { Path path = getRecipePath(output, g.id.getPath()); - futures.add(DataProvider.saveStable(pOutput, registry, ImbuementRecipe.Serializer.CODEC.codec(), g, path)); + futures.add(DataProvider.saveStable(pOutput, registry, ImbuementRecipe.CODEC, g, path)); } return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); }); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java index f905a95d17..d6f2f56580 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java @@ -43,7 +43,7 @@ public static void datagen(GatherDataEvent event) { // event.getGenerator().addProvider(event.includeServer(), new SimpleAdvancements(event.getGenerator())); // event.getGenerator().addProvider(event.includeServer(), new AdvancementProvider(output, provider, fileHelper)); -// event.getGenerator().addProvider(event.includeServer(), new CasterTomeProvider(event.getGenerator())); + event.getGenerator().addProvider(event.includeServer(), new CasterTomeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new SummonRitualProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new BuddingConversionProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new ScryRitualProvider(event.getGenerator())); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java index 00e8cbcc0c..4af86106a0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java @@ -30,7 +30,7 @@ public void collectJsons(CachedOutput pOutput) { addEntries(); for (ScryRecipeWrapper recipe : recipes) { Path path = getRecipePath(output, recipe.id().getPath()); - saveStable(pOutput, ScryRitualRecipe.Serializer.CODEC.codec().encodeStart(JsonOps.INSTANCE, recipe.recipe()).getOrThrow(), path); + saveStable(pOutput, ScryRitualRecipe.CODEC.encodeStart(JsonOps.INSTANCE, recipe.recipe()).getOrThrow(), path); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java index 6fef9dd38c..942a32fd55 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/SummonRitualProvider.java @@ -29,7 +29,7 @@ public void collectJsons(CachedOutput pOutput) { addEntries(); for (SummonRitualRecipeWrapper recipe : recipes) { Path path = getRecipePath(output, recipe.id().getPath()); - saveStable(pOutput, SummonRitualRecipe.Serializer.CODEC.codec().encodeStart(JsonOps.INSTANCE, recipe.recipe()).getOrThrow(), path); + saveStable(pOutput, SummonRitualRecipe.CODEC.encodeStart(JsonOps.INSTANCE, recipe.recipe()).getOrThrow(), path); } } From 67045ebd2ceb43f0ee845e06ac86cf913094bac7 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 7 Jul 2024 16:36:19 -0500 Subject: [PATCH 041/363] fix spell sound holder --- .../arsnouveau/api/sound/SpellSound.java | 32 ++++--------------- .../loot_modifiers/global_loot_modifiers.json | 0 .../tags/items/quiver_items/arrows.json | 8 ----- 3 files changed, 7 insertions(+), 33 deletions(-) rename src/main/resources/data/{forge => neoforge}/loot_modifiers/global_loot_modifiers.json (100%) delete mode 100644 src/main/resources/data/nyfsquiver/tags/items/quiver_items/arrows.json diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java b/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java index 2a7ff355bd..fc883d058f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java @@ -21,52 +21,35 @@ public class SpellSound { ).apply(instance, SpellSound::new)); public static StreamCodec STREAM = StreamCodec.of( - (buf, val) -> buf.writeResourceLocation(val.id), + (buf, val) -> buf.writeResourceLocation(val.getId()), buf -> SpellSoundRegistry.getSpellSoundsRegistry().get(buf.readResourceLocation()) ); - private ResourceLocation id; private Holder soundEvent; private Component soundName; - public SpellSound(ResourceLocation id, Holder soundEvent, Component soundName) { - this.id = id; + public SpellSound(Holder soundEvent, Component soundName) { this.soundEvent = soundEvent; this.soundName = soundName; } - public SpellSound(Holder soundEvent, Component soundName) { - this(soundEvent.unwrapKey().get().location(), soundEvent, soundName); - } - public ResourceLocation getId() { - return id; + return soundEvent.unwrapKey().get().location(); } - public void setId(ResourceLocation id) { - this.id = id; - } public Holder getSoundEvent() { return soundEvent; } - public void setSoundEvent(Holder soundEvent) { - this.soundEvent = soundEvent; - } - public Component getSoundName() { return soundName; } - public void setSoundName(Component soundName) { - this.soundName = soundName; - } - public ResourceLocation getTexturePath() { - return ResourceLocation.fromNamespaceAndPath(this.id.getNamespace(), "textures/sounds/" + this.id.getPath() + ".png"); + return ResourceLocation.fromNamespaceAndPath(this.getId().getNamespace(), "textures/sounds/" + this.getId().getPath() + ".png"); } @Override @@ -74,19 +57,18 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; SpellSound that = (SpellSound) o; - return Objects.equals(id, that.id) && Objects.equals(soundEvent, that.soundEvent) && Objects.equals(soundName, that.soundName); + return Objects.equals(soundEvent, that.soundEvent) && Objects.equals(soundName, that.soundName); } @Override public int hashCode() { - return Objects.hash(id, soundEvent, soundName); + return Objects.hash(soundEvent, soundName); } @Override public String toString() { return "SpellSound{" + - "id=" + id + - ", soundEvent=" + soundEvent + + "soundEvent=" + soundEvent + ", soundName=" + soundName + '}'; } diff --git a/src/main/resources/data/forge/loot_modifiers/global_loot_modifiers.json b/src/main/resources/data/neoforge/loot_modifiers/global_loot_modifiers.json similarity index 100% rename from src/main/resources/data/forge/loot_modifiers/global_loot_modifiers.json rename to src/main/resources/data/neoforge/loot_modifiers/global_loot_modifiers.json diff --git a/src/main/resources/data/nyfsquiver/tags/items/quiver_items/arrows.json b/src/main/resources/data/nyfsquiver/tags/items/quiver_items/arrows.json deleted file mode 100644 index 112394d092..0000000000 --- a/src/main/resources/data/nyfsquiver/tags/items/quiver_items/arrows.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "replace": false, - "values": [ - "ars_nouveau:pierce_arrow", - "ars_nouveau:amplify_arrow", - "ars_nouveau:split_arrow" - ] -} \ No newline at end of file From 4f0a2688f9d242eb46970dd78a20cf51c50ea71f Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 7 Jul 2024 19:11:11 -0500 Subject: [PATCH 042/363] fix glyph crafting --- .../arsnouveau/client/gui/GlyphRecipeTooltip.java | 4 +++- .../arsnouveau/client/gui/book/GlyphUnlockMenu.java | 11 ++++------- .../client/gui/buttons/UnlockGlyphButton.java | 2 +- .../common/crafting/recipes/GlyphRecipe.java | 7 +------ 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GlyphRecipeTooltip.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GlyphRecipeTooltip.java index 6bd57eadc3..ac3aee0168 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GlyphRecipeTooltip.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GlyphRecipeTooltip.java @@ -9,11 +9,13 @@ import net.minecraft.world.item.crafting.Ingredient; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; + import java.util.ArrayList; import java.util.List; public class GlyphRecipeTooltip implements ClientTooltipComponent { - public static final ResourceLocation TEXTURE_LOCATION = ResourceLocation.withDefaultNamespace("textures/gui/container/bundle.png"); + // TODO: fix background render on tooltip + public static final ResourceLocation TEXTURE_LOCATION = ResourceLocation.withDefaultNamespace("textures/gui/container/bundle/background.png"); private static final int MARGIN_Y = 4; private static final int BORDER_WIDTH = 1; private static final int TEX_SIZE = 128; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java index f59df45379..1582cd4080 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java @@ -15,7 +15,7 @@ import com.hollingsworth.arsnouveau.setup.registry.CreativeTabRegistry; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; +import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; @@ -359,7 +359,6 @@ public void drawTooltip(GuiGraphics stack, int mouseX, int mouseY) { } public void renderTooltipInternal(GuiGraphics graphics, List pClientTooltipComponents, int pMouseX, int pMouseY) { - if (!pClientTooltipComponents.isEmpty()) { PoseStack pPoseStack = graphics.pose(); net.neoforged.neoforge.client.event.RenderTooltipEvent.Pre preEvent = net.neoforged.neoforge.client.ClientHooks.onRenderTooltipPre(ItemStack.EMPTY, graphics, pMouseX, pMouseY, width, height, pClientTooltipComponents, this.font, DefaultTooltipPositioner.INSTANCE); @@ -386,10 +385,10 @@ public void renderTooltipInternal(GuiGraphics graphics, List spellRecipe, OnPress onPress) { super(x, y, 16, 16, onPress); this.isCraftingSlot = isCraftingSlot; - this.spellPart = spellPart; + this.spellPart = spellRecipe.value().getSpellPart(); this.recipe = spellRecipe; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java index 99c196e7a0..3dafe5c444 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/GlyphRecipe.java @@ -142,12 +142,7 @@ public static GlyphRecipe fromNetwork(RegistryFriendlyByteBuf buffer) { List stacks = new ArrayList<>(); for (int i = 0; i < length; i++) { - try { - Ingredient.CONTENTS_STREAM_CODEC.decode(buffer); - } catch (Exception e) { - e.printStackTrace(); - break; - } + stacks.add(Ingredient.CONTENTS_STREAM_CODEC.decode(buffer)); } return new GlyphRecipe(ItemStack.STREAM_CODEC.decode(buffer), stacks, buffer.readInt()); } From 5096e66ad2fd0a9f1b24e7412f781601e6deacc1 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 8 Jul 2024 21:59:44 -0500 Subject: [PATCH 043/363] fix imbuement rendering, crash --- .../client/renderer/tile/ScribesRenderer.java | 61 ++++++++++++------- .../common/block/tile/ImbuementTile.java | 16 +++-- .../animations/scribes_table_animations.json | 4 +- 3 files changed, 51 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScribesRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScribesRenderer.java index ed6b1ca4f6..f54cc9c64a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScribesRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ScribesRenderer.java @@ -21,6 +21,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import org.joml.Quaternionf; import software.bernie.geckolib.cache.object.BakedGeoModel; @@ -42,28 +43,28 @@ public void preRender(PoseStack stack, ScribesTile tile, BakedGeoModel model, Mu if (tile.getLevel().getBlockState(tile.getBlockPos()).getValue(ScribesBlock.PART) != ThreePartBlock.HEAD) return; stack.pushPose(); - Direction direction = tile.getLevel().getBlockState(tile.getBlockPos()).getValue(ScribesBlock.FACING); - if (direction == Direction.NORTH) { - stack.mulPose(Axis.YP.rotationDegrees(-90)); - stack.translate(1, 0, -1); - } - - if (direction == Direction.SOUTH) { - stack.mulPose(Axis.YP.rotationDegrees(270)); - stack.translate(-1, 0, -1); - } - - if (direction == Direction.WEST) { - stack.mulPose(Axis.YP.rotationDegrees(270)); - - stack.translate(0, 0, -2); - } - - if (direction == Direction.EAST) { - stack.mulPose(Axis.YP.rotationDegrees(-90)); - stack.translate(0, 0, 0); - - } +// Direction direction = tile.getLevel().getBlockState(tile.getBlockPos()).getValue(ScribesBlock.FACING); +// if (direction == Direction.NORTH) { +// stack.mulPose(Axis.YP.rotationDegrees(-90)); +// stack.translate(1, 0, -1); +// } +// +// if (direction == Direction.SOUTH) { +// stack.mulPose(Axis.YP.rotationDegrees(270)); +// stack.translate(-1, 0, -1); +// } +// +// if (direction == Direction.WEST) { +// stack.mulPose(Axis.YP.rotationDegrees(270)); +// +// stack.translate(0, 0, -2); +// } +// +// if (direction == Direction.EAST) { +// stack.mulPose(Axis.YP.rotationDegrees(-90)); +// stack.translate(0, 0, 0); +// +// } super.preRender(stack, tile, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); stack.popPose(); } @@ -76,6 +77,7 @@ public void actuallyRender(PoseStack stack, ScribesTile tile, BakedGeoModel mode return; Direction direction = tile.getLevel().getBlockState(tile.getBlockPos()).getValue(ScribesBlock.FACING); stack.pushPose(); + stack.translate(-0.5, 0, 0.5); if (direction == Direction.NORTH) { stack.mulPose(Axis.YP.rotationDegrees(-90)); stack.translate(1, 0, -1); @@ -186,4 +188,19 @@ public static GenericItemBlockRenderer getISTER() { public RenderType getRenderType(ScribesTile animatable, ResourceLocation texture, @org.jetbrains.annotations.Nullable MultiBufferSource bufferSource, float partialTick) { return RenderType.entityTranslucent(texture); } + + @Override + public boolean shouldRenderOffScreen(ScribesTile pBlockEntity) { + return true; + } + + @Override + public int getViewDistance() { + return 256; + } + + @Override + public AABB getRenderBoundingBox(ScribesTile blockEntity) { + return AABB.INFINITE; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java index 4e9784c6d1..ec619f07cc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java @@ -85,7 +85,7 @@ public void tick() { getX() + 0.5, getY() + 0.5, getZ() + 0.5); } } - if(!stack.isEmpty() && recipe == null){ + if (!stack.isEmpty() && recipe == null) { RecipeHolder holder = getRecipeNow(); this.recipe = holder != null ? holder.value() : null; } @@ -105,7 +105,7 @@ public void tick() { // Restore the recipe on world restart if (recipe == null) { RecipeHolder foundRecipe = getRecipeNow(); - if(foundRecipe != null){ + if (foundRecipe != null) { this.recipe = foundRecipe.value(); this.craftTicks = 100; } @@ -160,7 +160,11 @@ public void tick() { @Override protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.loadAdditional(tag, pRegistries); - stack = ItemStack.parseOptional(pRegistries, (CompoundTag) tag.get("itemStack")); + if (tag.contains("itemStack")) { + stack = ItemStack.parseOptional(pRegistries, tag.getCompound("itemStack")); + }else{ + stack = ItemStack.EMPTY; + } draining = tag.getBoolean("draining"); this.hasRecipe = tag.getBoolean("hasRecipe"); this.craftTicks = tag.getInt("craftTicks"); @@ -288,7 +292,7 @@ public List getNearbyPedestals() { return pedestalList(getBlockPos(), 1, getLevel()); } - public @Nullable RecipeHolder getRecipeNow(){ + public @Nullable RecipeHolder getRecipeNow() { return level.getRecipeManager().getAllRecipesFor(RecipeRegistry.IMBUEMENT_TYPE.get()).stream() .filter(f -> f.value().matches(this, level)).findFirst().orElse(null); } @@ -296,9 +300,9 @@ public List getNearbyPedestals() { @Override public void getTooltip(List tooltip) { RecipeHolder recipe = getRecipeNow(); - if(recipe != null && !recipe.value().output.isEmpty() && stack != null && !stack.isEmpty()) { + if (recipe != null && !recipe.value().output.isEmpty() && stack != null && !stack.isEmpty()) { tooltip.add(Component.translatable("ars_nouveau.crafting", recipe.value().output.getHoverName())); - if(recipe.value().source > 0) { + if (recipe.value().source > 0) { tooltip.add(Component.translatable("ars_nouveau.crafting_progress", Math.min(100, (getSource() * 100) / recipe.value().source)).withStyle(ChatFormatting.GOLD)); } } diff --git a/src/main/resources/assets/ars_nouveau/animations/scribes_table_animations.json b/src/main/resources/assets/ars_nouveau/animations/scribes_table_animations.json index 7f4cf86129..f40b12cbcd 100644 --- a/src/main/resources/assets/ars_nouveau/animations/scribes_table_animations.json +++ b/src/main/resources/assets/ars_nouveau/animations/scribes_table_animations.json @@ -41,7 +41,7 @@ }, "position": { "0.0": { - "vector": ["math.lerp(0, -20, (query.anim_time)*.75) + 12- math.cos(query.anim_time*200) - 10", "math.lerp(math.lerp(0, 12, query.anim_time*0.75), math.lerp(12, 6, query.anim_time*.75), query.anim_time*0.75)", "math.lerp(0, -11, query.anim_time*0.75) + 8 * math.sin(query.anim_time*200)"] + "vector": ["math.lerp(0, -20, (query.anim_time)*0.75) + 12- math.cos(query.anim_time*200) - 10", "math.lerp(0, math.lerp(12, 6, query.anim_time * 0.75), query.anim_time * 0.75)", "math.lerp(0, -11, query.anim_time*0.75) + 8 * math.sin(query.anim_time*200)"] }, "1.3333": { "vector": [-20, 4, -11] @@ -74,7 +74,7 @@ "easing": "easeOutSine" }, "4.375": { - "vector": ["math.lerp(-7, 0, (query.anim_time-4.375)*0.75)", "2+math.lerp(math.lerp(0, 20, (query.anim_time-4.375)*0.75), math.lerp(20 , 0, (query.anim_time-4.375)*0.75), (query.anim_time-4.375)*0.75)", "math.lerp(-7, 0, (query.anim_time-4.375)*0.75)"] + "vector": ["math.lerp(-7, 0, (query.anim_time - 4.375) * 0.75)", "2 + math.lerp(math.lerp(0, 20, (query.anim_time - 4.375)*0.75), math.lerp(20, 0, (query.anim_time - 4.375) * 0.75), (query.anim_time - 4.375) * 0.75)", "math.lerp(-7, 0, (query.anim_time - 4.375) * 0.75)"] }, "5.5417": { "vector": [0, 0, 0], From a847f7e13404a240d4b515807c4c7be462f078d0 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 8 Jul 2024 22:14:37 -0500 Subject: [PATCH 044/363] fix rune rendering --- gradle.properties | 2 +- .../client/renderer/tile/RuneRenderer.java | 25 ++++++++++++------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/gradle.properties b/gradle.properties index c47bb767cd..5ad4d4d632 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,6 +24,6 @@ mod_description=Craft spells, create powerful baubles, and summon magical creatu jei_version=19.1.1.19 curios_version=8.0.0-beta -geckolib_version=4.5.5 +geckolib_version=4.5.6 patchouli_version=85-NEOFORGE caelus_version=7.0.0+1.21 diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RuneRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RuneRenderer.java index 2c8558fa95..f8fee8bce9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RuneRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/RuneRenderer.java @@ -14,6 +14,7 @@ import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.util.Color; public class RuneRenderer extends ArsGeoBlockRenderer { @@ -38,37 +39,43 @@ public void actuallyRender(PoseStack poseStack, RuneTile animatable, BakedGeoMod ParticleColor particleColor = animatable.spell.color(); poseStack.pushPose(); Direction direction = animatable.getBlockState().getValue(BasicSpellTurret.FACING); +// poseStack.translate(0.5, 0.5, 0); if (direction == Direction.UP) { - poseStack.translate(0, -0.5, 0.5); + poseStack.translate(0.5, 0, 0.5); poseStack.mulPose(Axis.XP.rotationDegrees(-90)); } else if (direction == Direction.EAST) { - poseStack.translate(0, 0, 0); + poseStack.translate(0, 0.5, 0.5); poseStack.mulPose(Axis.YP.rotationDegrees(-90)); poseStack.mulPose(Axis.XP.rotationDegrees(-90)); }else if(direction == Direction.NORTH){ - poseStack.translate(1, 1, 1); + poseStack.translate(0.5, 0.5, 1); poseStack.mulPose(Axis.XP.rotationDegrees(90)); poseStack.mulPose(Axis.ZP.rotationDegrees(180)); }else if(direction == Direction.DOWN){ - poseStack.translate(1, 0.5, 0.5); + poseStack.translate(0.5, 0.98, 0.5); poseStack.mulPose(Axis.XP.rotationDegrees(90)); - poseStack.mulPose(Axis.YP.rotationDegrees(180)); }else if(direction == Direction.WEST){ - poseStack.translate(1, 0, 0); + poseStack.translate(1, 0.5, 0.5); poseStack.mulPose(Axis.ZP.rotationDegrees(90)); }else if(direction == Direction.SOUTH){ - poseStack.translate(1, 0, 0); + poseStack.translate(0.5, 0.5, 0); poseStack.mulPose(Axis.XP.rotationDegrees(-90)); poseStack.mulPose(Axis.ZP.rotationDegrees(-180)); } - super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, animatable.isCharged ? particleColor.getColor() : color); + super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); poseStack.popPose(); } @Override public RenderType getRenderType(RuneTile animatable, ResourceLocation texture, @Nullable MultiBufferSource bufferSource, float partialTick) { - return RenderType.entityTranslucent(texture); + return RenderType.entityCutoutNoCull(texture); + } + + @Override + public Color getRenderColor(RuneTile animatable, float partialTick, int packedLight) { + var color = animatable.spell.color(); + return animatable.isCharged ? Color.ofOpaque(color.getColor()) : super.getRenderColor(animatable, partialTick, packedLight); } public static GenericItemBlockRenderer getISTER() { From c0804204000a9f0a0c54d793609554f6e38ff3f4 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 9 Jul 2024 09:01:51 -0500 Subject: [PATCH 045/363] add components to items, equals/hashcode on data --- .../api/item/AbstractSummonCharm.java | 4 ++- .../arsnouveau/common/items/DominionWand.java | 2 +- .../arsnouveau/common/items/FlaskCannon.java | 2 +- .../arsnouveau/common/items/ItemScroll.java | 3 +- .../arsnouveau/common/items/JarOfLight.java | 5 ++-- .../arsnouveau/common/items/ModItem.java | 7 +++-- .../arsnouveau/common/items/Present.java | 15 +++------- .../arsnouveau/common/items/ScryerScroll.java | 2 +- .../common/items/StableWarpScroll.java | 2 +- .../arsnouveau/common/items/VoidJar.java | 2 +- .../arsnouveau/common/items/WarpScroll.java | 2 +- .../common/items/data/ArmorPerkHolder.java | 18 ++++++++--- .../common/items/data/BlockFillContents.java | 15 ++++++++++ .../common/items/data/CodexData.java | 14 +++++++++ .../common/items/data/DominionWandData.java | 13 ++++++++ .../common/items/data/ItemScrollData.java | 14 +++++++++ .../common/items/data/LightJarData.java | 15 ++++++++++ .../common/items/data/MobJarData.java | 15 ++++++++++ .../items/data/MultiPotionContents.java | 15 ++++++++++ .../items/data/PersistentFamiliarData.java | 14 +++++++++ .../common/items/data/PotionLauncherData.java | 15 ++++++++++ .../common/items/data/PresentData.java | 30 +++++++++++++++++-- .../common/items/data/ScryPosData.java | 15 ++++++++++ .../common/items/data/StackPerkHolder.java | 16 +++++++++- .../items/data/StarbuncleCharmData.java | 14 +++++++++ .../common/items/data/VoidJarData.java | 14 +++++++++ .../common/items/data/WarpScrollData.java | 14 +++++++++ .../items/summon_charms/StarbuncleCharm.java | 2 +- .../setup/registry/ItemsRegistry.java | 3 +- 29 files changed, 268 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/AbstractSummonCharm.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/AbstractSummonCharm.java index b484693926..f2c5cd40bf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/AbstractSummonCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/AbstractSummonCharm.java @@ -2,6 +2,8 @@ import com.hollingsworth.arsnouveau.common.block.tile.SummoningTile; import com.hollingsworth.arsnouveau.common.items.ModItem; +import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionResult; @@ -15,7 +17,7 @@ public AbstractSummonCharm(Properties properties) { } public AbstractSummonCharm() { - this(ItemsRegistry.defaultItemProperties()); + this(ItemsRegistry.defaultItemProperties().component(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, new PersistentFamiliarData())); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java index f84da6464d..7c5d62df21 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java @@ -28,7 +28,7 @@ public class DominionWand extends ModItem { public DominionWand() { - super(ItemsRegistry.defaultItemProperties().stacksTo(1)); + super(ItemsRegistry.defaultItemProperties().stacksTo(1).component(DataComponentRegistry.DOMINION_WAND, new DominionWandData())); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java index 5a15d9739d..b09a11b8e8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java @@ -49,7 +49,7 @@ public abstract class FlaskCannon extends ModItem implements IRadialProvider, GeoItem { public FlaskCannon(Properties properties) { - super(properties); + super(properties.component(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData())); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java index 5119a1e6c1..49f42c2b60 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.api.item.IScribeable; import com.hollingsworth.arsnouveau.common.items.data.ItemScrollData; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; @@ -16,7 +17,7 @@ public abstract class ItemScroll extends ModItem implements IScribeable { public ItemScroll() { - super(); + super(ItemsRegistry.defaultItemProperties().component(DataComponentRegistry.ITEM_SCROLL_DATA, new ItemScrollData(List.of()))); } public ItemScroll(Properties properties) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/JarOfLight.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/JarOfLight.java index b3a84ad19d..099299360b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/JarOfLight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/JarOfLight.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.common.items.data.LightJarData; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; @@ -20,10 +21,8 @@ public class JarOfLight extends ModItem { public JarOfLight() { - super(); + super(ItemsRegistry.defaultItemProperties().component(DataComponentRegistry.LIGHT_JAR, new LightJarData(null, false))); } - //If the light is dispatched - @Override public void inventoryTick(ItemStack stack, Level worldIn, Entity entityIn, int itemSlot, boolean isSelected) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java index 4265e15268..92ca6e2abf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.common.items; -import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.network.chat.Component; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -22,7 +21,7 @@ public ModItem(Properties properties) { } public ModItem() { - this(ItemsRegistry.defaultItemProperties()); + this(defaultProps()); } public ModItem withTooltip(Component tip) { @@ -40,6 +39,10 @@ public ModItem withRarity(Rarity rarity) { return this; } + protected static Properties defaultProps(){ + return new Item.Properties(); + } + /** * allows items to add custom lines of information to the mouseover description */ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Present.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Present.java index 93ef5315b6..fec1bad80f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Present.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Present.java @@ -1,12 +1,10 @@ package com.hollingsworth.arsnouveau.common.items; -import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.loot.DungeonLootEnhancerModifier; import com.hollingsworth.arsnouveau.api.loot.DungeonLootTables; import com.hollingsworth.arsnouveau.common.entity.Starbuncle; import com.hollingsworth.arsnouveau.common.items.data.PresentData; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; -import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; @@ -19,6 +17,7 @@ import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import java.util.List; +import java.util.Optional; public class Present extends ModItem{ @@ -32,7 +31,7 @@ public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pS if(pLevel.isClientSide) return; if(pEntity instanceof Player player && !pStack.has(DataComponentRegistry.PRESENT)){ - pStack.set(DataComponentRegistry.PRESENT, new PresentData(player.getName().getString(), player.getUUID())); + pStack.set(DataComponentRegistry.PRESENT, new PresentData(player.getName().getString(), Optional.ofNullable(player.getUUID()))); } } @@ -43,7 +42,7 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte PresentData presentData = pPlayer.getItemInHand(pUsedHand).get(DataComponentRegistry.PRESENT); if(presentData == null) return super.use(pLevel, pPlayer, pUsedHand); - int bonusRolls = presentData.uuid() != null && !presentData.uuid().equals(pPlayer.getUUID()) ? 2 : 0; + int bonusRolls = presentData.uuid().isPresent() && !presentData.uuid().get().equals(pPlayer.getUUID()) ? 2 : 0; DungeonLootEnhancerModifier modifier = new DungeonLootEnhancerModifier(new LootItemCondition[]{}, 0.5, 0.2, 0.1,3 + bonusRolls, 1 + bonusRolls, 1 + bonusRolls); List stacks = DungeonLootTables.getRandomRoll(modifier); @@ -64,12 +63,6 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); PresentData data = stack.get(DataComponentRegistry.PRESENT); - if(data != null && data.uuid() != null){ - if(data.uuid().equals(ArsNouveau.proxy.getPlayer().getUUID())){ - tooltip2.add(Component.translatable("ars_nouveau.present.give")); - }else { - tooltip2.add(Component.translatable("ars_nouveau.present.from", data.name()).withStyle(ChatFormatting.GOLD)); - } - } + stack.addToTooltip(DataComponentRegistry.PRESENT, context, tooltip2::add, flagIn); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java index 2644cc355c..c06bac8815 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java @@ -15,7 +15,7 @@ public class ScryerScroll extends ModItem { public ScryerScroll() { - super(); + super(defaultProps().component(DataComponentRegistry.SCRY_DATA, new ScryPosData(null))); withTooltip(Component.translatable("tooltip.ars_nouveau.scryer_scroll")); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java index d34af2a023..a42e537518 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java @@ -21,7 +21,7 @@ public class StableWarpScroll extends ModItem{ public StableWarpScroll(Item.Properties properties) { - super(properties.stacksTo(1)); + super(properties.stacksTo(1).component(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(null, null, null, true))); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java index f34e96974c..8f93bb9405 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java @@ -18,7 +18,7 @@ public class VoidJar extends ModItem implements IScribeable { public VoidJar() { - super(ItemsRegistry.defaultItemProperties().stacksTo(1)); + super(ItemsRegistry.defaultItemProperties().stacksTo(1).component(DataComponentRegistry.VOID_JAR, new VoidJarData())); } public void toggleStatus(Player playerEntity, ItemStack stack) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java index bdf36c1145..1a96b060f1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java @@ -26,7 +26,7 @@ public class WarpScroll extends ModItem { public WarpScroll() { - super(ItemsRegistry.defaultItemProperties()); + super(ItemsRegistry.defaultItemProperties().component(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(null, null, null, false))); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java index d86bf660cb..fe6616a576 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java @@ -13,10 +13,7 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Map; +import java.util.*; public class ArmorPerkHolder extends StackPerkHolder { @@ -67,4 +64,17 @@ public ArmorPerkHolder setTier(int tier) { public ArmorPerkHolder setTagForPerk(IPerk perk, CompoundTag tag) { return new ArmorPerkHolder(color, getPerks(), getTier(), Util.copyAndPut(getPerkTags(), perk, tag)); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ArmorPerkHolder that = (ArmorPerkHolder) o; + return Objects.equals(color, that.color); + } + + @Override + public int hashCode() { + return Objects.hashCode(color); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/BlockFillContents.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/BlockFillContents.java index a533716668..5843494dbb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/BlockFillContents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/BlockFillContents.java @@ -7,6 +7,8 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.ItemStack; +import java.util.Objects; + public record BlockFillContents(int amount) { public static final Codec CODEC = Codec.INT.xmap(BlockFillContents::new, BlockFillContents::amount); public static final StreamCodec STREAM_CODEC = StreamCodec.composite(ByteBufCodecs.INT, BlockFillContents::amount, BlockFillContents::new); @@ -14,4 +16,17 @@ public record BlockFillContents(int amount) { public static int get(ItemStack stack){ return stack.getOrDefault(DataComponentRegistry.BLOCK_FILL_CONTENTS, new BlockFillContents(0)).amount; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BlockFillContents that = (BlockFillContents) o; + return amount == that.amount; + } + + @Override + public int hashCode() { + return Objects.hashCode(amount); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/CodexData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/CodexData.java index e7da6d9d86..7a10dec560 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/CodexData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/CodexData.java @@ -14,6 +14,7 @@ import net.minecraft.world.item.component.TooltipProvider; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.UUID; import java.util.function.Consumer; @@ -51,4 +52,17 @@ public void addToTooltip(Item.TooltipContext pContext, Consumer pTool if (this.wasRecorded()) pTooltipAdder.accept(Component.translatable("ars_nouveau.recorded_by", playerName())); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CodexData codexData = (CodexData) o; + return Objects.equals(playerName, codexData.playerName) && Objects.equals(uuid, codexData.uuid) && Objects.equals(glyphIds, codexData.glyphIds); + } + + @Override + public int hashCode() { + return Objects.hash(uuid, playerName, glyphIds); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java index 5eb8856a56..40b6f568c2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java @@ -9,6 +9,7 @@ import net.minecraft.network.codec.StreamCodec; import javax.annotation.Nullable; +import java.util.Objects; public record DominionWandData(BlockPos storedPos, Direction face, boolean strict, int storedEntityId) { @@ -63,4 +64,16 @@ public DominionWandData toggleMode(){ return new DominionWandData(storedPos, face, !strict, storedEntityId); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DominionWandData that = (DominionWandData) o; + return strict == that.strict && storedEntityId == that.storedEntityId && face == that.face && Objects.equals(storedPos, that.storedPos); + } + + @Override + public int hashCode() { + return Objects.hash(storedPos, face, strict, storedEntityId); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java index 906675e276..bba47ce65a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -60,6 +61,19 @@ public void addToTooltip(Item.TooltipContext pContext, Consumer pTool } } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ItemScrollData that = (ItemScrollData) o; + return Objects.equals(getItems(), that.getItems()); + } + + @Override + public int hashCode() { + return Objects.hashCode(getItems()); + } + public static class Mutable { private final List list; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/LightJarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/LightJarData.java index 2d7c24edd0..2212e839d7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/LightJarData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/LightJarData.java @@ -7,6 +7,8 @@ import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; +import java.util.Objects; + public record LightJarData(BlockPos pos, boolean enabled) { public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( BlockPos.CODEC.fieldOf("pos").forGetter(LightJarData::pos), @@ -14,4 +16,17 @@ public record LightJarData(BlockPos pos, boolean enabled) { ).apply(instance, LightJarData::new)); public static StreamCodec STREAM_CODEC = StreamCodec.composite(BlockPos.STREAM_CODEC, LightJarData::pos, ByteBufCodecs.BOOL,LightJarData::enabled, LightJarData::new); + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LightJarData that = (LightJarData) o; + return enabled == that.enabled && Objects.equals(pos, that.pos); + } + + @Override + public int hashCode() { + return Objects.hash(pos, enabled); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MobJarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MobJarData.java index a167044754..ebd87e0c74 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MobJarData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MobJarData.java @@ -6,8 +6,23 @@ import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; +import java.util.Objects; + public record MobJarData(CompoundTag entityTag) { public static final Codec CODEC = CompoundTag.CODEC.xmap(MobJarData::new, MobJarData::entityTag); public static final StreamCodec STREAM = CheatSerializer.create(CODEC); + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MobJarData that = (MobJarData) o; + return Objects.equals(entityTag, that.entityTag); + } + + @Override + public int hashCode() { + return Objects.hashCode(entityTag); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MultiPotionContents.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MultiPotionContents.java index fee2be347c..c79f63dd9b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MultiPotionContents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MultiPotionContents.java @@ -13,6 +13,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Objects; + public record MultiPotionContents(int charges, PotionContents contents, int maxUses) implements IPotionProvider { public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.INT.fieldOf("charges").forGetter(MultiPotionContents::charges), @@ -63,4 +65,17 @@ public void addUse(ItemStack stack, int amount, @Nullable LivingEntity player) { public void setData(PotionContents contents, int usesRemaining, int maxUses, ItemStack stack) { stack.set(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(usesRemaining, contents, maxUses)); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MultiPotionContents that = (MultiPotionContents) o; + return charges == that.charges && maxUses == that.maxUses && Objects.equals(contents, that.contents); + } + + @Override + public int hashCode() { + return Objects.hash(charges, contents, maxUses); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java index b6882d536e..4bd631529f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java @@ -16,6 +16,7 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.component.TooltipProvider; +import java.util.Objects; import java.util.function.Consumer; public class PersistentFamiliarData implements NBTComponent, TooltipProvider { @@ -74,6 +75,19 @@ public Mutable mutable(){ return new Mutable(name, color, cosmetic); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PersistentFamiliarData that = (PersistentFamiliarData) o; + return Objects.equals(name, that.name) && Objects.equals(color, that.color) && Objects.equals(cosmetic, that.cosmetic); + } + + @Override + public int hashCode() { + return Objects.hash(name, color, cosmetic); + } + public static class Mutable{ public Component name; public String color; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java index cbbb4d1e77..efa9679aac 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java @@ -12,6 +12,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.alchemy.PotionContents; +import java.util.Objects; + public record PotionLauncherData(PotionContents renderData, int amountLeft, int lastSlot) { public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( @@ -58,4 +60,17 @@ public PotionContents expendPotion(Player player, ItemStack launcherStack){ launcherStack.set(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData(provider.getPotionData(item), provider.usesRemaining(item), lastSlot)); return contents; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PotionLauncherData that = (PotionLauncherData) o; + return lastSlot == that.lastSlot && amountLeft == that.amountLeft && Objects.equals(renderData, that.renderData); + } + + @Override + public int hashCode() { + return Objects.hash(renderData, amountLeft, lastSlot); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PresentData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PresentData.java index 84439087cd..48a20a11e4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PresentData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PresentData.java @@ -1,22 +1,46 @@ package com.hollingsworth.arsnouveau.common.items.data; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.ChatFormatting; +import net.minecraft.core.UUIDUtil; import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.TooltipProvider; +import java.util.Optional; import java.util.UUID; +import java.util.function.Consumer; -public record PresentData(String name, UUID uuid) { +public record PresentData(String name, Optional uuid) implements TooltipProvider { public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.STRING.fieldOf("name").forGetter(PresentData::name), - Codec.STRING.xmap(UUID::fromString, UUID::toString).fieldOf("uuid").forGetter(PresentData::uuid) + UUIDUtil.CODEC.optionalFieldOf("uuid").forGetter(PresentData::uuid) ).apply(instance, PresentData::new)); public static StreamCodec STREAM_CODEC = StreamCodec.composite(ByteBufCodecs.STRING_UTF8, PresentData::name, ByteBufCodecs.STRING_UTF8, p -> p.uuid().toString(), PresentData::new); public PresentData(String name, String uuid){ - this(name, UUID.fromString(uuid)); + this(name, Optional.ofNullable(uuid == null ? null : UUID.fromString(uuid))); + } + + public PresentData(){ + this(null, (String) null); + } + + @Override + public void addToTooltip(Item.TooltipContext pContext, Consumer pTooltipAdder, TooltipFlag pTooltipFlag) { + if(uuid().isPresent()){ + if(uuid().get().equals(ArsNouveau.proxy.getPlayer().getUUID())){ + pTooltipAdder.accept(Component.translatable("ars_nouveau.present.give")); + }else { + pTooltipAdder.accept(Component.translatable("ars_nouveau.present.from", name()).withStyle(ChatFormatting.GOLD)); + } + } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryPosData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryPosData.java index 0d1ea6a924..9e361ba708 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryPosData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryPosData.java @@ -5,8 +5,23 @@ import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; +import java.util.Objects; + public record ScryPosData(BlockPos pos) { public static Codec CODEC = BlockPos.CODEC.xmap(ScryPosData::new, ScryPosData::pos); public static StreamCodec STREAM_CODEC = StreamCodec.composite(BlockPos.STREAM_CODEC, ScryPosData::pos, ScryPosData::new); + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ScryPosData that = (ScryPosData) o; + return Objects.equals(pos, that.pos); + } + + @Override + public int hashCode() { + return Objects.hashCode(pos); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StackPerkHolder.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StackPerkHolder.java index 0716831c7d..e0a9b244af 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StackPerkHolder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StackPerkHolder.java @@ -12,12 +12,13 @@ import javax.annotation.Nullable; import java.util.List; import java.util.Map; +import java.util.Objects; /** * Serializes a set of perks from an itemstack. */ public abstract class StackPerkHolder implements IPerkHolder { - + public static Codec PERK_CODEC = RecordCodecBuilder.create((instance) -> instance.group( ResourceLocation.CODEC.fieldOf("perk").forGetter(IPerk::getRegistryName) ).apply(instance, (name) -> PerkRegistry.getPerkMap().getOrDefault(name, StarbunclePerk.INSTANCE))); @@ -51,4 +52,17 @@ protected Map getPerkTags() { public @Nullable CompoundTag getTagForPerk(IPerk perk) { return this.perkTags.getOrDefault(perk, null); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + StackPerkHolder that = (StackPerkHolder) o; + return getTier() == that.getTier() && Objects.equals(getPerks(), that.getPerks()) && Objects.equals(getPerkTags(), that.getPerkTags()); + } + + @Override + public int hashCode() { + return Objects.hash(getPerks(), getTier(), getPerkTags()); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java index e91b43b697..810b21ea44 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java @@ -24,6 +24,7 @@ import net.minecraft.world.item.component.TooltipProvider; import net.minecraft.world.level.block.Block; +import java.util.Objects; import java.util.Optional; import java.util.function.Consumer; @@ -110,6 +111,19 @@ public void addToTooltip(Item.TooltipContext context, Consumer toolti } } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + StarbuncleCharmData that = (StarbuncleCharmData) o; + return Objects.equals(name, that.name) && Objects.equals(color, that.color) && Objects.equals(cosmetic, that.cosmetic) && Objects.equals(pathBlock, that.pathBlock) && Objects.equals(bedPos, that.bedPos) && Objects.equals(behaviorTag, that.behaviorTag) && Objects.equals(adopter, that.adopter) && Objects.equals(bio, that.bio); + } + + @Override + public int hashCode() { + return Objects.hash(name, color, cosmetic, pathBlock, bedPos, behaviorTag, adopter, bio); + } + public static class Mutable { public Component name; public String color; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/VoidJarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/VoidJarData.java index 4e7e282910..057d2d66f2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/VoidJarData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/VoidJarData.java @@ -11,6 +11,7 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.component.TooltipProvider; +import java.util.Objects; import java.util.function.Consumer; public record VoidJarData(ItemScrollData scrollData, boolean active) implements NBTComponent, TooltipProvider { @@ -45,4 +46,17 @@ public void addToTooltip(Item.TooltipContext pContext, Consumer pTool } scrollData.addToTooltip(pContext, pTooltipAdder, pTooltipFlag); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + VoidJarData that = (VoidJarData) o; + return active == that.active && Objects.equals(scrollData, that.scrollData); + } + + @Override + public int hashCode() { + return Objects.hash(scrollData, active); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java index 9b9229a7d1..46462ad2e2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java @@ -18,6 +18,7 @@ import net.minecraft.world.phys.Vec2; import javax.annotation.Nullable; +import java.util.Objects; import java.util.function.Consumer; public record WarpScrollData(BlockPos pos, String dimension, Vec2 rotation, boolean crossDim) implements TooltipProvider { @@ -68,4 +69,17 @@ public void addToTooltip(Item.TooltipContext pContext, Consumer pTool pTooltipAdder.accept(Component.translatable("ars_nouveau.warp_scroll.disabled_warp_portal").withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC)); } } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + WarpScrollData that = (WarpScrollData) o; + return crossDim == that.crossDim && Objects.equals(pos, that.pos) && Objects.equals(rotation, that.rotation) && Objects.equals(dimension, that.dimension); + } + + @Override + public int hashCode() { + return Objects.hash(pos, dimension, rotation, crossDim); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/StarbuncleCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/StarbuncleCharm.java index 65f3a21ff8..e65e7dce4c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/StarbuncleCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/StarbuncleCharm.java @@ -12,7 +12,7 @@ public class StarbuncleCharm extends AbstractSummonCharm { public StarbuncleCharm() { - super(); + super(defaultProps().component(DataComponentRegistry.STARBUNCLE_DATA, new StarbuncleCharmData())); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java index 3bd14856a7..626be183aa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java @@ -13,6 +13,7 @@ import com.hollingsworth.arsnouveau.common.armor.AnimatedMagicArmor; import com.hollingsworth.arsnouveau.common.items.*; import com.hollingsworth.arsnouveau.common.items.curios.*; +import com.hollingsworth.arsnouveau.common.items.data.PresentData; import com.hollingsworth.arsnouveau.common.items.data.ScryCasterData; import com.hollingsworth.arsnouveau.common.items.itemscrolls.AllowItemScroll; import com.hollingsworth.arsnouveau.common.items.itemscrolls.DenyItemScroll; @@ -216,7 +217,7 @@ public int getValue() { public static final ItemRegistryWrapper FIREL_DISC = register(LibItemNames.FIREL_DISC, () -> new Item(defaultItemProperties().stacksTo(1).rarity(Rarity.RARE))); public static final ItemRegistryWrapper SOUND_OF_GLASS = register(LibItemNames.SOUND_OF_GLASS, () -> new Item(defaultItemProperties().stacksTo(1).rarity(Rarity.RARE))); public static final ItemRegistryWrapper WILD_HUNT = register(LibItemNames.FIREL_WILD_HUNT, () -> new Item(defaultItemProperties().stacksTo(1).rarity(Rarity.RARE))); - public static final ItemRegistryWrapper STARBY_GIFY = register(LibItemNames.STARBY_GIFT, () -> new Present(defaultItemProperties().rarity(Rarity.EPIC))); + public static final ItemRegistryWrapper STARBY_GIFY = register(LibItemNames.STARBY_GIFT, () -> new Present(defaultItemProperties().rarity(Rarity.EPIC).component(DataComponentRegistry.PRESENT, new PresentData()))); public static final ItemRegistryWrapper SPELL_CROSSBOW = register(LibItemNames.SPELL_CROSSBOW, () -> new SpellCrossbow(defaultItemProperties().stacksTo(1).component(DataComponentRegistry.SPELL_CASTER, new SpellCaster()))); public static final ItemRegistryWrapper STABLE_WARP_SCROLL = register(LibItemNames.STABLE_WARP_SCROLL, () -> new StableWarpScroll(defaultItemProperties().stacksTo(1))); public static final ItemRegistryWrapper SCRY_CASTER = register(LibItemNames.SCRY_CASTER, () -> new ScryCaster(defaultItemProperties().stacksTo(1).component(DataComponentRegistry.SCRY_CASTER, new ScryCasterData()))); From c47aaa808a8aa5f32ff2c1738caeae79dae04fb3 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 9 Jul 2024 21:13:54 -0500 Subject: [PATCH 046/363] fix starbuncles, dominion wand --- .../api/entity/ChangeableBehavior.java | 3 +- .../api/registry/BehaviorRegistry.java | 5 +- .../arsnouveau/common/entity/Starbuncle.java | 7 +- .../entity/goal/carbuncle/StarbyBehavior.java | 2 +- .../goal/carbuncle/StarbyListBehavior.java | 9 +- .../goal/carbuncle/StarbyPotionBehavior.java | 2 +- .../carbuncle/StarbyTransportBehavior.java | 2 +- .../statemachine/SimpleStateMachine.java | 3 +- .../arsnouveau/common/items/DominionWand.java | 30 +- .../common/items/StableWarpScroll.java | 10 + .../arsnouveau/common/items/WarpScroll.java | 11 + .../common/items/data/DominionWandData.java | 41 +-- .../items/data/StarbuncleCharmData.java | 73 +++-- .../arsnouveau/common/util/ANCodecs.java | 276 ++++++++++++++++++ 14 files changed, 396 insertions(+), 78 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/entity/ChangeableBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/api/entity/ChangeableBehavior.java index da66b706d6..5db4d73166 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/entity/ChangeableBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/entity/ChangeableBehavior.java @@ -36,7 +36,6 @@ public void tick(){ public void getTooltip(Consumer tooltip){} public CompoundTag toTag(CompoundTag tag) { - tag.putString("id", getRegistryName().toString()); return tag; } @@ -54,7 +53,7 @@ public double getZ(){ public void pickUpItem(ItemEntity entity) {} - protected abstract ResourceLocation getRegistryName(); + public abstract ResourceLocation getRegistryName(); public InteractionResult mobInteract(Player player, InteractionHand hand) { return InteractionResult.PASS; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/BehaviorRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/BehaviorRegistry.java index 443f1ac8f2..c3ab2f3a06 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/BehaviorRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/BehaviorRegistry.java @@ -12,14 +12,15 @@ import java.util.Map; public class BehaviorRegistry { + private static final Map REGISTRY = new HashMap<>(); public static void register(ResourceLocation name, CreateFromTag creator){ REGISTRY.put(name, creator); } - public static ChangeableBehavior create(Entity entity, CompoundTag tag){ - CreateFromTag create = REGISTRY.get(ResourceLocation.tryParse(tag.getString("id"))); + public static ChangeableBehavior create(ResourceLocation id, Entity entity, CompoundTag tag){ + CreateFromTag create = REGISTRY.get(id); return create == null ? null : create.create(entity, tag); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index b10192407a..eba5d58886 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -165,6 +165,7 @@ public Boolean isOnRoad(BlockState state) { public void setBehavior(ChangeableBehavior behavior) { this.dynamicBehavior = behavior; + this.data.behaviorKey = behavior.getRegistryName(); getEntityData().set(Starbuncle.BEHAVIOR_TAG, dynamicBehavior.toTag(new CompoundTag())); reloadGoals(); syncBehavior(); @@ -608,7 +609,7 @@ public void restoreFromTag() { this.entityData.set(HEAD_COSMETIC, data.cosmetic); setCustomName(data.name); if (data.behaviorTag != null) { - this.dynamicBehavior = BehaviorRegistry.create(this, data.behaviorTag); + this.dynamicBehavior = BehaviorRegistry.create(data.behaviorKey, this, data.behaviorTag); this.entityData.set(BEHAVIOR_TAG, dynamicBehavior.toTag(new CompoundTag())); this.reloadGoals(); } else if (this.isTamed()) { @@ -625,7 +626,7 @@ public void restoreFromTag() { public void onSyncedDataUpdated(EntityDataAccessor pKey) { super.onSyncedDataUpdated(pKey); if (pKey == BEHAVIOR_TAG) { - this.dynamicBehavior = BehaviorRegistry.create(this, this.entityData.get(BEHAVIOR_TAG)); + this.dynamicBehavior = BehaviorRegistry.create( data.behaviorKey,this, this.entityData.get(BEHAVIOR_TAG)); } } @@ -744,7 +745,7 @@ public void addGoalDebug(Object goal, DebugEvent debugEvent, boolean storeDuplic @Override public void onTagSync(CompoundTag tag) { if (level.isClientSide) { - this.dynamicBehavior = BehaviorRegistry.create(this, tag); + this.dynamicBehavior = BehaviorRegistry.create(data.behaviorKey, this, tag); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyBehavior.java index c1dba57653..4bc27df6e4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyBehavior.java @@ -72,7 +72,7 @@ public void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @Nullable Di } @Override - protected ResourceLocation getRegistryName() { + public ResourceLocation getRegistryName() { return ArsNouveau.prefix( "starby"); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyListBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyListBehavior.java index 521b7cb918..063669efd4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyListBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyListBehavior.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.common.entity.goal.carbuncle; -import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.util.NBTUtil; import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; @@ -10,7 +9,6 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import java.util.ArrayList; @@ -18,7 +16,7 @@ import java.util.List; import java.util.Map; -public class StarbyListBehavior extends StarbyBehavior { +public abstract class StarbyListBehavior extends StarbyBehavior { public List FROM_LIST = new ArrayList<>(); @@ -136,9 +134,4 @@ public CompoundTag toTag(CompoundTag tag) { } return super.toTag(tag); } - - @Override - protected ResourceLocation getRegistryName() { - return ArsNouveau.prefix( "starby_list"); - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java index 7b731f5e36..c640c9a7b9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java @@ -134,7 +134,7 @@ public ItemStack getStackForRender() { } @Override - protected ResourceLocation getRegistryName() { + public ResourceLocation getRegistryName() { return POTION_ID; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java index 254349bd00..e286238670 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java @@ -290,7 +290,7 @@ public void getTooltip(Consumer tooltip) { } @Override - protected ResourceLocation getRegistryName() { + public ResourceLocation getRegistryName() { return TRANSPORT_ID; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/SimpleStateMachine.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/SimpleStateMachine.java index 959bc449f4..4d08d58b6f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/SimpleStateMachine.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/SimpleStateMachine.java @@ -1,7 +1,6 @@ package com.hollingsworth.arsnouveau.common.entity.statemachine; import com.hollingsworth.arsnouveau.common.util.Log; -import net.neoforged.fml.loading.FMLEnvironment; import javax.annotation.Nonnull; @@ -45,6 +44,6 @@ public State getCurrentState(){ } public boolean isDebug(){ - return !FMLEnvironment.production; + return false;// !FMLEnvironment.production; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java index 7c5d62df21..093a36aefa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java @@ -9,6 +9,7 @@ import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; @@ -38,9 +39,9 @@ public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pS return; } DominionWandData data = pStack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()); - BlockPos pos = data.storedPos(); - if (pos != null) { - if (pLevel.getBlockEntity(pos) instanceof IWandable wandable) { + + if (data.storedPos().isPresent()) { + if (pLevel.getBlockEntity(data.storedPos().get()) instanceof IWandable wandable) { Networking.sendToPlayerClient(new HighlightAreaPacket(wandable.getWandHighlight(new ArrayList<>()), 10), (ServerPlayer) pEntity); } return; @@ -71,12 +72,12 @@ public InteractionResult interactLivingEntity(ItemStack doNotUseStack, Player pl } Level world = playerEntity.getCommandSenderWorld(); - if (data.storedPos() != null && world.getBlockEntity(data.storedPos()) instanceof IWandable wandable) { - wandable.onFinishedConnectionFirst(data.storedPos(), data.face(), target, playerEntity); + if (data.storedPos().isPresent() && world.getBlockEntity(data.storedPos().get()) instanceof IWandable wandable) { + wandable.onFinishedConnectionFirst(data.storedPos().orElse(null), data.face().orElse(null), target, playerEntity); } if (target instanceof IWandable wandable) { - wandable.onFinishedConnectionLast(data.storedPos(), data.face(), target, playerEntity); + wandable.onFinishedConnectionLast(data.storedPos().orElse(null), data.face().orElse(null), target, playerEntity); clear(stack, playerEntity); } @@ -131,18 +132,19 @@ public InteractionResult useOn(UseOnContext context) { PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.dominion_wand.position_set")); return InteractionResult.SUCCESS; } - if (data.face() == null && data.strict()){ + if (data.face().isEmpty() && data.strict()){ stack.set(DataComponentRegistry.DOMINION_WAND, data.setFace(context.getClickedFace())); } - - if (data.storedPos() != null && world.getBlockEntity(data.storedPos()) instanceof IWandable wandable) { - wandable.onFinishedConnectionFirst(pos, data.face(), (LivingEntity) world.getEntity(data.storedEntityId()), playerEntity); + BlockPos storedPos = data.storedPos().orElse(null); + Direction storedDirection = data.face().orElse(null); + if (storedPos != null && world.getBlockEntity(storedPos) instanceof IWandable wandable) { + wandable.onFinishedConnectionFirst(pos, storedDirection, (LivingEntity) world.getEntity(data.storedEntityId()), playerEntity); } if (world.getBlockEntity(pos) instanceof IWandable wandable) { - wandable.onFinishedConnectionLast(data.storedPos(), data.face(), (LivingEntity) world.getEntity(data.storedEntityId()), playerEntity); + wandable.onFinishedConnectionLast(storedPos, storedDirection, (LivingEntity) world.getEntity(data.storedEntityId()), playerEntity); } if (data.storedEntityId() != DominionWandData.NULL_ENTITY && world.getEntity(data.storedEntityId()) instanceof IWandable wandable) { - wandable.onFinishedConnectionFirst(pos, data.face(), null, playerEntity); + wandable.onFinishedConnectionFirst(pos, storedDirection, null, playerEntity); } clear(stack, playerEntity); @@ -165,10 +167,10 @@ public void appendHoverText(ItemStack stack, TooltipContext world, List use(Level pLevel, Player player, Inter } return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Item.TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); + stack.addToTooltip(DataComponentRegistry.WARP_SCROLL, context, tooltip2::add, flagIn); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java index 1a96b060f1..8e79729c6c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java @@ -20,9 +20,14 @@ import net.minecraft.world.InteractionResultHolder; 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.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec2; +import org.jetbrains.annotations.Nullable; + +import java.util.List; public class WarpScroll extends ModItem { public WarpScroll() { @@ -101,4 +106,10 @@ public InteractionResultHolder use(Level world, Player player, Intera } return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Item.TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); + stack.addToTooltip(DataComponentRegistry.WARP_SCROLL, context, tooltip2::add, flagIn); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java index 40b6f568c2..af6346d1a1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java @@ -1,47 +1,50 @@ package com.hollingsworth.arsnouveau.common.items.data; -import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import javax.annotation.Nullable; import java.util.Objects; +import java.util.Optional; -public record DominionWandData(BlockPos storedPos, Direction face, boolean strict, int storedEntityId) { - - public DominionWandData(BlockPos storedPos, Direction face, boolean strict){ - this(storedPos, face, strict, NULL_ENTITY); - } - - public DominionWandData(int storedEntityId){ - this(BlockPos.ZERO, Direction.DOWN, false, storedEntityId); - } +public record DominionWandData(Optional storedPos, Optional face, boolean strict, int storedEntityId) { public DominionWandData(){ - this(null, null, false, NULL_ENTITY); + this(Optional.empty(), Optional.empty(), false, NULL_ENTITY); } public static final int NULL_ENTITY = -1; public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - BlockPos.CODEC.fieldOf("pos").forGetter(DominionWandData::storedPos), - Direction.CODEC.fieldOf("face").forGetter(DominionWandData::face), + BlockPos.CODEC.optionalFieldOf("pos").forGetter(DominionWandData::storedPos), + Direction.CODEC.optionalFieldOf("face").forGetter(DominionWandData::face), Codec.BOOL.fieldOf("strict").forGetter(DominionWandData::strict), Codec.INT.fieldOf("entityId").forGetter(DominionWandData::storedEntityId) ).apply(instance, DominionWandData::new)); - public static StreamCodec STREAM = CheatSerializer.create(DominionWandData.CODEC); + public static StreamCodec STREAM = StreamCodec.composite( + BlockPos.STREAM_CODEC.apply(ByteBufCodecs::optional), + DominionWandData::storedPos, + Direction.STREAM_CODEC.apply(ByteBufCodecs::optional), + DominionWandData::face, + ByteBufCodecs.BOOL, + DominionWandData::strict, + ByteBufCodecs.INT, + DominionWandData::getStoredEntity, + DominionWandData::new + ); public boolean hasStoredData(){ - return storedPos != null || storedEntityId != -1; + return storedPos.isPresent() || storedEntityId != -1; } public @Nullable BlockPos getValidPos(){ - return storedPos == BlockPos.ZERO || storedPos == null ? null : storedPos; + return storedPos.orElse(null); } public int getStoredEntity(){ @@ -49,15 +52,15 @@ public int getStoredEntity(){ } public DominionWandData storePos(@Nullable BlockPos pos){ - return new DominionWandData(pos == null ? null : pos.immutable(), face, strict, storedEntityId); + return new DominionWandData(pos == null ? Optional.empty() : Optional.of(pos.immutable()), face, strict, storedEntityId); } public DominionWandData storeEntity(int entityId){ return new DominionWandData(storedPos, face, strict, entityId); } - public DominionWandData setFace(Direction face){ - return new DominionWandData(storedPos, face, strict, storedEntityId); + public DominionWandData setFace(@Nullable Direction face){ + return new DominionWandData(storedPos, Optional.ofNullable(face), strict, storedEntityId); } public DominionWandData toggleMode(){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java index 810b21ea44..f54a3cb05b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java @@ -4,8 +4,9 @@ import com.hollingsworth.arsnouveau.api.entity.ChangeableBehavior; import com.hollingsworth.arsnouveau.api.item.NBTComponent; import com.hollingsworth.arsnouveau.api.registry.BehaviorRegistry; -import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; import com.hollingsworth.arsnouveau.common.entity.Starbuncle; +import com.hollingsworth.arsnouveau.common.entity.goal.carbuncle.StarbyTransportBehavior; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -16,7 +17,9 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.network.chat.Style; +import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -34,47 +37,64 @@ public class StarbuncleCharmData implements NBTComponent, T ComponentSerialization.CODEC.optionalFieldOf("name").forGetter(data -> data.name), Codec.STRING.optionalFieldOf("color", DyeColor.ORANGE.getName()).forGetter(data -> data.color), // Block.CODEC.fieldOf("path").forGetter(data -> data.pathBlock), - BlockPos.CODEC.optionalFieldOf("bed", BlockPos.ZERO).forGetter(data -> data.bedPos == null ? BlockPos.ZERO : data.bedPos), + BlockPos.CODEC.optionalFieldOf("bed").forGetter(data -> data.bedPos), ItemStack.CODEC.optionalFieldOf("cosmetic", ItemStack.EMPTY).forGetter(data -> data.cosmetic), - CompoundTag.CODEC.optionalFieldOf("behavior", new CompoundTag()).forGetter(data -> data.behaviorTag), + ResourceLocation.CODEC.optionalFieldOf("behavior", StarbyTransportBehavior.TRANSPORT_ID).forGetter(data -> data.behavior), + CompoundTag.CODEC.optionalFieldOf("behaviorTag", new CompoundTag()).forGetter(data -> data.behaviorTag), Codec.STRING.optionalFieldOf("adopter", null).forGetter(data -> data.adopter), Codec.STRING.optionalFieldOf("bio", null).forGetter(data -> data.bio) ).apply(instance, StarbuncleCharmData::new)); - public static StreamCodec STREAM_CODEC = CheatSerializer.create(CODEC); + public static StreamCodec STREAM_CODEC = ANCodecs.composite( + ComponentSerialization.STREAM_CODEC.apply(ByteBufCodecs::optional), + s -> s.name, + ByteBufCodecs.STRING_UTF8, + s -> s.color, + BlockPos.STREAM_CODEC.apply(ByteBufCodecs::optional), + s -> s.bedPos, + ItemStack.STREAM_CODEC, + s -> s.cosmetic, + ResourceLocation.STREAM_CODEC, + s -> s.behavior, + ByteBufCodecs.COMPOUND_TAG, + s -> s.behaviorTag, + ByteBufCodecs.STRING_UTF8, + s -> s.adopter, + ByteBufCodecs.STRING_UTF8, + s -> s.bio, + StarbuncleCharmData::new + ); + + + public final Optional name; public final String color; public final ItemStack cosmetic; public final Block pathBlock; - public final BlockPos bedPos; + public final Optional bedPos; + public final ResourceLocation behavior; public final CompoundTag behaviorTag; public final String adopter; public final String bio; - public StarbuncleCharmData(Optional name, String color, BlockPos bedPos, ItemStack cosmetic, CompoundTag behaviorTag, String adopter, String bio) { - this.name = name; - this.color = color; - this.cosmetic = cosmetic; - this.pathBlock = null; - this.bedPos = bedPos; - this.behaviorTag = behaviorTag; - this.adopter = adopter; - this.bio = bio; + public StarbuncleCharmData(Optional name, String color, Optional bedPos, ItemStack cosmetic, ResourceLocation behavior, CompoundTag behaviorTag, String adopter, String bio) { + this(name, color, null, bedPos, cosmetic, behavior, behaviorTag, adopter, bio); } - public StarbuncleCharmData(Optional name, String color, Block pathBlock, BlockPos bedPos, ItemStack cosmetic, CompoundTag behaviorTag, String adopter, String bio) { + public StarbuncleCharmData(Optional name, String color, Block pathBlock, Optional bedPos, ItemStack cosmetic,ResourceLocation behavior, CompoundTag behaviorTag, String adopter, String bio) { this.name = name; this.color = color; this.cosmetic = cosmetic; this.pathBlock = pathBlock; this.bedPos = bedPos; - this.behaviorTag = behaviorTag; + this.behavior = behavior; this.adopter = adopter; this.bio = bio; + this.behaviorTag = behaviorTag; } public StarbuncleCharmData() { - this(null, DyeColor.ORANGE.getName(), null, BlockPos.ZERO, ItemStack.EMPTY, new CompoundTag(), null, null); + this(Optional.empty(), DyeColor.ORANGE.getName(), null, Optional.empty(), ItemStack.EMPTY, StarbyTransportBehavior.TRANSPORT_ID, new CompoundTag(), null, null); } @@ -84,7 +104,7 @@ public Codec getCodec() { } public Mutable mutable() { - return new Mutable(name.orElse(null), color, cosmetic, pathBlock, bedPos, behaviorTag, adopter, bio); + return new Mutable(name.orElse(null), color, cosmetic, pathBlock, bedPos.orElse(null), behavior, new CompoundTag(), adopter, bio); } @Override @@ -98,14 +118,15 @@ public void addToTooltip(Item.TooltipContext context, Consumer toolti if(bio != null){ tooltip2.accept(Component.literal(bio).withStyle(Style.EMPTY.withColor(ChatFormatting.DARK_PURPLE))); } - if(behaviorTag != null && context != null){ + if(behavior != null && context != null){ // danger zone try{ - ChangeableBehavior behavior = BehaviorRegistry.create(new Starbuncle(ArsNouveau.proxy.getClientWorld(), true), behaviorTag); + ChangeableBehavior behavior = BehaviorRegistry.create(this.behavior, new Starbuncle(ArsNouveau.proxy.getClientWorld(), true), this.behaviorTag); if(behavior != null){ behavior.getTooltip(tooltip2); } }catch (Exception e){ + e.printStackTrace(); // :-) } } @@ -116,12 +137,12 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; StarbuncleCharmData that = (StarbuncleCharmData) o; - return Objects.equals(name, that.name) && Objects.equals(color, that.color) && Objects.equals(cosmetic, that.cosmetic) && Objects.equals(pathBlock, that.pathBlock) && Objects.equals(bedPos, that.bedPos) && Objects.equals(behaviorTag, that.behaviorTag) && Objects.equals(adopter, that.adopter) && Objects.equals(bio, that.bio); + return Objects.equals(name, that.name) && Objects.equals(color, that.color) && Objects.equals(cosmetic, that.cosmetic) && Objects.equals(pathBlock, that.pathBlock) && Objects.equals(bedPos, that.bedPos) && Objects.equals(behavior, that.behavior) && Objects.equals(adopter, that.adopter) && Objects.equals(bio, that.bio); } @Override public int hashCode() { - return Objects.hash(name, color, cosmetic, pathBlock, bedPos, behaviorTag, adopter, bio); + return Objects.hash(name, color, cosmetic, pathBlock, bedPos, behavior, adopter, bio); } public static class Mutable { @@ -130,14 +151,16 @@ public static class Mutable { public ItemStack cosmetic; public Block pathBlock; public BlockPos bedPos; + public ResourceLocation behaviorKey; public CompoundTag behaviorTag; public String adopter; public String bio; - public Mutable(Component name, String color, ItemStack cosmetic, Block pathBlock, BlockPos bedPos, CompoundTag behaviorTag, String adopter, String bio) { + public Mutable(Component name, String color, ItemStack cosmetic, Block pathBlock, BlockPos bedPos, ResourceLocation behaviorKey, CompoundTag behaviorTag, String adopter, String bio) { this.name = name; this.color = color; this.cosmetic = cosmetic; + this.behaviorKey = behaviorKey; this.pathBlock = pathBlock; this.bedPos = bedPos; this.behaviorTag = behaviorTag; @@ -146,11 +169,11 @@ public Mutable(Component name, String color, ItemStack cosmetic, Block pathBlock } public Mutable() { - this(null, DyeColor.ORANGE.getName(), ItemStack.EMPTY, null, BlockPos.ZERO, new CompoundTag(), null, null); + this(null, DyeColor.ORANGE.getName(), ItemStack.EMPTY, null, BlockPos.ZERO, StarbyTransportBehavior.TRANSPORT_ID, new CompoundTag(), null, null); } public StarbuncleCharmData immutable() { - return new StarbuncleCharmData(Optional.ofNullable(name), color, pathBlock, bedPos, cosmetic, behaviorTag, adopter, bio); + return new StarbuncleCharmData(Optional.ofNullable(name), color, pathBlock, Optional.ofNullable(bedPos), cosmetic, behaviorKey, behaviorTag, adopter, bio); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java index 5ed106bd07..e7aa9eaffc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java @@ -1,11 +1,13 @@ package com.hollingsworth.arsnouveau.common.util; import com.google.gson.JsonElement; +import com.mojang.datafixers.util.*; import com.mojang.serialization.Codec; import com.mojang.serialization.JsonOps; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.phys.Vec2; import java.util.HashMap; @@ -46,4 +48,278 @@ public static Codec intMap(Codec codec, Function StreamCodec composite( + final StreamCodec codec1, + final Function getter1, + final StreamCodec codec2, + final Function getter2, + final StreamCodec codec3, + final Function getter3, + final StreamCodec codec4, + final Function getter4, + final StreamCodec codec5, + final Function getter5, + final StreamCodec codec6, + final Function getter6, + final StreamCodec codec7, + final Function getter7, + final StreamCodec codec8, + final Function getter8, + final Function8 p_331335_) { + return new StreamCodec<>() { + @Override + public C decode(B p_330310_) { + T1 t1 = codec1.decode(p_330310_); + T2 t2 = codec2.decode(p_330310_); + T3 t3 = codec3.decode(p_330310_); + T4 t4 = codec4.decode(p_330310_); + T5 t5 = codec5.decode(p_330310_); + T6 t6 = codec6.decode(p_330310_); + T7 t7 = codec7.decode(p_330310_); + T8 t8 = codec8.decode(p_330310_); + return p_331335_.apply(t1, t2, t3, t4, t5, t6, t7, t8); + } + + @Override + public void encode(B p_332052_, C p_331912_) { + codec1.encode(p_332052_, getter1.apply(p_331912_)); + codec2.encode(p_332052_, getter2.apply(p_331912_)); + codec3.encode(p_332052_, getter3.apply(p_331912_)); + codec4.encode(p_332052_, getter4.apply(p_331912_)); + codec5.encode(p_332052_, getter5.apply(p_331912_)); + codec6.encode(p_332052_, getter6.apply(p_331912_)); + codec7.encode(p_332052_, getter7.apply(p_331912_)); + codec8.encode(p_332052_, getter8.apply(p_331912_)); + } + }; + } + + public static StreamCodec composite( + final StreamCodec codec1, + final Function getter1, + final StreamCodec codec2, + final Function getter2, + final StreamCodec codec3, + final Function getter3, + final StreamCodec codec4, + final Function getter4, + final StreamCodec codec5, + final Function getter5, + final StreamCodec codec6, + final Function getter6, + final StreamCodec codec7, + final Function getter7, + final StreamCodec codec8, + final Function getter8, + final StreamCodec codec9, + final Function getter9, + final Function9 p_331335_) { + return new StreamCodec<>() { + @Override + public C decode(B p_330310_) { + T1 t1 = codec1.decode(p_330310_); + T2 t2 = codec2.decode(p_330310_); + T3 t3 = codec3.decode(p_330310_); + T4 t4 = codec4.decode(p_330310_); + T5 t5 = codec5.decode(p_330310_); + T6 t6 = codec6.decode(p_330310_); + T7 t7 = codec7.decode(p_330310_); + T8 t8 = codec8.decode(p_330310_); + T9 t9 = codec9.decode(p_330310_); + return p_331335_.apply(t1, t2, t3, t4, t5, t6, t7, t8, t9); + } + + @Override + public void encode(B p_332052_, C p_331912_) { + codec1.encode(p_332052_, getter1.apply(p_331912_)); + codec2.encode(p_332052_, getter2.apply(p_331912_)); + codec3.encode(p_332052_, getter3.apply(p_331912_)); + codec4.encode(p_332052_, getter4.apply(p_331912_)); + codec5.encode(p_332052_, getter5.apply(p_331912_)); + codec6.encode(p_332052_, getter6.apply(p_331912_)); + codec7.encode(p_332052_, getter7.apply(p_331912_)); + codec8.encode(p_332052_, getter8.apply(p_331912_)); + codec9.encode(p_332052_, getter9.apply(p_331912_)); + } + }; + } + + public static StreamCodec composite( + final StreamCodec codec1, + final Function getter1, + final StreamCodec codec2, + final Function getter2, + final StreamCodec codec3, + final Function getter3, + final StreamCodec codec4, + final Function getter4, + final StreamCodec codec5, + final Function getter5, + final StreamCodec codec6, + final Function getter6, + final StreamCodec codec7, + final Function getter7, + final StreamCodec codec8, + final Function getter8, + final StreamCodec codec9, + final Function getter9, + final StreamCodec codec10, + final Function getter10, + final Function10 p_331335_) { + return new StreamCodec<>() { + @Override + public C decode(B p_330310_) { + T1 t1 = codec1.decode(p_330310_); + T2 t2 = codec2.decode(p_330310_); + T3 t3 = codec3.decode(p_330310_); + T4 t4 = codec4.decode(p_330310_); + T5 t5 = codec5.decode(p_330310_); + T6 t6 = codec6.decode(p_330310_); + T7 t7 = codec7.decode(p_330310_); + T8 t8 = codec8.decode(p_330310_); + T9 t9 = codec9.decode(p_330310_); + T10 t10 = codec10.decode(p_330310_); + return p_331335_.apply(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10); + } + + @Override + public void encode(B p_332052_, C p_331912_) { + codec1.encode(p_332052_, getter1.apply(p_331912_)); + codec2.encode(p_332052_, getter2.apply(p_331912_)); + codec3.encode(p_332052_, getter3.apply(p_331912_)); + codec4.encode(p_332052_, getter4.apply(p_331912_)); + codec5.encode(p_332052_, getter5.apply(p_331912_)); + codec6.encode(p_332052_, getter6.apply(p_331912_)); + codec7.encode(p_332052_, getter7.apply(p_331912_)); + codec8.encode(p_332052_, getter8.apply(p_331912_)); + codec9.encode(p_332052_, getter9.apply(p_331912_)); + codec10.encode(p_332052_, getter10.apply(p_331912_)); + } + }; + } + + public static StreamCodec composite( + final StreamCodec codec1, + final Function getter1, + final StreamCodec codec2, + final Function getter2, + final StreamCodec codec3, + final Function getter3, + final StreamCodec codec4, + final Function getter4, + final StreamCodec codec5, + final Function getter5, + final StreamCodec codec6, + final Function getter6, + final StreamCodec codec7, + final Function getter7, + final StreamCodec codec8, + final Function getter8, + final StreamCodec codec9, + final Function getter9, + final StreamCodec codec10, + final Function getter10, + final StreamCodec codec11, + final Function getter11, + final Function11 p_331335_) { + return new StreamCodec<>() { + @Override + public C decode(B p_330310_) { + T1 t1 = codec1.decode(p_330310_); + T2 t2 = codec2.decode(p_330310_); + T3 t3 = codec3.decode(p_330310_); + T4 t4 = codec4.decode(p_330310_); + T5 t5 = codec5.decode(p_330310_); + T6 t6 = codec6.decode(p_330310_); + T7 t7 = codec7.decode(p_330310_); + T8 t8 = codec8.decode(p_330310_); + T9 t9 = codec9.decode(p_330310_); + T10 t10 = codec10.decode(p_330310_); + T11 t11 = codec11.decode(p_330310_); + return p_331335_.apply(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11); + } + + @Override + public void encode(B p_332052_, C p_331912_) { + codec1.encode(p_332052_, getter1.apply(p_331912_)); + codec2.encode(p_332052_, getter2.apply(p_331912_)); + codec3.encode(p_332052_, getter3.apply(p_331912_)); + codec4.encode(p_332052_, getter4.apply(p_331912_)); + codec5.encode(p_332052_, getter5.apply(p_331912_)); + codec6.encode(p_332052_, getter6.apply(p_331912_)); + codec7.encode(p_332052_, getter7.apply(p_331912_)); + codec8.encode(p_332052_, getter8.apply(p_331912_)); + codec9.encode(p_332052_, getter9.apply(p_331912_)); + codec10.encode(p_332052_, getter10.apply(p_331912_)); + codec11.encode(p_332052_, getter11.apply(p_331912_)); + } + }; + } + + public static StreamCodec composite( + final StreamCodec codec1, + final Function getter1, + final StreamCodec codec2, + final Function getter2, + final StreamCodec codec3, + final Function getter3, + final StreamCodec codec4, + final Function getter4, + final StreamCodec codec5, + final Function getter5, + final StreamCodec codec6, + final Function getter6, + final StreamCodec codec7, + final Function getter7, + final StreamCodec codec8, + final Function getter8, + final StreamCodec codec9, + final Function getter9, + final StreamCodec codec10, + final Function getter10, + final StreamCodec codec11, + final Function getter11, + final StreamCodec codec12, + final Function getter12, + final Function12 p_331335_) { + return new StreamCodec<>() { + @Override + public C decode(B p_330310_) { + T1 t1 = codec1.decode(p_330310_); + T2 t2 = codec2.decode(p_330310_); + T3 t3 = codec3.decode(p_330310_); + T4 t4 = codec4.decode(p_330310_); + T5 t5 = codec5.decode(p_330310_); + T6 t6 = codec6.decode(p_330310_); + T7 t7 = codec7.decode(p_330310_); + T8 t8 = codec8.decode(p_330310_); + T9 t9 = codec9.decode(p_330310_); + T10 t10 = codec10.decode(p_330310_); + T11 t11 = codec11.decode(p_330310_); + T12 t12 = codec12.decode(p_330310_); + return p_331335_.apply(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12); + } + + @Override + public void encode(B p_332052_, C p_331912_) { + codec1.encode(p_332052_, getter1.apply(p_331912_)); + codec2.encode(p_332052_, getter2.apply(p_331912_)); + codec3.encode(p_332052_, getter3.apply(p_331912_)); + codec4.encode(p_332052_, getter4.apply(p_331912_)); + codec5.encode(p_332052_, getter5.apply(p_331912_)); + codec6.encode(p_332052_, getter6.apply(p_331912_)); + codec7.encode(p_332052_, getter7.apply(p_331912_)); + codec8.encode(p_332052_, getter8.apply(p_331912_)); + codec9.encode(p_332052_, getter9.apply(p_331912_)); + codec10.encode(p_332052_, getter10.apply(p_331912_)); + codec11.encode(p_332052_, getter11.apply(p_331912_)); + codec12.encode(p_332052_, getter12.apply(p_331912_)); + } + }; + } + } From bcd66cdc90dcf291d45a22783c0e85d39017d0b8 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 10 Jul 2024 18:27:55 -0500 Subject: [PATCH 047/363] fix starbuncles not saving --- .../common/items/StarbuncleShard.java | 10 +- .../items/data/StarbuncleCharmData.java | 103 ++++++++++++------ 2 files changed, 74 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java index 4c788be073..bcab511fbb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java @@ -21,12 +21,12 @@ public StarbuncleShard(){ public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { StarbuncleCharmData data = stack.get(DataComponentRegistry.STARBUNCLE_DATA); if(data != null){ - data.name.ifPresent(tooltip2::add); - if(data.adopter != null){ - tooltip2.add(Component.translatable("ars_nouveau.adopter", data.adopter).withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); + data.getName().ifPresent(tooltip2::add); + if(data.getAdopter() != null){ + tooltip2.add(Component.translatable("ars_nouveau.adopter", data.getAdopter()).withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); } - if(data.bio != null){ - tooltip2.add(Component.literal(data.bio).withStyle(Style.EMPTY.withColor(ChatFormatting.DARK_PURPLE))); + if(data.getBio() != null){ + tooltip2.add(Component.literal(data.getBio()).withStyle(Style.EMPTY.withColor(ChatFormatting.DARK_PURPLE))); } }else{ super.appendHoverText(stack, context, tooltip2, flagIn); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java index f54a3cb05b..697072fc11 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java @@ -34,54 +34,53 @@ public class StarbuncleCharmData implements NBTComponent, TooltipProvider { public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - ComponentSerialization.CODEC.optionalFieldOf("name").forGetter(data -> data.name), - Codec.STRING.optionalFieldOf("color", DyeColor.ORANGE.getName()).forGetter(data -> data.color), + ComponentSerialization.CODEC.optionalFieldOf("name").forGetter(StarbuncleCharmData::getName), + Codec.STRING.optionalFieldOf("color", DyeColor.ORANGE.getName()).forGetter(StarbuncleCharmData::getColor), // Block.CODEC.fieldOf("path").forGetter(data -> data.pathBlock), - BlockPos.CODEC.optionalFieldOf("bed").forGetter(data -> data.bedPos), - ItemStack.CODEC.optionalFieldOf("cosmetic", ItemStack.EMPTY).forGetter(data -> data.cosmetic), - ResourceLocation.CODEC.optionalFieldOf("behavior", StarbyTransportBehavior.TRANSPORT_ID).forGetter(data -> data.behavior), - CompoundTag.CODEC.optionalFieldOf("behaviorTag", new CompoundTag()).forGetter(data -> data.behaviorTag), - Codec.STRING.optionalFieldOf("adopter", null).forGetter(data -> data.adopter), - Codec.STRING.optionalFieldOf("bio", null).forGetter(data -> data.bio) + BlockPos.CODEC.optionalFieldOf("bed").forGetter(StarbuncleCharmData::getBedPos), + ItemStack.CODEC.optionalFieldOf("cosmetic").forGetter(StarbuncleCharmData::getCosmetic), + ResourceLocation.CODEC.optionalFieldOf("behavior", StarbyTransportBehavior.TRANSPORT_ID).forGetter(StarbuncleCharmData::getBehavior), + CompoundTag.CODEC.optionalFieldOf("behaviorTag", new CompoundTag()).forGetter(StarbuncleCharmData::getBehaviorTag), + Codec.STRING.optionalFieldOf("adopter", "").forGetter(StarbuncleCharmData::getAdopter), + Codec.STRING.optionalFieldOf("bio", "").forGetter(StarbuncleCharmData::getBio) ).apply(instance, StarbuncleCharmData::new)); public static StreamCodec STREAM_CODEC = ANCodecs.composite( ComponentSerialization.STREAM_CODEC.apply(ByteBufCodecs::optional), - s -> s.name, + StarbuncleCharmData::getName, ByteBufCodecs.STRING_UTF8, - s -> s.color, + StarbuncleCharmData::getColor, BlockPos.STREAM_CODEC.apply(ByteBufCodecs::optional), - s -> s.bedPos, - ItemStack.STREAM_CODEC, - s -> s.cosmetic, + StarbuncleCharmData::getBedPos, + ItemStack.STREAM_CODEC.apply(ByteBufCodecs::optional), + StarbuncleCharmData::getCosmetic, ResourceLocation.STREAM_CODEC, - s -> s.behavior, + StarbuncleCharmData::getBehavior, ByteBufCodecs.COMPOUND_TAG, - s -> s.behaviorTag, + StarbuncleCharmData::getBehaviorTag, ByteBufCodecs.STRING_UTF8, - s -> s.adopter, + StarbuncleCharmData::getAdopter, ByteBufCodecs.STRING_UTF8, - s -> s.bio, + StarbuncleCharmData::getBio, StarbuncleCharmData::new ); + private final Optional name; + private final String color; + private final Optional cosmetic; + private final Block pathBlock; + private final Optional bedPos; + private final ResourceLocation behavior; + private final CompoundTag behaviorTag; + private final String adopter; + private final String bio; - public final Optional name; - public final String color; - public final ItemStack cosmetic; - public final Block pathBlock; - public final Optional bedPos; - public final ResourceLocation behavior; - public final CompoundTag behaviorTag; - public final String adopter; - public final String bio; - - public StarbuncleCharmData(Optional name, String color, Optional bedPos, ItemStack cosmetic, ResourceLocation behavior, CompoundTag behaviorTag, String adopter, String bio) { + public StarbuncleCharmData(Optional name, String color, Optional bedPos, Optional cosmetic, ResourceLocation behavior, CompoundTag behaviorTag, String adopter, String bio) { this(name, color, null, bedPos, cosmetic, behavior, behaviorTag, adopter, bio); } - public StarbuncleCharmData(Optional name, String color, Block pathBlock, Optional bedPos, ItemStack cosmetic,ResourceLocation behavior, CompoundTag behaviorTag, String adopter, String bio) { + public StarbuncleCharmData(Optional name, String color, Block pathBlock, Optional bedPos, Optional cosmetic,ResourceLocation behavior, CompoundTag behaviorTag, String adopter, String bio) { this.name = name; this.color = color; this.cosmetic = cosmetic; @@ -94,7 +93,7 @@ public StarbuncleCharmData(Optional name, String color, Block pathBlo } public StarbuncleCharmData() { - this(Optional.empty(), DyeColor.ORANGE.getName(), null, Optional.empty(), ItemStack.EMPTY, StarbyTransportBehavior.TRANSPORT_ID, new CompoundTag(), null, null); + this(Optional.empty(), DyeColor.ORANGE.getName(), null, Optional.empty(), Optional.empty(), StarbyTransportBehavior.TRANSPORT_ID, new CompoundTag(), "", ""); } @@ -104,7 +103,7 @@ public Codec getCodec() { } public Mutable mutable() { - return new Mutable(name.orElse(null), color, cosmetic, pathBlock, bedPos.orElse(null), behavior, new CompoundTag(), adopter, bio); + return new Mutable(name.orElse(null), color, cosmetic.orElse(null), pathBlock, bedPos.orElse(null), behavior, new CompoundTag(), adopter, bio); } @Override @@ -118,7 +117,7 @@ public void addToTooltip(Item.TooltipContext context, Consumer toolti if(bio != null){ tooltip2.accept(Component.literal(bio).withStyle(Style.EMPTY.withColor(ChatFormatting.DARK_PURPLE))); } - if(behavior != null && context != null){ + if(behavior != null){ // danger zone try{ ChangeableBehavior behavior = BehaviorRegistry.create(this.behavior, new Starbuncle(ArsNouveau.proxy.getClientWorld(), true), this.behaviorTag); @@ -145,6 +144,42 @@ public int hashCode() { return Objects.hash(name, color, cosmetic, pathBlock, bedPos, behavior, adopter, bio); } + public String getColor() { + return color; + } + + public Optional getName() { + return name; + } + + public Optional getCosmetic() { + return cosmetic; + } + + public Block getPathBlock() { + return pathBlock; + } + + public Optional getBedPos() { + return bedPos; + } + + public ResourceLocation getBehavior() { + return behavior; + } + + public CompoundTag getBehaviorTag() { + return behaviorTag; + } + + public String getAdopter() { + return adopter; + } + + public String getBio() { + return bio; + } + public static class Mutable { public Component name; public String color; @@ -169,11 +204,11 @@ public Mutable(Component name, String color, ItemStack cosmetic, Block pathBlock } public Mutable() { - this(null, DyeColor.ORANGE.getName(), ItemStack.EMPTY, null, BlockPos.ZERO, StarbyTransportBehavior.TRANSPORT_ID, new CompoundTag(), null, null); + this(null, DyeColor.ORANGE.getName(), null, null, BlockPos.ZERO, StarbyTransportBehavior.TRANSPORT_ID, new CompoundTag(), "", ""); } public StarbuncleCharmData immutable() { - return new StarbuncleCharmData(Optional.ofNullable(name), color, pathBlock, Optional.ofNullable(bedPos), cosmetic, behaviorKey, behaviorTag, adopter, bio); + return new StarbuncleCharmData(Optional.ofNullable(name), color, pathBlock, Optional.ofNullable(bedPos), Optional.ofNullable(cosmetic), behaviorKey, behaviorTag, adopter, bio); } } } From 014fe0e168e16467100fc47cc3152f1354d5d20a Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 10 Jul 2024 19:17:33 -0500 Subject: [PATCH 048/363] fix in-game tooltips --- .../arsnouveau/client/gui/GuiEntityInfoHUD.java | 11 ++++------- .../arsnouveau/client/registry/ClientHandler.java | 3 +-- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java index 69dc51b167..9a3036ff4a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiEntityInfoHUD.java @@ -35,6 +35,7 @@ import java.util.List; public class GuiEntityInfoHUD { + public static MultiBufferSource.BufferSource renderType = MultiBufferSource.immediate(new ByteBufferBuilder(1536)); public static final LayeredDraw.Layer OVERLAY = GuiEntityInfoHUD::renderOverlay; public static int hoverTicks = 0; @@ -97,8 +98,8 @@ public static void renderOverlay(GuiGraphics graphics, DeltaTracker tracker) { tooltipHeight += (tooltip.size() - 1) * 10; } int xOffset = Config.TOOLTIP_X_OFFSET.get(); - int width = Minecraft.getInstance().getWindow().getWidth(); - int height = Minecraft.getInstance().getWindow().getHeight(); + int width = Minecraft.getInstance().getWindow().getGuiScaledWidth(); + int height = Minecraft.getInstance().getWindow().getGuiScaledHeight(); int posX = width / 2 + xOffset; int posY = height / 2 + Config.TOOLTIP_Y_OFFSET.get(); @@ -116,7 +117,6 @@ public static void renderOverlay(GuiGraphics graphics, DeltaTracker tracker) { colorBorderTop.scaleAlpha(fade); colorBorderBot.scaleAlpha(fade); } - drawHoveringText(ItemStack.EMPTY, graphics, tooltip, posX, posY, width, height, -1, colorBackground.getRGB(), colorBorderTop.getRGB(), colorBorderBot.getRGB(), mc.font); poseStack.popPose(); @@ -131,6 +131,7 @@ public static void drawHoveringText(@NotNull final ItemStack stack, GuiGraphics int maxTextWidth, int backgroundColor, int borderColorStart, int borderColorEnd, Font font) { if (textLines.isEmpty()) return; + PoseStack pStack = graphics.pose(); List list = ClientHooks.gatherTooltipComponents(stack, textLines, stack.getTooltipImage(), mouseX, screenWidth, screenHeight, font); RenderTooltipEvent.Pre event = @@ -245,10 +246,7 @@ else if (tooltipY + tooltipHeight + 4 > screenHeight) tooltipY - 3 + 1, borderColorStart, borderColorStart); graphics.fillGradient(tooltipX - 3, tooltipY + tooltipHeight + 2, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, borderColorEnd, borderColorEnd); - - MultiBufferSource.BufferSource renderType = MultiBufferSource.immediate(new ByteBufferBuilder(1536)); pStack.translate(0.0D, 0.0D, zLevel); - for (int lineNumber = 0; lineNumber < list.size(); ++lineNumber) { ClientTooltipComponent line = list.get(lineNumber); @@ -260,7 +258,6 @@ else if (tooltipY + tooltipHeight + 4 > screenHeight) tooltipY += 10; } - renderType.endBatch(); pStack.popPose(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index 64bbcde8f2..54f0bb78b5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -53,7 +53,6 @@ import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; import net.neoforged.neoforge.client.event.RegisterGuiLayersEvent; import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; -import net.neoforged.neoforge.client.gui.VanillaGuiLayers; import org.jetbrains.annotations.Nullable; import static com.hollingsworth.arsnouveau.client.events.ClientEvents.localize; @@ -190,7 +189,7 @@ public static void registerMenu(final RegisterMenuScreensEvent event) { @SubscribeEvent public static void registerOverlays(final RegisterGuiLayersEvent event) { event.registerAboveAll(ArsNouveau.prefix("scry_camera"), cameraOverlay); - event.registerAbove(VanillaGuiLayers.HOTBAR, ArsNouveau.prefix("tooltip"), GuiEntityInfoHUD.OVERLAY); + event.registerAboveAll(ArsNouveau.prefix("tooltip"), GuiEntityInfoHUD.OVERLAY); event.registerAboveAll(ArsNouveau.prefix("mana_hud"), GuiManaHUD.OVERLAY); event.registerAboveAll(ArsNouveau.prefix("spell_hud"), GuiSpellHUD.OVERLAY); From 24aef24efa16f25f4cfacc53d1239e5b84089d6e Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 10 Jul 2024 19:28:38 -0500 Subject: [PATCH 049/363] fix starbuncle behavior persistence --- .../com/hollingsworth/arsnouveau/common/entity/Starbuncle.java | 2 ++ .../arsnouveau/common/items/data/StarbuncleCharmData.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index eba5d58886..0a0975661e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -570,6 +570,7 @@ public boolean onDispel(@Nullable LivingEntity caster) { public void readAdditionalSaveData(CompoundTag tag) { super.readAdditionalSaveData(tag); data = NBTComponent.fromTag(StarbuncleCharmData.CODEC.codec(), tag.contains("starbuncleData") ? tag.getCompound("starbuncleData") : new CompoundTag()).mutable(); + this.dynamicBehavior = BehaviorRegistry.create(data.behaviorKey, this, data.behaviorTag); if (tag.contains("held")) setHeldStack(ItemStack.parseOptional(level.registryAccess(), (CompoundTag) tag.get("held"))); @@ -589,6 +590,7 @@ public void readAdditionalSaveData(CompoundTag tag) { @Override public void addAdditionalSaveData(CompoundTag tag) { super.addAdditionalSaveData(tag); + data.behaviorTag = this.dynamicBehavior.toTag(new CompoundTag()); tag.put("starbuncleData", data.immutable().toTag(level)); if (!getHeldStack().isEmpty()) { Tag itemTag = getHeldStack().save(level.registryAccess()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java index 697072fc11..3ac92a74c8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java @@ -103,7 +103,7 @@ public Codec getCodec() { } public Mutable mutable() { - return new Mutable(name.orElse(null), color, cosmetic.orElse(null), pathBlock, bedPos.orElse(null), behavior, new CompoundTag(), adopter, bio); + return new Mutable(name.orElse(null), color, cosmetic.orElse(null), pathBlock, bedPos.orElse(null), behavior, behaviorTag, adopter, bio); } @Override From 9ca29206043ac4ae6f278caafc48e2c1770630cd Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 10 Jul 2024 21:17:47 -0500 Subject: [PATCH 050/363] datagen enchantments --- .../56408d4385cae198e776e71d25785a05a196148d | 4 + .../c03ccd0f93606faadfab316dc8aedf1ba96c844a | 3 + .../ars_nouveau/enchantment/mana_boost.json | 20 ++++ .../ars_nouveau/enchantment/mana_regen.json | 20 ++++ .../ars_nouveau/enchantment/reactive.json | 20 ++++ .../tags/enchantment/non_treasure.json | 12 +++ .../minecraft/tags/enchantment/tradeable.json | 12 +++ .../tile/EnchantingApparatusRenderer.java | 2 +- .../common/datagen/DamageTypesProvider.java | 3 - .../common/datagen/EnchantmentProvider.java | 96 +++++++++++++++++++ .../arsnouveau/common/datagen/ModDatagen.java | 3 + 11 files changed, 191 insertions(+), 4 deletions(-) create mode 100644 src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d create mode 100644 src/generated/resources/.cache/c03ccd0f93606faadfab316dc8aedf1ba96c844a create mode 100644 src/generated/resources/data/ars_nouveau/enchantment/mana_boost.json create mode 100644 src/generated/resources/data/ars_nouveau/enchantment/mana_regen.json create mode 100644 src/generated/resources/data/ars_nouveau/enchantment/reactive.json create mode 100644 src/generated/resources/data/minecraft/tags/enchantment/non_treasure.json create mode 100644 src/generated/resources/data/minecraft/tags/enchantment/tradeable.json create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/datagen/EnchantmentProvider.java diff --git a/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d b/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d new file mode 100644 index 0000000000..ad73f4bafa --- /dev/null +++ b/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d @@ -0,0 +1,4 @@ +// 1.21 2024-07-10T21:04:30.3981055 Ars Nouveau's Enchantment Data +bd8cdb4df8237ec68aebc8d20f284e669c04b5e0 data/ars_nouveau/enchantment/mana_boost.json +ba44873e68e360bbc158c49fb4359d303332bf3c data/ars_nouveau/enchantment/mana_regen.json +8091c2c07766c95ebf45a5618abc2da3ab8c9051 data/ars_nouveau/enchantment/reactive.json diff --git a/src/generated/resources/.cache/c03ccd0f93606faadfab316dc8aedf1ba96c844a b/src/generated/resources/.cache/c03ccd0f93606faadfab316dc8aedf1ba96c844a new file mode 100644 index 0000000000..10b3c18d60 --- /dev/null +++ b/src/generated/resources/.cache/c03ccd0f93606faadfab316dc8aedf1ba96c844a @@ -0,0 +1,3 @@ +// 1.21 2024-07-10T21:15:15.9194307 Tags for minecraft:enchantment mod id ars_nouveau +e654e32b0c3eb36d0912b1f29ad16fa0429c826f data/minecraft/tags/enchantment/non_treasure.json +e654e32b0c3eb36d0912b1f29ad16fa0429c826f data/minecraft/tags/enchantment/tradeable.json diff --git a/src/generated/resources/data/ars_nouveau/enchantment/mana_boost.json b/src/generated/resources/data/ars_nouveau/enchantment/mana_boost.json new file mode 100644 index 0000000000..08ed35dce0 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/enchantment/mana_boost.json @@ -0,0 +1,20 @@ +{ + "anvil_cost": 1, + "description": { + "translate": "enchantment.ars_nouveau.mana_boost" + }, + "max_cost": { + "base": 12, + "per_level_above_first": 11 + }, + "max_level": 3, + "min_cost": { + "base": 1, + "per_level_above_first": 11 + }, + "slots": [ + "armor" + ], + "supported_items": "#minecraft:enchantable/armor", + "weight": 5 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/enchantment/mana_regen.json b/src/generated/resources/data/ars_nouveau/enchantment/mana_regen.json new file mode 100644 index 0000000000..70f804ef76 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/enchantment/mana_regen.json @@ -0,0 +1,20 @@ +{ + "anvil_cost": 1, + "description": { + "translate": "enchantment.ars_nouveau.mana_regen" + }, + "max_cost": { + "base": 12, + "per_level_above_first": 11 + }, + "max_level": 3, + "min_cost": { + "base": 1, + "per_level_above_first": 11 + }, + "slots": [ + "armor" + ], + "supported_items": "#minecraft:enchantable/armor", + "weight": 5 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/enchantment/reactive.json b/src/generated/resources/data/ars_nouveau/enchantment/reactive.json new file mode 100644 index 0000000000..8119b15c23 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/enchantment/reactive.json @@ -0,0 +1,20 @@ +{ + "anvil_cost": 1, + "description": { + "translate": "enchantment.ars_nouveau.reactive" + }, + "max_cost": { + "base": 12, + "per_level_above_first": 11 + }, + "max_level": 4, + "min_cost": { + "base": 1, + "per_level_above_first": 11 + }, + "slots": [ + "any" + ], + "supported_items": "#minecraft:enchantable/armor", + "weight": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/enchantment/non_treasure.json b/src/generated/resources/data/minecraft/tags/enchantment/non_treasure.json new file mode 100644 index 0000000000..a22eb421c0 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/enchantment/non_treasure.json @@ -0,0 +1,12 @@ +{ + "values": [ + { + "id": "ars_nouveau:mana_boost", + "required": false + }, + { + "id": "ars_nouveau:mana_regen", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/enchantment/tradeable.json b/src/generated/resources/data/minecraft/tags/enchantment/tradeable.json new file mode 100644 index 0000000000..a22eb421c0 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/enchantment/tradeable.json @@ -0,0 +1,12 @@ +{ + "values": [ + { + "id": "ars_nouveau:mana_boost", + "required": false + }, + { + "id": "ars_nouveau:mana_regen", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantingApparatusRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantingApparatusRenderer.java index 19a035bf63..34f6d9ce18 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantingApparatusRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantingApparatusRenderer.java @@ -34,7 +34,7 @@ public void renderFinal(PoseStack stack, EnchantingApparatusTile tile, BakedGeoM } stack.pushPose(); RenderUtil.translateMatrixToBone(stack, frame); - stack.translate(0.5, +0.5, 0.5); + stack.translate(0.5, 0.4, 0.5); stack.scale(0.75f, 0.75f, 0.75f); ItemStack itemstack = tile.renderEntity.getItem(); Minecraft.getInstance().getItemRenderer().renderStatic(itemstack, ItemDisplayContext.GROUND, packedLight, OverlayTexture.NO_OVERLAY, stack, bufferSource, tile.getLevel(), (int) tile.getBlockPos().asLong()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DamageTypesProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DamageTypesProvider.java index 186dc3bfc3..03311f7a79 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DamageTypesProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DamageTypesProvider.java @@ -43,9 +43,6 @@ public String getName() { return "Ars Nouveau's Damage Type Data"; } - - - public static class DamageTypesTagsProvider extends DamageTypeTagsProvider { TagKey FORGE_MAGIC = TagKey.create(Registries.DAMAGE_TYPE, ResourceLocation.fromNamespaceAndPath("c", "is_magic")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EnchantmentProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EnchantmentProvider.java new file mode 100644 index 0000000000..131210b0df --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EnchantmentProvider.java @@ -0,0 +1,96 @@ +package com.hollingsworth.arsnouveau.common.datagen; + +import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.RegistrySetBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.PackOutput; +import net.minecraft.data.worldgen.BootstrapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.EnchantmentTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.entity.EquipmentSlotGroup; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.enchantment.Enchantment; +import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Set; +import java.util.concurrent.CompletableFuture; + +public class EnchantmentProvider extends DatapackBuiltinEntriesProvider { + private static final RegistrySetBuilder BUILDER = new RegistrySetBuilder() + .add(Registries.ENCHANTMENT, EnchantmentProvider::bootstrap); + + + public static void bootstrap(BootstrapContext ctx) { + HolderGetter holdergetter2 = ctx.lookup(Registries.ITEM); + register(ctx, EnchantmentRegistry.MANA_BOOST_ENCHANTMENT, Enchantment.enchantment(Enchantment.definition( + holdergetter2.getOrThrow(ItemTags.ARMOR_ENCHANTABLE), + 5, + 3, + Enchantment.dynamicCost(1, 11), + Enchantment.dynamicCost(12, 11), + 1, + EquipmentSlotGroup.ARMOR + ))); + + register(ctx, EnchantmentRegistry.MANA_REGEN_ENCHANTMENT, Enchantment.enchantment(Enchantment.definition( + holdergetter2.getOrThrow(ItemTags.ARMOR_ENCHANTABLE), + 5, + 3, + Enchantment.dynamicCost(1, 11), + Enchantment.dynamicCost(12, 11), + 1, + EquipmentSlotGroup.ARMOR + ))); + + register(ctx, EnchantmentRegistry.REACTIVE_ENCHANTMENT, Enchantment.enchantment(Enchantment.definition( + holdergetter2.getOrThrow(ItemTags.ARMOR_ENCHANTABLE), + 1, + 4, + Enchantment.dynamicCost(1, 11), + Enchantment.dynamicCost(12, 11), + 1, + EquipmentSlotGroup.ANY + ))); + } + + protected static void register(BootstrapContext ctx, ResourceKey enchantment, Enchantment.Builder builder) { + ctx.register(enchantment, builder.build(enchantment.location())); + } + + public EnchantmentProvider(PackOutput output, CompletableFuture registries) { + super(output, registries, BUILDER, Set.of(ArsNouveau.MODID)); + } + + @Override + @NotNull + public String getName() { + return "Ars Nouveau's Enchantment Data"; + } + + + public static class EnchantmentTagsProvider extends net.minecraft.data.tags.EnchantmentTagsProvider { + + public EnchantmentTagsProvider(PackOutput pPackOutput, CompletableFuture provider, @Nullable ExistingFileHelper existingFileHelper) { + super(pPackOutput, provider, ArsNouveau.MODID, existingFileHelper); + } + + @Override + protected void addTags(HolderLookup.Provider pProvider) { + + this.tag(EnchantmentTags.NON_TREASURE).addOptional( + EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.location()) + .addOptional(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.location()); + this.tag(EnchantmentTags.TRADEABLE).addOptional( + EnchantmentRegistry.MANA_BOOST_ENCHANTMENT.location()).addOptional( + EnchantmentRegistry.MANA_REGEN_ENCHANTMENT.location()); + } + } + +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java index d6f2f56580..2d7839d8b0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java @@ -50,6 +50,9 @@ public static void datagen(GatherDataEvent event) { event.getGenerator().addProvider(event.includeServer(), new DispelEntityProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new StructureTagProvider(output, provider, fileHelper)); event.getGenerator().addProvider(event.includeClient(), new AtlasProvider(output, provider, fileHelper)); + event.getGenerator().addProvider(event.includeServer(), new EnchantmentProvider(output, provider)); + event.getGenerator().addProvider(event.includeServer(), new EnchantmentProvider.EnchantmentTagsProvider(output, provider, fileHelper)); + event.getGenerator().addProvider(event.includeServer(), new DamageTypesProvider(output, provider)); event.getGenerator().addProvider(event.includeServer(), new DamageTypesProvider.DamageTypesTagsProvider(output, provider, fileHelper)); event.getGenerator().addProvider(event.includeServer(), new CompostablesProvider(output, provider)); From 8e0428e2e116c2ee725c05e26eaec44ef8e6e0ab Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 11 Jul 2024 09:04:58 -0500 Subject: [PATCH 051/363] reenable block loot tables --- .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 167 ++++ .../blocks/agronomic_sourcelink.json | 21 + .../blocks/alchemical_sourcelink.json | 21 + .../loot_table/blocks/alteration_table.json | 30 + .../loot_table/blocks/arcane_core.json | 21 + .../loot_table/blocks/arcane_pedestal.json | 21 + .../loot_table/blocks/arcane_platform.json | 21 + .../loot_table/blocks/archwood_button.json | 21 + .../loot_table/blocks/archwood_chest.json | 21 + .../loot_table/blocks/archwood_door.json | 30 + .../loot_table/blocks/archwood_fence.json | 21 + .../blocks/archwood_fence_gate.json | 21 + .../loot_table/blocks/archwood_planks.json | 21 + .../blocks/archwood_pressure_plate.json | 21 + .../loot_table/blocks/archwood_sconce.json | 21 + .../loot_table/blocks/archwood_slab.json | 35 + .../loot_table/blocks/archwood_stairs.json | 21 + .../loot_table/blocks/archwood_trapdoor.json | 21 + .../loot_table/blocks/basic_spell_turret.json | 21 + .../loot_table/blocks/bastion_pod.json | 32 + .../blocks/blue_archwood_leaves.json | 136 ++++ .../loot_table/blocks/blue_archwood_log.json | 21 + .../blocks/blue_archwood_sapling.json | 21 + .../loot_table/blocks/blue_archwood_wood.json | 21 + .../loot_table/blocks/blue_sbed.json | 21 + .../loot_table/blocks/bombegranate_pod.json | 32 + .../loot_table/blocks/brazier_relay.json | 21 + .../loot_table/blocks/drygmy_stone.json | 21 + .../blocks/enchanting_apparatus.json | 21 + .../loot_table/blocks/falseweave.json | 21 + .../loot_table/blocks/frostaya_pod.json | 32 + .../loot_table/blocks/ghostweave.json | 21 + .../gilded_sourcestone_alternating.json | 21 + .../gilded_sourcestone_alternating_slab.json | 21 + ...gilded_sourcestone_alternating_stairs.json | 21 + .../gilded_sourcestone_basketweave.json | 21 + .../gilded_sourcestone_basketweave_slab.json | 21 + ...gilded_sourcestone_basketweave_stairs.json | 21 + .../gilded_sourcestone_large_bricks.json | 21 + .../gilded_sourcestone_large_bricks_slab.json | 21 + ...ilded_sourcestone_large_bricks_stairs.json | 21 + .../blocks/gilded_sourcestone_mosaic.json | 21 + .../gilded_sourcestone_mosaic_slab.json | 21 + .../gilded_sourcestone_mosaic_stairs.json | 21 + .../gilded_sourcestone_small_bricks.json | 21 + .../gilded_sourcestone_small_bricks_slab.json | 21 + ...ilded_sourcestone_small_bricks_stairs.json | 21 + .../blocks/green_archwood_leaves.json | 136 ++++ .../loot_table/blocks/green_archwood_log.json | 21 + .../blocks/green_archwood_sapling.json | 21 + .../blocks/green_archwood_wood.json | 21 + .../loot_table/blocks/green_sbed.json | 21 + .../loot_table/blocks/imbuement_chamber.json | 21 + .../loot_table/blocks/item_detector.json | 21 + .../loot_table/blocks/magebloom_block.json | 21 + .../loot_table/blocks/magelight_torch.json | 21 + .../loot_table/blocks/mendosteen_pod.json | 32 + .../loot_table/blocks/mirrorweave.json | 21 + .../loot_table/blocks/mob_jar.json | 38 + .../blocks/mycelial_sourcelink.json | 21 + .../loot_table/blocks/orange_sbed.json | 21 + .../loot_table/blocks/polished_sconce.json | 21 + .../loot_table/blocks/potion_diffuser.json | 21 + .../loot_table/blocks/potion_jar.json | 53 ++ .../loot_table/blocks/potion_melder.json | 21 + .../blocks/potted_blue_archwood_sapling.json | 36 + .../blocks/potted_green_archwood_sapling.json | 36 + .../blocks/potted_magebloom_crop.json | 36 + .../potted_purple_archwood_sapling.json | 36 + .../blocks/potted_red_archwood_sapling.json | 36 + .../blocks/purple_archwood_leaves.json | 136 ++++ .../blocks/purple_archwood_log.json | 21 + .../blocks/purple_archwood_sapling.json | 21 + .../blocks/purple_archwood_wood.json | 21 + .../loot_table/blocks/purple_sbed.json | 21 + .../blocks/red_archwood_leaves.json | 136 ++++ .../loot_table/blocks/red_archwood_log.json | 21 + .../blocks/red_archwood_sapling.json | 21 + .../loot_table/blocks/red_archwood_wood.json | 21 + .../loot_table/blocks/red_sbed.json | 21 + .../loot_table/blocks/redstone_relay.json | 21 + .../ars_nouveau/loot_table/blocks/relay.json | 21 + .../loot_table/blocks/relay_collector.json | 21 + .../loot_table/blocks/relay_deposit.json | 21 + .../loot_table/blocks/relay_splitter.json | 21 + .../loot_table/blocks/relay_warp.json | 21 + .../loot_table/blocks/repository.json | 22 + .../loot_table/blocks/ritual_brazier.json | 21 + .../blocks/rotating_spell_turret.json | 21 + .../ars_nouveau/loot_table/blocks/sconce.json | 21 + .../loot_table/blocks/scribes_table.json | 30 + .../loot_table/blocks/scryers_crystal.json | 21 + .../loot_table/blocks/scryers_oculus.json | 21 + .../loot_table/blocks/sky_block.json | 21 + ...smooth_gilded_sourcestone_alternating.json | 21 + ...h_gilded_sourcestone_alternating_slab.json | 21 + ...gilded_sourcestone_alternating_stairs.json | 21 + ...smooth_gilded_sourcestone_basketweave.json | 21 + ...h_gilded_sourcestone_basketweave_slab.json | 21 + ...gilded_sourcestone_basketweave_stairs.json | 21 + ...mooth_gilded_sourcestone_large_bricks.json | 21 + ..._gilded_sourcestone_large_bricks_slab.json | 21 + ...ilded_sourcestone_large_bricks_stairs.json | 21 + .../smooth_gilded_sourcestone_mosaic.json | 21 + ...smooth_gilded_sourcestone_mosaic_slab.json | 21 + ...ooth_gilded_sourcestone_mosaic_stairs.json | 21 + ...mooth_gilded_sourcestone_small_bricks.json | 21 + ..._gilded_sourcestone_small_bricks_slab.json | 21 + ...ilded_sourcestone_small_bricks_stairs.json | 21 + .../loot_table/blocks/smooth_sourcestone.json | 21 + .../smooth_sourcestone_alternating.json | 21 + .../smooth_sourcestone_alternating_slab.json | 21 + ...smooth_sourcestone_alternating_stairs.json | 21 + .../smooth_sourcestone_basketweave.json | 21 + .../smooth_sourcestone_basketweave_slab.json | 21 + ...smooth_sourcestone_basketweave_stairs.json | 21 + .../smooth_sourcestone_large_bricks.json | 21 + .../smooth_sourcestone_large_bricks_slab.json | 21 + ...mooth_sourcestone_large_bricks_stairs.json | 21 + .../blocks/smooth_sourcestone_mosaic.json | 21 + .../smooth_sourcestone_mosaic_slab.json | 21 + .../smooth_sourcestone_mosaic_stairs.json | 21 + .../blocks/smooth_sourcestone_slab.json | 21 + .../smooth_sourcestone_small_bricks.json | 21 + .../smooth_sourcestone_small_bricks_slab.json | 21 + ...mooth_sourcestone_small_bricks_stairs.json | 21 + .../blocks/smooth_sourcestone_stairs.json | 21 + .../loot_table/blocks/source_gem_block.json | 21 + .../loot_table/blocks/source_jar.json | 38 + .../loot_table/blocks/sourceberry_sack.json | 21 + .../loot_table/blocks/sourcestone.json | 21 + .../blocks/sourcestone_alternating.json | 21 + .../blocks/sourcestone_alternating_slab.json | 21 + .../sourcestone_alternating_stairs.json | 21 + .../blocks/sourcestone_basketweave.json | 21 + .../blocks/sourcestone_basketweave_slab.json | 21 + .../sourcestone_basketweave_stairs.json | 21 + .../blocks/sourcestone_large_bricks.json | 21 + .../blocks/sourcestone_large_bricks_slab.json | 21 + .../sourcestone_large_bricks_stairs.json | 21 + .../loot_table/blocks/sourcestone_mosaic.json | 21 + .../blocks/sourcestone_mosaic_slab.json | 21 + .../blocks/sourcestone_mosaic_stairs.json | 21 + .../loot_table/blocks/sourcestone_sconce.json | 21 + .../loot_table/blocks/sourcestone_slab.json | 21 + .../blocks/sourcestone_small_bricks.json | 21 + .../blocks/sourcestone_small_bricks_slab.json | 21 + .../sourcestone_small_bricks_stairs.json | 21 + .../loot_table/blocks/sourcestone_stairs.json | 21 + .../loot_table/blocks/spell_prism.json | 21 + .../loot_table/blocks/spell_sensor.json | 21 + .../loot_table/blocks/spell_turret.json | 21 + .../loot_table/blocks/storage_lectern.json | 21 + .../blocks/stripped_blue_archwood_log.json | 21 + .../blocks/stripped_blue_archwood_wood.json | 21 + .../blocks/stripped_green_archwood_log.json | 21 + .../blocks/stripped_green_archwood_wood.json | 21 + .../blocks/stripped_purple_archwood_log.json | 21 + .../blocks/stripped_purple_archwood_wood.json | 21 + .../blocks/stripped_red_archwood_log.json | 21 + .../blocks/stripped_red_archwood_wood.json | 21 + .../loot_table/blocks/timer_spell_turret.json | 21 + .../loot_table/blocks/vitalic_sourcelink.json | 21 + .../loot_table/blocks/void_prism.json | 21 + .../blocks/volcanic_sourcelink.json | 21 + .../loot_table/blocks/wixie_cauldron.json | 21 + .../loot_table/blocks/yellow_sbed.json | 21 + .../common/datagen/DefaultTableProvider.java | 725 ++++++++++-------- .../arsnouveau/common/datagen/ModDatagen.java | 2 +- .../common/enchantment/ManaBoost.java | 18 - .../enchantment/ManaRegenEnchantment.java | 21 - .../enchantment/ReactiveEnchantment.java | 38 - 172 files changed, 4725 insertions(+), 419 deletions(-) create mode 100644 src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/agronomic_sourcelink.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/alchemical_sourcelink.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/alteration_table.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/arcane_core.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/arcane_pedestal.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/arcane_platform.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_button.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_chest.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_door.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_fence.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_fence_gate.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_planks.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_pressure_plate.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_sconce.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_trapdoor.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/basic_spell_turret.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/bastion_pod.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_archwood_leaves.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_archwood_log.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_archwood_sapling.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_archwood_wood.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_sbed.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/bombegranate_pod.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/brazier_relay.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/drygmy_stone.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/enchanting_apparatus.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/falseweave.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/frostaya_pod.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/ghostweave.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/green_archwood_leaves.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/green_archwood_log.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/green_archwood_sapling.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/green_archwood_wood.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/green_sbed.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/imbuement_chamber.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/item_detector.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/magebloom_block.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/magelight_torch.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/mendosteen_pod.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/mirrorweave.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/mob_jar.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/mycelial_sourcelink.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/orange_sbed.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/polished_sconce.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/potion_diffuser.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/potion_jar.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/potion_melder.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_blue_archwood_sapling.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_green_archwood_sapling.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_magebloom_crop.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_purple_archwood_sapling.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_red_archwood_sapling.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_archwood_leaves.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_archwood_log.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_archwood_sapling.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_archwood_wood.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_sbed.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/red_archwood_leaves.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/red_archwood_log.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/red_archwood_sapling.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/red_archwood_wood.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/red_sbed.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/redstone_relay.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/relay.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/relay_collector.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/relay_deposit.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/relay_splitter.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/relay_warp.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/repository.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/ritual_brazier.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/rotating_spell_turret.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sconce.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/scribes_table.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/scryers_crystal.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/scryers_oculus.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sky_block.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/source_gem_block.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/source_jar.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourceberry_sack.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_alternating.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_alternating_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_alternating_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_basketweave.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_basketweave_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_basketweave_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_mosaic.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_mosaic_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_mosaic_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_sconce.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks_slab.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_stairs.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/spell_prism.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/spell_sensor.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/spell_turret.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/storage_lectern.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_blue_archwood_log.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_blue_archwood_wood.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_green_archwood_log.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_green_archwood_wood.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_purple_archwood_log.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_purple_archwood_wood.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_red_archwood_log.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_red_archwood_wood.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/timer_spell_turret.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/vitalic_sourcelink.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/void_prism.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/volcanic_sourcelink.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/wixie_cauldron.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/yellow_sbed.json delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ManaBoost.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ManaRegenEnchantment.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ReactiveEnchantment.java diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d new file mode 100644 index 0000000000..b052c7ccda --- /dev/null +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -0,0 +1,167 @@ +// 1.21 2024-07-11T09:03:13.3968254 Loot Tables +4f70eae621815da8d08d3ea0b9fd479b48bad2d3 data/ars_nouveau/loot_table/blocks/agronomic_sourcelink.json +8a6d60f2b39de0408c7e4537b53e866a04236d22 data/ars_nouveau/loot_table/blocks/alchemical_sourcelink.json +8bdff8a0a49a9f3f21a822eb1d1d01a950d6ad1a data/ars_nouveau/loot_table/blocks/alteration_table.json +3f9ddb75996549cf381b4b1b6d1739eb83bf437b data/ars_nouveau/loot_table/blocks/arcane_core.json +ef48dae9fc4eb8f60977f6fe355fc57cf198db7a data/ars_nouveau/loot_table/blocks/arcane_pedestal.json +53bf378ab2897ecd519af63fd2b0ed1cd2e8677b data/ars_nouveau/loot_table/blocks/arcane_platform.json +45051ced83838c9d65d2b8f504b8a0f67a84b05e data/ars_nouveau/loot_table/blocks/archwood_button.json +bd02fbb12b7c0c175bd6d0e1b187d2863417639a data/ars_nouveau/loot_table/blocks/archwood_chest.json +e8985e027de224f13721125c4b09d65713f97dc5 data/ars_nouveau/loot_table/blocks/archwood_door.json +26b9292b4a83dd617d39b696cec4135427498a63 data/ars_nouveau/loot_table/blocks/archwood_fence.json +9f049cc2f08417b7eca511cf243c4f0fd02defc4 data/ars_nouveau/loot_table/blocks/archwood_fence_gate.json +f9e27d9666e987dd258f4f7eae3e26e76af37a8b data/ars_nouveau/loot_table/blocks/archwood_planks.json +e81dd438da4fefc94c36ba7ca66cdc96eb894fbf data/ars_nouveau/loot_table/blocks/archwood_pressure_plate.json +34474b1ab19734300b3340f1fc93b35a3f236130 data/ars_nouveau/loot_table/blocks/archwood_sconce.json +9b6046d339e837e294f50722c066fd2b9ba4ca1c data/ars_nouveau/loot_table/blocks/archwood_slab.json +c175159946f8e1a1d9777625b1a565012f9ea1ac data/ars_nouveau/loot_table/blocks/archwood_stairs.json +241b4a83e94824d1d28d5203a3873d25b731f016 data/ars_nouveau/loot_table/blocks/archwood_trapdoor.json +953dc98596bb992c024d3a5bc5007d49600a5dea data/ars_nouveau/loot_table/blocks/basic_spell_turret.json +e9dbdaf07f7ec302897ddad436c794103b1059b2 data/ars_nouveau/loot_table/blocks/bastion_pod.json +d20df978db97dd6df3078dfa3b58ff8916020aa0 data/ars_nouveau/loot_table/blocks/blue_archwood_leaves.json +d177c2573688d773f18a7ebf34d00530a22f6ac1 data/ars_nouveau/loot_table/blocks/blue_archwood_log.json +ecc018a81786cc6a6e28d361245f41ac11dbe254 data/ars_nouveau/loot_table/blocks/blue_archwood_sapling.json +3d912ff5f4cb0dc9bd1253b96a1f4ffcdc06a2b3 data/ars_nouveau/loot_table/blocks/blue_archwood_wood.json +d74fd91465aa6474895a69ce39c3c63e96cd61af data/ars_nouveau/loot_table/blocks/blue_sbed.json +fe4e42346e3f3b02b067ec99d988953be10780f3 data/ars_nouveau/loot_table/blocks/bombegranate_pod.json +25879b59f556935200d2f9d63e9fe18c0f8b6375 data/ars_nouveau/loot_table/blocks/brazier_relay.json +cf0a6f8a23b9a04aac70bae40c63d8e57b1006a6 data/ars_nouveau/loot_table/blocks/drygmy_stone.json +50fb5a022df6f6d156c90ee3121ccfe82943beb7 data/ars_nouveau/loot_table/blocks/enchanting_apparatus.json +7a2afda0f26e560c401265332ba8466e324c2b90 data/ars_nouveau/loot_table/blocks/falseweave.json +e23b39b257d50c062129f1abb33f277a758ad2a1 data/ars_nouveau/loot_table/blocks/frostaya_pod.json +57a757c165d2b0bcb480c1e948766fb714a75dc0 data/ars_nouveau/loot_table/blocks/ghostweave.json +7d0528215f008b8e98d38e590cf5ad40ba2644a1 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating.json +ba6dd685d930c77f684b0b805799f7305296678d data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating_slab.json +ac5adad7cfa5a64b21aeb0399b50a885b4937968 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating_stairs.json +381408b99442f1ad4bf66a6a10a68d2cbd789dc8 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave.json +e546d725ad3f43b5dd18057f212d38f9ed853361 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave_slab.json +6926d66cd344c39c06c86bd21ec9c45a853461e5 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave_stairs.json +6ced512f67c47e4a5162a0257d81f73dcae370da data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks.json +8d1891aa81a67e9ee849c6daa7c037c12c8f0839 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks_slab.json +8a51072a80ce8ea0696bdf22636e99de4c3d7f9d data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks_stairs.json +1749337e2a7d8d623578b78cb1184a10b8dface9 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic.json +3e7d5686638e742fd74278e94157748119122956 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic_slab.json +c6e7419ee0480ecead75d1564f0c7f1927629975 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic_stairs.json +8cb421ba47c458534a0b87439be3c7813e0c6b2d data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks.json +73c7f7561087045f511845e5d6674889f17c4ad5 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks_slab.json +e36caa0a35b00d749d0ab30d86401b33c3ad6736 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks_stairs.json +cf4043c312a2753289b18489e77be41712e59242 data/ars_nouveau/loot_table/blocks/green_archwood_leaves.json +8e02847416b3fbd2f7ee102ec6091b797890f027 data/ars_nouveau/loot_table/blocks/green_archwood_log.json +624aac56531fafa0fb0b66931e54ffade954dcf0 data/ars_nouveau/loot_table/blocks/green_archwood_sapling.json +a28c937d10a3fe9217162d764863964ce6d63c58 data/ars_nouveau/loot_table/blocks/green_archwood_wood.json +9881f7ab8a9fe67b52bc163b58fb2e9f1bb805b4 data/ars_nouveau/loot_table/blocks/green_sbed.json +e220cb0773c9e33776b5909041613d3291d06548 data/ars_nouveau/loot_table/blocks/imbuement_chamber.json +df5ba05995044413998b7cbbf02d6c7a63e7c583 data/ars_nouveau/loot_table/blocks/item_detector.json +2af90b26f5f047e3168626ce05aad7a64f42d2ec data/ars_nouveau/loot_table/blocks/magebloom_block.json +072841a4552421b48e60a01206d4b1f42dd90da5 data/ars_nouveau/loot_table/blocks/magelight_torch.json +9d551107c336c6341450da44650d007e795ae962 data/ars_nouveau/loot_table/blocks/mendosteen_pod.json +019635e76547e287688dc710b66e2f96d86ba011 data/ars_nouveau/loot_table/blocks/mirrorweave.json +092c90aaab488eb24e3de25645c3653c44cb5686 data/ars_nouveau/loot_table/blocks/mob_jar.json +06f0d996eea4783dd302764820d1d0e87178cc04 data/ars_nouveau/loot_table/blocks/mycelial_sourcelink.json +6bf8bd330d83e260cd4fcf8311560fd37399f016 data/ars_nouveau/loot_table/blocks/orange_sbed.json +b6f8c60f021cc50669d4a4f75056334922fdd5b1 data/ars_nouveau/loot_table/blocks/polished_sconce.json +a3b768d587399b35b7b094b7bce9f70e9033ef44 data/ars_nouveau/loot_table/blocks/potion_diffuser.json +490aa4411864ad19dcb8dfc09bc32df3313cbe6b data/ars_nouveau/loot_table/blocks/potion_jar.json +8653cbc9f5368a9767156cf5842781623f1c76ed data/ars_nouveau/loot_table/blocks/potion_melder.json +2983589b24f1fa835eae3c40877e0728eb9a5981 data/ars_nouveau/loot_table/blocks/potted_blue_archwood_sapling.json +040c5c292dd024010db00c1433781b44351f52a4 data/ars_nouveau/loot_table/blocks/potted_green_archwood_sapling.json +20ddfca015d14d3a7f7b550c2b262f4862d1f75b data/ars_nouveau/loot_table/blocks/potted_magebloom_crop.json +dc18f35d7a8d6bf84c82e2206d5b0c069e964c1e data/ars_nouveau/loot_table/blocks/potted_purple_archwood_sapling.json +4e76f2d01cff38f0866d8cf088e258f428f35e4b data/ars_nouveau/loot_table/blocks/potted_red_archwood_sapling.json +4bafb6a4f58adb47ad5700df8ed23a90d2999464 data/ars_nouveau/loot_table/blocks/purple_archwood_leaves.json +cf7efdbd5b6e77bcbf10453354b14d0b96aadcda data/ars_nouveau/loot_table/blocks/purple_archwood_log.json +cf9cf5fccb3de2f32cee7d00ad660f69407602d5 data/ars_nouveau/loot_table/blocks/purple_archwood_sapling.json +fc728de445a4bc800c00a685110321f5e13dcc85 data/ars_nouveau/loot_table/blocks/purple_archwood_wood.json +ac8b57829cc7829446d261fa71c2574c72cd1c2d data/ars_nouveau/loot_table/blocks/purple_sbed.json +c233e9e672096d9d25210eda5b7b3bae135c7060 data/ars_nouveau/loot_table/blocks/redstone_relay.json +6d330e74dfe5536e111d1ea72a7136d382da7567 data/ars_nouveau/loot_table/blocks/red_archwood_leaves.json +2b1e55d818128d6e1575c5b9e947910ba1011148 data/ars_nouveau/loot_table/blocks/red_archwood_log.json +167dacda5b033bc2ea2f4f17b4b30d88187ef06b data/ars_nouveau/loot_table/blocks/red_archwood_sapling.json +8c4a3c881d255931c3304a5e310fa999686ddced data/ars_nouveau/loot_table/blocks/red_archwood_wood.json +d2eb2e725a6fe9ddf74eb22f4c4a2bb4e3717964 data/ars_nouveau/loot_table/blocks/red_sbed.json +99675e30bd8f76cbb080d31bc8a6047f2280bd54 data/ars_nouveau/loot_table/blocks/relay.json +9520d386bc5119acad6a177455b7ea5223fdb117 data/ars_nouveau/loot_table/blocks/relay_collector.json +f9cfd7f203d4fc26033d055fa936508c4e369ffa data/ars_nouveau/loot_table/blocks/relay_deposit.json +084d2d8f43154b85960282eb4c515348c80b1203 data/ars_nouveau/loot_table/blocks/relay_splitter.json +dd4282bd6f44a455aa442afd4d97fcf1ed9b2eaf data/ars_nouveau/loot_table/blocks/relay_warp.json +cac944832ef77dadfa9217f950fa995e762a5422 data/ars_nouveau/loot_table/blocks/repository.json +f93f19e982d57699feaaed5c19ed8fbc0dec4796 data/ars_nouveau/loot_table/blocks/ritual_brazier.json +8cb7ec62461732b94f263088750ea75273380bf4 data/ars_nouveau/loot_table/blocks/rotating_spell_turret.json +1e582aa987ca89e885741b61fa9229ebcdebce9d data/ars_nouveau/loot_table/blocks/sconce.json +26728e4a536530c8e335a606fca91f3ee99cb168 data/ars_nouveau/loot_table/blocks/scribes_table.json +984435831881b13c2c1bdecf041e8dd1ccb40bac data/ars_nouveau/loot_table/blocks/scryers_crystal.json +bc8435066f7b47edb7197fe0d207c44c0094f1c4 data/ars_nouveau/loot_table/blocks/scryers_oculus.json +faa169858abb5eb9e9d62d6f41954d98242ae42f data/ars_nouveau/loot_table/blocks/sky_block.json +674a56d476c613ddc975af252aa511d67c768130 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating.json +b048c81d1487ba7dd40189442ce11a5c6937317b data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating_slab.json +7aadcd3e56430fdfb7889374a4c4f7b732e8ce64 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating_stairs.json +f1423b08a0b72a3b4e0902a88d5a8f809f5cba19 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave.json +fba23f12624dd92b240e9180d963590082d55557 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave_slab.json +4723ffa800c362863d51e6994e558aca587311c4 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave_stairs.json +16a119ba4294d3f77af4f764a3d2aef403f3038f data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks.json +d1bb287d54cc2a4bcb8e093a60893f579a178ec1 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks_slab.json +75ec795e4aa1be4ebb0c7fe1b8636993eaa5d8ba data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks_stairs.json +4a3163207549d3f02541bf2039fab13e21803767 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic.json +ab9664200751134e23d539a824741ab30185cb41 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic_slab.json +b78795b7118976f7250d93827a9c80218ffe3ad0 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic_stairs.json +717886abf77f77f481af18662bd6b262bcef48f2 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks.json +283b1405945e3ecc25fcd4457097972077bc7e8f data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks_slab.json +d7cdfc8eaa9e40101eeb6185c1c4e9d5b9218243 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks_stairs.json +ccdb190d803f59c5ef8726d248830434d6c540d7 data/ars_nouveau/loot_table/blocks/smooth_sourcestone.json +67d31883c7dc6632265e7ec03fb5b739fab315d1 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating.json +9b046ee5f4bae2eb32d2db59cb7864bdc69d723e data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating_slab.json +a205a6b50ae311561b5d2bc29b188288141a299c data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating_stairs.json +b8733770850ea0012c67a3ec3d1e03134e6c13f9 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave.json +8a7c0327f56cc9496e18be413478f2b7983ec445 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave_slab.json +d7d0b68063bdabc0e0ff1b1ae3b17ed004173540 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave_stairs.json +c18b70f5e59d0ae6bdca21845da7f10c8baf2b46 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks.json +f5a1d6acb131a489129e1d0ab1a2c1f9de5156fd data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks_slab.json +0acf441f53f330991ef49828ff9b66e1c622b78a data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks_stairs.json +31cbc75aab2372f6a23567dd4372fccd23005ea1 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic.json +7d0c6a97a0e3d9d0c011526c9db258443c3225d5 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic_slab.json +be49357c6ee04402a71b75963b5b2e047fee8938 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic_stairs.json +18884920130d1ca32411fbdedb9a551fbbbe5e4f data/ars_nouveau/loot_table/blocks/smooth_sourcestone_slab.json +64897b76c33423b90e8eb17390fa7de0d9dfe9dc data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks.json +ee44c86873143caf5b8e9fc05d74acb98fa9f3b9 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks_slab.json +eda12a15644f4ac9fbf901cd738434df58db11a9 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks_stairs.json +62a4e61ba7b3bbd78d5cdca0cba621c98113638b data/ars_nouveau/loot_table/blocks/smooth_sourcestone_stairs.json +1fc8c5595757f818906588e2a7ad87f3ee7ad89d data/ars_nouveau/loot_table/blocks/sourceberry_sack.json +42e5040c6a81a4617c6ef147e12e17267bbbcd2a data/ars_nouveau/loot_table/blocks/sourcestone.json +b56aaf60ce3bafd66649843757a01d84d1cc8453 data/ars_nouveau/loot_table/blocks/sourcestone_alternating.json +56ae08dbfc2014ff8a2606d7e7e989c040d9d066 data/ars_nouveau/loot_table/blocks/sourcestone_alternating_slab.json +54175f8012d1f822f50d5703bcfcd99e4b0d3736 data/ars_nouveau/loot_table/blocks/sourcestone_alternating_stairs.json +491e38b7824baac8f6ac93c90f9edccf35f77707 data/ars_nouveau/loot_table/blocks/sourcestone_basketweave.json +e07e3d7b2e47f58dbe3db2575d250dd78acd1ca8 data/ars_nouveau/loot_table/blocks/sourcestone_basketweave_slab.json +00cfcfece665375c9df7bbe6f439eea43225e254 data/ars_nouveau/loot_table/blocks/sourcestone_basketweave_stairs.json +4feb095b7aec7b12712b22cbc8b0c80bfde72e29 data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks.json +03d6d7899db53d9fc380e7b88b2a8c03c524d55d data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks_slab.json +a9ccd94f6755cbac1a79c19bdb5a07fe1220a852 data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks_stairs.json +3df5edddb7ba8bcff233effb681a315a9011d539 data/ars_nouveau/loot_table/blocks/sourcestone_mosaic.json +3ccfc90bc256c162837acf8cce74d71387f918d8 data/ars_nouveau/loot_table/blocks/sourcestone_mosaic_slab.json +1e042e669e68da9bc47c3e7306b9ce47a3102e38 data/ars_nouveau/loot_table/blocks/sourcestone_mosaic_stairs.json +5a8e1094a4131655c1f2f83d2f0d545da41b74ef data/ars_nouveau/loot_table/blocks/sourcestone_sconce.json +f17397c3a6f7c57a5086773c548d6ca152d0739f data/ars_nouveau/loot_table/blocks/sourcestone_slab.json +065d119b33f7fb12f181b63105bd7bc40d65b079 data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks.json +4a2dbb5cc4f68b42d58c3c3da25b33f0b9cb3cbf data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks_slab.json +ecf0726adda255df3ff434ce3c33c041b04ece5f data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks_stairs.json +e92ecb490985aae22297d2f5cd5bcb5e625671b7 data/ars_nouveau/loot_table/blocks/sourcestone_stairs.json +5708d7c438d48789ab5d0f00a115bdebe340215b data/ars_nouveau/loot_table/blocks/source_gem_block.json +ffc0c8a426bf2b1cd56d2c4cd909a7289cd902f4 data/ars_nouveau/loot_table/blocks/source_jar.json +7cfca21047bb21713aaeec12060826e87c6cd4de data/ars_nouveau/loot_table/blocks/spell_prism.json +401055b950ac66d34a96e29f1666fd3c59244c0f data/ars_nouveau/loot_table/blocks/spell_sensor.json +2e038e8112b147e2a4d00e4a1d707541c89c421c data/ars_nouveau/loot_table/blocks/spell_turret.json +9ee66bf29aa157ad4254250a2471b6b0a8789355 data/ars_nouveau/loot_table/blocks/storage_lectern.json +9aaab2a4ead128014c2d59c87df70099a1df6a91 data/ars_nouveau/loot_table/blocks/stripped_blue_archwood_log.json +2f2e910c3358aaba61f6659bab3be24a8482ea93 data/ars_nouveau/loot_table/blocks/stripped_blue_archwood_wood.json +7845d4cd003da6b676c6a2567dc373aa1d2d7a8c data/ars_nouveau/loot_table/blocks/stripped_green_archwood_log.json +414eec71ea3a2f3d11a1ce6797bb1046afc119c3 data/ars_nouveau/loot_table/blocks/stripped_green_archwood_wood.json +508f43a5d8e9edc0df1895c3216b376d6ef3f6a7 data/ars_nouveau/loot_table/blocks/stripped_purple_archwood_log.json +000970bcb030af1b0966cf449b20d1c1934d8371 data/ars_nouveau/loot_table/blocks/stripped_purple_archwood_wood.json +7397be3ff36dd3a4199274affac7d79813d5c3b6 data/ars_nouveau/loot_table/blocks/stripped_red_archwood_log.json +4fdf99a777c15036d627f12d5ffe68e8fe74dbb3 data/ars_nouveau/loot_table/blocks/stripped_red_archwood_wood.json +5aff8275565145ae0e02d748a9076f36362ce067 data/ars_nouveau/loot_table/blocks/timer_spell_turret.json +8f418cce50e6d4c09d2a9c0e190b56ef41628010 data/ars_nouveau/loot_table/blocks/vitalic_sourcelink.json +9961fbe0d98b899ed331c4b52c8be082764fe178 data/ars_nouveau/loot_table/blocks/void_prism.json +b7c7dfedc82b75fad6c44b41b53664b086f17e20 data/ars_nouveau/loot_table/blocks/volcanic_sourcelink.json +5a7f8da8da17f592fe60568b87cba566dbfa6105 data/ars_nouveau/loot_table/blocks/wixie_cauldron.json +6a4107b990568ff31b9c3251ac2d03330dff96d7 data/ars_nouveau/loot_table/blocks/yellow_sbed.json diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/agronomic_sourcelink.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/agronomic_sourcelink.json new file mode 100644 index 0000000000..07664ec33c --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/agronomic_sourcelink.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:agronomic_sourcelink" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/agronomic_sourcelink" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/alchemical_sourcelink.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/alchemical_sourcelink.json new file mode 100644 index 0000000000..2c4299d630 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/alchemical_sourcelink.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:alchemical_sourcelink" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/alchemical_sourcelink" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/alteration_table.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/alteration_table.json new file mode 100644 index 0000000000..31b51f1af2 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/alteration_table.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "ars_nouveau:alteration_table", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "ars_nouveau:alteration_table" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/alteration_table" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/arcane_core.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/arcane_core.json new file mode 100644 index 0000000000..8a178ff910 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/arcane_core.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:arcane_core" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/arcane_core" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/arcane_pedestal.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/arcane_pedestal.json new file mode 100644 index 0000000000..16b7642602 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/arcane_pedestal.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:arcane_pedestal" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/arcane_pedestal" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/arcane_platform.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/arcane_platform.json new file mode 100644 index 0000000000..d1f8b05167 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/arcane_platform.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:arcane_platform" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/arcane_platform" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_button.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_button.json new file mode 100644 index 0000000000..7877e565df --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_button.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:archwood_button" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/archwood_button" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_chest.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_chest.json new file mode 100644 index 0000000000..52d0c97187 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_chest.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:archwood_chest" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/archwood_chest" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_door.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_door.json new file mode 100644 index 0000000000..409c189265 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_door.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "ars_nouveau:archwood_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "ars_nouveau:archwood_door" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/archwood_door" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_fence.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_fence.json new file mode 100644 index 0000000000..95812c2f4a --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_fence.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:archwood_fence" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/archwood_fence" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_fence_gate.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_fence_gate.json new file mode 100644 index 0000000000..e818ac6f6b --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_fence_gate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:archwood_fence_gate" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/archwood_fence_gate" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_planks.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_planks.json new file mode 100644 index 0000000000..1f024f0ad4 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_planks.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:archwood_planks" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/archwood_planks" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_pressure_plate.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_pressure_plate.json new file mode 100644 index 0000000000..19e423c682 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_pressure_plate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:archwood_pressure_plate" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/archwood_pressure_plate" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_sconce.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_sconce.json new file mode 100644 index 0000000000..89a486b6c5 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_sconce.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:archwood_sconce" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/archwood_sconce" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_slab.json new file mode 100644 index 0000000000..8ba1d14d86 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_slab.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "conditions": [ + { + "block": "ars_nouveau:archwood_slab", + "condition": "minecraft:block_state_property", + "properties": { + "type": "double" + } + } + ], + "count": 2.0, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "ars_nouveau:archwood_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/archwood_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_stairs.json new file mode 100644 index 0000000000..29a6eef36b --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:archwood_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/archwood_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_trapdoor.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_trapdoor.json new file mode 100644 index 0000000000..0fbbe2e38d --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_trapdoor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:archwood_trapdoor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/archwood_trapdoor" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/basic_spell_turret.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/basic_spell_turret.json new file mode 100644 index 0000000000..9b94805b5b --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/basic_spell_turret.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:basic_spell_turret" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/basic_spell_turret" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/bastion_pod.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/bastion_pod.json new file mode 100644 index 0000000000..a6c597364d --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/bastion_pod.json @@ -0,0 +1,32 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "conditions": [ + { + "block": "ars_nouveau:bastion_pod", + "condition": "minecraft:block_state_property", + "properties": { + "age": "2" + } + } + ], + "count": 3.0, + "function": "minecraft:set_count" + } + ], + "name": "ars_nouveau:bastion_pod" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/bastion_pod" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_archwood_leaves.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_archwood_leaves.json new file mode 100644 index 0000000000..22c9802f96 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_archwood_leaves.json @@ -0,0 +1,136 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": "minecraft:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ] + } + ], + "name": "ars_nouveau:blue_archwood_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "chances": [ + 0.05, + 0.0625, + 0.083333336, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "name": "ars_nouveau:blue_archwood_sapling" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": "minecraft:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/blue_archwood_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_archwood_log.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_archwood_log.json new file mode 100644 index 0000000000..467f7c7c45 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_archwood_log.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:blue_archwood_log" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/blue_archwood_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_archwood_sapling.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_archwood_sapling.json new file mode 100644 index 0000000000..2a61b9b690 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_archwood_sapling.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:blue_archwood_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/blue_archwood_sapling" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_archwood_wood.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_archwood_wood.json new file mode 100644 index 0000000000..d92c75a880 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_archwood_wood.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:blue_archwood_wood" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/blue_archwood_wood" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_sbed.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_sbed.json new file mode 100644 index 0000000000..7134f85399 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/blue_sbed.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:blue_sbed" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/blue_sbed" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/bombegranate_pod.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/bombegranate_pod.json new file mode 100644 index 0000000000..a4457e7064 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/bombegranate_pod.json @@ -0,0 +1,32 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "conditions": [ + { + "block": "ars_nouveau:bombegranate_pod", + "condition": "minecraft:block_state_property", + "properties": { + "age": "2" + } + } + ], + "count": 3.0, + "function": "minecraft:set_count" + } + ], + "name": "ars_nouveau:bombegranate_pod" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/bombegranate_pod" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/brazier_relay.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/brazier_relay.json new file mode 100644 index 0000000000..de954e7c54 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/brazier_relay.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:brazier_relay" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/brazier_relay" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/drygmy_stone.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/drygmy_stone.json new file mode 100644 index 0000000000..904695056e --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/drygmy_stone.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:mossy_cobblestone" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/drygmy_stone" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/enchanting_apparatus.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/enchanting_apparatus.json new file mode 100644 index 0000000000..446f8c8eb9 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/enchanting_apparatus.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:enchanting_apparatus" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/enchanting_apparatus" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/falseweave.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/falseweave.json new file mode 100644 index 0000000000..a9ad7144b7 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/falseweave.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:falseweave" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/falseweave" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/frostaya_pod.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/frostaya_pod.json new file mode 100644 index 0000000000..04159ed990 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/frostaya_pod.json @@ -0,0 +1,32 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "conditions": [ + { + "block": "ars_nouveau:frostaya_pod", + "condition": "minecraft:block_state_property", + "properties": { + "age": "2" + } + } + ], + "count": 3.0, + "function": "minecraft:set_count" + } + ], + "name": "ars_nouveau:frostaya_pod" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/frostaya_pod" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/ghostweave.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/ghostweave.json new file mode 100644 index 0000000000..6b0eed2e4e --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/ghostweave.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:ghostweave" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/ghostweave" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating.json new file mode 100644 index 0000000000..516acc8736 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:gilded_sourcestone_alternating" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_alternating" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating_slab.json new file mode 100644 index 0000000000..23165f94db --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:gilded_sourcestone_alternating_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_alternating_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating_stairs.json new file mode 100644 index 0000000000..9587826607 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:gilded_sourcestone_alternating_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_alternating_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave.json new file mode 100644 index 0000000000..d130cee12d --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:gilded_sourcestone_basketweave" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_basketweave" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave_slab.json new file mode 100644 index 0000000000..ae6f86b98c --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:gilded_sourcestone_basketweave_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_basketweave_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave_stairs.json new file mode 100644 index 0000000000..035cd03082 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:gilded_sourcestone_basketweave_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_basketweave_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks.json new file mode 100644 index 0000000000..e158c2fd1f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:gilded_sourcestone_large_bricks" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_large_bricks" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks_slab.json new file mode 100644 index 0000000000..6cbc62f58a --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:gilded_sourcestone_large_bricks_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_large_bricks_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks_stairs.json new file mode 100644 index 0000000000..b22cdf45b5 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:gilded_sourcestone_large_bricks_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_large_bricks_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic.json new file mode 100644 index 0000000000..7805fbb4f4 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:gilded_sourcestone_mosaic" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_mosaic" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic_slab.json new file mode 100644 index 0000000000..71d7dc82df --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:gilded_sourcestone_mosaic_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_mosaic_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic_stairs.json new file mode 100644 index 0000000000..ee3993d643 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:gilded_sourcestone_mosaic_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_mosaic_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks.json new file mode 100644 index 0000000000..8b629ed0a0 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:gilded_sourcestone_small_bricks" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_small_bricks" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks_slab.json new file mode 100644 index 0000000000..c5a78321ed --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:gilded_sourcestone_small_bricks_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_small_bricks_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks_stairs.json new file mode 100644 index 0000000000..b7ac94e3aa --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:gilded_sourcestone_small_bricks_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/gilded_sourcestone_small_bricks_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/green_archwood_leaves.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/green_archwood_leaves.json new file mode 100644 index 0000000000..d2cad80d8c --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/green_archwood_leaves.json @@ -0,0 +1,136 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": "minecraft:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ] + } + ], + "name": "ars_nouveau:green_archwood_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "chances": [ + 0.05, + 0.0625, + 0.083333336, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "name": "ars_nouveau:green_archwood_sapling" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": "minecraft:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/green_archwood_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/green_archwood_log.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/green_archwood_log.json new file mode 100644 index 0000000000..f0b6cf3098 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/green_archwood_log.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:green_archwood_log" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/green_archwood_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/green_archwood_sapling.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/green_archwood_sapling.json new file mode 100644 index 0000000000..d6576d24aa --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/green_archwood_sapling.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:green_archwood_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/green_archwood_sapling" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/green_archwood_wood.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/green_archwood_wood.json new file mode 100644 index 0000000000..0687716c8a --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/green_archwood_wood.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:green_archwood_wood" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/green_archwood_wood" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/green_sbed.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/green_sbed.json new file mode 100644 index 0000000000..2715dda94e --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/green_sbed.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:green_sbed" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/green_sbed" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/imbuement_chamber.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/imbuement_chamber.json new file mode 100644 index 0000000000..31e897246b --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/imbuement_chamber.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:imbuement_chamber" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/imbuement_chamber" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/item_detector.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/item_detector.json new file mode 100644 index 0000000000..943a9cb27a --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/item_detector.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:item_detector" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/item_detector" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/magebloom_block.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/magebloom_block.json new file mode 100644 index 0000000000..337a2d5268 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/magebloom_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:magebloom_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/magebloom_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/magelight_torch.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/magelight_torch.json new file mode 100644 index 0000000000..945a6281fe --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/magelight_torch.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:magelight_torch" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/magelight_torch" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/mendosteen_pod.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/mendosteen_pod.json new file mode 100644 index 0000000000..7befb4e2e9 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/mendosteen_pod.json @@ -0,0 +1,32 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "conditions": [ + { + "block": "ars_nouveau:mendosteen_pod", + "condition": "minecraft:block_state_property", + "properties": { + "age": "2" + } + } + ], + "count": 3.0, + "function": "minecraft:set_count" + } + ], + "name": "ars_nouveau:mendosteen_pod" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/mendosteen_pod" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/mirrorweave.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/mirrorweave.json new file mode 100644 index 0000000000..1d768d395b --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/mirrorweave.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:mirrorweave" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/mirrorweave" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/mob_jar.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/mob_jar.json new file mode 100644 index 0000000000..652052e259 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/mob_jar.json @@ -0,0 +1,38 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + }, + { + "function": "minecraft:copy_custom_data", + "ops": [ + { + "op": "replace", + "source": "entityTag", + "target": "BlockEntityTag.entityTag" + }, + { + "op": "replace", + "source": "entityId", + "target": "entityId" + } + ], + "source": "block_entity" + } + ], + "name": "ars_nouveau:mob_jar" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/mob_jar" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/mycelial_sourcelink.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/mycelial_sourcelink.json new file mode 100644 index 0000000000..8a83b1dd4d --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/mycelial_sourcelink.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:mycelial_sourcelink" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/mycelial_sourcelink" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/orange_sbed.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/orange_sbed.json new file mode 100644 index 0000000000..0e20fa7771 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/orange_sbed.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:orange_sbed" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/orange_sbed" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/polished_sconce.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/polished_sconce.json new file mode 100644 index 0000000000..e0afccbbf2 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/polished_sconce.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:polished_sconce" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/polished_sconce" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/potion_diffuser.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potion_diffuser.json new file mode 100644 index 0000000000..8a72fbe770 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potion_diffuser.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:potion_diffuser" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/potion_diffuser" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/potion_jar.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potion_jar.json new file mode 100644 index 0000000000..3f25256e9e --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potion_jar.json @@ -0,0 +1,53 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + }, + { + "function": "minecraft:copy_custom_data", + "ops": [ + { + "op": "replace", + "source": "potionData", + "target": "BlockEntityTag.potionData" + }, + { + "op": "replace", + "source": "currentFill", + "target": "BlockEntityTag.currentFill" + }, + { + "op": "replace", + "source": "locked", + "target": "BlockEntityTag.locked" + }, + { + "op": "replace", + "source": "potionNames", + "target": "potionNames" + }, + { + "op": "replace", + "source": "currentFill", + "target": "fill" + } + ], + "source": "block_entity" + } + ], + "name": "ars_nouveau:potion_jar" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/potion_jar" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/potion_melder.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potion_melder.json new file mode 100644 index 0000000000..df301ed409 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potion_melder.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:potion_melder" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/potion_melder" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_blue_archwood_sapling.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_blue_archwood_sapling.json new file mode 100644 index 0000000000..23c2c30bc6 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_blue_archwood_sapling.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:blue_archwood_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/potted_blue_archwood_sapling" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_green_archwood_sapling.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_green_archwood_sapling.json new file mode 100644 index 0000000000..eb98e64cb8 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_green_archwood_sapling.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:green_archwood_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/potted_green_archwood_sapling" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_magebloom_crop.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_magebloom_crop.json new file mode 100644 index 0000000000..654f9d606f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_magebloom_crop.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:magebloom_crop" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/potted_magebloom_crop" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_purple_archwood_sapling.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_purple_archwood_sapling.json new file mode 100644 index 0000000000..fbf8cbb84e --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_purple_archwood_sapling.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:purple_archwood_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/potted_purple_archwood_sapling" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_red_archwood_sapling.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_red_archwood_sapling.json new file mode 100644 index 0000000000..43cb202433 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potted_red_archwood_sapling.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:red_archwood_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/potted_red_archwood_sapling" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_archwood_leaves.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_archwood_leaves.json new file mode 100644 index 0000000000..6e4ee2583e --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_archwood_leaves.json @@ -0,0 +1,136 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": "minecraft:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ] + } + ], + "name": "ars_nouveau:purple_archwood_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "chances": [ + 0.05, + 0.0625, + 0.083333336, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "name": "ars_nouveau:purple_archwood_sapling" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": "minecraft:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/purple_archwood_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_archwood_log.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_archwood_log.json new file mode 100644 index 0000000000..1a110faec2 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_archwood_log.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:purple_archwood_log" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/purple_archwood_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_archwood_sapling.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_archwood_sapling.json new file mode 100644 index 0000000000..a04a509cd7 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_archwood_sapling.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:purple_archwood_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/purple_archwood_sapling" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_archwood_wood.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_archwood_wood.json new file mode 100644 index 0000000000..41e54b3cb5 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_archwood_wood.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:purple_archwood_wood" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/purple_archwood_wood" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_sbed.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_sbed.json new file mode 100644 index 0000000000..19a8cf847c --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/purple_sbed.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:purple_sbed" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/purple_sbed" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/red_archwood_leaves.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/red_archwood_leaves.json new file mode 100644 index 0000000000..26eee9d655 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/red_archwood_leaves.json @@ -0,0 +1,136 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": "minecraft:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ] + } + ], + "name": "ars_nouveau:red_archwood_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "chances": [ + 0.05, + 0.0625, + 0.083333336, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "name": "ars_nouveau:red_archwood_sapling" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": "minecraft:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/red_archwood_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/red_archwood_log.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/red_archwood_log.json new file mode 100644 index 0000000000..de6fa64ed1 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/red_archwood_log.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:red_archwood_log" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/red_archwood_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/red_archwood_sapling.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/red_archwood_sapling.json new file mode 100644 index 0000000000..291a4acea2 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/red_archwood_sapling.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:red_archwood_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/red_archwood_sapling" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/red_archwood_wood.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/red_archwood_wood.json new file mode 100644 index 0000000000..d922b0c466 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/red_archwood_wood.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:red_archwood_wood" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/red_archwood_wood" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/red_sbed.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/red_sbed.json new file mode 100644 index 0000000000..7cc50e4998 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/red_sbed.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:red_sbed" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/red_sbed" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/redstone_relay.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/redstone_relay.json new file mode 100644 index 0000000000..af4b738890 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/redstone_relay.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:redstone_relay" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/redstone_relay" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/relay.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/relay.json new file mode 100644 index 0000000000..fdeb4cace0 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/relay.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:relay" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/relay" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/relay_collector.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/relay_collector.json new file mode 100644 index 0000000000..8e6033eaa9 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/relay_collector.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:relay_collector" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/relay_collector" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/relay_deposit.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/relay_deposit.json new file mode 100644 index 0000000000..de241742a7 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/relay_deposit.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:relay_deposit" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/relay_deposit" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/relay_splitter.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/relay_splitter.json new file mode 100644 index 0000000000..5b29cb1deb --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/relay_splitter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:relay_splitter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/relay_splitter" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/relay_warp.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/relay_warp.json new file mode 100644 index 0000000000..492df76fd6 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/relay_warp.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:relay_warp" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/relay_warp" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/repository.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/repository.json new file mode 100644 index 0000000000..a4b1fd61dc --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/repository.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "ars_nouveau:repository" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/repository" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/ritual_brazier.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/ritual_brazier.json new file mode 100644 index 0000000000..62deb79813 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/ritual_brazier.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:ritual_brazier" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/ritual_brazier" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/rotating_spell_turret.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/rotating_spell_turret.json new file mode 100644 index 0000000000..cef109b7e7 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/rotating_spell_turret.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:rotating_spell_turret" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/rotating_spell_turret" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sconce.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sconce.json new file mode 100644 index 0000000000..c27f5f22e3 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sconce.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sconce" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sconce" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/scribes_table.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/scribes_table.json new file mode 100644 index 0000000000..cc27bb9c00 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/scribes_table.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "ars_nouveau:scribes_table", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "ars_nouveau:scribes_table" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/scribes_table" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/scryers_crystal.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/scryers_crystal.json new file mode 100644 index 0000000000..b27e9bf688 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/scryers_crystal.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:scryers_crystal" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/scryers_crystal" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/scryers_oculus.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/scryers_oculus.json new file mode 100644 index 0000000000..ac49f4d9e9 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/scryers_oculus.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:scryers_oculus" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/scryers_oculus" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sky_block.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sky_block.json new file mode 100644 index 0000000000..41f20e0e4e --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sky_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sky_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sky_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating.json new file mode 100644 index 0000000000..cd58c262ed --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_gilded_sourcestone_alternating" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_alternating" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating_slab.json new file mode 100644 index 0000000000..c390eb0b1e --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_gilded_sourcestone_alternating_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_alternating_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating_stairs.json new file mode 100644 index 0000000000..ab840282e5 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_gilded_sourcestone_alternating_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_alternating_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave.json new file mode 100644 index 0000000000..91e0332113 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_gilded_sourcestone_basketweave" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_basketweave" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave_slab.json new file mode 100644 index 0000000000..5dec419028 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_gilded_sourcestone_basketweave_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_basketweave_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave_stairs.json new file mode 100644 index 0000000000..45a239ec1d --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_gilded_sourcestone_basketweave_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_basketweave_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks.json new file mode 100644 index 0000000000..9e9a23f4b2 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_gilded_sourcestone_large_bricks" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_large_bricks" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks_slab.json new file mode 100644 index 0000000000..ffef312ddd --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_gilded_sourcestone_large_bricks_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_large_bricks_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks_stairs.json new file mode 100644 index 0000000000..5a6506e50b --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_gilded_sourcestone_large_bricks_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_large_bricks_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic.json new file mode 100644 index 0000000000..99172fb5e7 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_gilded_sourcestone_mosaic" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_mosaic" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic_slab.json new file mode 100644 index 0000000000..85796944d6 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_gilded_sourcestone_mosaic_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_mosaic_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic_stairs.json new file mode 100644 index 0000000000..0c671dbba9 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_gilded_sourcestone_mosaic_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_mosaic_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks.json new file mode 100644 index 0000000000..a0e31cde8d --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_gilded_sourcestone_small_bricks" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_small_bricks" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks_slab.json new file mode 100644 index 0000000000..0a1c60b2ad --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_gilded_sourcestone_small_bricks_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_small_bricks_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks_stairs.json new file mode 100644 index 0000000000..1adb169902 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_gilded_sourcestone_small_bricks_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_gilded_sourcestone_small_bricks_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone.json new file mode 100644 index 0000000000..a9e4cc4222 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating.json new file mode 100644 index 0000000000..a5fff31689 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_alternating" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_alternating" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating_slab.json new file mode 100644 index 0000000000..94500d8034 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_alternating_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_alternating_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating_stairs.json new file mode 100644 index 0000000000..6e558aac5d --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_alternating_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_alternating_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave.json new file mode 100644 index 0000000000..aaf5ae1f26 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_basketweave" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_basketweave" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave_slab.json new file mode 100644 index 0000000000..7d4681558f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_basketweave_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_basketweave_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave_stairs.json new file mode 100644 index 0000000000..20a74c1f50 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_basketweave_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_basketweave_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks.json new file mode 100644 index 0000000000..04dbd0b50e --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_large_bricks" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_large_bricks" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks_slab.json new file mode 100644 index 0000000000..045a8e8461 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_large_bricks_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_large_bricks_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks_stairs.json new file mode 100644 index 0000000000..b7b767c760 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_large_bricks_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_large_bricks_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic.json new file mode 100644 index 0000000000..dc7d46e234 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_mosaic" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_mosaic" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic_slab.json new file mode 100644 index 0000000000..5a08f4b876 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_mosaic_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_mosaic_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic_stairs.json new file mode 100644 index 0000000000..bc55e58a00 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_mosaic_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_mosaic_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_slab.json new file mode 100644 index 0000000000..9887f7fe71 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks.json new file mode 100644 index 0000000000..8a2d153524 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_small_bricks" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_small_bricks" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks_slab.json new file mode 100644 index 0000000000..02eb63ee73 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_small_bricks_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_small_bricks_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks_stairs.json new file mode 100644 index 0000000000..3807a2389c --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_small_bricks_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_small_bricks_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_stairs.json new file mode 100644 index 0000000000..4486daa88f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/source_gem_block.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/source_gem_block.json new file mode 100644 index 0000000000..15f171428c --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/source_gem_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:source_gem_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/source_gem_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/source_jar.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/source_jar.json new file mode 100644 index 0000000000..cc0aa1d0e4 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/source_jar.json @@ -0,0 +1,38 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + }, + { + "function": "minecraft:copy_custom_data", + "ops": [ + { + "op": "replace", + "source": "inv", + "target": "BlockEntityTag.inv" + }, + { + "op": "replace", + "source": "source", + "target": "BlockEntityTag.source" + } + ], + "source": "block_entity" + } + ], + "name": "ars_nouveau:source_jar" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/source_jar" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourceberry_sack.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourceberry_sack.json new file mode 100644 index 0000000000..f1b697d569 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourceberry_sack.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourceberry_sack" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourceberry_sack" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone.json new file mode 100644 index 0000000000..b0e1bdb774 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_alternating.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_alternating.json new file mode 100644 index 0000000000..1899e5b155 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_alternating.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_alternating" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_alternating" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_alternating_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_alternating_slab.json new file mode 100644 index 0000000000..031b834197 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_alternating_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_alternating_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_alternating_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_alternating_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_alternating_stairs.json new file mode 100644 index 0000000000..066a0712af --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_alternating_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_alternating_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_alternating_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_basketweave.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_basketweave.json new file mode 100644 index 0000000000..64da270655 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_basketweave.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_basketweave" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_basketweave" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_basketweave_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_basketweave_slab.json new file mode 100644 index 0000000000..6b9307bf10 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_basketweave_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_basketweave_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_basketweave_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_basketweave_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_basketweave_stairs.json new file mode 100644 index 0000000000..7bacc5beb7 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_basketweave_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_basketweave_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_basketweave_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks.json new file mode 100644 index 0000000000..34dfc73dad --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_large_bricks" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_large_bricks" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks_slab.json new file mode 100644 index 0000000000..065ac54392 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_large_bricks_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_large_bricks_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks_stairs.json new file mode 100644 index 0000000000..c9b6d032eb --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_large_bricks_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_large_bricks_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_mosaic.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_mosaic.json new file mode 100644 index 0000000000..4e670b8fe6 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_mosaic.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_mosaic" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_mosaic" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_mosaic_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_mosaic_slab.json new file mode 100644 index 0000000000..12d00f65ab --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_mosaic_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_mosaic_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_mosaic_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_mosaic_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_mosaic_stairs.json new file mode 100644 index 0000000000..c13ea1f393 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_mosaic_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_mosaic_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_mosaic_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_sconce.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_sconce.json new file mode 100644 index 0000000000..d6a4523709 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_sconce.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_sconce" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_sconce" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_slab.json new file mode 100644 index 0000000000..2b049319da --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks.json new file mode 100644 index 0000000000..b0ffae23e3 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_small_bricks" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_small_bricks" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks_slab.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks_slab.json new file mode 100644 index 0000000000..89cf5a5b56 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_small_bricks_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_small_bricks_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks_stairs.json new file mode 100644 index 0000000000..70f5299c4e --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_small_bricks_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_small_bricks_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_stairs.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_stairs.json new file mode 100644 index 0000000000..a12c995523 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/spell_prism.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/spell_prism.json new file mode 100644 index 0000000000..ffe0bc359c --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/spell_prism.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:spell_prism" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/spell_prism" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/spell_sensor.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/spell_sensor.json new file mode 100644 index 0000000000..722e413bff --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/spell_sensor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:spell_sensor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/spell_sensor" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/spell_turret.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/spell_turret.json new file mode 100644 index 0000000000..3cf1ffff4a --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/spell_turret.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:spell_turret" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/spell_turret" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/storage_lectern.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/storage_lectern.json new file mode 100644 index 0000000000..25e720fb47 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/storage_lectern.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:storage_lectern" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/storage_lectern" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_blue_archwood_log.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_blue_archwood_log.json new file mode 100644 index 0000000000..f823daa843 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_blue_archwood_log.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:stripped_blue_archwood_log" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/stripped_blue_archwood_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_blue_archwood_wood.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_blue_archwood_wood.json new file mode 100644 index 0000000000..b0706644ee --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_blue_archwood_wood.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:stripped_blue_archwood_wood" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/stripped_blue_archwood_wood" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_green_archwood_log.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_green_archwood_log.json new file mode 100644 index 0000000000..c583f2caf4 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_green_archwood_log.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:stripped_green_archwood_log" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/stripped_green_archwood_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_green_archwood_wood.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_green_archwood_wood.json new file mode 100644 index 0000000000..7d80281066 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_green_archwood_wood.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:stripped_green_archwood_wood" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/stripped_green_archwood_wood" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_purple_archwood_log.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_purple_archwood_log.json new file mode 100644 index 0000000000..4732b47297 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_purple_archwood_log.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:stripped_purple_archwood_log" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/stripped_purple_archwood_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_purple_archwood_wood.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_purple_archwood_wood.json new file mode 100644 index 0000000000..ea0c848da2 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_purple_archwood_wood.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:stripped_purple_archwood_wood" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/stripped_purple_archwood_wood" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_red_archwood_log.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_red_archwood_log.json new file mode 100644 index 0000000000..dff2ba796c --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_red_archwood_log.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:stripped_red_archwood_log" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/stripped_red_archwood_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_red_archwood_wood.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_red_archwood_wood.json new file mode 100644 index 0000000000..d3a1aa10d8 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/stripped_red_archwood_wood.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:stripped_red_archwood_wood" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/stripped_red_archwood_wood" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/timer_spell_turret.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/timer_spell_turret.json new file mode 100644 index 0000000000..cd161a66df --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/timer_spell_turret.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:timer_spell_turret" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/timer_spell_turret" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/vitalic_sourcelink.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/vitalic_sourcelink.json new file mode 100644 index 0000000000..ed2a0aa978 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/vitalic_sourcelink.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:vitalic_sourcelink" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/vitalic_sourcelink" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/void_prism.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/void_prism.json new file mode 100644 index 0000000000..240e38a256 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/void_prism.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:void_prism" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/void_prism" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/volcanic_sourcelink.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/volcanic_sourcelink.json new file mode 100644 index 0000000000..889d6d66c2 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/volcanic_sourcelink.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:volcanic_sourcelink" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/volcanic_sourcelink" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/wixie_cauldron.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/wixie_cauldron.json new file mode 100644 index 0000000000..2d994baee4 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/wixie_cauldron.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:cauldron" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/wixie_cauldron" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/yellow_sbed.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/yellow_sbed.json new file mode 100644 index 0000000000..83a2a3672d --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/yellow_sbed.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:yellow_sbed" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/yellow_sbed" +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java index 1cdd85e842..d4fd3cf70a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java @@ -1,306 +1,349 @@ package com.hollingsworth.arsnouveau.common.datagen; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.common.block.AlterationTable; +import com.hollingsworth.arsnouveau.common.block.ArchfruitPod; +import com.hollingsworth.arsnouveau.common.block.ScribesBlock; +import com.hollingsworth.arsnouveau.common.block.ThreePartBlock; +import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; +import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.BlockRegistryWrapper; +import com.hollingsworth.arsnouveau.setup.registry.RegistryWrapper; +import net.minecraft.advancements.critereon.StatePropertiesPredicate; import net.minecraft.core.HolderLookup; +import net.minecraft.core.WritableRegistry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.PackOutput; +import net.minecraft.data.loot.BlockLootSubProvider; +import net.minecraft.data.loot.EntityLootSubProvider; import net.minecraft.data.loot.LootTableProvider; import net.minecraft.resources.ResourceKey; +import net.minecraft.util.ProblemReporter; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.FlowerPotBlock; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.state.properties.Property; +import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.world.level.storage.loot.BuiltInLootTables; +import net.minecraft.world.level.storage.loot.LootPool; import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.ValidationContext; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.functions.CopyCustomDataFunction; +import net.minecraft.world.level.storage.loot.functions.CopyNameFunction; +import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition; +import net.minecraft.world.level.storage.loot.providers.nbt.ContextNbtProvider; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.function.BiConsumer; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class DefaultTableProvider extends LootTableProvider { //todo: reenable loot tables public DefaultTableProvider(PackOutput pOutput, Set> pRequiredTables, List pSubProviders, CompletableFuture pRegistries) { super(pOutput, pRequiredTables, pSubProviders, pRegistries); } -// public DefaultTableProvider(PackOutput pOutput, CompletableFuture pRegistries) { -// super(pOutput, new HashSet<>(), List.of(new LootTableProvider.SubProviderEntry(BlockLootTable::new, LootContextParamSets.BLOCK), new LootTableProvider.SubProviderEntry(EntityLootTable::new, LootContextParamSets.ENTITY)), pRegistries); -// } -// -// private static final float[] DEFAULT_SAPLING_DROP_RATES = new float[]{0.05F, 0.0625F, 0.083333336F, 0.1F}; -// -// public static class BlockLootTable extends BlockLootSubProvider { -// public List list = new ArrayList<>(); -// -// protected BlockLootTable() { -// super(Set.of(), FeatureFlags.REGISTRY.allFlags(), new HashMap<>()); -// } -// -// @Override -// protected void generate() { -// registerDropSelf(BlockRegistry.ENCHANTED_SPELL_TURRET); -// -// registerDropSelf(BlockRegistry.BLAZING_LOG); -// registerDropSelf(BlockRegistry.VEXING_LOG); -// registerDropSelf(BlockRegistry.CASCADING_LOG); -// registerDropSelf(BlockRegistry.FLOURISHING_LOG); -// -// registerDropSelf(BlockRegistry.BLAZING_SAPLING); -// registerDropSelf(BlockRegistry.VEXING_SAPLING); -// registerDropSelf(BlockRegistry.CASCADING_SAPLING); -// registerDropSelf(BlockRegistry.FLOURISHING_SAPLING); -// registerDropSelf(BlockRegistry.ARCHWOOD_PLANK); -// -// registerDrop(BlockRegistry.WIXIE_CAULDRON.get(), Items.CAULDRON); -// for (FlowerPotBlock pot : BlockRegistry.flowerPots.values()) { -// list.add(pot); -// dropPottedContents(pot); -// } -// -// registerLeavesAndSticks(BlockRegistry.BLAZING_LEAVES.get(), BlockRegistry.BLAZING_SAPLING.get()); -// registerLeavesAndSticks(BlockRegistry.CASCADING_LEAVE.get(), BlockRegistry.CASCADING_SAPLING.get()); -// registerLeavesAndSticks(BlockRegistry.FLOURISHING_LEAVES.get(), BlockRegistry.FLOURISHING_SAPLING.get()); -// registerLeavesAndSticks(BlockRegistry.VEXING_LEAVES.get(), BlockRegistry.VEXING_SAPLING.get()); -// -// -// registerDropSelf(BlockRegistry.BLAZING_WOOD); -// registerDropSelf(BlockRegistry.VEXING_WOOD); -// registerDropSelf(BlockRegistry.CASCADING_WOOD); -// registerDropSelf(BlockRegistry.FLOURISHING_WOOD); -// -// registerDropSelf(BlockRegistry.ARCHWOOD_BUTTON); -// registerDropSelf(BlockRegistry.ARCHWOOD_STAIRS); -// registerSlabItemTable(BlockRegistry.ARCHWOOD_SLABS.get()); -// registerDropSelf(BlockRegistry.MAGELIGHT_TORCH); -// -// // registerDropSelf(BlockRegistry.ARCHWOOD_SIGN); -// registerDropSelf(BlockRegistry.ARCHWOOD_FENCE_GATE); -// registerDropSelf(BlockRegistry.ARCHWOOD_TRAPDOOR); -// registerDropSelf(BlockRegistry.ARCHWOOD_PPlate); -// registerDropSelf(BlockRegistry.ARCHWOOD_FENCE); -// registerDropSelf(BlockRegistry.STRIPPED_AWLOG_BLUE); -// registerDropSelf(BlockRegistry.STRIPPED_AWWOOD_BLUE); -// registerDropSelf(BlockRegistry.STRIPPED_AWLOG_GREEN); -// registerDropSelf(BlockRegistry.STRIPPED_AWWOOD_GREEN); -// registerDropSelf(BlockRegistry.STRIPPED_AWLOG_RED); -// registerDropSelf(BlockRegistry.STRIPPED_AWWOOD_RED); -// registerDropSelf(BlockRegistry.STRIPPED_AWLOG_PURPLE); -// registerDropSelf(BlockRegistry.STRIPPED_AWWOOD_PURPLE); -// registerDropDoor(BlockRegistry.ARCHWOOD_DOOR.get()); -// registerDropSelf(BlockRegistry.SOURCE_GEM_BLOCK); -// -// registerDropSelf(BlockRegistry.POTION_MELDER); -// registerDropSelf(BlockRegistry.RITUAL_BLOCK); -// registerDropSelf(BlockRegistry.GOLD_SCONCE_BLOCK); -// registerBedCondition(BlockRegistry.SCRIBES_BLOCK.get(), ScribesBlock.PART, ThreePartBlock.HEAD); -// registerDrop(BlockRegistry.DRYGMY_BLOCK.get(), Items.MOSSY_COBBLESTONE); -// -// registerDropSelf(BlockRegistry.VITALIC_BLOCK); -// registerDropSelf(BlockRegistry.ALCHEMICAL_BLOCK); -// registerDropSelf(BlockRegistry.MYCELIAL_BLOCK); -// registerDropSelf(BlockRegistry.TIMER_SPELL_TURRET); -// registerDropSelf(BlockRegistry.BASIC_SPELL_TURRET); -// -// registerDropSelf(BlockRegistry.ARCHWOOD_CHEST); -// registerDropSelf(BlockRegistry.SPELL_PRISM); -// -// registerDropSelf(BlockRegistry.AGRONOMIC_SOURCELINK); -// registerDropSelf(BlockRegistry.ENCHANTING_APP_BLOCK); -// registerDropSelf(BlockRegistry.ARCANE_PEDESTAL); -// registerDropSelf(BlockRegistry.ARCANE_PLATFORM); -// registerDropSelf(BlockRegistry.RELAY); -// registerDropSelf(BlockRegistry.RELAY_SPLITTER); -// registerDropSelf(BlockRegistry.ARCANE_CORE_BLOCK); -// registerDropSelf(BlockRegistry.IMBUEMENT_BLOCK); -// registerDropSelf(BlockRegistry.VOLCANIC_BLOCK); -// registerDropSelf(BlockRegistry.BRAZIER_RELAY); -// -// registerDropSelf(BlockRegistry.RELAY_WARP); -// registerDropSelf(BlockRegistry.RELAY_DEPOSIT); -// registerDropSelf(BlockRegistry.RELAY_COLLECTOR); -// registerDropSelf(BlockRegistry.CRAFTING_LECTERN.get()); -// registerDropSelf(BlockRegistry.RED_SBED); -// registerDropSelf(BlockRegistry.YELLOW_SBED); -// registerDropSelf(BlockRegistry.GREEN_SBED); -// registerDropSelf(BlockRegistry.PURPLE_SBED); -// registerDropSelf(BlockRegistry.BLUE_SBED); -// registerDropSelf(BlockRegistry.ORANGE_SBED); -// registerDropSelf(BlockRegistry.SCRYERS_CRYSTAL); -// registerDropSelf(BlockRegistry.SCRYERS_OCULUS); -// registerDropSelf(BlockRegistry.POTION_DIFFUSER); -// for (String s : LibBlockNames.DECORATIVE_SOURCESTONE) { -// registerDropSelf(BlockRegistry.getBlock(s)); -// Block block = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s + "_stairs")); -// registerDropSelf(block); -// Block slab = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s + "_slab")); -// registerDropSelf(slab); -// -// } -// registerBedCondition(BlockRegistry.ALTERATION_TABLE.get(), AlterationTable.PART, ThreePartBlock.HEAD); -// registerDropSelf(BlockRegistry.VOID_PRISM); -// registerDropSelf(BlockRegistry.MAGEBLOOM_BLOCK); -// registerDropSelf(BlockRegistry.GHOST_WEAVE); -// registerDropSelf(BlockRegistry.FALSE_WEAVE); -// registerDropSelf(BlockRegistry.MIRROR_WEAVE); -// registerDropSelf(BlockRegistry.ITEM_DETECTOR); -// registerDropSelf(BlockRegistry.SKY_WEAVE); -// registerDropSelf(BlockRegistry.ROTATING_TURRET); -// registerDropSelf(BlockRegistry.SPELL_SENSOR); -// -// add(BlockRegistry.SOURCE_JAR.get(), createManaManchineTable(BlockRegistry.SOURCE_JAR.get())); -// -// LootPool.Builder potionJarBuilder = LootPool.lootPool() -// .setRolls(ConstantValue.exactly(1)) -// .add(LootItem.lootTableItem(BlockRegistry.POTION_JAR) -// .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) -// .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) -// .copy("potionData", "BlockEntityTag.potionData", CopyCustomDataFunction.MergeStrategy.REPLACE) -// .copy("currentFill", "BlockEntityTag.currentFill", CopyCustomDataFunction.MergeStrategy.REPLACE) -// .copy("locked", "BlockEntityTag.locked", CopyCustomDataFunction.MergeStrategy.REPLACE) -// .copy("potionNames", "potionNames", CopyCustomDataFunction.MergeStrategy.REPLACE) -// .copy("currentFill", "fill", CopyCustomDataFunction.MergeStrategy.REPLACE)) -// ); -// add(BlockRegistry.POTION_JAR.get(), LootTable.lootTable().withPool(potionJarBuilder)); -// add(BlockRegistry.BASTION_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.BASTION_POD.asItem(), BlockRegistry.BASTION_POD.get()))); -// add(BlockRegistry.MENDOSTEEN_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.MENDOSTEEN_POD.asItem(), BlockRegistry.MENDOSTEEN_POD.get()))); -// add(BlockRegistry.FROSTAYA_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.FROSTAYA_POD.asItem(), BlockRegistry.FROSTAYA_POD.get()))); -// add(BlockRegistry.BOMBEGRANTE_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.BOMBEGRANTE_POD.asItem(), BlockRegistry.BOMBEGRANTE_POD.get()))); -// -// LootPool.Builder mobJarBuilder = LootPool.lootPool() -// .setRolls(ConstantValue.exactly(1)) -// .add(LootItem.lootTableItem(BlockRegistry.MOB_JAR) -// .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) -// .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) -// .copy("entityTag", "BlockEntityTag.entityTag", CopyCustomDataFunction.MergeStrategy.REPLACE) -// .copy("entityId", "entityId", CopyCustomDataFunction.MergeStrategy.REPLACE)) -// ); -// add(BlockRegistry.MOB_JAR.get(), LootTable.lootTable().withPool(mobJarBuilder)); -// //CustomName -// LootPool.Builder repository = LootPool.lootPool() -// .setRolls(ConstantValue.exactly(1)) -// .add(LootItem.lootTableItem(BlockRegistry.REPOSITORY) -// .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY))); -// add(BlockRegistry.REPOSITORY.get(), LootTable.lootTable().withPool(repository)); -// registerDropSelf(BlockRegistry.SOURCESTONE_SCONCE_BLOCK.get()); -// registerDropSelf(BlockRegistry.POLISHED_SCONCE_BLOCK.get()); -// registerDropSelf(BlockRegistry.ARCHWOOD_SCONCE_BLOCK.get()); -// registerDropSelf(BlockRegistry.REDSTONE_RELAY.get()); -// registerDropSelf(BlockRegistry.SOURCEBERRY_SACK.get()); -// } -// -// @Override -// protected void add(Block pBlock, LootTable.Builder pBuilder) { -// list.add(pBlock); -// super.add(pBlock, pBuilder); -// } -// -// @Override -// protected void add(Block pBlock, Function pFactory) { -// list.add(pBlock); -// super.add(pBlock, pFactory); -// } -// -// -// protected void add(RegistryWrapper pBlock, LootTable.Builder pBuilder) { -// add(pBlock.get(), pBuilder); -// } -// -// -// protected void add(RegistryWrapper pBlock, Function pFactory) { -// add(pBlock.get(), pFactory); -// } -// -// public LootPool.Builder POD_BUILDER(Item item, Block block) { -// return LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) -// .add(LootItem.lootTableItem(item) -// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(3.0F)) -// .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(block) -// .setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(ArchfruitPod.AGE, 2))))); -// } -// -// public LootTable.Builder createManaManchineTable(Block block) { -// LootPool.Builder builder = LootPool.lootPool() -// .setRolls(ConstantValue.exactly(1)) -// .add(LootItem.lootTableItem(block) -// .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) -// .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) -// .copy("inv", "BlockEntityTag.inv", CopyCustomDataFunction.MergeStrategy.REPLACE) //addOperation -// .copy("source", "BlockEntityTag.source", CopyCustomDataFunction.MergeStrategy.REPLACE)) -// ); -// return LootTable.lootTable().withPool(builder); -// } -// -// protected void registerSlabItemTable(Block p_124291_) { -// list.add(p_124291_); -// this.add(p_124291_, LootTable.lootTable().withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) -// .add(applyExplosionDecay(p_124291_, LootItem.lootTableItem(p_124291_).apply(SetItemCountFunction.setCount(ConstantValue.exactly(2.0F)) -// .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(p_124291_).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(SlabBlock.TYPE, SlabType.DOUBLE)))))))); -// -// } -// -// // Override and ignore the missing loot table error -// -// -// @Override -// public void generate(BiConsumer, LootTable.Builder> pGenerator) { -// this.generate(); -// Set> set = new HashSet<>(); -// -// for (Block block : list) { -// if (block.isEnabled(this.enabledFeatures)) { -// ResourceKey resourcelocation = block.getLootTable(); -// if (resourcelocation != BuiltInLootTables.EMPTY && set.add(resourcelocation)) { -// LootTable.Builder loottable$builder = this.map.remove(resourcelocation); -// if (loottable$builder == null) { -// continue; -// } -// -// pGenerator.accept(resourcelocation, loottable$builder); -// } -// } -// } -// } -// -// protected & StringRepresentable> void registerBedCondition(Block block, Property prop, T isValue) { -// list.add(block); -// this.add(block, LootTable.lootTable().withPool(applyExplosionCondition(block, LootPool.lootPool().setRolls(ConstantValue.exactly(1)) -// .add(LootItem.lootTableItem(block).when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(block).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(prop, isValue))))))); -// } -// -// public void registerLeavesAndSticks(Block leaves, Block sapling) { -// list.add(leaves); -// this.add(leaves, l_state -> createLeavesDrops(l_state, sapling, DEFAULT_SAPLING_DROP_RATES)); -// } -// -// public void registerDropDoor(Block block) { -// list.add(block); -// this.add(block, createDoorTable(block)); -// } -// -// private void registerDropSelf(BlockRegistryWrapper block) { -// registerDropSelf(block.get()); -// } -// -// public void registerDropSelf(Block block) { -// list.add(block); -// dropSelf(block); -// } -// -// public void registerDrop(Block input, ItemLike output) { -// list.add(input); -// dropOther(input, output); -// } -// -// @Override -// protected Iterable getKnownBlocks() { -// return BuiltInRegistries.BLOCK.stream().filter(block -> BuiltInRegistries.BLOCK.getKey(block).getNamespace().equals(ArsNouveau.MODID)).collect(Collectors.toList()); -// } -// -// } -// -// -// public static class EntityLootTable extends EntityLootSubProvider { -// private final Map, Map, LootTable.Builder>> map = Maps.newHashMap(); -// -// protected EntityLootTable() { -// super(FeatureFlags.REGISTRY.allFlags()); -// } -// -// @Override -// public void generate() { + public DefaultTableProvider(PackOutput pOutput, CompletableFuture pRegistries) { + super(pOutput, new HashSet<>(), List.of(new LootTableProvider.SubProviderEntry(BlockLootTable::new, LootContextParamSets.BLOCK), new LootTableProvider.SubProviderEntry(EntityLootTable::new, LootContextParamSets.ENTITY)), pRegistries); + } + + private static final float[] DEFAULT_SAPLING_DROP_RATES = new float[]{0.05F, 0.0625F, 0.083333336F, 0.1F}; + + public static class BlockLootTable extends BlockLootSubProvider { + public List list = new ArrayList<>(); + + protected BlockLootTable(HolderLookup.Provider pRegistries) { + super(Set.of(), FeatureFlags.REGISTRY.allFlags(), pRegistries); + } + + @Override + protected void generate() { + registerDropSelf(BlockRegistry.ENCHANTED_SPELL_TURRET); + + registerDropSelf(BlockRegistry.BLAZING_LOG); + registerDropSelf(BlockRegistry.VEXING_LOG); + registerDropSelf(BlockRegistry.CASCADING_LOG); + registerDropSelf(BlockRegistry.FLOURISHING_LOG); + + registerDropSelf(BlockRegistry.BLAZING_SAPLING); + registerDropSelf(BlockRegistry.VEXING_SAPLING); + registerDropSelf(BlockRegistry.CASCADING_SAPLING); + registerDropSelf(BlockRegistry.FLOURISHING_SAPLING); + registerDropSelf(BlockRegistry.ARCHWOOD_PLANK); + + registerDrop(BlockRegistry.WIXIE_CAULDRON.get(), Items.CAULDRON); + for (FlowerPotBlock pot : BlockRegistry.flowerPots.values()) { + list.add(pot); + dropPottedContents(pot); + } + + registerLeavesAndSticks(BlockRegistry.BLAZING_LEAVES.get(), BlockRegistry.BLAZING_SAPLING.get()); + registerLeavesAndSticks(BlockRegistry.CASCADING_LEAVE.get(), BlockRegistry.CASCADING_SAPLING.get()); + registerLeavesAndSticks(BlockRegistry.FLOURISHING_LEAVES.get(), BlockRegistry.FLOURISHING_SAPLING.get()); + registerLeavesAndSticks(BlockRegistry.VEXING_LEAVES.get(), BlockRegistry.VEXING_SAPLING.get()); + + + registerDropSelf(BlockRegistry.BLAZING_WOOD); + registerDropSelf(BlockRegistry.VEXING_WOOD); + registerDropSelf(BlockRegistry.CASCADING_WOOD); + registerDropSelf(BlockRegistry.FLOURISHING_WOOD); + + registerDropSelf(BlockRegistry.ARCHWOOD_BUTTON); + registerDropSelf(BlockRegistry.ARCHWOOD_STAIRS); + registerSlabItemTable(BlockRegistry.ARCHWOOD_SLABS.get()); + registerDropSelf(BlockRegistry.MAGELIGHT_TORCH); + + // registerDropSelf(BlockRegistry.ARCHWOOD_SIGN); + registerDropSelf(BlockRegistry.ARCHWOOD_FENCE_GATE); + registerDropSelf(BlockRegistry.ARCHWOOD_TRAPDOOR); + registerDropSelf(BlockRegistry.ARCHWOOD_PPlate); + registerDropSelf(BlockRegistry.ARCHWOOD_FENCE); + registerDropSelf(BlockRegistry.STRIPPED_AWLOG_BLUE); + registerDropSelf(BlockRegistry.STRIPPED_AWWOOD_BLUE); + registerDropSelf(BlockRegistry.STRIPPED_AWLOG_GREEN); + registerDropSelf(BlockRegistry.STRIPPED_AWWOOD_GREEN); + registerDropSelf(BlockRegistry.STRIPPED_AWLOG_RED); + registerDropSelf(BlockRegistry.STRIPPED_AWWOOD_RED); + registerDropSelf(BlockRegistry.STRIPPED_AWLOG_PURPLE); + registerDropSelf(BlockRegistry.STRIPPED_AWWOOD_PURPLE); + registerDropDoor(BlockRegistry.ARCHWOOD_DOOR.get()); + registerDropSelf(BlockRegistry.SOURCE_GEM_BLOCK); + + registerDropSelf(BlockRegistry.POTION_MELDER); + registerDropSelf(BlockRegistry.RITUAL_BLOCK); + registerDropSelf(BlockRegistry.GOLD_SCONCE_BLOCK); + registerBedCondition(BlockRegistry.SCRIBES_BLOCK.get(), ScribesBlock.PART, ThreePartBlock.HEAD); + registerDrop(BlockRegistry.DRYGMY_BLOCK.get(), Items.MOSSY_COBBLESTONE); + + registerDropSelf(BlockRegistry.VITALIC_BLOCK); + registerDropSelf(BlockRegistry.ALCHEMICAL_BLOCK); + registerDropSelf(BlockRegistry.MYCELIAL_BLOCK); + registerDropSelf(BlockRegistry.TIMER_SPELL_TURRET); + registerDropSelf(BlockRegistry.BASIC_SPELL_TURRET); + + registerDropSelf(BlockRegistry.ARCHWOOD_CHEST); + registerDropSelf(BlockRegistry.SPELL_PRISM); + + registerDropSelf(BlockRegistry.AGRONOMIC_SOURCELINK); + registerDropSelf(BlockRegistry.ENCHANTING_APP_BLOCK); + registerDropSelf(BlockRegistry.ARCANE_PEDESTAL); + registerDropSelf(BlockRegistry.ARCANE_PLATFORM); + registerDropSelf(BlockRegistry.RELAY); + registerDropSelf(BlockRegistry.RELAY_SPLITTER); + registerDropSelf(BlockRegistry.ARCANE_CORE_BLOCK); + registerDropSelf(BlockRegistry.IMBUEMENT_BLOCK); + registerDropSelf(BlockRegistry.VOLCANIC_BLOCK); + registerDropSelf(BlockRegistry.BRAZIER_RELAY); + + registerDropSelf(BlockRegistry.RELAY_WARP); + registerDropSelf(BlockRegistry.RELAY_DEPOSIT); + registerDropSelf(BlockRegistry.RELAY_COLLECTOR); + registerDropSelf(BlockRegistry.CRAFTING_LECTERN.get()); + registerDropSelf(BlockRegistry.RED_SBED); + registerDropSelf(BlockRegistry.YELLOW_SBED); + registerDropSelf(BlockRegistry.GREEN_SBED); + registerDropSelf(BlockRegistry.PURPLE_SBED); + registerDropSelf(BlockRegistry.BLUE_SBED); + registerDropSelf(BlockRegistry.ORANGE_SBED); + registerDropSelf(BlockRegistry.SCRYERS_CRYSTAL); + registerDropSelf(BlockRegistry.SCRYERS_OCULUS); + registerDropSelf(BlockRegistry.POTION_DIFFUSER); + for (String s : LibBlockNames.DECORATIVE_SOURCESTONE) { + registerDropSelf(BlockRegistry.getBlock(s)); + Block block = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s + "_stairs")); + registerDropSelf(block); + Block slab = BuiltInRegistries.BLOCK.get(ArsNouveau.prefix( s + "_slab")); + registerDropSelf(slab); + + } + registerBedCondition(BlockRegistry.ALTERATION_TABLE.get(), AlterationTable.PART, ThreePartBlock.HEAD); + registerDropSelf(BlockRegistry.VOID_PRISM); + registerDropSelf(BlockRegistry.MAGEBLOOM_BLOCK); + registerDropSelf(BlockRegistry.GHOST_WEAVE); + registerDropSelf(BlockRegistry.FALSE_WEAVE); + registerDropSelf(BlockRegistry.MIRROR_WEAVE); + registerDropSelf(BlockRegistry.ITEM_DETECTOR); + registerDropSelf(BlockRegistry.SKY_WEAVE); + registerDropSelf(BlockRegistry.ROTATING_TURRET); + registerDropSelf(BlockRegistry.SPELL_SENSOR); + + add(BlockRegistry.SOURCE_JAR.get(), createManaManchineTable(BlockRegistry.SOURCE_JAR.get())); + + LootPool.Builder potionJarBuilder = LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(BlockRegistry.POTION_JAR) + .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) + .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) + .copy("potionData", "BlockEntityTag.potionData", CopyCustomDataFunction.MergeStrategy.REPLACE) + .copy("currentFill", "BlockEntityTag.currentFill", CopyCustomDataFunction.MergeStrategy.REPLACE) + .copy("locked", "BlockEntityTag.locked", CopyCustomDataFunction.MergeStrategy.REPLACE) + .copy("potionNames", "potionNames", CopyCustomDataFunction.MergeStrategy.REPLACE) + .copy("currentFill", "fill", CopyCustomDataFunction.MergeStrategy.REPLACE)) + ); + add(BlockRegistry.POTION_JAR.get(), LootTable.lootTable().withPool(potionJarBuilder)); + add(BlockRegistry.BASTION_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.BASTION_POD.asItem(), BlockRegistry.BASTION_POD.get()))); + add(BlockRegistry.MENDOSTEEN_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.MENDOSTEEN_POD.asItem(), BlockRegistry.MENDOSTEEN_POD.get()))); + add(BlockRegistry.FROSTAYA_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.FROSTAYA_POD.asItem(), BlockRegistry.FROSTAYA_POD.get()))); + add(BlockRegistry.BOMBEGRANTE_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.BOMBEGRANTE_POD.asItem(), BlockRegistry.BOMBEGRANTE_POD.get()))); + + LootPool.Builder mobJarBuilder = LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(BlockRegistry.MOB_JAR) + .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) + .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) + .copy("entityTag", "BlockEntityTag.entityTag", CopyCustomDataFunction.MergeStrategy.REPLACE) + .copy("entityId", "entityId", CopyCustomDataFunction.MergeStrategy.REPLACE)) + ); + add(BlockRegistry.MOB_JAR.get(), LootTable.lootTable().withPool(mobJarBuilder)); + //CustomName + LootPool.Builder repository = LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(BlockRegistry.REPOSITORY) + .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY))); + add(BlockRegistry.REPOSITORY.get(), LootTable.lootTable().withPool(repository)); + registerDropSelf(BlockRegistry.SOURCESTONE_SCONCE_BLOCK.get()); + registerDropSelf(BlockRegistry.POLISHED_SCONCE_BLOCK.get()); + registerDropSelf(BlockRegistry.ARCHWOOD_SCONCE_BLOCK.get()); + registerDropSelf(BlockRegistry.REDSTONE_RELAY.get()); + registerDropSelf(BlockRegistry.SOURCEBERRY_SACK.get()); + } + + @Override + protected void add(Block pBlock, LootTable.Builder pBuilder) { + list.add(pBlock); + super.add(pBlock, pBuilder); + } + + @Override + protected void add(Block pBlock, Function pFactory) { + list.add(pBlock); + super.add(pBlock, pFactory); + } + + + protected void add(RegistryWrapper pBlock, LootTable.Builder pBuilder) { + add(pBlock.get(), pBuilder); + } + + + protected void add(RegistryWrapper pBlock, Function pFactory) { + add(pBlock.get(), pFactory); + } + + public LootPool.Builder POD_BUILDER(Item item, Block block) { + return LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(item) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(3.0F)) + .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(block) + .setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(ArchfruitPod.AGE, 2))))); + } + + public LootTable.Builder createManaManchineTable(Block block) { + LootPool.Builder builder = LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(block) + .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) + .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) + .copy("inv", "BlockEntityTag.inv", CopyCustomDataFunction.MergeStrategy.REPLACE) //addOperation + .copy("source", "BlockEntityTag.source", CopyCustomDataFunction.MergeStrategy.REPLACE)) + ); + return LootTable.lootTable().withPool(builder); + } + + protected void registerSlabItemTable(Block p_124291_) { + list.add(p_124291_); + this.add(p_124291_, LootTable.lootTable().withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) + .add(applyExplosionDecay(p_124291_, LootItem.lootTableItem(p_124291_).apply(SetItemCountFunction.setCount(ConstantValue.exactly(2.0F)) + .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(p_124291_).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(SlabBlock.TYPE, SlabType.DOUBLE)))))))); + + } + + // Override and ignore the missing loot table error + + + @Override + public void generate(BiConsumer, LootTable.Builder> pGenerator) { + this.generate(); + Set> set = new HashSet<>(); + + for (Block block : list) { + if (block.isEnabled(this.enabledFeatures)) { + ResourceKey resourcelocation = block.getLootTable(); + if (resourcelocation != BuiltInLootTables.EMPTY && set.add(resourcelocation)) { + LootTable.Builder loottable$builder = this.map.remove(resourcelocation); + if (loottable$builder == null) { + continue; + } + + pGenerator.accept(resourcelocation, loottable$builder); + } + } + } + } + + protected & StringRepresentable> void registerBedCondition(Block block, Property prop, T isValue) { + list.add(block); + this.add(block, LootTable.lootTable().withPool(applyExplosionCondition(block, LootPool.lootPool().setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(block).when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(block).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(prop, isValue))))))); + } + + public void registerLeavesAndSticks(Block leaves, Block sapling) { + list.add(leaves); + this.add(leaves, l_state -> createLeavesDrops(l_state, sapling, DEFAULT_SAPLING_DROP_RATES)); + } + + public void registerDropDoor(Block block) { + list.add(block); + this.add(block, createDoorTable(block)); + } + + private void registerDropSelf(BlockRegistryWrapper block) { + registerDropSelf(block.get()); + } + + public void registerDropSelf(Block block) { + list.add(block); + dropSelf(block); + } + + public void registerDrop(Block input, ItemLike output) { + list.add(input); + dropOther(input, output); + } + + @Override + protected Iterable getKnownBlocks() { + return BuiltInRegistries.BLOCK.stream().filter(block -> BuiltInRegistries.BLOCK.getKey(block).getNamespace().equals(ArsNouveau.MODID)).collect(Collectors.toList()); + } + + } + + + public static class EntityLootTable extends EntityLootSubProvider { + private final Map, Map, LootTable.Builder>> map = Maps.newHashMap(); + + protected EntityLootTable(HolderLookup.Provider pRegistries){ + super(FeatureFlags.REGISTRY.allFlags(), pRegistries); + } + + @Override + public void generate() { // add(ModEntities.WILDEN_STALKER.get(), LootTable.lootTable() // .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)) // .add(LootItem.lootTableItem(ItemsRegistry.WILDEN_WING.get()) @@ -319,58 +362,58 @@ public DefaultTableProvider(PackOutput pOutput, Set> pReq // .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))) // .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) // ); -// } -// -// @Override -// protected void add(EntityType pEntityType, LootTable.Builder pBuilder) { -// super.add(pEntityType, pBuilder); -// this.map.put(pEntityType, ImmutableMap.of(pEntityType.getDefaultLootTable(), pBuilder)); -// } -// -// @Override -// protected void add(EntityType pEntityType, ResourceKey pLootTableLocation, LootTable.Builder pBuilder) { -// super.add(pEntityType, pLootTableLocation, pBuilder); -// this.map.computeIfAbsent(pEntityType, (p_249004_) -> { -// return Maps.newHashMap(); -// }).put(pLootTableLocation, pBuilder); -// } -// -// @Override -// public void generate(BiConsumer, LootTable.Builder> pGenerator) { -// this.generate(); -// Set> set = Sets.newHashSet(); -// this.getKnownEntityTypes().map(EntityType::builtInRegistryHolder).forEach((p_249003_) -> { -// EntityType entitytype = p_249003_.value(); -// if (canHaveLootTable(entitytype)) { -// Map, LootTable.Builder> map = this.map.remove(entitytype); -// ResourceKey resourcelocation = entitytype.getDefaultLootTable(); -// if (map != null) { -// map.forEach((p_250376_, p_250972_) -> { -// if (!set.add(p_250376_)) { -// throw new IllegalStateException(String.format(Locale.ROOT, "Duplicate loottable '%s' for '%s'", p_250376_, p_249003_.key().location())); -// } else { -// pGenerator.accept(p_250376_, p_250972_); -// } -// }); -// } -// } else { -// Map, LootTable.Builder> map1 = this.map.remove(entitytype); -// if (map1 != null) { -// throw new IllegalStateException(String.format(Locale.ROOT, "Weird loottables '%s' for '%s', not a LivingEntity so should not have loot", map1.keySet().stream().map(ResourceKey::toString).collect(Collectors.joining(",")), p_249003_.key().location())); -// } -// } -// -// }); -// } -// -// @Override -// protected Stream> getKnownEntityTypes() { -// return BuiltInRegistries.ENTITY_TYPE.stream().filter(block -> BuiltInRegistries.ENTITY_TYPE.getKey(block).getNamespace().equals(ArsNouveau.MODID)).toList().stream(); -// } -// } -// -// @Override -// protected void validate(WritableRegistry writableregistry, ValidationContext validationcontext, ProblemReporter.Collector problemreporter$collector) { -// -// } + } + + @Override + protected void add(EntityType pEntityType, LootTable.Builder pBuilder) { + super.add(pEntityType, pBuilder); + this.map.put(pEntityType, ImmutableMap.of(pEntityType.getDefaultLootTable(), pBuilder)); + } + + @Override + protected void add(EntityType pEntityType, ResourceKey pLootTableLocation, LootTable.Builder pBuilder) { + super.add(pEntityType, pLootTableLocation, pBuilder); + this.map.computeIfAbsent(pEntityType, (p_249004_) -> { + return Maps.newHashMap(); + }).put(pLootTableLocation, pBuilder); + } + + @Override + public void generate(BiConsumer, LootTable.Builder> pGenerator) { + this.generate(); + Set> set = Sets.newHashSet(); + this.getKnownEntityTypes().map(EntityType::builtInRegistryHolder).forEach((p_249003_) -> { + EntityType entitytype = p_249003_.value(); + if (canHaveLootTable(entitytype)) { + Map, LootTable.Builder> map = this.map.remove(entitytype); + ResourceKey resourcelocation = entitytype.getDefaultLootTable(); + if (map != null) { + map.forEach((p_250376_, p_250972_) -> { + if (!set.add(p_250376_)) { + throw new IllegalStateException(String.format(Locale.ROOT, "Duplicate loottable '%s' for '%s'", p_250376_, p_249003_.key().location())); + } else { + pGenerator.accept(p_250376_, p_250972_); + } + }); + } + } else { + Map, LootTable.Builder> map1 = this.map.remove(entitytype); + if (map1 != null) { + throw new IllegalStateException(String.format(Locale.ROOT, "Weird loottables '%s' for '%s', not a LivingEntity so should not have loot", map1.keySet().stream().map(ResourceKey::toString).collect(Collectors.joining(",")), p_249003_.key().location())); + } + } + + }); + } + + @Override + protected Stream> getKnownEntityTypes() { + return BuiltInRegistries.ENTITY_TYPE.stream().filter(block -> BuiltInRegistries.ENTITY_TYPE.getKey(block).getNamespace().equals(ArsNouveau.MODID)).toList().stream(); + } + } + + @Override + protected void validate(WritableRegistry writableregistry, ValidationContext validationcontext, ProblemReporter.Collector problemreporter$collector) { + + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java index 2d7839d8b0..44a3fb3297 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java @@ -32,7 +32,7 @@ public static void datagen(GatherDataEvent event) { event.getGenerator().addProvider(event.includeServer(), new GlyphRecipeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new ApparatusRecipeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new PatchouliProvider(event.getGenerator())); -// event.getGenerator().addProvider(event.includeServer(), new DefaultTableProvider(output, provider)); + event.getGenerator().addProvider(event.includeServer(), new DefaultTableProvider(output, provider)); event.getGenerator().addProvider(event.includeServer(), new ImbuementRecipeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new CrushRecipeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new ItemTagProvider(output, provider, fileHelper)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ManaBoost.java b/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ManaBoost.java deleted file mode 100644 index 479de57008..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ManaBoost.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.hollingsworth.arsnouveau.common.enchantment; - -public class ManaBoost { -// public ManaBoost() { -// super(Rarity.UNCOMMON, EnchantmentCategory.ARMOR, new EquipmentSlot[]{EquipmentSlot.CHEST, EquipmentSlot.FEET, EquipmentSlot.HEAD, EquipmentSlot.LEGS}); -// } -// -// @Override -// public int getMinCost(int enchantmentLevel) { -// return 1 + 11 * (enchantmentLevel - 1); -// } -// -// @Override -// public int getMaxLevel() { -// return 3; -// } - -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ManaRegenEnchantment.java b/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ManaRegenEnchantment.java deleted file mode 100644 index edd175ebdc..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ManaRegenEnchantment.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.hollingsworth.arsnouveau.common.enchantment; - - -public class ManaRegenEnchantment { - -// public ManaRegenEnchantment() { -// super(Rarity.UNCOMMON, EnchantmentCategory.ARMOR, new EquipmentSlot[]{EquipmentSlot.CHEST, EquipmentSlot.FEET, EquipmentSlot.HEAD, EquipmentSlot.LEGS}); -// } -// -// @Override -// public int getMinCost(int enchantmentLevel) { -// return 1 + 11 * (enchantmentLevel - 1); -// } -// -// -// @Override -// public int getMaxLevel() { -// return 3; -// } - -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ReactiveEnchantment.java b/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ReactiveEnchantment.java deleted file mode 100644 index eb1939ee30..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/enchantment/ReactiveEnchantment.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.hollingsworth.arsnouveau.common.enchantment; - - -public class ReactiveEnchantment { -// public ReactiveEnchantment() { -// super(Rarity.VERY_RARE, EnchantmentCategory.WEARABLE, new EquipmentSlot[]{EquipmentSlot.CHEST, EquipmentSlot.FEET, EquipmentSlot.HEAD, EquipmentSlot.LEGS}); -// } -// -// @Override -// public int getMinCost(int enchantmentLevel) { -// return 0; -// } -// -// @Override -// public int getMaxCost(int enchantmentLevel) { -// return 0; -// } -// -// @Override -// public int getMaxLevel() { -// return 3; -// } -// -// @Override -// public boolean canEnchant(ItemStack stack) { -// return true; -// } -// -// @Override -// public boolean canApplyAtEnchantingTable(ItemStack stack) { -// return false; -// } -// -// @Override -// public boolean isAllowedOnBooks() { -// return false; -// } -} From c5c493544827221f2b4a15063e46a2f1fb66d89c Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 11 Jul 2024 09:09:14 -0500 Subject: [PATCH 052/363] reenable entity loot tables --- .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 5 ++- .../loot_table/entities/wilden_guardian.json | 32 ++++++++++++++ .../loot_table/entities/wilden_hunter.json | 32 ++++++++++++++ .../loot_table/entities/wilden_stalker.json | 32 ++++++++++++++ .../common/datagen/DefaultTableProvider.java | 42 +++++++++---------- 5 files changed, 121 insertions(+), 22 deletions(-) create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/entities/wilden_guardian.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/entities/wilden_hunter.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/entities/wilden_stalker.json diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d index b052c7ccda..9512ce107b 100644 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -1,4 +1,4 @@ -// 1.21 2024-07-11T09:03:13.3968254 Loot Tables +// 1.21 2024-07-11T09:06:55.9670549 Loot Tables 4f70eae621815da8d08d3ea0b9fd479b48bad2d3 data/ars_nouveau/loot_table/blocks/agronomic_sourcelink.json 8a6d60f2b39de0408c7e4537b53e866a04236d22 data/ars_nouveau/loot_table/blocks/alchemical_sourcelink.json 8bdff8a0a49a9f3f21a822eb1d1d01a950d6ad1a data/ars_nouveau/loot_table/blocks/alteration_table.json @@ -165,3 +165,6 @@ ffc0c8a426bf2b1cd56d2c4cd909a7289cd902f4 data/ars_nouveau/loot_table/blocks/sour b7c7dfedc82b75fad6c44b41b53664b086f17e20 data/ars_nouveau/loot_table/blocks/volcanic_sourcelink.json 5a7f8da8da17f592fe60568b87cba566dbfa6105 data/ars_nouveau/loot_table/blocks/wixie_cauldron.json 6a4107b990568ff31b9c3251ac2d03330dff96d7 data/ars_nouveau/loot_table/blocks/yellow_sbed.json +8acf67783a1a936e05e1c351380da320c575ff32 data/ars_nouveau/loot_table/entities/wilden_guardian.json +93f3c19d89891b175b026838172e8b1d240e42db data/ars_nouveau/loot_table/entities/wilden_hunter.json +11298f214fe5e17eb24190b6843c11848050116b data/ars_nouveau/loot_table/entities/wilden_stalker.json diff --git a/src/generated/resources/data/ars_nouveau/loot_table/entities/wilden_guardian.json b/src/generated/resources/data/ars_nouveau/loot_table/entities/wilden_guardian.json new file mode 100644 index 0000000000..d8513d8832 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/entities/wilden_guardian.json @@ -0,0 +1,32 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "enchantment": "minecraft:looting", + "function": "minecraft:enchanted_count_increase" + } + ], + "name": "ars_nouveau:wilden_spike" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:entities/wilden_guardian" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/entities/wilden_hunter.json b/src/generated/resources/data/ars_nouveau/loot_table/entities/wilden_hunter.json new file mode 100644 index 0000000000..81f0f4b7ad --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/entities/wilden_hunter.json @@ -0,0 +1,32 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "enchantment": "minecraft:looting", + "function": "minecraft:enchanted_count_increase" + } + ], + "name": "ars_nouveau:wilden_horn" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:entities/wilden_hunter" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/entities/wilden_stalker.json b/src/generated/resources/data/ars_nouveau/loot_table/entities/wilden_stalker.json new file mode 100644 index 0000000000..a2b8f0557c --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/entities/wilden_stalker.json @@ -0,0 +1,32 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "enchantment": "minecraft:looting", + "function": "minecraft:enchanted_count_increase" + } + ], + "name": "ars_nouveau:wilden_wing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:entities/wilden_stalker" +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java index d4fd3cf70a..cbd0e646fc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java @@ -10,9 +10,7 @@ import com.hollingsworth.arsnouveau.common.block.ScribesBlock; import com.hollingsworth.arsnouveau.common.block.ThreePartBlock; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; -import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; -import com.hollingsworth.arsnouveau.setup.registry.BlockRegistryWrapper; -import com.hollingsworth.arsnouveau.setup.registry.RegistryWrapper; +import com.hollingsworth.arsnouveau.setup.registry.*; import net.minecraft.advancements.critereon.StatePropertiesPredicate; import net.minecraft.core.HolderLookup; import net.minecraft.core.WritableRegistry; @@ -41,11 +39,13 @@ import net.minecraft.world.level.storage.loot.entries.LootItem; import net.minecraft.world.level.storage.loot.functions.CopyCustomDataFunction; import net.minecraft.world.level.storage.loot.functions.CopyNameFunction; +import net.minecraft.world.level.storage.loot.functions.EnchantedCountIncreaseFunction; import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition; import net.minecraft.world.level.storage.loot.providers.nbt.ContextNbtProvider; import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -344,24 +344,24 @@ protected EntityLootTable(HolderLookup.Provider pRegistries){ @Override public void generate() { -// add(ModEntities.WILDEN_STALKER.get(), LootTable.lootTable() -// .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)) -// .add(LootItem.lootTableItem(ItemsRegistry.WILDEN_WING.get()) -// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))) -// .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) -// ); -// add(ModEntities.WILDEN_GUARDIAN.get(), LootTable.lootTable() -// .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)) -// .add(LootItem.lootTableItem(ItemsRegistry.WILDEN_SPIKE.get()) -// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))) -// .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) -// ); -// add(ModEntities.WILDEN_HUNTER.get(), LootTable.lootTable() -// .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)) -// .add(LootItem.lootTableItem(ItemsRegistry.WILDEN_HORN.get()) -// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))) -// .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) -// ); + add(ModEntities.WILDEN_STALKER.get(), LootTable.lootTable() + .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(ItemsRegistry.WILDEN_WING.get()) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))) + .apply(EnchantedCountIncreaseFunction.lootingMultiplier(this.registries, UniformGenerator.between(0.0F, 1.0F))))) + ); + add(ModEntities.WILDEN_GUARDIAN.get(), LootTable.lootTable() + .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(ItemsRegistry.WILDEN_SPIKE.get()) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))) + .apply(EnchantedCountIncreaseFunction.lootingMultiplier(this.registries, UniformGenerator.between(0.0F, 1.0F))))) + ); + add(ModEntities.WILDEN_HUNTER.get(), LootTable.lootTable() + .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(ItemsRegistry.WILDEN_HORN.get()) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))) + .apply(EnchantedCountIncreaseFunction.lootingMultiplier(this.registries, UniformGenerator.between(0.0F, 1.0F))))) + ); } @Override From 7ea7cdc0b935a9ef0dc7bee791f8bb4c7e00a7be Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 13 Jul 2024 11:27:30 -0500 Subject: [PATCH 053/363] fix abstract casters, skyweave --- .../e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 | 2 + .../data/ars_nouveau/advancement/root.json | 34 ++ .../arsnouveau/api/item/ICasterTool.java | 14 +- .../api/item/ISpellHotkeyListener.java | 12 +- .../api/registry/DynamicTooltipRegistry.java | 7 +- .../api/registry/SpellCasterRegistry.java | 4 +- .../arsnouveau/api/spell/AbstractCaster.java | 361 ++++++++++++++++++ .../arsnouveau/api/spell/ISpellCaster.java | 210 ---------- .../api/spell/ItemCasterProvider.java | 2 +- .../arsnouveau/api/spell/SpellCaster.java | 207 +--------- .../arsnouveau/api/spell/SpellTier.java | 3 +- .../arsnouveau/api/util/StackUtil.java | 4 +- .../arsnouveau/client/SkyTextureHandler.java | 5 +- .../client/events/ClientEvents.java | 10 - .../arsnouveau/client/gui/GuiSpellHUD.java | 4 +- .../arsnouveau/client/gui/SpellTooltip.java | 8 +- .../client/gui/book/GuiSpellBook.java | 2 +- .../client/gui/book/InfinityGuiSpellBook.java | 2 +- .../client/gui/radial_menu/GuiRadialMenu.java | 2 +- .../renderer/item/SpellBowRenderer.java | 4 +- .../renderer/item/SpellCrossbowRenderer.java | 4 +- .../block/tile/BasicSpellTurretTile.java | 4 +- .../common/block/tile/SingleItemTile.java | 8 +- .../crafting/recipes/CasterTomeData.java | 4 +- .../crafting/recipes/EnchantmentRecipe.java | 15 +- .../recipes/ReactiveEnchantmentRecipe.java | 7 +- .../crafting/recipes/SpellWriteRecipe.java | 6 +- .../arsnouveau/common/datagen/ModDatagen.java | 2 +- .../advancement/ANAdvancementBuilder.java | 3 +- .../datagen/advancement/ANAdvancements.java | 97 +++-- .../common/event/ReactiveEvents.java | 36 +- .../arsnouveau/common/items/CasterTome.java | 8 +- .../common/items/EnchantersMirror.java | 6 +- .../common/items/EnchantersSword.java | 6 +- .../arsnouveau/common/items/ScryCaster.java | 4 +- .../arsnouveau/common/items/SpellArrow.java | 2 +- .../arsnouveau/common/items/SpellBook.java | 4 +- .../arsnouveau/common/items/SpellBow.java | 12 +- .../common/items/SpellCrossbow.java | 10 +- .../common/items/SpellParchment.java | 5 +- .../arsnouveau/common/items/Wand.java | 6 +- .../common/items/data/ReactiveCasterData.java | 19 +- .../common/items/data/ScryCasterData.java | 16 +- .../common/items/data/TomeCasterData.java | 24 +- .../common/mob_jar/AllayBehavior.java | 1 - .../common/network/PacketSetCasterSlot.java | 4 +- .../common/network/PacketUpdateCaster.java | 4 +- .../network/PacketUpdateSpellColorAll.java | 4 +- .../network/PacketUpdateSpellColors.java | 4 +- .../network/PacketUpdateSpellSoundAll.java | 4 +- .../common/spell/effect/EffectBurst.java | 5 +- .../common/spell/effect/EffectName.java | 2 +- .../setup/registry/DataComponentRegistry.java | 2 +- 53 files changed, 643 insertions(+), 592 deletions(-) create mode 100644 src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 create mode 100644 src/generated/resources/data/ars_nouveau/advancement/root.json create mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCaster.java diff --git a/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 b/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 new file mode 100644 index 0000000000..4ce5ae2613 --- /dev/null +++ b/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 @@ -0,0 +1,2 @@ +// 1.21 2024-07-11T14:52:44.5425158 Advancements +f8a2df2ff9bac6e637f619d7a2d41815bfd19ea1 data/ars_nouveau/advancement/root.json diff --git a/src/generated/resources/data/ars_nouveau/advancement/root.json b/src/generated/resources/data/ars_nouveau/advancement/root.json new file mode 100644 index 0000000000..4133f28483 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/root.json @@ -0,0 +1,34 @@ +{ + "criteria": { + "ars_nouveau:worn_notebook": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": false, + "background": "ars_nouveau:textures/gui/advancements/backgrounds/sourcestone.png", + "description": { + "translate": "ars_nouveau.advancement.desc.root" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:worn_notebook" + }, + "show_toast": false, + "title": { + "translate": "ars_nouveau.advancement.title.root" + } + }, + "requirements": [ + [ + "ars_nouveau:worn_notebook" + ] + ] +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java index 6424ed2db0..0ed94ab05c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java @@ -2,9 +2,9 @@ import com.hollingsworth.arsnouveau.api.client.IDisplayMana; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.api.spell.ItemCasterProvider; import com.hollingsworth.arsnouveau.api.spell.Spell; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.common.items.SpellBook; import com.hollingsworth.arsnouveau.common.items.SpellParchment; import com.hollingsworth.arsnouveau.common.util.PortUtil; @@ -29,7 +29,7 @@ public interface ICasterTool extends IScribeable, IDisplayMana, ISpellHotkeyList @Override default boolean onScribe(Level world, BlockPos pos, Player player, InteractionHand handIn, ItemStack tableStack) { ItemStack heldStack = player.getItemInHand(handIn); - SpellCaster tableCaster = SpellCasterRegistry.from(tableStack); + AbstractCaster tableCaster = SpellCasterRegistry.from(tableStack); if (!((heldStack.getItem() instanceof SpellBook) || (heldStack.getItem() instanceof SpellParchment) || (heldStack.getItem() == ItemsRegistry.MANIPULATION_ESSENCE.asItem()))) return false; if(tableCaster == null){ @@ -37,7 +37,7 @@ default boolean onScribe(Level world, BlockPos pos, Player player, InteractionHa } boolean success; - SpellCaster heldCaster = SpellCasterRegistry.from(heldStack); + AbstractCaster heldCaster = SpellCasterRegistry.from(heldStack); Spell spell = new Spell(); if (heldCaster != null) { spell = heldCaster.getSpell(); @@ -82,13 +82,13 @@ default void sendInvalidMessage(Player player) { } @Override - default @NotNull SpellCaster getSpellCaster(ItemStack stack) { + default @NotNull AbstractCaster getSpellCaster(ItemStack stack) { return SpellCasterRegistry.from(stack); } - default void scribeModifiedSpell(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell){} + default void scribeModifiedSpell(AbstractCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell){} - default boolean isScribedSpellValid(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { + default boolean isScribedSpellValid(AbstractCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { return spell.isValid(); } @@ -98,7 +98,7 @@ default boolean shouldDisplay(ItemStack stack) { } default void getInformation(ItemStack stack, Item.TooltipContext context, List tooltip2, TooltipFlag flagIn) { - SpellCaster caster = getSpellCaster(stack); + AbstractCaster caster = getSpellCaster(stack); stack.addToTooltip(caster.getComponentType(), context, tooltip2::add, flagIn); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/ISpellHotkeyListener.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/ISpellHotkeyListener.java index d9f6f248f0..aeaf7bd153 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/ISpellHotkeyListener.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/ISpellHotkeyListener.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.api.item; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; @@ -12,17 +12,17 @@ public interface ISpellHotkeyListener { default void onNextKeyPressed(ItemStack stack, ServerPlayer player) { - ISpellCaster iSpellCaster = SpellCasterRegistry.from(stack); - iSpellCaster.setNextSlot(); + AbstractCaster iSpellCaster = SpellCasterRegistry.from(stack); + iSpellCaster.setNextSlot().saveToStack(stack); } default void onPreviousKeyPressed(ItemStack stack, ServerPlayer player) { - ISpellCaster iSpellCaster = SpellCasterRegistry.from(stack); - iSpellCaster.setPreviousSlot(); + AbstractCaster iSpellCaster = SpellCasterRegistry.from(stack); + iSpellCaster.setPreviousSlot().saveToStack(stack); } default void onQuickCast(ItemStack stack, ServerPlayer player, InteractionHand hand, int slot){ - ISpellCaster iSpellCaster = SpellCasterRegistry.from(stack); + AbstractCaster iSpellCaster = SpellCasterRegistry.from(stack); iSpellCaster.castSpell(player.level, player, hand, null, iSpellCaster.getSpell(slot)); } //TODO: 1.20 Remove this and have onQuickCast return a boolean diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/DynamicTooltipRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/DynamicTooltipRegistry.java index 4844ae7fa6..71af7e0be6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/DynamicTooltipRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/DynamicTooltipRegistry.java @@ -5,20 +5,21 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.TooltipProvider; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; public class DynamicTooltipRegistry { - private static Set dataTypes = ConcurrentHashMap.newKeySet(); + private static Set> dataTypes = ConcurrentHashMap.newKeySet(); - public static void register(DataComponentType type){ + public static void register(DataComponentType type){ dataTypes.add(type); } public static void appendTooltips(ItemStack stack, Item.TooltipContext context, Consumer adder, TooltipFlag flag){ - for(DataComponentType type : dataTypes){ + for(DataComponentType type : dataTypes){ stack.addToTooltip(type, context, adder, flag); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellCasterRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellCasterRegistry.java index 0d55162de8..222550ca54 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellCasterRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellCasterRegistry.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.api.registry; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.api.spell.ItemCasterProvider; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.resources.ResourceLocation; @@ -25,7 +25,7 @@ public class SpellCasterRegistry { register(ItemsRegistry.SPELL_PARCHMENT, (stack) -> stack.get(DataComponentRegistry.SPELL_CASTER)); } - public static @Nullable SpellCaster from(ItemStack stack){ + public static @Nullable AbstractCaster from(ItemStack stack){ return MAP.getOrDefault(stack.getItem().builtInRegistryHolder().key().location(), (s) -> s.get(DataComponentRegistry.SPELL_CASTER)).getSpellCaster(stack); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java new file mode 100644 index 0000000000..fadc443679 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java @@ -0,0 +1,361 @@ +package com.hollingsworth.arsnouveau.api.spell; + +import com.google.common.collect.ImmutableMap; +import com.hollingsworth.arsnouveau.api.ANFakePlayer; +import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; +import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.IWrappedCaster; +import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.LivingCaster; +import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.PlayerCaster; +import com.hollingsworth.arsnouveau.api.util.SpellUtil; +import com.hollingsworth.arsnouveau.client.particle.ParticleColor; +import com.hollingsworth.arsnouveau.common.block.tile.ScribesTile; +import com.hollingsworth.arsnouveau.common.datagen.BlockTagProvider; +import com.hollingsworth.arsnouveau.common.spell.augment.AugmentSensitive; +import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.mojang.datafixers.util.Function6; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.TooltipProvider; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Objects; +import java.util.function.Consumer; + +public abstract class AbstractCaster > implements TooltipProvider { + + public static > MapCodec createCodec(Function6 constructor) { + return RecordCodecBuilder.mapCodec(instance -> instance.group( + Codec.INT.optionalFieldOf("current_slot", 0).forGetter(s -> s.slot), + Codec.STRING.optionalFieldOf("flavor_text", "").forGetter(s -> s.flavorText), + Codec.BOOL.optionalFieldOf("is_hidden", false).forGetter(s -> s.isHidden), + Codec.STRING.optionalFieldOf("hidden_text", "").forGetter(s -> s.hiddenText), + Codec.INT.optionalFieldOf("max_slots", 1).forGetter(s -> s.maxSlots), + SpellSlotMap.CODEC.optionalFieldOf("spells", new SpellSlotMap(ImmutableMap.of())).forGetter(s -> s.spells) + ).apply(instance, constructor)); + } + + public static > StreamCodec createStream(Function6 constructor) { + return StreamCodec.composite(ByteBufCodecs.INT, s -> s.slot, ByteBufCodecs.STRING_UTF8, s -> s.flavorText, + ByteBufCodecs.BOOL, s -> s.isHidden, ByteBufCodecs.STRING_UTF8, s -> s.hiddenText, ByteBufCodecs.INT, s -> s.maxSlots, SpellSlotMap.STREAM, s -> s.spells, + constructor); + } + + public abstract MapCodec codec(); + public abstract StreamCodec streamCodec(); + + protected final SpellSlotMap spells; + protected final int slot; + protected final String flavorText; + protected final boolean isHidden; + protected final String hiddenText; + protected final int maxSlots; + + public AbstractCaster(int slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, SpellSlotMap spells){ + this.slot = slot; + this.flavorText = flavorText == null ? "" : flavorText; + this.isHidden = isHidden; + this.hiddenText = hiddenText == null ? "" : hiddenText; + this.maxSlots = maxSlots; + this.spells = spells; + } + + public AbstractCaster(){ + this(0, "", false, "", 1); + } + + public AbstractCaster(int maxSlots){ + this(0, "", false, "", maxSlots); + } + + public AbstractCaster(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots) { + this(slot, flavorText, isHidden, hiddenText, maxSlots, new SpellSlotMap(ImmutableMap.of())); + } + + + public T setCurrentSlot(int slot) { + return build(slot, flavorText, isHidden, hiddenText, maxSlots, spells); + } + + + public T setSpell(Spell spell, int slot) { + return build(this.slot, flavorText, isHidden, hiddenText, maxSlots, spells.put(slot, spell)); + } + + + public T setFlavorText(String str) { + return build(slot, str, isHidden, hiddenText, maxSlots, spells); + } + + + public T setSpellName(String name, int slot) { + var spell = this.getSpell(slot); + return build(this.slot, flavorText, isHidden, hiddenText, maxSlots, spells.put(slot, new Spell(name, spell.color(), spell.sound(), new ArrayList<>(spell.unsafeList())))); + } + + + public T setHidden(boolean hidden) { + return build(slot, flavorText, hidden, hiddenText, maxSlots, spells); + } + + + public T setHiddenRecipe(String recipe) { + return build(slot, flavorText, isHidden, recipe, maxSlots, spells); + } + + + public T setMaxSlots(int slots) { + return build(slot, flavorText, isHidden, hiddenText, slots, spells); + } + + public T setSound(ConfiguredSpellSound sound, int slot) { + var spell = this.getSpell(slot); + return build(this.slot, flavorText, isHidden, hiddenText, maxSlots, this.spells.put(slot, new Spell(spell.name(), spell.color(), sound, new ArrayList<>(spell.unsafeList())))); + } + + public T setColor(ParticleColor color, int slot) { + var spell = this.getSpell(slot); + return build(this.slot, flavorText, isHidden, hiddenText, maxSlots, this.spells.put(slot, new Spell(spell.name(), color, spell.sound(), new ArrayList<>(spell.unsafeList())))); + } + + @NotNull + public Spell getSpell() { + return spells.getOrDefault(getCurrentSlot(), new Spell()); + } + + public @NotNull Spell getSpell(int slot) { + return spells.getOrDefault(slot, new Spell()); + } + + public int getMaxSlots() { + return maxSlots; + } + + public int getCurrentSlot() { + return slot; + } + + public ParticleColor getColor(int slot) { + return this.getSpell(slot).color(); + } + + public String getSpellName(int slot) { + return this.getSpell(slot).name(); + } + + public boolean isSpellHidden() { + return isHidden; + } + + + public String getHiddenRecipe() { + return hiddenText; + } + + public String getFlavorText() { + return flavorText == null ? "" : flavorText; + } + + + @NotNull + public ConfiguredSpellSound getSound(int slot) { + return this.getSpell(slot).sound(); + } + + public SpellSlotMap getSpells() { + return spells; + } + + public T setNextSlot() { + int slot = getCurrentSlot() + 1; + if (slot >= getMaxSlots()) { + slot = 0; + } + return setCurrentSlot(slot); + } + + public T setPreviousSlot() { + int slot = getCurrentSlot() - 1; + if (slot < 0) + slot = getMaxSlots() - 1; + return setCurrentSlot(slot); + } + + public T setSpell(Spell spell){ + return setSpell(spell, getCurrentSlot()); + } + + + @NotNull + public ParticleColor getColor(){ + return getColor(getCurrentSlot()); + } + + public T setColor(ParticleColor color){ + return setColor(color, getCurrentSlot()); + } + + + public T setSound(ConfiguredSpellSound sound){ + return setSound(sound, getCurrentSlot()); + } + + public ConfiguredSpellSound getCurrentSound() { + return getSound(getCurrentSlot()); + } + + public String getSpellName(){ + return getSpellName(getCurrentSlot()); + } + + public T setSpellName(String name){ + return setSpellName(name, getCurrentSlot()); + } + + @NotNull + public Spell getSpell(Level world, LivingEntity playerEntity, InteractionHand hand, AbstractCaster caster) { + return caster.getSpell(); + } + + public Spell modifySpellBeforeCasting(Level worldIn, @Nullable Entity playerIn, @Nullable InteractionHand handIn, Spell spell) { + return spell; + } + + public InteractionResultHolder castSpell(Level worldIn, LivingEntity entity, InteractionHand handIn, @Nullable Component invalidMessage, @NotNull Spell spell) { + ItemStack stack = entity.getItemInHand(handIn); + + if (worldIn.isClientSide) + return InteractionResultHolder.pass(entity.getItemInHand(handIn)); + spell = modifySpellBeforeCasting(worldIn, entity, handIn, spell); + if (!spell.isValid() && invalidMessage != null) { + PortUtil.sendMessageNoSpam(entity, invalidMessage); + return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); + } + Player player = entity instanceof Player thisPlayer ? thisPlayer : ANFakePlayer.getPlayer((ServerLevel) worldIn); + IWrappedCaster wrappedCaster = entity instanceof Player pCaster ? new PlayerCaster(pCaster) : new LivingCaster(entity); + SpellResolver resolver = getSpellResolver(new SpellContext(worldIn, spell, entity, wrappedCaster, stack), worldIn, player, handIn); + boolean isSensitive = resolver.spell.getBuffsAtIndex(0, entity, AugmentSensitive.INSTANCE) > 0; + HitResult result = SpellUtil.rayTrace(entity, 0.5 + player.getAttribute(Attributes.BLOCK_INTERACTION_RANGE).getValue(), 0, isSensitive); + if (result instanceof BlockHitResult blockHit) { + BlockEntity tile = worldIn.getBlockEntity(blockHit.getBlockPos()); + if (tile instanceof ScribesTile) + return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); + + if (!entity.isShiftKeyDown() && tile != null && !(worldIn.getBlockState(blockHit.getBlockPos()).is(BlockTagProvider.IGNORE_TILE))) { + return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); + } + } + + if (result instanceof EntityHitResult entityHitResult && entityHitResult.getEntity() instanceof LivingEntity) { + if (resolver.onCastOnEntity(stack, entityHitResult.getEntity(), handIn)) + playSound(entity.getOnPos(), worldIn, entity, getCurrentSound(), SoundSource.PLAYERS); + return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); + } + + if (result instanceof BlockHitResult blockHitResult && (result.getType() == HitResult.Type.BLOCK || isSensitive)) { + if (entity instanceof Player) { + UseOnContext context = new UseOnContext(player, handIn, (BlockHitResult) result); + if (resolver.onCastOnBlock(context)) + playSound(entity.getOnPos(), worldIn, entity, getCurrentSound(), SoundSource.PLAYERS); + } else if (resolver.onCastOnBlock(blockHitResult)) { + playSound(entity.getOnPos(), worldIn, entity, getCurrentSound(), SoundSource.NEUTRAL); + } + return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); + } + + if (resolver.onCast(stack, worldIn)) + playSound(entity.getOnPos(), worldIn, entity, getCurrentSound(), SoundSource.PLAYERS); + return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); + } + + public InteractionResultHolder castSpell(Level worldIn, LivingEntity playerIn, InteractionHand handIn, Component invalidMessage) { + return castSpell(worldIn, playerIn, handIn, invalidMessage, getSpell(worldIn, playerIn, handIn, this)); + } + + public T copyFromCaster(AbstractCaster other) { + T self = (T) this; + for (int i = 0; i < getMaxSlots() && i < other.getMaxSlots(); i++) { + self = self.setSpell(other.getSpell(i), i); + self = self.setFlavorText(other.getFlavorText()); + } + return self; + } + + public void saveToStack(ItemStack stack){ + stack.set(this.getComponentType(), this); + } + + public abstract DataComponentType getComponentType(); + + public SpellResolver getSpellResolver(SpellContext context, Level worldIn, LivingEntity playerIn, InteractionHand handIn) { + return new SpellResolver(context); + } + + public void playSound(BlockPos pos, Level worldIn, @Nullable Entity playerIn, ConfiguredSpellSound configuredSound, SoundSource source) { + if (configuredSound == null || configuredSound.getSound() == null || configuredSound.getSound().getSoundEvent() == null || configuredSound.equals(ConfiguredSpellSound.EMPTY)) + return; + worldIn.playSound(null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, configuredSound.getSound().getSoundEvent(), source, configuredSound.getVolume(), configuredSound.getPitch()); + } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AbstractCaster caster = (AbstractCaster) o; + return slot == caster.slot && isHidden == caster.isHidden && maxSlots == caster.maxSlots && Objects.equals(spells, caster.spells) && Objects.equals(flavorText, caster.flavorText) && Objects.equals(hiddenText, caster.hiddenText); + } + + @Override + public int hashCode() { + return Objects.hash(spells, slot, flavorText, isHidden, hiddenText, maxSlots); + } + + protected abstract T build(int slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, SpellSlotMap spells); + + @Override + public void addToTooltip(Item.TooltipContext pContext, Consumer pTooltipAdder, TooltipFlag pTooltipFlag) { + if (getSpell().isEmpty()) { + pTooltipAdder.accept(Component.translatable("ars_nouveau.tooltip.can_inscribe")); + return; + } + if (!getSpellName().isEmpty()) { + pTooltipAdder.accept(Component.literal(getSpellName())); + } + if (isSpellHidden()) { + pTooltipAdder.accept(Component.literal(getHiddenRecipe()).withStyle(Style.EMPTY.withFont(ResourceLocation.fromNamespaceAndPath("minecraft", "alt")).withColor(ChatFormatting.GOLD))); + } else { + Spell spell = getSpell(); + pTooltipAdder.accept(Component.literal(spell.getDisplayString())); + } + if (!getFlavorText().isEmpty()) + pTooltipAdder.accept(Component.literal(getFlavorText()).withStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.BLUE))); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCaster.java deleted file mode 100644 index 6aae452c37..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/ISpellCaster.java +++ /dev/null @@ -1,210 +0,0 @@ -package com.hollingsworth.arsnouveau.api.spell; - -import com.hollingsworth.arsnouveau.api.ANFakePlayer; -import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; -import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.IWrappedCaster; -import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.LivingCaster; -import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.PlayerCaster; -import com.hollingsworth.arsnouveau.api.util.SpellUtil; -import com.hollingsworth.arsnouveau.client.particle.ParticleColor; -import com.hollingsworth.arsnouveau.common.block.tile.ScribesTile; -import com.hollingsworth.arsnouveau.common.datagen.BlockTagProvider; -import com.hollingsworth.arsnouveau.common.spell.augment.AugmentSensitive; -import com.hollingsworth.arsnouveau.common.util.PortUtil; -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.EntityHitResult; -import net.minecraft.world.phys.HitResult; -import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nullable; - -/** - * An interface for handling NBT as it relates to items that may cast spells. - * See SpellCaster for implementation. - */ -public interface ISpellCaster> { - - @NotNull - default Spell getSpell(){ - return getSpell(getCurrentSlot()); - } - - @NotNull - Spell getSpell(int slot); - - int getMaxSlots(); - - T setMaxSlots(int slots); - - int getCurrentSlot(); - - T setCurrentSlot(int slot); - - default T setNextSlot() { - int slot = getCurrentSlot() + 1; - if (slot >= getMaxSlots()) { - slot = 0; - } - return setCurrentSlot(slot); - } - - default T setPreviousSlot() { - int slot = getCurrentSlot() - 1; - if (slot < 0) - slot = getMaxSlots() - 1; - return setCurrentSlot(slot); - } - - T setSpell(Spell spell, int slot); - - default T setSpell(Spell spell){ - return setSpell(spell, getCurrentSlot()); - } - - @NotNull - ParticleColor getColor(int slot); - - @NotNull - default ParticleColor getColor(){ - return getColor(getCurrentSlot()); - } - - default T setColor(ParticleColor color){ - return setColor(color, getCurrentSlot()); - } - - T setColor(ParticleColor color, int slot); - - @NotNull - ConfiguredSpellSound getSound(int slot); - - default T setSound(ConfiguredSpellSound sound){ - return setSound(sound, getCurrentSlot()); - } - - T setSound(ConfiguredSpellSound sound, int slot); - - default ConfiguredSpellSound getCurrentSound() { - return getSound(getCurrentSlot()); - } - - T setFlavorText(String str); - - String getSpellName(int slot); - - default String getSpellName(){ - return getSpellName(getCurrentSlot()); - } - - default T setSpellName(String name){ - return setSpellName(name, getCurrentSlot()); - } - - T setSpellName(String name, int slot); - - boolean isSpellHidden(); - - T setHidden(boolean hidden); - - T setHiddenRecipe(String recipe); - - String getHiddenRecipe(); - - String getFlavorText(); - - SpellSlotMap getSpells(); - - @NotNull - default Spell getSpell(Level world, LivingEntity playerEntity, InteractionHand hand, ISpellCaster caster) { - return caster.getSpell(); - } - - default Spell modifySpellBeforeCasting(Level worldIn, @Nullable Entity playerIn, @Nullable InteractionHand handIn, Spell spell) { - return spell; - } - - default InteractionResultHolder castSpell(Level worldIn, LivingEntity entity, InteractionHand handIn, @Nullable Component invalidMessage, @NotNull Spell spell) { - ItemStack stack = entity.getItemInHand(handIn); - - if (worldIn.isClientSide) - return InteractionResultHolder.pass(entity.getItemInHand(handIn)); - spell = modifySpellBeforeCasting(worldIn, entity, handIn, spell); - if (!spell.isValid() && invalidMessage != null) { - PortUtil.sendMessageNoSpam(entity, invalidMessage); - return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); - } - Player player = entity instanceof Player thisPlayer ? thisPlayer : ANFakePlayer.getPlayer((ServerLevel) worldIn); - IWrappedCaster wrappedCaster = entity instanceof Player pCaster ? new PlayerCaster(pCaster) : new LivingCaster(entity); - SpellResolver resolver = getSpellResolver(new SpellContext(worldIn, spell, entity, wrappedCaster, stack), worldIn, player, handIn); - boolean isSensitive = resolver.spell.getBuffsAtIndex(0, entity, AugmentSensitive.INSTANCE) > 0; - HitResult result = SpellUtil.rayTrace(entity, 0.5 + player.getAttribute(Attributes.BLOCK_INTERACTION_RANGE).getValue(), 0, isSensitive); - if (result instanceof BlockHitResult blockHit) { - BlockEntity tile = worldIn.getBlockEntity(blockHit.getBlockPos()); - if (tile instanceof ScribesTile) - return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); - - if (!entity.isShiftKeyDown() && tile != null && !(worldIn.getBlockState(blockHit.getBlockPos()).is(BlockTagProvider.IGNORE_TILE))) { - return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); - } - } - - if (result instanceof EntityHitResult entityHitResult && entityHitResult.getEntity() instanceof LivingEntity) { - if (resolver.onCastOnEntity(stack, entityHitResult.getEntity(), handIn)) - playSound(entity.getOnPos(), worldIn, entity, getCurrentSound(), SoundSource.PLAYERS); - return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); - } - - if (result instanceof BlockHitResult blockHitResult && (result.getType() == HitResult.Type.BLOCK || isSensitive)) { - if (entity instanceof Player) { - UseOnContext context = new UseOnContext(player, handIn, (BlockHitResult) result); - if (resolver.onCastOnBlock(context)) - playSound(entity.getOnPos(), worldIn, entity, getCurrentSound(), SoundSource.PLAYERS); - } else if (resolver.onCastOnBlock(blockHitResult)) { - playSound(entity.getOnPos(), worldIn, entity, getCurrentSound(), SoundSource.NEUTRAL); - } - return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); - } - - if (resolver.onCast(stack, worldIn)) - playSound(entity.getOnPos(), worldIn, entity, getCurrentSound(), SoundSource.PLAYERS); - return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); - } - - default InteractionResultHolder castSpell(Level worldIn, LivingEntity playerIn, InteractionHand handIn, Component invalidMessage) { - return castSpell(worldIn, playerIn, handIn, invalidMessage, getSpell(worldIn, playerIn, handIn, this)); - } - - default T copyFromCaster(ISpellCaster other) { - T self = (T) this; - for (int i = 0; i < getMaxSlots() && i < other.getMaxSlots(); i++) { - self = self.setSpell(other.getSpell(i), i); - self = self.setFlavorText(other.getFlavorText()); - } - return self; - } - - default SpellResolver getSpellResolver(SpellContext context, Level worldIn, LivingEntity playerIn, InteractionHand handIn) { - return new SpellResolver(context); - } - - default void playSound(BlockPos pos, Level worldIn, @Nullable Entity playerIn, ConfiguredSpellSound configuredSound, SoundSource source) { - if (configuredSound == null || configuredSound.getSound() == null || configuredSound.getSound().getSoundEvent() == null || configuredSound.equals(ConfiguredSpellSound.EMPTY)) - return; - worldIn.playSound(null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, configuredSound.getSound().getSoundEvent(), source, configuredSound.getVolume(), configuredSound.getPitch()); - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/ItemCasterProvider.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/ItemCasterProvider.java index e7adec002a..6cf7985b78 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/ItemCasterProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/ItemCasterProvider.java @@ -4,5 +4,5 @@ public interface ItemCasterProvider { - SpellCaster getSpellCaster(ItemStack stack); + AbstractCaster getSpellCaster(ItemStack stack); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java index d8eee1b45d..a021c211f3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellCaster.java @@ -1,61 +1,27 @@ package com.hollingsworth.arsnouveau.api.spell; import com.google.common.collect.ImmutableMap; -import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; -import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; -import com.mojang.datafixers.util.Function6; -import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.ChatFormatting; import net.minecraft.core.component.DataComponentType; import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; -import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.item.component.TooltipProvider; -import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.Objects; -import java.util.function.Consumer; +public class SpellCaster extends AbstractCaster{ + public static final MapCodec CODEC = createCodec(SpellCaster::new); -public class SpellCaster implements ISpellCaster, TooltipProvider { + public static final StreamCodec STREAM_CODEC = createStream(SpellCaster::new); - public static final MapCodec DEFAULT_CODEC = createCodec(SpellCaster::new); - - public static final StreamCodec DEFAULT_STREAM = createStream(SpellCaster::new); - - public static MapCodec createCodec(Function6 constructor) { - return RecordCodecBuilder.mapCodec(instance -> instance.group( - Codec.INT.optionalFieldOf("current_slot", 0).forGetter(s -> s.slot), - Codec.STRING.optionalFieldOf("flavor_text", "").forGetter(s -> s.flavorText), - Codec.BOOL.optionalFieldOf("is_hidden", false).forGetter(s -> s.isHidden), - Codec.STRING.optionalFieldOf("hidden_text", "").forGetter(s -> s.hiddenText), - Codec.INT.optionalFieldOf("max_slots", 1).forGetter(s -> s.maxSlots), - SpellSlotMap.CODEC.optionalFieldOf("spells", new SpellSlotMap(ImmutableMap.of())).forGetter(s -> s.spells) - ).apply(instance, constructor)); + @Override + public MapCodec codec() { + return CODEC; } - public static StreamCodec createStream(Function6 constructor) { - return StreamCodec.composite(ByteBufCodecs.INT, s -> s.slot, ByteBufCodecs.STRING_UTF8, s -> s.flavorText, - ByteBufCodecs.BOOL, s -> s.isHidden, ByteBufCodecs.STRING_UTF8, s -> s.hiddenText, ByteBufCodecs.INT, s -> s.maxSlots, SpellSlotMap.STREAM, s -> s.spells, - constructor); + @Override + public StreamCodec streamCodec() { + return STREAM_CODEC; } - protected final SpellSlotMap spells; - protected final int slot; - protected final String flavorText; - protected final boolean isHidden; - protected final String hiddenText; - protected final int maxSlots; - public SpellCaster(){ this(0, "", false, "", 1); } @@ -69,162 +35,19 @@ public SpellCaster(Integer slot, String flavorText, Boolean isHidden, String hid } public SpellCaster(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, SpellSlotMap spells){ - this.slot = slot; - this.flavorText = flavorText; - this.isHidden = isHidden; - this.hiddenText = hiddenText; - this.spells = spells; - this.maxSlots = maxSlots; - } - - @NotNull - @Override - public Spell getSpell() { - return spells.getOrDefault(getCurrentSlot(), new Spell()); - } - - @Override - public @NotNull Spell getSpell(int slot) { - return spells.getOrDefault(slot, new Spell()); - } - - @Override - public int getMaxSlots() { - return maxSlots; - } - - @Override - public SpellCaster setMaxSlots(int slots) { - return new SpellCaster(slot, flavorText, isHidden, hiddenText, slots, spells); - } - - @Override - public int getCurrentSlot() { - return slot; - } - - @Override - public SpellCaster setCurrentSlot(int slot) { - return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, spells); - } - - @Override - public SpellCaster setSpell(Spell spell, int slot) { - return new SpellCaster(this.slot, flavorText, isHidden, hiddenText, maxSlots, spells.put(slot, spell)); - } - - @Override - public ParticleColor getColor(int slot) { - return this.getSpell(slot).color(); - } - - @Override - public SpellCaster setFlavorText(String str) { - return new SpellCaster(slot, str, isHidden, hiddenText, maxSlots, spells); - } - - @Override - public String getSpellName(int slot) { - return this.getSpell(slot).name(); - } - - @Override - public SpellCaster setSpellName(String name, int slot) { - var spell = this.getSpell(slot); - return new SpellCaster(this.slot, flavorText, isHidden, hiddenText, maxSlots, spells.put(slot, new Spell(name, spell.color(), spell.sound(), new ArrayList<>(spell.unsafeList())))); - } - - @Override - public boolean isSpellHidden() { - return isHidden; - } - - @Override - public SpellCaster setHidden(boolean hidden) { - return new SpellCaster(slot, flavorText, hidden, hiddenText, maxSlots, spells); - } - - @Override - public SpellCaster setHiddenRecipe(String recipe) { - return new SpellCaster(slot, flavorText, isHidden, recipe, maxSlots, spells); - } - - @Override - public String getHiddenRecipe() { - return hiddenText; - } - - @Override - public String getFlavorText() { - return flavorText == null ? "" : flavorText; - } - - @Override - public SpellCaster setColor(ParticleColor color, int slot) { - var spell = this.getSpell(slot); - return new SpellCaster(this.slot, flavorText, isHidden, hiddenText, maxSlots, this.spells.put(slot, new Spell(spell.name(), color, spell.sound(), new ArrayList<>(spell.unsafeList())))); + super(slot, flavorText, isHidden, hiddenText, maxSlots, spells); } - @NotNull - @Override - public ConfiguredSpellSound getSound(int slot) { - return this.getSpell(slot).sound(); - } - - @Override - public SpellCaster setSound(ConfiguredSpellSound sound, int slot) { - var spell = this.getSpell(slot); - return new SpellCaster(this.slot, flavorText, isHidden, hiddenText, maxSlots, this.spells.put(slot, new Spell(spell.name(), spell.color(), sound, new ArrayList<>(spell.unsafeList())))); - } - - @NotNull - @Override - public ParticleColor getColor() { - return this.getSpell().color(); - } - - @Override - public SpellSlotMap getSpells() { - return spells; + public static SpellCaster create(int slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots){ + return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots); } - public DataComponentType getComponentType() { + public DataComponentType getComponentType() { return DataComponentRegistry.SPELL_CASTER.get(); } - public void saveToStack(ItemStack stack){ - stack.set(this.getComponentType(), this); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - SpellCaster caster = (SpellCaster) o; - return slot == caster.slot && isHidden == caster.isHidden && maxSlots == caster.maxSlots && Objects.equals(spells, caster.spells) && Objects.equals(flavorText, caster.flavorText) && Objects.equals(hiddenText, caster.hiddenText); - } - @Override - public int hashCode() { - return Objects.hash(spells, slot, flavorText, isHidden, hiddenText, maxSlots); - } - - @Override - public void addToTooltip(Item.TooltipContext pContext, Consumer pTooltipAdder, TooltipFlag pTooltipFlag) { - if (getSpell().isEmpty()) { - pTooltipAdder.accept(Component.translatable("ars_nouveau.tooltip.can_inscribe")); - return; - } - if (!getSpellName().isEmpty()) { - pTooltipAdder.accept(Component.literal(getSpellName())); - } - if (isSpellHidden()) { - pTooltipAdder.accept(Component.literal(getHiddenRecipe()).withStyle(Style.EMPTY.withFont(ResourceLocation.fromNamespaceAndPath("minecraft", "alt")).withColor(ChatFormatting.GOLD))); - } else { - Spell spell = getSpell(); - pTooltipAdder.accept(Component.literal(spell.getDisplayString())); - } - if (!getFlavorText().isEmpty()) - pTooltipAdder.accept(Component.literal(getFlavorText()).withStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.BLUE))); + protected SpellCaster build(int slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, SpellSlotMap spells) { + return new SpellCaster(slot, flavorText, isHidden, hiddenText, maxSlots, spells); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellTier.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellTier.java index 202e6583e9..d4b5a95230 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellTier.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellTier.java @@ -16,8 +16,7 @@ public class SpellTier { public int value; public ResourceLocation id; - @Deprecated //TODO:1.20 Make private in favor of create tier method - public SpellTier(ResourceLocation id, int value) { + private SpellTier(ResourceLocation id, int value) { this.value = value; this.id = id; if(value > 99){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/StackUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/StackUtil.java index a7b42c6212..241966b887 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/StackUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/StackUtil.java @@ -4,7 +4,7 @@ import com.hollingsworth.arsnouveau.api.item.IRadialProvider; import com.hollingsworth.arsnouveau.api.item.ISpellHotkeyListener; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.common.items.SpellBook; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; @@ -36,7 +36,7 @@ public class StackUtil { return getHeldCasterTool(player, (tool) -> true); } - public static @Nullable InteractionHand getHeldCasterTool(Player player, Predicate filter){ + public static @Nullable InteractionHand getHeldCasterTool(Player player, Predicate> filter){ var mainStack = player.getMainHandItem(); var offStack = player.getOffhandItem(); var mainCaster = SpellCasterRegistry.from(mainStack); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/SkyTextureHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/SkyTextureHandler.java index 9b18685c50..d1b49a4a8e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/SkyTextureHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/SkyTextureHandler.java @@ -56,22 +56,19 @@ public static void renderSky(RenderLevelStageEvent event) { FogRenderer.levelFogColor(); //rendering the actual sky RenderSystem.setShader(GameRenderer::getPositionShader); - // todo: check, was previously poseStack instead of modelViewMatrix levelRenderer.renderSky(event.getModelViewMatrix(), projectionMatrix, partialTick, camera, isFoggy, () -> { FogRenderer.setupFog(camera, FogRenderer.FogMode.FOG_SKY, gameRenderer.getRenderDistance(), isFoggy, partialTick); }); Matrix4fStack modelViewStack = RenderSystem.getModelViewStack(); modelViewStack.pushMatrix(); - //todo: check mul vs mulPose modelViewStack.mul(poseStack.last().pose()); RenderSystem.applyModelViewMatrix(); //rendering the clouds if (minecraft.options.getCloudsType() != CloudStatus.OFF) { RenderSystem.setShaderColor(1F, 1F, 1F, 1F); - //todo: check, projectionMatrix as frustrum matrix? - levelRenderer.renderClouds(poseStack, projectionMatrix, projectionMatrix, partialTick, cameraPosition.x, cameraPosition.y, cameraPosition.z); + levelRenderer.renderClouds(poseStack, event.getModelViewMatrix(), projectionMatrix, partialTick, cameraPosition.x, cameraPosition.y, cameraPosition.z); } //the rain! diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java index ca943c032e..f9da86df55 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java @@ -71,16 +71,6 @@ public static void overlayEvent(RenderGuiLayerEvent.Pre event) { public static void onTooltip(final ItemTooltipEvent event) { ItemStack stack = event.getItemStack(); DynamicTooltipRegistry.appendTooltips(stack, event.getContext(), event.getToolTip()::add, event.getFlags()); - //todo: reenable reactive -// int level = stack.getEnchantmentLevel(event.getEntity().level.holderOrThrow(EnchantmentRegistry.REACTIVE_ENCHANTMENT)); -// var reactiveCaster = stack.get(DataComponentRegistry.REACTIVE_CASTER); -// -// if (reactiveCaster != null && level > 0 && reactiveCaster.getSpell().isValid()) { -// Spell spell = reactiveCaster.getSpell(); -// event.getToolTip().add(Component.literal(spell.getDisplayString())); -// } -// -// Collections.addAll(event.getToolTip(), ClientInfo.storageTooltip); } public static Component localize(String key, Object... params) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java index f75b70b7ab..353e238178 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.client.gui; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.api.util.StackUtil; import com.hollingsworth.arsnouveau.common.items.SpellBook; import net.minecraft.client.DeltaTracker; @@ -20,7 +20,7 @@ public static void renderOverlay(GuiGraphics graphics, DeltaTracker deltaTracker ItemStack stack = StackUtil.getHeldSpellbook(minecraft.player); if (stack != ItemStack.EMPTY && stack.getItem() instanceof SpellBook) { int offsetLeft = 10; - ISpellCaster caster = SpellCasterRegistry.from(stack); + AbstractCaster caster = SpellCasterRegistry.from(stack); String renderString = caster.getCurrentSlot() + 1 + " " + caster.getSpellName(); graphics.drawString(Minecraft.getInstance().font, renderString, offsetLeft, minecraft.getWindow().getGuiScaledHeight() - 30, 0xFFFFFF); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java index bb7e647b15..42dbc9f410 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.client.gui; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; @@ -11,14 +11,14 @@ import net.minecraft.world.inventory.tooltip.TooltipComponent; import org.joml.Matrix4f; -public record SpellTooltip(ISpellCaster spellcaster, boolean showName) implements TooltipComponent { +public record SpellTooltip(AbstractCaster spellcaster, boolean showName) implements TooltipComponent { - public SpellTooltip(ISpellCaster spellcaster) { + public SpellTooltip(AbstractCaster spellcaster) { this(spellcaster, false); } public static class SpellTooltipRenderer implements ClientTooltipComponent { - private final ISpellCaster spellCaster; + private final AbstractCaster spellCaster; private final boolean showName; public SpellTooltipRenderer(SpellTooltip pSpellTooltip) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index 6187693b12..e3b5a3496c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -118,7 +118,7 @@ public GuiSpellBook(InteractionHand hand){ @Override public void init() { super.init(); - ISpellCaster caster = SpellCasterRegistry.from(bookStack); + AbstractCaster caster = SpellCasterRegistry.from(bookStack); int selectedSlot = caster.getCurrentSlot(); //Crafting slots for (int i = 0; i < numLinks; i++) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java index d82e055f25..c94fb4d6c0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java @@ -126,7 +126,7 @@ public InfinityGuiSpellBook(InteractionHand hand) { @Override public void init() { super.init(); - ISpellCaster caster = SpellCasterRegistry.from(bookStack); + AbstractCaster caster = SpellCasterRegistry.from(bookStack); int selectedSlot = caster.getCurrentSlot(); //Crafting slots for (int i = 0; i < numLinks; i++) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java index 97c407bae8..7479a871ca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java @@ -84,7 +84,7 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTi super.render(graphics, mouseX, mouseY, partialTicks); PoseStack ms = graphics.pose(); float openAnimation = closing ? 1.0f - totalTime / OPEN_ANIMATION_LENGTH : totalTime / OPEN_ANIMATION_LENGTH; - //todo: is getFrameTimeNs() the right method to use here? + float currTick = minecraft.getFrameTimeNs(); totalTime += (currTick + extraTick - prevTick)/20f; extraTick = 0; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java index a864ae2529..77e0309262 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.client.renderer.item; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; -import com.hollingsworth.arsnouveau.api.spell.ISpellCaster; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleLineData; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; @@ -64,7 +64,7 @@ public void renderByItem(ItemStack itemStack, ItemDisplayContext transformType, Vec3 laserPos = playerPos.add(right); laserPos = laserPos.add(forward); laserPos = laserPos.add(down); - ISpellCaster tool = SpellCasterRegistry.from(itemStack); + AbstractCaster tool = SpellCasterRegistry.from(itemStack); int timeHeld = 72000 - Minecraft.getInstance().player.getUseItemRemainingTicks(); if (timeHeld > 0 && timeHeld != 72000) { float scaleAge = (float) ParticleUtil.inRange(0.05, 0.1); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java index 23c4d4f2aa..1db0c20f92 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.client.renderer.item; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleLineData; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; @@ -92,7 +92,7 @@ public void renderByItem(ItemStack itemStack, ItemDisplayContext transformType, Vec3 laserPos = playerPos.add(right); laserPos = laserPos.add(forward); laserPos = laserPos.add(down); - SpellCaster tool = SpellCasterRegistry.from(itemStack); + AbstractCaster tool = SpellCasterRegistry.from(itemStack); if (timeHeld > 0 && timeHeld != 72000 || SpellCrossbow.isCharged(itemStack)) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java index 599ad25e6b..a4956ccae8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java @@ -40,13 +40,13 @@ public int getManaCost() { @Override protected void saveAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { super.saveAdditional(pTag, pRegistries); - pTag.put("spell_caster", ANCodecs.encode(SpellCaster.DEFAULT_CODEC.codec(), spellCaster)); + pTag.put("spell_caster", ANCodecs.encode(SpellCaster.CODEC.codec(), spellCaster)); } @Override protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { super.loadAdditional(pTag, pRegistries); - this.spellCaster = ANCodecs.decode(SpellCaster.DEFAULT_CODEC.codec(), pTag.get("spell_caster")); + this.spellCaster = ANCodecs.decode(SpellCaster.CODEC.codec(), pTag.get("spell_caster")); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java index d54e2d2bb0..c603b49874 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java @@ -100,8 +100,12 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); if (!stack.isEmpty()) { - Tag stackTag = stack.save(pRegistries); - tag.put("itemStack", stackTag); + try { + Tag stackTag = stack.save(pRegistries); + tag.put("itemStack", stackTag); + }catch (Exception e){ + e.printStackTrace(); + } } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java index 36579c5a9a..d6ee8e5cba 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java @@ -4,9 +4,9 @@ import com.hollingsworth.arsnouveau.api.registry.ParticleColorRegistry; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import com.hollingsworth.arsnouveau.api.spell.Spell; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; @@ -47,7 +47,7 @@ public CasterTomeData(String name, public static ItemStack makeTome(Item tome, String name, Spell spell, String flavorText) { ItemStack stack = tome.getDefaultInstance(); - SpellCaster spellCaster = SpellCasterRegistry.from(stack); + AbstractCaster spellCaster = SpellCasterRegistry.from(stack); spellCaster.setSpell(spell); stack.set(DataComponents.CUSTOM_NAME, Component.literal(name).setStyle(Style.EMPTY.withColor(ChatFormatting.DARK_PURPLE).withItalic(true))); spellCaster.setFlavorText(flavorText); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantmentRecipe.java index 583abf88e0..33390dc2f7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantmentRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantmentRecipe.java @@ -10,6 +10,7 @@ import net.minecraft.core.registries.Registries; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceKey; import net.minecraft.world.entity.player.Player; @@ -24,6 +25,7 @@ import net.minecraft.world.level.Level; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; @@ -132,8 +134,17 @@ public static class Serializer implements RecipeSerializer { Codec.INT.fieldOf("sourceCost").forGetter(EnchantmentRecipe::sourceCost) ).apply(instance, EnchantmentRecipe::new)); - //TODO: use proper codec - public static StreamCodec STREAM_CODEC = CheatSerializer.create(CODEC); + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + Ingredient.CONTENTS_STREAM_CODEC.apply(ByteBufCodecs.collection(ArrayList::new)), + EnchantmentRecipe::pedestalItems, + ResourceKey.streamCodec(Registries.ENCHANTMENT), + EnchantmentRecipe::enchantmentKey, + ByteBufCodecs.INT, + EnchantmentRecipe::enchantLevel, + ByteBufCodecs.INT, + EnchantmentRecipe::sourceCost, + EnchantmentRecipe::new + ); @Override public MapCodec codec() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java index 159af6062a..d0d176ce34 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java @@ -1,8 +1,9 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.common.items.SpellParchment; +import com.hollingsworth.arsnouveau.common.items.data.ReactiveCasterData; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; @@ -32,8 +33,8 @@ public ReactiveEnchantmentRecipe(List pedestalItems, int sourceCost) public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider lookup) { ItemStack result = super.assemble(input, lookup); ItemStack parchment = getParchment(input.pedestals()); - SpellCaster parchmentCaster = SpellCasterRegistry.from(parchment); - result.set(DataComponentRegistry.SPELL_CASTER, new SpellCaster(0, null, false, null, 1) + AbstractCaster parchmentCaster = SpellCasterRegistry.from(parchment); + result.set(DataComponentRegistry.REACTIVE_CASTER, new ReactiveCasterData(0, "", false, "", 1) .setColor(parchmentCaster.getColor()) .setSpell(parchmentCaster.getSpell())); return result; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java index 3bf131b3b2..29b0ac9eda 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.crafting.recipes; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.common.items.data.ReactiveCasterData; import com.hollingsworth.arsnouveau.common.util.HolderHelper; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; @@ -55,9 +55,9 @@ public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.a @Override public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider p_346030_) { ItemStack parchment = getParchment(input.pedestals()); - SpellCaster caster = SpellCasterRegistry.from(parchment); + AbstractCaster caster = SpellCasterRegistry.from(parchment); ItemStack result = input.catalyst().copy(); - ReactiveCasterData data = (ReactiveCasterData) new ReactiveCasterData(0, null, false, null, 1, caster.getSpells()) + ReactiveCasterData data = new ReactiveCasterData(0, null, false, null, 1, caster.getSpells()) .setColor(caster.getColor(), 0); result.set(DataComponentRegistry.REACTIVE_CASTER, data); return result; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java index 44a3fb3297..83160efe7d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java @@ -42,7 +42,7 @@ public static void datagen(GatherDataEvent event) { event.getGenerator().addProvider(event.includeServer(), new DyeRecipeDatagen(event.getGenerator())); // event.getGenerator().addProvider(event.includeServer(), new SimpleAdvancements(event.getGenerator())); -// event.getGenerator().addProvider(event.includeServer(), new AdvancementProvider(output, provider, fileHelper)); + event.getGenerator().addProvider(event.includeServer(), new AdvancementProvider(output, provider, fileHelper)); event.getGenerator().addProvider(event.includeServer(), new CasterTomeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new SummonRitualProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new BuddingConversionProvider(event.getGenerator())); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java index 0086d5ecf5..74c2b190d5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.common.datagen.advancement; import com.google.common.collect.Maps; +import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.advancements.*; import net.minecraft.advancements.critereon.InventoryChangeTrigger; import net.minecraft.core.registries.BuiltInRegistries; @@ -172,7 +173,7 @@ public AdvancementHolder save(Consumer pConsumer, ResourceLoc } public AdvancementHolder save(Consumer pConsumer) { - return this.save(pConsumer, ResourceLocation.fromNamespaceAndPath(modid, fileKey)); + return this.save(pConsumer, ArsNouveau.prefix(fileKey)); } public String toString() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancements.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancements.java index 29376ae2f8..009bfd7f03 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancements.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancements.java @@ -1,20 +1,14 @@ package com.hollingsworth.arsnouveau.common.datagen.advancement; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.registry.RitualRegistry; -import com.hollingsworth.arsnouveau.common.advancement.ANCriteriaTriggers; -import com.hollingsworth.arsnouveau.common.lib.RitualLib; -import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; -import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.advancements.AdvancementHolder; import net.minecraft.advancements.AdvancementType; -import net.minecraft.advancements.critereon.*; +import net.minecraft.advancements.critereon.InventoryChangeTrigger; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Items; import net.minecraft.world.level.ItemLike; import net.neoforged.neoforge.common.data.AdvancementProvider; import net.neoforged.neoforge.common.data.ExistingFileHelper; @@ -32,50 +26,51 @@ public void generate(HolderLookup.Provider registries, Consumer= Math.random() && reactiveCaster != null && reactiveCaster.getSpell().isValid()) { -// reactiveCaster.castSpell(playerIn.getCommandSenderWorld(), playerIn, InteractionHand.MAIN_HAND, null); -// } + int level = stack.getEnchantmentLevel(playerIn.level.holderOrThrow(EnchantmentRegistry.REACTIVE_ENCHANTMENT)); + var reactiveCaster = stack.get(DataComponentRegistry.REACTIVE_CASTER); + if (level * .25 >= Math.random() && reactiveCaster != null && reactiveCaster.getSpell().isValid()) { + reactiveCaster.castSpell(playerIn.getCommandSenderWorld(), playerIn, InteractionHand.MAIN_HAND, null); + } } @SubscribeEvent @@ -45,21 +50,18 @@ public static void leftClickBlock(PlayerInteractEvent.LeftClickBlock e) { @SubscribeEvent public static void playerAttackEntity(AttackEntityEvent e) { - //todo: reenable reactive -// Player entity = e.getEntity(); -// -// if (entity == null || entity.getCommandSenderWorld().isClientSide) -// return; -// ItemStack s = e.getEntity().getMainHandItem(); -// castSpell(entity, s); + Player entity = e.getEntity(); + + if (entity == null || entity.getCommandSenderWorld().isClientSide) + return; + ItemStack s = e.getEntity().getMainHandItem(); + castSpell(entity, s); } @SubscribeEvent public static void leftClickAir(PlayerInteractEvent.LeftClickEmpty e) { - //todo: reenable reactive + if (e.getItemStack().getEnchantmentLevel(HolderHelper.unwrap(e.getLevel(), EnchantmentRegistry.REACTIVE_ENCHANTMENT)) > 0) + Networking.sendToServer(new PacketReactiveSpell()); } -// if (e.getItemStack().getEnchantmentLevel(HolderHelper.unwrap(e.getLevel(), EnchantmentRegistry.REACTIVE_ENCHANTMENT)) > 0) -// Networking.sendToServer(new PacketReactiveSpell()); -// } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java index adb39c1891..2285e1233c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java @@ -2,8 +2,8 @@ import com.hollingsworth.arsnouveau.api.item.ICasterTool; import com.hollingsworth.arsnouveau.api.mana.IManaDiscountEquipment; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.api.spell.Spell; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; import com.hollingsworth.arsnouveau.common.items.data.TomeCasterData; import com.hollingsworth.arsnouveau.setup.config.Config; @@ -45,7 +45,7 @@ public boolean onScribe(Level world, BlockPos pos, Player player, InteractionHan @Override public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); - SpellCaster caster = getSpellCaster(stack); + AbstractCaster caster = getSpellCaster(stack); Spell spell = caster.getSpell(); return caster.castSpell(worldIn, playerIn, handIn, Component.empty(), spell); } @@ -54,7 +54,7 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { if (context == null) return; - SpellCaster caster = getSpellCaster(stack); + AbstractCaster caster = getSpellCaster(stack); if (Config.GLYPH_TOOLTIPS.get() || Screen.hasShiftDown()) { if (caster.isSpellHidden()) { @@ -78,7 +78,7 @@ public int getManaDiscount(ItemStack i, Spell spell) { @Override public Optional getTooltipImage(ItemStack pStack) { - SpellCaster caster = getSpellCaster(pStack); + AbstractCaster caster = getSpellCaster(pStack); if (!Screen.hasShiftDown() && Config.GLYPH_TOOLTIPS.get() && !caster.isSpellHidden() && !caster.getSpell().isEmpty()) return Optional.of(new SpellTooltip(caster)); return Optional.empty(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java index 1982bb7d7a..39ca436616 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java @@ -52,7 +52,7 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { @Override public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); - ISpellCaster caster = getSpellCaster(stack); + AbstractCaster caster = getSpellCaster(stack); return caster.castSpell(worldIn, playerIn, handIn, Component.translatable("ars_nouveau.mirror.invalid"), caster.getSpell()); } @@ -62,7 +62,7 @@ public int getManaDiscount(ItemStack i, Spell spell) { } @Override - public boolean isScribedSpellValid(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { + public boolean isScribedSpellValid(AbstractCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { return spell.unsafeList().stream().noneMatch(s -> s instanceof AbstractCastMethod); } @@ -72,7 +72,7 @@ public void sendInvalidMessage(Player player) { } @Override - public void scribeModifiedSpell(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell) { + public void scribeModifiedSpell(AbstractCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell) { ArrayList recipe = new ArrayList<>(); recipe.add(MethodSelf.INSTANCE); recipe.addAll(spell.recipe); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java index 1ec973cd63..10c99a3c0d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java @@ -55,7 +55,7 @@ public void inventoryTick(ItemStack stack, Level world, Entity entity, int p_776 } @Override - public boolean isScribedSpellValid(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { + public boolean isScribedSpellValid(AbstractCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { return spell.unsafeList().stream().noneMatch(s -> s instanceof AbstractCastMethod); } @@ -65,7 +65,7 @@ public void sendInvalidMessage(Player player) { } @Override - public void scribeModifiedSpell(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell) { + public void scribeModifiedSpell(AbstractCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell) { ArrayList recipe = new ArrayList<>(); recipe.add(MethodTouch.INSTANCE); recipe.addAll(spell.recipe); @@ -75,7 +75,7 @@ public void scribeModifiedSpell(SpellCaster caster, Player player, InteractionHa @Override public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity entity) { - ISpellCaster caster = getSpellCaster(stack); + AbstractCaster caster = getSpellCaster(stack); IWrappedCaster wrappedCaster = entity instanceof Player player ? new PlayerCaster(player) : new LivingCaster(entity); SpellContext context = new SpellContext(entity.level, caster.modifySpellBeforeCasting(target.level, entity, InteractionHand.MAIN_HAND, caster.getSpell()), entity, wrappedCaster, stack); SpellResolver resolver = entity instanceof Player ? new SpellResolver(context) : new EntitySpellResolver(context); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java index 7aaa78e059..dfd1e96c77 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.item.ICasterTool; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.client.renderer.item.ScryCasterRenderer; import com.hollingsworth.arsnouveau.common.block.ScryerCrystal; import com.hollingsworth.arsnouveau.common.items.data.ScryPosData; @@ -55,7 +55,7 @@ public InteractionResult useOn(UseOnContext pContext) { @Override public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) { ItemStack stack = pPlayer.getItemInHand(pUsedHand); - SpellCaster caster = getSpellCaster(stack); + AbstractCaster caster = getSpellCaster(stack); return caster.castSpell(pLevel, pPlayer, pUsedHand, Component.translatable("ars_nouveau.invalid_spell")); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellArrow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellArrow.java index 538f981bca..af45984eac 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellArrow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellArrow.java @@ -47,7 +47,7 @@ public AbstractArrow createArrow(Level world, ItemStack stack, LivingEntity shoo EntitySpellArrow spellArrow = new EntitySpellArrow(world, shooter, ItemStack.EMPTY, bowStack); if (!(shooter instanceof Player entity) || !((shooter).getMainHandItem().getItem() instanceof ICasterTool caster)) return super.createArrow(world, stack, shooter, bowStack); - SpellCaster spellCaster = caster.getSpellCaster(entity.getMainHandItem()); + AbstractCaster spellCaster = caster.getSpellCaster(entity.getMainHandItem()); var mutableSpell = spellCaster.getSpell().mutable(); modifySpell(mutableSpell); spellArrow.spellResolver = new SpellResolver(new SpellContext(world, mutableSpell.immutable(), entity, new PlayerCaster(entity), shooter.getMainHandItem())).withSilent(true); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java index 409cc82a4b..c717e1b08c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java @@ -79,7 +79,7 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In } } } - SpellCaster caster = getSpellCaster(stack); + AbstractCaster caster = getSpellCaster(stack); return caster.castSpell(worldIn, playerIn, handIn, Component.translatable("ars_nouveau.invalid_spell")); } @@ -150,7 +150,7 @@ public RadialMenu getRadialMenuProviderForSpellpart(ItemStack } public List> getRadialMenuSlotsForSpellpart(ItemStack itemStack) { - SpellCaster spellCaster = SpellCasterRegistry.from(itemStack); + AbstractCaster spellCaster = SpellCasterRegistry.from(itemStack); List> radialMenuSlots = new ArrayList<>(); for (int i = 0; i < spellCaster.getMaxSlots(); i++) { Spell spell = spellCaster.getSpell(i); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java index 430f09951b..b2a3a77477 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java @@ -47,7 +47,7 @@ public SpellBow() { } public boolean canPlayerCastSpell(ItemStack bow, Player playerentity) { - ISpellCaster caster = getSpellCaster(bow); + AbstractCaster caster = getSpellCaster(bow); return new SpellResolver(new SpellContext(playerentity.level, caster.getSpell(), playerentity, new PlayerCaster(playerentity), bow)).withSilent(true).canCast(playerentity); } @@ -81,7 +81,7 @@ public ItemStack findAmmo(Player playerEntity, ItemStack shootable) { @Override public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { ItemStack itemstack = playerIn.getItemInHand(handIn); - ISpellCaster caster = getSpellCaster(playerIn.getItemInHand(handIn)); + AbstractCaster caster = getSpellCaster(playerIn.getItemInHand(handIn)); boolean hasAmmo = !findAmmo(playerIn, itemstack).isEmpty(); InteractionResultHolder ret = net.neoforged.neoforge.event.EventHooks.onArrowNock(itemstack, worldIn, playerIn, handIn, hasAmmo); @@ -100,7 +100,7 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In } } - public EntitySpellArrow buildSpellArrow(Level worldIn, Player playerentity, ISpellCaster caster, boolean isSpellArrow, ItemStack bowStack) { + public EntitySpellArrow buildSpellArrow(Level worldIn, Player playerentity, AbstractCaster caster, boolean isSpellArrow, ItemStack bowStack) { EntitySpellArrow spellArrow = new EntitySpellArrow(worldIn, playerentity, ItemStack.EMPTY, bowStack); spellArrow.spellResolver = new SpellResolver(new SpellContext(worldIn, caster.getSpell(), playerentity, new PlayerCaster(playerentity), bowStack)).withSilent(true); spellArrow.setColors(caster.getColor()); @@ -127,7 +127,7 @@ public void releaseUsing(ItemStack bowStack, Level worldIn, LivingEntity entityL } canFire = true; } - ISpellCaster caster = getSpellCaster(bowStack); + AbstractCaster caster = getSpellCaster(bowStack); boolean isSpellArrow = false; if (arrowStack.isEmpty() && caster.getSpell().isValid() && new SpellResolver(new SpellContext(worldIn, caster.getSpell(), playerentity, new PlayerCaster(playerentity), bowStack)).canCast(playerentity)) { canFire = true; @@ -236,7 +236,7 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { return spell.unsafeList().stream().noneMatch(s -> s instanceof AbstractCastMethod); } @@ -246,7 +246,7 @@ public void sendInvalidMessage(Player player) { } @Override - public void scribeModifiedSpell(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell) { + public void scribeModifiedSpell(AbstractCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell) { ArrayList recipe = new ArrayList<>(); recipe.add(MethodProjectile.INSTANCE); recipe.addAll(spell.recipe); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java index c7be8eeb90..5cab74d00d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java @@ -86,7 +86,7 @@ private boolean tryLoadProjectiles(LivingEntity pShooter, ItemStack pCrossbowSta ItemStack ammoStack = pShooter.getProjectile(pCrossbowStack); ItemStack ammoCopy = ammoStack.copy(); - SpellCaster caster = getSpellCaster(pCrossbowStack); + AbstractCaster caster = getSpellCaster(pCrossbowStack); SpellResolver resolver = new SpellResolver(new SpellContext(pShooter.level, caster.modifySpellBeforeCasting(pShooter.level, pShooter, InteractionHand.MAIN_HAND, caster.getSpell()), pShooter, LivingCaster.from(pShooter), pCrossbowStack)); boolean consumedMana = false; @@ -137,7 +137,7 @@ public void shootOne(Level worldIn, LivingEntity pShooter, InteractionHand pHand } } LivingCaster livingCaster = pShooter instanceof Player ? new PlayerCaster((Player)pShooter) : new LivingCaster(pShooter); - SpellCaster caster = getSpellCaster(pCrossbowStack); + AbstractCaster caster = getSpellCaster(pCrossbowStack); SpellResolver resolver = new SpellResolver(new SpellContext(worldIn, caster.modifySpellBeforeCasting(worldIn, pShooter, InteractionHand.MAIN_HAND, caster.getSpell()), pShooter, livingCaster, pCrossbowStack)); if (pAmmoStack.getItem() == Items.ARROW && isSpell) { projectile = buildSpellArrow(worldIn, pShooter, caster, pCrossbowStack); @@ -205,7 +205,7 @@ public Predicate getAllSupportedProjectiles() { return super.getAllSupportedProjectiles().or(i -> i.getItem() instanceof SpellArrow); } - public EntitySpellArrow buildSpellArrow(Level worldIn, LivingEntity playerentity, ISpellCaster caster, ItemStack bowStack) { + public EntitySpellArrow buildSpellArrow(Level worldIn, LivingEntity playerentity, AbstractCaster caster, ItemStack bowStack) { EntitySpellArrow spellArrow = new EntitySpellArrow(worldIn, playerentity, ItemStack.EMPTY, bowStack); spellArrow.spellResolver = new SpellResolver(new SpellContext(worldIn, caster.getSpell(), playerentity, LivingCaster.from(playerentity), playerentity.getMainHandItem())).withSilent(true); spellArrow.setColors(caster.getColor()); @@ -219,7 +219,7 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { return spell.unsafeList().stream().noneMatch(s -> s instanceof AbstractCastMethod); } @@ -229,7 +229,7 @@ public void sendInvalidMessage(Player player) { } @Override - public void scribeModifiedSpell(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell) { + public void scribeModifiedSpell(AbstractCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell) { ArrayList recipe = new ArrayList<>(); recipe.add(MethodProjectile.INSTANCE); recipe.addAll(spell.recipe); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java index 7cecb1190d..34e19c5785 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.item.ICasterTool; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; import com.hollingsworth.arsnouveau.setup.config.Config; @@ -28,7 +29,7 @@ public SpellParchment() { @Override public Component getName(ItemStack pStack) { - SpellCaster caster = getSpellCaster(pStack); + AbstractCaster caster = getSpellCaster(pStack); return caster.getSpellName().isEmpty() ? super.getName(pStack) : Component.literal(caster.getSpellName()); } @@ -40,7 +41,7 @@ public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, L @Override public Optional getTooltipImage(ItemStack pStack) { - SpellCaster caster = getSpellCaster(pStack); + AbstractCaster caster = getSpellCaster(pStack); if (Config.GLYPH_TOOLTIPS.get() && !Screen.hasShiftDown() && !caster.isSpellHidden() && !caster.getSpell().isEmpty()) return Optional.of(new SpellTooltip(caster)); return Optional.empty(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java index 2a69d8b140..adabd81958 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java @@ -48,7 +48,7 @@ private

PlayState predicate(AnimationState

e @Override public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); - ISpellCaster caster = getSpellCaster(stack); + AbstractCaster caster = getSpellCaster(stack); return caster.castSpell(worldIn, (LivingEntity) playerIn, handIn, Component.translatable("ars_nouveau.wand.invalid")); } @@ -63,7 +63,7 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public boolean isScribedSpellValid(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { + public boolean isScribedSpellValid(AbstractCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { return spell.mutable().recipe.stream().noneMatch(s -> s instanceof AbstractCastMethod); } @@ -73,7 +73,7 @@ public void sendInvalidMessage(Player player) { } @Override - public void scribeModifiedSpell(SpellCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell) { + public void scribeModifiedSpell(AbstractCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell) { ArrayList recipe = new ArrayList<>(); recipe.add(MethodProjectile.INSTANCE); recipe.add(AugmentAccelerate.INSTANCE); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ReactiveCasterData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ReactiveCasterData.java index f04998f643..8f68ec3935 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ReactiveCasterData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ReactiveCasterData.java @@ -12,11 +12,21 @@ import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.util.FakePlayer; -public class ReactiveCasterData extends SpellCaster { +public class ReactiveCasterData extends AbstractCaster { public static MapCodec CODEC = SpellCaster.createCodec(ReactiveCasterData::new); public static StreamCodec STREAM_CODEC = createStream(ReactiveCasterData::new); + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public StreamCodec streamCodec() { + return STREAM_CODEC; + } + public ReactiveCasterData(Integer slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots) { super(slot, flavorText, isHidden, hiddenText, maxSlots); } @@ -34,7 +44,12 @@ public SpellResolver getSpellResolver(SpellContext context, Level worldIn, Livin } @Override - public DataComponentType getComponentType() { + public DataComponentType getComponentType() { return DataComponentRegistry.REACTIVE_CASTER.get(); } + + @Override + protected ReactiveCasterData build(int slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, SpellSlotMap spells) { + return new ReactiveCasterData(slot, flavorText, isHidden, hiddenText, maxSlots, spells); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java index 8a72456fb7..307be9fd53 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java @@ -31,12 +31,19 @@ import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; -public class ScryCasterData extends SpellCaster { +public class ScryCasterData extends AbstractCaster { public static final MapCodec CODEC = createCodec(ScryCasterData::new); + public static final StreamCodec STREAM_CODEC = createStream(ScryCasterData::new); + public MapCodec codec(){ + return CODEC; + } + public StreamCodec streamCodec(){ + return STREAM_CODEC; + } public ScryCasterData() { super(); } @@ -108,7 +115,12 @@ public InteractionResultHolder castSpell(Level worldIn, LivingEntity } @Override - public DataComponentType getComponentType() { + public DataComponentType getComponentType() { return DataComponentRegistry.SCRY_CASTER.get(); } + + @Override + protected ScryCasterData build(int slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, SpellSlotMap spells) { + return new ScryCasterData(slot, flavorText, isHidden, hiddenText, maxSlots, spells); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java index 1a9517cd35..ec14a3c15f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java @@ -1,10 +1,7 @@ package com.hollingsworth.arsnouveau.common.items.data; import com.hollingsworth.arsnouveau.api.mana.IManaCap; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; -import com.hollingsworth.arsnouveau.api.spell.SpellContext; -import com.hollingsworth.arsnouveau.api.spell.SpellResolver; -import com.hollingsworth.arsnouveau.api.spell.SpellSlotMap; +import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.NotEnoughManaPacket; import com.hollingsworth.arsnouveau.common.util.PortUtil; @@ -21,12 +18,22 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -public class TomeCasterData extends SpellCaster { +public class TomeCasterData extends AbstractCaster { public static final MapCodec CODEC = SpellCaster.createCodec(TomeCasterData::new); public static final StreamCodec STREAM_CODEC = createStream(TomeCasterData::new); + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public StreamCodec streamCodec() { + return STREAM_CODEC; + } + public TomeCasterData() { super(); } @@ -61,7 +68,12 @@ protected boolean enoughMana(LivingEntity entity) { } @Override - public DataComponentType getComponentType() { + public DataComponentType getComponentType() { return DataComponentRegistry.TOME_CASTER.get(); } + + @Override + protected TomeCasterData build(int slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, SpellSlotMap spells) { + return new TomeCasterData(slot, flavorText, isHidden, hiddenText, maxSlots, spells); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/AllayBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/AllayBehavior.java index 075ce2952b..203b342cf0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/AllayBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/AllayBehavior.java @@ -32,7 +32,6 @@ public class AllayBehavior extends JarBehavior { @Override public void use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit, MobJarTile tile) { super.use(state, world, pos, player, handIn, hit, tile); - Allay allay = entityFromJar(tile); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetCasterSlot.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetCasterSlot.java index a5f2b5b1c6..b54bb8d30b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetCasterSlot.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetCasterSlot.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.api.util.StackUtil; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; @@ -29,7 +29,7 @@ public PacketSetCasterSlot(int slot) { @Override public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { ItemStack stack = StackUtil.getHeldSpellbook(player); - SpellCaster caster = SpellCasterRegistry.from(stack); + AbstractCaster caster = SpellCasterRegistry.from(stack); if(caster != null){ caster.setCurrentSlot(slot).saveToStack(stack); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java index 8fa8f811df..6685aecbc2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateCaster.java @@ -3,8 +3,8 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.item.ICasterTool; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.api.spell.Spell; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; import com.hollingsworth.arsnouveau.common.util.ANCodecs; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; @@ -53,7 +53,7 @@ public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer playe if(!(stack.getItem() instanceof ICasterTool)) return; if (spellRecipe != null) { - SpellCaster caster = SpellCasterRegistry.from(stack); + AbstractCaster caster = SpellCasterRegistry.from(stack); // Update just the recipe, don't overwrite the entire spell. var spell = caster.getSpell(cast_slot).mutable().setRecipe(new ArrayList<>(spellRecipe.unsafeList())); caster.setCurrentSlot(cast_slot).setSpell(spell.immutable(), cast_slot).setSpellName(spellName, cast_slot).saveToStack(stack); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColorAll.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColorAll.java index 90a52a24b6..025d6ac541 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColorAll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColorAll.java @@ -2,7 +2,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.items.SpellBook; import net.minecraft.network.RegistryFriendlyByteBuf; @@ -30,7 +30,7 @@ public void toBytes(RegistryFriendlyByteBuf buf) { public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { ItemStack stack = player.getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); if (stack.getItem() instanceof SpellBook) { - SpellCaster caster = SpellCasterRegistry.from(stack); + AbstractCaster caster = SpellCasterRegistry.from(stack); for (int i = 0; i < caster.getMaxSlots(); i++) { caster = caster.setColor(color, i); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColors.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColors.java index a2c23ede5d..594d67a3e3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColors.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellColors.java @@ -3,7 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.registry.ParticleColorRegistry; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.items.SpellBook; import net.minecraft.network.RegistryFriendlyByteBuf; @@ -44,7 +44,7 @@ public void toBytes(RegistryFriendlyByteBuf buf) { public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { ItemStack stack = player.getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); if (stack.getItem() instanceof SpellBook) { - SpellCaster caster = SpellCasterRegistry.from(stack); + AbstractCaster caster = SpellCasterRegistry.from(stack); caster.setColor(color, castSlot).setCurrentSlot(castSlot).saveToStack(stack); Networking.sendToPlayerClient(new PacketUpdateBookGUI(stack), player); Networking.sendToPlayerClient( new PacketOpenSpellBook(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND), player); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java index ef0a49d4b3..8d33f58180 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateSpellSoundAll.java @@ -3,7 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; -import com.hollingsworth.arsnouveau.api.spell.SpellCaster; +import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.common.items.SpellBook; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; @@ -31,7 +31,7 @@ public PacketUpdateSpellSoundAll(RegistryFriendlyByteBuf buf) { public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { ItemStack stack = player.getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); if (stack.getItem() instanceof SpellBook) { - SpellCaster caster = SpellCasterRegistry.from(stack); + AbstractCaster caster = SpellCasterRegistry.from(stack); for (int i = 0; i < caster.getMaxSlots(); i++) { caster = caster.setSound(sound, i); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java index 27cf50cfa2..3d266cbb0b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.api.util.BlockUtil; +import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAOE; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDampen; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentSensitive; @@ -23,9 +24,9 @@ public class EffectBurst extends AbstractEffect { public static final EffectBurst INSTANCE = new EffectBurst(); - //TODO: fix burst not using proper ID + public EffectBurst() { - super("burst", "Burst"); + super(GlyphLib.EffectBurstID, "Burst"); EffectReset.RESET_LIMITS.add(this); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java index 3f649fbc5e..8c1281e8e6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java @@ -67,7 +67,7 @@ public Component getName(Level world, @NotNull LivingEntity shooter, SpellStats if (newName == null && isRealPlayer(shooter) && shooter instanceof Player player) { ItemStack stack = StackUtil.getHeldCasterToolOrEmpty(player); if (stack != ItemStack.EMPTY) { - SpellCaster caster = SpellCasterRegistry.from(stack); + AbstractCaster caster = SpellCasterRegistry.from(stack); newName = Component.literal(caster.getSpellName()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java index 783783ea98..bbc60b2c0d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java @@ -37,7 +37,7 @@ public class DataComponentRegistry { public static final DeferredHolder, DataComponentType> CODEX_DATA = DATA.register("codex_data", () -> DataComponentType.builder().persistent(CodexData.CODEC).networkSynchronized(CodexData.STREAM).build()); - public static final DeferredHolder, DataComponentType> SPELL_CASTER = DATA.register("spell_caster", () -> DataComponentType.builder().persistent(SpellCaster.DEFAULT_CODEC.codec()).networkSynchronized(SpellCaster.DEFAULT_STREAM).build()); + public static final DeferredHolder, DataComponentType> SPELL_CASTER = DATA.register("spell_caster", () -> DataComponentType.builder().persistent(SpellCaster.CODEC.codec()).networkSynchronized(SpellCaster.STREAM_CODEC).build()); public static final DeferredHolder, DataComponentType> SCRY_CASTER = DATA.register("scry_caster", () -> DataComponentType.builder().persistent(ScryCasterData.CODEC.codec()).networkSynchronized(ScryCasterData.STREAM_CODEC).build()); From 7b2dad2510827fd72c5211274608bab9f71d433b Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 13 Jul 2024 11:48:00 -0500 Subject: [PATCH 054/363] fix tag scryer --- .../hollingsworth/arsnouveau/api/scrying/TagScryer.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java index 36ee0f736e..82f80bf558 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/scrying/TagScryer.java @@ -34,7 +34,12 @@ public boolean shouldRevealBlock(BlockState state, BlockPos p, Player player) { public IScryer fromTag(CompoundTag tag) { TagScryer scryer = new TagScryer(); if (tag.contains("blockTag")) { - scryer.blockTag = BuiltInRegistries.BLOCK.getTag(new TagKey<>(Registries.BLOCK, ResourceLocation.tryParse(tag.getString("blockTag")))).get().key(); + var tagKey = TagKey.create(Registries.BLOCK, ResourceLocation.tryParse(tag.getString("blockTag"))); + var blocks = BuiltInRegistries.BLOCK.getTag(tagKey); + if(blocks.isEmpty()){ + return scryer; + } + scryer.blockTag = tagKey; } return scryer; } From efd68e7580908471db555e363488bf107b2c7a9c Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 13 Jul 2024 12:38:12 -0500 Subject: [PATCH 055/363] fix item colors, item scroll scribing --- .../client/registry/ClientHandler.java | 15 ++++++++++----- .../arsnouveau/common/items/ItemScroll.java | 12 +++++++++++- .../models/item/spell_parchment.json | 2 +- .../textures/item/scroll_inscribed.png | Bin 3556 -> 607 bytes .../ars_nouveau/textures/item/scroll_runes.png | Bin 162 -> 131 bytes 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index 54f0bb78b5..852b64c0ec 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -2,9 +2,9 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.camera.ICameraMountable; -import com.hollingsworth.arsnouveau.api.item.ICasterTool; import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; import com.hollingsworth.arsnouveau.api.registry.PotionProviderRegistry; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.util.PerkUtil; import com.hollingsworth.arsnouveau.client.container.CraftingTerminalScreen; import com.hollingsworth.arsnouveau.client.gui.GuiEntityInfoHUD; @@ -38,6 +38,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; +import net.minecraft.util.FastColor; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; @@ -307,8 +308,8 @@ public static void initItemColors(final RegisterColorHandlersEvent.Item event) { ItemsRegistry.BATTLEMAGE_LEGGINGS); event.register((stack, color) -> { - if (color == 1 && stack.getItem() instanceof ICasterTool i) { - return i.getSpellCaster(stack).getColor().getColor(); + if (color == 1 && SpellCasterRegistry.from(stack) != null) { + return FastColor.ABGR32.opaque(SpellCasterRegistry.from(stack).getColor().getColor()); } return -1; @@ -327,12 +328,16 @@ public static void initItemColors(final RegisterColorHandlersEvent.Item event) { public static int colorFromArmor(ItemStack stack) { IPerkHolder holder = PerkUtil.getPerkHolder(stack); if (!(holder instanceof ArmorPerkHolder armorPerkHolder)) - return DyeColor.PURPLE.getTextColor(); - return DyeColor.byName(armorPerkHolder.getColor(), DyeColor.PURPLE).getTextColor(); + return FastColor.ABGR32.opaque(DyeColor.PURPLE.getTextColor()); + return FastColor.ABGR32.opaque(DyeColor.byName(armorPerkHolder.getColor(), DyeColor.PURPLE).getTextColor()); } public static int colorFromFlask(ItemStack stack) { PotionContents contents = PotionUtil.getContents(stack); + var provider = PotionProviderRegistry.from(stack); + if(provider != null){ + return provider.usesRemaining(stack) <= 0 ? 0 : provider.getPotionData(stack).getColor(); + } return contents == PotionContents.EMPTY ? -1 : contents.getColor(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java index 49f42c2b60..e53faa9099 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java @@ -5,12 +5,16 @@ import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; +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 net.neoforged.neoforge.items.IItemHandler; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -52,7 +56,13 @@ public boolean onScribe(Level world, BlockPos pos, Player player, InteractionHan ItemScrollData existingList = thisStack.getOrDefault(DataComponentRegistry.ITEM_SCROLL_DATA, new ItemScrollData(List.of())); var mutable = existingList.mutable(); var success = mutable.writeWithFeedback(player, stackToWrite); - stackToWrite.set(DataComponentRegistry.ITEM_SCROLL_DATA, mutable.toImmutable()); + thisStack.set(DataComponentRegistry.ITEM_SCROLL_DATA, mutable.toImmutable()); return success; } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Item.TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); + stack.addToTooltip(DataComponentRegistry.ITEM_SCROLL_DATA, context, tooltip2::add, flagIn); + } } diff --git a/src/main/resources/assets/ars_nouveau/models/item/spell_parchment.json b/src/main/resources/assets/ars_nouveau/models/item/spell_parchment.json index 76c9fd19ad..c11c4449fd 100644 --- a/src/main/resources/assets/ars_nouveau/models/item/spell_parchment.json +++ b/src/main/resources/assets/ars_nouveau/models/item/spell_parchment.json @@ -1,7 +1,7 @@ { "parent": "item/generated", "textures": { - "layer0": "ars_nouveau:item/blank_parchment", + "layer0": "ars_nouveau:item/scroll_inscribed", "layer1": "ars_nouveau:item/scroll_runes" } } diff --git a/src/main/resources/assets/ars_nouveau/textures/item/scroll_inscribed.png b/src/main/resources/assets/ars_nouveau/textures/item/scroll_inscribed.png index 58d5938371f5121c39efe098aeb6033da17e9cb3..dfa4e82053cf39ad7789892c2645df4101bb9348 100644 GIT binary patch delta 582 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 aI{*MeASVFy-}#IH0000 Date: Sat, 13 Jul 2024 12:49:05 -0500 Subject: [PATCH 056/363] fix item rendering, itemstack parsing --- .../arsnouveau/common/block/tile/AlterationTile.java | 4 +--- .../arsnouveau/common/block/tile/CraftingLecternTile.java | 2 +- .../arsnouveau/common/block/tile/ImbuementTile.java | 7 ++----- .../arsnouveau/common/block/tile/ItemDetectorTile.java | 5 ++--- .../arsnouveau/common/block/tile/ScribesTile.java | 4 +--- .../arsnouveau/common/block/tile/SingleItemTile.java | 4 +--- .../arsnouveau/common/entity/AmethystGolem.java | 3 +-- .../arsnouveau/common/entity/EntityBookwyrm.java | 3 +-- .../arsnouveau/common/entity/EntityFlyingItem.java | 4 +--- .../hollingsworth/arsnouveau/common/entity/Starbuncle.java | 4 ++-- .../entity/goal/carbuncle/StarbyTransportBehavior.java | 3 +-- 11 files changed, 14 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java index 9f4c0d0ac9..916c89a3d0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java @@ -176,9 +176,7 @@ protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries @Override protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.loadAdditional(compound, pRegistries); - if(compound.contains("armorStack")) { - this.armorStack = ItemStack.parseOptional(pRegistries, compound.getCompound("armorStack")); - } + this.armorStack = ItemStack.parseOptional(pRegistries, compound.getCompound("armorStack")); int count = compound.getInt("numPerks"); perkList = new ArrayList<>(); for(int i = 0; i < count; i++){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java index 22d7dcbc03..9d62637d9d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java @@ -97,7 +97,7 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis CompoundTag compoundnbt = listnbt.getCompound(i); int j = compoundnbt.getInt("Slot"); if (j >= 0 && j < craftMatrix.getContainerSize()) { - craftMatrix.setItem(j, ItemStack.parse(pRegistries, compoundnbt.get("item")).orElse(ItemStack.EMPTY)); + craftMatrix.setItem(j, ItemStack.parseOptional(pRegistries, compoundnbt.getCompound("item"))); } } reading = false; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java index ec619f07cc..7ce31ce1a2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java @@ -160,11 +160,8 @@ public void tick() { @Override protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.loadAdditional(tag, pRegistries); - if (tag.contains("itemStack")) { - stack = ItemStack.parseOptional(pRegistries, tag.getCompound("itemStack")); - }else{ - stack = ItemStack.EMPTY; - } + stack = ItemStack.parseOptional(pRegistries, tag.getCompound("itemStack")); + draining = tag.getBoolean("draining"); this.hasRecipe = tag.getBoolean("hasRecipe"); this.craftTicks = tag.getInt("craftTicks"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java index 753c2a6df5..3222ee181b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java @@ -171,9 +171,8 @@ protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistrie connectedPos = BlockPos.of(pTag.getLong("connectedPos")); } this.neededCount = pTag.getInt("neededCount"); - if(pTag.contains("filterStack")){ - filterStack = ItemStack.parseOptional(pRegistries, pTag.getCompound("filterStack")); - } + filterStack = ItemStack.parseOptional(pRegistries, pTag.getCompound("filterStack")); + isPowered = pTag.getBoolean("isPowered"); inverted = pTag.getBoolean("inverted"); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java index 6580bdde67..30c840cfe3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java @@ -265,9 +265,7 @@ public void onWanded(Player playerEntity) { @Override protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.loadAdditional(compound, pRegistries); - if(compound.contains("itemStack")) { - stack = ItemStack.parseOptional(pRegistries, compound.getCompound("itemStack")); - } + stack = ItemStack.parseOptional(pRegistries, compound.getCompound("itemStack")); if (compound.contains("recipe")) { recipeID = ResourceLocation.tryParse(compound.getString("recipe")); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java index c603b49874..e569d9b6b1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SingleItemTile.java @@ -91,9 +91,7 @@ public void setStack(ItemStack otherStack){ @Override protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.loadAdditional(compound, pRegistries); - if(compound.contains("itemStack")) { - ItemStack.parse(pRegistries, compound.get("itemStack")).ifPresent(stack -> this.stack = stack); - } + this.stack = ItemStack.parseOptional(pRegistries, compound.getCompound("itemStack")); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java index 907628938c..bcffe3cfa7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java @@ -282,8 +282,7 @@ public void readAdditionalSaveData(CompoundTag tag) { this.harvestCooldown = tag.getInt("harvest"); this.pickupCooldown = tag.getInt("pickup"); - if (tag.contains("held")) - setHeldStack(ItemStack.parse(level.registryAccess(), tag.get("held")).orElse(ItemStack.EMPTY)); + setHeldStack(ItemStack.parseOptional(level.registryAccess(), tag.getCompound("held"))); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java index a1c9873b88..c742ec7829 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java @@ -254,8 +254,7 @@ public void readAdditionalSaveData(CompoundTag tag) { if (tag.contains("lectern")){ lecternPos = BlockPos.of(tag.getLong("lectern")); } - if (tag.contains("held")) - setHeldStack(ItemStack.parseOptional(registryAccess(), (CompoundTag) tag.get("held"))); + setHeldStack(ItemStack.parseOptional(registryAccess(), tag.getCompound("held"))); this.backoffTicks = tag.getInt("backoff"); if (tag.contains("color")) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java index 8d8b6caef5..3dfc8bd93e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java @@ -183,9 +183,7 @@ private double getDistanceAdjustment(Vec3 start, Vec3 end) { @Override public void load(CompoundTag compound) { super.load(compound); - if (compound.contains("item")) { - this.entityData.set(HELD_ITEM, ItemStack.parseOptional(level.registryAccess(), compound.getCompound("item"))); - } + this.entityData.set(HELD_ITEM, ItemStack.parseOptional(level.registryAccess(), compound.getCompound("item"))); this.age = compound.getInt("age"); this.entityData.set(DIDOFFSET, compound.getBoolean("didoffset")); this.entityData.set(OFFSET, compound.getFloat("offset")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 0a0975661e..ed532defc9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -571,8 +571,8 @@ public void readAdditionalSaveData(CompoundTag tag) { super.readAdditionalSaveData(tag); data = NBTComponent.fromTag(StarbuncleCharmData.CODEC.codec(), tag.contains("starbuncleData") ? tag.getCompound("starbuncleData") : new CompoundTag()).mutable(); this.dynamicBehavior = BehaviorRegistry.create(data.behaviorKey, this, data.behaviorTag); - if (tag.contains("held")) - setHeldStack(ItemStack.parseOptional(level.registryAccess(), (CompoundTag) tag.get("held"))); + setHeldStack(ItemStack.parseOptional(level.registryAccess(), tag.getCompound("held"))); + backOff = tag.getInt("backoff"); this.entityData.set(TAMED, tag.getBoolean("tamed")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java index e286238670..3a8314c982 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java @@ -57,8 +57,7 @@ public StarbyTransportBehavior(Starbuncle entity, CompoundTag tag) { if (!entity.isTamed()) return; - if (tag.contains("itemScroll")) - this.itemScroll = ItemStack.parseOptional(entity.level.registryAccess(), tag.getCompound("itemScroll")); + this.itemScroll = ItemStack.parseOptional(entity.level.registryAccess(), tag.getCompound("itemScroll")); } @Override From b0c154e27ea63d69f2b1f409e903d8059f9d6087 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 13 Jul 2024 12:53:46 -0500 Subject: [PATCH 057/363] fix repository model --- .../arsnouveau/common/block/tile/RepositoryTile.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RepositoryTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RepositoryTile.java index b78883daa5..033c4839cd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RepositoryTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RepositoryTile.java @@ -175,9 +175,9 @@ public boolean updateBlock() { @Override public CompoundTag getUpdateTag(HolderLookup.Provider pRegistries) { - CompoundTag tag = new CompoundTag(); + CompoundTag tag = super.getUpdateTag(pRegistries); this.saveAdditional(tag, pRegistries); - return super.getUpdateTag(pRegistries); + return tag; } @Override From 9b2cf3f6184eef02040726fda321eb0ad7b85a9b Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 13 Jul 2024 15:05:19 -0500 Subject: [PATCH 058/363] Fix capabilities, data attachments --- .../arsnouveau/api/mana/IManaCap.java | 5 +- .../arsnouveau/client/gui/GuiManaHUD.java | 13 ++- .../common/capability/ANPlayerData.java | 68 +++++++++++ .../common/capability/ANPlayerDataCap.java | 109 +++++++----------- .../common/capability/IPlayerCap.java | 5 +- .../arsnouveau/common/capability/ManaCap.java | 76 ++++++------ .../common/capability/ManaData.java | 80 +++++++++++++ .../common/event/ManaCapEvents.java | 57 ++++----- .../arsnouveau/common/items/SpellBook.java | 10 +- .../common/network/PacketSyncPlayerCap.java | 14 ++- .../common/network/PacketUpdateMana.java | 53 +++------ .../arsnouveau/setup/ModSetup.java | 1 + .../setup/registry/AttachmentsRegistry.java | 29 +++++ .../setup/registry/CapabilityRegistry.java | 83 +++++++------ 14 files changed, 372 insertions(+), 231 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerData.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaData.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/setup/registry/AttachmentsRegistry.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/mana/IManaCap.java b/src/main/java/com/hollingsworth/arsnouveau/api/mana/IManaCap.java index 3b48e82223..8ba8af7148 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/mana/IManaCap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/mana/IManaCap.java @@ -1,9 +1,6 @@ package com.hollingsworth.arsnouveau.api.mana; -import net.minecraft.nbt.CompoundTag; -import net.neoforged.neoforge.common.util.INBTSerializable; - -public interface IManaCap extends INBTSerializable { +public interface IManaCap { double getCurrentMana(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java index 74310cc6c2..c423e2cbc6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java @@ -4,9 +4,9 @@ import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; import com.hollingsworth.arsnouveau.api.client.IDisplayMana; import com.hollingsworth.arsnouveau.api.mana.IManaCap; -import com.hollingsworth.arsnouveau.api.util.ManaUtil; import com.hollingsworth.arsnouveau.client.ClientInfo; import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; +import com.hollingsworth.arsnouveau.common.capability.ManaCap; import com.hollingsworth.arsnouveau.setup.config.Config; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.mojang.blaze3d.systems.RenderSystem; @@ -26,9 +26,14 @@ public class GuiManaHUD { public static boolean shouldDisplayBar() { ItemStack mainHand = minecraft.player.getMainHandItem(); ItemStack offHand = minecraft.player.getOffhandItem(); - return (mainHand.getItem() instanceof IDisplayMana iDisplayMana && iDisplayMana.shouldDisplay(mainHand)) - || (offHand.getItem() instanceof IDisplayMana iDisplayManaOffhand && iDisplayManaOffhand.shouldDisplay(offHand)) - || (ManaUtil.getMaxMana(minecraft.player) > ManaUtil.getCurrentMana(minecraft.player)); + var isMainDisplayable = mainHand.getItem() instanceof IDisplayMana iDisplayMana && iDisplayMana.shouldDisplay(mainHand); + var isOffhandDisplayable = offHand.getItem() instanceof IDisplayMana iDisplayManaOffhand && iDisplayManaOffhand.shouldDisplay(offHand); + ManaCap cap = CapabilityRegistry.getMana(minecraft.player).orElse(null); + boolean isRegenerating = false; + if(cap != null){ + isRegenerating = cap.getMaxMana() > cap.getCurrentMana(); + } + return isMainDisplayable || isOffhandDisplayable || isRegenerating; } public static void renderOverlay(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerData.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerData.java new file mode 100644 index 0000000000..2daf08d351 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerData.java @@ -0,0 +1,68 @@ +package com.hollingsworth.arsnouveau.common.capability; + +import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; +import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.common.util.INBTSerializable; +import org.jetbrains.annotations.UnknownNullability; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class ANPlayerData implements INBTSerializable { + public Set glyphs = new HashSet<>(); + + public Set familiars = new HashSet<>(); + + public ResourceLocation lastSummonedFamiliar; + + @Override + public @UnknownNullability CompoundTag serializeNBT(HolderLookup.Provider provider) { + CompoundTag tag = new CompoundTag(); + + CompoundTag glyphsTag = new CompoundTag(); + List glyphsList = glyphs.stream().toList(); + for (int i = 0; i < glyphsList.size(); i++) { + glyphsTag.putString("glyph" + i, glyphsList.get(i).getRegistryName().toString()); + } + glyphsTag.putInt("size", glyphsList.size()); + tag.put("glyphs", glyphsTag); + + CompoundTag familiarsTag = new CompoundTag(); + List familiarsList = familiars.stream().toList(); + for (int i = 0; i < familiarsList.size(); i++) { + familiarsTag.put("familiar" + i, familiarsList.get(i).toTag()); + } + familiarsTag.putInt("size", familiarsList.size()); + tag.put("familiars", familiarsTag); + if(lastSummonedFamiliar != null){ + tag.putString("lastSummonedFamiliar", lastSummonedFamiliar.toString()); + } + return tag; + } + + @Override + public void deserializeNBT(HolderLookup.Provider provider, CompoundTag nbt) { + glyphs = new HashSet<>(); + familiars = new HashSet<>(); + + CompoundTag glyphsTag = nbt.getCompound("glyphs"); + for (int i = 0; i < glyphsTag.getInt("size"); i++) { + ResourceLocation id = ResourceLocation.parse(glyphsTag.getString("glyph" + i)); + AbstractSpellPart part = GlyphRegistry.getSpellPart(id); + if (part != null) + glyphs.add(part); + } + + CompoundTag familiarsTag = nbt.getCompound("familiars"); + for (int i = 0; i < familiarsTag.getInt("size"); i++) { + familiars.add(new FamiliarData(familiarsTag.getCompound("familiar" + i))); + } + if(nbt.contains("lastSummonedFamiliar")){ + lastSummonedFamiliar = ResourceLocation.parse(nbt.getString("lastSummonedFamiliar")); + } + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerDataCap.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerDataCap.java index ac1deb37b7..13963b42bb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerDataCap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ANPlayerDataCap.java @@ -1,135 +1,110 @@ package com.hollingsworth.arsnouveau.common.capability; import com.hollingsworth.arsnouveau.api.familiar.AbstractFamiliarHolder; -import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; -import net.minecraft.core.HolderLookup; +import com.hollingsworth.arsnouveau.common.network.Networking; +import com.hollingsworth.arsnouveau.common.network.PacketSyncPlayerCap; +import com.hollingsworth.arsnouveau.setup.registry.AttachmentsRegistry; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.UnknownNullability; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.LivingEntity; import javax.annotation.Nullable; import java.util.Collection; import java.util.HashSet; -import java.util.List; -import java.util.Set; public class ANPlayerDataCap implements IPlayerCap { - public Set glyphs = new HashSet<>(); - - public Set familiars = new HashSet<>(); - - public ResourceLocation lastSummonedFamiliar; - - public ANPlayerDataCap() { + private ANPlayerData playerData; + LivingEntity entity; + public ANPlayerDataCap(LivingEntity livingEntity){ + playerData = livingEntity.getData(AttachmentsRegistry.PLAYER_DATA); + entity = livingEntity; } @Override public Collection getKnownGlyphs() { - return glyphs; + return playerData.glyphs; } @Override public void setKnownGlyphs(Collection glyphs) { - this.glyphs = new HashSet<>(glyphs); + playerData.glyphs = new HashSet<>(glyphs); + entity.setData(AttachmentsRegistry.PLAYER_DATA, playerData); } @Override public boolean unlockGlyph(AbstractSpellPart spellPart) { - return glyphs.add(spellPart); + var result = playerData.glyphs.add(spellPart); + if(result){ + entity.setData(AttachmentsRegistry.PLAYER_DATA, playerData); + } + return result; } @Override public boolean knowsGlyph(AbstractSpellPart spellPart) { - return glyphs.contains(spellPart); + return playerData.glyphs.contains(spellPart); } @Override public boolean unlockFamiliar(AbstractFamiliarHolder holderID) { - return familiars.add(new FamiliarData(holderID.getRegistryName())); + var result = playerData.familiars.add(new FamiliarData(holderID.getRegistryName())); + if(result){ + entity.setData(AttachmentsRegistry.PLAYER_DATA, playerData); + } + return result; } @Override public boolean ownsFamiliar(AbstractFamiliarHolder holderID) { - return familiars.stream().anyMatch(f -> f.familiarHolder.getRegistryName().equals(holderID.getRegistryName())); + return playerData.familiars.stream().anyMatch(f -> f.familiarHolder.getRegistryName().equals(holderID.getRegistryName())); } @Override public Collection getUnlockedFamiliars() { - return familiars; + return playerData.familiars; } @Override @Nullable public FamiliarData getFamiliarData(ResourceLocation id) { - return this.familiars.stream().filter(f -> f.familiarHolder.getRegistryName().equals(id)).findFirst().orElse(null); + return playerData.familiars.stream().filter(f -> f.familiarHolder.getRegistryName().equals(id)).findFirst().orElse(null); } @Nullable @Override public FamiliarData getLastSummonedFamiliar() { - return lastSummonedFamiliar == null ? null : getFamiliarData(lastSummonedFamiliar); + return playerData.lastSummonedFamiliar == null ? null : getFamiliarData(playerData.lastSummonedFamiliar); } public void setLastSummonedFamiliar(ResourceLocation lastSummonedFamiliar) { - this.lastSummonedFamiliar = lastSummonedFamiliar; + playerData.lastSummonedFamiliar = lastSummonedFamiliar; + entity.setData(AttachmentsRegistry.PLAYER_DATA, playerData); } @Override public void setUnlockedFamiliars(Collection familiars) { - this.familiars = new HashSet<>(familiars); + playerData.familiars = new HashSet<>(familiars); + entity.setData(AttachmentsRegistry.PLAYER_DATA, playerData); } @Override public boolean removeFamiliar(AbstractFamiliarHolder holderID) { - return this.familiars.removeIf(f -> f.familiarHolder.getRegistryName().equals(holderID.getRegistryName())); - } - - @Override - public @UnknownNullability CompoundTag serializeNBT(HolderLookup.Provider provider) { - CompoundTag tag = new CompoundTag(); - - CompoundTag glyphsTag = new CompoundTag(); - List glyphsList = glyphs.stream().toList(); - for (int i = 0; i < glyphsList.size(); i++) { - glyphsTag.putString("glyph" + i, glyphsList.get(i).getRegistryName().toString()); + var result = playerData.familiars.removeIf(f -> f.familiarHolder.getRegistryName().equals(holderID.getRegistryName())); + if(result){ + entity.setData(AttachmentsRegistry.PLAYER_DATA, playerData); } - glyphsTag.putInt("size", glyphsList.size()); - tag.put("glyphs", glyphsTag); - - CompoundTag familiarsTag = new CompoundTag(); - List familiarsList = familiars.stream().toList(); - for (int i = 0; i < familiarsList.size(); i++) { - familiarsTag.put("familiar" + i, familiarsList.get(i).toTag()); - } - familiarsTag.putInt("size", familiarsList.size()); - tag.put("familiars", familiarsTag); - if(lastSummonedFamiliar != null){ - tag.putString("lastSummonedFamiliar", lastSummonedFamiliar.toString()); - } - return tag; + return result; } - @Override - public void deserializeNBT(HolderLookup.Provider provider, CompoundTag nbt) { - glyphs = new HashSet<>(); - familiars = new HashSet<>(); - - CompoundTag glyphsTag = nbt.getCompound("glyphs"); - for (int i = 0; i < glyphsTag.getInt("size"); i++) { - ResourceLocation id = ResourceLocation.parse(glyphsTag.getString("glyph" + i)); - AbstractSpellPart part = GlyphRegistry.getSpellPart(id); - if (part != null) - glyphs.add(part); - } + public void setPlayerData(ANPlayerData data){ + this.playerData = data; + } - CompoundTag familiarsTag = nbt.getCompound("familiars"); - for (int i = 0; i < familiarsTag.getInt("size"); i++) { - familiars.add(new FamiliarData(familiarsTag.getCompound("familiar" + i))); - } - if(nbt.contains("lastSummonedFamiliar")){ - lastSummonedFamiliar = ResourceLocation.parse(nbt.getString("lastSummonedFamiliar")); - } + public void syncToClient(ServerPlayer player){ + CompoundTag tag = this.playerData.serializeNBT(player.registryAccess()); + Networking.sendToPlayerClient(new PacketSyncPlayerCap(tag), player); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/IPlayerCap.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/IPlayerCap.java index 58d6f7b15b..5c0bbd2dd6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/capability/IPlayerCap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/capability/IPlayerCap.java @@ -2,13 +2,12 @@ import com.hollingsworth.arsnouveau.api.familiar.AbstractFamiliarHolder; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; -import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; -import net.neoforged.neoforge.common.util.INBTSerializable; + import javax.annotation.Nullable; import java.util.Collection; -public interface IPlayerCap extends INBTSerializable { +public interface IPlayerCap { /*Glyph data*/ /** diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCap.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCap.java index 6c5ce81181..9b994f1843 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaCap.java @@ -1,50 +1,48 @@ package com.hollingsworth.arsnouveau.common.capability; import com.hollingsworth.arsnouveau.api.mana.IManaCap; -import net.minecraft.core.HolderLookup; +import com.hollingsworth.arsnouveau.common.network.Networking; +import com.hollingsworth.arsnouveau.common.network.PacketUpdateMana; +import com.hollingsworth.arsnouveau.setup.registry.AttachmentsRegistry; import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.LivingEntity; -import org.jetbrains.annotations.UnknownNullability; - -import javax.annotation.Nullable; public class ManaCap implements IManaCap { - private double mana; - - private int maxMana; - - private int glyphBonus; - - private int bookTier; - - - public ManaCap() {} + private ManaData manaData; + LivingEntity entity; + public ManaCap(LivingEntity livingEntity) { + manaData = livingEntity.getData(AttachmentsRegistry.MANA_ATTACHMENT); + entity = livingEntity; + } @Override public double getCurrentMana() { - return mana; + return manaData.getMana(); } @Override public int getMaxMana() { - return maxMana; + return manaData.getMaxMana(); } @Override public void setMaxMana(int maxMana) { - this.maxMana = maxMana; + manaData.setMaxMana(maxMana); + entity.setData(AttachmentsRegistry.MANA_ATTACHMENT, manaData); } @Override public double setMana(double mana) { if (mana > getMaxMana()) { - this.mana = getMaxMana(); + this.manaData.setMana(getMaxMana()); } else if (mana < 0) { - this.mana = 0; + this.manaData.setMana(0); } else { - this.mana = mana; + this.manaData.setMana(mana); } + entity.setData(AttachmentsRegistry.MANA_ATTACHMENT, manaData); return this.getCurrentMana(); } @@ -64,39 +62,41 @@ public double removeMana(double manaToRemove) { @Override public int getGlyphBonus() { - return glyphBonus; + return manaData.getGlyphBonus(); } @Override public void setGlyphBonus(int glyphBonus) { - this.glyphBonus = glyphBonus; + manaData.setGlyphBonus(glyphBonus); + entity.setData(AttachmentsRegistry.MANA_ATTACHMENT, manaData); } @Override public int getBookTier() { - return bookTier; + return manaData.getBookTier(); } @Override public void setBookTier(int bookTier) { - this.bookTier = bookTier; + manaData.setBookTier(bookTier); + entity.setData(AttachmentsRegistry.MANA_ATTACHMENT, manaData); } - @Override - public @UnknownNullability CompoundTag serializeNBT(HolderLookup.Provider provider) { - CompoundTag tag = new CompoundTag(); - tag.putDouble("current", getCurrentMana()); - tag.putInt("max", getMaxMana()); - tag.putInt("glyph", getGlyphBonus()); - tag.putInt("book_tier", getBookTier()); - return tag; + public float getReserve(){ + return manaData.getReservedMana(); } - @Override - public void deserializeNBT(HolderLookup.Provider provider, CompoundTag tag) { - setMaxMana(tag.getInt("max")); - setMana(tag.getDouble("current")); - setBookTier(tag.getInt("book_tier")); - setGlyphBonus(tag.getInt("glyph")); + public void setReserve(float reserve){ + manaData.setReservedMana(reserve); + entity.setData(AttachmentsRegistry.MANA_ATTACHMENT, manaData); + } + + public void setManaData(ManaData manaData) { + this.manaData = manaData; + } + + public void syncToClient(ServerPlayer player) { + CompoundTag tag = manaData.serializeNBT(player.registryAccess()); + Networking.sendToPlayerClient(new PacketUpdateMana(tag), player); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaData.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaData.java new file mode 100644 index 0000000000..94f9928e8d --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/capability/ManaData.java @@ -0,0 +1,80 @@ +package com.hollingsworth.arsnouveau.common.capability; + +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.neoforged.neoforge.common.util.INBTSerializable; +import org.jetbrains.annotations.UnknownNullability; + +public class ManaData implements INBTSerializable { + + private double mana; + + private int maxMana; + + private int glyphBonus; + + private int bookTier; + + private float reservedMana; + + + public double getMana() { + return mana; + } + + public void setMana(double mana) { + this.mana = mana; + } + + public int getMaxMana() { + return maxMana; + } + + public void setMaxMana(int maxMana) { + this.maxMana = maxMana; + } + + public int getGlyphBonus() { + return glyphBonus; + } + + public void setGlyphBonus(int glyphBonus) { + this.glyphBonus = glyphBonus; + } + + public int getBookTier() { + return bookTier; + } + + public void setBookTier(int bookTier) { + this.bookTier = bookTier; + } + + public float getReservedMana() { + return reservedMana; + } + + public void setReservedMana(float reservedMana) { + this.reservedMana = reservedMana; + } + + @Override + public @UnknownNullability CompoundTag serializeNBT(HolderLookup.Provider provider) { + CompoundTag tag = new CompoundTag(); + tag.putDouble("current", getMana()); + tag.putInt("max", getMaxMana()); + tag.putInt("glyph", getGlyphBonus()); + tag.putInt("book_tier", getBookTier()); + tag.putFloat("reserved", getReservedMana()); + return tag; + } + + @Override + public void deserializeNBT(HolderLookup.Provider provider, CompoundTag tag) { + setMaxMana(tag.getInt("max")); + setMana(tag.getDouble("current")); + setBookTier(tag.getInt("book_tier")); + setGlyphBonus(tag.getInt("glyph")); + setReservedMana(tag.getFloat("reserved")); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java index 6fb956d5e6..6355c10cc8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java @@ -1,10 +1,8 @@ package com.hollingsworth.arsnouveau.common.event; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.mana.IManaCap; import com.hollingsworth.arsnouveau.api.util.ManaUtil; -import com.hollingsworth.arsnouveau.common.network.Networking; -import com.hollingsworth.arsnouveau.common.network.PacketUpdateMana; +import com.hollingsworth.arsnouveau.common.capability.ManaCap; import com.hollingsworth.arsnouveau.setup.config.ServerConfig; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import net.minecraft.server.level.ServerPlayer; @@ -25,21 +23,27 @@ public static void playerOnTick(PlayerTickEvent.Pre e) { if (!(player instanceof ServerPlayer serverPlayer) || player.getCommandSenderWorld().getGameTime() % ServerConfig.REGEN_INTERVAL.get() != 0) return; - IManaCap mana = CapabilityRegistry.getMana(player).orElse(null); + ManaCap mana = CapabilityRegistry.getMana(player).orElse(null); if (mana == null) return; + boolean sync = false; // Force sync mana to client because client caps vanish on world change - boolean shouldIgnoreMax = player.level().getGameTime() % 60 == 0; - if (mana.getCurrentMana() != mana.getMaxMana() || shouldIgnoreMax) { + boolean forceSync = player.level().getGameTime() % 60 == 0; + if (mana.getCurrentMana() != mana.getMaxMana() || forceSync) { double regenPerSecond = ManaUtil.getManaRegen(player) / Math.max(1, ((int) MEAN_TPS / ServerConfig.REGEN_INTERVAL.get())); mana.addMana(regenPerSecond); - Networking.sendToPlayerClient(new PacketUpdateMana(mana.getCurrentMana(), mana.getMaxMana(), mana.getGlyphBonus(), mana.getBookTier()), serverPlayer); + sync = true; } ManaUtil.Mana maxmana = ManaUtil.calcMaxMana(player); int max = maxmana.getRealMax(); - if (mana.getMaxMana() != max || shouldIgnoreMax) { + if (mana.getMaxMana() != max || forceSync) { mana.setMaxMana(max); - Networking.sendToPlayerClient(new PacketUpdateMana(mana.getCurrentMana(), mana.getMaxMana(), mana.getGlyphBonus(), mana.getBookTier(), maxmana.Reserve()), serverPlayer); + mana.setReserve(maxmana.Reserve()); + sync = true; + } + + if(sync){ + mana.syncToClient(serverPlayer); } } @@ -47,21 +51,23 @@ public static void playerOnTick(PlayerTickEvent.Pre e) { public static void playerRespawn(PlayerEvent.PlayerRespawnEvent e) { syncPlayerEvent(e.getEntity()); } +//TODO: verify if player clone needed - @SubscribeEvent - public static void playerClone(PlayerEvent.Clone e) { - if (!(e.getOriginal() instanceof ServerPlayer serverPlayer)) - return; - - var newMana = CapabilityRegistry.getMana(e.getEntity()).orElse(null); - var origMana = CapabilityRegistry.getMana(e.getOriginal()).orElse(null); - if(newMana != null && origMana != null){ - newMana.setMaxMana(origMana.getMaxMana()); - newMana.setGlyphBonus(origMana.getGlyphBonus()); - newMana.setBookTier(origMana.getBookTier()); - Networking.sendToPlayerClient(new PacketUpdateMana(newMana.getCurrentMana(), newMana.getMaxMana(), newMana.getGlyphBonus(), newMana.getBookTier()), serverPlayer); - } - } +// @SubscribeEvent +// public static void playerClone(PlayerEvent.Clone e) { +// if (!(e.getOriginal() instanceof ServerPlayer serverPlayer)) +// return; +// +// var newMana = CapabilityRegistry.getMana(e.getEntity()).orElse(null); +// var origMana = CapabilityRegistry.getMana(e.getOriginal()).orElse(null); +// if(newMana != null && origMana != null){ +// newMana.setMaxMana(origMana.getMaxMana()); +// newMana.setGlyphBonus(origMana.getGlyphBonus()); +// newMana.setBookTier(origMana.getBookTier()); +// +// Networking.sendToPlayerClient(new PacketUpdateMana(newMana.getCurrentMana(), newMana.getMaxMana(), newMana.getGlyphBonus(), newMana.getBookTier()), serverPlayer); +// } +// } @SubscribeEvent public static void playerLoggedIn(PlayerEvent.StartTracking e) { @@ -79,9 +85,8 @@ public static void syncPlayerEvent(Player playerEntity) { if (mana != null) { var manaCalc = ManaUtil.calcMaxMana(playerEntity); mana.setMaxMana(manaCalc.getRealMax()); - mana.setGlyphBonus(mana.getGlyphBonus()); - mana.setBookTier(mana.getBookTier()); - Networking.sendToPlayerClient(new PacketUpdateMana(mana.getCurrentMana(), mana.getMaxMana(), mana.getGlyphBonus(), mana.getBookTier(), manaCalc.Reserve()), serverPlayer); + mana.setReserve(manaCalc.Reserve()); + mana.syncToClient(serverPlayer); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java index c717e1b08c..8bf28859b9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java @@ -13,7 +13,6 @@ import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.client.registry.ModKeyBindings; import com.hollingsworth.arsnouveau.client.renderer.item.SpellBookRenderer; -import com.hollingsworth.arsnouveau.common.capability.ANPlayerDataCap; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; import com.hollingsworth.arsnouveau.common.crafting.recipes.IDyeable; import com.hollingsworth.arsnouveau.common.network.Networking; @@ -29,6 +28,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; @@ -70,12 +70,18 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In if (this != ItemsRegistry.CREATIVE_SPELLBOOK.get()) { var iMana = CapabilityRegistry.getMana(playerIn).orElse(null); if(iMana != null){ + boolean shouldSync = false; if (iMana.getBookTier() < this.tier.value) { iMana.setBookTier(this.tier.value); + shouldSync = true; } - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(playerIn).orElse(new ANPlayerDataCap()); + IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(playerIn).orElse(null); if (iMana.getGlyphBonus() < cap.getKnownGlyphs().size()) { iMana.setGlyphBonus(cap.getKnownGlyphs().size()); + shouldSync = true; + } + if(shouldSync && playerIn instanceof ServerPlayer player) { + iMana.syncToClient(player); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java index d3614912e7..dee2418d45 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java @@ -1,8 +1,8 @@ package com.hollingsworth.arsnouveau.common.network; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.common.capability.ANPlayerDataCap; -import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; +import com.hollingsworth.arsnouveau.common.capability.ANPlayerData; +import com.hollingsworth.arsnouveau.setup.registry.AttachmentsRegistry; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundTag; @@ -30,10 +30,12 @@ public PacketSyncPlayerCap(CompoundTag famCaps) { @Override public void onClientReceived(Minecraft minecraft, Player playerEntity) { - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(playerEntity).orElse(new ANPlayerDataCap()); - - if (cap != null) { - cap.deserializeNBT(minecraft.level.registryAccess(), tag); + ANPlayerData data = new ANPlayerData(); + data.deserializeNBT(playerEntity.registryAccess(), this.tag); + playerEntity.setData(AttachmentsRegistry.PLAYER_DATA, data); + var cap = CapabilityRegistry.getPlayerDataCap(ArsNouveau.proxy.getPlayer()).orElse(null); + if(cap != null){ + cap.setPlayerData(data); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateMana.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateMana.java index 0225d32fd6..8ce1d17b28 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateMana.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateMana.java @@ -2,69 +2,44 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.ClientInfo; +import com.hollingsworth.arsnouveau.common.capability.ManaData; +import com.hollingsworth.arsnouveau.setup.registry.AttachmentsRegistry; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import net.minecraft.client.Minecraft; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.world.entity.player.Player; public class PacketUpdateMana extends AbstractPacket{ + CompoundTag tag; - public double mana; - - public int maxMana; - - public int glyphBonus; - - public int tierBonus; - public float reserved; + public PacketUpdateMana(CompoundTag tag) { + this.tag = tag; + } //Decoder public PacketUpdateMana(RegistryFriendlyByteBuf buf) { - mana = buf.readDouble(); - maxMana = buf.readInt(); - glyphBonus = buf.readInt(); - tierBonus = buf.readInt(); - reserved = buf.readFloat(); + this.tag = buf.readNbt(); } //Encoder public void toBytes(RegistryFriendlyByteBuf buf) { - buf.writeDouble(mana); - buf.writeInt(maxMana); - buf.writeInt(glyphBonus); - buf.writeInt(tierBonus); - buf.writeFloat(reserved); - } - - public PacketUpdateMana(double mana, int maxMana, int glyphBonus, int tierBonus, float reserved) { - this.mana = mana; - this.maxMana = maxMana; - this.glyphBonus = glyphBonus; - this.tierBonus = tierBonus; - this.reserved = reserved; - } - - public PacketUpdateMana(double mana, int maxMana, int glyphBonus, int tierBonus) { - this.mana = mana; - this.maxMana = maxMana; - this.glyphBonus = glyphBonus; - this.tierBonus = tierBonus; - this.reserved = -1; + buf.writeNbt(this.tag); } @Override public void onClientReceived(Minecraft minecraft, Player player) { + ManaData data = new ManaData(); + data.deserializeNBT(player.registryAccess(), this.tag); + player.setData(AttachmentsRegistry.MANA_ATTACHMENT, data); var cap = CapabilityRegistry.getMana(ArsNouveau.proxy.getPlayer()).orElse(null); if(cap != null){ - cap.setMana(this.mana); - cap.setMaxMana(this.maxMana); - cap.setGlyphBonus(this.glyphBonus); - cap.setBookTier(this.tierBonus); + cap.setManaData(data); } //sync the client cache of reserved mana - ClientInfo.reservedOverlayMana = reserved; + ClientInfo.reservedOverlayMana = data.getReservedMana(); } public static final Type TYPE = new Type<>(ArsNouveau.prefix("update_mana")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java index 4fe2ed8bf0..4f3d3afb23 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java @@ -56,6 +56,7 @@ public static void registers(IEventBus modEventBus) { VillagerRegistry.VILLAGERS.register(modEventBus); CreativeTabRegistry.TABS.register(modEventBus); DataSerializers.DS.register(modEventBus); + AttachmentsRegistry.ATTACHMENT_TYPES.register(modEventBus); } public static void registerEvents(RegisterEvent event) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/AttachmentsRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/AttachmentsRegistry.java new file mode 100644 index 0000000000..a2138b5d89 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/AttachmentsRegistry.java @@ -0,0 +1,29 @@ +package com.hollingsworth.arsnouveau.setup.registry; + +import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.common.capability.ANPlayerData; +import com.hollingsworth.arsnouveau.common.capability.ManaData; +import net.neoforged.neoforge.attachment.AttachmentType; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.registries.NeoForgeRegistries; + +import java.util.function.Supplier; + +public class AttachmentsRegistry { + public static final DeferredRegister> ATTACHMENT_TYPES = + DeferredRegister.create( + NeoForgeRegistries.Keys.ATTACHMENT_TYPES, ArsNouveau.MODID); + + public static final Supplier> MANA_ATTACHMENT = + ATTACHMENT_TYPES.register("mana_cap", + () -> AttachmentType.serializable(ManaData::new) + .copyOnDeath() + .build()); + + + public static final Supplier> PLAYER_DATA = + ATTACHMENT_TYPES.register("player_cap", + () -> AttachmentType.serializable(ANPlayerData::new) + .copyOnDeath() + .build()); +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java index b6a4762dab..777d91e02a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java @@ -5,10 +5,7 @@ import com.hollingsworth.arsnouveau.common.capability.ANPlayerDataCap; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; import com.hollingsworth.arsnouveau.common.capability.ManaCap; -import com.hollingsworth.arsnouveau.common.network.Networking; -import com.hollingsworth.arsnouveau.common.network.PacketSyncPlayerCap; import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; @@ -27,8 +24,8 @@ public class CapabilityRegistry { - public static final EntityCapability MANA_CAPABILITY = EntityCapability.createVoid(ArsNouveau.prefix("mana"), IManaCap.class); - public static final EntityCapability PLAYER_DATA_CAP = EntityCapability.createVoid(ArsNouveau.prefix("player_data"), IPlayerCap.class); + public static final EntityCapability MANA_CAPABILITY = EntityCapability.createVoid(ArsNouveau.prefix("mana"), ManaCap.class); + public static final EntityCapability PLAYER_DATA_CAP = EntityCapability.createVoid(ArsNouveau.prefix("player_data"), ANPlayerDataCap.class); public static final BlockCapability LECTERN_CAP = BlockCapability.create(ArsNouveau.prefix("lectern_handler"), IItemHandler.class, Direction.class); /** @@ -37,7 +34,7 @@ public class CapabilityRegistry { * @param entity The entity * @return A lazy optional containing the IMana, if any */ - public static LazyOptional getMana(final LivingEntity entity) { + public static LazyOptional getMana(final LivingEntity entity) { if (entity == null) return LazyOptional.empty(); return LazyOptional.of(entity.getCapability(MANA_CAPABILITY)); @@ -49,7 +46,7 @@ public static LazyOptional getMana(final LivingEntity entity) { * @param entity The entity * @return A lazy optional containing the IMana, if any */ - public static LazyOptional getPlayerDataCap(final LivingEntity entity) { + public static LazyOptional getPlayerDataCap(final LivingEntity entity) { if (entity == null) return LazyOptional.empty(); return LazyOptional.of(entity.getCapability(PLAYER_DATA_CAP)); @@ -79,8 +76,8 @@ public static LazyOptional empty() { } public static void registerCapabilities(RegisterCapabilitiesEvent event) { - event.registerEntity(MANA_CAPABILITY, EntityType.PLAYER, (player, ctx) -> new ManaCap()); - event.registerEntity(PLAYER_DATA_CAP, EntityType.PLAYER, (player, ctx) -> new ANPlayerDataCap()); + event.registerEntity(MANA_CAPABILITY, EntityType.PLAYER, (player, ctx) -> new ManaCap(player)); + event.registerEntity(PLAYER_DATA_CAP, EntityType.PLAYER, (player, ctx) -> new ANPlayerDataCap(player)); var containers = List.of(BlockRegistry.ENCHANTING_APP_TILE, BlockRegistry.IMBUEMENT_TILE, BlockRegistry.SCRIBES_TABLE_TILE); for(var container : containers){ event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, container.get(), (c, side) -> new InvWrapper(c)); @@ -93,36 +90,37 @@ public static void registerCapabilities(RegisterCapabilitiesEvent event) { @SuppressWarnings("unused") @EventBusSubscriber(modid = ArsNouveau.MODID) public static class EventHandler { - - /** - * Copy the player's mana when they respawn after dying or returning from the end. - * - * @param event The event - */ - @SubscribeEvent - public static void playerClone(PlayerEvent.Clone event) { - Player oldPlayer = event.getOriginal(); -// oldPlayer.revive(); - var oldMana = getMana(oldPlayer).orElse(null); - var newMana = getMana(event.getEntity()).orElse(null); - if (oldMana != null && newMana != null) { - newMana.setMaxMana(oldMana.getMaxMana()); - newMana.setMana(oldMana.getCurrentMana()); - newMana.setBookTier(oldMana.getBookTier()); - newMana.setGlyphBonus(oldMana.getGlyphBonus()); - } - - var oldPlayerCap = getPlayerDataCap(oldPlayer).orElse(null); - var newPlayerCap = getPlayerDataCap(event.getEntity()).orElse(new ANPlayerDataCap()); - if (oldPlayerCap != null) { - CompoundTag tag = oldPlayerCap.serializeNBT(event.getOriginal().level.registryAccess()); - newPlayerCap.deserializeNBT(event.getOriginal().level.registryAccess(), tag); - syncPlayerCap(event.getEntity()); - } - - -// event.getOriginal().invalidateCaps(); - } +//TODO: verify if player clone needed + +// /** +// * Copy the player's mana when they respawn after dying or returning from the end. +// * +// * @param event The event +// */ +// @SubscribeEvent +// public static void playerClone(PlayerEvent.Clone event) { +// Player oldPlayer = event.getOriginal(); +//// oldPlayer.revive(); +// var oldMana = getMana(oldPlayer).orElse(null); +// var newMana = getMana(event.getEntity()).orElse(null); +// if (oldMana != null && newMana != null) { +// newMana.setMaxMana(oldMana.getMaxMana()); +// newMana.setMana(oldMana.getCurrentMana()); +// newMana.setBookTier(oldMana.getBookTier()); +// newMana.setGlyphBonus(oldMana.getGlyphBonus()); +// } +// +// var oldPlayerCap = getPlayerDataCap(oldPlayer).orElse(null); +// var newPlayerCap = getPlayerDataCap(event.getEntity()).orElse(new ANPlayerDataCap(event.getEntity())); +// if (oldPlayerCap != null) { +// CompoundTag tag = oldPlayerCap.serializeNBT(event.getOriginal().level.registryAccess()); +// newPlayerCap.deserializeNBT(event.getOriginal().level.registryAccess(), tag); +// syncPlayerCap(event.getEntity()); +// } +// +// +//// event.getOriginal().invalidateCaps(); +// } @SubscribeEvent @@ -155,10 +153,11 @@ public static void onPlayerDimChangedEvent(PlayerEvent.PlayerChangedDimensionEve } public static void syncPlayerCap(Player player) { - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(player).orElse(new ANPlayerDataCap()); - CompoundTag tag = cap.serializeNBT(player.level.registryAccess()); if(player instanceof ServerPlayer serverPlayer){ - Networking.sendToPlayerClient(new PacketSyncPlayerCap(tag), serverPlayer); + ANPlayerDataCap playerData = getPlayerDataCap(serverPlayer).orElse(null); + if(playerData != null){ + playerData.syncToClient(serverPlayer); + } } } } From 8bf2d5bcc42a8d631bb3603b0c339f7e6971dce6 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 13 Jul 2024 15:12:45 -0500 Subject: [PATCH 059/363] remove lazy optional --- .../arsnouveau/api/spell/SpellResolver.java | 4 +-- .../arsnouveau/api/util/ManaUtil.java | 6 ++-- .../arsnouveau/client/gui/GuiManaHUD.java | 4 +-- .../client/gui/book/GlyphUnlockMenu.java | 2 +- .../client/gui/book/GuiSpellBook.java | 4 +-- .../client/gui/book/InfinityGuiSpellBook.java | 4 +-- .../common/command/LearnGlyphCommand.java | 4 +-- .../common/command/ResetCommand.java | 4 +-- .../entity/familiar/FamiliarEntity.java | 2 +- .../common/event/ManaCapEvents.java | 4 +-- .../common/items/AnnotatedCodex.java | 2 +- .../common/items/FamiliarScript.java | 2 +- .../arsnouveau/common/items/Glyph.java | 4 +-- .../arsnouveau/common/items/SpellArrow.java | 2 +- .../arsnouveau/common/items/SpellBook.java | 4 +-- .../arsnouveau/common/items/VoidJar.java | 2 +- .../common/items/curios/JumpingRing.java | 2 +- .../common/items/data/TomeCasterData.java | 2 +- .../common/network/PacketSummonFamiliar.java | 2 +- .../common/network/PacketSyncPlayerCap.java | 2 +- .../common/network/PacketToggleFamiliar.java | 2 +- .../common/network/PacketUpdateMana.java | 2 +- .../arsnouveau/common/perk/RepairingPerk.java | 2 +- .../setup/registry/CapabilityRegistry.java | 35 ++++--------------- 24 files changed, 39 insertions(+), 64 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java index 1e52d3e42f..40137c5e86 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java @@ -73,7 +73,7 @@ public boolean canCast(LivingEntity entity) { protected boolean enoughMana(LivingEntity entity) { int totalCost = getResolveCost(); - IManaCap manaCap = CapabilityRegistry.getMana(entity).orElse(null); + IManaCap manaCap = CapabilityRegistry.getMana(entity); if (manaCap == null) return false; boolean canCast = totalCost <= manaCap.getCurrentMana() || (entity instanceof Player player && player.isCreative()); @@ -200,7 +200,7 @@ public void resume(Level world){ public void expendMana() { int totalCost = getResolveCost(); - var mana = CapabilityRegistry.getMana(spellContext.getUnwrappedCaster()).orElse(null); + var mana = CapabilityRegistry.getMana(spellContext.getUnwrappedCaster()); if(mana != null){ mana.removeMana(totalCost); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java index edad116c98..20d4623aa2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/ManaUtil.java @@ -43,7 +43,7 @@ public static int getPlayerDiscounts(LivingEntity e, Spell spell, ItemStack cast } public static double getCurrentMana(LivingEntity e) { - IManaCap mana = CapabilityRegistry.getMana(e).orElse(null); + IManaCap mana = CapabilityRegistry.getMana(e); if (mana == null) return 0; return mana.getCurrentMana(); @@ -63,7 +63,7 @@ public int getRealMax() { // Calculate Max Mana & Mana Reserve to keep track of the mana reserved by familiars & co. public static Mana calcMaxMana(Player e) { - IManaCap mana = CapabilityRegistry.getMana(e).orElse(null); + IManaCap mana = CapabilityRegistry.getMana(e); if (mana == null) return new Mana(0, 0f); @@ -101,7 +101,7 @@ public static int getMaxMana(Player e) { } public static double getManaRegen(Player e) { - IManaCap mana = CapabilityRegistry.getMana(e).orElse(null); + IManaCap mana = CapabilityRegistry.getMana(e); if (mana == null) return 0; double regen = 0; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java index c423e2cbc6..7d1a1cd87b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java @@ -28,7 +28,7 @@ public static boolean shouldDisplayBar() { ItemStack offHand = minecraft.player.getOffhandItem(); var isMainDisplayable = mainHand.getItem() instanceof IDisplayMana iDisplayMana && iDisplayMana.shouldDisplay(mainHand); var isOffhandDisplayable = offHand.getItem() instanceof IDisplayMana iDisplayManaOffhand && iDisplayManaOffhand.shouldDisplay(offHand); - ManaCap cap = CapabilityRegistry.getMana(minecraft.player).orElse(null); + ManaCap cap = CapabilityRegistry.getMana(minecraft.player); boolean isRegenerating = false; if(cap != null){ isRegenerating = cap.getMaxMana() > cap.getCurrentMana(); @@ -40,7 +40,7 @@ public static void renderOverlay(GuiGraphics guiGraphics, DeltaTracker deltaTrac if (!shouldDisplayBar()) return; PoseStack ms = guiGraphics.pose(); - IManaCap mana = CapabilityRegistry.getMana(minecraft.player).orElse(null); + IManaCap mana = CapabilityRegistry.getMana(minecraft.player); if(mana == null){ return; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java index 1582cd4080..a233b8a2c4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java @@ -251,7 +251,7 @@ public void layoutAllGlyphs(int page) { int xOffset = 20 * ((adjustedXPlaced) % PER_ROW) + (nextPage ? 134 : 0); int yPlace = adjustedRowsPlaced * 18 + yStart; UnlockGlyphButton cell = new UnlockGlyphButton(xStart + xOffset, yPlace, false, holder, this::onGlyphClick); - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(Minecraft.getInstance().player).orElse(null); + IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(Minecraft.getInstance().player); if (cap != null) { if (cap.knowsGlyph(spellPart) || GlyphRegistry.getDefaultStartingSpells().contains(spellPart)) { cell.playerKnows = true; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index e3b5a3496c..71b2e8fcdf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -93,7 +93,7 @@ public class GuiSpellBook extends BaseBook { public GuiSpellBook(InteractionHand hand){ super(); this.hand = hand; - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(Minecraft.getInstance().player).orElse(null); + IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(Minecraft.getInstance().player); ItemStack heldStack = Minecraft.getInstance().player.getItemInHand(hand); List parts = cap == null ? new ArrayList<>() : new ArrayList<>(cap.getKnownGlyphs().stream().filter(AbstractSpellPart::shouldShowInSpellBook).toList()); maxManaCache = ManaUtil.getMaxMana(Minecraft.getInstance().player); @@ -403,7 +403,7 @@ public void onSoundsClick(Button button) { public void onFamiliarClick(Button button) { Collection familiarHolders = new ArrayList<>(); - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(ArsNouveau.proxy.getPlayer()).orElse(null); + IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(ArsNouveau.proxy.getPlayer()); if (cap != null) { familiarHolders = cap.getUnlockedFamiliars().stream().map(s -> s.familiarHolder.getRegistryName()).collect(Collectors.toList()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java index c94fb4d6c0..67406f99a1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java @@ -102,7 +102,7 @@ public class InfinityGuiSpellBook extends BaseBook { public InfinityGuiSpellBook(InteractionHand hand) { super(); this.hand = hand; - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(Minecraft.getInstance().player).orElse(null); + IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(Minecraft.getInstance().player); ItemStack heldStack = Minecraft.getInstance().player.getItemInHand(hand); List parts = cap == null ? new ArrayList<>() : new ArrayList<>(cap.getKnownGlyphs().stream().filter(AbstractSpellPart::shouldShowInSpellBook).toList()); maxManaCache = ManaUtil.getMaxMana(Minecraft.getInstance().player); @@ -422,7 +422,7 @@ public void onSoundsClick(Button button) { public void onFamiliarClick(Button button) { Collection familiarHolders = new ArrayList<>(); - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(ArsNouveau.proxy.getPlayer()).orElse(null); + IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(ArsNouveau.proxy.getPlayer()); if (cap != null) { familiarHolders = cap.getUnlockedFamiliars().stream().map(s -> s.familiarHolder.getRegistryName()).collect(Collectors.toList()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/command/LearnGlyphCommand.java b/src/main/java/com/hollingsworth/arsnouveau/common/command/LearnGlyphCommand.java index 753a2b1fb4..0817007afb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/command/LearnGlyphCommand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/command/LearnGlyphCommand.java @@ -4,7 +4,6 @@ import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; -import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.suggestion.SuggestionProvider; import net.minecraft.commands.CommandSourceStack; @@ -15,7 +14,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.Nullable; import java.util.Collection; @@ -43,7 +41,7 @@ private static int learnGlyph(CommandSourceStack source, Collection()); playerCap.setUnlockedFamiliars(new ArrayList<>()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java index 9c6d74280b..9007b4f035 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java @@ -292,7 +292,7 @@ public void setTagData(@Nullable CompoundTag tag) { * Get the owner from getOwner */ public void syncTag() { - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(getOwner()).orElse(null); + IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(getOwner()); if (cap != null && persistentData != null) { cap.getFamiliarData(getHolderID()).entityTag.put("familiarData", persistentData.toTag(level)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java index 6355c10cc8..19735ff464 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java @@ -23,7 +23,7 @@ public static void playerOnTick(PlayerTickEvent.Pre e) { if (!(player instanceof ServerPlayer serverPlayer) || player.getCommandSenderWorld().getGameTime() % ServerConfig.REGEN_INTERVAL.get() != 0) return; - ManaCap mana = CapabilityRegistry.getMana(player).orElse(null); + ManaCap mana = CapabilityRegistry.getMana(player); if (mana == null) return; boolean sync = false; @@ -81,7 +81,7 @@ public static void playerChangeDimension(PlayerEvent.PlayerChangedDimensionEvent public static void syncPlayerEvent(Player playerEntity) { if (playerEntity instanceof ServerPlayer serverPlayer) { - var mana = CapabilityRegistry.getMana(playerEntity).orElse(null); + var mana = CapabilityRegistry.getMana(playerEntity); if (mana != null) { var manaCalc = ManaUtil.calcMaxMana(playerEntity); mana.setMaxMana(manaCalc.getRealMax()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java index e835b96504..450ff54904 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java @@ -47,7 +47,7 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte ItemStack stack = pPlayer.getItemInHand(pUsedHand); CodexData data = stack.get(DataComponentRegistry.CODEX_DATA); - IPlayerCap playerCap = CapabilityRegistry.getPlayerDataCap(pPlayer).orElse(null); + IPlayerCap playerCap = CapabilityRegistry.getPlayerDataCap(pPlayer); if (playerCap == null) return super.use(pLevel, pPlayer, pUsedHand); Collection known = playerCap.getKnownGlyphs(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FamiliarScript.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FamiliarScript.java index a4147a5b50..bd6f277649 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FamiliarScript.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FamiliarScript.java @@ -34,7 +34,7 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In if (worldIn.isClientSide || handIn != InteractionHand.MAIN_HAND) return super.use(worldIn, playerIn, handIn); - IPlayerCap familiarCap = CapabilityRegistry.getPlayerDataCap(playerIn).orElse(null); + IPlayerCap familiarCap = CapabilityRegistry.getPlayerDataCap(playerIn); if (familiarCap != null) { if (familiarCap.ownsFamiliar(familiar)) { playerIn.sendSystemMessage(Component.translatable("ars_nouveau.familiar.owned")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java index e7608c47f7..d8ba5175aa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java @@ -41,7 +41,7 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In playerIn.sendSystemMessage(Component.translatable("ars_nouveau.spell.disabled")); return super.use(worldIn, playerIn, handIn); } - IPlayerCap playerDataCap = CapabilityRegistry.getPlayerDataCap(playerIn).orElse(null); + IPlayerCap playerDataCap = CapabilityRegistry.getPlayerDataCap(playerIn); if (playerDataCap != null) { if (playerDataCap.knowsGlyph(spellPart) || GlyphRegistry.getDefaultStartingSpells().contains(spellPart)) { playerIn.sendSystemMessage(Component.literal("You already know this spell!")); @@ -79,7 +79,7 @@ public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, L if (Minecraft.getInstance().player == null) return; - IPlayerCap playerDataCap = CapabilityRegistry.getPlayerDataCap(Minecraft.getInstance().player).orElse(null); + IPlayerCap playerDataCap = CapabilityRegistry.getPlayerDataCap(Minecraft.getInstance().player); if (playerDataCap != null) { if (playerDataCap.knowsGlyph(spellPart) || GlyphRegistry.getDefaultStartingSpells().contains(spellPart)) { tooltip2.add(Component.translatable("tooltip.ars_nouveau.glyph_known").setStyle(Style.EMPTY.withColor(ChatFormatting.DARK_GREEN))); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellArrow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellArrow.java index af45984eac..3116fa730d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellArrow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellArrow.java @@ -41,7 +41,7 @@ public void modifySpell(Spell.Mutable spell) { @Override public AbstractArrow createArrow(Level world, ItemStack stack, LivingEntity shooter, @Nullable ItemStack bowStack) { - IManaCap mana = CapabilityRegistry.getMana(shooter).orElse(null); + IManaCap mana = CapabilityRegistry.getMana(shooter); if (mana == null) return new Arrow(world, shooter, new ItemStack(Items.ARROW), bowStack); EntitySpellArrow spellArrow = new EntitySpellArrow(world, shooter, ItemStack.EMPTY, bowStack); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java index 8bf28859b9..b80fcd76b9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java @@ -68,14 +68,14 @@ public SpellBook(Properties properties, SpellTier tier) { public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); if (this != ItemsRegistry.CREATIVE_SPELLBOOK.get()) { - var iMana = CapabilityRegistry.getMana(playerIn).orElse(null); + var iMana = CapabilityRegistry.getMana(playerIn); if(iMana != null){ boolean shouldSync = false; if (iMana.getBookTier() < this.tier.value) { iMana.setBookTier(this.tier.value); shouldSync = true; } - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(playerIn).orElse(null); + IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(playerIn); if (iMana.getGlyphBonus() < cap.getKnownGlyphs().size()) { iMana.setGlyphBonus(cap.getKnownGlyphs().size()); shouldSync = true; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java index 8f93bb9405..d44f37870f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java @@ -56,7 +56,7 @@ public boolean voidStack(Player player, ItemStack jarStack, ItemStack stackToVoi } public void preConsume(Player player, ItemStack jar, ItemStack voided, int amount) { - var mana = CapabilityRegistry.getMana(player).orElse(null); + var mana = CapabilityRegistry.getMana(player); if(mana == null){ return; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/JumpingRing.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/JumpingRing.java index 887178b00b..275e477795 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/JumpingRing.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/JumpingRing.java @@ -23,7 +23,7 @@ public void curioTick(SlotContext slotContext, ItemStack stack) { public static void doJump(Player player){ if(CuriosUtil.hasItem(player, ItemsRegistry.JUMP_RING.get())){ - IManaCap manaCap = CapabilityRegistry.getMana(player).orElse(null); + IManaCap manaCap = CapabilityRegistry.getMana(player); if(manaCap == null || (manaCap.getCurrentMana() < Config.JUMP_RING_COST.get() && !player.isCreative())){ return; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java index ec14a3c15f..44889dc8cc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/TomeCasterData.java @@ -52,7 +52,7 @@ public SpellResolver getSpellResolver(SpellContext context, Level worldIn, Livin @Override protected boolean enoughMana(LivingEntity entity) { int totalCost = getResolveCost(); - IManaCap manaCap = CapabilityRegistry.getMana(entity).orElse(null); + IManaCap manaCap = CapabilityRegistry.getMana(entity); if (manaCap == null) return false; boolean canCast = totalCost <= manaCap.getCurrentMana() || manaCap.getCurrentMana() == manaCap.getMaxMana() || (entity instanceof Player player && player.isCreative()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonFamiliar.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonFamiliar.java index ececc7bac0..2a4074d0ae 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonFamiliar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonFamiliar.java @@ -39,7 +39,7 @@ public void toBytes(RegistryFriendlyByteBuf buf) { @Override public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer owner) { - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(owner).orElse(null); + IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(owner); if (cap == null) return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java index dee2418d45..0ef3c0ac17 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSyncPlayerCap.java @@ -33,7 +33,7 @@ public void onClientReceived(Minecraft minecraft, Player playerEntity) { ANPlayerData data = new ANPlayerData(); data.deserializeNBT(playerEntity.registryAccess(), this.tag); playerEntity.setData(AttachmentsRegistry.PLAYER_DATA, data); - var cap = CapabilityRegistry.getPlayerDataCap(ArsNouveau.proxy.getPlayer()).orElse(null); + var cap = CapabilityRegistry.getPlayerDataCap(ArsNouveau.proxy.getPlayer()); if(cap != null){ cap.setPlayerData(data); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleFamiliar.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleFamiliar.java index 83e8556f10..353141ad11 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleFamiliar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketToggleFamiliar.java @@ -30,7 +30,7 @@ public void toBytes(RegistryFriendlyByteBuf buf) { @Override public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer owner) { - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(owner).orElse(null); + IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(owner); if (cap == null) return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateMana.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateMana.java index 8ce1d17b28..fa8255d1a2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateMana.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateMana.java @@ -34,7 +34,7 @@ public void onClientReceived(Minecraft minecraft, Player player) { ManaData data = new ManaData(); data.deserializeNBT(player.registryAccess(), this.tag); player.setData(AttachmentsRegistry.MANA_ATTACHMENT, data); - var cap = CapabilityRegistry.getMana(ArsNouveau.proxy.getPlayer()).orElse(null); + var cap = CapabilityRegistry.getMana(ArsNouveau.proxy.getPlayer()); if(cap != null){ cap.setManaData(data); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/RepairingPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/RepairingPerk.java index ba99dd6ff3..25e18cb542 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/RepairingPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/RepairingPerk.java @@ -20,7 +20,7 @@ public static void attemptRepair(ItemStack stack, LivingEntity entity){ if(entity.level.getGameTime() % 200 != 0 || stack.getDamageValue() <= 0) return; double repairLevel = PerkUtil.countForPerk(RepairingPerk.INSTANCE, entity); - var cap = CapabilityRegistry.getMana(entity).orElse(null); + var cap = CapabilityRegistry.getMana(entity); if(cap != null){ if(cap.getCurrentMana() < 20) return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java index 777d91e02a..b21308c849 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java @@ -34,10 +34,10 @@ public class CapabilityRegistry { * @param entity The entity * @return A lazy optional containing the IMana, if any */ - public static LazyOptional getMana(final LivingEntity entity) { + public static ManaCap getMana(final LivingEntity entity) { if (entity == null) - return LazyOptional.empty(); - return LazyOptional.of(entity.getCapability(MANA_CAPABILITY)); + return null; + return entity.getCapability(MANA_CAPABILITY); } /** @@ -46,33 +46,10 @@ public static LazyOptional getMana(final LivingEntity entity) { * @param entity The entity * @return A lazy optional containing the IMana, if any */ - public static LazyOptional getPlayerDataCap(final LivingEntity entity) { + public static ANPlayerDataCap getPlayerDataCap(final LivingEntity entity) { if (entity == null) - return LazyOptional.empty(); - return LazyOptional.of(entity.getCapability(PLAYER_DATA_CAP)); - } - - /** - * todo: DELETE - * @deprecated - */ - public static class LazyOptional { - private T val; - private LazyOptional(T value) { - this.val = value; - } - - public static LazyOptional of(T value) { - return new LazyOptional<>(value); - } - - public T orElse(T value) { - return val == null ? value : val; - } - - public static LazyOptional empty() { return null; - } + return entity.getCapability(PLAYER_DATA_CAP); } public static void registerCapabilities(RegisterCapabilitiesEvent event) { @@ -154,7 +131,7 @@ public static void onPlayerDimChangedEvent(PlayerEvent.PlayerChangedDimensionEve public static void syncPlayerCap(Player player) { if(player instanceof ServerPlayer serverPlayer){ - ANPlayerDataCap playerData = getPlayerDataCap(serverPlayer).orElse(null); + ANPlayerDataCap playerData = getPlayerDataCap(serverPlayer); if(playerData != null){ playerData.syncToClient(serverPlayer); } From 6369e621092273edef3116cce1574d8626222787 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 14 Jul 2024 12:03:41 -0500 Subject: [PATCH 060/363] fix familiars, alteration table --- .../arsnouveau/api/util/PerkUtil.java | 3 +- .../tile/AlterationTableRenderer.java | 106 ++++++++---------- .../common/armor/AnimatedMagicArmor.java | 7 +- .../common/block/tile/AlterationTile.java | 38 +++---- .../common/entity/EntityBookwyrm.java | 4 +- .../entity/familiar/FamiliarEntity.java | 10 +- .../entity/familiar/FamiliarStarbuncle.java | 2 +- .../common/items/data/ArmorPerkHolder.java | 10 +- .../items/data/PersistentFamiliarData.java | 36 ++++-- .../common/items/data/StackPerkHolder.java | 4 +- 10 files changed, 115 insertions(+), 105 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java index 5ba3f25f0f..f6153b40be 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java @@ -1,7 +1,6 @@ package com.hollingsworth.arsnouveau.api.util; import com.hollingsworth.arsnouveau.api.perk.IPerk; -import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; import com.hollingsworth.arsnouveau.api.perk.PerkInstance; import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; import com.hollingsworth.arsnouveau.common.items.PerkItem; @@ -19,7 +18,7 @@ public class PerkUtil { - public static @Nullable IPerkHolder getPerkHolder(ItemStack stack){ + public static @Nullable ArmorPerkHolder getPerkHolder(ItemStack stack){ return stack.get(DataComponentRegistry.ARMOR_PERKS); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java index 91abcee612..4e6b212a64 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java @@ -20,18 +20,23 @@ import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; +import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponents; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.FastColor; import net.minecraft.util.Mth; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.component.DyedItemColor; +import net.minecraft.world.item.armortrim.ArmorTrim; import net.minecraft.world.level.block.state.BlockState; import org.joml.Quaternionf; import org.joml.Vector3d; @@ -40,7 +45,6 @@ import software.bernie.geckolib.renderer.GeoBlockRenderer; import software.bernie.geckolib.util.RenderUtil; -import javax.annotation.Nullable; import java.util.List; import java.util.Map; @@ -49,11 +53,12 @@ public class AlterationTableRenderer extends GeoBlockRenderer { public final ArmorStandArmorModel innerModel; public final ArmorStandArmorModel outerModel; - + private final TextureAtlas armorTrimAtlas; public AlterationTableRenderer(BlockEntityRendererProvider.Context p_i226006_1_) { super(new GenericModel<>("alteration_table").withEmptyAnim()); innerModel = new ArmorStandArmorModel(p_i226006_1_.bakeLayer(ModelLayers.ARMOR_STAND_INNER_ARMOR)); outerModel = new ArmorStandArmorModel(p_i226006_1_.bakeLayer(ModelLayers.ARMOR_STAND_OUTER_ARMOR)); + this.armorTrimAtlas = Minecraft.getInstance().getModelManager().getAtlas(Sheets.ARMOR_TRIMS_SHEET); } public void renderArmorStack(AlterationTile tile, PoseStack matrixStack, float ticks, MultiBufferSource iRenderTypeBuffer, VertexConsumer bufferIn, int packedLightIn, int packedOverlayIn, float partialTicks, int colour) { @@ -135,17 +140,23 @@ private void renderArmorPiece(AlterationTile tile, ItemStack itemstack, PoseStac EquipmentSlot pSlot = armoritem.getEquipmentSlot(); Model model = getArmorModelHook(itemstack, pSlot, armorModel); - boolean flag1 = itemstack.hasFoil(); - DyedItemColor color = itemstack.get(DataComponents.DYED_COLOR); - if (color != null) { - int i = color.rgb(); - float f = (i >> 16 & 255) / 255.0F; - float f1 = (i >> 8 & 255) / 255.0F; - float f2 = (i & 255) / 255.0F; - this.renderModel(pPoseStack, pBuffer, packedLightIn, flag1, model, i, this.getArmorResource(itemstack, pSlot, null)); - this.renderModel(pPoseStack, pBuffer, packedLightIn, flag1, model, i, this.getArmorResource(itemstack, pSlot, "overlay")); - } else { - this.renderModel(pPoseStack, pBuffer, packedLightIn, flag1, model, defaultColor, this.getArmorResource(itemstack, pSlot, null)); + boolean innerModel = this.usesInnerModel(pSlot); + var dyeColor = itemstack.get(DataComponents.DYED_COLOR); + int color = dyeColor != null ? FastColor.ABGR32.opaque(dyeColor.rgb()) : -1; + ArmorMaterial armormaterial = armoritem.getMaterial().value(); + for (ArmorMaterial.Layer armormaterial$layer : armormaterial.layers()) { + int j = armormaterial$layer.dyeable() ? color : -1; + var texture = net.neoforged.neoforge.client.ClientHooks.getArmorTexture(Minecraft.getInstance().player, itemstack, armormaterial$layer, innerModel, pSlot); + this.renderModel(pPoseStack, pBuffer, packedLightIn, model, j, texture); + } + + ArmorTrim armortrim = itemstack.get(DataComponents.TRIM); + if (armortrim != null) { + this.renderTrim(armoritem.getMaterial(), pPoseStack, pBuffer, packedLightIn, armortrim, model, innerModel); + } + + if (itemstack.hasFoil()) { + this.renderGlint(pPoseStack, pBuffer, packedLightIn, model); } } @@ -153,32 +164,9 @@ protected net.minecraft.client.model.Model getArmorModelHook(ItemStack itemStack return net.neoforged.neoforge.client.ClientHooks.getArmorModel(Minecraft.getInstance().player, itemStack, slot, model); } - private void renderModel(PoseStack pPoseStack, MultiBufferSource pBuffer, int packedLight, boolean p_117111_, net.minecraft.client.model.Model pModel, int color, ResourceLocation armorResource) { - VertexConsumer vertexconsumer = ItemRenderer.getArmorFoilBuffer(pBuffer, RenderType.armorCutoutNoCull(armorResource), false); - pModel.renderToBuffer(pPoseStack, vertexconsumer, packedLight, OverlayTexture.NO_OVERLAY, color); - } - - public ResourceLocation getArmorResource(ItemStack stack, EquipmentSlot slot, @Nullable String type) { -// ArmorItem item = (ArmorItem) stack.getItem(); -// String texture = item.getMaterial().getName(); -// String domain = "minecraft"; -// int idx = texture.indexOf(':'); -// if (idx != -1) { -// domain = texture.substring(0, idx); -// texture = texture.substring(idx + 1); -// } -// String s1 = String.format(java.util.Locale.ROOT, "%s:textures/models/armor/%s_layer_%d%s.png", domain, texture, (usesInnerModel(slot) ? 2 : 1), type == null ? "" : String.format(java.util.Locale.ROOT, "_%s", type)); -// -// s1 = ClientHooks.getArmorTexture(Minecraft.getInstance().player, stack, s1, slot, type); -// ResourceLocation resourcelocation = ARMOR_LOCATION_CACHE.get(s1); -// -// if (resourcelocation == null) { -// resourcelocation = ResourceLocation.tryParse(s1); -// ARMOR_LOCATION_CACHE.put(s1, resourcelocation); -// } - -// return resourcelocation; - return null; //TODO: reenable armor rendering + private void renderModel(PoseStack p_289664_, MultiBufferSource p_289689_, int p_289681_, net.minecraft.client.model.Model p_289658_, int p_350798_, ResourceLocation p_324344_) { + VertexConsumer vertexconsumer = p_289689_.getBuffer(RenderType.armorCutoutNoCull(p_324344_)); + p_289658_.renderToBuffer(p_289664_, vertexconsumer, p_289681_, OverlayTexture.NO_OVERLAY, p_350798_); } private boolean usesInnerModel(EquipmentSlot pSlot) { @@ -186,6 +174,20 @@ private boolean usesInnerModel(EquipmentSlot pSlot) { } + private void renderTrim( + Holder p_323506_, PoseStack p_289687_, MultiBufferSource p_289643_, int p_289683_, ArmorTrim p_289692_, net.minecraft.client.model.Model p_289663_, boolean p_289651_ + ) { + TextureAtlasSprite textureatlassprite = this.armorTrimAtlas + .getSprite(p_289651_ ? p_289692_.innerTexture(p_323506_) : p_289692_.outerTexture(p_323506_)); + VertexConsumer vertexconsumer = textureatlassprite.wrap(p_289643_.getBuffer(Sheets.armorTrimsSheet(p_289692_.pattern().value().decal()))); + p_289663_.renderToBuffer(p_289687_, vertexconsumer, p_289683_, OverlayTexture.NO_OVERLAY); + } + + + private void renderGlint(PoseStack p_289673_, MultiBufferSource p_289654_, int p_289649_, net.minecraft.client.model.Model p_289659_) { + p_289659_.renderToBuffer(p_289673_, p_289654_.getBuffer(RenderType.armorEntityGlint()), p_289649_, OverlayTexture.NO_OVERLAY); + } + @Override public void actuallyRender(PoseStack stack, AlterationTile tile, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { if (tile.getLevel().getBlockState(tile.getBlockPos()).getBlock() != BlockRegistry.ALTERATION_TABLE.get()) @@ -197,23 +199,23 @@ public void actuallyRender(PoseStack stack, AlterationTile tile, BakedGeoModel m if (direction == Direction.NORTH) { stack.mulPose(Axis.YP.rotationDegrees(-90)); - stack.translate(1, 0, -1); + stack.translate(1, 0, 0); } if (direction == Direction.SOUTH) { stack.mulPose(Axis.YP.rotationDegrees(270)); - stack.translate(-1, 0, -1); + stack.translate(-1, 0, 0); } if (direction == Direction.WEST) { stack.mulPose(Axis.YP.rotationDegrees(270)); - stack.translate(0, 0, -2); + stack.translate(0, 0, -1); } if (direction == Direction.EAST) { stack.mulPose(Axis.YP.rotationDegrees(-90)); - stack.translate(0, 0, 0); + stack.translate(0, 0, 1); } renderSlate(model, animatable); @@ -231,39 +233,29 @@ public void renderFinal(PoseStack stack, AlterationTile animatable, BakedGeoMode Direction direction = animatable.getLevel().getBlockState(animatable.getBlockPos()).getValue(AlterationTable.FACING); Vector3d perkTranslate = new Vector3d(0, 0, 0); Quaternionf perkQuat = Axis.YP.rotationDegrees(-90); - Vector3d armorTranslate = new Vector3d(0, 0, 0); - Quaternionf armorQuat = Axis.YP.rotationDegrees(-90); if (direction == Direction.NORTH) { perkQuat = Axis.YP.rotationDegrees(-90); perkTranslate = new Vector3d(1.55, 0.00, -.5); - armorQuat = Axis.YP.rotationDegrees(90); - armorTranslate = new Vector3d(0.6, 0.2, .5); } if (direction == Direction.SOUTH) { perkQuat = Axis.YP.rotationDegrees(90); perkTranslate = new Vector3d(.5, 0, .5); - armorQuat = Axis.YP.rotationDegrees(-90); - armorTranslate = new Vector3d(1.6, 0.2, -0.5); } if (direction == Direction.WEST) { perkQuat = Axis.YP.rotationDegrees(0); perkTranslate = new Vector3d(1.5, 0, 0.5); - armorQuat = Axis.YP.rotationDegrees(180); - armorTranslate = new Vector3d(0.6, 0.2, -0.5); } if (direction == Direction.EAST) { perkQuat = Axis.YP.rotationDegrees(180); perkTranslate = new Vector3d(.5, 0, -.5); - armorQuat = Axis.YP.rotationDegrees(0); - armorTranslate = new Vector3d(1.6, 0.2, 0.5); } double ticks = animatable.getTick(animatable); stack.pushPose(); - stack.mulPose(armorQuat); - stack.translate(armorTranslate.x, armorTranslate.y, armorTranslate.z); + stack.mulPose(perkQuat); + stack.translate(perkTranslate.x, perkTranslate.y + 0.2, perkTranslate.z); if (!(animatable.armorStack.getItem() instanceof ArmorItem)) { stack.scale(0.75f, 0.75f, 0.75f); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java index de7b8a6daa..9821d4be48 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java @@ -3,7 +3,6 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.client.IVariantColorProvider; import com.hollingsworth.arsnouveau.api.mana.IManaEquipment; -import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; import com.hollingsworth.arsnouveau.api.perk.ITickablePerk; import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import com.hollingsworth.arsnouveau.api.perk.PerkInstance; @@ -54,7 +53,7 @@ public AnimatedMagicArmor(Holder materialIn, ArmorItem.Type slot, } public AnimatedMagicArmor(Holder materialIn, ArmorItem.Type slot, GeoModel model) { - this(materialIn, slot, ItemsRegistry.defaultItemProperties().stacksTo(1), model); + this(materialIn, slot, ItemsRegistry.defaultItemProperties().stacksTo(1).component(DataComponentRegistry.ARMOR_PERKS, new ArmorPerkHolder()), model); } public static AnimatedMagicArmor light(ArmorItem.Type slot) { @@ -81,7 +80,7 @@ public void inventoryTick(ItemStack stack, Level world, Entity player, int slotI return; if(player instanceof LivingEntity livingEntity) { RepairingPerk.attemptRepair(stack, livingEntity); - IPerkHolder perkHolder = PerkUtil.getPerkHolder(stack); + var perkHolder = PerkUtil.getPerkHolder(stack); if (perkHolder == null) return; for (PerkInstance instance : perkHolder.getPerkInstances(stack)) { @@ -96,7 +95,7 @@ public void inventoryTick(ItemStack stack, Level world, Entity player, int slotI @Override public ItemAttributeModifiers getDefaultAttributeModifiers(ItemStack stack) { var modifiers = super.getDefaultAttributeModifiers(stack); - IPerkHolder perkHolder = PerkUtil.getPerkHolder(stack); + var perkHolder = PerkUtil.getPerkHolder(stack); if(perkHolder == null) return modifiers; modifiers.withModifierAdded(PerkAttributes.MAX_MANA, new AttributeModifier(ArsNouveau.prefix("max_mana_armor"), 30 * (perkHolder.getTier() + 1), AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.bySlot(this.type.getSlot())); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java index 916c89a3d0..67f6e833bf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java @@ -1,7 +1,6 @@ package com.hollingsworth.arsnouveau.common.block.tile; import com.hollingsworth.arsnouveau.api.perk.IPerk; -import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; import com.hollingsworth.arsnouveau.api.perk.PerkSlot; import com.hollingsworth.arsnouveau.api.util.PerkUtil; import com.hollingsworth.arsnouveau.common.block.AlterationTable; @@ -9,7 +8,6 @@ import com.hollingsworth.arsnouveau.common.block.ThreePartBlock; import com.hollingsworth.arsnouveau.common.items.PerkItem; import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; -import com.hollingsworth.arsnouveau.common.items.data.StackPerkHolder; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; @@ -99,17 +97,17 @@ public void removePerk(Player player) { } public void removeArmorStack(Player player){ - IPerkHolder perkHolder = PerkUtil.getPerkHolder(armorStack); - if (perkHolder instanceof StackPerkHolder armorPerkHolder) { - armorPerkHolder.setPerks(perkList.stream().map(i ->{ - if(i.getItem() instanceof PerkItem perkItem){ - return perkItem.perk; - } - return null; - }).filter(Objects::nonNull).toList()); - } - if(!player.addItem(armorStack.copy())){ - level.addFreshEntity(new ItemEntity(level, player.position().x(), player.position().y(), player.position().z(), armorStack.copy())); + ArmorPerkHolder perkHolder = PerkUtil.getPerkHolder(armorStack); + var newHolder = perkHolder.setPerks(new ArrayList<>(perkList.stream().map(i ->{ + if(i.getItem() instanceof PerkItem perkItem){ + return perkItem.perk; + } + return null; + }).filter(Objects::nonNull).toList())); + var copyStack = armorStack.copy(); + copyStack.set(DataComponentRegistry.ARMOR_PERKS, newHolder); + if(!player.addItem(copyStack)){ + level.addFreshEntity(new ItemEntity(level, player.position().x(), player.position().y(), player.position().z(), copyStack)); } this.armorStack = ItemStack.EMPTY; this.perkList = new ArrayList<>(); @@ -117,16 +115,16 @@ public void removeArmorStack(Player player){ } public void addPerkStack(ItemStack stack, Player player){ - IPerkHolder perkHolder = PerkUtil.getPerkHolder(armorStack); - if (!(perkHolder instanceof StackPerkHolder armorPerkHolder)) { + ArmorPerkHolder perkHolder = PerkUtil.getPerkHolder(armorStack); + if (perkHolder == null) { PortUtil.sendMessage(player, Component.translatable("ars_nouveau.perk.set_armor")); return; } - if(this.perkList.size() >= 3 || this.perkList.size() >= armorPerkHolder.getSlotsForTier(stack).size()){ + if(this.perkList.size() >= 3 || this.perkList.size() >= perkHolder.getSlotsForTier(armorStack).size()){ PortUtil.sendMessage(player, Component.translatable("ars_nouveau.perk.max_perks")); return; } - PerkSlot foundSlot = getAvailableSlot(perkHolder, stack); + PerkSlot foundSlot = getAvailableSlot(perkHolder); if(stack.getItem() instanceof PerkItem perkItem) { IPerk perk = perkItem.perk; if (foundSlot != null && perk.validForSlot(foundSlot, armorStack, player)) { @@ -139,11 +137,11 @@ public void addPerkStack(ItemStack stack, Player player){ } } - private PerkSlot getAvailableSlot(IPerkHolder perkHolder, ItemStack stack){ - if(this.perkList.size() >= perkHolder.getSlotsForTier(stack).size()){ + private PerkSlot getAvailableSlot(ArmorPerkHolder perkHolder){ + if(this.perkList.size() >= perkHolder.getSlotsForTier(armorStack).size()){ return null; }else{ - return perkHolder.getSlotsForTier(stack).get(this.perkList.size()); + return perkHolder.getSlotsForTier(armorStack).get(this.perkList.size()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java index c742ec7829..bd11d65e1c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java @@ -229,8 +229,8 @@ public void readCharm(ItemStack stack){ PersistentFamiliarData data = stack.get(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA); if(data == null) return; - setColor(data.color, this); - setCustomName(data.name); + setColor(data.color(), this); + setCustomName(data.name()); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java index 9007b4f035..e1bb4ba9d5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java @@ -314,12 +314,12 @@ public PersistentFamiliarData getPersistentFamiliarData() { * Use this to de-duplify your persistent entity data as it relates to your PersistentFamiliarData. */ public void syncAfterPersistentFamiliarInit() { - setCustomName(persistentData.name); - if (persistentData.color != null) { - setColor(persistentData.color); + setCustomName(persistentData.name()); + if (persistentData.color() != null) { + setColor(persistentData.color()); } - if (persistentData.cosmetic != null) { - setCosmeticItem(persistentData.cosmetic, false); + if (persistentData.cosmetic() != null) { + setCosmeticItem(persistentData.cosmetic(), false); } } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java index b8fdb42a47..9f59525338 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java @@ -31,6 +31,7 @@ public class FamiliarStarbuncle extends FamiliarEntity { public FamiliarStarbuncle(EntityType ent, Level world) { super(ent, world); + this.entityData.set(COLOR, DyeColor.ORANGE.getName()); } @Override @@ -74,7 +75,6 @@ public PlayState walkPredicate(AnimationState event) { @Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { super.defineSynchedData(pBuilder); - pBuilder.define(COLOR, DyeColor.ORANGE.getName()); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java index fe6616a576..de9d17dd28 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java @@ -34,6 +34,10 @@ public ArmorPerkHolder(String color, List perks, int tier, Map(), 0, new HashMap<>()); + } + public String getColor() { return color == null ? DyeColor.PURPLE.getName() : color; } @@ -50,6 +54,9 @@ public ArmorPerkHolder setPerks(List perks) { @Override public List getSlotsForTier(ItemStack stack) { List> slotsForTier = PerkRegistry.getPerkProvider(stack.getItem()); + if (slotsForTier == null) { + return Collections.emptyList(); + } List slots = new ArrayList<>(slotsForTier.get(getTier())); slots.sort(Comparator.comparingInt((a) -> -a.value())); return slots; @@ -69,12 +76,13 @@ public ArmorPerkHolder setTagForPerk(IPerk perk, CompoundTag tag) { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; ArmorPerkHolder that = (ArmorPerkHolder) o; return Objects.equals(color, that.color); } @Override public int hashCode() { - return Objects.hashCode(color); + return Objects.hash(super.hashCode(), color); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java index 4bd631529f..9f7d442834 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java @@ -1,15 +1,16 @@ package com.hollingsworth.arsnouveau.common.items.data; import com.hollingsworth.arsnouveau.api.item.NBTComponent; -import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; +import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -22,21 +23,22 @@ public class PersistentFamiliarData implements NBTComponent, TooltipProvider { public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - ComponentSerialization.CODEC.fieldOf("name").forGetter(data -> data.name), - Codec.STRING.fieldOf("color").forGetter(data -> data.color), - ItemStack.CODEC.fieldOf("cosmetic").forGetter(data -> data.cosmetic) + ComponentSerialization.CODEC.optionalFieldOf("name", CommonComponents.EMPTY).forGetter(data -> data.name), + Codec.STRING.optionalFieldOf("color", "").forGetter(data -> data.color), + ItemStack.CODEC.optionalFieldOf("cosmetic", ItemStack.EMPTY).forGetter(data -> data.cosmetic) ).apply(instance, PersistentFamiliarData::new)); - public static StreamCodec STREAM_CODEC = CheatSerializer.create(PersistentFamiliarData.CODEC); + public static StreamCodec STREAM_CODEC = StreamCodec.composite(ComponentSerialization.STREAM_CODEC, s -> s.name, + ByteBufCodecs.STRING_UTF8, s -> s.color, ItemStack.STREAM_CODEC, s -> s.cosmetic, PersistentFamiliarData::new); - public final Component name; - public final String color; - public final ItemStack cosmetic; + private final Component name; + private final String color; + private final ItemStack cosmetic; public PersistentFamiliarData(Component name, String color, ItemStack cosmetic) { - this.name = name; - this.color = color; - this.cosmetic = cosmetic; + this.name = name == null ? CommonComponents.EMPTY : name; + this.color = color == null ? "" : color; + this.cosmetic = cosmetic == null ? ItemStack.EMPTY : cosmetic; } public PersistentFamiliarData(){ @@ -88,6 +90,18 @@ public int hashCode() { return Objects.hash(name, color, cosmetic); } + public Component name() { + return name == CommonComponents.EMPTY ? null : name; + } + + public String color() { + return color.isEmpty() ? null : color; + } + + public ItemStack cosmetic() { + return cosmetic; + } + public static class Mutable{ public Component name; public String color; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StackPerkHolder.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StackPerkHolder.java index e0a9b244af..4cefe70027 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StackPerkHolder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StackPerkHolder.java @@ -58,11 +58,11 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; StackPerkHolder that = (StackPerkHolder) o; - return getTier() == that.getTier() && Objects.equals(getPerks(), that.getPerks()) && Objects.equals(getPerkTags(), that.getPerkTags()); + return tier == that.tier && Objects.equals(perks, that.perks) && Objects.equals(perkTags, that.perkTags); } @Override public int hashCode() { - return Objects.hash(getPerks(), getTier(), getPerkTags()); + return Objects.hash(perks, tier, perkTags); } } From 62e9865f2c94b170dc15a82014806b2ef3fa35f9 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 14 Jul 2024 12:10:08 -0500 Subject: [PATCH 061/363] fix empty lang, burst datagen --- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 ++-- .../a4c3c262a85f6a179e7e29128e8b31d4da806803 | 4 ++-- .../cdae075e2d4d58384fe4d2075f6d5323fe5baa69 | 6 +++--- .../e7c243f38c2b0774b1bff1a90ede0b19a4077240 | 4 ++-- .../f0f2bcace349d412215f006e6183aa56b9316c3c | 4 ++-- .../resources/assets/ars_nouveau/lang/en_us.json | 5 +++-- .../models/item/{burst.json => glyph_burst.json} | 0 .../en_us/entries/glyphs_3/burst.json | 16 ---------------- .../en_us/entries/glyphs_3/glyph_burst.json | 16 ++++++++++++++++ .../recipe/{burst.json => glyph_burst.json} | 2 +- .../ars_nouveau/recipe/tomes/darkfira_tome.json | 2 +- .../ars_nouveau/recipe/tomes/poseidon_tome.json | 2 +- .../arsnouveau/api/perk/IPerkHolder.java | 2 +- .../arsnouveau/common/datagen/LangDatagen.java | 2 ++ 14 files changed, 36 insertions(+), 33 deletions(-) rename src/generated/resources/assets/ars_nouveau/models/item/{burst.json => glyph_burst.json} (100%) delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/burst.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_burst.json rename src/generated/resources/data/ars_nouveau/recipe/{burst.json => glyph_burst.json} (92%) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 888abe95ce..9b469f97fa 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21 2024-07-05T22:41:47.5441201 Languages: en_us for mod: ars_nouveau -34260db741d6494b1b36d30ecdfe7cf81e8138b7 assets/ars_nouveau/lang/en_us.json +// 1.21 2024-07-14T12:08:42.9039367 Languages: en_us for mod: ars_nouveau +4968ddaa4b192c88963c6e7a26f518caba6e457a assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 index 7a9ebdf7c7..bd23d0646e 100644 --- a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 +++ b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 @@ -1,4 +1,4 @@ -// 1.21 2024-07-05T22:41:47.5366047 Ars Nouveau Item Models +// 1.21 2024-07-14T12:08:42.8994253 Ars Nouveau Item Models 11ee554b11a3a830e89b742762e5b754c2ecb5ee assets/ars_nouveau/models/item/agronomic_sourcelink.json 339a05323ebef7efc5c70db708a2e7a24708e9bc assets/ars_nouveau/models/item/alchemical_sourcelink.json a0214090201827dd5f954d0b33e64e4df6e53764 assets/ars_nouveau/models/item/alchemists_crown.json @@ -7,7 +7,6 @@ f9eb0905e283cab647712716770a244a1bdb25f0 assets/ars_nouveau/models/item/bastion_ 84bdd95fc8506c6d9054e5ffb87c24c20b2ae628 assets/ars_nouveau/models/item/blank_thread.json a81ea25c1312389ff436100c29d1ae20d35b0a40 assets/ars_nouveau/models/item/blue_sbed.json 3b7dc3023a667efe5ff64cb937ee25047a853697 assets/ars_nouveau/models/item/bombegranate_pod.json -57a68c0d674b3622478b1b83f8543be58f6e3018 assets/ars_nouveau/models/item/burst.json 23781f068b9b788d0077a478b0470af583d759f5 assets/ars_nouveau/models/item/experience_gem.json 70d392c53a05ad554f3f3b1d3faa5fd1445e2a77 assets/ars_nouveau/models/item/falseweave.json 5f620c31cc6d4f1a569dbd943e5a45e75217303a assets/ars_nouveau/models/item/familiar_amethyst_golem.json @@ -40,6 +39,7 @@ e90b0d3b7816c04c63969ee51f69f521d44d5444 assets/ars_nouveau/models/item/glyph_an 8ad4f1e52ce9f588136032f323a0d76fc4849101 assets/ars_nouveau/models/item/glyph_blink.json 7441fa49080a68e1d9dfdaeb277d9b17229aac87 assets/ars_nouveau/models/item/glyph_bounce.json c3de1abdd00608d7f5b4b71953119d218787f318 assets/ars_nouveau/models/item/glyph_break.json +57a68c0d674b3622478b1b83f8543be58f6e3018 assets/ars_nouveau/models/item/glyph_burst.json 25e3368d3a84c449ff2d6c7ca27f76377fa2b3a7 assets/ars_nouveau/models/item/glyph_cold_snap.json 715f6e40e53b95cd4c4bd566ab43e226872ed02b assets/ars_nouveau/models/item/glyph_conjure_water.json f72d7e2b785b1eb940997edfedb3edf7386cc026 assets/ars_nouveau/models/item/glyph_craft.json diff --git a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 index 5b8bb6465e..7f315e6185 100644 --- a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 +++ b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 @@ -1,9 +1,9 @@ -// 1.21 2024-07-07T16:24:07.0872914 Ars Nouveau Caster Tomes Datagen +// 1.21 2024-07-14T12:08:42.8984246 Ars Nouveau Caster Tomes Datagen dae41a867bde9258624fe4676128e8140f2e7fe4 data/ars_nouveau/recipe/tomes/arachne_tome.json 991d75b27429c69fdce017dc2c7d033872f1daa1 data/ars_nouveau/recipe/tomes/aurellia_tome.json 2027d79f560de6a1a7829a478f64ccd8f1723bc2 data/ars_nouveau/recipe/tomes/bailey_tome.json 0be05276a18b4cac328dc05898e560b28f7e3a31 data/ars_nouveau/recipe/tomes/chems_tome.json -30027158e8aaa2a82d186f245821355cbcf73d96 data/ars_nouveau/recipe/tomes/darkfira_tome.json +0d097b7148d90a64199a8de9fcd4f5cbe5cecb03 data/ars_nouveau/recipe/tomes/darkfira_tome.json 3c4d9ad61832042e38046f7763047126dbc320a0 data/ars_nouveau/recipe/tomes/farfalla_tome.json f64772fb96f68b7865f64ee40a8718e1a2412fce data/ars_nouveau/recipe/tomes/fireball_tome.json 47410afb03915eaf6626f6cbfb872b647c9ea826 data/ars_nouveau/recipe/tomes/glow_tome.json @@ -12,7 +12,7 @@ fa2eefd9631a78bf8c31e4c9aad34a2517bb9736 data/ars_nouveau/recipe/tomes/ivy_tome. 488adf82fa89d69891e333e9bb94290f8ff6b6b1 data/ars_nouveau/recipe/tomes/kirin_tome.json 9836505724bc647ab6d1f92f212ad618456c878c data/ars_nouveau/recipe/tomes/lyrellion_tome.json d7ff05ccece42ac8ee440c7ef0d707e7c3f7e78b data/ars_nouveau/recipe/tomes/othy_tome.json -94662e20b5eb96453e7b898dc6506a18eb7a46d1 data/ars_nouveau/recipe/tomes/poseidon_tome.json +97e4c0165cd35d15736134d56c20453ef919f312 data/ars_nouveau/recipe/tomes/poseidon_tome.json 2a0f47cc40a8be0d2cd08db1a457463b10ed3cf9 data/ars_nouveau/recipe/tomes/renew_rune_tome.json f50e62b11676774b3822a8cbd7acf1b0efe8df85 data/ars_nouveau/recipe/tomes/shadow_tome.json a2701c983e0c938a26238d7707a1342cfb74d209 data/ars_nouveau/recipe/tomes/silvanus_tome.json diff --git a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 index a6783873f9..85d591e8c7 100644 --- a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 +++ b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 @@ -1,4 +1,4 @@ -// 1.21 2024-07-05T22:41:47.5481227 Patchouli +// 1.21 2024-07-14T12:08:42.9054421 Patchouli 2ec536fea831588201432d61d70af61385882054 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/alteration_table.json a82f4fc73946d228b1e3f5e03d0ecef46f33cdfb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/applying_perks.json 8ce1d8e886b45066bc5c1d9d8e87bdabbb27ae27 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor.json @@ -152,8 +152,8 @@ dcec678226980154062e130d3e611f51eb181e23 assets/ars_nouveau/patchouli_books/worn ff30b58b9f8180eaa8c2a00a32d6f012f2c2805f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_slowfall.json e31cdbbceef9ce55067aa334463abad1bbbf14c2 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_smelt.json a3f2fc942ad9e5cb68dda86b5876c87cc3da2dbb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_wind_shear.json -9d9da022a6fdd3f5a9641cdcc66c43b936c8c4c0 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/burst.json bfc911fbc580b331beece90d2a27ca63efb9d4e6 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_blink.json +682fe48624532f99ebe80795a2169e8aead63ec6 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_burst.json 4837262a06b75fc36db36831af94b2426973e380 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_fangs.json ada61102a55bc63f124a6a53510f29a77c21ce3c assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_glide.json 5fc4b3d4aa8a87b7f22be7397ae23abc31f099be assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_hex.json diff --git a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c index 303f292786..357e434dad 100644 --- a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c +++ b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c @@ -1,5 +1,4 @@ -// 1.21 2024-07-07T16:19:18.1720621 Glyph Recipes -900813bd9305050aab1ba6e11465baee4b4d6d92 data/ars_nouveau/recipe/burst.json +// 1.21 2024-07-14T12:08:42.895409 Glyph Recipes 231d9f126c606465601e36e83948dda99a508834 data/ars_nouveau/recipe/glyph_accelerate.json dbad772acd31382cfcf19c7f276da5f91354dfcf data/ars_nouveau/recipe/glyph_amplify.json 1a8499b67d1ce8614ef1d420106d32d27567eeb9 data/ars_nouveau/recipe/glyph_animate_block.json @@ -7,6 +6,7 @@ dbad772acd31382cfcf19c7f276da5f91354dfcf data/ars_nouveau/recipe/glyph_amplify.j c827180b8f5111736c1641e4683e63b3f764a80a data/ars_nouveau/recipe/glyph_blink.json 10e7f63b9784ce9693c7ec690dc13b21e9106297 data/ars_nouveau/recipe/glyph_bounce.json 6989360984c711d43b4e9175efbec3a23608db8e data/ars_nouveau/recipe/glyph_break.json +c5d245630add4160c2ea36ef8df4add7a45f7616 data/ars_nouveau/recipe/glyph_burst.json 5a951b64a1a102d1e71ee5ba85524cf1877378d5 data/ars_nouveau/recipe/glyph_cold_snap.json 72ba14e65f67b1d570b69ec9ad7b99e59cd3f4b4 data/ars_nouveau/recipe/glyph_conjure_water.json a8c81b73dd2931d4fafd62ad9a5cf1d3f625f0d4 data/ars_nouveau/recipe/glyph_craft.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index dfe04f4203..04cbf728dc 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -169,6 +169,7 @@ "ars_nouveau.dynamic_lights.button_off": "Dynamic lights are turned off.", "ars_nouveau.dynamic_lights.button_on": "Dynamic lights are turned on. This can cause lag for users with weaker CPUs, low RAM allocation, and unexpected results with 'performance' mods like Optifine.", "ars_nouveau.earth_essence.tooltip": "Can be used on Dirt to turn it into Grass.", + "ars_nouveau.empty": "Empty", "ars_nouveau.enchanting": "Enchanting", "ars_nouveau.enchanting.bad_level": "This item must have the previous level of enchantment.", "ars_nouveau.enchanting.incompatible": "This enchantment is incompatible with this item.", @@ -206,7 +207,6 @@ "ars_nouveau.getting_started": "Getting Started", "ars_nouveau.getting_started_desc": "An introduction to Ars Nouveau. It is recommended to follow each section in order.", "ars_nouveau.glyph_crafting": "Glyph Crafting", - "ars_nouveau.glyph_desc.burst": "Resolves the spell in a spherical area around the target. Augment with Sensitive to target blocks instead of entities and Dampen to make an empty sphere. Augment with AOE to increase the radius. ", "ars_nouveau.glyph_desc.glyph_accelerate": "Increases the speed of projectile spells.", "ars_nouveau.glyph_desc.glyph_amplify": "Additively increases the power of most spell effects. Can increase the harvest level of Break and increases the damage of spells.", "ars_nouveau.glyph_desc.glyph_animate_block": "Animates a block to fight for you. The animated block will convert to a falling block when it dies. Costs a large amount of mana, but does not grant Summoning Sickness", @@ -214,6 +214,7 @@ "ars_nouveau.glyph_desc.glyph_blink": "Teleports the caster to a location. If an entity is hit and the caster is holding a Warp Scroll in the offhand, the entity will be warped to the location on the Warp Scroll. When used on Self, the caster blinks forward. Spell Turrets and Runes can warp entities using Warp Scrolls from adjacent inventories without consuming the scroll.", "ars_nouveau.glyph_desc.glyph_bounce": "Gives players the Bounce effect, causing them to bounce upwards upon falling. Amplification of Bounce will preserve additional forward facing motion per bounce.", "ars_nouveau.glyph_desc.glyph_break": "A spell you start with. Breaks blocks of an average hardness. Can be amplified to increase the harvest level. Sensitive will simulate breaking blocks with Shears instead of a pickaxe.", + "ars_nouveau.glyph_desc.glyph_burst": "Resolves the spell in a spherical area around the target. Augment with Sensitive to target blocks instead of entities and Dampen to make an empty sphere. Augment with AOE to increase the radius. ", "ars_nouveau.glyph_desc.glyph_cold_snap": "Causes wet, slowed, or freezing entities to take a burst of damage and erupt into falling ice. Falling ice will slow and damage nearby entities. Can also be used to erupt a block of ice instead. Falling blocks of ice can be manipulated with the Focus of Block Shaping. Entities afflicted with Freezing will be set to the maximum freeze level immediately.", "ars_nouveau.glyph_desc.glyph_conjure_water": "Places water at a location or extinguishes entities on fire.", "ars_nouveau.glyph_desc.glyph_craft": "Opens the crafting menu.", @@ -287,7 +288,6 @@ "ars_nouveau.glyph_desc.reset": "Resets the spell chain to the original target if it was changed by a previous effect. For example, Burst -> Place Block -> Reset -> Break will cause Burst to place blocks, but only Break will apply to the original location. As a result, using Reset will allow you to bypass combination and duplicate limits on glyphs.", "ars_nouveau.glyph_desc.rewind": "Rewinds an entity back in time to its previous locations and health. Can revert blocks that were moved with spells back into solid blocks. Glyphs that come after Rewind will be cast at the end of the rewind, as if they were Delayed.", "ars_nouveau.glyph_desc.wololo": "Changes the color of an entity or compatible block to the color of the spell.", - "ars_nouveau.glyph_name.burst": "Burst", "ars_nouveau.glyph_name.glyph_accelerate": "Accelerate", "ars_nouveau.glyph_name.glyph_amplify": "Amplify", "ars_nouveau.glyph_name.glyph_animate_block": "Animate Block", @@ -295,6 +295,7 @@ "ars_nouveau.glyph_name.glyph_blink": "Blink", "ars_nouveau.glyph_name.glyph_bounce": "Bounce", "ars_nouveau.glyph_name.glyph_break": "Break", + "ars_nouveau.glyph_name.glyph_burst": "Burst", "ars_nouveau.glyph_name.glyph_cold_snap": "Cold Snap", "ars_nouveau.glyph_name.glyph_conjure_water": "Conjure Water", "ars_nouveau.glyph_name.glyph_craft": "Craft", diff --git a/src/generated/resources/assets/ars_nouveau/models/item/burst.json b/src/generated/resources/assets/ars_nouveau/models/item/glyph_burst.json similarity index 100% rename from src/generated/resources/assets/ars_nouveau/models/item/burst.json rename to src/generated/resources/assets/ars_nouveau/models/item/glyph_burst.json diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/burst.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/burst.json deleted file mode 100644 index 63ce2bebdb..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/burst.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "category": "ars_nouveau:glyphs_3", - "icon": "ars_nouveau:burst", - "name": "ars_nouveau.glyph_name.burst", - "pages": [ - { - "type": "patchouli:text", - "text": "ars_nouveau.glyph_desc.burst" - }, - { - "type": "ars_nouveau:glyph_recipe", - "recipe": "ars_nouveau:burst" - } - ], - "sortnum": 2 -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_burst.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_burst.json new file mode 100644 index 0000000000..f45322d42d --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_burst.json @@ -0,0 +1,16 @@ +{ + "category": "ars_nouveau:glyphs_3", + "icon": "ars_nouveau:glyph_burst", + "name": "ars_nouveau.glyph_name.glyph_burst", + "pages": [ + { + "type": "patchouli:text", + "text": "ars_nouveau.glyph_desc.glyph_burst" + }, + { + "type": "ars_nouveau:glyph_recipe", + "recipe": "ars_nouveau:glyph_burst" + } + ], + "sortnum": 2 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/burst.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_burst.json similarity index 92% rename from src/generated/resources/data/ars_nouveau/recipe/burst.json rename to src/generated/resources/data/ars_nouveau/recipe/glyph_burst.json index c8d56b7390..92f64bfb3a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/burst.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_burst.json @@ -26,6 +26,6 @@ ], "output": { "count": 1, - "id": "ars_nouveau:burst" + "id": "ars_nouveau:glyph_burst" } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/darkfira_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/darkfira_tome.json index bd24ccd10f..d885f0c57b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/tomes/darkfira_tome.json +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/darkfira_tome.json @@ -22,7 +22,7 @@ }, "spell": [ "ars_nouveau:glyph_projectile", - "ars_nouveau:burst", + "ars_nouveau:glyph_burst", "ars_nouveau:glyph_sensitive", "ars_nouveau:glyph_aoe", "ars_nouveau:glyph_aoe", diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/poseidon_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/poseidon_tome.json index d982d4a442..645a685891 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/tomes/poseidon_tome.json +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/poseidon_tome.json @@ -22,7 +22,7 @@ "ars_nouveau:glyph_projectile", "ars_nouveau:glyph_sensitive", "ars_nouveau:glyph_light", - "ars_nouveau:burst", + "ars_nouveau:glyph_burst", "ars_nouveau:glyph_aoe", "ars_nouveau:glyph_aoe", "ars_nouveau:glyph_sensitive", diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerkHolder.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerkHolder.java index 9b9df905b0..02844d4344 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerkHolder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerkHolder.java @@ -49,7 +49,7 @@ default void appendPerkTooltip(List tooltip, ItemStack stack){ int missing = getSlotsForTier(stack).size() - getPerkInstances(stack).size(); for(int i = 0; i < missing; i++){ PerkSlot slot = new ArrayList<>(getSlotsForTier(stack)).subList(getPerkInstances(stack).size(), getSlotsForTier(stack).size()).get(i); - tooltip.add(Component.literal(Component.translatable("Empty").getString() + " " + RomanNumber.toRoman(slot.value())).withStyle(ChatFormatting.RED).withStyle(ChatFormatting.ITALIC)); + tooltip.add(Component.literal(Component.translatable("ars_nouveau.empty").getString() + " " + RomanNumber.toRoman(slot.value())).withStyle(ChatFormatting.RED).withStyle(ChatFormatting.ITALIC)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index e9d1c37a10..12b3da69b5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -15,6 +15,7 @@ import net.minecraft.data.PackOutput; import net.minecraft.world.item.Item; import net.neoforged.neoforge.common.data.LanguageProvider; + import java.util.Map; import java.util.TreeMap; import java.util.function.Supplier; @@ -1277,6 +1278,7 @@ protected void addTranslations() { add("effect.ars_nouveau.immolate", "Immolate"); add("effect.ars_nouveau.immolate.desc", "Enhances fire spells."); add("block.ars_nouveau.sourceberry_sack", "Sourceberry Sack"); + add("ars_nouveau.empty","Empty"); for(String s : LibBlockNames.DECORATIVE_SOURCESTONE){ String key = "block.ars_nouveau." + s; String val = data.get(key); From 973acbe765aa78ea46b1fcd87d92e992011ca4f8 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 14 Jul 2024 13:15:25 -0500 Subject: [PATCH 062/363] fix Break --- .../arsnouveau/api/util/BlockUtil.java | 57 ++++++++----------- 1 file changed, 25 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java index 6faa82502b..4962b821d9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java @@ -335,45 +335,38 @@ public static boolean breakExtraBlock(ServerLevel world, BlockPos pos, ItemStack } GameType type = player.getAbilities().instabuild ? GameType.CREATIVE : GameType.SURVIVAL; - //TODO: check block breaking rules - int exp = 1;// net.neoforged.neoforge.common.CommonHooks.onBlockBreakEvent(world, type, player, pos); - if (exp == -1) { + boolean canceled = net.neoforged.neoforge.common.CommonHooks.fireBlockBreak(world, type, player, pos, blockstate).isCanceled(); + if (canceled) { + return false; + } + BlockEntity tileentity = world.getBlockEntity(pos); + Block block = blockstate.getBlock(); + if ((block instanceof CommandBlock || block instanceof StructureBlock || block instanceof JigsawBlock) && !player.canUseGameMasterBlocks()) { + world.sendBlockUpdated(pos, blockstate, blockstate, 3); + return false; + } else if (player.blockActionRestricted(world, pos, type)) { return false; } else { - BlockEntity tileentity = world.getBlockEntity(pos); - Block block = blockstate.getBlock(); - if ((block instanceof CommandBlock || block instanceof StructureBlock || block instanceof JigsawBlock) && !player.canUseGameMasterBlocks()) { - world.sendBlockUpdated(pos, blockstate, blockstate, 3); - return false; - } else if (false){// player.getMainHandItem().onBlockStartBreak(pos, player)) { - return false; - } else if (player.blockActionRestricted(world, pos, type)) { - return false; + if (player.getAbilities().instabuild) { + removeBlock(world, player, pos, false); + return true; } else { - if (player.getAbilities().instabuild) { - removeBlock(world, player, pos, false); - return true; - } else { - ItemStack copyMain = mainhand.copy(); - boolean canHarvest = blockstate.canHarvestBlock(world, pos, player) || bypassToolCheck; - mainhand.mineBlock(world, blockstate, pos, player); - if (mainhand.isEmpty() && !copyMain.isEmpty()){ - net.neoforged.neoforge.event.EventHooks.onPlayerDestroyItem(player, copyMain, InteractionHand.MAIN_HAND); - } - boolean removed = removeBlock(world, player, pos, canHarvest); - - if (removed && canHarvest) { - block.playerDestroy(world, player, pos, blockstate, tileentity, copyMain); - } - - if (removed && exp > 0){ - blockstate.getBlock().popExperience(world, pos, exp); - } + ItemStack copyMain = mainhand.copy(); + boolean canHarvest = blockstate.canHarvestBlock(world, pos, player) || bypassToolCheck; + mainhand.mineBlock(world, blockstate, pos, player); + if (mainhand.isEmpty() && !copyMain.isEmpty()){ + net.neoforged.neoforge.event.EventHooks.onPlayerDestroyItem(player, copyMain, InteractionHand.MAIN_HAND); + } + boolean removed = removeBlock(world, player, pos, canHarvest); - return true; + if (removed && canHarvest) { + block.playerDestroy(world, player, pos, blockstate, tileentity, copyMain); } + + return true; } } + } /** From e70d56cd7883413cede5e5223fe3e45495342144 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 14 Jul 2024 13:55:49 -0500 Subject: [PATCH 063/363] fix wixie crafting --- .../api/recipe/CraftingManager.java | 8 +- .../arsnouveau/api/util/NBTUtil.java | 6 ++ .../common/block/WixieCauldron.java | 2 - .../common/block/tile/WixieCauldronTile.java | 79 ++++--------------- .../common/datagen/LangDatagen.java | 4 +- .../entity/goal/wixie/FindNextItemGoal.java | 2 +- .../arsnouveau/common/network/Networking.java | 2 +- 7 files changed, 29 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/CraftingManager.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/CraftingManager.java index 45c3f3a460..962048ca62 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/CraftingManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/CraftingManager.java @@ -64,7 +64,7 @@ public boolean giveItem(Item i) { } public boolean canBeCompleted() { - return neededItems.isEmpty(); + return !outputStack.isEmpty() && neededItems.isEmpty(); } public boolean isCraftCompleted(){ @@ -89,8 +89,10 @@ public void completeCraft(WixieCauldronTile tile){ } public void write(HolderLookup.Provider provider, CompoundTag tag) { - Tag stack = outputStack.save(provider); - tag.put("output_stack", stack); + if(!outputStack.isEmpty()) { + Tag stack = outputStack.save(provider); + tag.put("output_stack", stack); + } NBTUtil.writeItems(provider, tag, "progress", neededItems); NBTUtil.writeItems(provider, tag, "refund", remainingItems); tag.putBoolean("completed", craftCompleted); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/NBTUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/NBTUtil.java index 46ad4af104..8532792091 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/NBTUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/NBTUtil.java @@ -18,6 +18,8 @@ public class NBTUtil { + public static int INT_LIST_TAG_TYPE = 11; + public static CompoundTag storeBlockPos(CompoundTag tag, String prefix, BlockPos pos) { if (pos == null) return tag; @@ -49,6 +51,10 @@ public static BlockPos getBlockPos(CompoundTag tag, String prefix) { return BlockPos.containing(tag.getDouble(prefix + "_x"), tag.getDouble(prefix + "_y"), tag.getDouble(prefix + "_z")); } + public static BlockPos getPos(int[] arr){ + return new BlockPos(arr[0], arr[1], arr[2]); + } + public static Vec3 getVec(CompoundTag tag, String prefix){ if(tag == null){ return null; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/WixieCauldron.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/WixieCauldron.java index 3ea57746b8..51a6be241d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/WixieCauldron.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/WixieCauldron.java @@ -7,7 +7,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -43,7 +42,6 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level if (wrapper.isEmpty()) { PortUtil.sendMessage(player, Component.translatable("ars_nouveau.wixie.no_recipe")); } else { - cauldronTile.setSetStack(player.getMainHandItem().copy()); PortUtil.sendMessage(player, Component.translatable("ars_nouveau.wixie.recipe_set")); } return ItemInteractionResult.CONSUME; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java index cc469d3d5d..09e70b0a5f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java @@ -6,6 +6,7 @@ import com.hollingsworth.arsnouveau.api.recipe.IRecipeWrapper; import com.hollingsworth.arsnouveau.api.recipe.MultiRecipeWrapper; import com.hollingsworth.arsnouveau.api.recipe.PotionCraftingManager; +import com.hollingsworth.arsnouveau.api.util.NBTUtil; import com.hollingsworth.arsnouveau.api.util.SourceUtil; import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; @@ -22,6 +23,7 @@ import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtUtils; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; @@ -46,14 +48,11 @@ import org.jetbrains.annotations.Nullable; import java.util.*; -// TODO: 1.20 Make all inventories bind only, remove auto inventory detection -// Also remove setStack and use pedestals only. + public class WixieCauldronTile extends SummoningTile implements ITooltipProvider, IWandable { - private List cachedInventories; public List boundedInvs = new ArrayList<>(); - private ItemStack setStack; - private ItemStack stackBeingCrafted; + private ItemStack stackBeingCrafted = ItemStack.EMPTY; public int entityID; public boolean hasSource; public boolean isCraftingPotion; @@ -89,9 +88,6 @@ public void tick() { if (!hasSource) return; - if (level.getGameTime() % 100 == 0) { - updateInventories(); // Update the inventories available to use - } if(!level.isClientSide() && level.getGameTime() % 20 == 0){ if(craftManager.isCraftCompleted()){ rotateCraft(); @@ -123,7 +119,6 @@ public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable Liv public void onWanded(Player playerEntity) { if(!this.boundedInvs.isEmpty()){ this.boundedInvs = new ArrayList<>(); - this.setStack = ItemStack.EMPTY; PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.wixie_cauldron.cleared")); updateBlock(); } @@ -144,9 +139,6 @@ public void rotateCraft(){ BlockPos leftBound = worldPosition.below().south().east(); BlockPos rightBound = worldPosition.above().north().west(); List itemStacks = new ArrayList<>(); - if(this.setStack != null && !this.setStack.isEmpty()){ - itemStacks.add(this.setStack); - } for(BlockPos pos : BlockPos.betweenClosed(leftBound, rightBound)){ if(level.getBlockEntity(pos) instanceof ArcanePedestalTile pedestalTile && !pedestalTile.getStack().isEmpty() @@ -234,24 +226,6 @@ public MultiRecipeWrapper getRecipesForStack(ItemStack stack) { return MultiRecipeWrapper.fromStack(stack, level); } - public void updateInventories() { - if(!boundedInvs.isEmpty()){ - return; - } - cachedInventories = new ArrayList<>(); - for (BlockPos bPos : BlockPos.betweenClosed(worldPosition.north(6).east(6).below(2), worldPosition.south(6).west(6).above(2))) { - if(!level.isLoaded(bPos)) - continue; - BlockEntity blockEntity = level.getBlockEntity(bPos); - if(blockEntity == null || blockEntity instanceof ArcanePedestalTile) - continue; - if(level.getCapability(Capabilities.ItemHandler.BLOCK, bPos, null) == null) - continue; - cachedInventories.add(bPos.immutable()); - } - setChanged(); - } - public static @Nullable BlockPos findPotionStorage(Level level, BlockPos worldPosition, PotionContents passedPot) { for(BlockPos bPos : BlockPos.withinManhattan(worldPosition.below(2), 4, 3, 4)){ if (level.getBlockEntity(bPos) instanceof PotionJarTile tile && tile.canAccept(passedPot, 300)) { @@ -298,7 +272,7 @@ public void convertedEffect() { private Map getInventoryCount() { List stale = new ArrayList<>(); Map itemsAvailable = new HashMap<>(); - if (cachedInventories == null && boundedInvs.isEmpty()) + if (boundedInvs.isEmpty()) return itemsAvailable; for (BlockPos p : getInventories()) { BlockEntity blockEntity = level.getBlockEntity(p); @@ -329,22 +303,13 @@ private Map getInventoryCount() { itemsAvailable.put(stack.getItem(), itemsAvailable.get(stack.getItem()) + stack.getCount()); } } - if(boundedInvs.isEmpty()) { - for (BlockPos p : stale) { - cachedInventories.remove(p); - } - } return itemsAvailable; } @Override protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.loadAdditional(compound, pRegistries); - setStack = ItemStack.EMPTY; stackBeingCrafted = ItemStack.EMPTY; - if (compound.contains("crafting")) { - this.setStack = ItemStack.parseOptional(pRegistries, compound.getCompound("crafting")); - } if (compound.contains("currentCraft")) { this.stackBeingCrafted = ItemStack.parseOptional(pRegistries, compound.getCompound("currentCraft")); } @@ -356,10 +321,9 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis craftingIndex = compound.getInt("craftingIndex"); boundedInvs = new ArrayList<>(); if(compound.contains("boundedInvs")){ - ListTag list = compound.getList("boundedInvs", 10); + ListTag list = compound.getList("boundedInvs", NBTUtil.INT_LIST_TAG_TYPE); for(int i = 0; i < list.size(); i++){ - CompoundTag tag = list.getCompound(i); - BlockPos pos = new BlockPos(tag.getInt("x"), tag.getInt("y"), tag.getInt("z")); + BlockPos pos = NBTUtil.getPos(list.getIntArray(i)); boundedInvs.add(pos); } } @@ -370,11 +334,7 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis public void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.saveAdditional(compound, pRegistries); - if (setStack != null && !setStack.isEmpty()) { - Tag itemTag = setStack.save(pRegistries); - compound.put("crafting", itemTag); - } - if (stackBeingCrafted != null) { + if (!stackBeingCrafted.isEmpty()) { Tag itemTag = stackBeingCrafted.save(pRegistries); compound.put("currentCraft", itemTag); } @@ -388,11 +348,7 @@ public void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistri compound.putInt("craftingIndex", craftingIndex); ListTag boundedList = new ListTag(); for(BlockPos pos : boundedInvs){ - CompoundTag tag = new CompoundTag(); - tag.putInt("x", pos.getX()); - tag.putInt("y", pos.getY()); - tag.putInt("z", pos.getZ()); - boundedList.add(tag); + boundedList.add(NbtUtils.writeBlockPos(pos)); } compound.put("boundedInvs", boundedList); compound.putInt("craftCooldown", craftCooldown); @@ -402,20 +358,18 @@ public void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistri public void getTooltip(List tooltip) { if(this.craftCooldown > 0) return; - if (stackBeingCrafted == null || stackBeingCrafted.isEmpty()) { + if (stackBeingCrafted.isEmpty()) { tooltip.add(Component.translatable("ars_nouveau.no_stack_crafting").withStyle(ChatFormatting.GOLD)); - return; } if (isOff) { tooltip.add(Component.translatable("ars_nouveau.tooltip.turned_off")); } - if(!boundedInvs.isEmpty()){ - tooltip.add(Component.translatable("ars_nouveau.cauldron.num_bounded", boundedInvs.size())); - } + tooltip.add(Component.translatable("ars_nouveau.cauldron.num_bounded", boundedInvs.size())); + - if (this.craftManager != null && !(this.craftManager instanceof PotionCraftingManager)) { + if (!stackBeingCrafted.isEmpty() && this.craftManager != null && !(this.craftManager instanceof PotionCraftingManager)) { tooltip.add(Component.literal( Component.translatable("ars_nouveau.wixie.crafting").getString() + Component.translatable(stackBeingCrafted.getDescriptionId()).getString()) @@ -453,13 +407,8 @@ public void getTooltip(List tooltip) { } - public void setSetStack(ItemStack setStack) { - this.setStack = setStack; - updateBlock(); - } - public List getInventories() { - return boundedInvs.isEmpty() ? cachedInventories : boundedInvs; + return boundedInvs; } public boolean needsPotionStorage() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 12b3da69b5..c23c9828ae 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -220,7 +220,7 @@ protected void addTranslations() { add("item.ars_nouveau.wand", "Enchanter's Wand"); add("ars_nouveau.wixie.has_wixie", "This cauldron already has a wixie."); add("ars_nouveau.wixie.no_recipe", "No recipes found."); - add("ars_nouveau.wixie.recipe_set", "Recipe set."); + add("ars_nouveau.wixie.recipe_set", "Place pedestals nearby for recipes to craft."); add("tooltip.wixie_shard", "Obtained by using Dispel on a witch while it is less than half health."); add("tooltip.starbuncle_shard", "Obtained by giving a wild Starbuncle a Gold Nugget."); add("tooltip.whirlisprig_shard", "Obtained by growing a tree near a wild Whirlisprig."); @@ -1267,7 +1267,7 @@ protected void addTranslations() { add("ars_nouveau.sensor.on_cast", "Mode: On Cast"); add("block.ars_nouveau.spell_sensor", "Spell Sensor"); add("ars_nouveau.page1.spell_sensor", "Outputs a redstone signal when a spell is cast nearby. Output strength is determined by the length of the spell cast. Using a Dominion Wand will cause it to trigger when a spell resolves nearby, instead of being cast. Using a Spell Parchment will set the sensor to only output when that exact spell is detected."); - add("ars_nouveau.no_stack_crafting", "No valid craft nearby."); + add("ars_nouveau.no_stack_crafting", "No valid craft nearby. Place pedestals with items adjacent to set a recipe. Provide items by binding inventories."); add("item.ars_nouveau.jump_ring", "Ring of Jumping"); add("ars_nouveau.page1.jump_ring", "Allows the user to continue jumping in the air. Each jump will expend mana."); add("ars_nouveau.connections.remove", "Connection removed."); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java index 65fdd19735..2bcd5296b2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java @@ -98,7 +98,7 @@ public boolean canContinueToUse() { public void tick() { super.tick(); - if (!found && movePos != null && BlockUtil.distanceFrom(wixie.position(), movePos.above()) < 2.0 + this.extendedRange) { + if (!found && movePos != null && BlockUtil.distanceFrom(wixie.position(), Vec3.atCenterOf(movePos)) < 1.3 + this.extendedRange) { WixieCauldronTile tile = (WixieCauldronTile) wixie.getCommandSenderWorld().getBlockEntity(wixie.cauldronPos); Level world = wixie.getCommandSenderWorld(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java index 024898b1c7..6d55a1f676 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java @@ -39,7 +39,7 @@ public static void register(final RegisterPayloadHandlersEvent event) { reg.playToServer(PacketConsumePotion.TYPE, PacketConsumePotion.CODEC, Networking::handle); reg.playToServer(PacketDismountCamera.TYPE, PacketDismountCamera.CODEC, Networking::handle); reg.playToServer(PacketDispelFamiliars.TYPE, PacketDispelFamiliars.CODEC, Networking::handle); - reg.playToServer(PacketAnimEntity.TYPE, PacketAnimEntity.CODEC, Networking::handle); + reg.playToClient(PacketAnimEntity.TYPE, PacketAnimEntity.CODEC, Networking::handle); reg.playToClient(PacketGetPersistentData.TYPE, PacketGetPersistentData.CODEC, Networking::handle); reg.playToServer(PacketHotkeyPressed.TYPE, PacketHotkeyPressed.CODEC, Networking::handle); reg.playToClient(PacketJoinedServer.TYPE, PacketJoinedServer.CODEC, Networking::handle); From bc63141580f877aac015c3e10cf3ffc335ef1145 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 14 Jul 2024 15:58:49 -0500 Subject: [PATCH 064/363] fix potion melder --- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 +-- .../assets/ars_nouveau/lang/en_us.json | 6 ++-- .../api/recipe/CraftingManager.java | 8 +++-- .../api/recipe/PotionCraftingManager.java | 6 ++-- .../common/block/tile/PotionJarTile.java | 19 ++++++++-- .../common/block/tile/PotionMelderTile.java | 35 +++++++++++++++++-- .../common/datagen/LangDatagen.java | 2 ++ .../arsnouveau/common/util/PotionUtil.java | 13 ++++--- 8 files changed, 72 insertions(+), 21 deletions(-) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 9b469f97fa..2eff5df0d6 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21 2024-07-14T12:08:42.9039367 Languages: en_us for mod: ars_nouveau -4968ddaa4b192c88963c6e7a26f518caba6e457a assets/ars_nouveau/lang/en_us.json +// 1.21 2024-07-14T15:55:32.138725 Languages: en_us for mod: ars_nouveau +0298f3de095efa6708af1fed492aa597e71d9b6f assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 04cbf728dc..5f81bddeaa 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -413,12 +413,14 @@ "ars_nouveau.melder.from_set": "%s of 2 melding jars set.", "ars_nouveau.melder.needs_potion": "Linked jars need potion", "ars_nouveau.melder.no_to_pos": "Wand the Melder to your desired Potion Jar.", + "ars_nouveau.melder.output_duplicate_effect": "Cannot mix potions with the same effect but different levels.", + "ars_nouveau.melder.output_not_unique": "Output potion is not a unique mix.", "ars_nouveau.melder.to_set": "Melder will send combined potions to this jar.", "ars_nouveau.melder.too_far": "Jars must be within 3 blocks.", "ars_nouveau.mirror.invalid": "Invalid spell. Mirrors accept Effects and Augments only.", "ars_nouveau.mod_news": "Mod News", "ars_nouveau.mod_news_desc": "The latest releases and news", - "ars_nouveau.no_stack_crafting": "No valid craft nearby.", + "ars_nouveau.no_stack_crafting": "No valid craft nearby. Place pedestals with items adjacent to set a recipe. Provide items by binding inventories.", "ars_nouveau.norecipe": "No recipe found.", "ars_nouveau.not_enough_exp": "Not enough EXP for this glyph.", "ars_nouveau.nothing": "Nothing", @@ -928,7 +930,7 @@ "ars_nouveau.wixie.needs": "Needs: ", "ars_nouveau.wixie.needs_storage": "Needs: Storage for potion.", "ars_nouveau.wixie.no_recipe": "No recipes found.", - "ars_nouveau.wixie.recipe_set": "Recipe set.", + "ars_nouveau.wixie.recipe_set": "Place pedestals nearby for recipes to craft.", "ars_nouveau.wixie_cauldron.bound": "Inventory bound.", "ars_nouveau.wixie_cauldron.cleared": "Bound inventories cleared.", "ars_nouveau.wixie_cauldron.removed": "Inventory removed.", diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/CraftingManager.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/CraftingManager.java index 962048ca62..ce3e160602 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/CraftingManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/CraftingManager.java @@ -64,11 +64,15 @@ public boolean giveItem(Item i) { } public boolean canBeCompleted() { - return !outputStack.isEmpty() && neededItems.isEmpty(); + return !isCraftInvalid() && neededItems.isEmpty(); } public boolean isCraftCompleted(){ - return craftCompleted; + return isCraftInvalid() || craftCompleted; + } + + public boolean isCraftInvalid(){ + return outputStack.isEmpty(); } public void completeCraft(WixieCauldronTile tile){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java index 296b949c79..c0f9cdcce5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java @@ -76,13 +76,15 @@ public void completeCraft(WixieCauldronTile tile) { super.completeCraft(tile); } + @Override + public boolean isCraftInvalid() { + return false; + } @Override public void write(HolderLookup.Provider provider, CompoundTag tag) { super.write(provider, tag); tag.put("potionout", ANCodecs.encode(PotionContents.CODEC, potionOut)); - - CompoundTag neededTag = new CompoundTag(); tag.put("potionNeeded", ANCodecs.encode(PotionContents.CODEC, getPotionNeeded())); tag.putBoolean("gotPotion", hasObtainedPotion); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java index 39a16236be..2b7eb2c0f3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java @@ -8,10 +8,14 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.PotionContents; +import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; @@ -68,18 +72,22 @@ public void handleUpdateTag(CompoundTag tag, HolderLookup.Provider lookupProvide } public int getColor() { - return this.data == PotionContents.EMPTY ? 16253176 : this.data.getColor(); + return this.data.equals(PotionContents.EMPTY) ? 16253176 : this.data.getColor(); } public boolean canAccept(PotionContents otherData, int amount){ - if(otherData == null || PotionUtil.isEmpty(otherData)) + if(otherData == null || !validContentTypeForJar(otherData)) return false; return (!this.isLocked && this.getAmount() <= 0) || (amount <= (this.getMaxFill() - this.getAmount()) && PotionUtil.arePotionContentsEqual(otherData, this.data)); } + public boolean validContentTypeForJar(PotionContents otherData){ + return !otherData.is(Potions.WATER) && !otherData.is(Potions.MUNDANE); + } + public void add(PotionContents other, int amount){ if(this.currentFill == 0){ - if(!this.data.equals(other) || (this.data == PotionContents.EMPTY)) { + if(!this.data.equals(other) || (this.data.equals(PotionContents.EMPTY))) { this.data = other; } currentFill += amount; @@ -100,6 +108,11 @@ public void remove(int amount){ @Override public void getTooltip(List tooltip) { + if(!data.equals(PotionContents.EMPTY)) { + ItemStack potion = new ItemStack(Items.POTION); + potion.set(DataComponents.POTION_CONTENTS, data); + tooltip.add(Component.translatable(potion.getDescriptionId())); + } PotionContents.addPotionTooltip(data.getAllEffects(), tooltip::add, 1.0F, 20.0f); tooltip.add(Component.translatable("ars_nouveau.source_jar.fullness", (getAmount() * 100) / this.getMaxFill())); if (isLocked) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java index e164f44685..96e5416bfc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java @@ -22,6 +22,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; +import net.minecraft.world.effect.MobEffect; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.alchemy.PotionContents; @@ -36,6 +37,7 @@ import software.bernie.geckolib.util.GeckoLibUtil; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; public class PotionMelderTile extends ModdedTile implements GeoBlockEntity, ITickable, IWandable, ITooltipProvider { @@ -84,7 +86,10 @@ public void tick() { PotionJarTile tile1 = (PotionJarTile) level.getBlockEntity(fromJars.get(0)); PotionJarTile tile2 = (PotionJarTile) level.getBlockEntity(fromJars.get(1)); - PotionContents data = PotionUtil.merge(tile1.getData(), tile2.getData()); + PotionContents data = getCombinedResult(tile1, tile2); + if(!isOutputUnique(data, tile1, tile2) || outputHasDuplicateEffect(data)){ + return; + } if (!combJar.canAccept(data, Config.MELDER_OUTPUT.get())) { isMixing = false; timeMixing = 0; @@ -166,6 +171,21 @@ public PotionContents getCombinedResult(PotionJarTile jar1, PotionJarTile jar2) return PotionUtil.merge(jar1.getData(), jar2.getData()); } + public boolean isOutputUnique(PotionContents mix, PotionJarTile take1, PotionJarTile take2){ + return !PotionUtil.arePotionContentsEqual(mix, take1.getData()) && !PotionUtil.arePotionContentsEqual(mix, take2.getData()); + } + + public boolean outputHasDuplicateEffect(PotionContents mix){ + var effects = mix.getAllEffects(); + var effectSet = new HashSet(); + for(var effect : effects){ + if(!effectSet.add(effect.getEffect().value())){ + return true; + } + } + return false; + } + @Override public void onWanded(Player playerEntity) { this.toPos = null; @@ -216,7 +236,7 @@ public List getWandHighlight(List list) { } public boolean closeEnough(BlockPos pos1, BlockPos pos2){ - return BlockUtil.distanceFrom(pos1, pos2) <= 3; + return BlockUtil.distanceFrom(Vec3.atCenterOf(pos1), Vec3.atCenterOf(pos2)) <= 3.5; } private PlayState idlePredicate(AnimationState event) { @@ -278,7 +298,7 @@ public void getTooltip(List tooltip) { } if(fromJars.size() < 2) tooltip.add(Component.translatable("ars_nouveau.melder.from_set", fromJars.size()).setStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); - if(toPos == null){ + if(toPos == null || !level.isLoaded(toPos) || !(level.getBlockEntity(toPos) instanceof PotionJarTile)){ tooltip.add(Component.translatable("ars_nouveau.melder.no_to_pos").setStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); } if(toPos != null && fromJars.size() == 2 && hasSource && !isMixing && !takeJarsValid()){ @@ -292,6 +312,15 @@ public void getTooltip(List tooltip) { return; } PotionContents data = getCombinedResult(tile1, tile2); + + if(!isOutputUnique(data, tile1, tile2)){ + tooltip.add(Component.translatable("ars_nouveau.melder.output_not_unique").setStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); + return; + } + if(outputHasDuplicateEffect(data)){ + tooltip.add(Component.translatable("ars_nouveau.melder.output_duplicate_effect").setStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); + return; + } if(!combJar.canAccept(data, Config.MELDER_OUTPUT.get())){ tooltip.add(Component.translatable("ars_nouveau.melder.destination_invalid").setStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index c23c9828ae..214ac7d39a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -1279,6 +1279,8 @@ protected void addTranslations() { add("effect.ars_nouveau.immolate.desc", "Enhances fire spells."); add("block.ars_nouveau.sourceberry_sack", "Sourceberry Sack"); add("ars_nouveau.empty","Empty"); + add("ars_nouveau.melder.output_not_unique", "Output potion is not a unique mix."); + add("ars_nouveau.melder.output_duplicate_effect", "Cannot mix potions with the same effect but different levels."); for(String s : LibBlockNames.DECORATIVE_SOURCESTONE){ String key = "block.ars_nouveau." + s; String val = data.get(key); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java index 650e9b4040..33384a8ce0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java @@ -14,7 +14,9 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; public class PotionUtil { @@ -28,14 +30,10 @@ public static boolean arePotionContentsEqual(PotionContents pot1, PotionContents if(pot1 == null || pot2 == null){ return false; } - List pot1Effects = new ArrayList<>(); - List pot2Effects = new ArrayList<>(); + Set pot1Effects = new HashSet<>(); + Set pot2Effects = new HashSet<>(); pot1.getAllEffects().forEach(pot1Effects::add); pot2.getAllEffects().forEach(pot2Effects::add); - if(pot1Effects.size() != pot2Effects.size()) - return false; - pot2Effects.sort(Comparator.comparing(MobEffectInstance::toString)); - pot1Effects.sort(Comparator.comparing(MobEffectInstance::toString)); return pot1Effects.equals(pot2Effects); } @@ -75,6 +73,7 @@ public static PotionContents merge(PotionContents contents1, PotionContents cont for(MobEffectInstance effect : contents2.getAllEffects()){ set.add(new MobEffectInstance(effect)); } + contents1.potion().get().value().getEffects().forEach(set::remove); return new PotionContents(contents1.potion(), contents1.customColor(), new ArrayList<>(set)); } } From 6830261834d23e6d2b52da0defea11ccdcd8c315 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 14 Jul 2024 16:41:31 -0500 Subject: [PATCH 065/363] fix flask cannons --- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 +- .../assets/ars_nouveau/lang/en_us.json | 2 +- .../api/registry/PotionProviderRegistry.java | 2 + .../client/registry/ClientHandler.java | 3 +- .../renderer/item/FlaskCannonRenderer.java | 3 +- .../common/datagen/LangDatagen.java | 2 +- .../arsnouveau/common/items/FlaskCannon.java | 16 ++++---- .../arsnouveau/common/items/JarOfLight.java | 24 ++++++------ .../arsnouveau/common/items/VoidJar.java | 13 ++++++- .../common/items/data/LightJarData.java | 15 ++++++-- .../common/items/data/PotionLauncherData.java | 37 ++++++++++++------- .../common/network/PacketSetLauncher.java | 4 +- 12 files changed, 81 insertions(+), 44 deletions(-) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 2eff5df0d6..1b67c44eb9 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21 2024-07-14T15:55:32.138725 Languages: en_us for mod: ars_nouveau -0298f3de095efa6708af1fed492aa597e71d9b6f assets/ars_nouveau/lang/en_us.json +// 1.21 2024-07-14T16:40:09.6097819 Languages: en_us for mod: ars_nouveau +c9d4e32862841199ebed165ef9dc2e8ab2cadc59 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 5f81bddeaa..c131744fe7 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -420,7 +420,7 @@ "ars_nouveau.mirror.invalid": "Invalid spell. Mirrors accept Effects and Augments only.", "ars_nouveau.mod_news": "Mod News", "ars_nouveau.mod_news_desc": "The latest releases and news", - "ars_nouveau.no_stack_crafting": "No valid craft nearby. Place pedestals with items adjacent to set a recipe. Provide items by binding inventories.", + "ars_nouveau.no_stack_crafting": "No valid craft nearby.", "ars_nouveau.norecipe": "No recipe found.", "ars_nouveau.not_enough_exp": "Not enough EXP for this glyph.", "ars_nouveau.nothing": "Nothing", diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/PotionProviderRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/PotionProviderRegistry.java index 13db10ffb1..0e0c82946f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/PotionProviderRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/PotionProviderRegistry.java @@ -70,6 +70,8 @@ public void setData(PotionContents contents, int usesRemaining, int maxUses, Ite static{ MAP.put(ItemsRegistry.POTION_FLASK.asItem(), (stack) -> stack.get(DataComponentRegistry.MULTI_POTION)); + MAP.put(ItemsRegistry.POTION_FLASK_AMPLIFY.asItem(), (stack) -> stack.get(DataComponentRegistry.MULTI_POTION)); + MAP.put(ItemsRegistry.POTION_FLASK_EXTEND_TIME.asItem(), (stack) -> stack.get(DataComponentRegistry.MULTI_POTION)); MAP.put(Items.POTION, (stack) -> DEFAULT); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index 852b64c0ec..1bdc4f97e9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -2,7 +2,6 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.camera.ICameraMountable; -import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; import com.hollingsworth.arsnouveau.api.registry.PotionProviderRegistry; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; import com.hollingsworth.arsnouveau.api.util.PerkUtil; @@ -326,7 +325,7 @@ public static void initItemColors(final RegisterColorHandlersEvent.Item event) { } public static int colorFromArmor(ItemStack stack) { - IPerkHolder holder = PerkUtil.getPerkHolder(stack); + ArmorPerkHolder holder = PerkUtil.getPerkHolder(stack); if (!(holder instanceof ArmorPerkHolder armorPerkHolder)) return FastColor.ABGR32.opaque(DyeColor.PURPLE.getTextColor()); return FastColor.ABGR32.opaque(DyeColor.byName(armorPerkHolder.getColor(), DyeColor.PURPLE).getTextColor()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java index 5a281058ff..06ed48cfa3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/FlaskCannonRenderer.java @@ -6,6 +6,7 @@ import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -35,7 +36,7 @@ public void renderRecursively(PoseStack poseStack, FlaskCannon animatable, GeoBo return; } PotionLauncherData flask = currentItemStack.getOrDefault(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData()); - int amountLeft = flask.amountLeft(); + int amountLeft = flask.amountLeft(Minecraft.getInstance().player); if(bone == null) return; if(bone.getName().equalsIgnoreCase("full")){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 214ac7d39a..742ddefe5e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -1267,7 +1267,7 @@ protected void addTranslations() { add("ars_nouveau.sensor.on_cast", "Mode: On Cast"); add("block.ars_nouveau.spell_sensor", "Spell Sensor"); add("ars_nouveau.page1.spell_sensor", "Outputs a redstone signal when a spell is cast nearby. Output strength is determined by the length of the spell cast. Using a Dominion Wand will cause it to trigger when a spell resolves nearby, instead of being cast. Using a Spell Parchment will set the sensor to only output when that exact spell is detected."); - add("ars_nouveau.no_stack_crafting", "No valid craft nearby. Place pedestals with items adjacent to set a recipe. Provide items by binding inventories."); + add("ars_nouveau.no_stack_crafting", "No valid craft nearby."); add("item.ars_nouveau.jump_ring", "Ring of Jumping"); add("ars_nouveau.page1.jump_ring", "Allows the user to continue jumping in the air. Each jump will expend mana."); add("ars_nouveau.connections.remove", "Connection removed."); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java index b09a11b8e8..08327d28ff 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.item.IRadialProvider; +import com.hollingsworth.arsnouveau.api.potion.IPotionProvider; import com.hollingsworth.arsnouveau.api.registry.PotionProviderRegistry; import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenu; @@ -46,7 +47,7 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; - +//TODO: Give flask cannons internal inventory instead of using player inventory public abstract class FlaskCannon extends ModItem implements IRadialProvider, GeoItem { public FlaskCannon(Properties properties) { super(properties.component(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData())); @@ -71,18 +72,19 @@ public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pS if(lastSlot < 0 || lastSlot >= player.inventory.getContainerSize()) return; ItemStack item = player.inventory.getItem(lastSlot); - if (potionLauncherData.amountLeft() > 0 && PotionProviderRegistry.from(item) == null && !(item.getItem() instanceof PotionItem)) { - pStack.set(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData(potionLauncherData.renderData(), 0, lastSlot)); + if (potionLauncherData.amountLeft(player) > 0 && PotionProviderRegistry.from(item) == null && !(item.getItem() instanceof PotionItem)) { + pStack.set(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData(potionLauncherData.renderData(), lastSlot)); } } public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pHand) { ItemStack itemstack = pPlayer.getItemInHand(pHand); - PotionLauncherData potionLauncherData = itemstack.getOrDefault(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData()); + PotionLauncherData potionLauncherData = itemstack.get(DataComponentRegistry.POTION_LAUNCHER); if(pLevel.isClientSide) return InteractionResultHolder.consume(itemstack); - PotionContents potionData = potionLauncherData.getPotionDataFromSlot(pPlayer); - if(PotionUtil.isEmpty(potionData)){ + ItemStack selectedPotion = potionLauncherData.getSelectedStack(pPlayer); + IPotionProvider potionData = potionLauncherData.getPotionDataFromSlot(pPlayer); + if(potionData == null || PotionUtil.isEmpty(potionData.getPotionData(selectedPotion)) || potionData.usesRemaining(selectedPotion) <= 0){ PortUtil.sendMessage(pPlayer, Component.translatable("ars_nouveau.flask_cannon.no_potion")); return InteractionResultHolder.sidedSuccess(itemstack, pLevel.isClientSide()); } @@ -96,7 +98,7 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte thrownpotion.shootFromRotation(pPlayer, pPlayer.getXRot(), pPlayer.getYRot(), -20.0F, 0.5F, 1.0F); pLevel.addFreshEntity(thrownpotion); pPlayer.getCooldowns().addCooldown(this, 10); - itemstack.set(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData(contents, potionLauncherData.amountLeft(), potionLauncherData.lastSlot())); + itemstack.set(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData(contents, potionLauncherData.lastSlot())); return new InteractionResultHolder<>(InteractionResult.CONSUME, itemstack); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/JarOfLight.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/JarOfLight.java index 099299360b..238085e229 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/JarOfLight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/JarOfLight.java @@ -18,10 +18,12 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; +import java.util.Optional; + public class JarOfLight extends ModItem { public JarOfLight() { - super(ItemsRegistry.defaultItemProperties().component(DataComponentRegistry.LIGHT_JAR, new LightJarData(null, false))); + super(ItemsRegistry.defaultItemProperties().component(DataComponentRegistry.LIGHT_JAR, new LightJarData())); } @Override @@ -30,15 +32,15 @@ public void inventoryTick(ItemStack stack, Level worldIn, Entity entityIn, int i if (worldIn.isClientSide) return; - LightJarData data = stack.getOrDefault(DataComponentRegistry.LIGHT_JAR, new LightJarData(null, false)); - if (!data.enabled()) { + LightJarData data = stack.get(DataComponentRegistry.LIGHT_JAR); + if (data == null || !data.enabled() || data.pos().isEmpty()) { return; } - BlockPos lightLocation = data.pos(); + BlockPos lightLocation = data.pos().get(); BlockState state = worldIn.getBlockState(lightLocation); // The previous light block was destroyed. if (!(state.getBlock() instanceof LightBlock)) { - stack.set(DataComponentRegistry.LIGHT_JAR, new LightJarData(null, true)); + stack.set(DataComponentRegistry.LIGHT_JAR, new LightJarData(Optional.empty(), true)); } if (BlockUtil.distanceFrom(lightLocation, entityIn.blockPosition()) > 7) { @@ -63,15 +65,15 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In if (worldIn.isClientSide) return new InteractionResultHolder<>(InteractionResult.SUCCESS, itemstack); - LightJarData tag = itemstack.getOrDefault(DataComponentRegistry.LIGHT_JAR, new LightJarData(null, false)); - if (tag.pos() != null) { + LightJarData tag = itemstack.get(DataComponentRegistry.LIGHT_JAR); + if (tag.pos().isPresent()) { removeLight(worldIn, tag); - itemstack.set(DataComponentRegistry.LIGHT_JAR, new LightJarData(null, false)); + itemstack.set(DataComponentRegistry.LIGHT_JAR, new LightJarData(Optional.empty(), false)); return new InteractionResultHolder<>(InteractionResult.SUCCESS, itemstack); } // No light exists. Place a new one. placeLight(worldIn, playerIn.blockPosition()); - + itemstack.set(DataComponentRegistry.LIGHT_JAR, new LightJarData(playerIn.blockPosition(), true)); return new InteractionResultHolder<>(InteractionResult.SUCCESS, itemstack); } @@ -84,10 +86,10 @@ public boolean placeLight(Level world, BlockPos pos) { } public void removeLight(Level world, LightJarData lightJarData) { - BlockPos pos = lightJarData.pos(); - if(pos == null){ + if(lightJarData.pos().isEmpty()){ return; } + BlockPos pos = lightJarData.pos().get(); if (world.getBlockState(pos).getBlock() instanceof LightBlock) world.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java index d44f37870f..726b2844df 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java @@ -12,8 +12,13 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; +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; public class VoidJar extends ModItem implements IScribeable { @@ -23,7 +28,8 @@ public VoidJar() { public void toggleStatus(Player playerEntity, ItemStack stack) { VoidJarData jarData = stack.getOrDefault(DataComponentRegistry.VOID_JAR, new VoidJarData()); - var newData = stack.set(DataComponentRegistry.VOID_JAR, jarData.setActive(!jarData.active())); + var newData = jarData.setActive(!jarData.active()); + stack.set(DataComponentRegistry.VOID_JAR, newData); if (newData.active()) { PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.on")); } else { @@ -92,4 +98,9 @@ public boolean onScribe(Level world, BlockPos pos, Player player, InteractionHan return written; } + @Override + public void appendHoverText(ItemStack stack, @Nullable Item.TooltipContext context, List tooltip2, TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); + stack.addToTooltip(DataComponentRegistry.VOID_JAR, context, tooltip2::add, flagIn); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/LightJarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/LightJarData.java index 2212e839d7..d08948637e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/LightJarData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/LightJarData.java @@ -8,14 +8,23 @@ import net.minecraft.network.codec.StreamCodec; import java.util.Objects; +import java.util.Optional; -public record LightJarData(BlockPos pos, boolean enabled) { +public record LightJarData(Optional pos, boolean enabled) { public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - BlockPos.CODEC.fieldOf("pos").forGetter(LightJarData::pos), + BlockPos.CODEC.optionalFieldOf("pos").forGetter(LightJarData::pos), Codec.BOOL.fieldOf("enabled").forGetter(LightJarData::enabled) ).apply(instance, LightJarData::new)); - public static StreamCodec STREAM_CODEC = StreamCodec.composite(BlockPos.STREAM_CODEC, LightJarData::pos, ByteBufCodecs.BOOL,LightJarData::enabled, LightJarData::new); + public static StreamCodec STREAM_CODEC = StreamCodec.composite(BlockPos.STREAM_CODEC.apply(ByteBufCodecs::optional), LightJarData::pos, ByteBufCodecs.BOOL,LightJarData::enabled, LightJarData::new); + + public LightJarData() { + this(Optional.empty(), false); + } + + public LightJarData(BlockPos pos, boolean enabled) { + this(Optional.of(pos), enabled); + } @Override public boolean equals(Object o) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java index efa9679aac..3bdb5f1e59 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionLauncherData.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.common.items.data; +import com.hollingsworth.arsnouveau.api.potion.IPotionProvider; import com.hollingsworth.arsnouveau.api.registry.PotionProviderRegistry; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.mojang.serialization.Codec; @@ -12,13 +13,13 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.alchemy.PotionContents; +import javax.annotation.Nullable; import java.util.Objects; -public record PotionLauncherData(PotionContents renderData, int amountLeft, int lastSlot) { +public record PotionLauncherData(PotionContents renderData, int lastSlot) { public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( PotionContents.CODEC.fieldOf("lastDataForRender").forGetter(PotionLauncherData::renderData), - Codec.INT.fieldOf("amountLeft").forGetter(PotionLauncherData::amountLeft), Codec.INT.fieldOf("lastSlot").forGetter(PotionLauncherData::lastSlot) ).apply(instance, PotionLauncherData::new)); @@ -26,22 +27,23 @@ public record PotionLauncherData(PotionContents renderData, int amountLeft, int PotionContents.STREAM_CODEC, PotionLauncherData::renderData, ByteBufCodecs.INT, - PotionLauncherData::amountLeft, - ByteBufCodecs.INT, PotionLauncherData::lastSlot, PotionLauncherData::new ); public PotionLauncherData(){ - this(PotionContents.EMPTY, 0, -1); + this(PotionContents.EMPTY, -1); + } + + public @Nullable IPotionProvider getPotionDataFromSlot(Player player){ + ItemStack stack = getSelectedStack(player); + return PotionProviderRegistry.from(stack); } - public PotionContents getPotionDataFromSlot(Player player){ + public ItemStack getSelectedStack(Player player){ if(lastSlot < 0 || lastSlot >= player.inventory.getContainerSize()) - return PotionContents.EMPTY; - ItemStack stack = player.inventory.getItem(lastSlot); - var provider = PotionProviderRegistry.from(stack); - return provider == null ? PotionContents.EMPTY : provider.getPotionData(stack); + return ItemStack.EMPTY; + return player.inventory.getItem(lastSlot); } public PotionContents expendPotion(Player player, ItemStack launcherStack){ @@ -57,20 +59,29 @@ public PotionContents expendPotion(Player player, ItemStack launcherStack){ } PotionContents contents = provider.getPotionData(item); provider.consumeUses(item, 1, player); - launcherStack.set(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData(provider.getPotionData(item), provider.usesRemaining(item), lastSlot)); + launcherStack.set(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData(provider.getPotionData(item), lastSlot)); return contents; } + public int amountLeft(Player player){ + ItemStack stack = getSelectedStack(player); + var provider = PotionProviderRegistry.from(stack); + if(provider == null){ + return 0; + } + return provider.usesRemaining(stack); + } + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; PotionLauncherData that = (PotionLauncherData) o; - return lastSlot == that.lastSlot && amountLeft == that.amountLeft && Objects.equals(renderData, that.renderData); + return lastSlot == that.lastSlot && Objects.equals(renderData, that.renderData); } @Override public int hashCode() { - return Objects.hash(renderData, amountLeft, lastSlot); + return Objects.hash(renderData, lastSlot); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java index 97f72f5767..8c4d76f959 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSetLauncher.java @@ -50,13 +50,13 @@ public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer playe } IPotionProvider provider = PotionProviderRegistry.from(stack); if (provider != null) { - stack.set(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData(provider.getPotionData(stack), provider.usesRemaining(stack), inventorySlot)); + launcherStack.set(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData(provider.getPotionData(stack), inventorySlot)); }else { PotionContents contents = stack.get(DataComponents.POTION_CONTENTS); if(contents == null){ return; } - stack.set(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData(contents, stack.getCount(), inventorySlot)); + stack.set(DataComponentRegistry.POTION_LAUNCHER, new PotionLauncherData(contents, inventorySlot)); } } From 713889a638c018f2b2b8d5fe84c74368c7514592 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 14 Jul 2024 17:29:06 -0500 Subject: [PATCH 066/363] migrate flask recipe, reset recipes to datagen --- .../8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 | 4 ++ .../9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e | 8 +++- .../recipes/misc/novice_spell_book.json | 32 +++++++++++++ .../misc/reset_stable_warp_scroll.json | 32 +++++++++++++ .../recipes/misc/reset_warp_scroll.json | 32 +++++++++++++ .../recipe/fill_potion_flask_0.json} | 4 +- .../recipe/fill_potion_flask_1.json} | 4 +- .../recipe/fill_potion_flask_2.json} | 4 +- .../ars_nouveau/recipe/novice_spell_book.json | 4 +- .../recipe/reset_stable_warp_scroll.json | 4 +- .../ars_nouveau/recipe/reset_warp_scroll.json | 4 +- .../arsnouveau/common/block/PotionJar.java | 7 ++- .../crafting/recipes/PotionFlaskRecipe.java | 12 ++++- .../arsnouveau/common/datagen/ModDatagen.java | 1 + .../common/datagen/OneOffRecipesProvider.java | 47 +++++++++++++++++++ .../common/datagen/RecipeDatagen.java | 8 +++- .../carbuncle/StarbyTransportBehavior.java | 7 +-- .../arsnouveau/common/util/ItemUtil.java | 15 ++++++ 18 files changed, 212 insertions(+), 17 deletions(-) create mode 100644 src/generated/resources/.cache/8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 create mode 100644 src/generated/resources/data/ars_nouveau/advancement/recipes/misc/novice_spell_book.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/recipes/misc/reset_stable_warp_scroll.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/recipes/misc/reset_warp_scroll.json rename src/{main/resources/data/ars_nouveau/recipe/potion_flask_fill.json => generated/resources/data/ars_nouveau/recipe/fill_potion_flask_0.json} (70%) rename src/{main/resources/data/ars_nouveau/recipe/potion_flask_et_fill.json => generated/resources/data/ars_nouveau/recipe/fill_potion_flask_1.json} (69%) rename src/{main/resources/data/ars_nouveau/recipe/potion_flask_amp_fill.json => generated/resources/data/ars_nouveau/recipe/fill_potion_flask_2.json} (69%) rename src/{main => generated}/resources/data/ars_nouveau/recipe/novice_spell_book.json (80%) rename src/{main => generated}/resources/data/ars_nouveau/recipe/reset_stable_warp_scroll.json (64%) rename src/{main => generated}/resources/data/ars_nouveau/recipe/reset_warp_scroll.json (65%) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/datagen/OneOffRecipesProvider.java diff --git a/src/generated/resources/.cache/8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 b/src/generated/resources/.cache/8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 new file mode 100644 index 0000000000..f32f62f738 --- /dev/null +++ b/src/generated/resources/.cache/8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 @@ -0,0 +1,4 @@ +// 1.21 2024-07-14T17:19:34.2527169 Grab bag Datagen +09fbe1cf323f738d045cfc231fc12a311ab62325 data/ars_nouveau/recipe/fill_potion_flask_0.json +d025f6ba019ba625c109a69e2ca55ae5665222aa data/ars_nouveau/recipe/fill_potion_flask_1.json +edfa9b51fb03808e57d280092c71f8cb95cd4518 data/ars_nouveau/recipe/fill_potion_flask_2.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index 82c075211d..047eebbf27 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,4 +1,4 @@ -// 1.21 2024-07-05T22:41:47.5546454 Recipes +// 1.21 2024-07-14T16:49:32.7547917 Recipes a76e5d9eef406841f56740535ec2afdd509de507 data/ars_nouveau/advancement/recipes/building_blocks/archwood_button.json 443515bb80018fbe37a128cb6849f5e818be315d data/ars_nouveau/advancement/recipes/building_blocks/archwood_door.json 4dfc3afae271aae8423d20dedb67dc601ff71fa0 data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence.json @@ -167,6 +167,7 @@ f6f9ce0e87bc1e86a77a14e0d733955e615c5b31 data/ars_nouveau/advancement/recipes/mi ebc4ca30ff3290926a30485b72ab6c4a7a288bbf data/ars_nouveau/advancement/recipes/misc/moonfall_2.json 1b554c4e460b09ab8dfa3fbe86d54d25deb34f39 data/ars_nouveau/advancement/recipes/misc/mundane_belt.json fcbdea7a47c81d7b81d78dc923da2b6e8f053c62 data/ars_nouveau/advancement/recipes/misc/mycelial_sourcelink.json +c991770cb9c5b745fda1da97825a5a146ff4547b data/ars_nouveau/advancement/recipes/misc/novice_spell_book.json 8b0d8a29fda79d30b45a74888be2a59e6a78f6f4 data/ars_nouveau/advancement/recipes/misc/orange_sbed.json 4359acbc033050e0ed9799a3bfd98b885b3a9cf5 data/ars_nouveau/advancement/recipes/misc/platform_to_pedestal.json 0e66cca3efe59a05c6bdabe7b4402b6eeabb95a4 data/ars_nouveau/advancement/recipes/misc/polished_sconce.json @@ -180,6 +181,8 @@ bb32cde2de07df7f88b2ebc92986f1d4b3c14679 data/ars_nouveau/advancement/recipes/mi 69f6e2bab56586ac49f320eeb09ba6d0c60c8ad3 data/ars_nouveau/advancement/recipes/misc/red_sbed.json f230680eb5c4b413a6dab4982a27632136878308 data/ars_nouveau/advancement/recipes/misc/relay.json 96008186e68872c56e524c819bdd1d8b6a98657c data/ars_nouveau/advancement/recipes/misc/repository.json +f1fd2db5b3d12da41f0453b5473b8009b1451d1e data/ars_nouveau/advancement/recipes/misc/reset_stable_warp_scroll.json +d6646d684d97610b9de0796456f8ccc8785fb86d data/ars_nouveau/advancement/recipes/misc/reset_warp_scroll.json 6e07b1ac1089cb77c8d52e4b7eb51f382077bfa0 data/ars_nouveau/advancement/recipes/misc/ring_of_potential.json 93d0f7b6a18a85830f2bdd9bc18e6f25de6fbb23 data/ars_nouveau/advancement/recipes/misc/ritual_animal_summon.json 516c48e6f05c4a8863569d4b5d5d5cd237eef50f data/ars_nouveau/advancement/recipes/misc/ritual_awakening.json @@ -369,6 +372,7 @@ e1884cca124df55bf412d95549f86800492deaac data/ars_nouveau/recipe/mob_jar.json 60f6f54acffb0880bac374b48177fd9bd1dd4106 data/ars_nouveau/recipe/moonfall_2.json d14d1bcf99c787e770333aca4cf115074615676a data/ars_nouveau/recipe/mundane_belt.json 4ad6635b57eec4221ff24ef683d4286578c9c180 data/ars_nouveau/recipe/mycelial_sourcelink.json +b95a26ec7ca85f4b6c2d897f08188bcbce4aadf1 data/ars_nouveau/recipe/novice_spell_book.json ca12f5dca463bbf0aca09c46b8efe2f6446c90ce data/ars_nouveau/recipe/orange_sbed.json 598c51209c60374d958b0a81afe37462dad45081 data/ars_nouveau/recipe/platform_to_pedestal.json 27e2e8438ba3dfdff05440abd1f751c50f0be420 data/ars_nouveau/recipe/polished_sconce.json @@ -382,6 +386,8 @@ aebabb5b244a14c33336386f60c98912fd05e099 data/ars_nouveau/recipe/redstone_relay. 8ff451fad137ccc8a670fb3d335299810ea8eea0 data/ars_nouveau/recipe/red_sbed.json 9c9b067f9aa4bdcdf9766f4f959a638799a04e06 data/ars_nouveau/recipe/relay.json 6cb8d39204d624ee51b5f0d5450833632a0ac194 data/ars_nouveau/recipe/repository.json +d69b689c9d3d9beacb19470d85ae0563d16eaf21 data/ars_nouveau/recipe/reset_stable_warp_scroll.json +e4fa6ed6a2cb95d4d609eb9f63342b4ff0cbaad9 data/ars_nouveau/recipe/reset_warp_scroll.json 9a850855f9eeddb1e20cde0399bd93d10ff42638 data/ars_nouveau/recipe/ring_of_potential.json 8a46330ef6197232cc0e87155b9834eb57f56620 data/ars_nouveau/recipe/ritual_animal_summon.json b7e8f61b9faf2b00693d209870838f790c6ea3d4 data/ars_nouveau/recipe/ritual_awakening.json diff --git a/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/novice_spell_book.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/novice_spell_book.json new file mode 100644 index 0000000000..fc7ea039da --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/novice_spell_book.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_journal": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ars_nouveau:novice_spell_book" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_journal" + ] + ], + "rewards": { + "recipes": [ + "ars_nouveau:novice_spell_book" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/reset_stable_warp_scroll.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/reset_stable_warp_scroll.json new file mode 100644 index 0000000000..7277f85f13 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/reset_stable_warp_scroll.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_journal": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ars_nouveau:reset_stable_warp_scroll" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_journal" + ] + ], + "rewards": { + "recipes": [ + "ars_nouveau:reset_stable_warp_scroll" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/reset_warp_scroll.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/reset_warp_scroll.json new file mode 100644 index 0000000000..1e996a6c28 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/reset_warp_scroll.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_journal": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ars_nouveau:reset_warp_scroll" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_journal" + ] + ], + "rewards": { + "recipes": [ + "ars_nouveau:reset_warp_scroll" + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/ars_nouveau/recipe/potion_flask_fill.json b/src/generated/resources/data/ars_nouveau/recipe/fill_potion_flask_0.json similarity index 70% rename from src/main/resources/data/ars_nouveau/recipe/potion_flask_fill.json rename to src/generated/resources/data/ars_nouveau/recipe/fill_potion_flask_0.json index c74c1d1574..273007b683 100644 --- a/src/main/resources/data/ars_nouveau/recipe/potion_flask_fill.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fill_potion_flask_0.json @@ -1,5 +1,6 @@ { "type": "ars_nouveau:potion_flask", + "category": "misc", "ingredients": [ { "item": "ars_nouveau:potion_flask" @@ -9,6 +10,7 @@ } ], "result": { - "item": "ars_nouveau:potion_flask" + "count": 1, + "id": "ars_nouveau:potion_flask" } } \ No newline at end of file diff --git a/src/main/resources/data/ars_nouveau/recipe/potion_flask_et_fill.json b/src/generated/resources/data/ars_nouveau/recipe/fill_potion_flask_1.json similarity index 69% rename from src/main/resources/data/ars_nouveau/recipe/potion_flask_et_fill.json rename to src/generated/resources/data/ars_nouveau/recipe/fill_potion_flask_1.json index 06eecb406c..97c9334314 100644 --- a/src/main/resources/data/ars_nouveau/recipe/potion_flask_et_fill.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fill_potion_flask_1.json @@ -1,5 +1,6 @@ { "type": "ars_nouveau:potion_flask", + "category": "misc", "ingredients": [ { "item": "ars_nouveau:potion_flask_extend_time" @@ -9,6 +10,7 @@ } ], "result": { - "item": "ars_nouveau:potion_flask_extend_time" + "count": 1, + "id": "ars_nouveau:potion_flask_extend_time" } } \ No newline at end of file diff --git a/src/main/resources/data/ars_nouveau/recipe/potion_flask_amp_fill.json b/src/generated/resources/data/ars_nouveau/recipe/fill_potion_flask_2.json similarity index 69% rename from src/main/resources/data/ars_nouveau/recipe/potion_flask_amp_fill.json rename to src/generated/resources/data/ars_nouveau/recipe/fill_potion_flask_2.json index fb0cb27b06..b69a7bb556 100644 --- a/src/main/resources/data/ars_nouveau/recipe/potion_flask_amp_fill.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fill_potion_flask_2.json @@ -1,5 +1,6 @@ { "type": "ars_nouveau:potion_flask", + "category": "misc", "ingredients": [ { "item": "ars_nouveau:potion_flask_amplify" @@ -9,6 +10,7 @@ } ], "result": { - "item": "ars_nouveau:potion_flask_amplify" + "count": 1, + "id": "ars_nouveau:potion_flask_amplify" } } \ No newline at end of file diff --git a/src/main/resources/data/ars_nouveau/recipe/novice_spell_book.json b/src/generated/resources/data/ars_nouveau/recipe/novice_spell_book.json similarity index 80% rename from src/main/resources/data/ars_nouveau/recipe/novice_spell_book.json rename to src/generated/resources/data/ars_nouveau/recipe/novice_spell_book.json index d61340ba08..f09fe8946c 100644 --- a/src/main/resources/data/ars_nouveau/recipe/novice_spell_book.json +++ b/src/generated/resources/data/ars_nouveau/recipe/novice_spell_book.json @@ -1,5 +1,6 @@ { "type": "minecraft:crafting_shapeless", + "category": "misc", "ingredients": [ { "item": "minecraft:book" @@ -18,6 +19,7 @@ } ], "result": { - "item": "ars_nouveau:novice_spell_book" + "count": 1, + "id": "ars_nouveau:novice_spell_book" } } \ No newline at end of file diff --git a/src/main/resources/data/ars_nouveau/recipe/reset_stable_warp_scroll.json b/src/generated/resources/data/ars_nouveau/recipe/reset_stable_warp_scroll.json similarity index 64% rename from src/main/resources/data/ars_nouveau/recipe/reset_stable_warp_scroll.json rename to src/generated/resources/data/ars_nouveau/recipe/reset_stable_warp_scroll.json index 5ad876b508..987942f2a8 100644 --- a/src/main/resources/data/ars_nouveau/recipe/reset_stable_warp_scroll.json +++ b/src/generated/resources/data/ars_nouveau/recipe/reset_stable_warp_scroll.json @@ -1,11 +1,13 @@ { "type": "minecraft:crafting_shapeless", + "category": "misc", "ingredients": [ { "item": "ars_nouveau:stable_warp_scroll" } ], "result": { - "item": "ars_nouveau:stable_warp_scroll" + "count": 1, + "id": "ars_nouveau:stable_warp_scroll" } } \ No newline at end of file diff --git a/src/main/resources/data/ars_nouveau/recipe/reset_warp_scroll.json b/src/generated/resources/data/ars_nouveau/recipe/reset_warp_scroll.json similarity index 65% rename from src/main/resources/data/ars_nouveau/recipe/reset_warp_scroll.json rename to src/generated/resources/data/ars_nouveau/recipe/reset_warp_scroll.json index db12a09e05..79674231f8 100644 --- a/src/main/resources/data/ars_nouveau/recipe/reset_warp_scroll.json +++ b/src/generated/resources/data/ars_nouveau/recipe/reset_warp_scroll.json @@ -1,11 +1,13 @@ { "type": "minecraft:crafting_shapeless", + "category": "misc", "ingredients": [ { "item": "ars_nouveau:warp_scroll" } ], "result": { - "item": "ars_nouveau:warp_scroll" + "count": 1, + "id": "ars_nouveau:warp_scroll" } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java index 09d16bde12..9af2f5398d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.common.block; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; +import com.hollingsworth.arsnouveau.common.util.ItemUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -89,16 +90,14 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level ItemStack potionStack = new ItemStack(Items.POTION); PotionContents contents = tile.getData(); potionStack.set(DataComponents.POTION_CONTENTS, new PotionContents(contents.potion(), contents.customColor(), contents.customEffects())); - if(player.addItem(potionStack)) { - player.getItemInHand(handIn).shrink(1); + if(ItemUtil.shrinkHandAndAddStack(potionStack, handIn, player)){ tile.remove(100); } }else if(stack.getItem() == Items.ARROW && tile.getAmount() >= 10){ ItemStack potionStack = new ItemStack(Items.TIPPED_ARROW); PotionContents contents = tile.getData(); potionStack.set(DataComponents.POTION_CONTENTS, new PotionContents(contents.potion(), contents.customColor(), contents.customEffects())); - if(player.addItem(potionStack)) { - player.getItemInHand(handIn).shrink(1); + if(ItemUtil.shrinkHandAndAddStack(potionStack, handIn, player)) { tile.remove(10); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java index 04a341dfd0..70ea5d848a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/PotionFlaskRecipe.java @@ -14,11 +14,19 @@ import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.crafting.*; +import java.util.List; + public class PotionFlaskRecipe extends ShapelessRecipe { - public PotionFlaskRecipe(String groupIn, CraftingBookCategory category, ItemStack recipeOutputIn, NonNullList recipeItemsIn) { - super(groupIn, CraftingBookCategory.MISC, recipeOutputIn, recipeItemsIn); + + public PotionFlaskRecipe(String groupIn, ItemStack result, ItemStack recipeOutputIn) { + super(groupIn, CraftingBookCategory.MISC, recipeOutputIn, NonNullList.copyOf(List.of(Ingredient.of(result), Ingredient.of(Items.POTION)))); } + public PotionFlaskRecipe(String pGroup, CraftingBookCategory pCategory, ItemStack pResult, NonNullList pIngredients) { + super(pGroup, pCategory, pResult, pIngredients); + } + + @Override public ItemStack assemble(final CraftingInput inv, HolderLookup.Provider p_266797_) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java index 83160efe7d..6301e0519d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java @@ -47,6 +47,7 @@ public static void datagen(GatherDataEvent event) { event.getGenerator().addProvider(event.includeServer(), new SummonRitualProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new BuddingConversionProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new ScryRitualProvider(event.getGenerator())); + event.getGenerator().addProvider(event.includeServer(), new OneOffRecipesProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new DispelEntityProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new StructureTagProvider(output, provider, fileHelper)); event.getGenerator().addProvider(event.includeClient(), new AtlasProvider(output, provider, fileHelper)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/OneOffRecipesProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/OneOffRecipesProvider.java new file mode 100644 index 0000000000..c071568ed3 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/OneOffRecipesProvider.java @@ -0,0 +1,47 @@ +package com.hollingsworth.arsnouveau.common.datagen; + + +import com.hollingsworth.arsnouveau.common.crafting.recipes.PotionFlaskRecipe; +import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import com.mojang.serialization.JsonOps; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataGenerator; +import net.minecraft.world.item.Item; + +import java.nio.file.Path; + +public class OneOffRecipesProvider extends SimpleDataProvider{ + + public OneOffRecipesProvider(DataGenerator generatorIn) { + super(generatorIn); + } + + @Override + public void collectJsons(CachedOutput pOutput) { + var flasks = new Item[]{ + ItemsRegistry.POTION_FLASK.get(), + ItemsRegistry.POTION_FLASK_EXTEND_TIME.get(), + ItemsRegistry.POTION_FLASK_AMPLIFY.get() + }; + + for(int i = 0; i < flasks.length; i++){ + var flaskRecipe = new PotionFlaskRecipe("", flasks[i].getDefaultInstance(), flasks[i].getDefaultInstance()); + saveStable(pOutput, PotionFlaskRecipe.CODEC.encodeStart(JsonOps.INSTANCE, flaskRecipe).getOrThrow(), getRecipePath(output, "fill_potion_flask_" + i)); + } + } + + + + protected static Path getRecipePath(Path path, String id) { + return path.resolve("data/ars_nouveau/recipe/" + id + ".json"); + } + + /** + * Gets a name for this provider, to use in logging. + */ + @Override + public String getName() { + return "Grab bag Datagen"; + } + +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java index 7e9f44d855..ef461d0ce1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java @@ -13,7 +13,6 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.PackOutput; import net.minecraft.data.recipes.*; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.ItemLike; @@ -44,6 +43,13 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { this.consumer = pRecipeOutput; Block SOURCESTONE = BlockRegistry.getBlock(LibBlockNames.SOURCESTONE); + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ItemsRegistry.NOVICE_SPELLBOOK).unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) + .requires(Items.BOOK).requires(Items.IRON_SHOVEL).requires(Items.IRON_PICKAXE).requires(Items.IRON_AXE).requires(Items.IRON_SWORD).save(consumer); + + shapelessBuilder(ItemsRegistry.STABLE_WARP_SCROLL).requires(ItemsRegistry.STABLE_WARP_SCROLL).save(consumer, ArsNouveau.prefix("reset_stable_warp_scroll")); + + shapelessBuilder(ItemsRegistry.WARP_SCROLL).requires(ItemsRegistry.WARP_SCROLL).save(consumer, ArsNouveau.prefix("reset_warp_scroll")); + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ItemsRegistry.WORN_NOTEBOOK).unlockedBy("has_journal", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)) .requires(Ingredient.of(Tags.Items.GEMS_LAPIS), 1) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java index 3a8314c982..9c2aeb4164 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyTransportBehavior.java @@ -44,13 +44,14 @@ public class StarbyTransportBehavior extends StarbyListBehavior { public static final ResourceLocation TRANSPORT_ID = ArsNouveau.prefix( "starby_transport"); - public ItemStack itemScroll; + public ItemStack itemScroll = ItemStack.EMPTY; public SimpleStateMachine stateMachine; public int berryBackoff; public int findItemBackoff; public int takeItemBackoff; + public StarbyTransportBehavior(Starbuncle entity, CompoundTag tag) { super(entity, tag); stateMachine = new SimpleStateMachine<>(new DecideStarbyActionState(starbuncle, this)); @@ -272,7 +273,7 @@ public void onWanded(Player playerEntity) { @Override public CompoundTag toTag(CompoundTag tag) { super.toTag(tag); - if (itemScroll != null) { + if (!itemScroll.isEmpty()) { tag.put("itemScroll", itemScroll.save(level.registryAccess())); } return tag; @@ -283,7 +284,7 @@ public void getTooltip(Consumer tooltip) { super.getTooltip(tooltip); tooltip.accept(Component.translatable("ars_nouveau.starbuncle.storing", TO_LIST.size())); tooltip.accept(Component.translatable("ars_nouveau.starbuncle.taking", FROM_LIST.size())); - if (itemScroll != null && !itemScroll.isEmpty()) { + if (!itemScroll.isEmpty()) { tooltip.accept(Component.translatable("ars_nouveau.filtering_with", itemScroll.getHoverName().getString())); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/ItemUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/ItemUtil.java index 8850e40e12..465a093174 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/ItemUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/ItemUtil.java @@ -1,6 +1,8 @@ package com.hollingsworth.arsnouveau.common.util; +import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; public class ItemUtil { @@ -11,4 +13,17 @@ public static boolean canStack(ItemStack a, ItemStack b) { return ItemEntity.areMergable(singleA, singleB); } + public static boolean shrinkHandAndAddStack(ItemStack stack, InteractionHand hand, Player player){ + ItemStack heldStack = player.getItemInHand(hand); + if(heldStack.isEmpty() || heldStack.getCount() == 1){ + player.setItemInHand(hand, stack); + return true; + } + if(player.inventory.add(stack)){ + heldStack.shrink(1); + return true; + } + return false; + } + } From 2ab26278c03c08b95054115ccc2ef85d8807ca9a Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 14 Jul 2024 18:51:01 -0500 Subject: [PATCH 067/363] migrate book upgrades to datagen --- build.gradle | 2 +- .../8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 | 4 +- .../recipe/apprentice_book_upgrade.json | 37 +++++++++++++++ .../recipe/archmage_book_upgrade.json} | 20 ++++---- .../common/datagen/OneOffRecipesProvider.java | 36 ++++++++++++++ .../recipe/apprentice_spell_book_upgrade.json | 47 ------------------- 6 files changed, 88 insertions(+), 58 deletions(-) create mode 100644 src/generated/resources/data/ars_nouveau/recipe/apprentice_book_upgrade.json rename src/{main/resources/data/ars_nouveau/recipe/archmage_spell_book_upgrade.json => generated/resources/data/ars_nouveau/recipe/archmage_book_upgrade.json} (61%) delete mode 100644 src/main/resources/data/ars_nouveau/recipe/apprentice_spell_book_upgrade.json diff --git a/build.gradle b/build.gradle index 70cd41e3c2..a1c88e9df3 100644 --- a/build.gradle +++ b/build.gradle @@ -112,7 +112,7 @@ dependencies { compileOnly "com.illusivesoulworks.caelus:caelus-neoforge:${caelus_version}:api" compileOnly "mezz.jei:jei-1.21-neoforge-api:${jei_version}" -// localRuntime "mezz.jei:jei-1.21-neoforge:${jei_version}" + implementation "mezz.jei:jei-1.21-neoforge:${jei_version}" implementation 'com.github.glitchfiend:TerraBlender-neoforge:1.21-4.0.0.0' implementation "curse.maven:jade-324717:5444008" implementation 'top.theillusivec4.curios:curios-neoforge:9.0.4+1.21' diff --git a/src/generated/resources/.cache/8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 b/src/generated/resources/.cache/8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 index f32f62f738..f33caecc93 100644 --- a/src/generated/resources/.cache/8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 +++ b/src/generated/resources/.cache/8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 @@ -1,4 +1,6 @@ -// 1.21 2024-07-14T17:19:34.2527169 Grab bag Datagen +// 1.21 2024-07-14T18:50:50.8010562 Grab bag Datagen +9f12aa688a076e34ed4b457c7fe492205a824d83 data/ars_nouveau/recipe/apprentice_book_upgrade.json +98ef162dd5449b8a1e3b5f9a98cf46852e4d2da3 data/ars_nouveau/recipe/archmage_book_upgrade.json 09fbe1cf323f738d045cfc231fc12a311ab62325 data/ars_nouveau/recipe/fill_potion_flask_0.json d025f6ba019ba625c109a69e2ca55ae5665222aa data/ars_nouveau/recipe/fill_potion_flask_1.json edfa9b51fb03808e57d280092c71f8cb95cd4518 data/ars_nouveau/recipe/fill_potion_flask_2.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/apprentice_book_upgrade.json b/src/generated/resources/data/ars_nouveau/recipe/apprentice_book_upgrade.json new file mode 100644 index 0000000000..e4bbec2af4 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/apprentice_book_upgrade.json @@ -0,0 +1,37 @@ +{ + "type": "ars_nouveau:book_upgrade", + "category": "misc", + "ingredients": [ + { + "item": "ars_nouveau:novice_spell_book" + }, + { + "tag": "c:obsidians" + }, + { + "tag": "c:gems/diamond" + }, + { + "tag": "c:gems/diamond" + }, + { + "tag": "c:gems/diamond" + }, + { + "item": "minecraft:quartz_block" + }, + { + "item": "minecraft:quartz_block" + }, + { + "tag": "c:rods/blaze" + }, + { + "tag": "c:rods/blaze" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:apprentice_spell_book" + } +} \ No newline at end of file diff --git a/src/main/resources/data/ars_nouveau/recipe/archmage_spell_book_upgrade.json b/src/generated/resources/data/ars_nouveau/recipe/archmage_book_upgrade.json similarity index 61% rename from src/main/resources/data/ars_nouveau/recipe/archmage_spell_book_upgrade.json rename to src/generated/resources/data/ars_nouveau/recipe/archmage_book_upgrade.json index 21781c3674..5aeda71993 100644 --- a/src/main/resources/data/ars_nouveau/recipe/archmage_spell_book_upgrade.json +++ b/src/generated/resources/data/ars_nouveau/recipe/archmage_book_upgrade.json @@ -1,35 +1,37 @@ { "type": "ars_nouveau:book_upgrade", + "category": "misc", "ingredients": [ { "item": "ars_nouveau:apprentice_spell_book" }, { - "item": "minecraft:nether_star" + "tag": "c:ender_pearls" }, { - "item": "ars_nouveau:wilden_tribute" + "tag": "c:ender_pearls" }, { - "item": "minecraft:emerald" + "tag": "c:ender_pearls" }, { - "item": "minecraft:emerald" + "tag": "c:gems/emerald" }, { - "item": "minecraft:ender_pearl" + "tag": "c:gems/emerald" }, { - "item": "minecraft:ender_pearl" + "item": "minecraft:totem_of_undying" }, { - "item": "minecraft:ender_pearl" + "item": "minecraft:nether_star" }, { - "item": "minecraft:totem_of_undying" + "item": "ars_nouveau:wilden_tribute" } ], "result": { - "item": "ars_nouveau:archmage_spell_book" + "count": 1, + "id": "ars_nouveau:archmage_spell_book" } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/OneOffRecipesProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/OneOffRecipesProvider.java index c071568ed3..22b474edf7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/OneOffRecipesProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/OneOffRecipesProvider.java @@ -1,14 +1,21 @@ package com.hollingsworth.arsnouveau.common.datagen; +import com.hollingsworth.arsnouveau.common.crafting.recipes.BookUpgradeRecipe; import com.hollingsworth.arsnouveau.common.crafting.recipes.PotionFlaskRecipe; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.mojang.serialization.JsonOps; +import net.minecraft.core.NonNullList; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.Ingredient; +import net.neoforged.neoforge.common.Tags; import java.nio.file.Path; +import java.util.List; public class OneOffRecipesProvider extends SimpleDataProvider{ @@ -28,6 +35,35 @@ public void collectJsons(CachedOutput pOutput) { var flaskRecipe = new PotionFlaskRecipe("", flasks[i].getDefaultInstance(), flasks[i].getDefaultInstance()); saveStable(pOutput, PotionFlaskRecipe.CODEC.encodeStart(JsonOps.INSTANCE, flaskRecipe).getOrThrow(), getRecipePath(output, "fill_potion_flask_" + i)); } + + BookUpgradeRecipe apprentice = new BookUpgradeRecipe("", CraftingBookCategory.MISC, ItemsRegistry.APPRENTICE_SPELLBOOK.get().getDefaultInstance(), + NonNullList.copyOf(List.of( + Ingredient.of(ItemsRegistry.NOVICE_SPELLBOOK.get().getDefaultInstance()), + Ingredient.of(Tags.Items.OBSIDIANS), + Ingredient.of(Tags.Items.GEMS_DIAMOND), + Ingredient.of(Tags.Items.GEMS_DIAMOND), + Ingredient.of(Tags.Items.GEMS_DIAMOND), + Ingredient.of(Items.QUARTZ_BLOCK), + Ingredient.of(Items.QUARTZ_BLOCK), + Ingredient.of(Tags.Items.RODS_BLAZE), + Ingredient.of(Tags.Items.RODS_BLAZE) + ))); + + BookUpgradeRecipe archmage = new BookUpgradeRecipe("", CraftingBookCategory.MISC, ItemsRegistry.ARCHMAGE_SPELLBOOK.get().getDefaultInstance(), + NonNullList.copyOf(List.of( + Ingredient.of(ItemsRegistry.APPRENTICE_SPELLBOOK.get().getDefaultInstance()), + Ingredient.of(Tags.Items.ENDER_PEARLS), + Ingredient.of(Tags.Items.ENDER_PEARLS), + Ingredient.of(Tags.Items.ENDER_PEARLS), + Ingredient.of(Tags.Items.GEMS_EMERALD), + Ingredient.of(Tags.Items.GEMS_EMERALD), + Ingredient.of(Items.TOTEM_OF_UNDYING), + Ingredient.of(Items.NETHER_STAR), + Ingredient.of(ItemsRegistry.WILDEN_TRIBUTE) + ))); + saveStable(pOutput, BookUpgradeRecipe.CODEC.encodeStart(JsonOps.INSTANCE, apprentice).getOrThrow(), getRecipePath(output, "apprentice_book_upgrade")); + + saveStable(pOutput, BookUpgradeRecipe.CODEC.encodeStart(JsonOps.INSTANCE, archmage).getOrThrow(), getRecipePath(output, "archmage_book_upgrade")); } diff --git a/src/main/resources/data/ars_nouveau/recipe/apprentice_spell_book_upgrade.json b/src/main/resources/data/ars_nouveau/recipe/apprentice_spell_book_upgrade.json deleted file mode 100644 index acafba773f..0000000000 --- a/src/main/resources/data/ars_nouveau/recipe/apprentice_spell_book_upgrade.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "type": "ars_nouveau:book_upgrade", - "pattern": - [ - " ", - " y ", - " " - ], - "key": { - "y": { - "item": "ars_nouveau:spell_book" - } - }, - "ingredients": [ - { - "item": "ars_nouveau:novice_spell_book" - }, - { - "item": "minecraft:obsidian" - }, - { - "item": "minecraft:diamond" - }, - { - "item": "minecraft:diamond" - }, - { - "item": "minecraft:diamond" - }, - { - "item": "minecraft:quartz_block" - }, - { - "item": "minecraft:quartz_block" - }, - { - "item": "minecraft:blaze_rod" - }, - { - "item": "minecraft:blaze_rod" - } - ], - "result": - { - "item": "ars_nouveau:apprentice_spell_book" - } -} \ No newline at end of file From 87a8f202cb0deb9c8ce3d5eb6ecc95d7485ff250 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 14 Jul 2024 19:12:53 -0500 Subject: [PATCH 068/363] fix tomes, migrate alex tome to datagen --- .../cdae075e2d4d58384fe4d2075f6d5323fe5baa69 | 9 +++++---- .../ars_nouveau/recipe/tomes/alex_tome.json | 16 ++++++++-------- .../recipe/tomes/aurellia_tome.json | 7 +------ .../recipe/tomes/darkfira_tome.json | 7 +------ .../recipe/tomes/poseidon_tome.json | 7 +------ .../api/registry/SpellSoundRegistry.java | 10 ++++++++-- .../arsnouveau/api/sound/SpellSound.java | 19 ++++++++++--------- .../client/gui/book/SoundScreen.java | 2 +- .../crafting/recipes/CasterTomeData.java | 3 +-- .../common/datagen/CasterTomeProvider.java | 6 +++--- .../setup/registry/SoundRegistry.java | 10 +++++----- 11 files changed, 44 insertions(+), 52 deletions(-) rename src/{main => generated}/resources/data/ars_nouveau/recipe/tomes/alex_tome.json (75%) diff --git a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 index 7f315e6185..a315128aed 100644 --- a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 +++ b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 @@ -1,9 +1,10 @@ -// 1.21 2024-07-14T12:08:42.8984246 Ars Nouveau Caster Tomes Datagen +// 1.21 2024-07-14T19:09:57.1955072 Ars Nouveau Caster Tomes Datagen +ab9cf50e4958592dcee6f5dae6d6bad2e7fe08ab data/ars_nouveau/recipe/tomes/alex_tome.json dae41a867bde9258624fe4676128e8140f2e7fe4 data/ars_nouveau/recipe/tomes/arachne_tome.json -991d75b27429c69fdce017dc2c7d033872f1daa1 data/ars_nouveau/recipe/tomes/aurellia_tome.json +71e004bfa5837d293c6ee00dd9fd99493b9b9aba data/ars_nouveau/recipe/tomes/aurellia_tome.json 2027d79f560de6a1a7829a478f64ccd8f1723bc2 data/ars_nouveau/recipe/tomes/bailey_tome.json 0be05276a18b4cac328dc05898e560b28f7e3a31 data/ars_nouveau/recipe/tomes/chems_tome.json -0d097b7148d90a64199a8de9fcd4f5cbe5cecb03 data/ars_nouveau/recipe/tomes/darkfira_tome.json +e9b37b1592c51345f27cd0571a12a373a469be73 data/ars_nouveau/recipe/tomes/darkfira_tome.json 3c4d9ad61832042e38046f7763047126dbc320a0 data/ars_nouveau/recipe/tomes/farfalla_tome.json f64772fb96f68b7865f64ee40a8718e1a2412fce data/ars_nouveau/recipe/tomes/fireball_tome.json 47410afb03915eaf6626f6cbfb872b647c9ea826 data/ars_nouveau/recipe/tomes/glow_tome.json @@ -12,7 +13,7 @@ fa2eefd9631a78bf8c31e4c9aad34a2517bb9736 data/ars_nouveau/recipe/tomes/ivy_tome. 488adf82fa89d69891e333e9bb94290f8ff6b6b1 data/ars_nouveau/recipe/tomes/kirin_tome.json 9836505724bc647ab6d1f92f212ad618456c878c data/ars_nouveau/recipe/tomes/lyrellion_tome.json d7ff05ccece42ac8ee440c7ef0d707e7c3f7e78b data/ars_nouveau/recipe/tomes/othy_tome.json -97e4c0165cd35d15736134d56c20453ef919f312 data/ars_nouveau/recipe/tomes/poseidon_tome.json +b7b6cc3145b830c0e936f67d3aec459142c85a2c data/ars_nouveau/recipe/tomes/poseidon_tome.json 2a0f47cc40a8be0d2cd08db1a457463b10ed3cf9 data/ars_nouveau/recipe/tomes/renew_rune_tome.json f50e62b11676774b3822a8cbd7acf1b0efe8df85 data/ars_nouveau/recipe/tomes/shadow_tome.json a2701c983e0c938a26238d7707a1342cfb74d209 data/ars_nouveau/recipe/tomes/silvanus_tome.json diff --git a/src/main/resources/data/ars_nouveau/recipe/tomes/alex_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/alex_tome.json similarity index 75% rename from src/main/resources/data/ars_nouveau/recipe/tomes/alex_tome.json rename to src/generated/resources/data/ars_nouveau/recipe/tomes/alex_tome.json index a7855bdede..c22637050e 100644 --- a/src/main/resources/data/ars_nouveau/recipe/tomes/alex_tome.json +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/alex_tome.json @@ -1,21 +1,21 @@ { "type": "ars_nouveau:caster_tome", "color": { - "type": "ars_nouveau:rainbow", - "blue": 214, - "green": 255, - "red": 1 + "b": 0, + "g": 0, + "id": "ars_nouveau:rainbow", + "r": 255 }, "flavour_text": "For those who can't settle with just a tiny hut.", "name": "Alex's Magnificent Mansion", "sound": { - "family": "ars_nouveau:tempestry_family", - "pitch": 1.0, - "volume": 1.0 + "sound": { + "id": "ars_nouveau:tempestry_family" + } }, "spell": [ "ars_nouveau:glyph_self", - "ars_nouveau:burst", + "ars_nouveau:glyph_burst", "ars_nouveau:glyph_sensitive", "ars_nouveau:glyph_dampen", "ars_nouveau:glyph_aoe", diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/aurellia_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/aurellia_tome.json index 5215629fc7..7ed0bdf9f9 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/tomes/aurellia_tome.json +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/aurellia_tome.json @@ -10,12 +10,7 @@ "name": "Aurellia's Bite Storm", "sound": { "sound": { - "soundEvent": { - "sound_id": "ars_nouveau:tempestry_family" - }, - "soundName": { - "translate": "ars_nouveau.sound.tempestry_family" - } + "id": "ars_nouveau:tempestry_family" } }, "spell": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/darkfira_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/darkfira_tome.json index d885f0c57b..6ad27c292b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/tomes/darkfira_tome.json +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/darkfira_tome.json @@ -11,12 +11,7 @@ "sound": { "pitch": 1.9, "sound": { - "soundEvent": { - "sound_id": "ars_nouveau:tempestry_family" - }, - "soundName": { - "translate": "ars_nouveau.sound.tempestry_family" - } + "id": "ars_nouveau:tempestry_family" }, "volume": 1.69 }, diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/poseidon_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/poseidon_tome.json index 645a685891..a15e817a04 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/tomes/poseidon_tome.json +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/poseidon_tome.json @@ -10,12 +10,7 @@ "name": "Poseidon's Refuge", "sound": { "sound": { - "soundEvent": { - "sound_id": "ars_nouveau:tempestry_family" - }, - "soundName": { - "translate": "ars_nouveau.sound.tempestry_family" - } + "id": "ars_nouveau:tempestry_family" } }, "spell": [ diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellSoundRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellSoundRegistry.java index 4fb5476a19..7ffdbffd5d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellSoundRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellSoundRegistry.java @@ -3,16 +3,22 @@ import com.hollingsworth.arsnouveau.api.sound.SpellSound; import net.minecraft.resources.ResourceLocation; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; public class SpellSoundRegistry { private static ConcurrentHashMap spellSoundsRegistry = new ConcurrentHashMap<>(); - public static ConcurrentHashMap getSpellSoundsRegistry() { - return spellSoundsRegistry; + + public static List getSpellSounds() { + return List.copyOf(spellSoundsRegistry.values()); } public static SpellSound registerSpellSound(SpellSound sound) { return spellSoundsRegistry.put(sound.getId(), sound); } + + public static SpellSound get(ResourceLocation loc) { + return spellSoundsRegistry.get(loc); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java b/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java index fc883d058f..11e6a384a9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java @@ -6,7 +6,6 @@ import net.minecraft.core.Holder; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; @@ -16,27 +15,29 @@ public class SpellSound { public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - SoundEvent.CODEC.fieldOf("soundEvent").forGetter(s -> s.soundEvent), - ComponentSerialization.CODEC.fieldOf("soundName").forGetter(s -> s.soundName) - ).apply(instance, SpellSound::new)); + ResourceLocation.CODEC.fieldOf("id").forGetter(SpellSound::getId) + ).apply(instance, SpellSoundRegistry::get)); - public static StreamCodec STREAM = StreamCodec.of( - (buf, val) -> buf.writeResourceLocation(val.getId()), - buf -> SpellSoundRegistry.getSpellSoundsRegistry().get(buf.readResourceLocation()) + public static StreamCodec STREAM = StreamCodec.composite( + ResourceLocation.STREAM_CODEC, + SpellSound::getId, + SpellSoundRegistry::get ); private Holder soundEvent; private Component soundName; + private ResourceLocation id; - public SpellSound(Holder soundEvent, Component soundName) { + public SpellSound(Holder soundEvent, Component soundName, ResourceLocation id) { this.soundEvent = soundEvent; this.soundName = soundName; + this.id = id; } public ResourceLocation getId() { - return soundEvent.unwrapKey().get().location(); + return id; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java index 27e8c3c35d..7525a02749 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/SoundScreen.java @@ -76,7 +76,7 @@ public void addPresets() { int adjustedRowsPlaced = 0; int yStart = bookTop + 22; int adjustedXPlaced = 0; - List sounds = SpellSoundRegistry.getSpellSoundsRegistry().values().stream().toList(); + List sounds = SpellSoundRegistry.getSpellSounds(); for (int i = 0; i < sounds.size(); i++) { SpellSound part = sounds.get(i); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java index d6ee8e5cba..3784ecb98e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/CasterTomeData.java @@ -48,9 +48,8 @@ public CasterTomeData(String name, public static ItemStack makeTome(Item tome, String name, Spell spell, String flavorText) { ItemStack stack = tome.getDefaultInstance(); AbstractCaster spellCaster = SpellCasterRegistry.from(stack); - spellCaster.setSpell(spell); stack.set(DataComponents.CUSTOM_NAME, Component.literal(name).setStyle(Style.EMPTY.withColor(ChatFormatting.DARK_PURPLE).withItalic(true))); - spellCaster.setFlavorText(flavorText); + spellCaster.setSpell(spell).setFlavorText(flavorText).saveToStack(stack); return stack; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java index 0ab998c388..9b852f369a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; +import com.hollingsworth.arsnouveau.client.particle.RainbowParticleColor; import com.hollingsworth.arsnouveau.common.crafting.recipes.CasterTomeData; import com.hollingsworth.arsnouveau.common.spell.augment.*; import com.hollingsworth.arsnouveau.common.spell.effect.*; @@ -182,7 +183,6 @@ public void collectJsons(CachedOutput pOutput) { "The bite from this storm is worse than its bark.", new ParticleColor(255, 119, 203))); - /* Moved to non-datagen to not screw GitHub tomes.add(buildTome("alex", "Alex's Magnificent Mansion", new Spell(MethodSelf.INSTANCE) .add(EffectBurst.INSTANCE) .add(AugmentSensitive.INSTANCE) @@ -193,9 +193,9 @@ public void collectJsons(CachedOutput pOutput) { .add(AugmentPierce.INSTANCE) .withSound(new ConfiguredSpellSound(SoundRegistry.TEMPESTRY_SPELL_SOUND)), "For those who can't settle with just a tiny hut.", - new RainbowParticleColor(255, 255, 255, 10)) + new RainbowParticleColor(255, 255, 255)) ); - */ + tomes.add(buildTome("poseidon", "Poseidon's Refuge", new Spell(MethodProjectile.INSTANCE) .add(AugmentSensitive.INSTANCE) diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java index 1240ee6373..35ac077fcf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java @@ -34,11 +34,11 @@ public class SoundRegistry { public static DeferredHolder SOUND_OF_GLASS = SOUND_REG.register("thistle_the_sound_of_glass", () -> makeSound("thistle_the_sound_of_glass")); - public static SpellSound DEFAULT_SPELL_SOUND = new SpellSound(SoundRegistry.DEFAULT_FAMILY, Component.translatable("ars_nouveau.sound.default_family")); - public static SpellSound EMPTY_SPELL_SOUND = new SpellSound(SoundRegistry.EMPTY_SOUND_FAMILY, Component.translatable("ars_nouveau.sound.empty")); - public static SpellSound GAIA_SPELL_SOUND = new SpellSound(SoundRegistry.GAIA_FAMILY, Component.translatable("ars_nouveau.sound.gaia_family")); - public static SpellSound TEMPESTRY_SPELL_SOUND = new SpellSound(SoundRegistry.TEMPESTRY_FAMILY, Component.translatable("ars_nouveau.sound.tempestry_family")); - public static SpellSound FIRE_SPELL_SOUND = new SpellSound(SoundRegistry.FIRE_FAMILY, Component.translatable("ars_nouveau.sound.fire_family")); + public static SpellSound DEFAULT_SPELL_SOUND = new SpellSound(SoundRegistry.DEFAULT_FAMILY, Component.translatable("ars_nouveau.sound.default_family"), ArsNouveau.prefix(DEFAULT_SOUND_LIB)); + public static SpellSound EMPTY_SPELL_SOUND = new SpellSound(SoundRegistry.EMPTY_SOUND_FAMILY, Component.translatable("ars_nouveau.sound.empty"), ArsNouveau.prefix(NO_SOUND_LIB)); + public static SpellSound GAIA_SPELL_SOUND = new SpellSound(SoundRegistry.GAIA_FAMILY, Component.translatable("ars_nouveau.sound.gaia_family"), ArsNouveau.prefix(GAIA_SOUND_LIB)); + public static SpellSound TEMPESTRY_SPELL_SOUND = new SpellSound(SoundRegistry.TEMPESTRY_FAMILY, Component.translatable("ars_nouveau.sound.tempestry_family"), ArsNouveau.prefix(TEMPESTRY_SOUND_LIB)); + public static SpellSound FIRE_SPELL_SOUND = new SpellSound(SoundRegistry.FIRE_FAMILY, Component.translatable("ars_nouveau.sound.fire_family"), ArsNouveau.prefix(FIRE_SOUND_LIB)); static SoundEvent makeSound(String name) { return SoundEvent.createVariableRangeEvent(ArsNouveau.prefix( name)); From 5a849df119161a4f551c4b6857a330c5c545334d Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 14 Jul 2024 20:52:24 -0500 Subject: [PATCH 069/363] fix source jar data on item --- .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 4 +- .../loot_table/blocks/source_jar.json | 15 +--- .../api/source/AbstractSourceMachine.java | 16 ++++ .../common/block/tile/ScribesTile.java | 2 +- .../common/datagen/DefaultTableProvider.java | 9 +-- .../animations/scribes_table_animations.json | 74 +++++++++++++------ 6 files changed, 77 insertions(+), 43 deletions(-) diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d index 9512ce107b..580835ecb2 100644 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -1,4 +1,4 @@ -// 1.21 2024-07-11T09:06:55.9670549 Loot Tables +// 1.21 2024-07-14T19:21:35.339459 Loot Tables 4f70eae621815da8d08d3ea0b9fd479b48bad2d3 data/ars_nouveau/loot_table/blocks/agronomic_sourcelink.json 8a6d60f2b39de0408c7e4537b53e866a04236d22 data/ars_nouveau/loot_table/blocks/alchemical_sourcelink.json 8bdff8a0a49a9f3f21a822eb1d1d01a950d6ad1a data/ars_nouveau/loot_table/blocks/alteration_table.json @@ -146,7 +146,7 @@ f17397c3a6f7c57a5086773c548d6ca152d0739f data/ars_nouveau/loot_table/blocks/sour ecf0726adda255df3ff434ce3c33c041b04ece5f data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks_stairs.json e92ecb490985aae22297d2f5cd5bcb5e625671b7 data/ars_nouveau/loot_table/blocks/sourcestone_stairs.json 5708d7c438d48789ab5d0f00a115bdebe340215b data/ars_nouveau/loot_table/blocks/source_gem_block.json -ffc0c8a426bf2b1cd56d2c4cd909a7289cd902f4 data/ars_nouveau/loot_table/blocks/source_jar.json +d39e96455d731e5e4785fa923a056261b69d39ec data/ars_nouveau/loot_table/blocks/source_jar.json 7cfca21047bb21713aaeec12060826e87c6cd4de data/ars_nouveau/loot_table/blocks/spell_prism.json 401055b950ac66d34a96e29f1666fd3c59244c0f data/ars_nouveau/loot_table/blocks/spell_sensor.json 2e038e8112b147e2a4d00e4a1d707541c89c421c data/ars_nouveau/loot_table/blocks/spell_turret.json diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/source_jar.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/source_jar.json index cc0aa1d0e4..fae5b286f0 100644 --- a/src/generated/resources/data/ars_nouveau/loot_table/blocks/source_jar.json +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/source_jar.json @@ -12,18 +12,9 @@ "source": "block_entity" }, { - "function": "minecraft:copy_custom_data", - "ops": [ - { - "op": "replace", - "source": "inv", - "target": "BlockEntityTag.inv" - }, - { - "op": "replace", - "source": "source", - "target": "BlockEntityTag.source" - } + "function": "minecraft:copy_components", + "include": [ + "ars_nouveau:block_fill_contents" ], "source": "block_entity" } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java b/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java index e2f0fd2731..ca25740c97 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java @@ -3,8 +3,11 @@ import com.hollingsworth.arsnouveau.api.util.IWololoable; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.block.tile.ModdedTile; +import com.hollingsworth.arsnouveau.common.items.data.BlockFillContents; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponentMap; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -131,5 +134,18 @@ public ParticleColor getColor() { public void setColor(ParticleColor color) { this.color = color; } + + @Override + protected void applyImplicitComponents(DataComponentInput pComponentInput) { + super.applyImplicitComponents(pComponentInput); + var fill = pComponentInput.getOrDefault(DataComponentRegistry.BLOCK_FILL_CONTENTS, new BlockFillContents(0)); + this.source = fill.amount(); + } + + @Override + protected void collectImplicitComponents(DataComponentMap.Builder pComponents) { + super.collectImplicitComponents(pComponents); + pComponents.set(DataComponentRegistry.BLOCK_FILL_CONTENTS, new BlockFillContents(this.source)); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java index 30c840cfe3..24ae9d109f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java @@ -306,7 +306,7 @@ public void startAnimation(int arg) { return; } controller.forceAnimationReset(); - controller.setAnimation(RawAnimation.begin().thenPlay("create_glyph")); + controller.setAnimation(RawAnimation.begin().thenPlay("create_glyph2")); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java index cbd0e646fc..8f7423332d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java @@ -37,10 +37,7 @@ import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.ValidationContext; import net.minecraft.world.level.storage.loot.entries.LootItem; -import net.minecraft.world.level.storage.loot.functions.CopyCustomDataFunction; -import net.minecraft.world.level.storage.loot.functions.CopyNameFunction; -import net.minecraft.world.level.storage.loot.functions.EnchantedCountIncreaseFunction; -import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; +import net.minecraft.world.level.storage.loot.functions.*; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition; import net.minecraft.world.level.storage.loot.providers.nbt.ContextNbtProvider; @@ -259,9 +256,7 @@ public LootTable.Builder createManaManchineTable(Block block) { .setRolls(ConstantValue.exactly(1)) .add(LootItem.lootTableItem(block) .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) - .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) - .copy("inv", "BlockEntityTag.inv", CopyCustomDataFunction.MergeStrategy.REPLACE) //addOperation - .copy("source", "BlockEntityTag.source", CopyCustomDataFunction.MergeStrategy.REPLACE)) + .apply(CopyComponentsFunction.copyComponents(CopyComponentsFunction.Source.BLOCK_ENTITY).include(DataComponentRegistry.BLOCK_FILL_CONTENTS.get())) ); return LootTable.lootTable().withPool(builder); } diff --git a/src/main/resources/assets/ars_nouveau/animations/scribes_table_animations.json b/src/main/resources/assets/ars_nouveau/animations/scribes_table_animations.json index f40b12cbcd..b1501def83 100644 --- a/src/main/resources/assets/ars_nouveau/animations/scribes_table_animations.json +++ b/src/main/resources/assets/ars_nouveau/animations/scribes_table_animations.json @@ -1,8 +1,9 @@ { "format_version": "1.8.0", "animations": { - "create_glyph": { - "animation_length": 5.54167, + "create_glyph2": { + "loop": "hold_on_last_frame", + "animation_length": 6, "bones": { "quill": { "rotation": { @@ -15,22 +16,31 @@ "1.5833": { "vector": [0, 0, 0] }, - "3.1667": { + "3.0417": { "vector": [21.19748, -334.76902, 42.29628], "easing": "easeInOutSine" }, - "3.375": { - "vector": [11.2, -334.77, 42.3] + "3.2083": { + "vector": [-3.8, -334.77, 42.3] }, - "3.5833": { + "3.5": { "vector": [44.69727, -329.36252, 36.413] }, - "3.7917": { + "3.7083": { "vector": [27.42091, -340.63038, 49.78379] }, - "4.0": { + "3.9167": { "vector": [34.02249, -333.34799, 39.32521] }, + "4.0417": { + "vector": [6.52249, -333.34799, 39.32521] + }, + "4.125": { + "vector": [44.83898, -308.59464, 52.96324] + }, + "4.2083": { + "vector": [20.71136, -304.43681, 37.26108] + }, "4.3333": { "vector": [0, -334.76902, 0], "easing": "easeInOutSine" @@ -41,40 +51,57 @@ }, "position": { "0.0": { - "vector": ["math.lerp(0, -20, (query.anim_time)*0.75) + 12- math.cos(query.anim_time*200) - 10", "math.lerp(0, math.lerp(12, 6, query.anim_time * 0.75), query.anim_time * 0.75)", "math.lerp(0, -11, query.anim_time*0.75) + 8 * math.sin(query.anim_time*200)"] + "vector": [ + "-11+math.lerp(0, -20, (query.anim_time)*0.75) + 12- math.cos(query.anim_time*200)", + "math.lerp(math.lerp(0, 12, query.anim_time*0.75), math.lerp(12, 6, query.anim_time*0.75), query.anim_time*0.75)", + "math.lerp(0, -11, (query.anim_time)*0.75) + 8 * math.sin(query.anim_time*200)" + ] }, "1.3333": { "vector": [-20, 4, -11] }, + "1.5417": { + "vector": [-20, 6, -11], + "easing": "easeInOutSine" + }, "1.6667": { "vector": [-20, 2, -11], - "easing": "easeInSine" + "easing": "linear" }, "1.7083": { - "vector": ["math.lerp(-20, -7, (query.anim_time-1.7083)*0.75)", "2+math.lerp(math.lerp(0, 20, (query.anim_time-1.7083)*0.75), math.lerp(20,0,(query.anim_time-1.7083)*0.75), (query.anim_time-1.7083)*0.75)", "math.lerp(-11, -7, (query.anim_time-1.7083)*0.75)"] + "vector": [ + "math.lerp(-20, -7, query.anim_time-1.7083)", + "math.lerp(math.lerp(2, 20, query.anim_time-1.7083), math.lerp(20, -1, query.anim_time-1.7083), query.anim_time-1.7083)", + "math.lerp(-11, -7, query.anim_time-1.7083)" + ] }, - "3.1667": { + "3.0417": { "vector": [-7, -1, -7], "easing": "easeOutSine" }, - "3.375": { + "3.2083": { "vector": [-10.69552, -1, -8.53073] }, - "3.5833": { + "3.5": { "vector": [-4.54643, -1, -9.2309] }, - "3.7917": { + "3.7083": { "vector": [-10.6994, -1, -9.12342] }, - "4.0": { + "3.9167": { "vector": [-7.00029, -1, -4.24299] }, - "4.3333": { - "vector": [-7, -1, -7], - "easing": "easeOutSine" + "4.0417": { + "vector": [-11.61969, -1, -6.15641] + }, + "4.125": { + "vector": [-7.00029, -1, -4.24299] }, - "4.375": { - "vector": ["math.lerp(-7, 0, (query.anim_time - 4.375) * 0.75)", "2 + math.lerp(math.lerp(0, 20, (query.anim_time - 4.375)*0.75), math.lerp(20, 0, (query.anim_time - 4.375) * 0.75), (query.anim_time - 4.375) * 0.75)", "math.lerp(-7, 0, (query.anim_time - 4.375) * 0.75)"] + "4.2083": { + "vector": [-7.85851, -1, -10.01044] + }, + "4.3333": { + "vector": ["math.cos(query.anim_time*150) -7.8585", "0.5*math.cos(query.anim_time*150) -1", "math.cos(query.anim_time*150) -10.0104"] }, "5.5417": { "vector": [0, 0, 0], @@ -116,6 +143,11 @@ } } } + }, + "sound_effects": { + "0.0": { + "effect": "scribing_desk_take_4" + } } } }, From 8fdab952d393ba080ebfc39fd07c1b72e44e69ab Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 15 Jul 2024 09:15:31 -0500 Subject: [PATCH 070/363] fix potion jar drop table --- .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 4 +- .../loot_table/blocks/potion_jar.json | 30 ++----------- .../client/registry/ClientHandler.java | 12 +++--- .../arsnouveau/common/block/PotionJar.java | 23 +++++----- .../common/block/tile/PotionJarTile.java | 18 ++++++++ .../common/datagen/DefaultTableProvider.java | 7 +--- .../common/items/data/PotionJarData.java | 42 +++++++++++++++++++ .../setup/registry/DataComponentRegistry.java | 2 + 8 files changed, 86 insertions(+), 52 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionJarData.java diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d index 580835ecb2..05906a7086 100644 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -1,4 +1,4 @@ -// 1.21 2024-07-14T19:21:35.339459 Loot Tables +// 1.21 2024-07-15T08:49:19.3032836 Loot Tables 4f70eae621815da8d08d3ea0b9fd479b48bad2d3 data/ars_nouveau/loot_table/blocks/agronomic_sourcelink.json 8a6d60f2b39de0408c7e4537b53e866a04236d22 data/ars_nouveau/loot_table/blocks/alchemical_sourcelink.json 8bdff8a0a49a9f3f21a822eb1d1d01a950d6ad1a data/ars_nouveau/loot_table/blocks/alteration_table.json @@ -61,7 +61,7 @@ df5ba05995044413998b7cbbf02d6c7a63e7c583 data/ars_nouveau/loot_table/blocks/item 6bf8bd330d83e260cd4fcf8311560fd37399f016 data/ars_nouveau/loot_table/blocks/orange_sbed.json b6f8c60f021cc50669d4a4f75056334922fdd5b1 data/ars_nouveau/loot_table/blocks/polished_sconce.json a3b768d587399b35b7b094b7bce9f70e9033ef44 data/ars_nouveau/loot_table/blocks/potion_diffuser.json -490aa4411864ad19dcb8dfc09bc32df3313cbe6b data/ars_nouveau/loot_table/blocks/potion_jar.json +bb3ffccb3f8ae3f0fa476304f82ded4f62a14cfd data/ars_nouveau/loot_table/blocks/potion_jar.json 8653cbc9f5368a9767156cf5842781623f1c76ed data/ars_nouveau/loot_table/blocks/potion_melder.json 2983589b24f1fa835eae3c40877e0728eb9a5981 data/ars_nouveau/loot_table/blocks/potted_blue_archwood_sapling.json 040c5c292dd024010db00c1433781b44351f52a4 data/ars_nouveau/loot_table/blocks/potted_green_archwood_sapling.json diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/potion_jar.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potion_jar.json index 3f25256e9e..c030964c7c 100644 --- a/src/generated/resources/data/ars_nouveau/loot_table/blocks/potion_jar.json +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/potion_jar.json @@ -12,33 +12,9 @@ "source": "block_entity" }, { - "function": "minecraft:copy_custom_data", - "ops": [ - { - "op": "replace", - "source": "potionData", - "target": "BlockEntityTag.potionData" - }, - { - "op": "replace", - "source": "currentFill", - "target": "BlockEntityTag.currentFill" - }, - { - "op": "replace", - "source": "locked", - "target": "BlockEntityTag.locked" - }, - { - "op": "replace", - "source": "potionNames", - "target": "potionNames" - }, - { - "op": "replace", - "source": "currentFill", - "target": "fill" - } + "function": "minecraft:copy_components", + "include": [ + "ars_nouveau:potion_jar" ], "source": "block_entity" } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index 1bdc4f97e9..727e07cc8f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -19,13 +19,11 @@ import com.hollingsworth.arsnouveau.common.block.tile.PotionMelderTile; import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; import com.hollingsworth.arsnouveau.common.items.data.BlockFillContents; +import com.hollingsworth.arsnouveau.common.items.data.PotionJarData; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; import com.hollingsworth.arsnouveau.common.util.CameraUtil; import com.hollingsworth.arsnouveau.common.util.PotionUtil; -import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; -import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; -import com.hollingsworth.arsnouveau.setup.registry.MenuRegistry; -import com.hollingsworth.arsnouveau.setup.registry.ModEntities; +import com.hollingsworth.arsnouveau.setup.registry.*; import net.minecraft.client.Minecraft; import net.minecraft.client.Options; import net.minecraft.client.gui.Font; @@ -214,7 +212,7 @@ public float unclampedCall(ItemStack pStack, @Nullable ClientLevel pLevel, @Null } }); ItemProperties.register(BlockRegistry.POTION_JAR.asItem(), ArsNouveau.prefix("amount"), (stack, level, entity, seed) -> { - int amount = BlockFillContents.get(stack); + int amount = stack.getOrDefault(DataComponentRegistry.POTION_JAR, new PotionJarData(0, PotionContents.EMPTY, false)).fill(); return amount / 10000.0f; }); ItemProperties.register(BlockRegistry.SOURCE_JAR.asItem(), ArsNouveau.prefix("source"), (stack, level, entity, seed) -> { @@ -315,11 +313,11 @@ public static void initItemColors(final RegisterColorHandlersEvent.Item event) { }, ItemsRegistry.SPELL_PARCHMENT); event.register((stack, color) -> { - var contents = PotionProviderRegistry.from(stack); + var contents = stack.get(DataComponentRegistry.POTION_JAR); if (contents == null) { return -1; } - return contents.getPotionData(stack).getColor(); + return contents.contents().getColor(); }, BlockRegistry.POTION_JAR); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java index 9af2f5398d..983412a948 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionJar.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.common.util.ItemUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.component.DataComponents; @@ -122,16 +123,18 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { @Override public void appendHoverText(ItemStack stack, Item.TooltipContext pContext, List tooltip, TooltipFlag pTooltipFlag) { - //todo: restore potion jar item tooltip -// if (stack.getTag() == null) -// return; -// int fill = stack.getTag().getCompound("BlockEntityTag").getInt("currentFill"); -// tooltip.add(Component.literal((fill * 100) / 10000 + "% full")); -// CompoundTag blockTag = stack.getTag().getCompound("BlockEntityTag"); -// if(blockTag.contains("potionData")){ -// PotionData data = PotionData.fromTag(blockTag.getCompound("potionData")); -// data.appendHoverText(tooltip); -// } + var potion = stack.get(DataComponentRegistry.POTION_JAR); + if(potion == null) + return; + var fill = potion.fill(); + var data = potion.contents(); + if(!data.equals(PotionContents.EMPTY)) { + ItemStack potionItem = new ItemStack(Items.POTION); + potionItem.set(DataComponents.POTION_CONTENTS, data); + tooltip.add(Component.translatable(potionItem.getDescriptionId())); + } + PotionContents.addPotionTooltip(data.getAllEffects(), tooltip::add, 1.0F, 20.0f); + tooltip.add(Component.translatable("ars_nouveau.source_jar.fullness", (fill * 100) / 10000)); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java index 2b7eb2c0f3..eadd0f0c1d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java @@ -3,11 +3,14 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.api.item.IWandable; import com.hollingsworth.arsnouveau.common.block.SourceJar; +import com.hollingsworth.arsnouveau.common.items.data.PotionJarData; import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.hollingsworth.arsnouveau.common.util.PotionUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponentMap; import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -152,5 +155,20 @@ public int getMaxFill() { public int getAmount() { return currentFill; } + + @Override + protected void applyImplicitComponents(DataComponentInput pComponentInput) { + super.applyImplicitComponents(pComponentInput); + var jarContents = pComponentInput.getOrDefault(DataComponentRegistry.POTION_JAR, new PotionJarData(0, PotionContents.EMPTY, false)); + this.currentFill = jarContents.fill(); + this.data = jarContents.contents(); + this.isLocked = jarContents.locked(); + } + + @Override + protected void collectImplicitComponents(DataComponentMap.Builder pComponents) { + super.collectImplicitComponents(pComponents); + pComponents.set(DataComponentRegistry.POTION_JAR, new PotionJarData(this.currentFill, this.data, this.isLocked)); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java index 8f7423332d..722c6dbd52 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java @@ -186,12 +186,7 @@ protected void generate() { .setRolls(ConstantValue.exactly(1)) .add(LootItem.lootTableItem(BlockRegistry.POTION_JAR) .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) - .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) - .copy("potionData", "BlockEntityTag.potionData", CopyCustomDataFunction.MergeStrategy.REPLACE) - .copy("currentFill", "BlockEntityTag.currentFill", CopyCustomDataFunction.MergeStrategy.REPLACE) - .copy("locked", "BlockEntityTag.locked", CopyCustomDataFunction.MergeStrategy.REPLACE) - .copy("potionNames", "potionNames", CopyCustomDataFunction.MergeStrategy.REPLACE) - .copy("currentFill", "fill", CopyCustomDataFunction.MergeStrategy.REPLACE)) + .apply(CopyComponentsFunction.copyComponents(CopyComponentsFunction.Source.BLOCK_ENTITY).include(DataComponentRegistry.POTION_JAR.get())) ); add(BlockRegistry.POTION_JAR.get(), LootTable.lootTable().withPool(potionJarBuilder)); add(BlockRegistry.BASTION_POD.get(), LootTable.lootTable().withPool(POD_BUILDER(BlockRegistry.BASTION_POD.asItem(), BlockRegistry.BASTION_POD.get()))); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionJarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionJarData.java new file mode 100644 index 0000000000..4da193284f --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PotionJarData.java @@ -0,0 +1,42 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.alchemy.PotionContents; + +import java.util.Objects; + +public record PotionJarData(int fill, PotionContents contents, boolean locked) { + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.INT.fieldOf("fill").forGetter(PotionJarData::fill), + PotionContents.CODEC.fieldOf("contents").forGetter(PotionJarData::contents), + Codec.BOOL.fieldOf("locked").forGetter(PotionJarData::locked) + ).apply(instance, PotionJarData::new)); + + public static final StreamCodec STREAM = StreamCodec.composite( + ByteBufCodecs.INT, + PotionJarData::fill, + PotionContents.STREAM_CODEC, + PotionJarData::contents, + ByteBufCodecs.BOOL, + PotionJarData::locked, + PotionJarData::new + ); + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PotionJarData that = (PotionJarData) o; + return fill == that.fill && locked == that.locked && Objects.equals(contents, that.contents); + } + + @Override + public int hashCode() { + return Objects.hash(fill, contents, locked); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java index bbc60b2c0d..5a3cd27ad1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java @@ -50,4 +50,6 @@ public class DataComponentRegistry { public static final DeferredHolder, DataComponentType> TOME_CASTER = DATA.register("tome_caster", () -> DataComponentType.builder().persistent(TomeCasterData.CODEC.codec()).networkSynchronized(TomeCasterData.STREAM_CODEC).build()); public static final DeferredHolder, DataComponentType> REACTIVE_CASTER = DATA.register("reactive_caster", () -> DataComponentType.builder().persistent(ReactiveCasterData.CODEC.codec()).networkSynchronized(ReactiveCasterData.STREAM_CODEC).build()); + + public static final DeferredHolder, DataComponentType> POTION_JAR = DATA.register("potion_jar", () -> DataComponentType.builder().persistent(PotionJarData.CODEC).networkSynchronized(PotionJarData.STREAM).build()); } From 5ec54bdcf22f6c1714c84239bb5859477ef9e52e Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 15 Jul 2024 22:32:36 -0500 Subject: [PATCH 071/363] fix mob jar drop table, curios tags and slots --- .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 4 +-- .../loot_table/blocks/mob_jar.json | 15 ++------- .../hollingsworth/arsnouveau/ArsNouveau.java | 6 ---- .../arsnouveau/common/block/MobJar.java | 2 +- .../common/block/tile/MobJarTile.java | 18 +++++++++++ .../common/datagen/DefaultTableProvider.java | 10 +++--- .../common/items/data/ContainmentJarData.java | 32 +++++++++++++++++++ .../common/items/data/MobJarData.java | 17 ++++++---- .../arsnouveau/setup/ModSetup.java | 10 ------ .../setup/registry/DataComponentRegistry.java | 4 ++- .../ars_nouveau/curios/entities/player.json | 4 +++ .../ars_nouveau/curios/slots/an_focus.json | 6 ++++ .../data/ars_nouveau/curios/slots/belt.json | 3 ++ .../data/ars_nouveau/curios/slots/head.json | 3 ++ .../ars_nouveau/curios/slots/necklace.json | 3 ++ .../data/ars_nouveau/curios/slots/ring.json | 3 ++ .../curios/tags/{items => item}/an_focus.json | 0 .../curios/tags/{items => item}/belt.json | 0 .../curios/tags/{items => item}/charm.json | 0 .../curios/tags/{items => item}/curio.json | 0 .../curios/tags/{items => item}/head.json | 0 .../curios/tags/{items => item}/necklace.json | 0 .../curios/tags/{items => item}/ring.json | 0 23 files changed, 97 insertions(+), 43 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/ContainmentJarData.java create mode 100644 src/main/resources/data/ars_nouveau/curios/entities/player.json create mode 100644 src/main/resources/data/ars_nouveau/curios/slots/an_focus.json create mode 100644 src/main/resources/data/ars_nouveau/curios/slots/belt.json create mode 100644 src/main/resources/data/ars_nouveau/curios/slots/head.json create mode 100644 src/main/resources/data/ars_nouveau/curios/slots/necklace.json create mode 100644 src/main/resources/data/ars_nouveau/curios/slots/ring.json rename src/main/resources/data/curios/tags/{items => item}/an_focus.json (100%) rename src/main/resources/data/curios/tags/{items => item}/belt.json (100%) rename src/main/resources/data/curios/tags/{items => item}/charm.json (100%) rename src/main/resources/data/curios/tags/{items => item}/curio.json (100%) rename src/main/resources/data/curios/tags/{items => item}/head.json (100%) rename src/main/resources/data/curios/tags/{items => item}/necklace.json (100%) rename src/main/resources/data/curios/tags/{items => item}/ring.json (100%) diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d index 05906a7086..789895cf7a 100644 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -1,4 +1,4 @@ -// 1.21 2024-07-15T08:49:19.3032836 Loot Tables +// 1.21 2024-07-15T09:45:11.2617252 Loot Tables 4f70eae621815da8d08d3ea0b9fd479b48bad2d3 data/ars_nouveau/loot_table/blocks/agronomic_sourcelink.json 8a6d60f2b39de0408c7e4537b53e866a04236d22 data/ars_nouveau/loot_table/blocks/alchemical_sourcelink.json 8bdff8a0a49a9f3f21a822eb1d1d01a950d6ad1a data/ars_nouveau/loot_table/blocks/alteration_table.json @@ -56,7 +56,7 @@ df5ba05995044413998b7cbbf02d6c7a63e7c583 data/ars_nouveau/loot_table/blocks/item 072841a4552421b48e60a01206d4b1f42dd90da5 data/ars_nouveau/loot_table/blocks/magelight_torch.json 9d551107c336c6341450da44650d007e795ae962 data/ars_nouveau/loot_table/blocks/mendosteen_pod.json 019635e76547e287688dc710b66e2f96d86ba011 data/ars_nouveau/loot_table/blocks/mirrorweave.json -092c90aaab488eb24e3de25645c3653c44cb5686 data/ars_nouveau/loot_table/blocks/mob_jar.json +2f78f083e1ee6ccd18496465ce740c8353faf834 data/ars_nouveau/loot_table/blocks/mob_jar.json 06f0d996eea4783dd302764820d1d0e87178cc04 data/ars_nouveau/loot_table/blocks/mycelial_sourcelink.json 6bf8bd330d83e260cd4fcf8311560fd37399f016 data/ars_nouveau/loot_table/blocks/orange_sbed.json b6f8c60f021cc50669d4a4f75056334922fdd5b1 data/ars_nouveau/loot_table/blocks/polished_sconce.json diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/mob_jar.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/mob_jar.json index 652052e259..4cda42b656 100644 --- a/src/generated/resources/data/ars_nouveau/loot_table/blocks/mob_jar.json +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/mob_jar.json @@ -12,18 +12,9 @@ "source": "block_entity" }, { - "function": "minecraft:copy_custom_data", - "ops": [ - { - "op": "replace", - "source": "entityTag", - "target": "BlockEntityTag.entityTag" - }, - { - "op": "replace", - "source": "entityId", - "target": "entityId" - } + "function": "minecraft:copy_components", + "include": [ + "ars_nouveau:mob_jar" ], "source": "block_entity" } diff --git a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java index cefe94f4b3..1c722a2f04 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java +++ b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java @@ -36,7 +36,6 @@ import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; -import net.neoforged.fml.event.lifecycle.InterModEnqueueEvent; import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.world.chunk.RegisterTicketControllersEvent; @@ -79,7 +78,6 @@ public ArsNouveau(IEventBus modEventBus, ModContainer modContainer){ modEventBus.addListener(this::setup); modEventBus.addListener(this::postModLoadEvent); modEventBus.addListener(this::clientSetup); - modEventBus.addListener(this::sendImc); modEventBus.addListener((RegisterTicketControllersEvent e) ->{ ticketController = new TicketController(ArsNouveau.prefix("ticket_controller")); e.register(ticketController); @@ -158,10 +156,6 @@ public void clientSetup(final FMLClientSetupEvent event) { } } - public void sendImc(InterModEnqueueEvent evt) { - ModSetup.sendIntercoms(); - } - public static ResourceLocation prefix(String str) { return ResourceLocation.fromNamespaceAndPath(MODID, str); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/MobJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/MobJar.java index 1e0e0cce19..16d8ac6bfe 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/MobJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/MobJar.java @@ -72,7 +72,7 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState pState, Level } if (tile.getEntity() == null && !pLevel.isClientSide) { if (stack.getItem() instanceof SpawnEggItem spawnEggItem) { - EntityType type = spawnEggItem.getType(null); + EntityType type = spawnEggItem.getType(stack); Entity entity = type.create(pLevel); if (entity != null) { tile.setEntityData(entity); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java index d8bb950603..5120cfccfc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java @@ -6,10 +6,13 @@ import com.hollingsworth.arsnouveau.api.registry.JarBehaviorRegistry; import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.block.MobJar; +import com.hollingsworth.arsnouveau.common.items.data.MobJarData; import com.hollingsworth.arsnouveau.common.lib.EntityTags; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponentMap; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.Connection; import net.minecraft.network.chat.Component; @@ -229,4 +232,19 @@ public void getTooltip(List tooltip) { }); } } + + + @Override + protected void applyImplicitComponents(DataComponentInput pComponentInput) { + super.applyImplicitComponents(pComponentInput); + var jar = pComponentInput.getOrDefault(DataComponentRegistry.MOB_JAR, new MobJarData(new CompoundTag(), new CompoundTag())); + this.entityTag = jar.entityTag(); + this.extraDataTag = jar.extraDataTag(); + } + + @Override + protected void collectImplicitComponents(DataComponentMap.Builder pComponents) { + super.collectImplicitComponents(pComponents); + pComponents.set(DataComponentRegistry.MOB_JAR, new MobJarData(this.entityTag, this.extraDataTag)); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java index 722c6dbd52..44d6d788a8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java @@ -37,10 +37,12 @@ import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.ValidationContext; import net.minecraft.world.level.storage.loot.entries.LootItem; -import net.minecraft.world.level.storage.loot.functions.*; +import net.minecraft.world.level.storage.loot.functions.CopyComponentsFunction; +import net.minecraft.world.level.storage.loot.functions.CopyNameFunction; +import net.minecraft.world.level.storage.loot.functions.EnchantedCountIncreaseFunction; +import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition; -import net.minecraft.world.level.storage.loot.providers.nbt.ContextNbtProvider; import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; @@ -198,9 +200,7 @@ protected void generate() { .setRolls(ConstantValue.exactly(1)) .add(LootItem.lootTableItem(BlockRegistry.MOB_JAR) .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) - .apply(CopyCustomDataFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) - .copy("entityTag", "BlockEntityTag.entityTag", CopyCustomDataFunction.MergeStrategy.REPLACE) - .copy("entityId", "entityId", CopyCustomDataFunction.MergeStrategy.REPLACE)) + .apply(CopyComponentsFunction.copyComponents(CopyComponentsFunction.Source.BLOCK_ENTITY).include(DataComponentRegistry.MOB_JAR.get())) ); add(BlockRegistry.MOB_JAR.get(), LootTable.lootTable().withPool(mobJarBuilder)); //CustomName diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ContainmentJarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ContainmentJarData.java new file mode 100644 index 0000000000..c21e0d9a3a --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ContainmentJarData.java @@ -0,0 +1,32 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; + +import java.util.Objects; + +public record ContainmentJarData(CompoundTag entityTag, CompoundTag extraDataTag){ + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + CompoundTag.CODEC.fieldOf("entityTag").forGetter(ContainmentJarData::entityTag), + CompoundTag.CODEC.fieldOf("extraDataTag").forGetter(ContainmentJarData::extraDataTag) + ).apply(instance, ContainmentJarData::new)); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite(ByteBufCodecs.COMPOUND_TAG, ContainmentJarData::entityTag, ByteBufCodecs.COMPOUND_TAG, ContainmentJarData::extraDataTag, ContainmentJarData::new); + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ContainmentJarData that = (ContainmentJarData) o; + return Objects.equals(entityTag, that.entityTag) && Objects.equals(extraDataTag, that.extraDataTag); + } + + @Override + public int hashCode() { + return Objects.hash(entityTag, extraDataTag); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MobJarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MobJarData.java index ebd87e0c74..76b3ca1823 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MobJarData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MobJarData.java @@ -1,28 +1,33 @@ package com.hollingsworth.arsnouveau.common.items.data; -import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import java.util.Objects; -public record MobJarData(CompoundTag entityTag) { +public record MobJarData(CompoundTag entityTag, CompoundTag extraDataTag){ + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + CompoundTag.CODEC.fieldOf("entity_tag").forGetter(MobJarData::entityTag), + CompoundTag.CODEC.fieldOf("extra_data_tag").forGetter(MobJarData::extraDataTag) + ).apply(instance, MobJarData::new)); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite(ByteBufCodecs.COMPOUND_TAG, MobJarData::entityTag, ByteBufCodecs.COMPOUND_TAG, MobJarData::extraDataTag, MobJarData::new); - public static final Codec CODEC = CompoundTag.CODEC.xmap(MobJarData::new, MobJarData::entityTag); - public static final StreamCodec STREAM = CheatSerializer.create(CODEC); @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; MobJarData that = (MobJarData) o; - return Objects.equals(entityTag, that.entityTag); + return Objects.equals(entityTag, that.entityTag) && Objects.equals(extraDataTag, that.extraDataTag); } @Override public int hashCode() { - return Objects.hashCode(entityTag); + return Objects.hash(entityTag, extraDataTag); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java index 4f3d3afb23..570e1bfb4a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java @@ -16,16 +16,6 @@ public class ModSetup { - public static void sendIntercoms() { -// TODO: readd curios -// InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.HEAD.getMessageBuilder().build()); -// InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.CHARM.getMessageBuilder().build()); -// InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.RING.getMessageBuilder().size(2).build()); -// InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.BELT.getMessageBuilder().build()); -// InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> new SlotTypeMessage.Builder("an_focus").size(1).icon(new ResourceLocation(Curios.MODID, "slot/empty_curio_slot")).build()); -// InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.NECKLACE.getMessageBuilder().build()); - } - public static final DeferredRegister> TRUNK_PLACER_TYPE_DEFERRED_REGISTER = DeferredRegister.create(Registries.TRUNK_PLACER_TYPE, MODID); public static DeferredHolder, TrunkPlacerType> MAGIC_TRUNK_PLACER = TRUNK_PLACER_TYPE_DEFERRED_REGISTER.register("magic_trunk_placer", () -> new TrunkPlacerType<>(MagicTrunkPlacer.CODEC)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java index 5a3cd27ad1..eb93e1fb98 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java @@ -45,11 +45,13 @@ public class DataComponentRegistry { public static final DeferredHolder, DataComponentType> BLOCK_FILL_CONTENTS = DATA.register("block_fill_contents", () -> DataComponentType.builder().persistent(BlockFillContents.CODEC).networkSynchronized(BlockFillContents.STREAM_CODEC).build()); - public static final DeferredHolder, DataComponentType> MOB_JAR = DATA.register("mob_jar", () -> DataComponentType.builder().persistent(MobJarData.CODEC).networkSynchronized(MobJarData.STREAM).build()); + public static final DeferredHolder, DataComponentType> MOB_JAR = DATA.register("mob_jar", () -> DataComponentType.builder().persistent(MobJarData.CODEC).networkSynchronized(MobJarData.STREAM_CODEC).build()); public static final DeferredHolder, DataComponentType> TOME_CASTER = DATA.register("tome_caster", () -> DataComponentType.builder().persistent(TomeCasterData.CODEC.codec()).networkSynchronized(TomeCasterData.STREAM_CODEC).build()); public static final DeferredHolder, DataComponentType> REACTIVE_CASTER = DATA.register("reactive_caster", () -> DataComponentType.builder().persistent(ReactiveCasterData.CODEC.codec()).networkSynchronized(ReactiveCasterData.STREAM_CODEC).build()); public static final DeferredHolder, DataComponentType> POTION_JAR = DATA.register("potion_jar", () -> DataComponentType.builder().persistent(PotionJarData.CODEC).networkSynchronized(PotionJarData.STREAM).build()); + + public static final DeferredHolder, DataComponentType> CONTAINMENT_JAR = DATA.register("containment_jar", () -> DataComponentType.builder().persistent(ContainmentJarData.CODEC).networkSynchronized(ContainmentJarData.STREAM_CODEC).build()); } diff --git a/src/main/resources/data/ars_nouveau/curios/entities/player.json b/src/main/resources/data/ars_nouveau/curios/entities/player.json new file mode 100644 index 0000000000..8544fd1d02 --- /dev/null +++ b/src/main/resources/data/ars_nouveau/curios/entities/player.json @@ -0,0 +1,4 @@ +{ + "entities": ["minecraft:player"], + "slots": ["head", "ring", "necklace", "an_focus"] +} \ No newline at end of file diff --git a/src/main/resources/data/ars_nouveau/curios/slots/an_focus.json b/src/main/resources/data/ars_nouveau/curios/slots/an_focus.json new file mode 100644 index 0000000000..283c97da31 --- /dev/null +++ b/src/main/resources/data/ars_nouveau/curios/slots/an_focus.json @@ -0,0 +1,6 @@ +{ + "order": 1, + "size": 1, + "icon": "curios:slot/empty_curio_slot", + "validators": ["curios:tag"] +} \ No newline at end of file diff --git a/src/main/resources/data/ars_nouveau/curios/slots/belt.json b/src/main/resources/data/ars_nouveau/curios/slots/belt.json new file mode 100644 index 0000000000..9c538eb5ff --- /dev/null +++ b/src/main/resources/data/ars_nouveau/curios/slots/belt.json @@ -0,0 +1,3 @@ +{ + "size": 1 +} \ No newline at end of file diff --git a/src/main/resources/data/ars_nouveau/curios/slots/head.json b/src/main/resources/data/ars_nouveau/curios/slots/head.json new file mode 100644 index 0000000000..9c538eb5ff --- /dev/null +++ b/src/main/resources/data/ars_nouveau/curios/slots/head.json @@ -0,0 +1,3 @@ +{ + "size": 1 +} \ No newline at end of file diff --git a/src/main/resources/data/ars_nouveau/curios/slots/necklace.json b/src/main/resources/data/ars_nouveau/curios/slots/necklace.json new file mode 100644 index 0000000000..9c538eb5ff --- /dev/null +++ b/src/main/resources/data/ars_nouveau/curios/slots/necklace.json @@ -0,0 +1,3 @@ +{ + "size": 1 +} \ No newline at end of file diff --git a/src/main/resources/data/ars_nouveau/curios/slots/ring.json b/src/main/resources/data/ars_nouveau/curios/slots/ring.json new file mode 100644 index 0000000000..d81c12e335 --- /dev/null +++ b/src/main/resources/data/ars_nouveau/curios/slots/ring.json @@ -0,0 +1,3 @@ +{ + "size": 2 +} \ No newline at end of file diff --git a/src/main/resources/data/curios/tags/items/an_focus.json b/src/main/resources/data/curios/tags/item/an_focus.json similarity index 100% rename from src/main/resources/data/curios/tags/items/an_focus.json rename to src/main/resources/data/curios/tags/item/an_focus.json diff --git a/src/main/resources/data/curios/tags/items/belt.json b/src/main/resources/data/curios/tags/item/belt.json similarity index 100% rename from src/main/resources/data/curios/tags/items/belt.json rename to src/main/resources/data/curios/tags/item/belt.json diff --git a/src/main/resources/data/curios/tags/items/charm.json b/src/main/resources/data/curios/tags/item/charm.json similarity index 100% rename from src/main/resources/data/curios/tags/items/charm.json rename to src/main/resources/data/curios/tags/item/charm.json diff --git a/src/main/resources/data/curios/tags/items/curio.json b/src/main/resources/data/curios/tags/item/curio.json similarity index 100% rename from src/main/resources/data/curios/tags/items/curio.json rename to src/main/resources/data/curios/tags/item/curio.json diff --git a/src/main/resources/data/curios/tags/items/head.json b/src/main/resources/data/curios/tags/item/head.json similarity index 100% rename from src/main/resources/data/curios/tags/items/head.json rename to src/main/resources/data/curios/tags/item/head.json diff --git a/src/main/resources/data/curios/tags/items/necklace.json b/src/main/resources/data/curios/tags/item/necklace.json similarity index 100% rename from src/main/resources/data/curios/tags/items/necklace.json rename to src/main/resources/data/curios/tags/item/necklace.json diff --git a/src/main/resources/data/curios/tags/items/ring.json b/src/main/resources/data/curios/tags/item/ring.json similarity index 100% rename from src/main/resources/data/curios/tags/items/ring.json rename to src/main/resources/data/curios/tags/item/ring.json From fe5681c0e2d9fa9db035f4f88ba11359b933d4ec Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 16 Jul 2024 08:58:52 -0500 Subject: [PATCH 072/363] fix curios check --- .../com/hollingsworth/arsnouveau/api/util/CuriosUtil.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/CuriosUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/CuriosUtil.java index 942407e3d3..0dc562e8b8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/CuriosUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/CuriosUtil.java @@ -3,16 +3,16 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; - import net.neoforged.neoforge.items.IItemHandlerModifiable; import org.jetbrains.annotations.NotNull; +import top.theillusivec4.curios.api.CuriosApi; import javax.annotation.Nullable; public class CuriosUtil { - // TODO: restore curios support + public static @Nullable IItemHandlerModifiable getAllWornItems(@NotNull LivingEntity living) { - return null;// CuriosApi.getCuriosHelper().getEquippedCurios(living); + return CuriosApi.getCuriosHelper().getEquippedCurios(living).orElse(null); } public static boolean hasItem(@Nullable LivingEntity entity, ItemStack stack) { From eedf7f4b840496c5e011501a3bfde36c62020b8a Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 16 Jul 2024 20:50:47 -0500 Subject: [PATCH 073/363] restore mana attributes, curios functionality --- .../56408d4385cae198e776e71d25785a05a196148d | 6 +- .../ars_nouveau/enchantment/mana_boost.json | 14 +++++ .../ars_nouveau/enchantment/mana_regen.json | 14 +++++ .../arsnouveau/api/perk/PerkAttributes.java | 4 +- .../client/keybindings/KeyHandler.java | 40 ++++++------- .../client/renderer/item/ArmorRenderer.java | 2 +- .../common/armor/AnimatedMagicArmor.java | 13 ++--- .../common/datagen/DefaultTableProvider.java | 5 +- .../common/datagen/EnchantmentProvider.java | 21 ++++++- .../arsnouveau/common/event/ArsEvents.java | 56 ------------------- .../items/curios/AbstractManaCurio.java | 22 +++----- 11 files changed, 86 insertions(+), 111 deletions(-) diff --git a/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d b/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d index ad73f4bafa..ab52b54ebf 100644 --- a/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d +++ b/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d @@ -1,4 +1,4 @@ -// 1.21 2024-07-10T21:04:30.3981055 Ars Nouveau's Enchantment Data -bd8cdb4df8237ec68aebc8d20f284e669c04b5e0 data/ars_nouveau/enchantment/mana_boost.json -ba44873e68e360bbc158c49fb4359d303332bf3c data/ars_nouveau/enchantment/mana_regen.json +// 1.21 2024-07-16T17:27:46.6062375 Ars Nouveau's Enchantment Data +e86598b47a336ed9c1c12c8c0391cf4d2f771c21 data/ars_nouveau/enchantment/mana_boost.json +321253ad8e6e58e584e3fe140e7fc39a1f2f11b7 data/ars_nouveau/enchantment/mana_regen.json 8091c2c07766c95ebf45a5618abc2da3ab8c9051 data/ars_nouveau/enchantment/reactive.json diff --git a/src/generated/resources/data/ars_nouveau/enchantment/mana_boost.json b/src/generated/resources/data/ars_nouveau/enchantment/mana_boost.json index 08ed35dce0..b318f0d40b 100644 --- a/src/generated/resources/data/ars_nouveau/enchantment/mana_boost.json +++ b/src/generated/resources/data/ars_nouveau/enchantment/mana_boost.json @@ -3,6 +3,20 @@ "description": { "translate": "enchantment.ars_nouveau.mana_boost" }, + "effects": { + "minecraft:attributes": [ + { + "amount": { + "type": "minecraft:linear", + "base": 25.0, + "per_level_above_first": 25.0 + }, + "attribute": "ars_nouveau:ars_nouveau.perk.max_mana", + "id": "ars_nouveau:enchantment.max_mana", + "operation": "add_value" + } + ] + }, "max_cost": { "base": 12, "per_level_above_first": 11 diff --git a/src/generated/resources/data/ars_nouveau/enchantment/mana_regen.json b/src/generated/resources/data/ars_nouveau/enchantment/mana_regen.json index 70f804ef76..37feb7e266 100644 --- a/src/generated/resources/data/ars_nouveau/enchantment/mana_regen.json +++ b/src/generated/resources/data/ars_nouveau/enchantment/mana_regen.json @@ -3,6 +3,20 @@ "description": { "translate": "enchantment.ars_nouveau.mana_regen" }, + "effects": { + "minecraft:attributes": [ + { + "amount": { + "type": "minecraft:linear", + "base": 2.0, + "per_level_above_first": 2.0 + }, + "attribute": "ars_nouveau:ars_nouveau.perk.mana_regen", + "id": "ars_nouveau:enchantment.mana_regen", + "operation": "add_value" + } + ] + }, "max_cost": { "base": 12, "per_level_above_first": 11 diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkAttributes.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkAttributes.java index 2d64cd4e93..bcf2ca8c57 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkAttributes.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkAttributes.java @@ -10,6 +10,7 @@ import net.neoforged.neoforge.event.entity.EntityAttributeModificationEvent; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; + import java.util.HashMap; import java.util.UUID; import java.util.function.Function; @@ -24,9 +25,6 @@ public class PerkAttributes { public static final DeferredHolder MAX_MANA = registerAttribute("ars_nouveau.perk.max_mana", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 10000.0D).setSyncable(true), "22980b24-83e5-4683-a215-8997c4011389"); - @Deprecated - public static final DeferredHolder MAX_MANA_BONUS = MAX_MANA, FLAT_MANA_BONUS = MAX_MANA; - public static final DeferredHolder SPELL_DAMAGE_BONUS = registerAttribute("ars_nouveau.perk.spell_damage", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 10000.0D).setSyncable(true), "50b50137-9c92-4e64-b350-6044e9e609de"); public static final DeferredHolder WHIRLIESPRIG = registerAttribute("ars_nouveau.perk.saturation", (id) -> new RangedAttribute(id, 1.0, 0.0D, 10000.0D).setSyncable(true), "152810f7-0d01-484e-a512-73fe70af3db7"); public static final DeferredHolder WIXIE = registerAttribute("ars_nouveau.perk.wixie", (id) -> new RangedAttribute(id, 1.0D, 0.0D, 1024.0D).setSyncable(true), "bae5d566-c9f6-4abf-9fe0-6ac140a34db1"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/keybindings/KeyHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/keybindings/KeyHandler.java index 63062030e0..8ea498c4f4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/keybindings/KeyHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/keybindings/KeyHandler.java @@ -19,6 +19,7 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.InputEvent; +import net.neoforged.neoforge.items.IItemHandlerModifiable; import static com.hollingsworth.arsnouveau.api.util.StackUtil.getHeldSpellbook; @@ -108,26 +109,25 @@ public static void checkCasterKeys(int key) { } public static void checkCurioHotkey(int keyMapping) { - // todo: curios -// for (KeyMapping mapping : CURIO_MAPPINGS) { -// if (mapping.getKey().getValue() == keyMapping) { -// LazyOptional stacks = CuriosUtil.getAllWornItems(MINECRAFT.player); -// if (!stacks.isPresent()) -// return; -// IItemHandlerModifiable handler = stacks.orElse(null); -// for (int i = 0; i < handler.getSlots(); i++) { -// ItemStack stack = handler.getStackInSlot(i); -// if (stack.getItem() instanceof IRadialProvider radialProvider) { -// if (MINECRAFT.screen instanceof GuiRadialMenu) { -// MINECRAFT.player.closeContainer(); -// } else { -// radialProvider.onRadialKeyPressed(stack, MINECRAFT.player); -// } -// } -// } -// return; -// } -// } + for (KeyMapping mapping : CURIO_MAPPINGS) { + if (mapping.getKey().getValue() == keyMapping) { + IItemHandlerModifiable handler = CuriosUtil.getAllWornItems(MINECRAFT.player); + if (handler == null) + return; + + for (int i = 0; i < handler.getSlots(); i++) { + ItemStack stack = handler.getStackInSlot(i); + if (stack.getItem() instanceof IRadialProvider radialProvider) { + if (MINECRAFT.screen instanceof GuiRadialMenu) { + MINECRAFT.player.closeContainer(); + } else { + radialProvider.onRadialKeyPressed(stack, MINECRAFT.player); + } + } + } + return; + } + } } @SubscribeEvent diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ArmorRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ArmorRenderer.java index 1c367e0e8a..d9a7c9c69b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ArmorRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ArmorRenderer.java @@ -43,7 +43,7 @@ public void actuallyRender(PoseStack poseStack, AnimatedMagicArmor animatable, B @Override public ResourceLocation getTextureLocation(AnimatedMagicArmor instance) { - if(model instanceof GenericModel genericModel){ + if(instance != null && model instanceof GenericModel genericModel){ return ArsNouveau.prefix( "textures/" + genericModel.textPathRoot + "/" + genericModel.name + "_" + instance.getColor(getCurrentStack()) + ".png"); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java index 9821d4be48..11f776fb13 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java @@ -31,10 +31,9 @@ import net.minecraft.world.level.Level; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.client.GeoRenderProvider; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.model.GeoModel; @@ -138,18 +137,16 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public void initializeClient(Consumer consumer) { - super.initializeClient(consumer); - consumer.accept(new IClientItemExtensions() { + public void createGeoRenderer(Consumer consumer) { + GeoItem.super.createGeoRenderer(consumer); + consumer.accept(new GeoRenderProvider() { private GeoArmorRenderer renderer; @Override - public @NotNull HumanoidModel getHumanoidArmorModel(LivingEntity livingEntity, ItemStack itemStack, - EquipmentSlot equipmentSlot, HumanoidModel original) { + public @Nullable HumanoidModel getGeoArmorRenderer(@Nullable T livingEntity, ItemStack itemStack, @Nullable EquipmentSlot equipmentSlot, @Nullable HumanoidModel original) { if(renderer == null){ renderer = new ArmorRenderer(getArmorModel()); } - renderer.prepForRender(livingEntity, itemStack, equipmentSlot, original); return this.renderer; } }); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java index 44d6d788a8..bda24f16bd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java @@ -54,10 +54,7 @@ import java.util.stream.Stream; public class DefaultTableProvider extends LootTableProvider { - //todo: reenable loot tables - public DefaultTableProvider(PackOutput pOutput, Set> pRequiredTables, List pSubProviders, CompletableFuture pRegistries) { - super(pOutput, pRequiredTables, pSubProviders, pRegistries); - } + public DefaultTableProvider(PackOutput pOutput, CompletableFuture pRegistries) { super(pOutput, new HashSet<>(), List.of(new LootTableProvider.SubProviderEntry(BlockLootTable::new, LootContextParamSets.BLOCK), new LootTableProvider.SubProviderEntry(EntityLootTable::new, LootContextParamSets.ENTITY)), pRegistries); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EnchantmentProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EnchantmentProvider.java index 131210b0df..3b9a4599bc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EnchantmentProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EnchantmentProvider.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.common.datagen; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import net.minecraft.core.HolderGetter; import net.minecraft.core.HolderLookup; @@ -12,8 +13,12 @@ import net.minecraft.tags.EnchantmentTags; import net.minecraft.tags.ItemTags; import net.minecraft.world.entity.EquipmentSlotGroup; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.Item; import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentEffectComponents; +import net.minecraft.world.item.enchantment.LevelBasedValue; +import net.minecraft.world.item.enchantment.effects.EnchantmentAttributeEffect; import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; import net.neoforged.neoforge.common.data.ExistingFileHelper; import org.jetbrains.annotations.NotNull; @@ -37,7 +42,13 @@ public static void bootstrap(BootstrapContext ctx) { Enchantment.dynamicCost(12, 11), 1, EquipmentSlotGroup.ARMOR - ))); + )).withEffect(EnchantmentEffectComponents.ATTRIBUTES, + new EnchantmentAttributeEffect( + ArsNouveau.prefix("enchantment.max_mana"), + PerkAttributes.MAX_MANA, + LevelBasedValue.perLevel(25F), + AttributeModifier.Operation.ADD_VALUE + ))); register(ctx, EnchantmentRegistry.MANA_REGEN_ENCHANTMENT, Enchantment.enchantment(Enchantment.definition( holdergetter2.getOrThrow(ItemTags.ARMOR_ENCHANTABLE), @@ -47,7 +58,13 @@ public static void bootstrap(BootstrapContext ctx) { Enchantment.dynamicCost(12, 11), 1, EquipmentSlotGroup.ARMOR - ))); + )).withEffect(EnchantmentEffectComponents.ATTRIBUTES, + new EnchantmentAttributeEffect( + ArsNouveau.prefix("enchantment.mana_regen"), + PerkAttributes.MANA_REGEN_BONUS, + LevelBasedValue.perLevel(2.0F), + AttributeModifier.Operation.ADD_VALUE + ))); register(ctx, EnchantmentRegistry.REACTIVE_ENCHANTMENT, Enchantment.enchantment(Enchantment.definition( holdergetter2.getOrThrow(ItemTags.ARMOR_ENCHANTABLE), diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java index 02c8663df0..76528ed4a1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ArsEvents.java @@ -9,14 +9,10 @@ import com.hollingsworth.arsnouveau.common.spell.effect.EffectInvisibility; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModPotions; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.DamageTypeTags; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.BlockHitResult; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.event.ItemAttributeModifierEvent; @EventBusSubscriber(modid = ArsNouveau.MODID) public class ArsEvents { @@ -41,17 +37,6 @@ public static void castEvent(SpellCastEvent castEvent) { SpellSensorTile.onSpellCast(castEvent); } - - @SubscribeEvent - public static void regenCalc(ManaRegenCalcEvent e) { - - /* Replaced by negative multiplier on AttributeModifier - if (e.getEntity() != null && e.getEntity().hasEffect(ModPotions.HEX_EFFECT.get())) { - e.setRegen(e.getRegen() / 2.0); - } - */ - } - @SubscribeEvent public static void spellResolve(SpellResolveEvent.Post e) { SpellSensorTile.onSpellResolve(e); @@ -75,45 +60,4 @@ public static void dispelEvent(DispelEvent e) { ghostWeaveTile.setVisibility(false); } } - - @SubscribeEvent - public static void modifyItemAttributes(ItemAttributeModifierEvent event) { - ItemStack itemStack = event.getItemStack(); - if (itemStack.isEnchanted()) { -// if (itemStack.getItem() instanceof ArmorItem armor) { -// if (!(event.getSlotType() == armor.getEquipmentSlot())) { -// return; -// } -// } else if (event.getSlotType() != EquipmentSlot.MAINHAND && event.getSlotType() != EquipmentSlot.OFFHAND) { -// return; -// } else if (itemStack.getItem() instanceof ShieldItem && !(event.getSlotType() == EquipmentSlot.OFFHAND)) -// return; - //TODO: reimplement manaboost/regen attributes - -// if (itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT) > 0) { -// ResourceLocation uuid = getEnchantBoostBySlot(event.getSlotType()); -// event.addModifier(PerkAttributes.MAX_MANA, new AttributeModifier(uuid, ServerConfig.MANA_BOOST_BONUS.get() * itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_BOOST_ENCHANTMENT), AttributeModifier.Operation.ADD_VALUE)); -// } -// if (itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT) > 0) { -// ResourceLocation uuid = getEnchantBoostBySlot(event.getSlotType()); -// event.addModifier(PerkAttributes.MANA_REGEN_BONUS, new AttributeModifier(uuid, ServerConfig.MANA_REGEN_ENCHANT_BONUS.get() * itemStack.getEnchantmentLevel(EnchantmentRegistry.MANA_REGEN_ENCHANTMENT), AttributeModifier.Operation.ADD_VALUE)); -// } - } - - } - - public static ResourceLocation getEnchantBoostBySlot(EquipmentSlot type) { - return switch (type) { - case CHEST -> ArsEvents.CHEST; - case LEGS -> ArsEvents.LEGS; - case FEET -> ArsEvents.FEET; - case HEAD -> ArsEvents.HEAD; - default -> ArsEvents.CHEST; - }; - } - - static final ResourceLocation CHEST = ArsNouveau.prefix("chest_enchant"); - static final ResourceLocation LEGS = ArsNouveau.prefix("legs_enchant"); - static final ResourceLocation FEET = ArsNouveau.prefix("feet_enchant"); - static final ResourceLocation HEAD = ArsNouveau.prefix("head_enchant"); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/AbstractManaCurio.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/AbstractManaCurio.java index 5d9a85b6d8..5136fc6e4f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/AbstractManaCurio.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/AbstractManaCurio.java @@ -1,14 +1,15 @@ package com.hollingsworth.arsnouveau.common.items.curios; -import com.hollingsworth.arsnouveau.ArsNouveau; +import com.google.common.collect.Multimap; import com.hollingsworth.arsnouveau.api.item.ArsNouveauCurio; import com.hollingsworth.arsnouveau.api.mana.IManaEquipment; import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; +import net.minecraft.core.Holder; import net.minecraft.resources.ResourceLocation; -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.ItemStack; -import net.minecraft.world.item.component.ItemAttributeModifiers; +import top.theillusivec4.curios.api.SlotContext; public abstract class AbstractManaCurio extends ArsNouveauCurio implements IManaEquipment { public AbstractManaCurio() { @@ -23,18 +24,11 @@ public int getManaRegenBonus(ItemStack i) { return 0; } - public static final ResourceLocation CURIOS_MANA = ArsNouveau.prefix("max_mana_modifier_curio"); - public static final ResourceLocation CURIOS_MANA_REGEN = ArsNouveau.prefix("mana_regen_modifier_curio"); - @Override - public ItemAttributeModifiers getDefaultAttributeModifiers(ItemStack stack) { - ItemAttributeModifiers attributes = super.getDefaultAttributeModifiers(stack); - // TODO: fix with curios slot group - for(EquipmentSlotGroup group : EquipmentSlotGroup.values()) { - attributes.withModifierAdded(PerkAttributes.MAX_MANA, new AttributeModifier(CURIOS_MANA, this.getMaxManaBoost(stack), AttributeModifier.Operation.ADD_VALUE), group); - - attributes.withModifierAdded(PerkAttributes.MANA_REGEN_BONUS, new AttributeModifier(CURIOS_MANA_REGEN, this.getManaRegenBonus(stack), AttributeModifier.Operation.ADD_VALUE), group); - } + public Multimap, AttributeModifier> getAttributeModifiers(SlotContext slotContext, ResourceLocation id, ItemStack stack) { + Multimap, AttributeModifier> attributes = super.getAttributeModifiers(slotContext, id, stack); + attributes.put(PerkAttributes.MAX_MANA, new AttributeModifier(id, this.getMaxManaBoost(stack), AttributeModifier.Operation.ADD_VALUE) ); + attributes.put(PerkAttributes.MANA_REGEN_BONUS, new AttributeModifier(id, this.getManaRegenBonus(stack), AttributeModifier.Operation.ADD_VALUE) ); return attributes; } } From 3f65d995df7036a23bd6c2522ffc9500d275a6db Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 18 Jul 2024 18:29:45 -0500 Subject: [PATCH 074/363] Fix drygmy, whirlisprig item insertions --- .../com/hollingsworth/arsnouveau/api/util/BlockUtil.java | 2 +- .../arsnouveau/common/block/tile/DrygmyTile.java | 8 ++++++-- src/main/resources/META-INF/accesstransformer.cfg | 6 ------ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java index 4962b821d9..0db526a9f1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java @@ -151,7 +151,7 @@ public static List getAdjacentInventories(Level world, BlockPos po if (world == null || pos == null) return new ArrayList<>(); ArrayList iInventories = new ArrayList<>(); for (Direction d : Direction.values()) { - var cap = world.getCapability(Capabilities.ItemHandler.BLOCK, pos, null); + var cap = world.getCapability(Capabilities.ItemHandler.BLOCK, pos.relative(d), null); if(cap != null){ iInventories.add(cap); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java index ae7c5bd31e..e8a20e8dec 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java @@ -15,7 +15,6 @@ import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; -import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -151,13 +150,18 @@ public void generateItems() { DamageSource damageSource = level.damageSources().playerAttack(fakePlayer); int numberItems = Config.DRYGMY_BASE_ITEM.get() + this.bonus; int exp = 0; + if(!(this.level instanceof ServerLevel serverLevel)){ + return; + } // Create the loot table and exp count for (LivingEntity entity : getNearbyEntities()) { if (entity.getType().is(EntityTags.DRYGMY_BLACKLIST)) { continue; } - LootTable loottable = this.level.registryAccess().registry(Registries.LOOT_TABLE).get().get(entity.getLootTable()); + var key = entity.getLootTable(); + LootTable loottable = serverLevel.getServer().reloadableRegistries().getLootTable(key); + LootParams.Builder lootcontext$builder = (new LootParams.Builder((ServerLevel) this.level)) .withParameter(LootContextParams.THIS_ENTITY, entity).withParameter(LootContextParams.ORIGIN, entity.position()) .withParameter(LootContextParams.DAMAGE_SOURCE, damageSource) diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 5a8bcf5a9f..4219c6f32f 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -39,12 +39,6 @@ public net.minecraft.world.entity.Entity eyeHeight # eyeHeight public net.minecraft.world.entity.npc.Villager increaseMerchantCareer()V # increaseMerchantCareer public net.minecraft.world.entity.npc.Villager increaseProfessionLevelOnUpdate # increaseProfessionLevelOnUpdate public net.minecraft.world.entity.npc.Villager updateMerchantTimer # updateMerchantTimer -public net.minecraft.world.entity.animal.Sheep eatAnimationTick # eatAnimationTick -public net.minecraft.client.multiplayer.ClientPacketListener serverChunkRadius # serverChunkRadius -public net.minecraft.world.level.biome.BiomeManager biomeZoomSeed # biomeZoomSeed - -public net.minecraft.world.item.CrossbowItem startSoundPlayed # startSoundPlayed -public net.minecraft.world.item.CrossbowItem midLoadSoundPlayed # midLoadSoundPlayed public net.minecraft.world.item.CrossbowItem getPowerForTime(ILnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/LivingEntity;)F # getPowerForTime public net.minecraft.world.item.CrossbowItem getShotPitch(Lnet/minecraft/util/RandomSource;I)F # getShotPitch public net.minecraft.world.item.CrossbowItem getRandomShotPitch(ZLnet/minecraft/util/RandomSource;)F # getRandomShotPitch From ab5c1c015872c733389b9b7b5c242780e611418b Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 18 Jul 2024 21:06:29 -0500 Subject: [PATCH 075/363] fix lectern dupes, extracting still broken --- .../AbstractStorageTerminalScreen.java | 5 + .../client/container/SlotStorage.java | 2 +- .../client/container/StorageTerminalMenu.java | 20 +- .../client/container/StoredItemStack.java | 62 +++--- .../client/container/TerminalSyncManager.java | 189 ++++++------------ .../block/tile/CraftingLecternTile.java | 11 +- .../arsnouveau/common/network/Networking.java | 1 + .../network/UpdateStorageItemsPacket.java | 37 ++++ .../arsnouveau/common/util/ANCodecs.java | 5 + 9 files changed, 155 insertions(+), 177 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/network/UpdateStorageItemsPacket.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java index c660ee4262..ebe74e9bd8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java @@ -528,6 +528,11 @@ public void receive(CompoundTag tag) { refreshItemList = true; } + public void updateItems(List items){ + menu.updateItems(items); + refreshItemList = true; + } + private FakeSlot fakeSlotUnderMouse = new FakeSlot(); @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/SlotStorage.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/SlotStorage.java index 051d29bc26..51da54902f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/SlotStorage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/SlotStorage.java @@ -9,7 +9,7 @@ public class SlotStorage { /** display position of the inventory slot on the screen y axis */ public int yDisplayPosition; /** The index of the slot in the inventory. */ - private final int slotIndex; + public final int slotIndex; /** The inventory we want to extract a slot from. */ public final StorageLecternTile inventory; public StoredItemStack stack; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java index 32744ce4ad..c9af09cdc2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java @@ -214,16 +214,18 @@ public void sendMessage(CompoundTag compound) { Networking.sendToServer(new ClientToServerStoragePacket(compound)); } - public final void receiveClientNBTPacket(CompoundTag message) { - if(sync.receiveUpdate(message)) { - itemList = sync.getAsList(); - if(noSort) { - itemListClient.forEach(s -> s.setCount(sync.getAmount(s))); - } else { - itemListClient = new ArrayList<>(itemList); - } - pinv.setChanged(); + public void updateItems(List stacks){ + sync.updateItemList(stacks); + itemList = sync.getAsList(); + if(noSort) { + itemListClient.forEach(s -> s.setCount(sync.getAmount(s))); + } else { + itemListClient = new ArrayList<>(itemList); } + pinv.setChanged(); + } + + public final void receiveClientNBTPacket(CompoundTag message) { if(message.contains("search")) search = message.getString("search"); if(message.contains("sortSettings")) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/StoredItemStack.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/StoredItemStack.java index 49d8238fb8..155279a17b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/StoredItemStack.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/StoredItemStack.java @@ -1,14 +1,26 @@ package com.hollingsworth.arsnouveau.client.container; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.ItemStack; import java.util.Comparator; import java.util.function.Function; public class StoredItemStack { + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + ItemStack.CODEC.fieldOf("stack").forGetter(StoredItemStack::getStack), + Codec.LONG.fieldOf("count").forGetter(StoredItemStack::getQuantity) + ).apply(instance, StoredItemStack::new)); + + public static final StreamCodec STREAM = StreamCodec.composite(ItemStack.STREAM_CODEC, StoredItemStack::getStack, ByteBufCodecs.VAR_LONG, StoredItemStack:: getQuantity, StoredItemStack::new); + private ItemStack stack; private long count; - private static final String ITEM_COUNT_NAME = "c", ITEMSTACK_NAME = "s"; private int hash; public StoredItemStack(ItemStack stack, long count) { @@ -35,6 +47,26 @@ public ItemStack getActualStack() { s.setCount((int) count); return s; } + + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + StoredItemStack other = (StoredItemStack) obj; + if (stack == null) { + return other.stack == null; + } else return ItemStack.isSameItem(stack, other.stack) && ItemStack.matches(stack, other.stack); + } + + @Override + public int hashCode() { + if(hash == 0) { + hash = ItemStack.hashItemAndComponents(stack); + } + return hash; + } // // public CompoundTag writeToNBT(CompoundTag tag) { // tag.putLong(ITEM_COUNT_NAME, getQuantity()); @@ -136,38 +168,10 @@ public IStoredItemStackComparator create(boolean rev) { } } - @Override - public int hashCode() { - if(hash == 0) { - hash = ItemStack.hashItemAndComponents(stack); - } - return hash; - } - public String getDisplayName() { return stack.getHoverName().getString(); } - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (obj == null) return false; - if (getClass() != obj.getClass()) return false; - StoredItemStack other = (StoredItemStack) obj; - if (stack == null) { - return other.stack == null; - } else return ItemStack.isSameItem(stack, other.stack) && ItemStack.matches(stack, other.stack); - } - - public boolean equals(StoredItemStack other) { - if (this == other) return true; - if (other == null) return false; - if (count != other.count) return false; - if (stack == null) { - return other.stack == null; - } else return ItemStack.isSameItem(stack, other.stack) && ItemStack.matches(stack, other.stack); - } - public void grow(long c) { count += c; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java index 2f4663426d..e070774b9b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java @@ -4,76 +4,67 @@ import com.hollingsworth.arsnouveau.common.network.ClientToServerStoragePacket; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.ServerToClientStoragePacket; -import io.netty.buffer.Unpooled; -import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import com.hollingsworth.arsnouveau.common.network.UpdateStorageItemsPacket; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import it.unimi.dsi.fastutil.objects.Object2LongMap; import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; import java.util.*; import java.util.function.Consumer; public class TerminalSyncManager { - private static final int MAX_PACKET_SIZE = 32000; - private Object2IntMap idMap = new Object2IntOpenHashMap<>(); - private Int2ObjectMap idMap2 = new Int2ObjectArrayMap<>(); private Object2LongMap items = new Object2LongOpenHashMap<>(); private Map itemList = new HashMap<>(); private int lastId = 1; - private FriendlyByteBuf workBuf = new FriendlyByteBuf(Unpooled.buffer()); - private void writeStack(FriendlyByteBuf buf, StoredItemStack stack) { - ItemStack st = stack.getStack(); - Item item = st.getItem(); - CompoundTag compoundtag = getSyncTag(st); - byte flags = (byte) ((stack.getQuantity() == 0 ? 1 : 0) | (compoundtag != null ? 2 : 0)); - boolean wr = true; - int id = idMap.getInt(stack); - if(id != 0) { - flags |= 4; - wr = false; - } - buf.writeByte(flags); - buf.writeVarInt(idMap.computeIfAbsent(stack, s -> { - int i = lastId++; - idMap2.put(i, (StoredItemStack) s); - return i; - })); - if(wr)writeItemId(buf, item); - if(stack.getQuantity() != 0)buf.writeVarLong(stack.getQuantity()); - if(wr && compoundtag != null)buf.writeNbt(compoundtag); - } - - private StoredItemStack read(FriendlyByteBuf buf) { - byte flags = buf.readByte(); - int id = buf.readVarInt(); - boolean rd = (flags & 4) == 0; - StoredItemStack stack; - if(rd) { - stack = new StoredItemStack(new ItemStack(readItemId(buf))); - } else { - stack = new StoredItemStack(idMap2.get(id).getStack()); - } - long count = (flags & 1) != 0 ? 0 : buf.readVarLong(); - stack.setCount(count); - if(rd && (flags & 2) != 0) { - //todo: check storage terminal for this -// stack.getStack(). -// stack.getStack().setTag(buf.readNbt()); - } - idMap.put(stack, id); - idMap2.put(id, stack); - return stack; - } +// private void writeStack(FriendlyByteBuf buf, StoredItemStack stack) { +// ItemStack st = stack.getStack(); +// Item item = st.getItem(); +// CompoundTag compoundtag = getSyncTag(st); +// byte flags = (byte) ((stack.getQuantity() == 0 ? 1 : 0) | (compoundtag != null ? 2 : 0)); +// boolean wr = true; +// int id = idMap.getInt(stack); +// if(id != 0) { +// flags |= 4; +// wr = false; +// } +// buf.writeByte(flags); +// buf.writeVarInt(idMap.computeIfAbsent(stack, s -> { +// int i = lastId++; +// idMap2.put(i, (StoredItemStack) s); +// return i; +// })); +// if(wr)writeItemId(buf, item); +// if(stack.getQuantity() != 0)buf.writeVarLong(stack.getQuantity()); +// if(wr && compoundtag != null)buf.writeNbt(compoundtag); +// } +// +// private StoredItemStack read(FriendlyByteBuf buf) { +// byte flags = buf.readByte(); +// int id = buf.readVarInt(); +// boolean rd = (flags & 4) == 0; +// StoredItemStack stack; +// if(rd) { +// stack = new StoredItemStack(ItemStack.STREAM_CODEC.decode(buf)); +// } else { +// stack = new StoredItemStack(idMap2.get(id).getStack()); +// } +// long count = (flags & 1) != 0 ? 0 : buf.readVarLong(); +// stack.setCount(count); +// if(rd && (flags & 2) != 0) { +// //todo: check storage terminal for this +//// stack.getStack(). +//// stack.getStack().setTag(buf.readNbt()); +// } +// idMap.put(stack, id); +// idMap2.put(id, stack); +// return stack; +// } public void update(Map items, ServerPlayer player, Consumer extraSync) { List toWrite = new ArrayList<>(); @@ -91,57 +82,23 @@ public void update(Map items, ServerPlayer player, Consum }); this.items.clear(); this.items.putAll(items); - if(!toWrite.isEmpty()) { - workBuf.writerIndex(0); - int j = 0; - for (int i = 0; i < toWrite.size(); i++, j++) { - StoredItemStack stack = toWrite.get(i); - int li = workBuf.writerIndex(); - writeStack(workBuf, stack); - int s = workBuf.writerIndex(); - if((s > MAX_PACKET_SIZE || j > 32000) && j > 1) { - CompoundTag t = writeBuf("d", workBuf, li); - t.putShort("l", (short) j); - Networking.sendToPlayerClient(new ServerToClientStoragePacket(t), player); - j = 0; - workBuf.writerIndex(0); - workBuf.writeBytes(workBuf, li, s - li); - } - } - if(j > 0 || extraSync != null) { - CompoundTag t; - if(j > 0) { - t = writeBuf("d", workBuf, workBuf.writerIndex()); - t.putShort("l", (short) j); - } else t = new CompoundTag(); - if(extraSync != null)extraSync.accept(t); - Networking.sendToPlayerClient(new ServerToClientStoragePacket(t), player); - } - } else if(extraSync != null) { + Networking.sendToPlayerClient(new UpdateStorageItemsPacket(toWrite), player); + if(extraSync != null){ CompoundTag t = new CompoundTag(); extraSync.accept(t); Networking.sendToPlayerClient(new ServerToClientStoragePacket(t), player); } } - public boolean receiveUpdate(CompoundTag tag) { - if(tag.contains("d")) { - FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.wrappedBuffer(tag.getByteArray("d"))); - List in = new ArrayList<>(); - short len = tag.getShort("l"); - for (int i = 0; i < len; i++) { - in.add(read(buf)); + public boolean updateItemList(List items) { + items.forEach(s -> { + if(s.getQuantity() == 0) { + this.itemList.remove(s); + } else { + this.itemList.put(s, s); } - in.forEach(s -> { - if(s.getQuantity() == 0) { - this.itemList.remove(s); - } else { - this.itemList.put(s, s); - } - }); - return true; - } - return false; + }); + return true; } public void sendClientInteract(StoredItemStack intStack, StorageTerminalMenu.SlotAction action, boolean pullOne) { @@ -149,22 +106,13 @@ public void sendClientInteract(StoredItemStack intStack, StorageTerminalMenu.Slo interactTag.putBoolean("pullOne", pullOne); interactTag.putInt("action", action.ordinal()); if(intStack != null){ - interactTag.putInt("id", idMap.getInt(intStack)); - interactTag.putLong("qty", intStack.getQuantity()); + interactTag.put("stack", ANCodecs.encode(StoredItemStack.CODEC, intStack)); } CompoundTag dataTag = new CompoundTag(); dataTag.put("interaction", interactTag); Networking.sendToServer(new ClientToServerStoragePacket(dataTag)); } - private CompoundTag writeBuf(String id, FriendlyByteBuf buf, int len) { - byte[] data = new byte[len]; - buf.getBytes(0, data); - CompoundTag tag = new CompoundTag(); - tag.putByteArray(id, data); - return tag; - } - public void receiveInteract(CompoundTag tag, StorageTerminalMenu handler) { if(!tag.contains("interaction")) return; @@ -172,9 +120,8 @@ public void receiveInteract(CompoundTag tag, StorageTerminalMenu handler) { CompoundTag interactTag = tag.getCompound("interaction"); boolean pullOne = interactTag.getBoolean("pullOne"); StoredItemStack stack = null; - if(interactTag.contains("id")){ - stack = new StoredItemStack(idMap2.get(interactTag.getInt("id")).getStack()); - stack.setCount(interactTag.getLong("qty")); + if(interactTag.contains("stack")){ + stack = ANCodecs.decode(StoredItemStack.CODEC, interactTag.get("stack")); } StorageTerminalMenu.SlotAction action = StorageTerminalMenu.SlotAction.values()[interactTag.getInt("action")]; handler.onInteract(stack, action, pullOne); @@ -192,24 +139,4 @@ public long getAmount(StoredItemStack stack) { public static ResourceLocation getItemId(Item item) { return BuiltInRegistries.ITEM.getKey(item); } - - public static void writeItemId(FriendlyByteBuf buf, Item item) { - var key = item.builtInRegistryHolder().key().location(); - buf.writeResourceLocation(key); - } - - public static Item readItemId(FriendlyByteBuf buf) { - var loc = buf.readResourceLocation(); - return BuiltInRegistries.ITEM.get(loc); - } - - public static CompoundTag getSyncTag(ItemStack stack) { - Item item = stack.getItem(); - CompoundTag compoundtag = null; - // todo: storage check if this is needed -// if (item.isDamageable(stack) || item.shouldOverrideMultiplayerNbt()) { -// compoundtag = stack.getShareTag(); -// } - return compoundtag; - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java index 9d62637d9d..549712af37 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java @@ -5,7 +5,6 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; -import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.world.Container; @@ -140,12 +139,11 @@ public void craft(Player thePlayer, @Nullable String tab) { if(currentRecipe == null) { return; } - NonNullList remainder = currentRecipe.getRemainingItems(craftMatrix.asCraftInput()); boolean playerInvUpdate = false; - for (int i = 0; i < remainder.size(); ++i) { + for (int i = 0; i < 9; ++i) { ItemStack currentStack = craftMatrix.getItem(i); ItemStack oldItem = currentStack.copy(); - ItemStack rem = remainder.get(i); + ItemStack rem = currentStack.getCraftingRemainingItem(); if (!currentStack.isEmpty()) { craftMatrix.removeItemNoUpdate(i, 1); currentStack = craftMatrix.getItem(i); @@ -205,9 +203,8 @@ public void registerCrafting(CraftingTerminalMenu containerCraftingTerminal) { protected void onCraftingMatrixChanged() { if (currentRecipe == null || !currentRecipe.matches(craftMatrix.asCraftInput(), level)) { var holder = level.getRecipeManager().getRecipeFor(RecipeType.CRAFTING, craftMatrix.asCraftInput(), level).orElse(null); - if(holder != null){ - currentRecipe = holder.value(); - } + currentRecipe = holder == null ? null : holder.value(); + } if (currentRecipe == null) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java index 6d55a1f676..116e7cf4ea 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java @@ -73,6 +73,7 @@ public static void register(final RegisterPayloadHandlersEvent event) { reg.playToClient(PacketWarpPosition.TYPE, PacketWarpPosition.CODEC, Networking::handle); reg.playToClient(PotionSyncPacket.TYPE, PotionSyncPacket.CODEC, Networking::handle); reg.playToClient(ServerToClientStoragePacket.TYPE, ServerToClientStoragePacket.CODEC, Networking::handle); + reg.playToClient(UpdateStorageItemsPacket.TYPE, UpdateStorageItemsPacket.CODEC, Networking::handle); } private static void handle(T message, IPayloadContext ctx) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/UpdateStorageItemsPacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/UpdateStorageItemsPacket.java new file mode 100644 index 0000000000..f8f192dfb0 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/UpdateStorageItemsPacket.java @@ -0,0 +1,37 @@ +package com.hollingsworth.arsnouveau.common.network; + +import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.client.container.AbstractStorageTerminalScreen; +import com.hollingsworth.arsnouveau.client.container.StoredItemStack; +import net.minecraft.client.Minecraft; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +public class UpdateStorageItemsPacket extends AbstractPacket{ + + public List stacks; + + public UpdateStorageItemsPacket(List stacks){ + this.stacks = stacks; + } + + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + super.onClientReceived(minecraft, player); + if (minecraft.screen instanceof AbstractStorageTerminalScreen terminalScreen) { + terminalScreen.updateItems(stacks); + } + } + public static final Type TYPE = new Type<>(ArsNouveau.prefix("update_storage_packet")); + public static final StreamCodec CODEC = StreamCodec.composite(StoredItemStack.STREAM.apply(ByteBufCodecs.list()), u -> u.stacks, UpdateStorageItemsPacket::new); + + @Override + public Type type() { + return TYPE; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java index e7aa9eaffc..86ca1af25f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java @@ -12,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.Optional; import java.util.function.Function; public class ANCodecs { @@ -29,6 +30,10 @@ public static T decode(Codec codec, Tag tag){ return codec.parse(NbtOps.INSTANCE, tag).getOrThrow(); } + public static Optional decodeOptional(Codec codec, Tag tag){ + return codec.parse(NbtOps.INSTANCE, tag).result(); + } + public static JsonElement toJson(Codec codec, T value){ return codec.encodeStart(JsonOps.INSTANCE, value).getOrThrow(); } From e6d56f6426a9b8023cf1c49714c132ebba7c2b4e Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 20 Jul 2024 10:42:44 -0500 Subject: [PATCH 076/363] remove menu spaghetti chains --- .../AbstractStorageTerminalScreen.java | 116 ++++++++++++------ .../container/CraftingTerminalMenu.java | 5 + .../client/container/StorageTerminalMenu.java | 116 +++++++++--------- .../client/container/TerminalSyncManager.java | 94 ++------------ .../client/gui/buttons/ANButton.java | 3 +- .../client/gui/buttons/GuiImageButton.java | 2 +- .../client/gui/buttons/StateButton.java | 4 +- .../jei/CraftingTerminalTransferHandler.java | 4 +- 8 files changed, 162 insertions(+), 182 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java index ebe74e9bd8..bcbfd7aa30 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java @@ -9,6 +9,9 @@ import com.hollingsworth.arsnouveau.client.gui.buttons.StateButton; import com.hollingsworth.arsnouveau.client.gui.buttons.StorageSettingsButton; import com.hollingsworth.arsnouveau.client.gui.buttons.StorageTabButton; +import com.hollingsworth.arsnouveau.common.network.ClientToServerStoragePacket; +import com.hollingsworth.arsnouveau.common.network.Networking; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import it.unimi.dsi.fastutil.objects.Object2IntMap; @@ -18,6 +21,7 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -35,7 +39,6 @@ import java.util.stream.Collectors; import static com.hollingsworth.arsnouveau.client.container.StorageTerminalMenu.SlotAction.*; -import static com.hollingsworth.arsnouveau.client.container.TerminalSyncManager.getItemId; public abstract class AbstractStorageTerminalScreen extends AbstractContainerScreen { private static final LoadingCache> tooltipCache = CacheBuilder.newBuilder().expireAfterAccess(5, TimeUnit.SECONDS).build(new CacheLoader<>() { @@ -77,6 +80,9 @@ public List load(StoredItemStack key) { public List tabButtons = new ArrayList<>(); public String selectedTab = null; + List itemsSorted = new ArrayList<>(); + List itemsUnsorted = new ArrayList<>(); + public AbstractStorageTerminalScreen(T screenContainer, Inventory inv, Component titleIn) { super(screenContainer, inv, titleIn); screenContainer.onPacket = this::onPacket; @@ -128,7 +134,7 @@ protected void sendUpdate() { } CompoundTag msg = new CompoundTag(); msg.put("termData", c); - menu.sendMessage(msg); + Networking.sendToServer(new ClientToServerStoragePacket(msg)); } public SortSettings getSortSettings() { @@ -144,6 +150,7 @@ public SortSettings getSortSettings() { @Override protected void init() { clearWidgets(); + scrollTo(0); inventoryLabelY = imageHeight - 92; super.init(); @@ -204,8 +211,7 @@ protected void updateSearch() { } if (refreshItemList || !searchLast.equals(searchString)) { - - getMenu().itemListClientSorted.clear(); + this.itemsSorted = new ArrayList<>(); boolean searchMod = false; String search = searchString; if (searchString.startsWith("@")) { @@ -224,50 +230,70 @@ protected void updateSearch() { } boolean notDone; try { - for (int i = 0;i < getMenu().itemListClient.size();i++) { - StoredItemStack is = getMenu().itemListClient.get(i); - if (is != null && is.getStack() != null) { - String dspName = searchMod ? getItemId(is.getStack().getItem()).getNamespace() : is.getStack().getHoverName().getString(); - notDone = true; - if (m.matcher(dspName.toLowerCase()).find()) { - addStackToClientList(is); - notDone = false; - } - if (notDone) { - for (String lp : tooltipCache.get(is)) { - if (m.matcher(lp).find()) { - addStackToClientList(is); - break; - } - } - } - } - } + for (StoredItemStack is : this.itemsUnsorted) { + if (is != null && is.getStack() != null) { + String dspName = searchMod ? BuiltInRegistries.ITEM.getKey(is.getStack().getItem()).getNamespace() : is.getStack().getHoverName().getString(); + notDone = true; + if (m.matcher(dspName.toLowerCase()).find()) { + addStackToClientList(is); + notDone = false; + } + if (notDone) { + for (String lp : tooltipCache.get(is)) { + if (m.matcher(lp).find()) { + addStackToClientList(is); + break; + } + } + } + } + } } catch (Exception e) { e.printStackTrace(); } - Collections.sort(getMenu().itemListClientSorted, menu.noSort ? sortComp : comparator); + Collections.sort(this.itemsSorted, menu.noSort ? sortComp : comparator); if(!searchLast.equals(searchString)) { - getMenu().scrollTo(0); + this.scrollTo(0); this.currentScroll = 0; if (searchType == 1) { IAutoFillTerminal.sync(searchString); } CompoundTag nbt = new CompoundTag(); nbt.putString("search", searchString); - menu.sendMessage(nbt); - + Networking.sendToServer(new ClientToServerStoragePacket(nbt)); onUpdateSearch(searchString); } else { - getMenu().scrollTo(this.currentScroll); + this.scrollTo(this.currentScroll); } refreshItemList = false; this.searchLast = searchString; } } + public final void scrollTo(float p_148329_1_) { + int lines = this.getSortSettings() == null || !this.getSortSettings().expanded ? 3 : 7; + int i = (this.itemsSorted.size() + 9 - 1) / 9 - lines; + int j = (int) (p_148329_1_ * i + 0.5D); + + if (j < 0) { + j = 0; + } + + for (int k = 0;k < lines;++k) { + for (int l = 0;l < 9;++l) { + int i1 = l + (k + j) * 9; + + if (i1 >= 0 && i1 < this.itemsSorted.size()) { + menu.setSlotContents(l + k * 9, this.itemsSorted.get(i1)); + } else { + menu.setSlotContents(l + k * 9, null); + } + } + } + } + private void addStackToClientList(StoredItemStack is) { - getMenu().itemListClientSorted.add(is); + this.itemsSorted.add(is); } public static TooltipFlag getTooltipFlag(){ @@ -292,7 +318,7 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTi if(hasShiftDown()) { if(!menu.noSort) { - List list = getMenu().itemListClientSorted; + List list = this.itemsSorted; Object2IntMap map = new Object2IntOpenHashMap<>(); map.defaultReturnValue(Integer.MAX_VALUE); for (int m = 0; m < list.size(); m++) { @@ -305,7 +331,7 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTi sortComp = null; menu.noSort = false; refreshItemList = true; - menu.itemListClient = new ArrayList<>(menu.itemList); + this.itemsUnsorted = new ArrayList<>(menu.itemList); } if (!this.wasClicking && flag && mouseX >= k && mouseY >= l && mouseX < i1 && mouseY < j1) { @@ -320,7 +346,7 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTi if (this.isScrolling) { this.currentScroll = (mouseY - l - 7.5F) / (j1 - l - 15.0F); this.currentScroll = Mth.clamp(this.currentScroll, 0.0F, 1.0F); - getMenu().scrollTo(this.currentScroll); + this.scrollTo(this.currentScroll); } super.render(graphics, mouseX, mouseY, partialTicks); @@ -367,6 +393,7 @@ protected void renderLabels(GuiGraphics p_281635_, int mouseX, int mouseY) { PoseStack st = p_281635_.pose(); st.pushPose(); slotIDUnderMouse = drawSlots(p_281635_, mouseX, mouseY); +// System.out.println(slotIDUnderMouse); st.popPose(); } @@ -420,7 +447,7 @@ private void drawStackSize(GuiGraphics graphics, Font fr, long size, int x, int } protected boolean needsScrollBars() { - return this.getMenu().itemListClientSorted.size() > rowCount * 9; + return itemsSorted.size() > rowCount * 9; } @Override @@ -461,7 +488,15 @@ public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) { } protected void storageSlotClick(StoredItemStack slotStack, StorageTerminalMenu.SlotAction act, boolean pullOne) { - menu.sync.sendClientInteract(slotStack, act, pullOne); + CompoundTag interactTag = new CompoundTag(); + interactTag.putBoolean("pullOne", pullOne); + interactTag.putInt("action", act.ordinal()); + if(slotStack != null){ + interactTag.put("stack", ANCodecs.encode(StoredItemStack.CODEC, slotStack)); + } + CompoundTag dataTag = new CompoundTag(); + dataTag.put("interaction", interactTag); + Networking.sendToServer(new ClientToServerStoragePacket(dataTag)); } public boolean isPullOne(int mouseButton) { @@ -505,10 +540,10 @@ public boolean mouseScrolled(double p_mouseScrolled_1_, double p_mouseScrolled_3 if (!this.needsScrollBars()) { return false; } else { - int i = ((this.menu).itemListClientSorted.size() + 9 - 1) / 9 - 5; + int i = (itemsSorted.size() + 9 - 1) / 9 - 5; this.currentScroll = (float)(this.currentScroll - p_mouseScrolled_5_ / i); this.currentScroll = Mth.clamp(this.currentScroll, 0.0F, 1.0F); - this.menu.scrollTo(this.currentScroll); + this.scrollTo(this.currentScroll); return true; } } @@ -531,6 +566,15 @@ public void receive(CompoundTag tag) { public void updateItems(List items){ menu.updateItems(items); refreshItemList = true; + + if(menu.noSort) { + itemsUnsorted.forEach(s ->{ + StoredItemStack mapStack = menu.itemMap.get(s); + s.setCount(mapStack != null ? mapStack.getQuantity() : 0L); + }); + } else { + itemsUnsorted = new ArrayList<>(menu.itemList); + } } private FakeSlot fakeSlotUnderMouse = new FakeSlot(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java index 0108039375..84f316d80f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java @@ -315,6 +315,11 @@ public void receive(HolderLookup.Provider reg, CompoundTag message) { } } + @Override + public void sendMessage(CompoundTag compound) { + + } + @Override public List getStoredItems() { return itemList; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java index c9af09cdc2..06ee56c9c0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java @@ -1,9 +1,13 @@ package com.hollingsworth.arsnouveau.client.container; import com.hollingsworth.arsnouveau.common.block.tile.StorageLecternTile; -import com.hollingsworth.arsnouveau.common.network.ClientToServerStoragePacket; import com.hollingsworth.arsnouveau.common.network.Networking; +import com.hollingsworth.arsnouveau.common.network.ServerToClientStoragePacket; +import com.hollingsworth.arsnouveau.common.network.UpdateStorageItemsPacket; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.hollingsworth.arsnouveau.setup.registry.MenuRegistry; +import it.unimi.dsi.fastutil.objects.Object2LongMap; +import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -20,19 +24,13 @@ import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.RecipeHolder; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; public class StorageTerminalMenu extends RecipeBookMenu { protected StorageLecternTile te; protected int playerSlotsStart; protected List storageSlotList = new ArrayList<>(); public List itemList = new ArrayList<>(); - public List itemListClient = new ArrayList<>(); - public List itemListClientSorted = new ArrayList<>(); - public TerminalSyncManager sync = new TerminalSyncManager(); private int lines; protected Inventory pinv; public Runnable onPacket; @@ -41,6 +39,7 @@ public class StorageTerminalMenu extends RecipeBookMenu tabNames = new ArrayList<>(); public String selectedTab = null; + public Map itemMap = new HashMap<>(); public StorageTerminalMenu(int id, Inventory inv, StorageLecternTile te) { this(MenuRegistry.STORAGE.get(), id, inv, te); @@ -83,7 +82,6 @@ public void addStorageSlots(int x, int y) { this.addSlotToContainer(new SlotStorage(this.te, i * 9 + j, x + j * 18, y + i * 18)); } } - scrollTo(0.0F); } protected final void addSlotToContainer(SlotStorage slotStorage) { @@ -95,27 +93,6 @@ public boolean stillValid(Player playerIn) { return te != null && te.canInteractWith(playerIn); } - public final void scrollTo(float p_148329_1_) { - int i = (this.itemListClientSorted.size() + 9 - 1) / 9 - lines; - int j = (int) (p_148329_1_ * i + 0.5D); - - if (j < 0) { - j = 0; - } - - for (int k = 0;k < lines;++k) { - for (int l = 0;l < 9;++l) { - int i1 = l + (k + j) * 9; - - if (i1 >= 0 && i1 < this.itemListClientSorted.size()) { - setSlotContents(l + k * 9, this.itemListClientSorted.get(i1)); - } else { - setSlotContents(l + k * 9, null); - } - } - } - } - public final void setSlotContents(int id, StoredItemStack stack) { storageSlotList.get(id).stack = stack; } @@ -127,27 +104,43 @@ public final SlotStorage getSlotByID(int id) { public enum SlotAction { PULL_OR_PUSH_STACK, PULL_ONE, SPACE_CLICK, SHIFT_PULL, GET_HALF, GET_QUARTER //CRAFT } - + private Object2LongMap itemLongMap = new Object2LongOpenHashMap<>(); @Override public void broadcastChanges() { if(te == null){ return; } Map itemsCount = te.getStacks(selectedTab); - sync.update(itemsCount, (ServerPlayer) pinv.player, tag -> { - if(!te.getLastSearch().equals(search)) { - search = te.getLastSearch(); - tag.putString("search", search); - } - ListTag tabs = new ListTag(); - for(String s : te.getTabNames()){ - CompoundTag nameTag = new CompoundTag(); - nameTag.putString("name", s); - tabs.add(nameTag); + List toWrite = new ArrayList<>(); + Set found = new HashSet<>(); + itemsCount.forEach((s, c) -> { + long pc = this.itemLongMap.getLong(s); + if(pc != 0L)found.add(s); + if(pc != c) { + toWrite.add(new StoredItemStack(s.getStack(), c)); } - tag.put("tabs", tabs); - tag.put("sortSettings", te.sortSettings.toTag()); }); + this.itemLongMap.forEach((s, c) -> { + if(!found.contains(s)) + toWrite.add(new StoredItemStack(s.getStack(), 0L)); + }); + this.itemLongMap.clear(); + this.itemLongMap.putAll(itemsCount); + Networking.sendToPlayerClient(new UpdateStorageItemsPacket(toWrite), (ServerPlayer) pinv.player); + CompoundTag tag = new CompoundTag(); + if(!te.getLastSearch().equals(search)) { + search = te.getLastSearch(); + tag.putString("search", search); + } + ListTag tabs = new ListTag(); + for(String s : te.getTabNames()){ + CompoundTag nameTag = new CompoundTag(); + nameTag.putString("name", s); + tabs.add(nameTag); + } + tag.put("tabs", tabs); + tag.put("sortSettings", te.sortSettings.toTag()); + Networking.sendToPlayerClient(new ServerToClientStoragePacket(tag), (ServerPlayer) pinv.player); super.broadcastChanges(); } @@ -210,18 +203,16 @@ public int getSize() { return 0; } - public void sendMessage(CompoundTag compound) { - Networking.sendToServer(new ClientToServerStoragePacket(compound)); - } - public void updateItems(List stacks){ - sync.updateItemList(stacks); - itemList = sync.getAsList(); - if(noSort) { - itemListClient.forEach(s -> s.setCount(sync.getAmount(s))); - } else { - itemListClient = new ArrayList<>(itemList); - } + stacks.forEach(s -> { + if(s.getQuantity() == 0) { + this.itemMap.remove(s); + } else { + this.itemMap.put(s, s); + } + + }); + itemList = new ArrayList<>(itemMap.values()); pinv.setChanged(); } @@ -246,12 +237,13 @@ public final void receiveClientNBTPacket(CompoundTag message) { if(onPacket != null)onPacket.run(); } + public void receive(HolderLookup.Provider reg, CompoundTag message) { if(pinv.player.isSpectator())return; if(message.contains("search")) { te.setLastSearch(message.getString("search")); } - sync.receiveInteract(message, this); + this.receiveInteract(message, this); if(message.contains("termData")) { CompoundTag d = message.getCompound("termData"); te.setSorting(SortSettings.fromTag(d.getCompound("sortSettings"))); @@ -262,6 +254,20 @@ public void receive(HolderLookup.Provider reg, CompoundTag message) { } } + public void receiveInteract(CompoundTag tag, StorageTerminalMenu handler) { + if(!tag.contains("interaction")) + return; + + CompoundTag interactTag = tag.getCompound("interaction"); + boolean pullOne = interactTag.getBoolean("pullOne"); + StoredItemStack stack = null; + if(interactTag.contains("stack")){ + stack = ANCodecs.decode(StoredItemStack.CODEC, interactTag.get("stack")); + } + StorageTerminalMenu.SlotAction action = StorageTerminalMenu.SlotAction.values()[interactTag.getInt("action")]; + handler.onInteract(stack, action, pullOne); + } + @Override public RecipeBookType getRecipeBookType() { return RecipeBookType.CRAFTING; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java index e070774b9b..d2d7288a1c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java @@ -1,25 +1,21 @@ package com.hollingsworth.arsnouveau.client.container; -import com.hollingsworth.arsnouveau.common.network.ClientToServerStoragePacket; -import com.hollingsworth.arsnouveau.common.network.Networking; -import com.hollingsworth.arsnouveau.common.network.ServerToClientStoragePacket; -import com.hollingsworth.arsnouveau.common.network.UpdateStorageItemsPacket; -import com.hollingsworth.arsnouveau.common.util.ANCodecs; +import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2LongMap; import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.item.Item; -import java.util.*; -import java.util.function.Consumer; +import java.util.HashMap; +import java.util.Map; public class TerminalSyncManager { private Object2LongMap items = new Object2LongOpenHashMap<>(); private Map itemList = new HashMap<>(); + private Object2IntMap idMap = new Object2IntOpenHashMap<>(); + private Int2ObjectMap idMap2 = new Int2ObjectArrayMap<>(); private int lastId = 1; // private void writeStack(FriendlyByteBuf buf, StoredItemStack stack) { @@ -65,78 +61,4 @@ public class TerminalSyncManager { // idMap2.put(id, stack); // return stack; // } - - public void update(Map items, ServerPlayer player, Consumer extraSync) { - List toWrite = new ArrayList<>(); - Set found = new HashSet<>(); - items.forEach((s, c) -> { - long pc = this.items.getLong(s); - if(pc != 0L)found.add(s); - if(pc != c) { - toWrite.add(new StoredItemStack(s.getStack(), c)); - } - }); - this.items.forEach((s, c) -> { - if(!found.contains(s)) - toWrite.add(new StoredItemStack(s.getStack(), 0L)); - }); - this.items.clear(); - this.items.putAll(items); - Networking.sendToPlayerClient(new UpdateStorageItemsPacket(toWrite), player); - if(extraSync != null){ - CompoundTag t = new CompoundTag(); - extraSync.accept(t); - Networking.sendToPlayerClient(new ServerToClientStoragePacket(t), player); - } - } - - public boolean updateItemList(List items) { - items.forEach(s -> { - if(s.getQuantity() == 0) { - this.itemList.remove(s); - } else { - this.itemList.put(s, s); - } - }); - return true; - } - - public void sendClientInteract(StoredItemStack intStack, StorageTerminalMenu.SlotAction action, boolean pullOne) { - CompoundTag interactTag = new CompoundTag(); - interactTag.putBoolean("pullOne", pullOne); - interactTag.putInt("action", action.ordinal()); - if(intStack != null){ - interactTag.put("stack", ANCodecs.encode(StoredItemStack.CODEC, intStack)); - } - CompoundTag dataTag = new CompoundTag(); - dataTag.put("interaction", interactTag); - Networking.sendToServer(new ClientToServerStoragePacket(dataTag)); - } - - public void receiveInteract(CompoundTag tag, StorageTerminalMenu handler) { - if(!tag.contains("interaction")) - return; - - CompoundTag interactTag = tag.getCompound("interaction"); - boolean pullOne = interactTag.getBoolean("pullOne"); - StoredItemStack stack = null; - if(interactTag.contains("stack")){ - stack = ANCodecs.decode(StoredItemStack.CODEC, interactTag.get("stack")); - } - StorageTerminalMenu.SlotAction action = StorageTerminalMenu.SlotAction.values()[interactTag.getInt("action")]; - handler.onInteract(stack, action, pullOne); - } - - public List getAsList() { - return new ArrayList<>(this.itemList.values()); - } - - public long getAmount(StoredItemStack stack) { - StoredItemStack s = itemList.get(stack); - return s != null ? s.getQuantity() : 0L; - } - - public static ResourceLocation getItemId(Item item) { - return BuiltInRegistries.ITEM.getKey(item); - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ANButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ANButton.java index 6550f0774a..bdbf46e12f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ANButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ANButton.java @@ -3,12 +3,13 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import net.minecraft.client.gui.components.Button; import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.NotNull; import java.util.List; public class ANButton extends Button implements ITooltipProvider { - public ANButton(int x, int y, int w, int h, Component text, OnPress onPress) { + public ANButton(int x, int y, int w, int h, @NotNull Component text, OnPress onPress) { super(x, y, w, h, text, onPress, Button.DEFAULT_NARRATION); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiImageButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiImageButton.java index 0045635b36..ff3c45bc71 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiImageButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiImageButton.java @@ -26,7 +26,7 @@ public GuiImageButton(int x, int y, int u, int v, int w, int h, int image_width, } public GuiImageButton(int x, int y, int u, int v, int w, int h, int image_width, int image_height, ResourceLocation image, Button.OnPress onPress) { - super(x, y, w, h, Component.literal(""), onPress); + super(x, y, w, h, Component.empty(), onPress); this.x = x; this.y = y; this.u = u; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/StateButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/StateButton.java index 2c296b190f..1d3d056f3c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/StateButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/StateButton.java @@ -5,6 +5,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; public class StateButton extends ANButton{ @@ -17,7 +18,7 @@ public class StateButton extends ANButton{ public int imageWidth; public int imageHeight; public StateButton(int x, int y, int width, int height, int imageWidth, int imageHeight, int tile, ResourceLocation texture, OnPress pressable) { - super(x, y, width, height, null, pressable); + super(x, y, width, height, Component.empty(), pressable); this.tile = tile; this.texture = texture; this.imageWidth = imageWidth; @@ -36,7 +37,6 @@ public void renderWidget(GuiGraphics p_281670_, int mouseX, int mouseY, float pt RenderSystem.setShader(GameRenderer::getPositionTexShader); RenderSystem.setShaderTexture(0, texture); this.isHovered = mouseX >= x && mouseY >= y && mouseX < x + this.width && mouseY < y + this.height; - //int i = this.getYImage(this.isHovered); RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/CraftingTerminalTransferHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/CraftingTerminalTransferHandler.java index b60ec3b06e..e8d60af81c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/CraftingTerminalTransferHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/CraftingTerminalTransferHandler.java @@ -3,6 +3,8 @@ import com.hollingsworth.arsnouveau.client.container.CraftingTerminalMenu; import com.hollingsworth.arsnouveau.client.container.IAutoFillTerminal; import com.hollingsworth.arsnouveau.client.container.StoredItemStack; +import com.hollingsworth.arsnouveau.common.network.ClientToServerStoragePacket; +import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.setup.registry.MenuRegistry; import mezz.jei.api.constants.RecipeTypes; import mezz.jei.api.constants.VanillaTypes; @@ -116,7 +118,7 @@ public Class getContainerClass() { } } compound.put("i", list); - term.sendMessage(compound); + Networking.sendToServer(new ClientToServerStoragePacket(compound)); } if(!missing.isEmpty()) { From 899f6dda02634d3a481eb1e8ad0f4c2b6db756c9 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 20 Jul 2024 12:45:39 -0500 Subject: [PATCH 077/363] scope more client side vals to screen --- .../arsnouveau/api/spell/SpellSlotMap.java | 14 +++++++++ .../AbstractStorageTerminalScreen.java | 31 +++++++++++++------ .../client/container/StorageTerminalMenu.java | 31 +++++-------------- 3 files changed, 43 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSlotMap.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSlotMap.java index 5890422852..ddb7a6a02b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSlotMap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSlotMap.java @@ -8,6 +8,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.Objects; public record SpellSlotMap(Map slots) { @@ -43,4 +44,17 @@ public Spell get(int slot) { public SpellSlotMap put(int slot, Spell spell){ return new SpellSlotMap(Util.copyAndPut(slots, slot, spell)); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SpellSlotMap that = (SpellSlotMap) o; + return Objects.equals(slots, that.slots); + } + + @Override + public int hashCode() { + return Objects.hashCode(slots); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java index bcbfd7aa30..0e5e15c35f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java @@ -23,6 +23,7 @@ import net.minecraft.client.renderer.GameRenderer; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; @@ -80,12 +81,13 @@ public List load(StoredItemStack key) { public List tabButtons = new ArrayList<>(); public String selectedTab = null; + boolean noSort; + List itemsSorted = new ArrayList<>(); List itemsUnsorted = new ArrayList<>(); public AbstractStorageTerminalScreen(T screenContainer, Inventory inv, Component titleIn) { super(screenContainer, inv, titleIn); - screenContainer.onPacket = this::onPacket; } protected void onPacket() { @@ -99,13 +101,13 @@ protected void onPacket() { buttonSearchType.state = searchType; expanded = s.expanded; } - if(menu.tabNames != null && !menu.tabNames.isEmpty()){ + if(tabNames != null && !tabNames.isEmpty()){ for(StorageTabButton tabButton : tabButtons){ tabButton.visible = false; } // Set isAll tab visible tabButtons.get(0).visible = true; - List names = new ArrayList<>(new HashSet<>(menu.tabNames)); + List names = new ArrayList<>(new HashSet<>(tabNames)); names.sort(String::compareToIgnoreCase); for(int i = 0; i < names.size() && i < tabButtons.size(); i++){ tabButtons.get(i+1).visible = true; @@ -251,7 +253,7 @@ protected void updateSearch() { } catch (Exception e) { e.printStackTrace(); } - Collections.sort(this.itemsSorted, menu.noSort ? sortComp : comparator); + Collections.sort(this.itemsSorted, noSort ? sortComp : comparator); if(!searchLast.equals(searchString)) { this.scrollTo(0); this.currentScroll = 0; @@ -317,7 +319,7 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTi int j1 = l + rowCount * 18; if(hasShiftDown()) { - if(!menu.noSort) { + if(!noSort) { List list = this.itemsSorted; Object2IntMap map = new Object2IntOpenHashMap<>(); map.defaultReturnValue(Integer.MAX_VALUE); @@ -325,11 +327,11 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTi map.put(list.get(m), m); } sortComp = Comparator.comparing(map::getInt); - menu.noSort = true; + noSort = true; } - } else if(menu.noSort) { + } else if(noSort) { sortComp = null; - menu.noSort = false; + noSort = false; refreshItemList = true; this.itemsUnsorted = new ArrayList<>(menu.itemList); } @@ -561,13 +563,24 @@ protected void onUpdateSearch(String text) {} public void receive(CompoundTag tag) { menu.receiveClientNBTPacket(tag); refreshItemList = true; + if(tag.contains("tabs")){ + ListTag tabs = tag.getList("tabs", 10); + tabNames = new ArrayList<>(); + for(int i = 0;i < tabs.size();i++){ + tabNames.add(tabs.getCompound(i).getString("name")); + } + Collections.sort(tabNames); + } + + + this.onPacket(); } public void updateItems(List items){ menu.updateItems(items); refreshItemList = true; - if(menu.noSort) { + if(noSort) { itemsUnsorted.forEach(s ->{ StoredItemStack mapStack = menu.itemMap.get(s); s.setCount(mapStack != null ? mapStack.getQuantity() : 0L); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java index 06ee56c9c0..2212bc7cd6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java @@ -31,13 +31,9 @@ public class StorageTerminalMenu extends RecipeBookMenu storageSlotList = new ArrayList<>(); public List itemList = new ArrayList<>(); - private int lines; - protected Inventory pinv; - public Runnable onPacket; + protected Inventory pinv; public SortSettings terminalData = null; public String search; - public boolean noSort; - public List tabNames = new ArrayList<>(); public String selectedTab = null; public Map itemMap = new HashMap<>(); @@ -76,18 +72,14 @@ protected void addPlayerSlots(Inventory playerInventory, int x, int y) { public void addStorageSlots(int x, int y) { storageSlotList.clear(); - lines = this.terminalData == null || !terminalData.expanded ? 3 : 7; - for (int i = 0;i < lines;++i) { + int lines = this.terminalData == null || !terminalData.expanded ? 3 : 7; + for (int i = 0; i < lines; ++i) { for (int j = 0;j < 9;++j) { - this.addSlotToContainer(new SlotStorage(this.te, i * 9 + j, x + j * 18, y + i * 18)); + storageSlotList.add(new SlotStorage(this.te, i * 9 + j, x + j * 18, y + i * 18)); } } } - protected final void addSlotToContainer(SlotStorage slotStorage) { - storageSlotList.add(slotStorage); - } - @Override public boolean stillValid(Player playerIn) { return te != null && te.canInteractWith(playerIn); @@ -226,15 +218,6 @@ public final void receiveClientNBTPacket(CompoundTag message) { addStorageSlots(); } } - if(message.contains("tabs")){ - ListTag tabs = message.getList("tabs", 10); - tabNames = new ArrayList<>(); - for(int i = 0;i < tabs.size();i++){ - tabNames.add(tabs.getCompound(i).getString("name")); - } - Collections.sort(tabNames); - } - if(onPacket != null)onPacket.run(); } @@ -243,7 +226,7 @@ public void receive(HolderLookup.Provider reg, CompoundTag message) { if(message.contains("search")) { te.setLastSearch(message.getString("search")); } - this.receiveInteract(message, this); + this.receiveInteract(message); if(message.contains("termData")) { CompoundTag d = message.getCompound("termData"); te.setSorting(SortSettings.fromTag(d.getCompound("sortSettings"))); @@ -254,7 +237,7 @@ public void receive(HolderLookup.Provider reg, CompoundTag message) { } } - public void receiveInteract(CompoundTag tag, StorageTerminalMenu handler) { + public void receiveInteract(CompoundTag tag) { if(!tag.contains("interaction")) return; @@ -265,7 +248,7 @@ public void receiveInteract(CompoundTag tag, StorageTerminalMenu handler) { stack = ANCodecs.decode(StoredItemStack.CODEC, interactTag.get("stack")); } StorageTerminalMenu.SlotAction action = StorageTerminalMenu.SlotAction.values()[interactTag.getInt("action")]; - handler.onInteract(stack, action, pullOne); + onInteract(stack, action, pullOne); } @Override From bc507085ccb43ca95cfc9db61ad855f3ebed42d6 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 20 Jul 2024 14:11:46 -0500 Subject: [PATCH 078/363] fix caster equality --- .../api/item/inv/InventoryManager.java | 4 ++++ .../arsnouveau/api/sound/SpellSound.java | 4 ++-- .../arsnouveau/api/spell/AbstractCaster.java | 6 +++++- .../arsnouveau/api/spell/AbstractSpellPart.java | 14 ++++++++++++++ .../arsnouveau/api/spell/Spell.java | 7 ++++--- .../arsnouveau/api/spell/SpellSlotMap.java | 17 ++++++++--------- .../client/particle/ParticleColor.java | 14 ++++++++++++++ .../arsnouveau/common/util/ANCodecs.java | 14 +++++++------- 8 files changed, 58 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/InventoryManager.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/InventoryManager.java index aa9f75d770..1bcbf39c24 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/InventoryManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/InventoryManager.java @@ -10,6 +10,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.ItemHandlerHelper; + import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -180,6 +181,9 @@ public MultiExtractedReference extractAllFromHandler(FilterableItemHandler filte IItemHandler itemHandler = filterableItemHandler.getHandler(); for (int i = 0; i < itemHandler.getSlots(); i++) { ItemStack stack = itemHandler.extractItem(i, remaining, true); + if(stack.isEmpty()){ + continue; + } if (!ItemStack.isSameItem(stack, desiredStack) || !ItemStack.isSameItemSameComponents(stack, desiredStack)) { continue; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java b/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java index 11e6a384a9..f6d0d042ba 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/sound/SpellSound.java @@ -58,12 +58,12 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; SpellSound that = (SpellSound) o; - return Objects.equals(soundEvent, that.soundEvent) && Objects.equals(soundName, that.soundName); + return Objects.equals(id, that.id) ; } @Override public int hashCode() { - return Objects.hash(soundEvent, soundName); + return Objects.hash(id); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java index fadc443679..7ea8472688 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java @@ -330,7 +330,11 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; AbstractCaster caster = (AbstractCaster) o; - return slot == caster.slot && isHidden == caster.isHidden && maxSlots == caster.maxSlots && Objects.equals(spells, caster.spells) && Objects.equals(flavorText, caster.flavorText) && Objects.equals(hiddenText, caster.hiddenText); + return slot == caster.slot && isHidden == caster.isHidden + && maxSlots == caster.maxSlots + && Objects.equals(spells, caster.spells) + && Objects.equals(flavorText, caster.flavorText) + && Objects.equals(hiddenText, caster.hiddenText); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java index ce41c4e250..5fa9ad3b2d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java @@ -15,6 +15,7 @@ import javax.annotation.Nullable; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; @@ -280,4 +281,17 @@ public String getLocalizationKey() { public String getLocaleName() { return Component.translatable(getLocalizationKey()).getString(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AbstractSpellPart that = (AbstractSpellPart) o; + return Objects.equals(registryName, that.registryName); + } + + @Override + public int hashCode() { + return Objects.hashCode(registryName); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java index 94b9cd60f2..c8f765da41 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/Spell.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.api.spell; +import com.google.common.collect.ImmutableList; import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.mojang.serialization.Codec; @@ -51,7 +52,7 @@ public class Spell { public Spell() { - this("", ParticleColor.defaultParticleColor(), ConfiguredSpellSound.DEFAULT, new ArrayList<>()); + this("", ParticleColor.defaultParticleColor(), ConfiguredSpellSound.DEFAULT, ImmutableList.of()); } public Spell(AbstractSpellPart... spellParts) { @@ -66,7 +67,7 @@ public Spell(String name, ParticleColor color, ConfiguredSpellSound configuredSp this.name = name; this.color = color; this.sound = configuredSpellSound; - this.recipe = abstractSpellParts; + this.recipe = ImmutableList.copyOf(abstractSpellParts); } public ConfiguredSpellSound sound(){ @@ -117,7 +118,7 @@ public Spell add(AbstractSpellPart spellPart, int count) { } public Spell setRecipe(@NotNull List recipe) { - return new Spell(name, color, sound, new ArrayList<>(recipe)); + return new Spell(name, color, sound, ImmutableList.copyOf(recipe)); } public Spell withColor(@NotNull ParticleColor color) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSlotMap.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSlotMap.java index ddb7a6a02b..080d493786 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSlotMap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSlotMap.java @@ -1,12 +1,12 @@ package com.hollingsworth.arsnouveau.api.spell; +import com.google.common.collect.ImmutableMap; import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.mojang.serialization.Codec; import net.minecraft.Util; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; -import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -24,14 +24,13 @@ public record SpellSlotMap(Map slots) { } }, (buf) -> { int size = buf.readInt(); - Map slots = Util.make(new HashMap<>(), map -> { - for (int i = 0; i < size; i++) { - int key = buf.readInt(); - Spell value = Spell.STREAM.decode(buf); - map.put(key, value); - } - }); - return new SpellSlotMap(slots); + var immutableMap = ImmutableMap.builder(); + for (int i = 0; i < size; i++) { + int key = buf.readInt(); + Spell value = Spell.STREAM.decode(buf); + immutableMap.put(key, value); + } + return new SpellSlotMap(immutableMap.build()); }); public Spell getOrDefault(int slot, Spell spell) { return slots.getOrDefault(slot, spell); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java index 6da50d71a6..e8399bea2a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleColor.java @@ -12,6 +12,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; +import java.util.Objects; import java.util.Random; /** @@ -188,6 +189,19 @@ public ParticleColor clone() { } } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ParticleColor that = (ParticleColor) o; + return Objects.equals(getRegistryName(), that.getRegistryName()) && Float.compare(r, that.r) == 0 && Float.compare(g, that.g) == 0 && Float.compare(b, that.b) == 0 && color == that.color; + } + + @Override + public int hashCode() { + return Objects.hash(getRegistryName(), r, g, b, color); + } + @Deprecated(forRemoval = true) public static class IntWrapper implements Cloneable { public int r; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java index 86ca1af25f..d13e2d6d37 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.common.util; +import com.google.common.collect.ImmutableMap; import com.google.gson.JsonElement; import com.mojang.datafixers.util.*; import com.mojang.serialization.Codec; @@ -10,7 +11,6 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.phys.Vec2; -import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.function.Function; @@ -43,14 +43,14 @@ public static JsonElement toJson(Codec codec, T value){ */ public static Codec intMap(Codec codec, Function, Obj> constructor, Function> intMap){ return Codec.unboundedMap(Codec.STRING, codec).xmap((stringMap) ->{ - Map map = new HashMap<>(stringMap.size()); - stringMap.forEach((key, value) -> map.put(Integer.parseInt(key), value)); - return constructor.apply(map); + var builder = ImmutableMap.builder(); + stringMap.forEach((key, value) -> builder.put(Integer.parseInt(key), value)); + return constructor.apply(builder.build()); }, obj -> { var ints = intMap.apply(obj); - Map stringMap = new HashMap<>(ints.size()); - ints.forEach((key, value) -> stringMap.put(key.toString(), value)); - return stringMap; + var builder = ImmutableMap.builder(); + ints.forEach((key, value) -> builder.put(key.toString(), value)); + return builder.build(); }); } From 22d6a84611fb9ab184ae80d19ac3485c35833647 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 20 Jul 2024 14:29:34 -0500 Subject: [PATCH 079/363] fix light packet crash --- .../arsnouveau/common/light/LightManager.java | 11 +++++------ .../common/network/PacketAddFadingLight.java | 10 ++++++++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java b/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java index 6934e9aef1..207d1bafc3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java @@ -5,7 +5,6 @@ import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; @@ -189,8 +188,8 @@ public static void removeLightSource(LambDynamicLight lightSource) { it = sourceIterator.next(); if (it.equals(lightSource)) { sourceIterator.remove(); - if (Minecraft.getInstance().level != null) - lightSource.lambdynlights$scheduleTrackedChunksRebuild(Minecraft.getInstance().levelRenderer); + if (ArsNouveau.proxy.getMinecraft().level != null) + lightSource.lambdynlights$scheduleTrackedChunksRebuild(ArsNouveau.proxy.getMinecraft().levelRenderer); break; } } @@ -209,10 +208,10 @@ public static void clearLightSources() { while (sourceIterator.hasNext()) { it = sourceIterator.next(); sourceIterator.remove(); - if (Minecraft.getInstance().levelRenderer != null) { + if (ArsNouveau.proxy.getMinecraft().levelRenderer != null) { if (it.getLuminance() > 0) it.resetDynamicLight(); - it.lambdynlights$scheduleTrackedChunksRebuild(Minecraft.getInstance().levelRenderer); + it.lambdynlights$scheduleTrackedChunksRebuild(ArsNouveau.proxy.getMinecraft().levelRenderer); } } LightManager.jarHoldingEntityList = new ArrayList<>(); @@ -242,7 +241,7 @@ public static void scheduleChunkRebuild(@NotNull LevelRenderer renderer, long ch } public static void scheduleChunkRebuild(@NotNull LevelRenderer renderer, int x, int y, int z) { - if (Minecraft.getInstance().level != null) + if (ArsNouveau.proxy.getMinecraft().level != null) renderer.setSectionDirty(x, y, z); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAddFadingLight.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAddFadingLight.java index 9c41ccd3c0..3c25bb2455 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAddFadingLight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketAddFadingLight.java @@ -52,7 +52,13 @@ public Type type() { @Override public void onClientReceived(Minecraft minecraft, Player player) { - if (LightManager.shouldUpdateDynamicLight()) - EventQueue.getClientQueue().addEvent(new FadeLightTimedEvent(Minecraft.getInstance().level, new Vec3(x,y, z), Config.TOUCH_LIGHT_DURATION.get(), Config.TOUCH_LIGHT_LUMINANCE.get())); + Handle.handle(this, minecraft, player); + } + + private static class Handle{ + public static void handle(PacketAddFadingLight packet, Minecraft minecraft, Player player){ + if (LightManager.shouldUpdateDynamicLight()) + EventQueue.getClientQueue().addEvent(new FadeLightTimedEvent(minecraft.level, new Vec3(packet.x, packet.y, packet.z), Config.TOUCH_LIGHT_DURATION.get(), Config.TOUCH_LIGHT_LUMINANCE.get())); + } } } From 07ccca85db00616dc145619146d8696e667718f4 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 20 Jul 2024 14:36:49 -0500 Subject: [PATCH 080/363] Delete TerminalSyncManager.java --- .../client/container/TerminalSyncManager.java | 64 ------------------- 1 file changed, 64 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java deleted file mode 100644 index d2d7288a1c..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/TerminalSyncManager.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.hollingsworth.arsnouveau.client.container; - - -import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import it.unimi.dsi.fastutil.objects.Object2LongMap; -import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; - -import java.util.HashMap; -import java.util.Map; - -public class TerminalSyncManager { - private Object2LongMap items = new Object2LongOpenHashMap<>(); - private Map itemList = new HashMap<>(); - private Object2IntMap idMap = new Object2IntOpenHashMap<>(); - private Int2ObjectMap idMap2 = new Int2ObjectArrayMap<>(); - private int lastId = 1; - -// private void writeStack(FriendlyByteBuf buf, StoredItemStack stack) { -// ItemStack st = stack.getStack(); -// Item item = st.getItem(); -// CompoundTag compoundtag = getSyncTag(st); -// byte flags = (byte) ((stack.getQuantity() == 0 ? 1 : 0) | (compoundtag != null ? 2 : 0)); -// boolean wr = true; -// int id = idMap.getInt(stack); -// if(id != 0) { -// flags |= 4; -// wr = false; -// } -// buf.writeByte(flags); -// buf.writeVarInt(idMap.computeIfAbsent(stack, s -> { -// int i = lastId++; -// idMap2.put(i, (StoredItemStack) s); -// return i; -// })); -// if(wr)writeItemId(buf, item); -// if(stack.getQuantity() != 0)buf.writeVarLong(stack.getQuantity()); -// if(wr && compoundtag != null)buf.writeNbt(compoundtag); -// } -// -// private StoredItemStack read(FriendlyByteBuf buf) { -// byte flags = buf.readByte(); -// int id = buf.readVarInt(); -// boolean rd = (flags & 4) == 0; -// StoredItemStack stack; -// if(rd) { -// stack = new StoredItemStack(ItemStack.STREAM_CODEC.decode(buf)); -// } else { -// stack = new StoredItemStack(idMap2.get(id).getStack()); -// } -// long count = (flags & 1) != 0 ? 0 : buf.readVarLong(); -// stack.setCount(count); -// if(rd && (flags & 2) != 0) { -// //todo: check storage terminal for this -//// stack.getStack(). -//// stack.getStack().setTag(buf.readNbt()); -// } -// idMap.put(stack, id); -// idMap2.put(id, stack); -// return stack; -// } -} From 90d72fdbd3bd2dd9305f0ed021042364e8739e8e Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 20 Jul 2024 17:18:48 -0500 Subject: [PATCH 081/363] fix scryer camera --- .../hollingsworth/arsnouveau/ArsNouveau.java | 8 +- .../api/camera/ICameraMountable.java | 9 +- .../common/entity/ScryerCamera.java | 49 ++++++-- .../common/items/data/ItemScrollData.java | 2 +- .../mixin/camera/ANServerPlayerMixin.java | 2 + .../common/mixin/camera/ChunkMapMixin.java | 110 ++++++++---------- .../mixin/camera/ClientChunkCacheMixin.java | 56 ++++++--- .../mixin/camera/LevelRendererMixin.java | 2 +- .../common/mixin/camera/MinecraftMixin.java | 2 +- .../common/mixin/camera/PlayerListMixin.java | 2 +- .../mixin/camera/TrackedEntityMixin.java | 33 +----- .../common/network/PacketMountCamera.java | 10 +- .../resources/META-INF/accesstransformer.cfg | 1 + 13 files changed, 165 insertions(+), 121 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java index 1c722a2f04..ddfb6ca021 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java +++ b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java @@ -55,7 +55,12 @@ public class ArsNouveau { public static boolean optifineLoaded = false; public static boolean sodiumLoaded = false; public static boolean patchouliLoaded = false; - public static TicketController ticketController; + public static TicketController ticketController = new TicketController(ArsNouveau.prefix("ticket_controller"), (level, ticketHelper) -> { + ticketHelper.getEntityTickets().forEach(((uuid, chunk) -> { + if (level.getEntity(uuid) == null) + ticketHelper.removeAllTickets(uuid); + })); + }); public ArsNouveau(IEventBus modEventBus, ModContainer modContainer){ NeoForge.EVENT_BUS.addListener(FMLEventHandler::onServerStopped); caelusLoaded = ModList.get().isLoaded("caelus"); @@ -79,7 +84,6 @@ public ArsNouveau(IEventBus modEventBus, ModContainer modContainer){ modEventBus.addListener(this::postModLoadEvent); modEventBus.addListener(this::clientSetup); modEventBus.addListener((RegisterTicketControllersEvent e) ->{ - ticketController = new TicketController(ArsNouveau.prefix("ticket_controller")); e.register(ticketController); }); ANCriteriaTriggers.init(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java b/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java index 27713014e5..99cd426acb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/camera/ICameraMountable.java @@ -8,6 +8,7 @@ import net.minecraft.core.SectionPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; @@ -19,7 +20,8 @@ default void mountCamera(Level level, BlockPos pos, Player player) { ServerLevel serverLevel = (ServerLevel) level; ServerPlayer serverPlayer = (ServerPlayer) player; SectionPos chunkPos = SectionPos.of(pos); - int viewDistance = serverPlayer.server.getPlayerList().getViewDistance(); + int viewDistance = Mth.clamp(serverPlayer.requestedViewDistance(), 2, serverPlayer.server.getPlayerList().getViewDistance()); + Entity var10 = serverPlayer.getCamera(); ScryerCamera dummyEntity; if (var10 instanceof ScryerCamera cam) { @@ -28,11 +30,12 @@ default void mountCamera(Level level, BlockPos pos, Player player) { dummyEntity = new ScryerCamera(level, pos); } - level.addFreshEntity(dummyEntity); + level.addFreshEntity(dummyEntity); + dummyEntity.setChunkLoadingDistance(viewDistance); for (int x = chunkPos.getX() - viewDistance; x <= chunkPos.getX() + viewDistance; x++) { for (int z = chunkPos.getZ() - viewDistance; z <= chunkPos.getZ() + viewDistance; z++) { - ArsNouveau.ticketController.forceChunk(serverLevel, dummyEntity, x, z, true, true); + ArsNouveau.ticketController.forceChunk(serverLevel, dummyEntity, x, z, true, false); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/ScryerCamera.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/ScryerCamera.java index e69de8087d..ea21c7a702 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/ScryerCamera.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/ScryerCamera.java @@ -14,13 +14,18 @@ import net.minecraft.core.SectionPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ChunkTrackingView; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; +import java.util.ArrayList; +import java.util.List; + /** * Camera work is taken from SecurityCraft: * https://github.com/Geforce132/SecurityCraft/blob/1.18.2/src/main/java/net/geforcemods/securitycraft/entity/camera/SecurityCamera.java @@ -35,6 +40,9 @@ public class ScryerCamera extends Entity { public boolean zooming; private int viewDistance; private boolean loadedChunks; + boolean hasSentChunks; + private ChunkTrackingView cameraChunks = null; + private static final List DISMOUNTED_PLAYERS = new ArrayList<>(); public ScryerCamera(EntityType type, Level level) { super(type, level); @@ -88,6 +96,10 @@ private void setInitialPitchYaw() { } + public static boolean hasRecentlyDismounted(Player player) { + return DISMOUNTED_PLAYERS.remove(player); + } + protected boolean repositionEntityAfterLoad() { return false; } @@ -116,6 +128,23 @@ public void tick() { } + public ChunkTrackingView getCameraChunks() { + return cameraChunks; + } + + public void setChunkLoadingDistance(int chunkLoadingDistance) { + cameraChunks = ChunkTrackingView.of(chunkPosition(), chunkLoadingDistance); + } + + + public boolean hasSentChunks() { + return hasSentChunks; + } + + public void setHasSentChunks(boolean hasSentChunks) { + this.hasSentChunks = hasSentChunks; + } + public float getZoomAmount() { return this.zoomAmount; } @@ -131,11 +160,17 @@ public void setRotation(float yaw, float pitch) { public void stopViewing(ServerPlayer player) { if (!this.level.isClientSide) { - this.discardCamera(); + this.discard(); player.camera = player; Networking.sendToPlayerClient(new PacketSetCameraView(player), player); + DISMOUNTED_PLAYERS.add(player); } + } + @Override + public void remove(RemovalReason pReason) { + super.remove(pReason); + discardCamera(); } public void discardCamera() { @@ -145,17 +180,15 @@ public void discardCamera() { camMount.stopViewing(); } - SectionPos chunkPos = SectionPos.of(this.blockPosition()); - int view = this.viewDistance <= 0 ? this.level.getServer().getPlayerList().getViewDistance() : this.viewDistance; + SectionPos chunkPos = SectionPos.of(blockPosition()); + int chunkLoadingDistance = cameraChunks instanceof ChunkTrackingView.Positioned positionedChunks ? positionedChunks.viewDistance() : level().getServer().getPlayerList().getViewDistance(); - for (int x = chunkPos.getX() - view; x <= chunkPos.getX() + view; x++) { - for (int z = chunkPos.getZ() - view; z <= chunkPos.getZ() + view; z++) { - ArsNouveau.ticketController.forceChunk((ServerLevel) this.level, this, x, z, false, false); + for (int x = chunkPos.getX() - chunkLoadingDistance; x <= chunkPos.getX() + chunkLoadingDistance; x++) { + for (int z = chunkPos.getZ() - chunkLoadingDistance; z <= chunkPos.getZ() + chunkLoadingDistance; z++) { + ArsNouveau.ticketController.forceChunk((ServerLevel) level(), this, x, z, false, false); } } } - - this.discard(); } public void setHasLoadedChunks(int initialViewDistance) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java index bba47ce65a..f1548e8feb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java @@ -66,7 +66,7 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ItemScrollData that = (ItemScrollData) o; - return Objects.equals(getItems(), that.getItems()); + return ItemStack.listMatches(items, that.items); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ANServerPlayerMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ANServerPlayerMixin.java index b44311ac5e..60c936b4e4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ANServerPlayerMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ANServerPlayerMixin.java @@ -16,4 +16,6 @@ public class ANServerPlayerMixin { private boolean shouldMove(ServerPlayer player, double x, double y, double z, float yaw, float pitch) { return !CameraUtil.isPlayerMountedOnCamera(player); } + + } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ChunkMapMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ChunkMapMixin.java index ca1a240f15..8633dc3fed 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ChunkMapMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ChunkMapMixin.java @@ -1,73 +1,65 @@ package com.hollingsworth.arsnouveau.common.mixin.camera; +import com.hollingsworth.arsnouveau.common.entity.ScryerCamera; +import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.server.level.ChunkMap; +import net.minecraft.server.level.ChunkTrackingView; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.chunk.LevelChunk; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -// https://github.com/Geforce132/SecurityCraft/blob/1.18.2/src/main/java/net/geforcemods/securitycraft/mixin/camera/ChunkMapMixin.java +// https://github.com/Geforce132/an/blob/1.18.2/src/main/java/net/geforcemods/an/mixin/camera/ChunkMapMixin.java @Mixin( value = {ChunkMap.class}, priority = 1100 ) public abstract class ChunkMapMixin { - //todo: reenable scryer camera -// @Shadow -// int viewDistance; -// -// public ChunkMapMixin() { -// } -// -// @Shadow -// protected abstract void updateChunkTracking(ServerPlayer var1, ChunkPos var2, MutableObject var3, boolean var4, boolean var5); -// -// @Shadow -// public abstract List getPlayers(ChunkPos var1, boolean var2); -// @Inject( -// method = {"setViewDistance"}, -// at = {@At( -// value = "NEW", -// target = "org/apache/commons/lang3/mutable/MutableObject", -// shift = At.Shift.AFTER -// )}, -// locals = LocalCapture.CAPTURE_FAILSOFT, -// cancellable = true, -// remap = false -// ) -// private void updateAccordingToCamera(int viewDistance, CallbackInfo callback, int i, int j, ObjectIterator objectIterator, ChunkHolder chunkHolder, ChunkPos chunkPos) { -// MutableObject mutableObject = new MutableObject(); -// this.getPlayers(chunkPos, false).forEach((player) -> { -// SectionPos sectionPos; -// if (CameraUtil.isPlayerMountedOnCamera(player)) { -// sectionPos = SectionPos.of(player.getCamera()); -// } else { -// sectionPos = player.getLastSectionPos(); -// } -// -// boolean flag = ChunkMap.isChunkInRange(chunkPos.x, chunkPos.z, sectionPos.x(), sectionPos.z(), j); -// boolean flag1 = ChunkMap.isChunkInRange(chunkPos.x, chunkPos.z, sectionPos.x(), sectionPos.z(), viewDistance); -// this.updateChunkTracking(player, chunkPos, mutableObject, flag, flag1); -// }); -// callback.cancel(); -// } + @Shadow + protected abstract void markChunkPendingToSend(ServerPlayer player, ChunkPos pos); -// @Inject( -// method = {"move"}, -// at = {@At("TAIL")} -// ) -// private void trackCameraLoadedChunks(ServerPlayer player, CallbackInfo callback) { -// if (CameraUtil.isPlayerMountedOnCamera(player)) { -// SectionPos pos = SectionPos.of(player.getCamera()); -// ScryerCamera camera = (ScryerCamera) player.getCamera(); -// -// for (int i = pos.x() - this.viewDistance; i <= pos.x() + this.viewDistance; ++i) { -// for (int j = pos.z() - this.viewDistance; j <= pos.z() + this.viewDistance; ++j) { -// this.updateChunkTracking(player, new ChunkPos(i, j), new MutableObject(), camera.hasLoadedChunks(), true); -// } -// } -// -// camera.setHasLoadedChunks(this.viewDistance); -// } -// -// } + @Shadow + private static void markChunkPendingToSend(ServerPlayer player, LevelChunk chunk) {} + + /** + * Sends chunks loaded by cameras to the client, and re-sends chunks around the player when they stop viewing a camera to + * preemptively prevent missing chunks when exiting the camera + */ + @Inject(method = "updateChunkTracking", at = @At(value = "HEAD")) + private void an$onUpdateChunkTracking(ServerPlayer player, CallbackInfo callback) { + if (player.getCamera() instanceof ScryerCamera camera) { + if (!camera.hasSentChunks()) { + ChunkTrackingView.difference(player.getChunkTrackingView(), camera.getCameraChunks(), chunkPos -> markChunkPendingToSend(player, chunkPos), chunkPos -> {}); + camera.setHasSentChunks(true); + } + } + else if (ScryerCamera.hasRecentlyDismounted(player)) + player.getChunkTrackingView().forEach(chunkPos -> markChunkPendingToSend(player, chunkPos)); + } + + /** + * Allows chunks that are loaded near a currently active camera (for example by ForcedChunkManager) to be sent to the player + * viewing the camera + */ + @Inject(method = "onChunkReadyToSend", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;getChunkTrackingView()Lnet/minecraft/server/level/ChunkTrackingView;")) + private void an$sendChunksToCameras(LevelChunk chunk, CallbackInfo callback, @Local ServerPlayer player) { + if (player.getCamera() instanceof ScryerCamera camera && camera.getCameraChunks().contains(chunk.getPos())) + markChunkPendingToSend(player, chunk); + } + + /** + * Fixes block updates not getting sent to chunks around cameras by marking all nearby chunks as tracked + */ + @Inject(method = "isChunkTracked", at = @At("HEAD"), cancellable = true) + private void an$onIsChunkTracked(ServerPlayer player, int x, int z, CallbackInfoReturnable callback) { + if (player.getCamera() instanceof ScryerCamera camera && camera.getCameraChunks().contains(x, z) && !player.connection.chunkSender.isPending(ChunkPos.asLong(x, z))) + callback.setReturnValue(true); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ClientChunkCacheMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ClientChunkCacheMixin.java index 6ffec9e77c..99a7fd703d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ClientChunkCacheMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/ClientChunkCacheMixin.java @@ -24,7 +24,7 @@ import java.util.function.Consumer; -// https://github.com/Geforce132/SecurityCraft/blob/1.18.2/src/main/java/net/geforcemods/securitycraft/mixin/camera/ClientChunkCacheMixin.java +// https://github.com/Geforce132/an/blob/1.18.2/src/main/java/net/geforcemods/an/mixin/camera/ClientChunkCacheMixin.java /** * These mixins aim at implementing the camera chunk storage from CameraController into all the places @@ -47,25 +47,43 @@ private static boolean isValidChunk(LevelChunk chunk, int x, int z) { * Initializes the camera storage */ @Inject(method = "", at = @At(value = "TAIL")) - public void onInit(ClientLevel level, int viewDistance, CallbackInfo ci) { + public void an$onInit(ClientLevel level, int viewDistance, CallbackInfo ci) { CameraController.setCameraStorage(ANnewStorage(Math.max(2, viewDistance) + 3)); } /** - * Updates the camera storage with the new view radius + * Updates the camera storage's view radius by creating a new Storage instance with the same view center and chunks as the + * previous one */ - @Inject(method = "updateViewRadius", at = @At(value = "HEAD")) - public void onUpdateViewRadius(int viewDistance, CallbackInfo ci) { - CameraController.setCameraStorage(ANnewStorage(Math.max(2, viewDistance) + 3)); + @Inject(method = "updateViewRadius", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/ClientChunkCache$Storage;(Lnet/minecraft/client/multiplayer/ClientChunkCache;I)V")) + public void an$onUpdateViewRadius(int viewDistance, CallbackInfo ci) { + ClientChunkCache.Storage oldStorage = CameraController.getCameraStorage(); + ClientChunkCache.Storage newStorage = ANnewStorage(Math.max(2, viewDistance) + 3); + + newStorage.viewCenterX = oldStorage.viewCenterX; + newStorage.viewCenterZ = oldStorage.viewCenterZ; + + for (int i = 0; i < oldStorage.chunks.length(); ++i) { + LevelChunk chunk = oldStorage.chunks.get(i); + + if (chunk != null) { + ChunkPos pos = chunk.getPos(); + + if (newStorage.inRange(pos.x, pos.z)) + newStorage.replace(newStorage.getIndex(pos.x, pos.z), chunk); + } + } + + CameraController.setCameraStorage(newStorage); } /** * Handles chunks that are dropped in range of the camera storage */ @Inject(method = "drop", at = @At(value = "HEAD")) - public void onDrop(ChunkPos chunkPos, CallbackInfo ci) { - int x = chunkPos.x; - int z = chunkPos.z; + public void an$onDrop(ChunkPos pos, CallbackInfo ci) { + int x = pos.x; + int z = pos.z; ClientChunkCache.Storage cameraStorage = CameraController.getCameraStorage(); if (cameraStorage.inRange(x, z)) { @@ -75,19 +93,20 @@ public void onDrop(ChunkPos chunkPos, CallbackInfo ci) { if (chunk != null && chunk.getPos().x == x && chunk.getPos().z == z) { NeoForge.EVENT_BUS.post(new ChunkEvent.Unload(chunk)); cameraStorage.replace(i, chunk, null); + } } } /** - * Handles chunks that get sent to the client which are in range of the camera storage, i.e. place them into the storage - * for them to be acquired afterwards + * Handles chunks that get sent to the client which are in range of the camera storage, i.e. place them into the storage for + * them to be acquired afterwards */ @Inject(method = "replaceWithPacketData", at = @At(value = "HEAD"), cancellable = true) - private void onReplace(int x, int z, FriendlyByteBuf buffer, CompoundTag chunkTag, Consumer tagOutputConsumer, CallbackInfoReturnable callback) { + private void an$onReplace(int x, int z, FriendlyByteBuf buffer, CompoundTag chunkTag, Consumer tagOutputConsumer, CallbackInfoReturnable callback) { ClientChunkCache.Storage cameraStorage = CameraController.getCameraStorage(); - if (CameraUtil.isPlayerMountedOnCamera(Minecraft.getInstance().player) && !storage.inRange(x, z) && cameraStorage.inRange(x, z)) { + if (CameraUtil.isPlayerMountedOnCamera(Minecraft.getInstance().player) && cameraStorage.inRange(x, z)) { int index = cameraStorage.getIndex(x, z); LevelChunk chunk = cameraStorage.getChunk(index); ChunkPos chunkPos = new ChunkPos(x, z); @@ -96,10 +115,13 @@ private void onReplace(int x, int z, FriendlyByteBuf buffer, CompoundTag chunkTa chunk = new LevelChunk(level, chunkPos); chunk.replaceWithPacketData(buffer, chunkTag, tagOutputConsumer); cameraStorage.replace(index, chunk); - } else + } + else chunk.replaceWithPacketData(buffer, chunkTag, tagOutputConsumer); level.onChunkLoaded(chunkPos); + + NeoForge.EVENT_BUS.post(new ChunkEvent.Load(chunk, false)); callback.setReturnValue(chunk); } @@ -108,9 +130,9 @@ private void onReplace(int x, int z, FriendlyByteBuf buffer, CompoundTag chunkTa /** * If chunks in range of a camera storage need to be acquired, ask the camera storage about these chunks */ - @Inject(method = "getChunk(IILnet/minecraft/world/level/chunk/status/ChunkStatus;Z)Lnet/minecraft/world/level/chunk/ChunkAccess;", at = @At("TAIL"), cancellable = true) - private void onGetChunk(int x, int z, ChunkStatus requiredStatus, boolean load, CallbackInfoReturnable callback) { - if (CameraUtil.isPlayerMountedOnCamera(Minecraft.getInstance().player) && !storage.inRange(x, z) && CameraController.getCameraStorage().inRange(x, z)) { + @Inject(method = "getChunk(IILnet/minecraft/world/level/chunk/status/ChunkStatus;Z)Lnet/minecraft/world/level/chunk/LevelChunk;", at = @At("TAIL"), cancellable = true) + private void an$onGetChunk(int x, int z, ChunkStatus requiredStatus, boolean load, CallbackInfoReturnable callback) { + if (CameraUtil.isPlayerMountedOnCamera(Minecraft.getInstance().player) && CameraController.getCameraStorage().inRange(x, z)) { LevelChunk chunk = CameraController.getCameraStorage().getChunk(CameraController.getCameraStorage().getIndex(x, z)); if (chunk != null && chunk.getPos().x == x && chunk.getPos().z == z) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/LevelRendererMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/LevelRendererMixin.java index 998726d317..5b18822f11 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/LevelRendererMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/LevelRendererMixin.java @@ -22,7 +22,7 @@ public class LevelRendererMixin { private Minecraft minecraft; @Redirect(method = "setupRender", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ViewArea;repositionCamera(DD)V")) - public void onRepositionCamera(ViewArea viewArea, double x, double z) { + public void anonRepositionCamera(ViewArea viewArea, double x, double z) { if (!CameraUtil.isPlayerMountedOnCamera(minecraft.player)) viewArea.repositionCamera(x, z); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/MinecraftMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/MinecraftMixin.java index 387c4e9fb0..4ad1ea92b8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/MinecraftMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/MinecraftMixin.java @@ -15,7 +15,7 @@ @Mixin(value = Minecraft.class, priority = 1100) public class MinecraftMixin { @WrapWithCondition(method = "handleKeybinds", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Options;setCameraType(Lnet/minecraft/client/CameraType;)V")) - private boolean handleKeybinds(Options options, CameraType newType) { + private boolean anhandleKeybinds(Options options, CameraType newType) { return !ClientCameraUtil.isPlayerMountedOnCamera(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/PlayerListMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/PlayerListMixin.java index 5afcdd276f..f8713c9188 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/PlayerListMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/PlayerListMixin.java @@ -23,7 +23,7 @@ public class PlayerListMixin { @Inject(method = "broadcast", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/server/level/ServerPlayer;getZ()D"), locals = LocalCapture.CAPTURE_FAILSOFT, cancellable = true) - private void broadcastToCameras(Player except, double x, double y, double z, double radius, ResourceKey dimension, Packet packet, CallbackInfo callback, int iteration, ServerPlayer player) { + private void anbroadcastToCameras(Player except, double x, double y, double z, double radius, ResourceKey dimension, Packet packet, CallbackInfo callback, int iteration, ServerPlayer player) { if (CameraUtil.isPlayerMountedOnCamera(player)) { ScryerCamera camera = (ScryerCamera) player.getCamera(); double dX = x - camera.getX(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/TrackedEntityMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/TrackedEntityMixin.java index 6755b44b4d..7b33cab3e8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/TrackedEntityMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/camera/TrackedEntityMixin.java @@ -3,8 +3,8 @@ import com.hollingsworth.arsnouveau.common.entity.ScryerCamera; import com.hollingsworth.arsnouveau.common.util.CameraUtil; +import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.server.level.ChunkMap; -import net.minecraft.server.level.ServerEntity; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.Vec3; @@ -12,12 +12,8 @@ import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; 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.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; /** * https://github.com/Geforce132/SecurityCraft/blob/1.18.2/src/main/java/net/geforcemods/securitycraft/mixin/camera/TrackedEntityMixin.java @@ -25,39 +21,22 @@ */ @Mixin(value = ChunkMap.TrackedEntity.class, priority = 1100) public abstract class TrackedEntityMixin { - @Shadow - @Final - ServerEntity serverEntity; @Shadow @Final Entity entity; - @Unique - private boolean shouldBeSent = false; /** - * Checks if this entity is in range of a camera that is currently being viewed, and stores the result in the field - * shouldBeSent + * Enables entities that are in range of a camera as well as security camera entities to be sent to the client */ - @Inject(method = "updatePlayer", at = @At(value = "FIELD", target = "Lnet/minecraft/world/phys/Vec3;x:D", ordinal = 0), locals = LocalCapture.CAPTURE_FAILSOFT) - private void onUpdatePlayer(ServerPlayer player, CallbackInfo ci, Vec3 vec3, int i, double d0, Vec3 unused, double viewDistance) { + @ModifyVariable(method = "updatePlayer", name = "flag", at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 2)) + public boolean an$modifyFlag(boolean original, ServerPlayer player, @Local(ordinal = 0) double viewDistance) { if (CameraUtil.isPlayerMountedOnCamera(player)) { Vec3 relativePosToCamera = player.getCamera().position().subtract(entity.position()); if (relativePosToCamera.x >= -viewDistance && relativePosToCamera.x <= viewDistance && relativePosToCamera.z >= -viewDistance && relativePosToCamera.z <= viewDistance) - shouldBeSent = true; + return true; } - } - - - /** - * Enables entities that should be sent as well as security camera entities to be sent to the client - */ - // The plugin says this is an invalid signature, but it is. pls do not remove - @ModifyVariable(method = "updatePlayer", name = "flag", at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 1)) - public boolean modifyFlag(boolean original) { - boolean shouldBeSent = this.shouldBeSent; - this.shouldBeSent = false; - return entity instanceof ScryerCamera || original || shouldBeSent; + return entity instanceof ScryerCamera || original; } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketMountCamera.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketMountCamera.java index 979e70fc3d..a1cfff5ba3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketMountCamera.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketMountCamera.java @@ -40,7 +40,15 @@ public static PacketMountCamera decode(RegistryFriendlyByteBuf buf) { @Override public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { Level level = player.level; - if (level.isLoaded(pos) && level.getBlockEntity(pos) instanceof ICameraMountable mountable) { +// ChunkPos chunkPos = new ChunkPos(pos); +// int viewDistance = player.server.getPlayerList().getViewDistance(); +// for (int x = chunkPos.x - viewDistance; x <= chunkPos.x + viewDistance; x++) { +// for (int z = chunkPos.z - viewDistance; z <= chunkPos.z + viewDistance; z++) { +// ArsNouveau.ticketController.forceChunk((ServerLevel) player.level, player, x, z, true, true); +// } +// } + + if (level.getBlockEntity(pos) instanceof ICameraMountable mountable) { mountable.mountCamera(level, pos, player); return; } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 4219c6f32f..1c4994155f 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -65,6 +65,7 @@ public net.minecraft.world.item.ArmorItem f_265987_ # ARMOR_MODIFIER_UUID_PER_TY public net.minecraft.world.entity.Entity maxUpStep # maxUpStep public net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProviderType (Lcom/mojang/serialization/MapCodec;)V # BlockStateProviderType public net.minecraft.world.item.crafting.RecipeManager byKeyTyped(Lnet/minecraft/world/item/crafting/RecipeType;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/world/item/crafting/RecipeHolder; # byKeyTyped +public net.minecraft.client.multiplayer.ClientChunkCache$Storage chunks # chunks # Geckolib ATs, do not delete public net.minecraft.client.model.geom.ModelPart$Cube public net.minecraft.client.model.geom.ModelPart cubes # cubes From 2f00d39eebd27cebac020a998f26c39280f22d19 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 20 Jul 2024 17:23:38 -0500 Subject: [PATCH 082/363] fix stack comparisons --- .../arsnouveau/common/items/data/PersistentFamiliarData.java | 2 +- .../arsnouveau/common/items/data/StarbuncleCharmData.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java index 9f7d442834..88e5bf92ae 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java @@ -82,7 +82,7 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; PersistentFamiliarData that = (PersistentFamiliarData) o; - return Objects.equals(name, that.name) && Objects.equals(color, that.color) && Objects.equals(cosmetic, that.cosmetic); + return Objects.equals(name, that.name) && Objects.equals(color, that.color) && ItemStack.isSameItemSameComponents(cosmetic, that.cosmetic); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java index 3ac92a74c8..f968c0aa3a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java @@ -136,12 +136,12 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; StarbuncleCharmData that = (StarbuncleCharmData) o; - return Objects.equals(name, that.name) && Objects.equals(color, that.color) && Objects.equals(cosmetic, that.cosmetic) && Objects.equals(pathBlock, that.pathBlock) && Objects.equals(bedPos, that.bedPos) && Objects.equals(behavior, that.behavior) && Objects.equals(adopter, that.adopter) && Objects.equals(bio, that.bio); + return Objects.equals(name, that.name) && Objects.equals(color, that.color) && Objects.equals(pathBlock, that.pathBlock) && Objects.equals(bedPos, that.bedPos) && Objects.equals(behavior, that.behavior) && Objects.equals(adopter, that.adopter) && Objects.equals(bio, that.bio) && ItemStack.isSameItemSameComponents(cosmetic.orElse(ItemStack.EMPTY), that.cosmetic.orElse(ItemStack.EMPTY)) && Objects.equals(behaviorTag, that.behaviorTag); } @Override public int hashCode() { - return Objects.hash(name, color, cosmetic, pathBlock, bedPos, behavior, adopter, bio); + return Objects.hash(name, color, cosmetic, pathBlock, bedPos, behavior, adopter, bio, behaviorTag); } public String getColor() { From 75e78f54169e73f7d8e39c17636fb5c04d1eb4fa Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 20 Jul 2024 18:32:47 -0500 Subject: [PATCH 083/363] latest neoforge, 5.0 --- gradle.properties | 4 +- .../hollingsworth/arsnouveau/ArsNouveau.java | 6 +- .../api/registry/GlyphRegistry.java | 6 +- .../arsnouveau/setup/config/ANModConfig.java | 71 ++++++++----------- .../setup/registry/ModEntities.java | 26 +++---- .../resources/META-INF/neoforge.mods.toml | 11 ++- 6 files changed, 61 insertions(+), 63 deletions(-) diff --git a/gradle.properties b/gradle.properties index 5ad4d4d632..8cbec50395 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ neogradle.subsystems.parchment.mappingsVersion=2024.05.01 minecraft_version=1.21.0 parchment_version=2024.05.01 minecraft_version_range=[1.20.6,1.21) -neo_version=21.0.52-beta +neo_version=21.0.113-beta neo_version_range=[20.6,) loader_version_range=[2,) @@ -22,7 +22,7 @@ mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! -jei_version=19.1.1.19 +jei_version=19.5.0.44 curios_version=8.0.0-beta geckolib_version=4.5.6 patchouli_version=85-NEOFORGE diff --git a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java index ddfb6ca021..14cd437619 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java +++ b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java @@ -13,7 +13,6 @@ import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.world.Terrablender; import com.hollingsworth.arsnouveau.setup.ModSetup; -import com.hollingsworth.arsnouveau.setup.config.ANModConfig; import com.hollingsworth.arsnouveau.setup.config.Config; import com.hollingsworth.arsnouveau.setup.config.ServerConfig; import com.hollingsworth.arsnouveau.setup.proxy.ClientProxy; @@ -68,8 +67,9 @@ public ArsNouveau(IEventBus modEventBus, ModContainer modContainer){ sodiumLoaded = ModList.get().isLoaded("rubidium"); patchouliLoaded = ModList.get().isLoaded("patchouli"); APIRegistry.setup(); - ANModConfig serverConfig = new ANModConfig(ModConfig.Type.SERVER, ServerConfig.SERVER_CONFIG, modContainer,MODID + "-server"); - modContainer.addConfig(serverConfig); +// ANModConfig serverConfig = new ANModConfig(ModConfig.Type.SERVER, ServerConfig.SERVER_CONFIG, modContainer,MODID + "-server"); +// modContainer.addConfig(serverConfig); + modContainer.registerConfig(ModConfig.Type.SERVER, ServerConfig.SERVER_CONFIG); modContainer.registerConfig(ModConfig.Type.COMMON, Config.COMMON_CONFIG); modContainer.registerConfig(ModConfig.Type.CLIENT, Config.CLIENT_CONFIG); if (FMLEnvironment.dist.isClient()) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/GlyphRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/GlyphRegistry.java index a497ec46b3..48485001ad 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/GlyphRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/GlyphRegistry.java @@ -2,12 +2,12 @@ import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import com.hollingsworth.arsnouveau.common.items.Glyph; -import com.hollingsworth.arsnouveau.setup.config.ANModConfig; import com.hollingsworth.arsnouveau.setup.config.Config; import net.minecraft.resources.ResourceLocation; import net.neoforged.fml.ModLoadingContext; import net.neoforged.fml.config.ModConfig; import net.neoforged.neoforge.common.ModConfigSpec; + import javax.annotation.Nullable; import java.util.List; import java.util.Map; @@ -39,8 +39,8 @@ public static AbstractSpellPart registerSpell(AbstractSpellPart part) { part.buildConfig(spellBuilder); spec = spellBuilder.build(); part.CONFIG = spec; - ANModConfig anModConfig = new ANModConfig(ModConfig.Type.SERVER, part.CONFIG, ModLoadingContext.get().getActiveContainer(), part.getRegistryName().getNamespace() + "/" + part.getRegistryName().getPath()); - ModLoadingContext.get().getActiveContainer().addConfig(anModConfig); +// ANModConfig anModConfig = new ANModConfig(ModConfig.Type.SERVER, part.CONFIG, ModLoadingContext.get().getActiveContainer(), part.getRegistryName().getNamespace() + "/" + part.getRegistryName().getPath()); + ModLoadingContext.get().getActiveContainer().registerConfig(ModConfig.Type.SERVER, spec, part.getRegistryName().getNamespace() + "/" + part.getRegistryName().getPath()); return spellpartMap.put(part.getRegistryName(), part); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ANModConfig.java b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ANModConfig.java index 7bd3fd26ea..3e3efb2f3d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ANModConfig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ANModConfig.java @@ -1,45 +1,36 @@ package com.hollingsworth.arsnouveau.setup.config; -import com.electronwill.nightconfig.core.file.CommentedFileConfig; -import net.neoforged.fml.ModContainer; -import net.neoforged.fml.config.ConfigFileTypeHandler; -import net.neoforged.fml.config.IConfigSpec; -import net.neoforged.fml.config.ModConfig; -import net.neoforged.fml.loading.FMLPaths; - -import java.nio.file.Path; -import java.util.function.Function; - -public class ANModConfig extends ModConfig { - private static final ANConfigFileTypeHandler AN_TOML = new ANConfigFileTypeHandler(); - - public ANModConfig(ModConfig.Type type, IConfigSpec iConfigSpec, ModContainer container, String fileName) { - super(type, iConfigSpec, container, fileName + ".toml"); - - } -// @Override -// public ConfigFileTypeHandler getHandler() { -// return AN_TOML; +// +//public class ANModConfig extends ModConfig { +// private static final ANConfigFileTypeHandler AN_TOML = new ANConfigFileTypeHandler(); +// +// public ANModConfig(ModConfig.Type type, IConfigSpec iConfigSpec, ModContainer container, String fileName) { +// super(type, iConfigSpec, container, fileName + ".toml"); +// // } - - private static class ANConfigFileTypeHandler extends ConfigFileTypeHandler { - - private static Path getPath(Path configBasePath) { - //Intercept server config path reading for ArsNouveau configs and reroute it to the normal config directory - if (configBasePath.endsWith("serverconfig")) { - return FMLPaths.CONFIGDIR.get(); - } - return configBasePath; - } - - @Override - public Function reader(Path configBasePath) { - return super.reader(getPath(configBasePath)); - } - +//// @Override +//// public ConfigFileTypeHandler getHandler() { +//// return AN_TOML; +//// } +// +// private static class ANConfigFileTypeHandler extends ConfigFileTypeHandler { +// +// private static Path getPath(Path configBasePath) { +// //Intercept server config path reading for ArsNouveau configs and reroute it to the normal config directory +// if (configBasePath.endsWith("serverconfig")) { +// return FMLPaths.CONFIGDIR.get(); +// } +// return configBasePath; +// } +// // @Override -// public void unload(Path configBasePath, ModConfig config) { -// super.unload(getPath(configBasePath), config); +// public Function reader(Path configBasePath) { +// return super.reader(getPath(configBasePath)); // } - } -} +// +//// @Override +//// public void unload(Path configBasePath, ModConfig config) { +//// super.unload(getPath(configBasePath), config); +//// } +// } +//} diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java index be35eafaf0..68f6d251fd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java @@ -30,7 +30,7 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; -import net.neoforged.neoforge.event.entity.SpawnPlacementRegisterEvent; +import net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; @@ -287,20 +287,20 @@ public boolean isNoGravity() { .setTrackingRange(10)); @SubscribeEvent - public static void registerPlacements(SpawnPlacementRegisterEvent event) { - event.register(STARBUNCLE_TYPE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, SpawnPlacementRegisterEvent.Operation.AND); - event.register(GIFT_STARBY.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, SpawnPlacementRegisterEvent.Operation.AND); - event.register(WHIRLISPRIG_TYPE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, SpawnPlacementRegisterEvent.Operation.AND); - event.register(ENTITY_DRYGMY.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, SpawnPlacementRegisterEvent.Operation.AND); + public static void registerPlacements(RegisterSpawnPlacementsEvent event) { + event.register(STARBUNCLE_TYPE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, RegisterSpawnPlacementsEvent.Operation.AND); + event.register(GIFT_STARBY.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, RegisterSpawnPlacementsEvent.Operation.AND); + event.register(WHIRLISPRIG_TYPE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, RegisterSpawnPlacementsEvent.Operation.AND); + event.register(ENTITY_DRYGMY.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, RegisterSpawnPlacementsEvent.Operation.AND); - event.register(WILDEN_GUARDIAN.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::wildenSpawnRules, SpawnPlacementRegisterEvent.Operation.AND); - event.register(WILDEN_HUNTER.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::wildenSpawnRules, SpawnPlacementRegisterEvent.Operation.AND); - event.register(WILDEN_STALKER.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::wildenSpawnRules, SpawnPlacementRegisterEvent.Operation.AND); + event.register(WILDEN_GUARDIAN.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::wildenSpawnRules, RegisterSpawnPlacementsEvent.Operation.AND); + event.register(WILDEN_HUNTER.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::wildenSpawnRules, RegisterSpawnPlacementsEvent.Operation.AND); + event.register(WILDEN_STALKER.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::wildenSpawnRules, RegisterSpawnPlacementsEvent.Operation.AND); - event.register(ENTITY_BLAZING_WEALD.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, SpawnPlacementRegisterEvent.Operation.AND); - event.register(ENTITY_CASCADING_WEALD.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, SpawnPlacementRegisterEvent.Operation.AND); - event.register(ENTITY_FLOURISHING_WEALD.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, SpawnPlacementRegisterEvent.Operation.AND); - event.register(ENTITY_VEXING_WEALD.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, SpawnPlacementRegisterEvent.Operation.AND); + event.register(ENTITY_BLAZING_WEALD.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, RegisterSpawnPlacementsEvent.Operation.AND); + event.register(ENTITY_CASCADING_WEALD.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, RegisterSpawnPlacementsEvent.Operation.AND); + event.register(ENTITY_FLOURISHING_WEALD.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, RegisterSpawnPlacementsEvent.Operation.AND); + event.register(ENTITY_VEXING_WEALD.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, RegisterSpawnPlacementsEvent.Operation.AND); LightManager.init(); } diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml index aa68d5e145..e9960b14e9 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -23,7 +23,7 @@ license="GNU GENERAL PUBLIC LICENSE" # Does this dependency have to exist - if not, ordering below must be specified mandatory=true #mandatory # The version range of the dependency - versionRange="[21,)" #mandatory + versionRange="[21.0.86-beta,)" #mandatory # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory ordering="NONE" # Side this dependency is applied on - BOTH, CLIENT or SERVER @@ -49,4 +49,11 @@ license="GNU GENERAL PUBLIC LICENSE" ordering="AFTER" side="BOTH" [[mixins]] - config="ars_nouveau.mixins.json" \ No newline at end of file + config="ars_nouveau.mixins.json" + +[[dependencies.ars_nouveau]] + modId="jei" + mandatory=true + versionRange="[1.19-5.0.7.1,)" + ordering="AFTER" + side="BOTH" \ No newline at end of file From e88945ef7231e8ca82beff382db5bbe63380a89c Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 22 Jul 2024 20:21:58 -0500 Subject: [PATCH 084/363] 1.21 port of 1.20 merge --- .../imbuement_chamber/IImbuementRecipe.java | 5 - .../api/registry/GenericRecipeRegistry.java | 19 +-- .../api/registry/ImbuementRecipeRegistry.java | 4 +- .../api/registry/MultiRecipeRegistry.java | 13 +- .../AbstractStorageTerminalScreen.java | 2 +- .../component/RotatingItemListComponent.java | 148 +++++++++--------- .../common/block/tile/DrygmyTile.java | 2 +- .../common/mob_jar/WitherBehavior.java | 14 +- 8 files changed, 100 insertions(+), 107 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/imbuement_chamber/IImbuementRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/imbuement_chamber/IImbuementRecipe.java index f1a7b42665..b2e0541293 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/imbuement_chamber/IImbuementRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/imbuement_chamber/IImbuementRecipe.java @@ -1,13 +1,8 @@ package com.hollingsworth.arsnouveau.api.imbuement_chamber; import com.hollingsworth.arsnouveau.common.block.tile.ImbuementTile; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Recipe; public interface IImbuementRecipe extends Recipe { - boolean isMatch(ImbuementTile imbuementTile); - - ItemStack getResult(ImbuementTile imbuementTile); - int getSourceCost(ImbuementTile imbuementTile); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/GenericRecipeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/GenericRecipeRegistry.java index 43cba86676..e457265ea3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/GenericRecipeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/GenericRecipeRegistry.java @@ -1,26 +1,23 @@ package com.hollingsworth.arsnouveau.api.registry; -import net.minecraft.world.Container; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.item.crafting.RecipeType; -import net.minecraftforge.registries.RegistryObject; +import net.minecraft.world.item.crafting.*; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.function.Supplier; -public class GenericRecipeRegistry> { - private final RegistryObject> type; +public class GenericRecipeRegistry> { + private final Supplier> type; - public GenericRecipeRegistry(RegistryObject> type) { + public GenericRecipeRegistry(Supplier> type) { this.type = type; REGISTRIES.add(this); } - public List RECIPES = new ArrayList<>(); + public List> RECIPES = new ArrayList<>(); - public List getRecipes() { + public List> getRecipes() { return Collections.unmodifiableList(RECIPES); } @@ -30,7 +27,7 @@ public RecipeType getType() { public void reload(RecipeManager manager) { RECIPES.clear(); - List recipes = manager.getAllRecipesFor(type.get()); + var recipes = manager.getAllRecipesFor(type.get()); RECIPES.addAll(recipes); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/ImbuementRecipeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/ImbuementRecipeRegistry.java index 9e0e6bad8b..b481667ba3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/ImbuementRecipeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/ImbuementRecipeRegistry.java @@ -1,8 +1,8 @@ package com.hollingsworth.arsnouveau.api.registry; -import com.hollingsworth.arsnouveau.api.imbuement_chamber.IImbuementRecipe; import com.hollingsworth.arsnouveau.common.block.tile.ImbuementTile; +import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; -public class ImbuementRecipeRegistry extends MultiRecipeRegistry { +public class ImbuementRecipeRegistry extends MultiRecipeRegistry { public static ImbuementRecipeRegistry INSTANCE = new ImbuementRecipeRegistry(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/MultiRecipeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/MultiRecipeRegistry.java index 0537f6bb19..09d5db4c95 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/MultiRecipeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/MultiRecipeRegistry.java @@ -1,18 +1,19 @@ package com.hollingsworth.arsnouveau.api.registry; import com.google.common.collect.ImmutableList; -import net.minecraft.world.Container; import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeInput; import net.minecraft.world.item.crafting.RecipeType; -import net.minecraftforge.registries.RegistryObject; import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; -public class MultiRecipeRegistry> { +public class MultiRecipeRegistry> { private final List> recipeRegistries = new ArrayList(); - public void addRecipeType(RegistryObject> recipeType) { + public void addRecipeType(Supplier> recipeType) { recipeRegistries.add(new GenericRecipeRegistry<>(recipeType)); } @@ -24,8 +25,8 @@ public List> getRecipeTypes() { return builder.build(); } - public List getRecipes() { - ImmutableList.Builder builder = ImmutableList.builder(); + public List> getRecipes() { + ImmutableList.Builder> builder = ImmutableList.builder(); for (GenericRecipeRegistry registry : recipeRegistries) { builder.addAll(registry.getRecipes()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java index de69178158..b1c472fd94 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java @@ -566,7 +566,7 @@ public void receive(CompoundTag tag) { if(tag.contains("tabs")){ ListTag tabs = tag.getList("tabs", 10); tabNames = new ArrayList<>(); - for(int i = 0;i < tabs.size();i++){ + for(int i = 0;i < Math.min(tabs.size(), 12);i++){ tabNames.add(tabs.getCompound(i).getString("name")); } Collections.sort(tabNames); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponent.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponent.java index 8b29e8cbfb..22b3495cd8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponent.java @@ -1,76 +1,76 @@ package com.hollingsworth.arsnouveau.client.patchouli.component; -import com.google.common.collect.ImmutableList; -import com.google.gson.annotations.SerializedName; -import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; -import com.hollingsworth.arsnouveau.api.enchanting_apparatus.IEnchantingRecipe; -import com.hollingsworth.arsnouveau.api.imbuement_chamber.IImbuementRecipe; -import com.hollingsworth.arsnouveau.api.registry.ImbuementRecipeRegistry; -import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; -import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; -import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.RecipeType; -import vazkii.patchouli.api.IVariable; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.function.UnaryOperator; - -public class RotatingItemListComponent extends RotatingItemListComponentBase { - @SerializedName("recipe_name") - public String recipeName; - - @SerializedName("recipe_type") - public String recipeType; - - - - @Override - protected List makeIngredients() { - ClientLevel world = Minecraft.getInstance().level; - if (world == null) return new ArrayList<>(); - - Map> map; - if ("enchanting_apparatus".equals(recipeType)) { - EnchantingApparatusRecipe recipe = world.getRecipeManager().getAllRecipesFor(RecipeRegistry.APPARATUS_TYPE.get()).stream().filter(f -> f.id.toString().equals(recipeName)).findFirst().orElse(null); - for(RecipeType type : ArsNouveauAPI.getInstance().getEnchantingRecipeTypes()) { - RecipeType enchantingRecipeRecipeType = (RecipeType) type; - Recipe recipe1 = world.getRecipeManager().getAllRecipesFor(enchantingRecipeRecipeType).stream().filter(f -> f.getId().toString().equals(recipeName)).findFirst().orElse(null); - if(recipe1 instanceof EnchantingApparatusRecipe enchantingApparatusRecipe){ - recipe = enchantingApparatusRecipe; - break; - } - } - return recipe == null ? ImmutableList.of() : recipe.pedestalItems; - } else if ("imbuement_chamber".equals(recipeType)) { - ImbuementRecipe recipe = world.getRecipeManager().getAllRecipesFor(RecipeRegistry.IMBUEMENT_TYPE.get()).stream().filter(f -> f.id.toString().equals(recipeName)).findFirst().orElse(null); - for (RecipeType type : ImbuementRecipeRegistry.INSTANCE.getRecipeTypes()) { - RecipeType imbuementRecipeType = (RecipeType) type; - Recipe recipe1 = world.getRecipeManager().getAllRecipesFor(imbuementRecipeType).stream().filter(f -> f.getId().toString().equals(recipeName)).findFirst().orElse(null); - if (recipe1 instanceof ImbuementRecipe imbuementRecipe){ - recipe = imbuementRecipe; - break; - } - } - return recipe == null ? ImmutableList.of() : recipe.pedestalItems; - } else if ("glyph_recipe".equals(recipeType)) { - GlyphRecipe recipe = (GlyphRecipe) world.getRecipeManager().byKey(new ResourceLocation(recipeName)).orElse(null); - return recipe == null ? ImmutableList.of() : recipe.inputs; - } else { - throw new IllegalArgumentException("Type must be 'enchanting_apparatus', 'glyph_recipe', or 'imbuement_chamber'!"); - } - } - - @Override - public void onVariablesAvailable(UnaryOperator lookup) { - recipeName = lookup.apply(IVariable.wrap(recipeName)).asString(); - recipeType = lookup.apply(IVariable.wrap(recipeType)).asString(); - } -} +//import com.google.common.collect.ImmutableList; +//import com.google.gson.annotations.SerializedName; +//import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; +//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; +//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.IEnchantingRecipe; +//import com.hollingsworth.arsnouveau.api.imbuement_chamber.IImbuementRecipe; +//import com.hollingsworth.arsnouveau.api.registry.ImbuementRecipeRegistry; +//import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; +//import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; +//import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +//import net.minecraft.client.Minecraft; +//import net.minecraft.client.multiplayer.ClientLevel; +//import net.minecraft.resources.ResourceLocation; +//import net.minecraft.world.item.crafting.Ingredient; +//import net.minecraft.world.item.crafting.Recipe; +//import net.minecraft.world.item.crafting.RecipeType; +//import vazkii.patchouli.api.IVariable; +// +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Map; +//import java.util.function.UnaryOperator; +// +//public class RotatingItemListComponent extends RotatingItemListComponentBase { +// @SerializedName("recipe_name") +// public String recipeName; +// +// @SerializedName("recipe_type") +// public String recipeType; +// +// +// +// @Override +// protected List makeIngredients() { +// ClientLevel world = Minecraft.getInstance().level; +// if (world == null) return new ArrayList<>(); +// +// Map> map; +// if ("enchanting_apparatus".equals(recipeType)) { +// EnchantingApparatusRecipe recipe = world.getRecipeManager().getAllRecipesFor(RecipeRegistry.APPARATUS_TYPE.get()).stream().filter(f -> f.id.toString().equals(recipeName)).findFirst().orElse(null); +// for(RecipeType type : ArsNouveauAPI.getInstance().getEnchantingRecipeTypes()) { +// RecipeType enchantingRecipeRecipeType = (RecipeType) type; +// Recipe recipe1 = world.getRecipeManager().getAllRecipesFor(enchantingRecipeRecipeType).stream().filter(f -> f.getId().toString().equals(recipeName)).findFirst().orElse(null); +// if(recipe1 instanceof EnchantingApparatusRecipe enchantingApparatusRecipe){ +// recipe = enchantingApparatusRecipe; +// break; +// } +// } +// return recipe == null ? ImmutableList.of() : recipe.pedestalItems; +// } else if ("imbuement_chamber".equals(recipeType)) { +// ImbuementRecipe recipe = world.getRecipeManager().getAllRecipesFor(RecipeRegistry.IMBUEMENT_TYPE.get()).stream().filter(f -> f.id.toString().equals(recipeName)).findFirst().orElse(null); +// for (RecipeType type : ImbuementRecipeRegistry.INSTANCE.getRecipeTypes()) { +// RecipeType imbuementRecipeType = (RecipeType) type; +// Recipe recipe1 = world.getRecipeManager().getAllRecipesFor(imbuementRecipeType).stream().filter(f -> f.getId().toString().equals(recipeName)).findFirst().orElse(null); +// if (recipe1 instanceof ImbuementRecipe imbuementRecipe){ +// recipe = imbuementRecipe; +// break; +// } +// } +// return recipe == null ? ImmutableList.of() : recipe.pedestalItems; +// } else if ("glyph_recipe".equals(recipeType)) { +// GlyphRecipe recipe = (GlyphRecipe) world.getRecipeManager().byKey(new ResourceLocation(recipeName)).orElse(null); +// return recipe == null ? ImmutableList.of() : recipe.inputs; +// } else { +// throw new IllegalArgumentException("Type must be 'enchanting_apparatus', 'glyph_recipe', or 'imbuement_chamber'!"); +// } +// } +// +// @Override +// public void onVariablesAvailable(UnaryOperator lookup) { +// recipeName = lookup.apply(IVariable.wrap(recipeName)).asString(); +// recipeType = lookup.apply(IVariable.wrap(recipeType)).asString(); +// } +//} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java index bf28d1e11c..c7c1008c65 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java @@ -133,7 +133,7 @@ public void refreshEntitiesAndBonus() { Set uniqueEntities; this.nearbyEntities = new ArrayList<>(); if (this.includeEntities) { - this.nearbyEntities.addAll(level.getEntitiesOfClass(LivingEntity.class, new AABB(getBlockPos().north(10).west(10).below(6), getBlockPos().south(10).east(10).above(6)))); + this.nearbyEntities.addAll(level.getEntitiesOfClass(LivingEntity.class, new AABB(getBlockPos().north(10).west(10).below(6).getBottomCenter(), getBlockPos().south(10).east(10).above(6).getBottomCenter()))); } this.nearbyEntities = level.getEntitiesOfClass(LivingEntity.class, new AABB(getBlockPos().north(10).west(10).below(6).getBottomCenter(), getBlockPos().south(10).east(10).above(6).getBottomCenter())); for(BlockPos b : BlockPos.withinManhattan(getBlockPos(), 10, 10, 10)){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/WitherBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/WitherBehavior.java index 4a186519ac..fb774174f5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/WitherBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/WitherBehavior.java @@ -14,12 +14,12 @@ import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.event.entity.living.LivingDeathEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.EventHooks; +import net.neoforged.neoforge.event.entity.living.LivingDeathEvent; -@Mod.EventBusSubscriber(modid = ArsNouveau.MODID) +@EventBusSubscriber(modid = ArsNouveau.MODID) public class WitherBehavior extends JarBehavior { public static LevelPosMap WITHER_MAP = new LevelPosMap( (level, pos) -> !(level.getBlockEntity(pos) instanceof MobJarTile mobJarTile) || !(mobJarTile.getEntity() instanceof WitherBoss) @@ -43,11 +43,11 @@ public void onRedstonePower(MobJarTile tile) { private void destroyBlocks(MobJarTile tile) { BlockPos pos = tile.getBlockPos(); WitherBoss entity = entityFromJar(tile); - if (!ForgeEventFactory.getMobGriefingEvent(tile.getLevel(), entity)) return; + if (!EventHooks.canEntityGrief(tile.getLevel(), entity)) return; for (BlockPos block : BlockPos.betweenClosed(pos.offset(-1, -1, -1), pos.offset(1, 1, 1))) { if (block.equals(pos)) continue; BlockState bs = tile.getLevel().getBlockState(block); - if (bs.canEntityDestroy(tile.getLevel(), block, entity) && ForgeEventFactory.onEntityDestroyBlock(entity, block, bs)) { + if (bs.canEntityDestroy(tile.getLevel(), block, entity) && EventHooks.onEntityDestroyBlock(entity, block, bs)) { tile.getLevel().destroyBlock(block, true, entity); } } From 18aa423947bebeca40573e65ffe0e7a4d75e57b2 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 22 Jul 2024 20:23:04 -0500 Subject: [PATCH 085/363] datagen --- .../.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 6 +++--- .../.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d index 789895cf7a..c760194373 100644 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -1,10 +1,10 @@ -// 1.21 2024-07-15T09:45:11.2617252 Loot Tables +// 1.21 2024-07-22T20:22:40.0361541 Loot Tables 4f70eae621815da8d08d3ea0b9fd479b48bad2d3 data/ars_nouveau/loot_table/blocks/agronomic_sourcelink.json 8a6d60f2b39de0408c7e4537b53e866a04236d22 data/ars_nouveau/loot_table/blocks/alchemical_sourcelink.json 8bdff8a0a49a9f3f21a822eb1d1d01a950d6ad1a data/ars_nouveau/loot_table/blocks/alteration_table.json 3f9ddb75996549cf381b4b1b6d1739eb83bf437b data/ars_nouveau/loot_table/blocks/arcane_core.json -ef48dae9fc4eb8f60977f6fe355fc57cf198db7a data/ars_nouveau/loot_table/blocks/arcane_pedestal.json -53bf378ab2897ecd519af63fd2b0ed1cd2e8677b data/ars_nouveau/loot_table/blocks/arcane_platform.json +b7bc68db508b0f182607bdc24e0b6b6fe676390d data/ars_nouveau/loot_table/blocks/arcane_pedestal.json +32dd151b5c8ccbcdd7f177974bfd3e729d4d4346 data/ars_nouveau/loot_table/blocks/arcane_platform.json 45051ced83838c9d65d2b8f504b8a0f67a84b05e data/ars_nouveau/loot_table/blocks/archwood_button.json bd02fbb12b7c0c175bd6d0e1b187d2863417639a data/ars_nouveau/loot_table/blocks/archwood_chest.json e8985e027de224f13721125c4b09d65713f97dc5 data/ars_nouveau/loot_table/blocks/archwood_door.json diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 1b67c44eb9..cf2d7e9833 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21 2024-07-14T16:40:09.6097819 Languages: en_us for mod: ars_nouveau -c9d4e32862841199ebed165ef9dc2e8ab2cadc59 assets/ars_nouveau/lang/en_us.json +// 1.21 2024-07-22T20:22:40.0416633 Languages: en_us for mod: ars_nouveau +fc5aaae5849bacb9dac9a49948220bf2bbf08a46 assets/ars_nouveau/lang/en_us.json From 971cc161f7eebb8f325daf79b108023b8fc6b67a Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 23 Jul 2024 20:15:53 -0500 Subject: [PATCH 086/363] Fix hex, regen potions --- .../hollingsworth/arsnouveau/ArsNouveau.java | 4 ++-- .../api/registry/GlyphRegistry.java | 3 +-- .../arsnouveau/setup/config/ServerConfig.java | 3 --- .../setup/config/StartupConfig.java | 19 +++++++++++++++ .../arsnouveau/setup/registry/ModPotions.java | 23 ++++--------------- 5 files changed, 27 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/setup/config/StartupConfig.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java index b761162221..69d69bd9da 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java +++ b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java @@ -13,6 +13,7 @@ import com.hollingsworth.arsnouveau.setup.ModSetup; import com.hollingsworth.arsnouveau.setup.config.Config; import com.hollingsworth.arsnouveau.setup.config.ServerConfig; +import com.hollingsworth.arsnouveau.setup.config.StartupConfig; import com.hollingsworth.arsnouveau.setup.proxy.ClientProxy; import com.hollingsworth.arsnouveau.setup.proxy.IProxy; import com.hollingsworth.arsnouveau.setup.proxy.ServerProxy; @@ -65,8 +66,7 @@ public ArsNouveau(IEventBus modEventBus, ModContainer modContainer){ sodiumLoaded = ModList.get().isLoaded("rubidium"); patchouliLoaded = ModList.get().isLoaded("patchouli"); APIRegistry.setup(); -// ANModConfig serverConfig = new ANModConfig(ModConfig.Type.SERVER, ServerConfig.SERVER_CONFIG, modContainer,MODID + "-server"); -// modContainer.addConfig(serverConfig); + modContainer.registerConfig(ModConfig.Type.STARTUP, StartupConfig.STARTUP_CONFIG); modContainer.registerConfig(ModConfig.Type.SERVER, ServerConfig.SERVER_CONFIG); modContainer.registerConfig(ModConfig.Type.COMMON, Config.COMMON_CONFIG); modContainer.registerConfig(ModConfig.Type.CLIENT, Config.CLIENT_CONFIG); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/GlyphRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/GlyphRegistry.java index 48485001ad..20a159a027 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/GlyphRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/GlyphRegistry.java @@ -39,8 +39,7 @@ public static AbstractSpellPart registerSpell(AbstractSpellPart part) { part.buildConfig(spellBuilder); spec = spellBuilder.build(); part.CONFIG = spec; -// ANModConfig anModConfig = new ANModConfig(ModConfig.Type.SERVER, part.CONFIG, ModLoadingContext.get().getActiveContainer(), part.getRegistryName().getNamespace() + "/" + part.getRegistryName().getPath()); - ModLoadingContext.get().getActiveContainer().registerConfig(ModConfig.Type.SERVER, spec, part.getRegistryName().getNamespace() + "/" + part.getRegistryName().getPath()); + ModLoadingContext.get().getActiveContainer().registerConfig(ModConfig.Type.SERVER, spec, part.getRegistryName().getNamespace() + "/" + part.getRegistryName().getPath() + ".toml"); return spellpartMap.put(part.getRegistryName(), part); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ServerConfig.java b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ServerConfig.java index 468811de0e..c8b80875f9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ServerConfig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ServerConfig.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.setup.config; -import net.neoforged.neoforge.common.ModConfigSpec; import net.neoforged.neoforge.common.ModConfigSpec; public class ServerConfig { @@ -13,7 +12,6 @@ public class ServerConfig { public static ModConfigSpec.IntValue TIER_REGEN_BONUS; public static ModConfigSpec.IntValue MANA_BOOST_BONUS; public static ModConfigSpec.IntValue MANA_REGEN_ENCHANT_BONUS; - public static ModConfigSpec.IntValue MANA_REGEN_POTION; public static ModConfigSpec.IntValue REGEN_INTERVAL; public static ModConfigSpec.DoubleValue GLYPH_REGEN_BONUS; public static ModConfigSpec.BooleanValue ENFORCE_AUGMENT_CAP_ON_CAST; @@ -38,7 +36,6 @@ public class ServerConfig { MANA_BOOST_BONUS = SERVER_BUILDER.comment("Mana Boost value per level").defineInRange("manaBoost", 25, 0, Integer.MAX_VALUE); MANA_REGEN_ENCHANT_BONUS = SERVER_BUILDER.comment("(enchantment) Mana regen per second per level").defineInRange("manaRegenEnchantment", 2, 0, Integer.MAX_VALUE); GLYPH_REGEN_BONUS = SERVER_BUILDER.comment("Regen bonus per glyph").defineInRange("glyphRegen", 0.33, 0.0, Integer.MAX_VALUE); - MANA_REGEN_POTION = SERVER_BUILDER.comment("Regen bonus per potion level").defineInRange("potionRegen", 10, 0, Integer.MAX_VALUE); SERVER_BUILDER.pop(); SERVER_BUILDER.push("spell_casting"); ENFORCE_AUGMENT_CAP_ON_CAST = SERVER_BUILDER.comment("Enforce augment cap on casting? Turn this off if you are a pack maker and want to create more powerful items than players.") diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/config/StartupConfig.java b/src/main/java/com/hollingsworth/arsnouveau/setup/config/StartupConfig.java new file mode 100644 index 0000000000..2ca3a492af --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/config/StartupConfig.java @@ -0,0 +1,19 @@ +package com.hollingsworth.arsnouveau.setup.config; + +import net.neoforged.neoforge.common.ModConfigSpec; + +public class StartupConfig { + + public static ModConfigSpec STARTUP_CONFIG; + public static ModConfigSpec.IntValue MANA_REGEN_POTION; + + + static { + ModConfigSpec.Builder SERVER_BUILDER = new ModConfigSpec.Builder(); + SERVER_BUILDER.comment("Mana").push("mana"); + MANA_REGEN_POTION = SERVER_BUILDER.comment("Regen bonus per potion level").defineInRange("potionRegen", 10, 0, Integer.MAX_VALUE); + SERVER_BUILDER.pop(); + + STARTUP_CONFIG = SERVER_BUILDER.build(); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java index bcc16101f1..6536e005be 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java @@ -4,12 +4,11 @@ import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.potions.*; -import com.hollingsworth.arsnouveau.setup.config.ServerConfig; +import com.hollingsworth.arsnouveau.setup.config.StartupConfig; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectCategory; import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.entity.ai.attributes.AttributeMap; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.Potion; @@ -31,24 +30,12 @@ public class ModPotions { public static final DeferredHolder SHOCKED_EFFECT = EFFECTS.register(SHOCKED, ShockedEffect::new); - //TODO Consider switching to vanilla builder method for adding attribute modifiers - public static final DeferredHolder MANA_REGEN_EFFECT = EFFECTS.register(MANA_REGEN, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 8080895) { - @Override - public void addAttributeModifiers(AttributeMap pAttributeMap, int pAmplifier) { - AttributeModifier attributemodifier = new AttributeModifier(ArsNouveau.prefix("mana_regen_bonus"), ServerConfig.MANA_REGEN_POTION.get() * (1 + pAmplifier), AttributeModifier.Operation.ADD_VALUE); - pAttributeMap.getInstance(PerkAttributes.MANA_REGEN_BONUS).addTransientModifier(attributemodifier); - super.addAttributeModifiers(pAttributeMap, pAmplifier); - } - }); + public static final DeferredHolder MANA_REGEN_EFFECT = EFFECTS.register(MANA_REGEN, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 8080895).addAttributeModifier(PerkAttributes.MANA_REGEN_BONUS, ArsNouveau.prefix("mana_regen_bonus"), StartupConfig.MANA_REGEN_POTION.get(), AttributeModifier.Operation.ADD_VALUE)); public static final DeferredHolder SUMMONING_SICKNESS_EFFECT = EFFECTS.register(SUMMONING_SICKNESS, SummoningSicknessEffect::new); - public static final DeferredHolder HEX_EFFECT = EFFECTS.register(HEX, () -> new PublicEffect(MobEffectCategory.HARMFUL, 8080895) { - @Override - public void addAttributeModifiers(AttributeMap pAttributeMap, int pAmplifier) { - pAttributeMap.getInstance(PerkAttributes.MANA_REGEN_BONUS).addTransientModifier(new AttributeModifier(ArsNouveau.prefix("hex_regen_penalty"), -0.5, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); - super.addAttributeModifiers(pAttributeMap, pAmplifier); - } - }); + public static final DeferredHolder HEX_EFFECT = EFFECTS.register(HEX, () -> new PublicEffect(MobEffectCategory.HARMFUL, 8080895) + .addAttributeModifier(PerkAttributes.MANA_REGEN_BONUS, ArsNouveau.prefix("hex_regen_penalty"), -0.5, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); + public static final DeferredHolder SCRYING_EFFECT = EFFECTS.register(SCRYING, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 2039587)); public static final DeferredHolder GLIDE_EFFECT = EFFECTS.register(GLIDE, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 8080895)); public static final DeferredHolder SNARE_EFFECT = EFFECTS.register(SNARE, SnareEffect::new); From 08b13b9d1e3e7e3e5a100a9a6d6fe6eaf398fb4c Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 23 Jul 2024 20:15:59 -0500 Subject: [PATCH 087/363] fix armor upgrade recipe --- .../common/crafting/recipes/ArmorUpgradeRecipe.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java index 3a18908ec9..53e68b43f9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; import com.hollingsworth.arsnouveau.api.util.PerkUtil; import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; @@ -64,11 +65,11 @@ public ItemStack getResultItem(HolderLookup.Provider pRegistries) { @Override public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider p_346030_) { ItemStack reagent = input.catalyst(); - IPerkHolder perkHolder = PerkUtil.getPerkHolder(reagent); + ArmorPerkHolder perkHolder = PerkUtil.getPerkHolder(reagent); if(!(perkHolder instanceof ArmorPerkHolder armorPerkHolder)){ return reagent.copy(); } - armorPerkHolder.setTier(tier); + reagent.set(DataComponentRegistry.ARMOR_PERKS, armorPerkHolder.setTier(tier)); return reagent.copy(); } From c35af5cd7669161fc3b95fa4c74046040e3421b9 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 23 Jul 2024 20:23:04 -0500 Subject: [PATCH 088/363] fix saplings --- .../hollingsworth/arsnouveau/common/world/tree/MagicTree.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTree.java b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTree.java index 296e5906f1..1ab82bc8ca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTree.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/world/tree/MagicTree.java @@ -1,15 +1,13 @@ package com.hollingsworth.arsnouveau.common.world.tree; import net.minecraft.resources.ResourceKey; -import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.grower.TreeGrower; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import org.jetbrains.annotations.Nullable; import java.util.Optional; public class MagicTree { public static TreeGrower getGrower(String name, ResourceKey> configConfiguredFeature) { - return new TreeGrower(name, Optional.of(configConfiguredFeature), Optional.empty(), Optional.empty()); + return new TreeGrower(name, Optional.empty(), Optional.of(configConfiguredFeature), Optional.empty()); } } From ab1b2d3fd232aef6a3c8d8e9493c723323afd1ba Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 23 Jul 2024 20:43:49 -0500 Subject: [PATCH 089/363] Fix magebloom crop, berry bush drop tables --- .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 4 +- .../loot_table}/blocks/magebloom_crop.json | 41 ++++++----- .../loot_table}/blocks/sourceberry_bush.json | 71 ++++++++++--------- .../common/datagen/DefaultTableProvider.java | 64 ++++++++++++++--- 4 files changed, 119 insertions(+), 61 deletions(-) rename src/{main/resources/data/ars_nouveau/loot_tables => generated/resources/data/ars_nouveau/loot_table}/blocks/magebloom_crop.json (89%) rename src/{main/resources/data/ars_nouveau/loot_tables => generated/resources/data/ars_nouveau/loot_table}/blocks/sourceberry_bush.json (76%) diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d index c760194373..2a57d4d59b 100644 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -1,4 +1,4 @@ -// 1.21 2024-07-22T20:22:40.0361541 Loot Tables +// 1.21 2024-07-23T20:42:37.1745902 Loot Tables 4f70eae621815da8d08d3ea0b9fd479b48bad2d3 data/ars_nouveau/loot_table/blocks/agronomic_sourcelink.json 8a6d60f2b39de0408c7e4537b53e866a04236d22 data/ars_nouveau/loot_table/blocks/alchemical_sourcelink.json 8bdff8a0a49a9f3f21a822eb1d1d01a950d6ad1a data/ars_nouveau/loot_table/blocks/alteration_table.json @@ -53,6 +53,7 @@ a28c937d10a3fe9217162d764863964ce6d63c58 data/ars_nouveau/loot_table/blocks/gree e220cb0773c9e33776b5909041613d3291d06548 data/ars_nouveau/loot_table/blocks/imbuement_chamber.json df5ba05995044413998b7cbbf02d6c7a63e7c583 data/ars_nouveau/loot_table/blocks/item_detector.json 2af90b26f5f047e3168626ce05aad7a64f42d2ec data/ars_nouveau/loot_table/blocks/magebloom_block.json +db151abe9a1ec4db50b9318d812d049a98154756 data/ars_nouveau/loot_table/blocks/magebloom_crop.json 072841a4552421b48e60a01206d4b1f42dd90da5 data/ars_nouveau/loot_table/blocks/magelight_torch.json 9d551107c336c6341450da44650d007e795ae962 data/ars_nouveau/loot_table/blocks/mendosteen_pod.json 019635e76547e287688dc710b66e2f96d86ba011 data/ars_nouveau/loot_table/blocks/mirrorweave.json @@ -125,6 +126,7 @@ be49357c6ee04402a71b75963b5b2e047fee8938 data/ars_nouveau/loot_table/blocks/smoo ee44c86873143caf5b8e9fc05d74acb98fa9f3b9 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks_slab.json eda12a15644f4ac9fbf901cd738434df58db11a9 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks_stairs.json 62a4e61ba7b3bbd78d5cdca0cba621c98113638b data/ars_nouveau/loot_table/blocks/smooth_sourcestone_stairs.json +585b4114f9b56f12e653eb71bf4faa0c563645b1 data/ars_nouveau/loot_table/blocks/sourceberry_bush.json 1fc8c5595757f818906588e2a7ad87f3ee7ad89d data/ars_nouveau/loot_table/blocks/sourceberry_sack.json 42e5040c6a81a4617c6ef147e12e17267bbbcd2a data/ars_nouveau/loot_table/blocks/sourcestone.json b56aaf60ce3bafd66649843757a01d84d1cc8453 data/ars_nouveau/loot_table/blocks/sourcestone_alternating.json diff --git a/src/main/resources/data/ars_nouveau/loot_tables/blocks/magebloom_crop.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/magebloom_crop.json similarity index 89% rename from src/main/resources/data/ars_nouveau/loot_tables/blocks/magebloom_crop.json rename to src/generated/resources/data/ars_nouveau/loot_table/blocks/magebloom_crop.json index 57c4226c82..2f9c164b7b 100644 --- a/src/main/resources/data/ars_nouveau/loot_tables/blocks/magebloom_crop.json +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/magebloom_crop.json @@ -1,8 +1,13 @@ { "type": "minecraft:block", + "functions": [ + { + "function": "minecraft:explosion_decay" + } + ], "pools": [ { - "rolls": 1.0, + "bonus_rolls": 0.0, "entries": [ { "type": "minecraft:alternatives", @@ -11,8 +16,8 @@ "type": "minecraft:item", "conditions": [ { - "condition": "minecraft:block_state_property", "block": "ars_nouveau:magebloom_crop", + "condition": "minecraft:block_state_property", "properties": { "age": "7" } @@ -26,18 +31,28 @@ } ] } - ] + ], + "rolls": 1.0 }, { - "rolls": 1.0, + "bonus_rolls": 0.0, + "conditions": [ + { + "block": "ars_nouveau:magebloom_crop", + "condition": "minecraft:block_state_property", + "properties": { + "age": "7" + } + } + ], "entries": [ { "type": "minecraft:item", "functions": [ { - "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:binomial_with_bonus_count", + "function": "minecraft:apply_bonus", "parameters": { "extra": 0, "probability": 0.5714286 @@ -47,20 +62,8 @@ "name": "ars_nouveau:magebloom_crop" } ], - "conditions": [ - { - "condition": "minecraft:block_state_property", - "block": "ars_nouveau:magebloom_crop", - "properties": { - "age": "7" - } - } - ] + "rolls": 1.0 } ], - "functions": [ - { - "function": "minecraft:explosion_decay" - } - ] + "random_sequence": "ars_nouveau:blocks/magebloom_crop" } \ No newline at end of file diff --git a/src/main/resources/data/ars_nouveau/loot_tables/blocks/sourceberry_bush.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourceberry_bush.json similarity index 76% rename from src/main/resources/data/ars_nouveau/loot_tables/blocks/sourceberry_bush.json rename to src/generated/resources/data/ars_nouveau/loot_table/blocks/sourceberry_bush.json index ec56780928..09a28eb52a 100644 --- a/src/main/resources/data/ars_nouveau/loot_tables/blocks/sourceberry_bush.json +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourceberry_bush.json @@ -1,82 +1,87 @@ { "type": "minecraft:block", + "functions": [ + { + "function": "minecraft:explosion_decay" + } + ], "pools": [ { - "rolls": 1.0, - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourceberry_bush" - } - ], + "bonus_rolls": 0.0, "conditions": [ { - "condition": "minecraft:block_state_property", "block": "ars_nouveau:sourceberry_bush", + "condition": "minecraft:block_state_property", "properties": { "age": "3" } } ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourceberry_bush" + } + ], "functions": [ { - "function": "minecraft:set_count", + "add": false, "count": { - "min": 2.0, + "type": "minecraft:uniform", "max": 3.0, - "type": "minecraft:uniform" - } + "min": 2.0 + }, + "function": "minecraft:set_count" }, { - "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", "parameters": { "bonusMultiplier": 1 } } - ] + ], + "rolls": 1.0 }, { - "rolls": 1.0, - "entries": [ - { - "type": "minecraft:item", - "name": "ars_nouveau:sourceberry_bush" - } - ], + "bonus_rolls": 0.0, "conditions": [ { - "condition": "minecraft:block_state_property", "block": "ars_nouveau:sourceberry_bush", + "condition": "minecraft:block_state_property", "properties": { "age": "2" } } ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourceberry_bush" + } + ], "functions": [ { - "function": "minecraft:set_count", + "add": false, "count": { - "min": 1.0, + "type": "minecraft:uniform", "max": 2.0, - "type": "minecraft:uniform" - } + "min": 1.0 + }, + "function": "minecraft:set_count" }, { - "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", "parameters": { "bonusMultiplier": 1 } } - ] + ], + "rolls": 1.0 } ], - "functions": [ - { - "function": "minecraft:explosion_decay" - } - ] + "random_sequence": "ars_nouveau:blocks/sourceberry_bush" } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java index 1ee09ec313..c843c6f4a4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java @@ -5,16 +5,14 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.common.block.AlterationTable; -import com.hollingsworth.arsnouveau.common.block.ArchfruitPod; -import com.hollingsworth.arsnouveau.common.block.ScribesBlock; -import com.hollingsworth.arsnouveau.common.block.ThreePartBlock; +import com.hollingsworth.arsnouveau.common.block.*; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; import com.hollingsworth.arsnouveau.setup.registry.*; import net.minecraft.advancements.critereon.StatePropertiesPredicate; import net.minecraft.core.HolderLookup; import net.minecraft.core.WritableRegistry; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; import net.minecraft.data.PackOutput; import net.minecraft.data.loot.BlockLootSubProvider; import net.minecraft.data.loot.EntityLootSubProvider; @@ -26,8 +24,11 @@ import net.minecraft.world.flag.FeatureFlags; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.CropBlock; import net.minecraft.world.level.block.FlowerPotBlock; import net.minecraft.world.level.block.SlabBlock; import net.minecraft.world.level.block.state.properties.Property; @@ -37,12 +38,10 @@ import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.ValidationContext; import net.minecraft.world.level.storage.loot.entries.LootItem; -import net.minecraft.world.level.storage.loot.functions.CopyComponentsFunction; -import net.minecraft.world.level.storage.loot.functions.CopyNameFunction; -import net.minecraft.world.level.storage.loot.functions.EnchantedCountIncreaseFunction; -import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; +import net.minecraft.world.level.storage.loot.functions.*; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; @@ -70,6 +69,7 @@ protected BlockLootTable(HolderLookup.Provider pRegistries) { @Override protected void generate() { + HolderLookup.RegistryLookup registrylookup = this.registries.lookupOrThrow(Registries.ENCHANTMENT); registerDropSelf(BlockRegistry.ENCHANTED_SPELL_TURRET); registerDropSelf(BlockRegistry.BLAZING_LOG); @@ -222,6 +222,54 @@ protected void generate() { registerDropSelf(BlockRegistry.ARCHWOOD_SCONCE_BLOCK.get()); registerDropSelf(BlockRegistry.REDSTONE_RELAY.get()); registerDropSelf(BlockRegistry.SOURCEBERRY_SACK.get()); + LootItemCondition.Builder lootitemcondition$builder1 = LootItemBlockStatePropertyCondition.hasBlockStateProperties(BlockRegistry.MAGE_BLOOM_CROP.get()) + .setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(CropBlock.AGE, 7)); + add(BlockRegistry.MAGE_BLOOM_CROP.get(), createCropDrops(BlockRegistry.MAGE_BLOOM_CROP.get(), ItemsRegistry.MAGE_BLOOM.asItem(), BlockRegistry.MAGE_BLOOM_CROP.get().asItem(),lootitemcondition$builder1, 0)); + + this.add( + BlockRegistry.SOURCEBERRY_BUSH.get(), + p_249159_ -> this.applyExplosionDecay( + p_249159_, + LootTable.lootTable() + .withPool( + LootPool.lootPool() + .when( + LootItemBlockStatePropertyCondition.hasBlockStateProperties(BlockRegistry.SOURCEBERRY_BUSH.get()) + .setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(SourceBerryBush.AGE, 3)) + ) + .add(LootItem.lootTableItem(BlockRegistry.SOURCEBERRY_BUSH.asItem())) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(2.0F, 3.0F))) + .apply(ApplyBonusCount.addUniformBonusCount(registrylookup.getOrThrow(Enchantments.FORTUNE))) + ) + .withPool( + LootPool.lootPool() + .when( + LootItemBlockStatePropertyCondition.hasBlockStateProperties(BlockRegistry.SOURCEBERRY_BUSH.get()) + .setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(SourceBerryBush.AGE, 2)) + ) + .add(LootItem.lootTableItem(BlockRegistry.SOURCEBERRY_BUSH.asItem())) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0F, 2.0F))) + .apply(ApplyBonusCount.addUniformBonusCount(registrylookup.getOrThrow(Enchantments.FORTUNE))) + ) + ) + ); + } + + protected LootTable.Builder createCropDrops(Block pCropBlock, Item pGrownCropItem, Item pSeedsItem, LootItemCondition.Builder pDropGrownCropCondition, int bonus) { + HolderLookup.RegistryLookup registrylookup = this.registries.lookupOrThrow(Registries.ENCHANTMENT); + return this.applyExplosionDecay( + pCropBlock, + LootTable.lootTable() + .withPool(LootPool.lootPool().add(LootItem.lootTableItem(pGrownCropItem).when(pDropGrownCropCondition).otherwise(LootItem.lootTableItem(pSeedsItem)))) + .withPool( + LootPool.lootPool() + .when(pDropGrownCropCondition) + .add( + LootItem.lootTableItem(pSeedsItem) + .apply(ApplyBonusCount.addBonusBinomialDistributionCount(registrylookup.getOrThrow(Enchantments.FORTUNE), 0.5714286F, bonus)) + ) + ) + ); } @Override From 1af18e111f85ea2c0d8af1113ca9862bcb6fea25 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 23 Jul 2024 20:47:33 -0500 Subject: [PATCH 090/363] Fix imbuement chamber output --- .../arsnouveau/common/crafting/recipes/ImbuementRecipe.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java index 25bb459cd5..f4256cb4c6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ImbuementRecipe.java @@ -89,7 +89,7 @@ public boolean matches(ImbuementTile pContainer, Level pLevel) { @Override public ItemStack assemble(ImbuementTile pCraftingContainer, HolderLookup.Provider pRegistries) { - return ItemStack.EMPTY; + return this.output.copy(); } @Override @@ -99,7 +99,7 @@ public boolean canCraftInDimensions(int p_43999_, int p_44000_) { @Override public ItemStack getResultItem(HolderLookup.Provider pRegistries) { - return ItemStack.EMPTY; + return this.output.copy(); } @Override From 34f86625a895b0d7e21706a0dbb8aeda43152428 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 23 Jul 2024 22:49:28 -0500 Subject: [PATCH 091/363] 5.0.1 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 8cbec50395..d88c73c9a1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.0.0 +mod_version=5.0.1 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 0d602e94026ca31198360fa772296cdd8408b929 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 25 Jul 2024 17:21:06 -0500 Subject: [PATCH 092/363] Fix turret, prism, scry positioning --- .../common/block/BasicSpellTurret.java | 47 +++--------- .../common/block/RotatingSpellTurret.java | 73 ++----------------- .../common/block/ScryerCrystal.java | 6 +- .../common/block/ScryersOculus.java | 2 +- .../common/block/SpellPrismBlock.java | 8 +- .../block/tile/BasicSpellTurretTile.java | 40 +++++++++- .../common/block/tile/RotatingTurretTile.java | 69 ++++++++++++++++++ .../arsnouveau/common/items/ScryCaster.java | 6 +- .../arsnouveau/common/items/ScryerScroll.java | 10 ++- .../common/items/data/ScryCasterData.java | 4 +- .../common/items/data/ScryPosData.java | 14 ++-- .../setup/registry/DataComponentRegistry.java | 2 +- .../setup/registry/ItemsRegistry.java | 4 +- 13 files changed, 159 insertions(+), 126 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java index be6b4c364f..a1d88349f8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java @@ -1,15 +1,13 @@ package com.hollingsworth.arsnouveau.common.block; -import com.hollingsworth.arsnouveau.api.ANFakePlayer; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; -import com.hollingsworth.arsnouveau.api.spell.*; -import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.TileCaster; -import com.hollingsworth.arsnouveau.api.util.SourceUtil; +import com.hollingsworth.arsnouveau.api.spell.AbstractCastMethod; +import com.hollingsworth.arsnouveau.api.spell.ITurretBehavior; +import com.hollingsworth.arsnouveau.api.spell.Spell; +import com.hollingsworth.arsnouveau.api.spell.SpellResolver; import com.hollingsworth.arsnouveau.common.block.tile.BasicSpellTurretTile; import com.hollingsworth.arsnouveau.common.block.tile.RotatingTurretTile; import com.hollingsworth.arsnouveau.common.entity.EntityProjectileSpell; -import com.hollingsworth.arsnouveau.common.network.Networking; -import com.hollingsworth.arsnouveau.common.network.PacketOneShotAnimation; import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; import com.hollingsworth.arsnouveau.common.util.PortUtil; @@ -18,7 +16,6 @@ import net.minecraft.core.Position; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundSource; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.ItemInteractionResult; @@ -44,7 +41,6 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -import net.neoforged.neoforge.common.util.FakePlayer; import org.jetbrains.annotations.NotNull; import java.util.HashMap; @@ -52,7 +48,6 @@ import static net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED; -@SuppressWarnings("deprecation") public class BasicSpellTurret extends TickableModBlock implements SimpleWaterloggedBlock { public static final BooleanProperty TRIGGERED = BlockStateProperties.TRIGGERED; @@ -72,7 +67,9 @@ public BasicSpellTurret() { @Override public void tick(BlockState state, ServerLevel worldIn, BlockPos pos, RandomSource rand) { - this.shootSpell(worldIn, pos); + if(worldIn.getBlockEntity(pos) instanceof BasicSpellTurretTile tile){ + tile.shootSpell(); + } } static { @@ -109,27 +106,6 @@ public void onCast(SpellResolver resolver, ServerLevel serverLevel, BlockPos pos }); } - public void shootSpell(ServerLevel world, BlockPos pos) { - if (!(world.getBlockEntity(pos) instanceof BasicSpellTurretTile tile)) return; - SpellCaster caster = tile.spellCaster; - if (caster.getSpell().isEmpty()) - return; - int manaCost = tile.getManaCost(); - if (manaCost > 0 && SourceUtil.takeSourceWithParticles(pos, world, 10, manaCost) == null) - return; - Networking.sendToNearbyClient(world, pos, new PacketOneShotAnimation(pos)); - Position iposition = getDispensePosition(pos, world.getBlockState(pos).getValue(FACING)); - Direction direction = world.getBlockState(pos).getValue(FACING); - FakePlayer fakePlayer = ANFakePlayer.getPlayer(world); - fakePlayer.setPos(pos.getX(), pos.getY(), pos.getZ()); - EntitySpellResolver resolver = new EntitySpellResolver(new SpellContext(world, caster.getSpell(), fakePlayer, new TileCaster(tile, SpellContext.CasterType.TURRET))); - if (resolver.castType != null && TURRET_BEHAVIOR_MAP.containsKey(resolver.castType)) { - TURRET_BEHAVIOR_MAP.get(resolver.castType).onCast(resolver, world, pos, fakePlayer, iposition, direction); - caster.playSound(pos, world, null, caster.getCurrentSound(), SoundSource.BLOCKS); - } - } - - public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { boolean neighborSignal = worldIn.hasNeighborSignal(pos) || worldIn.hasNeighborSignal(pos.above()); boolean isTriggered = state.getValue(TRIGGERED); @@ -146,9 +122,9 @@ public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block * Get the position where the dispenser at the given Coordinates should dispense to. */ public static Position getDispensePosition(BlockPos pos, Direction direction) { - double d0 = pos.getX() + 0.5D * (double) direction.getStepX(); - double d1 = pos.getY() + 0.5D * (double) direction.getStepY(); - double d2 = pos.getZ() + 0.5D * (double) direction.getStepZ(); + double d0 = pos.getX() + 0.5 + 0.5D * (double) direction.getStepX(); + double d1 = pos.getY() + 0.5 + 0.5D * (double) direction.getStepY(); + double d2 = pos.getZ() + 0.5 + 0.5D * (double) direction.getStepZ(); return new Vec3(d0, d1, d2); } @@ -196,8 +172,7 @@ protected ItemInteractionResult useItemOn(ItemStack pStack, BlockState state, Le return ItemInteractionResult.SUCCESS; } if (worldIn.getBlockEntity(pos) instanceof BasicSpellTurretTile tile) { - tile.spellCaster.copyFromCaster(SpellCasterRegistry.from(stack)); - tile.spellCaster.setSpell(spell); + tile.setSpell(spell); tile.updateBlock(); PortUtil.sendMessage(player, Component.translatable("ars_nouveau.alert.spell_set")); worldIn.sendBlockUpdated(pos, state, state, 2); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java index 10ed1833c0..fef5726b73 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java @@ -1,21 +1,16 @@ package com.hollingsworth.arsnouveau.common.block; -import com.hollingsworth.arsnouveau.api.ANFakePlayer; -import com.hollingsworth.arsnouveau.api.spell.*; -import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.TileCaster; -import com.hollingsworth.arsnouveau.api.util.SourceUtil; +import com.hollingsworth.arsnouveau.api.spell.AbstractCastMethod; +import com.hollingsworth.arsnouveau.api.spell.ITurretBehavior; +import com.hollingsworth.arsnouveau.api.spell.SpellResolver; import com.hollingsworth.arsnouveau.common.block.tile.RotatingTurretTile; import com.hollingsworth.arsnouveau.common.entity.EntityProjectileSpell; -import com.hollingsworth.arsnouveau.common.network.Networking; -import com.hollingsworth.arsnouveau.common.network.PacketOneShotAnimation; import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Position; import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundSource; -import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -26,83 +21,27 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.common.util.FakePlayer; import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.List; -import static net.minecraft.core.Direction.*; - public class RotatingSpellTurret extends BasicSpellTurret { public static HashMap ROT_TURRET_BEHAVIOR_MAP = new HashMap<>(); - //Direction Adjustments - public void shootSpell(ServerLevel world, BlockPos pos) { - if (!(world.getBlockEntity(pos) instanceof RotatingTurretTile tile)) return; - SpellCaster caster = tile.spellCaster; - if (caster.getSpell().isEmpty()) - return; - int manaCost = tile.getManaCost(); - if (manaCost > 0 && SourceUtil.takeSourceWithParticles(pos, world, 10, manaCost) == null) - return; - Networking.sendToNearbyClient(world, pos, new PacketOneShotAnimation(pos)); - Position iposition = getDispensePosition(pos, tile); - FakePlayer fakePlayer = ANFakePlayer.getPlayer(world); - fakePlayer.setPos(pos.getX(), pos.getY(), pos.getZ()); - EntitySpellResolver resolver = new EntitySpellResolver(new SpellContext(world, caster.getSpell(), fakePlayer, new TileCaster(tile, SpellContext.CasterType.TURRET))); - if (resolver.castType != null && ROT_TURRET_BEHAVIOR_MAP.containsKey(resolver.castType)) { - ROT_TURRET_BEHAVIOR_MAP.get(resolver.castType).onCast(resolver, world, pos, fakePlayer, iposition, orderedByNearest(tile)[0].getOpposite()); - caster.playSound(pos, world, null, caster.getCurrentSound(), SoundSource.BLOCKS); - } - } - /** * Get the position where the dispenser at the given Coordinates should dispense to. */ public static Position getDispensePosition(BlockPos coords, RotatingTurretTile tile) { Vec3 direction = tile.getShootAngle().normalize(); - double d0 = coords.getX() + 0.5D * direction.x(); - double d1 = coords.getY() + 0.5D * direction.y(); - double d2 = coords.getZ() + 0.5D * direction.z(); + double d0 = coords.getX() + 0.5 + 0.5D * direction.x(); + double d1 = coords.getY() + 0.5 + 0.5D * direction.y(); + double d2 = coords.getZ() + 0.5 + 0.5D * direction.z(); return new Vec3(d0, d1, d2); } - public static Direction[] orderedByNearest(RotatingTurretTile pEntity) { - float f = pEntity.getRotationY() * (float) Math.PI / 180F; - float f1 = (90 + pEntity.getRotationX()) * (float) Math.PI / 180F; - float f2 = Mth.sin(f); - float f3 = Mth.cos(f); - float f4 = Mth.sin(f1); - float f5 = Mth.cos(f1); - boolean flag = f4 > 0.0F; - boolean flag1 = f2 < 0.0F; - boolean flag2 = f5 > 0.0F; - float f6 = flag ? f4 : -f4; - float f7 = flag1 ? -f2 : f2; - float f8 = flag2 ? f5 : -f5; - float f9 = f6 * f3; - float f10 = f8 * f3; - Direction direction = flag ? EAST : WEST; - Direction direction1 = flag1 ? UP : DOWN; - Direction direction2 = flag2 ? SOUTH : NORTH; - if (f6 > f8) { - if (f7 > f9) { - return makeDirectionArray(direction1, direction, direction2); - } else { - return f10 > f7 ? makeDirectionArray(direction, direction2, direction1) : makeDirectionArray(direction, direction1, direction2); - } - } else if (f7 > f10) { - return makeDirectionArray(direction1, direction2, direction); - } else { - return f9 > f7 ? makeDirectionArray(direction2, direction, direction1) : makeDirectionArray(direction2, direction1, direction); - } - } - static Direction[] makeDirectionArray(Direction pFirst, Direction pSecond, Direction pThird) { - return new Direction[]{pFirst, pSecond, pThird, pThird.getOpposite(), pSecond.getOpposite(), pFirst.getOpposite()}; - } @Override public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryerCrystal.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryerCrystal.java index ad08aef3c6..4a58cc971e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryerCrystal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryerCrystal.java @@ -86,9 +86,9 @@ public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, public static Position getDispensePosition(BlockPos pos, Direction direction) { // Offset to get closer to the eye. double negOffset = -0.49; - double d0 = pos.getX() + negOffset * (double) direction.getStepX(); - double d1 = pos.getY() + negOffset * (double) direction.getStepY(); - double d2 = pos.getZ() + negOffset * (double) direction.getStepZ(); + double d0 = pos.getX() + 0.5 + negOffset * (double) direction.getStepX(); + double d1 = pos.getY() + 0.5 + negOffset * (double) direction.getStepY(); + double d2 = pos.getZ() + 0.5 + negOffset * (double) direction.getStepZ(); return new Vec3(d0, d1, d2); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java index ca085781df..a1a1bb1ae5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java @@ -79,7 +79,7 @@ public void openMenu(Level pLevel, BlockPos pPos, Player pPlayer) { PortUtil.sendMessage(pPlayer, Component.translatable("ars_nouveau.scryers_eye.no_pos")); return; } - Networking.sendToServer(new PacketMountCamera(data.pos())); + Networking.sendToServer(new PacketMountCamera(data.pos().orElse(null))); }, slots, (slotData, posestack, positionx, posy, size, transparent) -> RenderUtils.drawItemAsIcon(slotData.getDefaultInstance(), posestack, positionx, posy, size, transparent), 3))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/SpellPrismBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/SpellPrismBlock.java index 0417eb7f72..4c48efac1e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/SpellPrismBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/SpellPrismBlock.java @@ -40,10 +40,10 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { return this.defaultBlockState().setValue(FACING, context.getNearestLookingDirection().getOpposite()); } - public static Position getDispensePosition(BlockPos pos, Direction direction) { - double d0 = pos.getX() + 0.3D * direction.getStepX(); - double d1 = pos.getY() + 0.3D * direction.getStepY(); - double d2 = pos.getZ() + 0.3D * direction.getStepZ(); + public Position getDispensePosition(BlockPos pos, Direction direction) { + double d0 = pos.getX() + 0.5 + 0.3D * direction.getStepX(); + double d1 = pos.getY() + 0.5 + 0.3D * direction.getStepY(); + double d2 = pos.getZ() + 0.5 + 0.3D * direction.getStepZ(); return new Vec3(d0, d1, d2); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java index a4956ccae8..aa9cc0785a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java @@ -1,17 +1,31 @@ package com.hollingsworth.arsnouveau.common.block.tile; +import com.hollingsworth.arsnouveau.api.ANFakePlayer; import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; +import com.hollingsworth.arsnouveau.api.spell.EntitySpellResolver; +import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.api.spell.SpellCaster; +import com.hollingsworth.arsnouveau.api.spell.SpellContext; +import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.TileCaster; +import com.hollingsworth.arsnouveau.api.util.SourceUtil; +import com.hollingsworth.arsnouveau.common.block.BasicSpellTurret; import com.hollingsworth.arsnouveau.common.block.ITickable; +import com.hollingsworth.arsnouveau.common.network.Networking; +import com.hollingsworth.arsnouveau.common.network.PacketOneShotAnimation; import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; +import net.minecraft.core.Position; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.capabilities.ICapabilityProvider; +import net.neoforged.neoforge.common.util.FakePlayer; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -23,7 +37,7 @@ public class BasicSpellTurretTile extends ModdedTile implements ITooltipProvider, GeoBlockEntity, IAnimationListener, ITickable, ICapabilityProvider { boolean playRecoil; - public SpellCaster spellCaster = new SpellCaster(0, null, false, null, 1); + protected SpellCaster spellCaster = new SpellCaster(0, null, false, null, 1); public BasicSpellTurretTile(BlockEntityType p_i48289_1_, BlockPos pos, BlockState state) { super(p_i48289_1_, pos, state); @@ -37,6 +51,30 @@ public int getManaCost() { return this.spellCaster.getSpell().getCost(); } + public void setSpell(Spell spell){ + this.spellCaster = this.spellCaster.setSpell(spell, 0); + } + + public void shootSpell(){ + BlockPos pos = this.getBlockPos(); + + if (spellCaster.getSpell().isEmpty() || !(this.level instanceof ServerLevel level)) + return; + int manaCost = getManaCost(); + if (manaCost > 0 && SourceUtil.takeSourceWithParticles(pos, level, 10, manaCost) == null) + return; + Networking.sendToNearbyClient(level, pos, new PacketOneShotAnimation(pos)); + Position iposition = BasicSpellTurret.getDispensePosition(pos, level.getBlockState(pos).getValue(BasicSpellTurret.FACING)); + Direction direction = level.getBlockState(pos).getValue(BasicSpellTurret.FACING); + FakePlayer fakePlayer = ANFakePlayer.getPlayer(level); + fakePlayer.setPos(pos.getX(), pos.getY(), pos.getZ()); + EntitySpellResolver resolver = new EntitySpellResolver(new SpellContext(level, spellCaster.getSpell(), fakePlayer, new TileCaster(this, SpellContext.CasterType.TURRET))); + if (resolver.castType != null && BasicSpellTurret.TURRET_BEHAVIOR_MAP.containsKey(resolver.castType)) { + BasicSpellTurret.TURRET_BEHAVIOR_MAP.get(resolver.castType).onCast(resolver, level, pos, fakePlayer, iposition, direction); + spellCaster.playSound(pos, level, null, spellCaster.getCurrentSound(), SoundSource.BLOCKS); + } + } + @Override protected void saveAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { super.saveAdditional(pTag, pRegistries); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RotatingTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RotatingTurretTile.java index cbc4c85f40..efdcba87ac 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RotatingTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RotatingTurretTile.java @@ -1,21 +1,36 @@ package com.hollingsworth.arsnouveau.common.block.tile; +import com.hollingsworth.arsnouveau.api.ANFakePlayer; import com.hollingsworth.arsnouveau.api.item.IWandable; +import com.hollingsworth.arsnouveau.api.spell.EntitySpellResolver; +import com.hollingsworth.arsnouveau.api.spell.SpellContext; +import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.TileCaster; +import com.hollingsworth.arsnouveau.api.util.SourceUtil; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; +import com.hollingsworth.arsnouveau.common.block.RotatingSpellTurret; +import com.hollingsworth.arsnouveau.common.network.Networking; +import com.hollingsworth.arsnouveau.common.network.PacketOneShotAnimation; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; +import net.minecraft.core.Position; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.common.util.FakePlayer; import org.jetbrains.annotations.Nullable; +import static net.minecraft.core.Direction.*; + public class RotatingTurretTile extends BasicSpellTurretTile implements IWandable { public RotatingTurretTile(BlockEntityType blockEntityType, BlockPos pos, BlockState state) { super(blockEntityType, pos, state); @@ -131,6 +146,60 @@ public void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @Nullable Li if (storedPos != null) this.aim(storedPos, playerEntity); } + @Override + public void shootSpell() { + BlockPos pos = getBlockPos(); + if (spellCaster.getSpell().isEmpty() || !(level instanceof ServerLevel level)) + return; + int manaCost = getManaCost(); + if (manaCost > 0 && SourceUtil.takeSourceWithParticles(pos, level, 10, manaCost) == null) + return; + Networking.sendToNearbyClient(level, pos, new PacketOneShotAnimation(pos)); + Position iposition = RotatingSpellTurret.getDispensePosition(pos, this); + FakePlayer fakePlayer = ANFakePlayer.getPlayer(level); + fakePlayer.setPos(pos.getX(), pos.getY(), pos.getZ()); + EntitySpellResolver resolver = new EntitySpellResolver(new SpellContext(level, spellCaster.getSpell(), fakePlayer, new TileCaster(this, SpellContext.CasterType.TURRET))); + if (resolver.castType != null && RotatingSpellTurret.ROT_TURRET_BEHAVIOR_MAP.containsKey(resolver.castType)) { + RotatingSpellTurret.ROT_TURRET_BEHAVIOR_MAP.get(resolver.castType).onCast(resolver, level, pos, fakePlayer, iposition, orderedByNearest()[0].getOpposite()); + spellCaster.playSound(pos, level, null, spellCaster.getCurrentSound(), SoundSource.BLOCKS); + } + } + + public Direction[] orderedByNearest() { + float f = this.getRotationY() * (float) Math.PI / 180F; + float f1 = (90 + this.getRotationX()) * (float) Math.PI / 180F; + float f2 = Mth.sin(f); + float f3 = Mth.cos(f); + float f4 = Mth.sin(f1); + float f5 = Mth.cos(f1); + boolean flag = f4 > 0.0F; + boolean flag1 = f2 < 0.0F; + boolean flag2 = f5 > 0.0F; + float f6 = flag ? f4 : -f4; + float f7 = flag1 ? -f2 : f2; + float f8 = flag2 ? f5 : -f5; + float f9 = f6 * f3; + float f10 = f8 * f3; + Direction direction = flag ? EAST : WEST; + Direction direction1 = flag1 ? UP : DOWN; + Direction direction2 = flag2 ? SOUTH : NORTH; + if (f6 > f8) { + if (f7 > f9) { + return makeDirectionArray(direction1, direction, direction2); + } else { + return f10 > f7 ? makeDirectionArray(direction, direction2, direction1) : makeDirectionArray(direction, direction1, direction2); + } + } else if (f7 > f10) { + return makeDirectionArray(direction1, direction2, direction); + } else { + return f9 > f7 ? makeDirectionArray(direction2, direction, direction1) : makeDirectionArray(direction2, direction1, direction); + } + } + + static Direction[] makeDirectionArray(Direction pFirst, Direction pSecond, Direction pThird) { + return new Direction[]{pFirst, pSecond, pThird, pThird.getOpposite(), pSecond.getOpposite(), pFirst.getOpposite()}; + } + @Override protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java index dfd1e96c77..34bea9a3af 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java @@ -63,10 +63,12 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { getInformation(stack, context, tooltip2, flagIn); ScryPosData data = stack.get(DataComponentRegistry.SCRY_DATA); - if(data == null || data.pos() == null){ + var pos = data.pos().orElse(null); + + if(pos == null){ tooltip2.add(Component.translatable("ars_nouveau.scry_caster.no_pos")); }else{ - tooltip2.add(Component.translatable("ars_nouveau.scryer_scroll.bound", data.pos().getX() + ", " + data.pos().getY() + ", " + data.pos().getZ())); + tooltip2.add(Component.translatable("ars_nouveau.scryer_scroll.bound", pos.getX() + ", " + pos.getY() + ", " + pos.getZ())); } super.appendHoverText(stack, context, tooltip2, flagIn); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java index c06bac8815..b680ebb15d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java @@ -11,11 +11,12 @@ import net.minecraft.world.item.context.UseOnContext; import java.util.List; +import java.util.Optional; public class ScryerScroll extends ModItem { public ScryerScroll() { - super(defaultProps().component(DataComponentRegistry.SCRY_DATA, new ScryPosData(null))); + super(defaultProps().component(DataComponentRegistry.SCRY_DATA, new ScryPosData(Optional.empty()))); withTooltip(Component.translatable("tooltip.ars_nouveau.scryer_scroll")); } @@ -34,9 +35,10 @@ public InteractionResult useOn(UseOnContext pContext) { @Override public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { - ScryPosData data = stack.getOrDefault(DataComponentRegistry.SCRY_DATA, new ScryPosData(null)); - if (data.pos() != null) { - tooltip2.add(Component.translatable("ars_nouveau.scryer_scroll.bound", data.pos().getX() + ", " + data.pos().getY() + ", " + data.pos().getZ())); + ScryPosData data = stack.get(DataComponentRegistry.SCRY_DATA); + var pos = data.pos().orElse(null); + if (pos != null) { + tooltip2.add(Component.translatable("ars_nouveau.scryer_scroll.bound", pos.getX() + ", " + pos.getY() + ", " + pos.getZ())); } else { tooltip2.add(Component.translatable("ars_nouveau.scryer_scroll.craft")); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java index 307be9fd53..bfcdf4e2c0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java @@ -31,6 +31,8 @@ import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; +import java.util.Optional; + public class ScryCasterData extends AbstractCaster { public static final MapCodec CODEC = createCodec(ScryCasterData::new); @@ -78,7 +80,7 @@ public InteractionResultHolder castSpell(Level worldIn, LivingEntity ScryPosData data = stack.get(DataComponentRegistry.SCRY_DATA); boolean playerHoldingScroll = entity.getItemInHand(InteractionHand.OFF_HAND).getItem() instanceof ScryerScroll; - BlockPos scryPos = playerHoldingScroll ? player.getItemInHand(InteractionHand.OFF_HAND).getOrDefault(DataComponentRegistry.SCRY_DATA, new ScryPosData(null)).pos() : data.pos(); + BlockPos scryPos = playerHoldingScroll ? player.getItemInHand(InteractionHand.OFF_HAND).getOrDefault(DataComponentRegistry.SCRY_DATA, new ScryPosData(Optional.empty())).pos().orElse(null) : data.pos().orElse(null); if(scryPos == null){ PortUtil.sendMessage(entity, Component.translatable("ars_nouveau.scry_caster.no_pos")); return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryPosData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryPosData.java index 9e361ba708..20565b423f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryPosData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryPosData.java @@ -1,16 +1,20 @@ package com.hollingsworth.arsnouveau.common.items.data; import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.BlockPos; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; import java.util.Objects; +import java.util.Optional; -public record ScryPosData(BlockPos pos) { - public static Codec CODEC = BlockPos.CODEC.xmap(ScryPosData::new, ScryPosData::pos); +public record ScryPosData(Optional pos) { + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockPos.CODEC.optionalFieldOf("pos").forGetter(ScryPosData::pos) + ).apply(instance, ScryPosData::new)); - public static StreamCodec STREAM_CODEC = StreamCodec.composite(BlockPos.STREAM_CODEC, ScryPosData::pos, ScryPosData::new); + public ScryPosData(BlockPos pos){ + this(Optional.ofNullable(pos)); + } @Override public boolean equals(Object o) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java index eb93e1fb98..cb276ef723 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java @@ -27,7 +27,7 @@ public class DataComponentRegistry { public static final DeferredHolder , DataComponentType> PRESENT = DATA.register("present", () -> DataComponentType.builder().persistent(PresentData.CODEC).networkSynchronized(PresentData.STREAM_CODEC).build()); - public static final DeferredHolder , DataComponentType> SCRY_DATA = DATA.register("scry_data", () -> DataComponentType.builder().persistent(ScryPosData.CODEC).networkSynchronized(ScryPosData.STREAM_CODEC).build()); + public static final DeferredHolder , DataComponentType> SCRY_DATA = DATA.register("scry_data", () -> DataComponentType.builder().persistent(ScryPosData.CODEC).build()); public static final DeferredHolder , DataComponentType> WARP_SCROLL = DATA.register("warp_scroll", () -> DataComponentType.builder().persistent(WarpScrollData.CODEC).networkSynchronized(WarpScrollData.STREAM_CODEC).build()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java index 626be183aa..b86a8743e0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java @@ -15,6 +15,7 @@ import com.hollingsworth.arsnouveau.common.items.curios.*; import com.hollingsworth.arsnouveau.common.items.data.PresentData; import com.hollingsworth.arsnouveau.common.items.data.ScryCasterData; +import com.hollingsworth.arsnouveau.common.items.data.ScryPosData; import com.hollingsworth.arsnouveau.common.items.itemscrolls.AllowItemScroll; import com.hollingsworth.arsnouveau.common.items.itemscrolls.DenyItemScroll; import com.hollingsworth.arsnouveau.common.items.itemscrolls.MimicItemScroll; @@ -38,6 +39,7 @@ import org.jetbrains.annotations.NotNull; import java.util.Map; +import java.util.Optional; import java.util.function.Supplier; import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; @@ -220,7 +222,7 @@ public int getValue() { public static final ItemRegistryWrapper STARBY_GIFY = register(LibItemNames.STARBY_GIFT, () -> new Present(defaultItemProperties().rarity(Rarity.EPIC).component(DataComponentRegistry.PRESENT, new PresentData()))); public static final ItemRegistryWrapper SPELL_CROSSBOW = register(LibItemNames.SPELL_CROSSBOW, () -> new SpellCrossbow(defaultItemProperties().stacksTo(1).component(DataComponentRegistry.SPELL_CASTER, new SpellCaster()))); public static final ItemRegistryWrapper STABLE_WARP_SCROLL = register(LibItemNames.STABLE_WARP_SCROLL, () -> new StableWarpScroll(defaultItemProperties().stacksTo(1))); - public static final ItemRegistryWrapper SCRY_CASTER = register(LibItemNames.SCRY_CASTER, () -> new ScryCaster(defaultItemProperties().stacksTo(1).component(DataComponentRegistry.SCRY_CASTER, new ScryCasterData()))); + public static final ItemRegistryWrapper SCRY_CASTER = register(LibItemNames.SCRY_CASTER, () -> new ScryCaster(defaultItemProperties().stacksTo(1).component(DataComponentRegistry.SCRY_CASTER, new ScryCasterData()).component(DataComponentRegistry.SCRY_DATA, new ScryPosData(Optional.empty())))); public static final ItemRegistryWrapper JUMP_RING = register(LibItemNames.JUMP_RING, JumpingRing::new); public static ItemRegistryWrapper register(String name, Supplier item) { From d89800f3d020d2c6f157cb06d29c88fccd6f548b Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 25 Jul 2024 20:54:27 -0500 Subject: [PATCH 093/363] fix crash with summons --- .../arsnouveau/common/entity/EntityAllyVex.java | 4 ++++ .../arsnouveau/common/entity/IFollowingSummon.java | 8 -------- .../arsnouveau/common/entity/SummonSkeleton.java | 3 +++ 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityAllyVex.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityAllyVex.java index d53cbdb590..3678dd736a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityAllyVex.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityAllyVex.java @@ -6,6 +6,8 @@ import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.players.OldUsersConverter; import net.minecraft.sounds.SoundEvents; @@ -36,6 +38,8 @@ import java.util.UUID; public class EntityAllyVex extends Vex implements IFollowingSummon, ISummon { + public static EntityDataAccessor> OWNER_UNIQUE_ID = SynchedEntityData.defineId(EntityAllyVex.class, EntityDataSerializers.OPTIONAL_UUID); + private LivingEntity owner; @Nullable private BlockPos boundOrigin; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/IFollowingSummon.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/IFollowingSummon.java index 20886d177a..92db76f674 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/IFollowingSummon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/IFollowingSummon.java @@ -1,21 +1,13 @@ package com.hollingsworth.arsnouveau.common.entity; -import net.minecraft.network.syncher.EntityDataAccessor; -import net.minecraft.network.syncher.EntityDataSerializers; -import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.PathfinderMob; -import net.minecraft.world.entity.TamableAnimal; import net.minecraft.world.entity.ai.goal.target.TargetGoal; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.level.Level; -import java.util.Optional; -import java.util.UUID; - public interface IFollowingSummon { - EntityDataAccessor> OWNER_UNIQUE_ID = SynchedEntityData.defineId(TamableAnimal.class, EntityDataSerializers.OPTIONAL_UUID); Level getWorld(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonSkeleton.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonSkeleton.java index 8cc27e6590..2293267048 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonSkeleton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/SummonSkeleton.java @@ -6,6 +6,8 @@ import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.players.OldUsersConverter; @@ -37,6 +39,7 @@ import java.util.UUID; public class SummonSkeleton extends Skeleton implements IFollowingSummon, ISummon { + public static EntityDataAccessor> OWNER_UNIQUE_ID = SynchedEntityData.defineId(SummonSkeleton.class, EntityDataSerializers.OPTIONAL_UUID); private final RangedBowAttackGoal bowGoal = new RangedBowAttackGoal<>(this, 1.0D, 20, 15.0F); From 000b6ab2a02fd99b6af390810fd3ae0085f7222e Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 25 Jul 2024 22:37:52 -0500 Subject: [PATCH 094/363] fix invisible rendered blocks --- .../renderer/entity/AnimBlockRenderer.java | 22 +++++- .../renderer/entity/CinderRenderer.java | 1 - .../EnchantedFallingBlockRenderer.java | 4 +- .../entity/EnchantedSkullRenderer.java | 1 - .../common/entity/AnimBlockSummon.java | 16 +++- .../common/entity/EnchantedFallingBlock.java | 12 ++- .../animations/animated_block_animations.json | 78 ++++++++++++++++++- 7 files changed, 122 insertions(+), 12 deletions(-) rename src/main/java/com/hollingsworth/arsnouveau/client/renderer/{tile => entity}/EnchantedFallingBlockRenderer.java (88%) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java index bfb773881b..7c00e9af60 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AnimBlockRenderer.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.block.MageBlock; import com.hollingsworth.arsnouveau.common.entity.AnimBlockSummon; +import com.mojang.blaze3d.vertex.ByteBufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.renderer.MultiBufferSource; @@ -29,7 +30,7 @@ public class AnimBlockRenderer extends GeoEntityRenderer { - + public static MultiBufferSource.BufferSource buffer = MultiBufferSource.immediate(new ByteBufferBuilder(1536)); protected static final ResourceLocation TEXTURE = ArsNouveau.prefix( "textures/entity/anim_block.png"); public static final ResourceLocation BASE_MODEL = ArsNouveau.prefix( "geo/animated_block.geo.json"); public static final ResourceLocation ANIMATIONS = ArsNouveau.prefix( "animations/animated_block_animations.json"); @@ -80,6 +81,7 @@ public void preRender(PoseStack poseStack, BOBBY animatable, BakedGeoModel model @Override public void renderRecursively(PoseStack poseStack, BOBBY animatable, GeoBone bone, RenderType ty, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int colour) { + super.renderRecursively(poseStack, animatable, bone, ty, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, colour); if (bone.getName().equals("block")) { AnimBlockSummon animBlock = animatable; if (animBlock == null) return; @@ -89,6 +91,7 @@ public void renderRecursively(PoseStack poseStack, BOBBY animatable, GeoBone bon if (!(blockstate.getBlock() instanceof MageBlock)) { try { Level level = animatable.level(); + if (blockstate != level.getBlockState(animBlock.blockPosition()) && blockstate.getRenderShape() != RenderShape.INVISIBLE) { poseStack.pushPose(); BlockPos blockpos = animBlock.blockPosition().above(); @@ -96,16 +99,27 @@ public void renderRecursively(PoseStack poseStack, BOBBY animatable, GeoBone bon poseStack.translate(-0.5D, -0.5, -0.5D); var model = this.dispatcher.getBlockModel(blockstate); for (var renderType : model.getRenderTypes(blockstate, RandomSource.create(blockstate.getSeed(animBlock.blockPosition())), ModelData.EMPTY)) - this.dispatcher.getModelRenderer().tesselateBlock(level, model, blockstate, blockpos, poseStack, this.bufferSource.getBuffer(renderType), false, RandomSource.create(), blockstate.getSeed(animBlock.getOnPos()), OverlayTexture.NO_OVERLAY, ModelData.EMPTY, renderType); + this.dispatcher.getModelRenderer().tesselateBlock(level, + model, + blockstate, + blockpos, + poseStack, + AnimBlockRenderer.buffer.getBuffer(net.neoforged.neoforge.client.RenderTypeHelper.getMovingBlockRenderType(renderType)), + false, + RandomSource.create(), + blockstate.getSeed(animBlock.getOnPos()), + OverlayTexture.NO_OVERLAY, + ModelData.EMPTY, + renderType); poseStack.popPose(); - buffer = this.bufferSource.getBuffer(RenderType.entityCutoutNoCull(TEXTURE)); + AnimBlockRenderer.buffer.endBatch(); +// buffer = this.bufferSource.getBuffer(RenderType.entityCutoutNoCull(TEXTURE)); } } catch (Exception e) { // We typically don't render non-models like this, so catch our shenanigans. } } } - super.renderRecursively(poseStack, animatable, bone, ty, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, colour); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/CinderRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/CinderRenderer.java index ec8d6d2302..506576493a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/CinderRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/CinderRenderer.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.client.renderer.entity; -import com.hollingsworth.arsnouveau.client.renderer.tile.EnchantedFallingBlockRenderer; import com.hollingsworth.arsnouveau.common.entity.EnchantedFallingBlock; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.renderer.MultiBufferSource; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantedFallingBlockRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/EnchantedFallingBlockRenderer.java similarity index 88% rename from src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantedFallingBlockRenderer.java rename to src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/EnchantedFallingBlockRenderer.java index 135228b1d2..033ec5fca2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/EnchantedFallingBlockRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/EnchantedFallingBlockRenderer.java @@ -1,4 +1,4 @@ -package com.hollingsworth.arsnouveau.client.renderer.tile; +package com.hollingsworth.arsnouveau.client.renderer.entity; import com.hollingsworth.arsnouveau.common.entity.EnchantedFallingBlock; import com.mojang.blaze3d.vertex.PoseStack; @@ -34,7 +34,7 @@ public void render(T pEntity, float pEntityYaw, float pPartialTicks, PoseStack p pMatrixStack.translate(-0.5D, 0.0D, -0.5D); var model = this.dispatcher.getBlockModel(blockstate); for (var renderType : model.getRenderTypes(blockstate, RandomSource.create(blockstate.getSeed(pEntity.getStartPos())), net.neoforged.neoforge.client.model.data.ModelData.EMPTY)) - this.dispatcher.getModelRenderer().tesselateBlock(level, model, blockstate, blockpos, pMatrixStack, pBuffer.getBuffer(renderType), false, RandomSource.create(), blockstate.getSeed(pEntity.getStartPos()), OverlayTexture.NO_OVERLAY, net.neoforged.neoforge.client.model.data.ModelData.EMPTY, renderType); + this.dispatcher.getModelRenderer().tesselateBlock(level, model, blockstate, blockpos, pMatrixStack, pBuffer.getBuffer(net.neoforged.neoforge.client.RenderTypeHelper.getMovingBlockRenderType(renderType)), false, RandomSource.create(), blockstate.getSeed(pEntity.getStartPos()), OverlayTexture.NO_OVERLAY, net.neoforged.neoforge.client.model.data.ModelData.EMPTY, renderType); pMatrixStack.popPose(); super.render(pEntity, pEntityYaw, pPartialTicks, pMatrixStack, pBuffer, pPackedLight); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/EnchantedSkullRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/EnchantedSkullRenderer.java index 3fbd3a979b..fea8217ea3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/EnchantedSkullRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/EnchantedSkullRenderer.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.client.renderer.entity; -import com.hollingsworth.arsnouveau.client.renderer.tile.EnchantedFallingBlockRenderer; import com.hollingsworth.arsnouveau.common.entity.EnchantedSkull; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimBlockSummon.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimBlockSummon.java index 418304b057..d269f7c4ca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimBlockSummon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AnimBlockSummon.java @@ -12,10 +12,13 @@ import net.minecraft.Util; import net.minecraft.core.Holder; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerEntity; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.*; @@ -234,11 +237,12 @@ public void setOwnerID(UUID uuid) { @Override public void registerControllers(AnimatableManager.ControllerRegistrar data) { String spawnAnim = "spawn"; - data.add(new AnimationController<>(this, spawnAnim, 0, (e) -> { + data.add(new AnimationController<>(this, spawnAnim, 1, (e) -> { if (!entityData.get(CAN_WALK)) { e.getController().setAnimation(RawAnimation.begin().thenPlay(spawnAnim)); return PlayState.CONTINUE; } + e.getController().forceAnimationReset(); return PlayState.STOP; })); @@ -262,6 +266,16 @@ public BlockState getBlockState() { return blockState != null ? blockState : BlockRegistry.MAGE_BLOCK.get().defaultBlockState(); } + @Override + public Packet getAddEntityPacket(ServerEntity p_352287_) { + return new ClientboundAddEntityPacket(this, p_352287_, Block.getId(this.getBlockState())); + } + +// @Override +// public double getBoneResetTime() { +// return 0; +// } + @Override public void recreateFromPacket(ClientboundAddEntityPacket pPacket) { super.recreateFromPacket(pPacket); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java index 663edb235f..4e1f271822 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java @@ -21,11 +21,14 @@ import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerEntity; import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.BlockTags; import net.minecraft.tags.FluidTags; @@ -78,11 +81,13 @@ public class EnchantedFallingBlock extends ColoredProjectile implements GeoEntit public EnchantedFallingBlock(EntityType p_31950_, Level p_31951_) { super(p_31950_, p_31951_); + this.blocksBuilding = true; } protected EnchantedFallingBlock(EntityType p_31950_, Level p_31951_, double p_31952_, double p_31953_, double p_31954_) { this(p_31950_, p_31951_); this.setPos(p_31952_, p_31953_, p_31954_); + this.blocksBuilding = true; } public EnchantedFallingBlock(EntityType p_31950_, Level world, double v, double y, double v1, BlockState blockState, SpellResolver resolver) { @@ -257,7 +262,7 @@ public BlockPos groundBlock(boolean ignoreAir) { this.discard(); if (block instanceof Fallable fallable) { fallable.onLand(this.level, blockpos, this.blockState, blockstate, new FallingBlockEntity(level, this.getX(), this.getY(), this.getZ(), this.blockState)); - }else if(context != null){ + }else if(context != null && resolver != null){ RewindAttachment.get(context).addRewindEvent(level.getGameTime(), new EntityToBlockRewind(this, blockpos, this.blockState)); ShapersFocus.tryPropagateBlockSpell(new BlockHitResult( new Vec3(blockpos.getX(), blockpos.getY(), blockpos.getZ()), Direction.DOWN, blockpos, false @@ -387,6 +392,11 @@ public BlockState getBlockState() { return this.blockState; } + @Override + public Packet getAddEntityPacket(ServerEntity p_352287_) { + return new ClientboundAddEntityPacket(this, p_352287_, Block.getId(this.getBlockState())); + } + public boolean onlyOpCanSetNbt() { return true; } diff --git a/src/main/resources/assets/ars_nouveau/animations/animated_block_animations.json b/src/main/resources/assets/ars_nouveau/animations/animated_block_animations.json index 9f08290179..7a80f020c6 100644 --- a/src/main/resources/assets/ars_nouveau/animations/animated_block_animations.json +++ b/src/main/resources/assets/ars_nouveau/animations/animated_block_animations.json @@ -221,7 +221,7 @@ } }, "spawn": { - "animation_length": 1.25, + "animation_length": 0.7917, "bones": { "left_boot": { "rotation": { @@ -294,8 +294,82 @@ } } }, + "spawn2": { + "animation_length": 1.25, + "bones": { + "left_boot": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.3333": { + "vector": [82.08, 0, 0], + "easing": "easeInSine" + }, + "0.7917": { + "vector": [0, 0, 0], + "easing": "easeInSine" + } + } + }, + "right_boot": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.3333": { + "vector": [-57.5, 0, 0], + "easing": "easeInSine" + }, + "0.7917": { + "vector": [0, 0, 0], + "easing": "easeInSine" + } + } + }, + "block": { + "position": { + "0.0": { + "vector": [0, -11, 0] + }, + "0.4167": { + "vector": [0, 9, 0], + "easing": "easeOutSine" + }, + "0.7917": { + "vector": [0, 0, 0], + "easing": "easeInSine" + } + } + }, + "animated_block": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.7917": { + "vector": [0, -360, 0], + "easing": "easeOutSine" + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.4167": { + "vector": [0, 9, 0], + "easing": "easeInSine" + }, + "0.7917": { + "vector": [0, 0, 0], + "easing": "easeInSine" + } + } + } + } + }, "spawn_old": { - "animation_length": 1.33333, + "animation_length": 1.3333, "bones": { "left_boot": { "position": { From 18a0a7c620480af6d0fa18a59379a7cd782f9986 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 25 Jul 2024 22:47:50 -0500 Subject: [PATCH 095/363] 5.0.2 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index d88c73c9a1..4263bdbedd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.0.1 +mod_version=5.0.2 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 3624531cf1670cefb44f795dff47ff41df44f0b9 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 27 Jul 2024 14:47:37 -0500 Subject: [PATCH 096/363] fix crash with mob jar --- .../arsnouveau/common/block/tile/MobJarTile.java | 8 ++++---- .../arsnouveau/common/items/MobJarItem.java | 2 +- .../arsnouveau/common/items/data/MobJarData.java | 13 +++++++++---- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java index 5120cfccfc..8d4895157c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java @@ -37,7 +37,7 @@ public class MobJarTile extends ModdedTile implements ITickable, IDispellable, I private CompoundTag entityTag; - private CompoundTag extraDataTag; + private CompoundTag extraDataTag ; public MobJarTile(BlockPos pos, BlockState state) { super(BlockRegistry.MOB_JAR_TILE, pos, state); @@ -237,9 +237,9 @@ public void getTooltip(List tooltip) { @Override protected void applyImplicitComponents(DataComponentInput pComponentInput) { super.applyImplicitComponents(pComponentInput); - var jar = pComponentInput.getOrDefault(DataComponentRegistry.MOB_JAR, new MobJarData(new CompoundTag(), new CompoundTag())); - this.entityTag = jar.entityTag(); - this.extraDataTag = jar.extraDataTag(); + var jar = pComponentInput.getOrDefault(DataComponentRegistry.MOB_JAR, new MobJarData(Optional.empty(), Optional.empty())); + this.entityTag = jar.entityTag().orElse(null); + this.extraDataTag = jar.extraDataTag().orElse(null); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java index 1cc2673edb..c0bd978d40 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java @@ -77,7 +77,7 @@ public static Entity fromItem(ItemStack stack, Level level){ var jarData = stack.get(DataComponentRegistry.MOB_JAR); if(jarData == null) return null; - CompoundTag entityTag = jarData.entityTag(); + CompoundTag entityTag = jarData.entityTag().orElse(new CompoundTag()); if(entityTag.isEmpty()) return null; return MobJarTile.loadEntityFromTag(level, entityTag); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MobJarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MobJarData.java index 76b3ca1823..2c0b964c83 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MobJarData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/MobJarData.java @@ -8,14 +8,19 @@ import net.minecraft.network.codec.StreamCodec; import java.util.Objects; +import java.util.Optional; -public record MobJarData(CompoundTag entityTag, CompoundTag extraDataTag){ +public record MobJarData(Optional entityTag, Optional extraDataTag){ public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - CompoundTag.CODEC.fieldOf("entity_tag").forGetter(MobJarData::entityTag), - CompoundTag.CODEC.fieldOf("extra_data_tag").forGetter(MobJarData::extraDataTag) + CompoundTag.CODEC.optionalFieldOf("entity_tag").forGetter(MobJarData::entityTag), + CompoundTag.CODEC.optionalFieldOf("extra_data_tag").forGetter(MobJarData::extraDataTag) ).apply(instance, MobJarData::new)); - public static StreamCodec STREAM_CODEC = StreamCodec.composite(ByteBufCodecs.COMPOUND_TAG, MobJarData::entityTag, ByteBufCodecs.COMPOUND_TAG, MobJarData::extraDataTag, MobJarData::new); + public MobJarData(CompoundTag tag, CompoundTag extraTag){ + this(Optional.ofNullable(tag), Optional.ofNullable(extraTag)); + } + + public static StreamCodec STREAM_CODEC = StreamCodec.composite(ByteBufCodecs.OPTIONAL_COMPOUND_TAG, MobJarData::entityTag, ByteBufCodecs.OPTIONAL_COMPOUND_TAG, MobJarData::extraDataTag, MobJarData::new); @Override From 91c11faea83e37a3a6b501ec3ebf79f709dfb757 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 27 Jul 2024 16:29:14 -0500 Subject: [PATCH 097/363] Update Starbuncle.java --- .../com/hollingsworth/arsnouveau/common/entity/Starbuncle.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 2bf3d3ba98..be0dfe4e82 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -689,7 +689,7 @@ public String getColor() { @Override public ResourceLocation getTexture(Starbuncle entity) { if(entity.getName().getString().equals("Gootastic")){ - return new ResourceLocation(ArsNouveau.MODID, "textures/entity/starbuncle_goo.png"); + return ArsNouveau.prefix( "textures/entity/starbuncle_goo.png"); } String color = getColor(entity); if (color.isEmpty()) color = DyeColor.ORANGE.getName(); From b90fe22a20f2eac698b174cf282a0c942c170c26 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 27 Jul 2024 16:47:24 -0500 Subject: [PATCH 098/363] Readd missing item capabilities #1352 #1351 --- .../setup/registry/CapabilityRegistry.java | 39 +++---------------- 1 file changed, 6 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java index b21308c849..efad042433 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java @@ -55,7 +55,12 @@ public static ANPlayerDataCap getPlayerDataCap(final LivingEntity entity) { public static void registerCapabilities(RegisterCapabilitiesEvent event) { event.registerEntity(MANA_CAPABILITY, EntityType.PLAYER, (player, ctx) -> new ManaCap(player)); event.registerEntity(PLAYER_DATA_CAP, EntityType.PLAYER, (player, ctx) -> new ANPlayerDataCap(player)); - var containers = List.of(BlockRegistry.ENCHANTING_APP_TILE, BlockRegistry.IMBUEMENT_TILE, BlockRegistry.SCRIBES_TABLE_TILE); + var containers = List.of(BlockRegistry.ENCHANTING_APP_TILE, + BlockRegistry.IMBUEMENT_TILE, + BlockRegistry.SCRIBES_TABLE_TILE, + BlockRegistry.ARCANE_PEDESTAL_TILE, + BlockRegistry.ARCHWOOD_CHEST_TILE, + BlockRegistry.REPOSITORY_TILE); for(var container : containers){ event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, container.get(), (c, side) -> new InvWrapper(c)); } @@ -67,38 +72,6 @@ public static void registerCapabilities(RegisterCapabilitiesEvent event) { @SuppressWarnings("unused") @EventBusSubscriber(modid = ArsNouveau.MODID) public static class EventHandler { -//TODO: verify if player clone needed - -// /** -// * Copy the player's mana when they respawn after dying or returning from the end. -// * -// * @param event The event -// */ -// @SubscribeEvent -// public static void playerClone(PlayerEvent.Clone event) { -// Player oldPlayer = event.getOriginal(); -//// oldPlayer.revive(); -// var oldMana = getMana(oldPlayer).orElse(null); -// var newMana = getMana(event.getEntity()).orElse(null); -// if (oldMana != null && newMana != null) { -// newMana.setMaxMana(oldMana.getMaxMana()); -// newMana.setMana(oldMana.getCurrentMana()); -// newMana.setBookTier(oldMana.getBookTier()); -// newMana.setGlyphBonus(oldMana.getGlyphBonus()); -// } -// -// var oldPlayerCap = getPlayerDataCap(oldPlayer).orElse(null); -// var newPlayerCap = getPlayerDataCap(event.getEntity()).orElse(new ANPlayerDataCap(event.getEntity())); -// if (oldPlayerCap != null) { -// CompoundTag tag = oldPlayerCap.serializeNBT(event.getOriginal().level.registryAccess()); -// newPlayerCap.deserializeNBT(event.getOriginal().level.registryAccess(), tag); -// syncPlayerCap(event.getEntity()); -// } -// -// -//// event.getOriginal().invalidateCaps(); -// } - @SubscribeEvent public static void onPlayerLoginEvent(PlayerEvent.PlayerLoggedInEvent event) { From c29d4a4fb56f37668fd67b4a49f05fed355c6a49 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 27 Jul 2024 22:24:55 -0500 Subject: [PATCH 099/363] 5.0.3 --- build.gradle | 35 +++++++++++++++-------------------- gradle.properties | 2 +- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/build.gradle b/build.gradle index a1c88e9df3..95bdef674e 100644 --- a/build.gradle +++ b/build.gradle @@ -118,26 +118,21 @@ dependencies { implementation 'top.theillusivec4.curios:curios-neoforge:9.0.4+1.21' } -//tasks.withType(ProcessResources).configureEach { -// var replaceProperties = [ -// minecraft_version : minecraft_version, -// minecraft_version_range: minecraft_version_range, -// neo_version : neo_version, -// neo_version_range : neo_version_range, -// loader_version_range : loader_version_range, -// mod_id : mod_id, -// mod_name : mod_name, -// mod_license : mod_license, -// mod_version : mod_version, -// mod_authors : mod_authors, -// mod_description : mod_description -// ] -// inputs.properties replaceProperties -// -// filesMatching(['META-INF/neoforge.mods.toml']) { -// expand replaceProperties -// } -//} +jar { + manifest { + attributes([ + "Specification-Title": "ArsNouveau", + "Specification-Vendor": "baileyh", + "Specification-Version": "1", // We are version 1 of ourselves + "Implementation-Title": project.name, + "Implementation-Version": mod_version, + "Implementation-Vendor" :"baileyh", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), + "MixinConfigs": "ars_nouveau.mixins.json" + ]) + } +} + publishing { publications { diff --git a/gradle.properties b/gradle.properties index 4263bdbedd..baf97651dd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.0.2 +mod_version=5.0.3 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 3ad65df540fee84e7a917a9455fc2cf387517d23 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 28 Jul 2024 10:59:13 -0500 Subject: [PATCH 100/363] update item assets --- .../textures/item/alchemists_crown.png | Bin 603 -> 593 bytes .../textures/item/amulet_of_mana_regen.png | Bin 504 -> 505 bytes .../textures/item/annotated_codex.png | Bin 488 -> 478 bytes .../textures/item/belt_of_levitation.png | Bin 3939 -> 587 bytes .../textures/item/belt_of_unstable_gifts.png | Bin 3985 -> 597 bytes .../textures/item/blank_thread.png | Bin 408 -> 404 bytes .../ars_nouveau/textures/item/caster_tome.png | Bin 488 -> 474 bytes .../textures/item/dominion_wand.png | Bin 500 -> 506 bytes .../textures/item/dowsing_rod_100.png | Bin 370 -> 326 bytes .../textures/item/dowsing_rod_25.png | Bin 275 -> 271 bytes .../textures/item/dowsing_rod_50.png | Bin 320 -> 289 bytes .../textures/item/dowsing_rod_75.png | Bin 343 -> 302 bytes .../textures/item/enchanters_eye.png | Bin 583 -> 528 bytes .../textures/item/enchanters_mirror.png | Bin 779 -> 766 bytes .../textures/item/enchanters_shield.png | Bin 1449 -> 1492 bytes .../textures/item/enchanters_sword.png | Bin 714 -> 712 bytes .../heavy_armor/battlemages_cowl_gold.png | Bin 166 -> 166 bytes .../heavy_armor/battlemages_gambeson_gold.png | Bin 116 -> 118 bytes .../battlemages_legguards_gold.png | Bin 164 -> 163 bytes .../light_armor/sorcerers_collar_gold.png | Bin 145 -> 157 bytes .../item/light_armor/sorcerers_wrap_gold.png | Bin 152 -> 156 bytes .../textures/item/lingering_flask_cannon.png | Bin 2134 -> 2129 bytes .../item/medium_armor/arcanists_hat_gold.png | Bin 156 -> 158 bytes .../medium_armor/arcanists_robes_gold.png | Bin 154 -> 153 bytes .../textures/item/mundane_belt.png | Bin 3734 -> 427 bytes .../item/ring_of_greater_discount.png | Bin 535 -> 526 bytes .../textures/item/shapers_focus.png | Bin 354 -> 348 bytes .../textures/item/spell_crossbow.png | Bin 740 -> 728 bytes .../textures/item/spellbook_black.png | Bin 3654 -> 3625 bytes .../textures/item/spellbook_blue.png | Bin 3709 -> 3690 bytes .../textures/item/spellbook_brown.png | Bin 3657 -> 3673 bytes .../textures/item/spellbook_cyan.png | Bin 3724 -> 3714 bytes .../textures/item/spellbook_gray.png | Bin 3730 -> 3754 bytes .../textures/item/spellbook_green.png | Bin 3642 -> 3674 bytes .../textures/item/spellbook_light_blue.png | Bin 3741 -> 3723 bytes .../textures/item/spellbook_light_gray.png | Bin 3788 -> 3727 bytes .../textures/item/spellbook_lime.png | Bin 3698 -> 3709 bytes .../textures/item/spellbook_magenta.png | Bin 3704 -> 3704 bytes .../textures/item/spellbook_orange.png | Bin 3581 -> 3580 bytes .../textures/item/spellbook_pink.png | Bin 3722 -> 3710 bytes .../textures/item/spellbook_purple.png | Bin 3708 -> 3711 bytes .../textures/item/spellbook_red.png | Bin 3711 -> 3718 bytes .../textures/item/spellbook_white.png | Bin 3753 -> 3779 bytes .../textures/item/spellbook_yellow.png | Bin 3703 -> 3713 bytes .../ars_nouveau/textures/item/spellbow.png | Bin 414 -> 423 bytes .../textures/item/splash_flask_cannon.png | Bin 1674 -> 1697 bytes .../textures/item/summon_focus.png | Bin 634 -> 626 bytes .../textures/item/thread_amethyst_golem.png | Bin 506 -> 508 bytes .../textures/item/thread_bookwyrm.png | Bin 502 -> 497 bytes .../textures/item/thread_chilling.png | Bin 525 -> 519 bytes .../textures/item/thread_depths.png | Bin 502 -> 500 bytes .../textures/item/thread_drygmy.png | Bin 472 -> 470 bytes .../textures/item/thread_feather.png | Bin 506 -> 501 bytes .../textures/item/thread_gliding.png | Bin 468 -> 466 bytes .../textures/item/thread_heights.png | Bin 475 -> 470 bytes .../textures/item/thread_high_step.png | Bin 517 -> 511 bytes .../textures/item/thread_immolation.png | Bin 496 -> 494 bytes .../textures/item/thread_kindling.png | Bin 484 -> 478 bytes .../textures/item/thread_life_drain.png | Bin 448 -> 443 bytes .../textures/item/thread_magic_capacity.png | Bin 465 -> 460 bytes .../textures/item/thread_repairing.png | Bin 531 -> 526 bytes .../textures/item/thread_spellpower.png | Bin 533 -> 529 bytes .../textures/item/thread_starbuncle.png | Bin 472 -> 465 bytes .../textures/item/thread_undying.png | Bin 528 -> 527 bytes .../textures/item/thread_warding.png | Bin 517 -> 515 bytes .../textures/item/thread_whirlisprig.png | Bin 503 -> 486 bytes .../textures/item/thread_wixie.png | Bin 483 -> 481 bytes .../assets/ars_nouveau/textures/item/wand.png | Bin 616 -> 556 bytes .../ars_nouveau/textures/item/witch_hat.png | Bin 555 -> 563 bytes 69 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/ars_nouveau/textures/item/alchemists_crown.png b/src/main/resources/assets/ars_nouveau/textures/item/alchemists_crown.png index 93eefa30fc879842922a0d5727a851b987991bb7..105fd5f7a1a3daa13e36f606cad12122093e1629 100644 GIT binary patch delta 555 zcmV+`0@VH61knVLF@Fn5L_t(Ijir!5NRx3G#(#g=(s1*#Qx=;OXV5Mm2!V$@`L&UY zh+xA*NmzIYQqq$U9=cT!yF_6cb<0Qz3wAINVL>%w6&ta>iY0RuOlYpyocVUheVUtI zdf20DrPAJ_4F!cZ15rM9RQB z`Ifn^Lkt?92)DJ8DV6D(jpLp?U6p9lU}Ivo#mB;NjjM}`gxgxpNtsfaz84>;^i&cl z5h1Zu6mN3_{nsY}IN5!Idq)rAuHOs5{(39j3rW1q4IFsY1;8!q3<1rdl!)*oo|Bom z$4m@&fW!b;{(t(O0qrgTx8rC3+1nePXWSDZpgEKUU}`?e{oxKqJ9Vsfi`n?_+cS_D zW4_B~t-P{EV!Dr^sU!jI2o`{`!&g8;SnU?h-OyRhXPLMZXS7oXsH*>5{!Zy;4-Dn0 z3$-`NR`+YYv!>|da*@~BUzAtYSj}e%55&wQKT7L_+JBn_pR-Yns4hW|U2>Tb`SR|J z1U+^Mdh8-1hzOOx5!Jf&=YipXEBx$uKjUin=%GfgC2P}{i+z0a$-&5La#09c<8 z>iShpZUc3I+S9bJnvplAxEA~_n?%wDrF_mt0LGu5lJh-}Hq(3#<9844q$iRtD8I`F tl|zXLxg^Yp$nQIn%Z$j@`fl&P@dxf4CEyDLuBHG0002ovPDHLkV1jhe4-fzV delta 565 zcmV-50?Pf-1lt6VF@F_FL_t(IjjfYiNRx3C#(!^YXv}$`(8a3xfip-ib`@*XE<$@P z7tzh6Aid}!BCuFgXx(%beGu%TFS3DwMFqL2U>74ou*f1Lx20(Mw3{{1D6776|+rs`EjcG)?fNZ@N~)RkuP1$th- zr`S_;q=*QSWKLQvl^nR}2VhUzZU(n+prK+l0Bb9Zw2ee*u~f3|l?#At#$nv{T162N z9*=*P;m|{FdVd8iJqf_PHj8)L696tf?Oe9^rgu?p*n+t2wTc1Y-m@sTyh6XT52M+j zH{MU5LrYKM>lxB(h3o=j13NesisH6!#Q<=!;RITG3r4en?lZ0A=CTZ(ou=Q}2T)S~ zo=K6v(g{a1tmzAT2QSf2?reF zv6Z)`%!H-{+mDsV~ zi4tt_Vk-auEqPpOEEkk=m>#OtM0~Vex2xxmfzsNNEUuxbRucf1?>Ob~-sd{;?H7mG zxA|&W(JrE+j=HMlpD7XU5mU_?=CxVYw+@!K{J-NDDYGdP_rneC00000NkvXXu0mjf Djja@( diff --git a/src/main/resources/assets/ars_nouveau/textures/item/amulet_of_mana_regen.png b/src/main/resources/assets/ars_nouveau/textures/item/amulet_of_mana_regen.png index 8decefb32952c4107572e6e76c26f6a217b942ec..e047c96a1ad85d43e1a6f681b9a13c8ce08e1b86 100644 GIT binary patch delta 466 zcmV;@0WJRc1Nj4xF@Lj3L_t(Ijg68&Xj5Sn#ebi;r(k@d*g}Vx4sMcwjh(D?iBd3e zG8rr=Vpp9M=Qt=7p|rSnXos3Qh;(YI0aGRVP+LKYub2`^TAxeJV2?w2<-M0bc;HSS z=iGD8`M?KBZBt0aRW#X1HaZ8=@@aE0+gfelf-NDM%uHpY-dS=iKUN#;M9Tck$ zOpa>k>2jNkaDO)5_J9Cjid9E`5s&y_*(MQ<1gv)w;NI$2^XS4E5hD8A$PS$VU}58D z`+bto-)CC9^h1T@k{mm){m>^~scGZXay*$h{o=14W1e{|?YKC;$Ke07*qo IM6N<$g5<8`kpKVy delta 465 zcmV;?0WSXe1NZ}wF@Lg2L_t(Ijg68$Xj5Srg`ZE{Q!qpdt>6&T!8L&zJK0W#x};7f z4uXpvZ3poO1cx{{h)au5I(2A=kUEHTGOYnqrFdy=3#E8VuB{}k*FlV8k3+fT-Xy(v z;2qENp6|RL_#~-q3hB6PE3a}!vaP%d>9`8%IFbN3MTjc7lz*yqmpAucQ?e)d^n96W z-DTi>mnykbIG~bC=~?v)v+H{XFvI6=o5!X7LIBqKeW`Lr+FzEoCe#rUs^U;hTNBc%ero#9 zuF9Ds$l+Q)s$c5}2%K@l{fILUWBWTidjEk&)1m&$2})fWXwW&M!S*s#N1PMaHOUS8# z3Oz|_@tPmdzmb37sfSW84Yq|+iFgr15%d;GDpCk+V(SvRE-@Ay51Sb`ZQ@1W(+o4u z^L^h8+%bk)d@2MoWy8W+(uiM}8Gj=IzHP(hACJe+wtCKo)PEvn!~9(EA1H#w}F{gA8vj@ zNj|?{WXwsilqqU~0)L;@0m!ZHM+cV2srTK`-}tXYMKFQ=VBJAKNk0hCpi0jsF3}kP h4isofH-o@?%QZg7ub1j>q@&X~7Ml@RqT?C|*rclAbl3hS6iCWAoB$V65c(0mjH|f7R z!@b{k&Y24jjG>Cs`<{$hu(~^Aj9y4AWF>tHsh6mx^0=s9@3HkEQlOGZ~waIIShpi<8G4SN1mhV7&zo>x=BYJ9YoQkLMckHDouuBN$@2as; z@)8?fn)EpZ(!Adx`Vaqw>UzxSMT&*6vvT|x+9H_>Q9{(o&Zn|*0FmSuGlM576* zC}9996}<~NI_f8%{{kR#xmN(RTCFw#KrA*d6(vliqNA#X-=rgv=`ND}{TIK^>IKiu z-4Fn&)SHVOvX`V|rys!S93YiygL{Cskg67BBmyTV-|%<>SeAv9vQ5yb4!BhMM6=nn z--E#`0F=u$Jb#`5fQ-fFMVAGqbAWVuugl}X!8z;eTN2>tXp2tB7k7n}l9`zWsVHHV z6C*6#|6nUmOx$E`?K)>?4pvtmF*H=NXOokcNvHP^QcA|h<1+tood+9PmJ=iRr{XLo zKeM!S3r(v6U>GKwo3GKdw|G1Od_EVdTA&Z$tNM)U_kUw56&<%Xh+fR_MNRk0U#T7jd!__FborbWb)FV{>Z=8Pq{JO`K|TgV*mgE07*qoM6N<$f-Nrt A6951J literal 3939 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 diff --git a/src/main/resources/assets/ars_nouveau/textures/item/dominion_wand.png b/src/main/resources/assets/ars_nouveau/textures/item/dominion_wand.png index 4f6dfd3e69094f2690e833108fd830a14f6c28b7..8754f98660d4243bb5066b7bf1a8e04af828d0f4 100644 GIT binary patch delta 467 zcmV;^0WALX1NsAyF@Lm4L_t(Ijg^u=NE>k!$3NG9kforY#z4v7;3UPC21+SpxZj|( zgo1;Ui-HIpg+ljIOxv|3kRshXoFov`C4-kq#j8*ZMh7)_8tx(qSfdbM2k|hqx!@b$ z?|r`S``-J(Ekc@UF;rRRVi_@1Sw!R(@WqB0sw~x2k)4!Cb$?Z4E|!sdojR^0Ch^W} zkQ~KYA46*q>QUDgB&R1dc(RI<1Yo0o^%xQ!-u20{_&dJ1fS7UHsn{hPPjk0v<9HffgwP~}XMkN$Lt~%5X8+qK@fvML zBV%}tHu;sbfB$qX7hvGb1CUBpBo+;kS-!A*e*8!QTz|Sm!!Y>xW>R9&5V`UZwZo3u${kR#OMLxR@^u48Fbsnwm6v*}%C#HM z0Mz1!O?G|)K<=lf5ZzUGUR3)NT!bA@4{D-Bcm1wyn74URHkrIMvOABdD3y00000NkvXXu0mjf D{5#z= diff --git a/src/main/resources/assets/ars_nouveau/textures/item/dowsing_rod_100.png b/src/main/resources/assets/ars_nouveau/textures/item/dowsing_rod_100.png index 4f8ff2f3a42ead5398221c9c36e8bd92a62b894f..0d76e5eb59cf1fff05ed47eb2ee5af70e42c58c6 100644 GIT binary patch delta 286 zcmV+(0pb4g0>%Q6F@FF_L_t(IjbmV-7Wn_~!vFvOF8u%hcg}yx4I{x27G#dMxA%WR zK|uya<`hO^4PZhSu&}UTh>3}TyWs!73wT`vcfq5}asTCX7cnw0F#LCNa$;a$VEDgy zp#uXWlL2wAd2~4rZqwVRCI8<(E%}e^5^UoujUV1NqKT z*Zm?s?lDa4lwgQUyUy_b{dOep1`mH koL(Rn5N!amzZaz0m3;+NC delta 330 zcmV-Q0k!_d0`dZoF@G#cL_t(Ijjd8KNW(xBeOHTn=%64t92srEEs!nH=@tdY(5Z`) zOF|C?;S1MpS=~7j0-P{Nv$g-?oIj9v2uInNQ0)OowAFb3uJZ_Qgg$w}s zz7GI&GuQ^(=u~qPk6XG^8nr2n+GIMJPP()zn+5e;#P&u^2tkhHAj>lJPixq1-mzTB z%xED*+Z*YF%fl2G4*=&J=L4lVpR*2#% zD*(7OO##3eV?;24wN})14JqYUlG{c5(Gig=iehw=xA}VB^5fszX zP_WzOqV+z@imVKSg1*Uorp>WG90M`#f5Fkxc6p+VtWdUF~J}@VsfCwRw=VLjNwTH>r z;hbZ;r?UTg-rW)EPB`ZvBE*Xu;^U~CX{}k~3vEuaEW>7g!7>?uh(Ppl)ES|!-FXUQ knqP4`aOrn|YVNP<4Ihk22z&RejsO4v07*qoM6N<$f`4Ujy#N3J diff --git a/src/main/resources/assets/ars_nouveau/textures/item/dowsing_rod_50.png b/src/main/resources/assets/ars_nouveau/textures/item/dowsing_rod_50.png index eb3e3feab740b345f5360f65b5b687d11e9d93d0..10d43fbe91df1b31d2f68c242bd833c6d6ac1551 100644 GIT binary patch delta 248 zcmVK$)y?{WW1N=ghdF){zSg~U({ zTe4&cBTg5v@kzoBxp(g#!^BPrhPbrr4Da8+XL$eqJzO2$P=@)LTS$x{zx)LQwphXI y1v%YCj0_Br02LGz#Ht3T7l;K!8-VO@ssaE)K~Rg6W1x)y0000A>0F@O3=L_t(Ijop!_(PFX) zis^zJ9@s4=nP{-g|6mhVVT){VF(~LuR>yGcvYad9fyuAU$2ULT_a6K&8Do5&=YE+# zgGD1r5|)7syAS7_0(_Qb0Nz@wLV(_YF~+B9N?DdPkhkYU4}Y+_cCLbe1`@|HbzL(( z8n8aTYC&Ddw;eP(-Fc!Y3bfXo%syNHyrl`+OgQG|#v*?(bjF={i` zTJ_@ujhu6;sw$3mA32z=AR>rJcmjZjo1{JG+4Tl}R~arEU2SgPDwr=+>;6ozLP);` ebbJ4)z5rycQxVVD4lZ>70000 zn3$OV+(Kd~0lZ|%5=M+zfB`l>Nw^{R?%iXU*eSsfmv)`u{rmR}@87?NtHT?@Feh^h zi817tzhGFhWC@0Pyk3ygUBt-100~e*K|!o)aC(7QK(qnK{-!Db083zFU8w|M+yDRo M07*qoM6N<$f|d+`?f?J) delta 304 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 delta 1432 zcmV;J1!wxy3#ki`BYyw^b5ch_0Itp)=>Px)V@X6oR9J=WmS0R;bri=xmo-fhZcQ&1 zDRd05YX_)he{`tXi%G}BVrFKR%@~m-zRV%X=8|c6Fnci0WRf_CBxWZ5$rM8*Tjm}Z z35i*78*F3^tD{}R3^KZal-UcesTtRY+u!9D+LGuV_kFoHzkmDt{mwbx^S$RBY4*-x zjWibG(*Vp~>%?ELGHH9CBBc}nrECLc#P5z7XDXlhRsxt9ZPozejDBt(+K7XK=gK9r zzyk2~M|%PAdVIXN=P1EA5R$13l=AD39}@Q*jEh>@y8*cM(QU zkjmyz$}rKqbjQF@n4RmP;mrxO5l2o3q>0gHEtQC2wY!+T)=BEmTIS~qDK5Sb!1D+D z_~W-vGK2-XGi&RP0GBcZIeV>>lFbK5C1L>7Sid0{lG)fIXBS~lR~rBgrLXh19Uhx6 zWc_O|0Dlnc8$cUz5c_2S>k~Ke*Q+NCIG+4;r?SnV$S0iA((LZdcNh1Kq2JQ2gK z^nYS=>XEqb!FcK|N;bQY6ESXH=_L{k8}*`gYs_#$IF$+vD(-mxuD9Z1fo zX^Q%RFv%I!NJ-Q7R=ge`JzZ^hJ(&mfHGkdlr(eA+0Y=_$kM|RahN-R*cjsonA`Ag( zG3qo6+LlBr1NygG=Ps&iRz_uW${BYFerdn_li`RVOhSg8U!m(HSWnM!NL*I7liSA0tB$+YMJ7~Z0kizDe=2whBG31 zn^QKr-^P|L(&F%xmahl_SaKO!o=Y=?VWAU8l^?3~spUWReg0F#q}gZs*jXoQhqdZrU1 zT3*jZlQAni7Xz!oVxC%s=m6gPVvFJVr|(=f#wwdrW~qVc>54?dt48|JaN|s)X0GY~ m7X|<2kmv)C@CXkB{{nLe;}H+?xtwSK0000EhZH8cZ_};&cr5w(WHrD)ZN2d#8gu z?Ik+wb9tZV{XGxg@AG?}=l2lwX|lhtDTlw33(5Y%rbsR%l79=y+%rvvZ+sNVO^NI; zisV8PkGMo~Q$m?kb+l{Tc`!>llLEl)7(@b1jCke&nE2Gr%IY!z_lJMseE|}#+?d|;rvi$qdI0!;uUk}B@ez2e09_eq*t$4%uLsM5tYRH&=9 zu(G<$*ZDOPNq@DN6`gM%9?_S>JQFW01xMg{4qE5@;fkRF6!v>B4X046Lj! zQ&($YL#0G8ok=k}~12f*25;Yw#0 zmwF#F=BdU#x`$%5V>))X>>B`JPOCB0Xqb01Hqz?B-BzPvCcRmJVjXZgB1UMIP_>)d zDl~2Ernab4P68Cn*hnN*&REZ)wA@0m`g!s&N+kBfI0H47765j3_NcM6Fy^VI_0$P^ zuE$tg-+u&b`H|vBjfUyFwgkYd*TxtyA7lUyw{@KTeXK{&z;-svb|#bmmsN@b7pHpxQ2N*DXx9ugfd0Y-ecE5E+uSovZeM;WL7!GqEsfGQ ztI;rs|HuJt2T3SCRR0uxwLzaI-XXtXE3Z(YLL7w(6)OBU`~kumR?^_205$*s002ov JPDHLkV1i*pLn#0N delta 677 zcmV;W0$TmZ1At4o61qB1?lm~-6 zB-SAsb_khKDR?M61YYcrCP9}h60J*NpdLEdQ7}-{FV$B7Y+bk&(sJpei2U{3N#5 zdW6Wl6(S>xaKJ0J*LnnbVsY22+G^1%R$L8Gx5h8=)w7k#;ObVAjsOx5GzSsf1s)BNiOQ;>w9>HeK2= z&OmTw8EbI~5rrJV|^bINMZh zgl4XRR8-Z4Q&Ck9Xmhc6wn!@LuHvY6llU2A=a=6w1D2w4I{>9lK~cG#(D*EHe7DNx z5B-=98-L9gv-UBYZI4t`#b(>XX4})}y6)Z~yt%3`sK4=!-?3@K3|Jt$BkQ>e0Gys$ zQc;yuRK@A3MGa+N3{O7;pt3HEyWY4ASWaJVL^^ezrLo&wY_}h)?5RP7RtJ#1g#5DI zI0Hx9?Px#07*qoM6N<$g8c3;1poj5 diff --git a/src/main/resources/assets/ars_nouveau/textures/item/heavy_armor/battlemages_gambeson_gold.png b/src/main/resources/assets/ars_nouveau/textures/item/heavy_armor/battlemages_gambeson_gold.png index eacd975f5dde8c1bc59a31de4e4c41ddf9e7839f..7fdc2f479b90d3426543bdcf96978f8d3655feaf 100644 GIT binary patch delta 74 zcmXRZn_%c_;OXKRV$qwNAi?U=_`m-7pa1{gAF9tO(m5jW;oVVQHbqXO-2KH@L|30( eoFEb)%E0jO7q2Sw;dAF1fWXt$&t;ucLK6VV@*ffa delta 72 zcmXRbnPBLw=jq}YV$qwNAi?U=_}~8azyH6tey}&Q6kFu;qik;D#BQJ4|7|`V&HAh% c!5YHKz~;px_j;YgbOs>sboFyt=akR{0D7k#fB*mh diff --git a/src/main/resources/assets/ars_nouveau/textures/item/heavy_armor/battlemages_legguards_gold.png b/src/main/resources/assets/ars_nouveau/textures/item/heavy_armor/battlemages_legguards_gold.png index 360e254e1d2b6082f8d02d78d8437750d29ac1ea..0cfcaffd2a57990b8176a031cc4d4299918251de 100644 GIT binary patch delta 121 zcmV-<0EYjh0iywsF>+l=L_t(IjbmUK1%nJ+n5^;t|Gx|W|NouyA6*V6eqpi(iX0P$ zDgVzfynAs2({x_u?L_t(IjbmUK1%nJ+n5^;t->-%L|Nm_Jk1hujzc5(?MUDww zA>;q23=H3{V;GK094q+q#23Q_|KG=Ah+(+k!eovAKhK%}|NH6{hQhyJKQR1x;)~&h cQ7{+)0J4rU4Ftore*gdg07*qoM6N<$g4_)`2LJ#7 diff --git a/src/main/resources/assets/ars_nouveau/textures/item/light_armor/sorcerers_collar_gold.png b/src/main/resources/assets/ars_nouveau/textures/item/light_armor/sorcerers_collar_gold.png index f00fd3342f36825e8ae24a20227a9d574cecd58c..4629bcceebed072b7c84a87a1cbed19fc5131c49 100644 GIT binary patch delta 115 zcmV-(0F3{U0i6MmF>F^!L_t(IjbmUK1=IrXh%DlnA zz`*eKX$j?qJh~kB|Iy_*6oc*@b^VWx&4|w+WQ7b23=AsPyBU$iznptav15k=007|N VBCe9B%r^i4002ovPDHLkV1gv7G@<|i delta 103 zcmV-t0GR)s0g(ZaF^5==~ z|36QBQ4IQd&ip?%HVZZbSY$RcqANrPKhK%}zkc*1#f}{g00544N|O002ov JPDHLkV1n^ZD%1b~ diff --git a/src/main/resources/assets/ars_nouveau/textures/item/light_armor/sorcerers_wrap_gold.png b/src/main/resources/assets/ars_nouveau/textures/item/light_armor/sorcerers_wrap_gold.png index 2de066c7a85528bce4346565816219c3649e2c3c..7645023109112695a0ec51ef3229d6d387be507f 100644 GIT binary patch delta 114 zcmbQiIEQh9VRo3Oi(`mIZ*qc!$b&;Ez5m74vj3=i|7|@f_5c6>-5>t{zi;Ux%@Ew5 z^z!y{)g#gkDUzo_a;-9FB=+sAc3o4~R<56CV6#i+`~SO*!7i^QSr<2KV_J5VS13Ki(`mIZ*qc!$b&;Ez5m74vj3=i|7|@f_5c6hs2~6TpEp~?+pyAo z(?9&%gxABye8ljM0BGr71Y^14t5hFfLI{B@%ebz~!omXm zeji0q=yW(cM{F-?it2ANC-!!Wpf`7*X`<9S|SY$}z)bzS1|IDg%47e!Iw4%Gq5i~hhc3{2C+G|ga4*L6J4V`*s#S(d5QY77Pgdc7X9EYt7zNhA_D zjzd15N7FPM#{njDz?WZs`SL9LhR6WPTp<`3{~U&{>zJmArfF!JhOX-X0;Skq#0T>R4G#U-!@i^^v8_Tj-T3TXSH}rbFLos@sKnJ|Bc5b4s`z!2+hR^1` zO9Ge(k>CE#rrYgOtJP>Wo3z_)5{U$>tE;T8u98S3Xt&!mn@wu98r^PprfxWF6yKm& zdVdl4CDjL4#Gt*)udaW^d%w8PxUrk}E{Tsny~yT0#AyC#Cm6;kiJd%ol5{#vrBcDN zENZnH0KHz1`T2Ruc+!0P?YD(t7=h-` zWHO{uDQdMEj^og1G+16RYhc^>t89nbTao0|&`M!8%LP17bqU|c$v z%jLtb0>xr6khH!NX04F$Hb#k3{B@!f)^_J{U6*dROQli?G`}QC6H>U@Y|?7AC=?3E zBLw^pzOMI~m88Zs!T2tyR4U@ciGLFlnqLTkq9}a*_1F6jL&qfqlu>+}6M4WiO(aR8 z-|q*9o55f}DwPW6Ooza5I1JVNTU%QQAy`;gmG;fo*Vu!Zr{EgG(~>=qt8&|1%Fg!q(7#$ z$ALNk{+syxilAv)aJV^n@+8S*lEGkrZQJ`a|L327E_}@&#@VxH8J}+$22Y+m!M1H0 zjRx!QIBb0M4>WD$+|xgO<6teGLVEb{p$KbP`Q?R}=_ zpI>!AjD%K8|AOD&9SJMjwtoXnau_In%vzR3CX*qP$xyG?gLampC{(M}z@TSo{(isD za5$XE_NuCe&lmUk?APxK z3U);;8`8019w2BQW0T>&g$g>WHOmR^ZPmOCA3@_6|YLXgkrDV0j}dcB~0mCI$8mX`25Z=dD|=yW=P?)S%J zStg&)Q!Ew(2l;<3%ObmSf%~`r$&-Ko>#%K}K=J!_xm=FL#l>KY&njP)N`)}ZKdaAw z{``4>p!H>%Cbn&3wSV^b{u||^v>gCxRx9hwnKOiq$K!FrG=I4~GG;p4XS3PR*4KBx z^G5)z*4~kZf#U1$=@ptaK0hC>`Day!ZnukJ7!yfwWo3mvwj5~lfQ8LI1gXrmjvmaoT;AAg4)Z@0I%L$m$L%8De0 zcZAkKT3M%0pALPgM~@zfFwO640T^ZbUayB`Su}Ung*5l36daw$ zh@}@9w095Cyyv5oN~M|J54-UN_~esM0{N@!qb|{STYNlc_)H&g{QHNa=9yPxv(D^( z$!jzkf!?2$Gk@|+H>Bpyy0BV%!D`3Si+)@EfX#b8&vd}^&g|>&jBa^8_<)&75D@vL z8*JXYM0VxEbkf@w7KhC<9WbjuSAB3rBy$BeKKgSoHY;Z^W@L!!JJJg9tzW>uPxNE> zs7u-Z!V6!IkF)uwyD#fK{=X2zJ3@FHqPep!!pd7jL@-1|L_|bHL_|bHL_|bHL_|bH hL_|bHL`1}~<3D5H-Rm@wHt_%e002ovPDHLkV1kQW7LNb` delta 2108 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 UQ-7w{douumr>mdKI;Vst0I}~j2LJ#7 delta 114 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 delta 496 zcmVRBi-KslKku+qs{T>Mu!iGY#OKnvq2Piwx}M#6NmT-lRej?MX|j zza&LdMM&r#;Om7u4q$8;rzP z$b4O6`e}h{wQe`A0ru;}^@;_r ze+8&#p1XM30|bYUvv=gE1_^D2#W;PQMxadtXiIdK7HK%sM{pQIX16dl1b}C7h?b6a zzL^i$NhFn8{B0!7iN$+Wu>^Hq6yA;q#?GEHvWLrwpLynQUvQH zq|Pr8wigR~|3Q-0PUJ)|0k=2=Nt)zf3kibvQth(qy^}!lH4DSc>|5Rf{|%)PQ5sQ3 zKa7YDqm1tHxqYw(*PN%HEa3{cu;5C@{Wg2c^>C5#pK;;d{eL3>K+j)LYPJ9XyY&h( zN$75}@k$EZ_$FNG-rBI?_!$K^T&)j;8~%QMvSF=a0Dvgo2=^jy0z;|UV#6G^pjsaY zcmKQf3R=a`Dn_|+;XTt#3NTx+B{aj=#~YG(f%9?=d;JaoXk0$CoAZ!iK$J!#!+>NM zkeYT#hQa9%WG&b%uQH!TO*`bCxwr;XbgciXgfr#of941JZMNH-O*cFM0000Zng8L=6%AWa{uEeW$OVyI`qra7djj)8%Jf#K7+Jq%o`S_}*f3=H3H zUt{Qh|NejB>PIMsFky2(OtX+*0bDZ-pnHP}S+kt(B1UA*KYy<8f@}VC=K%u)0|SGw zbPpr4MJO(S0WMW7teUX_xB+syix`pP|J&_r44>{iVEAr|TGW>Y`nSp_Ufk7wW1lE{C0sWzJ|NsA;^S?h-?tg!%-2W>Z zEdKY0%HdByFf(xHs4GUIxw66HKQfIIAS-|wgf32$A=nh*5~mmd0M7fd%nRrV-T(jq M07*qoM6N<$f^l(`Hvj+t diff --git a/src/main/resources/assets/ars_nouveau/textures/item/spell_crossbow.png b/src/main/resources/assets/ars_nouveau/textures/item/spell_crossbow.png index e6899dcdc745747a3c7b06733f1580166e02eb75..5293f7b56209ee792f2a4fba5c9b76e970eb9650 100644 GIT binary patch delta 705 zcmV;y0zUoZ1=t0UBYy&)NklLs^04nUwI#(}lX(SL4{E4SvAYGW_6c<$Eiu&A9zxj8KHk+%#@~m{MU(TCP7N_i@Ha?uvn< z-68;~i4#&2CjcB++qAS!Db>G(&uRc-$yyxEow7P3^W2fy>DVCs!j;d z7VXnSj1X*Eoqu5ZXphG*LJ`L;P?M?W((LiDe|QK$v&TbI(>VZs{W_-b<0k;mQpXsf z2(sKy#`IB({sT1L9ryreeYOdBji4SlJ8py$SX){0W`a!%dK!`{zd9uCSKl}r!gsT` zdG)?mV{eQ00pK-)blyzphpHi|T3V-cvh{_y4#ze|#sYZPI>AOhT6e*`gPFJKB_yHP`C7wLa>A=Wv0SF??{p8IA zFaKv$Aq9g=@l nRjW$ts;jQL>Z+@*y8fr%I>kosHHEMj00000NkvXXu0mjfwA4=C delta 717 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 F{{zD5q~oOn0Dw_nPs@Ug=)XlnO+G)X zyA6{86l|fZ3Dk`7Z2|xjps%H26_LMFfO^E<&(V+7Wo}uGC(TkmNpKei(*#P{Jm8?b zroTEQ%mFHyTpohhSDszI>Zx zJz>=rA#ndd^3J?o*mSeEZXn4HyT84#y;~KtG5eN4REmlU*f>5O?TAzg@KX7@-`(T} z4A{LvZu@&w8L&)$T2FUFow33&zI^TT5|$OjF5ZV3&TLre+TEjAoMm}}5 zGB%hBLT9)aB}~`EzBPmSRPM?$0k{jc^_59~PkGs0>!(KR`c1SDYDEdOJoZcr>XRnK zoJW-b5llr9#O&q!`+M=aA`f_gn z)%XSoeW6|o%|p5NQ0y_k&6sW}$-b{mj|2YK~jYS8;5#jld>H2@6y-_ z0Fa#=7IpSA7tYlnU7^!cE9qI0yY%61$e1q)fA-ynbq{Gx-BLK20lyWVzQGsN-WDHjr)?Wj?#W=Clrt2l z>c0-QnBc9%X(M*-go5vgMGmQjmQ(-L7g91um6RYP35Tk(Di^YweA$Pc=OK@V`2MOh zJXjzv>gfCc=jvi>?gy(^*vZ+r@pw&|@G`V$j=AWOa$z)c7Yl$08%-^Dz}vrnRzCmvl>)X}>$uyebv1m0 z1Buy(1Y-FoP*{F0Ty;9e$n%O|SKVXoy~~@V>%Xt60ll zkuX*Mes^QX(i2UvkU?KXD~<0;P)7rnmY(+#z|pfFCdAP#J{#R=G*bsen*x^9`NZog zk6l_exr~8tpPB_5FQkPYZEq~U_I_*8pFWHOC9%YR?bd8Cr!B){=GTt2kqA{0vq zm+x(>mNNAK0n2$icUR_*Pf$ODtN7ZlraC%&jV^Ka>p*`RW(^W{!>AjG=Z&7JJF3DN zw!EO!UM`2?54(;&sx*>)szsZ$O43+yRDbVe(!(oY+t;*%+wwVel*o`plg@`)JrOydAe%8UAp(RVqHc!p z6_iO^<%N@l+QqDLOShEYYpyIO35u<%rHw;`*0-E!GV&3c%F&L0#L*8AU5+2SGb(wP zAyYqGT+@LzcjLBq3M3nkpm&76+UACT-cC{73Wvp6M2;K zhJ*003kK|P1v$ZX$1(Wg#eIZ?QYrd&^m$)*sSj!~jc=8-j!_Y7?S#!}HH}OAord$C z)I|w!bL$cDI}$OZ^D#jZPuglxgXIfJA@gY@QfkdhVYd6Bsz$Lh(3OtN9?2q*o8`aH zt>2Q*ATWDSk$6uxDP6+u}6*L{~Dy-4pILA z9!lktpnw-^u0z&6;<&LKK>fH~P{S$~bym8I_OC0>mJ7G$88C3c8 zdh|M^?2W)&h_H>Cozu~lT3SGTsX>zMf-d^^&dw1B1*=6#cHbKi@dtd#FybirVb$yc z4?z&aW6pi5`$*u&9xRo7-4*smVIF`*ZnDN^!i4kyga{%vfww#|E!n7@WWh z%+kQ@a;F)xhZb&iwUs{X>2zkZe_UhBZTXHR!~?+Axi2gQc) z2OK;RetsX-wX+Z>%vLLWcOWrtb<84{sfUgl)Scj3)&6+xkT4JfN~Ej#sB@@EKY|wD7LnYoaIv=5V!35u@k9cNlc z{}6w9h}fucb2m~U{&nZ(vd=SB#yXks1e_84U3-s)?~hvK%1aUee^YG8l!9Nwm2i$5 z_Hj<~Ts+S59QCv!P*bo-A3KwLV}68l6Evb@AoJDX#xMC6^fT{ zgQv270J@2;2PZk8m@~X4dy_u`RLY=xB=xeX9{_@ZzNlXEbr)B4kH^12$pnG@i?2J4 z@N^sSM)~aLMp50i7TenXB%x^Y;beiGI-mj8m=;aifd?>(iQpA=>_WbSM zv7%-n>Y>*%nE|cZueLdv%A6i};^2Bvg#U}Sj;*$copM{i!=xxpk_(tRItj#h4z_HW z14Vaebxy=tJ~!U<$7}CDTUW|4@>#Pu$u%_^&~wcfcU{DE#x3m|hpB7R2(+!YHh#mtJ@}*zm>w676|eM&T>x#6*q`@>bSFic9Nh0`5y%C#dZ_ z$^f%S6eT94dLGpBUofIwy$_$hX!i94z0zR*+2j&%-?7rUQ}Jo!)O2X5$i~Up7#6in z2Q$Gm6JkXlvLxC$+0t~{e}|!d4p|mY#bhCcztC1y!l`ldR)h8EZTo|cCu7WYt6aufew%(!n@=jD-jD&xyw7V=P!qY9W{9DVxf9;05tyc|o zVwJY?7^`M}ei;Y^=B%X1sncfpGjhJ^dtgSSAbxKvf(}%C-X5QXqY(119x|QFC}@_I zsq@ABq3Sb7d?R)jg;SYN9*$kcIACRxXc_?xx(leyL{rztq2`JK_!T>&FR*x;z_L9t zRk8Hbz6*y?P#m{0dbZ%o_nzSIa3%tRKB$4jj z)dSJ+B5AKC6|a^b$H?xGu0paX(y@oS)N=pnjn?iD4(Cr6$5*aTAca0rBso?l7I48+ zlpU?wTJF#<=NwfWS+{&Rwuzny%PgHqdmocEPaX(#WH1lBP;9w#QSPvW9$62wa>C}8 zl5Z)?!efZLDorqMQ~*?-5u$k?^k_+N{@AZp8df;I5!3I+c6~EAod=VpLRGq&Kr)6- zx89;*qz2zI3$)#%%8A}5lEcWsB;cQmP2Gu`$|!k7n^Ftjo(W|b+sC_-OYFaA!Bm=b zxF~OxqN7sl2rpgbx8KcEmBxQ0k!zrk2q zW7Wc%EqJxF6DE>9(r1hVAZ~QAKS)1m6bUz3+~-wb0$ZXf%r16!MrzeEOL;1rp}DsuilqzNB#e@3}Kc9)@@NVhWA@` z2v~?AXxC~|E!!C<8n3h4^Udt>{aSiSRbqNWcFk<`4N$(|%jX8G#j6uY*H;ec-GHM8jtJx;ksVWXRL{_9w(b18vp>D`uDU=>4^Q$Ak6f) z{f+~X4h(*#dRjo`pzsC&aEa?{Ynlb;{K|dcF5G#so92dc_vPwQ(@T;rQ8F^xGz*9@ z$?9le6E_{d^G>Ji!aYe1(JO~96^12s-kVxmnAOIlYo(wBq33kKf<+P+WN*LGFKR;T z@R-WAb-nAE{Bg8+BGc0my(5gKR#OKC1_!nW^LF0U1cl4iC{llI%?yD3|Jx9M80a9~WTWb=^vtVHWI*dwBG&2p2aSZJlenh`+o z$Yn`y=cNb6W5JHn=?SX7-ABde}VwZX0={8cFErTGd#Au zP*Pw70!X}9JkwO94yfO?iZN%xJzw(zh^}6eL#KQUkIL(>uzucvQ0*Ye8PwN^n)0!*XnCNFUoqz?Ll+0S*vz zj{#xbYtORf(02f{3j#X7cPJIRsxQl`t%MsuXbFUu1q3GCXL z4?3DtXAVKzA+9VbRxAWpF5oNcpJBvz*haveCN6>s%sR0~?*ym_ax$5Al|VtZMtUtD zp84As2l4PSRB$*v)~qCThUyI;udDplGRwwBXwe5U@#=h>oF)6gO(Y-V$=}8MptjZ} z;$ox0tDc3j8=3mZw*CsB>R|Bl#$8WA4gVJpSP@M&o*UCY7PnrB4HBFEZXANBPH65OvR5q8z4PCQ4y^3}z8*`!n$Wwkz;U3@jT+TqLyc4GoMLf{mpAGqdjMM@qX-lq`eVPgT|Z~dDYScTwkM|Ui-X*mOc~6 zXC9wa1is{f_)$|r=;Ic5R4*PeS#F5hif-JJ>YDS2cyI={eIPLnjNdR1pvRViFFika zc-jJQgQX~i+c$n}kMv@IW&_bIL!B?mf7F%t1q7~f*8GV*G8Hq?VfI#F0Ke6&yvu9; z3^WShw||jMtOVlmc=Cnz&SjVU9;eL^1srG3})H1-IX8) zOL@u+s%2>yXo25m)gEQH$Dz1nog$0JIdk-p@bbsj2e%ITyVc+3nVJ5=`}$2=MUO?p zqVD?y4&>`2pX`pO`KpQu{kt}yx^VlinG>Ltg_RFd zwKpNpf7^UwmDfD_z?IQ#rru_!Cfz$1@qw(uwelotEUUy(v3!vk` z={NsUw2-Ay5oxpEH)1DE?klrg-d;FtZ6&)E@;i3MPx`Cn5vWxdJ{1)9Ga~qC){DR5 z1iY|C!we@faf=*%TO@XGJApMjo5RSsM_d?n5k_+({xwjKQ*cLrK5=kq8-@Iy(-(zg z`f~yMIDkgjUd#99cpG<7C(=Hw`T`5r+1NqU(47m8)|$3AdiWV5*s%Pazn72yZ3@2` zML#fF@)toS!jN-{7zxWoN1@1~9E%X}vpAeA2Qe^^`;$Vh*2vEiQKprz=}#1Q%X5b$ z)o7+#v-~irKdI6OrViKCtd!V#K8njUWN>;7#HYW2UbOJwY14$kQV*%C$k$+j&a<$;9VZcWk9DF_xR_XS-q)UotZ*o>DUZ}-JssUwB8*(iFeucFNuu)Ps7Qv?lLb7Y z?Ar#WD?eWkmO=bmIxPv;SQLl4GGo0zvWlnrCSLR?isNH@c{PJ8@A4&HTi)W)<{N>~ zm`Q+iu2G{`iZ!+AC6;=oqKO_+a>XIZ8F!@*bVX3!D%(~M_Cuwa>2C86A5&ybnJG5! z`4a&ylt?IVu3!4!FXPW zqJ&|x^5cxY`j`D#iA7TLQaxuHHeP?+%A}Epj@5sI-XLu&oQL|8L2MTjNr|L@jTO1J1_Px+ zcM!g!Ro2DY9BR8J4oX3TNmC$!Y&vm6Q$=3ACJ16JDEQeD*sqFwX6W^Tkj5nEeJ7@d zi`nxSA8|85*wSy&Ky@1Er*(iTkF$Be&n}PAKkOJm`|e3{po-@b0^&Fp63PNl7-3X$ zGC%yeWUa&e)g12^@zOS3K*D!JHArzGb62-Hr8mbn9z{%|<_G47=zz8{?D^04q(L(K z{zKI}=Zv)jTlcC1&Ijcc3|t;O+x7ymU&GJT074WKXI>QlA~|Snh`)m>-48h#5aE8_ zY*Z2HcHxJ20Rv!fd

e!aZI!lAeu{#R8o6(*3)*oPV6~vJtAYK?lf?DYfk5SbQ|< z2|qY$IKP)E(PCOw0!gqeolg_3%#;^ey(mcTMqBZ z{fHk583jRR|G7D5xN18IY4Yfjh*xiZ1SIt=4=L|Zd?>62R-W>s!NO-%wC9h8| z@wh?RLD=S##HT;&`LnZk^g@>8`MS1t_t$mk+|B3tp=e93iD0-o9&HC)a4S>Ctw%MQ3iRB%{&Ej=i{Ud-vasI|DG-|gVZ z^(|NPDx9$yy-ddGBdzBz!)5QaXW3-&xVc)e%{F{ID9}W_+Beb^_=?5qF$k!hf|=(G z3xXzX)@P6SnC*^1OjTiRgF>A0NtGfPDUv6Sm^nY6fj;^zPAARJGPCnERFo^upDeyF zY}4)-*xa5vhGNY#QI=!&q~1%ADcDJZrTTFzjoaRV{Jq>^%W`hXAIG((g#KRY*-ej znX)L&;btsbgzk2S$-|Jinb}WayLShlJWbr5^)xt%{0>0u>AzFg2_mQ0w5k24(4?n#vn5bJk^8W<}X*8x< XOQGfS*N853@d)Va7;9H**+={zRC5RZ literal 3709 zcmb_f^}O z&^@BZZY-IPg^i6hh00SA#94?Q8y(gZGt-b~Wz}NIq{hrFrHobl`PwZr8NW*@lQ@J2 zZ^_X^(r5OWirR7AGhS+2ssYUb=l4A4^O}Pr!7kk=TU)PO*YaH9t}bSsv#6&O(H)PO zjgy$Bbn?};v+ELglg6+5)Bfh0I1Jo;UVYJnX=v^ql77qF(73#r;Bst}^mQHpW_hqx zSu45$Fi>Fdox{UhfI5wI0vsOCMz4X&C%a1taP0UJ0X$I`C#Tk%$_{M64HxRdu14br zsMYN_7rxes?5W(3DWm`Xl|Z$WaN+J(-^RL&plW@ly7}-v>+!7H*X?>6TZ^7Rw7fM9 zRA>F>S2M@Zb3{4x3j&(@WuXWxnQ(56L5WC=gV_2^)n9!%Q;h!S!Ir%q84yk8`AN!U z(~Rb|#XoPb`B!T3EDjBEnb=iHcW_?VDh0op0l30t&Ma$+%TOJ;>he^|JM^8}mI#Mfl#!3Y)9HStQOvEd5Ozn^1-VTxm@y+fAG zn@=~C52={H2rpmxXJHz4Tl<7D781`FNyt(MYP%0v4t^ORTGdOMSM4tH>r#kV&X#wi z-lG#J`Va2wuT1YZzM%Ec_eic6qreEPcH|4Ns{#_D_mVNFFa}!0?u1A!1BHMqiP8#% zg*P$8=Sk|IIFd!Rc-lY)S9<=O%jt+AgM0zpW$E?}TL%ECo`>JL(6`lMk$aYlle??p z;rs0vlUkTY*$g=_f&D=TjKIhTp5tU`~-(TkIAO5U3iK?$@1KVsIdx|BKNE^Cixn(7NYGovW9_aRB5G@eROX8-^~^&u z=IYL#C9^79U2l6*=k6O&-ldMGBWpLC#{Nhpkh=vPfe`6rp#{|tKa>=?CBc~KhmpZi zwEb}}Bz&Ko%lfZVmGo#83*^AGj2cKAaE3b%Vlbi=-kH`3)`s}J-!ZL`2ro%6&1*yf z9w(>!XQFFv;|kSCY{XE*Uon9~$u1VoHukNo z;z;?Fuwu*MRN{|4d~k^nWC_pbMnS}0?Zvh3u+v*oqV0ag2Z89*N_>unw1z}@CvK^= z9Mcdv=mVhPGtZ9CQ<_E-eIBIGIeN1_N-Hop{_<7A_nv0JXQiQ6i{?e9eVD8$~%J` z!2;C$Knt%jWW$G8t$mecC*&r1G{bx>&3r=Jo-d`=wapr%!l#3S-p;a>$jiyyX2(uV zHrsZ?dqry8?dMrX?bpW8FgU*;|N*>kG~gxK5Y(Y$*<4 z*d?l7H6gH0EyD6^h4I8yG+G=Xlhs$x*~3+S7CsW+v&-F{?CV2bR*Fcd9+^0h5@u>c z<*vZ0wEdzp!+j=2(_P_y2m0HYttbsANnR59BVR|I^E)x_mp~(0U;Xe}8S0DA@W0Pw z-3I22kXR4lZAZn$za!sc?#VhT#UFj@=J;ddw0izVrudm>?I#0)vB^8Kr@g+oJJl-MDv9D;$CBtt4I@)dG#cNqp%(DhCFKx6A-0 zryBL7J!{~v3BLMRGLYxh@*D-gA&FdX03+Q1BhGwM2U%)+C^${j2`VH{ixFPNcp$y; zf5q6A$Ay=Tt8LAsibpMCRZT1c4J2pu6I7%r)QBm?;jC!m$5M-bZ0`Bw;jQ&XrpIeS z(H^ItM}WpaBE`9@L|rIqp<~iH^jL3LmhEK}R@v=RgEX4+=c;5BcUGv!ygO}I-rnK< z^+j)hv42>wuFAPbxaAjKS(^clUCMnxNBHCw3AbIQnBkoW7uW z^Wku95HrgrnLQO%=Vt@Mu2{^5k}-S2%k{TfwZtIy8w3^jtvE%|Ks=HVr=~I;XZ&Tq z4I0-B4oBYNLjTKeO=l=QL8~t~5S7eCa#2oD&y$|uP!>uvKCCi8Gq-5%+0mC>hH+gB zoeWD}gPLG5bbn>^k8eUkBrNQass%)SrW-Ro##f`G%mm`cD*0R5o(zTpPBe$baP)JO z-i&j9qKeGtme@A4jABRiuA|xSAKifcj@EJ7{{$x{pO*OXgV=#l{$#V$T-_4U^=$An zxWgii&o9Dg)EZTqz>WzxLQBe(XfM`C()CoX!!=de1SC#dtk;CKq&TIIiT&>+rR+HO zb-vO;Ht=&k@@7&OVO+SwGrML-)n{5UOZNs(q@Kc5x*Bmv&!p@3a6YWI?t^bmrr_2r zI?`2alp>rg4p1_Sb>H30gcCnJCL3{;{Un)Rj29AGCJiF`Xgd?G8L68wZi@OiQcDjx zIM^Qv!9`9ycK+|QNXOCLnGXu4Z^dv& zgbz}cGE?p`(UW)GiGfj%!qTk!z8XT+xc9ggrlhY`@0`@iT|nb{O^NMw^AQ_dQbsB& zmJ07-=9d?D8y73gz|HU0Xp9xqT>@tzKN`MS(O79fSY=QTX6|&^h;QA7k%o$M$ke@j zS+zQVgVe;iCS#5LuVzcj`4@2d{G=YX0)Si2T+|PFjuog0%l& z8mzGGaB?^p$cox(#kTp4X0t&sQMmQKMWLRR;fC2Ec-{$V@{lWNPbHnk`6)%G z@70ERvr>b>;0jlSX^A-EUQ5%F>XF13 z+G(#(GJLEveNEAisZN^>DF}^hSiSfq6t|^h(mCqSEG-@y;A+V9>l zjOTmcAoY5)^-8@!rR!u}6+k2T{sDk?u}6S>7iDFe@^xp(oJH=l-NLGQ->bHf8gB$SU$mWsv~Ae(tJBNjr=Z~OPdLR_yAI2TKU^k^U0@I90yO$Zii{jg^me5 zR5t!?^2FNMkvEcR{iumY`Pg_@7J?cpyOB$JX{`|-K*oqPTNR1@T{z8E!~5Fhqb}kZ z@Mf~PJ0XUCp0c!l9eatQJ4D7(2GcDZzCp!iwWv^>OVlJgJ&b|OQ{EgX>NCfdXwh&&nv2uQXh>vvfph)KxadhKoML4e;|cMdFs` z9lo;B6h*F&n=8t_4~>xBXsVmLW_m^l%Hv4M*2nkoL-H)BF`_u?WBvtMq@-0_Ix`I-< zEEFZeOVO^J%PKVSWHn`-U|z=fd^DGuJ(a>ZbpEdAu$4%CkGHwEllQW?I#EUBe-W#NT|2s%baf#LGj>_S-_ zO;2UtFFzL6Ei;y$l{3kpyl;u+W$>k#AdXo20|0e7XQ!I%0AS_aE2BL;S>&|8$j#f~ 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 literal 3657 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 literal 3724 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 diff --git a/src/main/resources/assets/ars_nouveau/textures/item/spellbook_gray.png b/src/main/resources/assets/ars_nouveau/textures/item/spellbook_gray.png index fac271c251467b0ebabee79579f784ff3f4343b7..bf5155d35585f110a0b8158f7ceddc3e43ed8d85 100644 GIT binary patch delta 3674 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 QY5)KL07*qoM6N<$g2+JkMF0Q* diff --git a/src/main/resources/assets/ars_nouveau/textures/item/spellbook_green.png b/src/main/resources/assets/ars_nouveau/textures/item/spellbook_green.png index 034bcf9ed3b4e7a2589e478b86198269f7f3bc05..08f3dd5fd2e7296997d1c58808ebe308695a4578 100644 GIT binary patch literal 3674 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 L8S7TU93uY@A{Gc` diff --git a/src/main/resources/assets/ars_nouveau/textures/item/spellbook_light_blue.png b/src/main/resources/assets/ars_nouveau/textures/item/spellbook_light_blue.png index bfda9231b1bfae1246af349e4a677cde2fd0df4f..db67c3eae3abb1b64331ffa355a3829a6ef6b4c6 100644 GIT binary patch delta 3639 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 GWBw10wHKfO literal 3788 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 JS*GFe@_*qCJ2(IU diff --git a/src/main/resources/assets/ars_nouveau/textures/item/spellbook_lime.png b/src/main/resources/assets/ars_nouveau/textures/item/spellbook_lime.png index 3f7da9d6367bcc96c074a2ff41b639d340c26b85..c6357a3b284d69940b44771c1d10682227d2071d 100644 GIT binary patch literal 3709 zcmb_f^;gv06aMTH(jfv$i*!p!EVwHvy>yo^2reL9Qj4UNpe*syC`y;4)DruGEFc{M z5)vyQ-AjDe|Ka5lH&<&@H% zO1i(_q#+;Hu5ob6^Dn6>_pPTz9=zj>p0Zl}i2H$LkbOB_QE)1N%nmiKX@YLEJlOqRnn9Z+CXt z;KS>#JLhnHDmY@id*v8ys5l1Np*7HGBcFRSgy zvu6Uz>hyLlS))%bPbz5-NcO~!w&y9h7D+;Ixeh6pF5aJn4nQaK-b#S;az1WgRC005!?Woob{l}&&jW$ip?n}=>=xkJ zwo_F!P#kOOVAf}#IPMjDWLg3~`!-Qc4k}d72|^GdJg$|1IkiDE(lX!UEq#Omfr&pl zLR&v$jt@QBqh&fDgJ46U!4-$Pv`za|-<4XmHD8{JJBJyW_OBRMWe za6rKO3_F1l7|Lwog%mMybE&;7=|y?keAD1s`KAI5?%6tJx^cVth^=J9s6dPe_CD16 z0!(^=CpiwkKN2eH8zKw<8;JZi{K>?7eYy1sqi?p`GvQ=PkS3uaW{K0fw>fbcWvA~; zlhh;Dq)=QPVYDk-f;7F==VWG8fri;rw15K?nE$XZ1INaHw?RT$a=wO6xg9B;vvhk)39%iUH-vSioZIiEd5{&U4dX^;a zLEJg6dmstM0-FrAa-)XzJbF!mI$gtm>u1Uqdm}a(rj}AoPd2lKEB_^fL%i(Hv#Qb{ z5YuNLtasB{wj~#rkY#yTmHdHF>pKKk*);V`i8oh{V@CI4sbSI8KD=;AFuBR8du=O# z7{YTbkfC3;RR6q+QXx9~mcpt0h@zldJes*~-hhRaK#8nLG1v27@8#EjacWZwm-?Hu zRLCrQUcem;ax81|so*%b6%F9)iWTTg`M`UT5Wp@Ro2zeEEH)I?ABB*)@OQCU&+0X!Jf@g z?T!S6=Oze5>NvBf(VTMy7|v|i$rokC8EoE3QLss)N8J(kY(Rd`^Va8U{7{h#(CNw% zczmCr2W7e9TnF~SLYzvxQT{peU3E6S$So$K%ah;oxkZuEV)e<_4LxRS zVmYeI|92b#jPL7;dfQG1a#L=oVA}hT@ zl7cQ2^fDUCxrcJN`ET;@AbU-H$p9JH|1MC-oX#;cOz=Aikb^~^1y(f5-7*xDPIE&J z;tB}ZLkHuVw@$aT&Os+T_Rv%B+7!{dqd|gq9|{L})~@yX&h9L=aL;KCf3CE4S{|pp zDV*$p0dXTldBfmTCn-A}=R+_yhdIuBDkDf+!9#D1h~^zb>H+iz)^Wqs_t&Dj6yt}XP2EV(Kk{}(}l}kwYu&*ESyIm-!)9K)M;`skQixJm> zfE%R?A#C0A$n9Jxq3aBnrwd}=>aW-AoukH97;i{GDHn9|Kp@erpvGd`Lii(;YIm##Ua_2sD{U7~(G zxongYHlGkbOl2G-gzxa7N~AstRSRj+rL^mwi%`+w~QeEc`?%iY^$JdW5qu_3jcJIavY=B z{^QyHFsDq5SUdOYY)luQo*u;`N<;9> z8O6I~E8){i2B3L9>o&e;0z1>4-#^_zn`d{vIPG4hK4Dc-4cfvg|B`mqb!m}d+ZzQ| zM$2q}uQ=B_B}9vHdjxMc$Ux7`2QHoo_Of+yXqW&quXnG*H6cesH+aQnHCY+Pr? z@?8B^s@926bXedEf!w%ei-jZql!q)EoUeMk?w4L}7E3Xx+{ypLouL2Iec(;DE=D5H z1x?7Oqmc7!H3^S(68gcMY~2SF&|I*3^{b5Hw>cf?m17$pi0j*l+PmrC1!3jhW5&{z zoaQ+;`TWOyK}Q$I{3>%N)_)YRs-dk29LCSpitQ#ld2lkxLX=XR_cHB^h$E}qrE=tL zCo@nR*DpO8s@L~O(&(jq_+w&L7y|8JrOTglFe7;jtq;Y2Gn1|j^aD2K7VV?vv)$~-WlOB%>V!Z literal 3698 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 S44{1?f!q3~dUZO;nEwIm(i05; diff --git a/src/main/resources/assets/ars_nouveau/textures/item/spellbook_magenta.png b/src/main/resources/assets/ars_nouveau/textures/item/spellbook_magenta.png index 29068ea164ff8d49ad9afa38558e2e614aacbb8f..25c4d8f8bdedbc3c53242d715b82e53b3817bc77 100644 GIT binary patch literal 3704 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 PV3_`G!&_zAjuHO>kRT~} diff --git a/src/main/resources/assets/ars_nouveau/textures/item/spellbook_orange.png b/src/main/resources/assets/ars_nouveau/textures/item/spellbook_orange.png index 11d47d3326bdfe479de3cd23c5c0c232408f7d31..ffa231afa1b69480fa18e2db9ad189ee55f04287 100644 GIT binary patch delta 3500 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 aEB^}y?>pVH*emXnGN(`j*J69 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 delta 3649 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 e{{`~)M?3&9`pGJ;Jo{v$1a2TKuaz4*NB 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 m{jlCzhAR#G{{>%QB@DuSW>&d@wM)fj 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 N002ovPDHLkV1h(!FM0p~ delta 3672 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 diff --git a/src/main/resources/assets/ars_nouveau/textures/item/spellbow.png b/src/main/resources/assets/ars_nouveau/textures/item/spellbow.png index 095fb2da424690db4db1efe8b2b77eb37a40373a..2c2f34ce6790acb38e49820cf72393c2591ac6eb 100644 GIT binary patch delta 398 zcmV;90dfAG1E&L!BYy#INkl7z7#Tau9)H5bYO5F^Q$2E7j5;Jb!o-SNvkgG~bP6)Wc~Rr}t9P5UD+3({6dP?! ztf(Hjx9|hp%`cY(gC5vAlWLxw#`|FDX%=BtlZ~a88 zRrH5@Z)bpg>&;gx2dl@$AAMwbCCHFOM||&oq}J^3G{~&~AL}h9R#W*6oBcZ_1C`t`A7T)i^jMPx$SV=@dR5*?8k+DkxaU8`zhKL|1s3C<;k_T?*ITZdYiU zh9pTmfBqcHvQSl(e!q__%Ve`zrl+Ur^?CrP%D+LZ0brK5`Q$+X0LO87@9n1~v(w~e z?hNCHP{QPhHR{HS2>%p|#jtG~(=<_4m2^6d@B8%oeWKAQlarI!woNLP8bk`#_~O?e z0btv4u3UYGJAc1bv2B}VcAB5(ELgUJuXnNT<`BK7E>UxqpmhS;(@C@B65#3V^0*0JK^y z;_)~Dk|co*jW0J2Cr~bz0S$fgeF5NEB|iQ9P2PPsU}k0pS(e$`+r#rby4@~&dwX=d zUE=XL^YimqmPNDK90_U|2Dx00e!ov5k>L2^qeGL!H$CvtZ5Nmzl}cgT6F`|$-mAM=SdmQe;^Y{;ClE zs`%GdAJ=v9eIG?psMqV5rpf&L9jR`th_+e5vq}I&GX>1@Hrf0lNEc`}oA|!ZJXtyTes*Uq-> z;Xra6XShEajS`E+@T_0(&)c7&Z@w?)zW2vNtDxAn&2Jto0+7$=v27dMF4JnYP!xsf z>A?VzWtm(q2SBM*BAHCm@Aql7TEht`{C`zpmbb|sKSQNbp|P{Ug=^m*JA?ov&+|n1 zRbe@UAmHrTvt!R~XJ<$BdOaeM2tg2#NF>PT^W3|44}gmoFXA{36WZ_i+wIRde|etQ z-gtC)1zuIo!{E9uvMe((F)<=YhGAgaHkC?+NF;*Nu5kYH{E@NbQmKSxS$LjDt$$V< zmh)BEFG#AYqN)So0a#jELQxcw*=Z&hmd1WPfYRx7Xf~T8JaH9DM`;@pznkK98>JWV2aPsT8`dBZNSfWgN#Lkx1aWE{@|+tJPS!-lO>OKS-sz zgCsw>OgeK3Aq4Sw9K$e}$P|Xtax8)U=b1{S2!a4z*SUZHKIL+myLa!7uz$aC2#WEwaUqpC#85iPWJe(F#Vsiv9U3B9?JlVqKpJm6or-R zJyx#&w~Itj6rtj!QYlnbC4ZC2U>F98M1uA8by2NWX|-Czgu1Q|iH<#jaBhb#CY0Uc z$A19^_AHty5IW{tw{8hw#B6jrogwk?=EPz#8jS{;rjbY_#uGSm=FD&ecRC%y_3KyP z0XSf#2d>FRmSx)QHnX#{7=|$vARz>aL}I9fuIo}L6b?-epp;4_9DK*&*s)_6hC#Tl z{`tY78^UQ9mNhgVA@PC71k*H`o14RR-6KtjR4f)nBoZN+Ow#Rk2}S03_77z9iwB&~ zIPC513CD40x7!3kz|zu^6uxgX8b^xT{{+QiQEYB*9_>E9#kcr>#Mi?ei4u_=oU;G` N002ovPDHLkV1jGdJ#hd4 delta 1644 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 aUD1D2^6LMZ0!i}6 zdV7?-IlZa?7JtnX@eMNa{*W{Q#A7Q}bp#yDKT`w_WTm$UnY?gMop~0<8wN`YbN^hj zF~Poil3QB<3J5s@T>%Mnv`8u~sxH=&U}>OjYnuT8QvC_VuS`Zqp|Z;S^*Hs;{*$iQ zocjkL&|Z|(l7FTEs%;j#J1-?bn}!dck_0``yiQ0auWwIXPn3BPfK*yk=D`Fd4fcoKT1kVcl>}EFy`sCVAmufK&e&q}H$EM{ zhEdklP%uhge3Z(DjvjwUI0i3g6U5&prT9I^@@lIJd4Jez!6@r0;u~ZplcchtW36uz zj=|%H2?mZ1$gQ(c?EDr0#lrR@HYUhg8biS-Fwc{#=NUeH87`e-{EjIAov}s6iO_18 zl2vW0Zoh?H;X+)`;~rD=nqP%HrWn%^iUn{Sniik|=<roRC?Z}*|HegG^00000tk%EsRLDVb`P6ekp zC^!|ADwzbAI4D{NlZrnOgiHbd1qYpk{s$^1;*d&FbTK3`wVK=~akvg4H@+lh=$S6} zo_p{4p6~f;0JC$QlK((-=SH&uJU$AxSEm4QdkxSAD=c|TE`OB-ppZ*be7FT*b@vni zt<3Wq0qNCy0B|^UTH4>MH~!r{0bu3@04edCqvU}GV0$ge;nV^6^w|r*xAmEl)Zms? zyQnNJ50rmM#xL1F*;M%XD!=D&^-AZLc1!V-s)&Pj@ zE#ULmx&D)?;eRLvrZ90hb&S4lb=cb0Y9Uu&t|`IH3uPR@{oi{Fxw96d#RXCH@T-v0B)|Uc^K!B8Z}m!NmATcCK8D*&<}F_a<6+ni*!! z%$zyj`CI_=zd9w~z~1hi%MDN{2-bd&0Z`x4PD@Z%q+leax zTxDWdkI10b2Y}b7(b!t2E_r!;1HdQ>05al|lk|}b!2MB@*QWu{)f)t0dULKMHM(Qh zF085Tg7ORL@?&2|_d6z~xHvyML4qf~yWpp59m1_1kq zON0U*Zm%*G9Dk+25C&eKhCbM%Hk+E8Y-H!*iZ2*Np^O7~etNc%onNydtVd)jYs#sg zt1^`}Wi>>G7Gx@G%CH_$!LxY~pNy#zp6A}xdMMxlN+z$2E@KFzx(7y4kWO9`pNs*e z`tL<|IM2N^KD=1f1C_*q&Jo$){X-?tX&|7gaFa`NaZLBOGKoe}SaH40e{Psl!OUzx zE{^vCP}k>j!&Cw>)_bxMzFf8gfquz!SA;x@jn8;y@euOIxPSI002ov JPDHLkV1gW(-30&u diff --git a/src/main/resources/assets/ars_nouveau/textures/item/thread_bookwyrm.png b/src/main/resources/assets/ars_nouveau/textures/item/thread_bookwyrm.png index 0848e8f6c9e0d06e035f645f32a80805430b2ebc..3c08bc63e174d3b21a7209e27b4792caf73d4bf2 100644 GIT binary patch delta 458 zcmV;*0X6>i1MvfpF@LK`L_t(Ijh&OROIuMC#(z(2@ja88#2~MWDJ9^eh?Hs;2eY`Q zg9RO13hg5PxD ze)s#na}GxX$h_^B+yjO6A6h5C#f4xk_XdEFX@NGFrV)zt64!up0t^ia6$T`I83F*&0dr83070CizktfYiiCmlyz| zS$ZaLu)Dva>X*Z_s=hM;;BtMJ+)!du@vJL>Ld;6Y!_#Z&U~+6pdLi**M#ij!+L~%% zuzy@Wdos%V?SBP^!Vi>l{k#tR8>H6|J6cmXgri?K0P1sbXP!vZbhYR}3Fw9nz=v1M z6jG~-P~4ekDxM`@N-Kj_v<)#5HC2j0FyLCF?lZ6(0$bSa0=BTR8-nte@8~{*LTZ&v zaYhka*LZ6J$1M;Hur;@--mK?OIr&y;Yr`dAH$-#NCqp$)N6!SWr^9kFsR4&PeDs*^ zP#>4ID&3*J{~Q-&^IxU9Mrd9a9B>=_e)lT>0(Snttn?h&a{vGU07*qoM6N<$f=z4J AN&o-= delta 463 zcmV;=0WkjY1NH-uF@La0L_t(Ijh&OfOB-<*#y?k5@vcdXzsk8JA_0#gB1#qqU7UnC zRM4?dAs_@qNLr*t2NfY^5duO;Hdh_=A8;2@J4Fz|E(x`!*2M2g9Ik`h_i`p}!DqP_ zzRx|+^S&>y0uWyaTD$<6t?!Blpi&X6E=~gQrsFLgx*DnAcE?EQvI z3;^MjO%vGIKi-t})JRg+|4jh6TtCfiOR?GU6;}d@h!M5Uu4|T!nXzT78KT1pD`G_D z)?^C7X`l{U2@i`QL4k!$3Is@a_4C-iO9JaDne7}5YTpY5u9`| zgNvZ3I0-J*pj9N~VzG)K2ttTkmJB-R%K<199{VYfUGL`Lq4JL_s@R->}v}E(>i9Suq6R}C`a1dTR>J7a`^;WKqI{|34lN3 z!yob?s|vEJc-E*O*xXwX$&sF)g20{rDuJ;*2S9K8ECA_^Nwk1QxJ4%tZ6*?Jew)A* z0azJX^c1@!&wmowmW{DJM>d`TAREsxn*Q!-&gBz44MFgwsl)kL9|aJYt`k~7qi=qg zRLmfkPw?$?w;-r;1!P4Q&E*yX6i-c3F@qoL({#6vdvcy5%Bn)RMMn#06*dB-Vuo0^ zLcq3c>}!j{!5PIAItqL2TTIjg};F)3; zOH6l8RWv*+&_7u3%nV7uA=Pz_)C3#2DP2$#Y>1dRlcF@MKNL_t(Ijh&M{NE=}o$A2e5?#_$3d|1xKPzf}GL!i{POFLdGl^>X1%uW-ijwDTPpoi-&CkHTF*I5C^$8xx^3f zzr4fyeEgp0&m#dWzZz?E5AA+9l6(NImd)1d832Yt4+t4?5r5RQYW!=S0B~`7%=xbt z0QpKC0Lcw}5`W${)JFg)no1xniz0vjoCDyT*#KDf55CksO8^7iNR`7pil$PoX3&E= zg}qe(0%4gzSVqxQ6ixMv(MM1@%!|*Z*>{4#?S3nPxt{~z#nVjy3VW;QL7iyKAf6Z} zo*2KIz%2r>yMMIf33f@YC2(v9b3aEZT?C+%F0x#B<4G=8GxSOjOpZNkKa3;*1g7hR z9@LrJUL>0`DOWR0O(X?@&n=*+ib(FZ5TH@F$fiuzKW&hFyyE%uEK$)^qA>$KsQ1|j zkWHCl+`a;i?cki*)V}?sQMZ`eUIeb3aF^F@<&6YJG+#s@EK^Ds`TqMqZx=oa8+$GE z>;Uj|u^LS_rq}usdL;q8oR73uk}&|}5kG^&qgy!GdJ_CfP67}No1hI?U<+HZ|2|l*dC6#G-V<{T(Jl+lO0Vj_Kh)?d-Z|dz5GVz@ zp{rnO<|lxQ>@B#4xU#oOHjyFF79g9*C=%y48kxryw(3zv>g)OsBRaWP!FxGZYTZ&+Ec+%TL#|<00000NkvXXu0mjf D!I;~p delta 463 zcmV;=0Wkjb1NH-uF@La0L_t(Ijh&M{NFz}cg}+%;oH5ZDqr@hn2u`txC~2((K}ZS< zTfri*5D>u-lx0D7*#%=GScTZ7v9XAiV4<~$K`bJO5}O291Dg0ow0IVhml-E+u?L2E zbAQe|+&NbRh%bgD|ADQ|8?6PPS{3|UngO80--kbFs-jA{z<*Qa7J!$>63>6D0Hku4 z0BH5Xuo;m-V*~)*W6;&pu1Fs4p8>FH0)Vo(;JC1-0kqg9=^g`sf#Dzk>)YP|h|T_S zY8Q>;7kk{Q39Oo+kiVjkzfz6q-4)8kiptyJAjqAh&^-pa#~?W1C%wDk$kp>r5jG<- zGQKROlyYwJhkyJR!e&JMHKo83mSW#IT5EbqbRyx3IfiJ}1ZQ`z>U%WM>L|{gq+A3_ zfo|w3xE0#~aFBfl#}I$*|0bKv;Oq90O=c8{{fSN_u!N<0l##xMrsQB?>|Kq`Nb&SC z0NVF`nr88o=s*j$A&0gmR&w@4MIv1vd3JRFs=V1hyneW~J|i%WaT%{qdd-o#mc$?mgf0<9m++ z5Z?$1{vjvFuZj!c=f~hExe7o~(?OYOyb`yR3ON9(rFUxIZ+`$JFYWs{#-n*QBrfS#ALXz-Xu~09J=nWAruC)X~V9-)y z5VQ#q6hTA{MMF+OG=yV+flY1gA?aoyf-OptmD+pZavS7b^*wFqTh6)X-t*ma?sty@ zkl39O`~%lluZjzx(J(mMTLoY=I7Lv?<)K<7&v)$&fL6WCPk*%mKr&qbK(P+S^tjN} zIRHFfmGOxYN%Hmn1Ay5y0H_!*Jmv2d09SWO9$iyoaNok{j3BBsYhuG$hp2(htvBJ9{% zzmR@Rk2_VHpMO~vxoS(29Bkk8O|}#CyutCx5dh~87nBMW8TSYL0BkOuI^Mz|qa|VD zb{~L+(6A%V(dxVHw{59V zaS%B^lI*io>wBXe3c%KONF1z102rC{;U1f&RWIWnn<^eST$icG&NM=2y4rZQ*$#X@ bwP*bc=1SSf8b12M00000NkvXXu0mjfN+QNI diff --git a/src/main/resources/assets/ars_nouveau/textures/item/thread_feather.png b/src/main/resources/assets/ars_nouveau/textures/item/thread_feather.png index b53a61ca25924f8a0ea99751c61b8a336b12dd22..63759fdac53d860aebe61db537b8fdca62f952e3 100644 GIT binary patch delta 462 zcmV;<0Wtpi1N8%tF@LW~L_t(Ijh&M{OCwPfhM!qfk};Y|A~H4xBw#8L)~)v!>=wJl zmWo0^2-qkhDiZtx4Z=dIV7fFZb_=a6Q}2q=Y7_~?#zD-Om}DksF;+8XGD!+gce(F< z&vVa*01#gqH~B!Me%}dw0JWOV(e@kwK{*P-%)83`kESXBG=H=QUY_p(*v?!4AXvID z(Ql?KP6FWdiTFbv+oM`;0$|j2095^&f6A!<@TnEa>l5+%M8XjnDIgI~F9YBYdGLok z_I+zO42-%?E}uXt6j2IAQn4fe>A!2JB@Lsl+Y}uQcFy)}5;+_so?b=@NB~5qCpbAj z>`h=rE}x)UZhw-BC8<1B0H{1w`1N(GJAt7a?Ec(wm{{3kKlZ7Xo8w&0-EH*xMArXoFg4Qe5Vqp?Y-2bglU+S_kXT=`3TWs?=NcGw9i>pD zbgPnzC0!=%1qA48C$J_^3P@yEj~(KZ^FzLWUg>VoI!7pKNpodue{37f&X1Uz3j%P- z!0;G@!BHC81B1cQF3Sa52REj@jqtu*a6zva8gfqJ8(7`1I?7L~!Tm?`J#2@L z3mt?&hy^2}Af(!b^s?Yd+?y8JJgJhqaAuK!|=WH zyuW$A_q72e)@ORWL)l-KHakGOt+Mxh34qDKGyy4U6g3o?hkwR30FU=qbZ^=Kq)Qh7 z*!05B(Jwtom;=D&7Vrg~hDod51wiYl04VA?|K&e6fQdmQms`N)76?ZqM88NPmju8U zbm9v-jq^d74783)v7AD#RFNxHvhfT6x#KOAS_7@48WbZ9_W%AcNThIpL@tTw7XgSa z%u+f@zfGX4Sbt8@s&~o8Gc@m-05tEKtSs)1C(u-lgXMjbiQYZ_^(U=*mtr|(X=cgb z?DolcKm5H0fan(qN2F1()@yXR1-6fNn4kJ!DjdXr^BThuiNa>yM56za9-yXbqchMt zDsrVt?Lr|N&sa=`0|c-S6X+8t`b7$xc~f!eBu(to#!PsF!9h`K4NJG-kKr}MZ>v+i zjaUQ#=SL3?Z-~eHD;(a?*yTFR|Lbof^tbCpr$f)aJRb8TJ_86Du{cS#6sQ0I002ov JPDHLkV1j`u*+~EZ diff --git a/src/main/resources/assets/ars_nouveau/textures/item/thread_gliding.png b/src/main/resources/assets/ars_nouveau/textures/item/thread_gliding.png index 56f5254b8ae76e42344bcbc44501a7af39580c5e..392ed7d4f486a88b6dd5733ab446b444595d9fb2 100644 GIT binary patch delta 427 zcmV;c0aX6f1JVPKF@KCnL_t(Ijh&OvO9DX@$3F`e?zonzgk2IM$Sx7|VP&>Bn+M&73%$xT<-#0Vw zDF7?0g9iT?*~5Fq1yHZ+9Ap*%@P{IxOt!p?Gb-g00B@B?K7U>x0LbKu04S#4RAj~o zi4g!)P0$-~OGfSa9e`#-2cWE9aauZ209?OQQZ)fUcsL|&)t9OT27umLS^%cPUT*o% zyHAhCoB^sP$QRPYqbaHC>+@NH+u;^KzK|w1v4*M%YR~WF3u&8rY+}tB(A1j%M8=2Y z;dPr=%BY)7S-AWM_8UR!C0jwhYX`-hkWkeZIc$`R=A{1KA2m zmg`-`QPDAj`Ng2Il~8~Sx_buj`1^UQJmT^9cW5q1?Ic|rvKyh*T~Oq&;q?m3{tKG@ Vj*8!Wf3N@m002ovPDHLkV1gM9&CLJ+ delta 429 zcmV;e0aE_b1JnbMF@KIpL_t(Ijh&M*OF~f;$A1qje79$sTIiAxLbgN@wYmqnG`Ivo zNe~3lU`v5WHCQb{&{7}3p{2e+&J9JAfdsWEm1b#Aslf(&*Pc%sI?H+YymNp5bMHMz z0a#rdZtxE~I($@Y0F{c)_WBF}eeNOLzK~2R6|#Jko&flK&wo>Yt^lxqo&!KJ5~o75 z4WAeVK-C0Jk6l9Eigf^LRULqWe#cezLIJS-E=kn{0D+)S#>%f{6AS>o^=Sea3VWw3 zf1Z7MEYcaEYJzkoNi>|0s;&W-X>&W=1W0F+L?+{?n&7QiC!I-J)FYGe&VZU;10Xap zB7bfy9aDZS1AlY{+S&uzn|oAEuz9v6W8>Z)0HWbUcYrF?rvG`uqvZpcWT+dL+_i$+ zmoEZAAM>f0B{3RKplX6zRhP##0gT{$D#q^Ij-`=0saq;AHab0a)AP9on*JeIuz)O$ zB-{0&)KRhB6o7?AZzCQF0$?9>(A)3l^F2>*zrX8n?IxXEwx$tU)77-=Hs3ObLzvdz XN;!~-0mi&o00000NkvXXu0mjf3{1aV diff --git a/src/main/resources/assets/ars_nouveau/textures/item/thread_heights.png b/src/main/resources/assets/ars_nouveau/textures/item/thread_heights.png index fa96f0b72d94925f8fc2aab8fa1a6635faf8015a..4a8659f096a400a7330ceb67c2bff7dd8079948d 100644 GIT binary patch delta 431 zcmV;g0Z{(i1J(nOF@KOrL_t(Ijh&OdOG053ho2h~`Bhg7xh-7?A;*TA8=G2OT7n`& z2!xg>Dnr6Sk_ZAJklb1ta_KK+C4 z0Aed62LDjz;6ZW#yuIn{Cl>(lDu$o=$?syUx~WoY|>_z)$Cvsn_b1OPYm55H$1#&VUOw zsBpY~Wa=6Xr+>QIun-gr_moQ-bGu7K!zr@)4P>8;8dPj8TE^HpLil@(CIYAD$3iT- zitLlg<~IO1Io}cSmR;L7XjuTL*XrCnf0^vr$wHv0elpQLWSX8 zg&+hG^g$&=G)UGG2!Ytv(ojSF12s1!O$HL!(xnfxtgF;ugLw3Q*wAk|hjU)e`~2Sb zyb{2|;y{&uD0%Q8xd2KfgPo;u06GKx1eA~nD(G3h3Qquhe}6nuc`gC4cb)@4st1mQ zCaQ{O2mrU&Lw8Syc;x-H0zmoG06;hHxXxZk0Ip^vx7P!JswpInqT)Ofj+@zy#@6&e zJwrBgZ;F3^t%y6T90{yaHAU?6Io(9iW+f1%m>S&@_=%$^#kV5)oNgl#1ZAU) zyWfMVDIBk*O@CP<;do0MHiB&Co_tPcdUu{kI8N$p9oa9VYKo&pTN|w{gumNpB5-?a z78X*=$bOmB**X9xSKH#gZr8B}bqfH+w<5PMKPG!lvJoh1fMjGJ*)Ibi`(;+=4hanp zI@ZAUk%Z5Df!NrFW7cL#05h|_)s;yNfQ~*N?Oj2>KP?_F^$leu9|Kv eYePPt*~Tw@ajX0X4jLr@000021pfn&F@L#9L_t(Ijh&M}NLx`9#(z&#@}AMeM8b112!T2YMLT!w)DG?7 zB3M)c0l}$=QW4Qs3?dXVNwan7;?k+3vxR7;Sb`E4A0dBUYP>I);W>nN<0ID&p5JdEj z-QQpN@?n=yG=G3yw>dgqmo@KZKKTG8fFm6Am_a;Y@?-70)WNRX0L;DK>Y=aHpm27{ z{QfefqQ(6Fvg{sDm{MdV1KrR&XV4&%JRlSeFg-Rv^8H?qjY^&Zfv$+T<&3 zpd)Cb+CmQ+9jAn&*1#JfUuly`9>}6bwWaK?WT3JyJW<*?OGT>(sK-X9Dfs+mL)q;~ z1`CU0?&gvPoHIBw&QK)AU9HSeB=*E|!B+aOE4LB4+XXrP7sJDTD<1&EbhWT)R?33_ O0000TF@L{FL_t(Ijh&M*NE=ZY$A8x-$rC18JU@Zn6giN6U2bV4`4&o>s9h5Al5S0kR5t8OY;=4cy*WtKljyxCN z^4|O2_x|7i`~UegfR&Ha9uHXgooj6bpxqYiZqNBq<2jx-C4ZAN?*_y<0R3Bseys*T zCV%0-2Z=M!-guVr6aYPD5KlxUNUPBW!0iYCZ1Iqi^>cz?T2JQ2ldIu!O-WzPJoPa!}F;0hN#X^=`=?0x>5g zLQ5@yLZOp{pd!H`G$}&CDd?6ZgBjAlAhSv|Q(B6UE(VFosmXg{hI1%+@seu>zi@E; z?)N_L`+fI*8o-yYFKnKmy&r!y55VoMV0Y&O00A=s+Ur4=eSb`=Q3Igcy5#=m0)U-^ z3IJNa?@eUIHjS46=sttF=hKRDeRT(b><9oF;ulA?pBjMYu_fJS01#d@Rn2N!4j2Gp z@ah2ccc`7715i525|5?1zPeN2hBYzlp#PZR0P$FwTro*_(IoO}fznApF%mM&LLM!Dqx|U8XrM+1n<6m0-*k< zq3Zr;e%HkgfNtojSZ($wlv7ljJpeKXpIsM&%Wupl_8kpY+fosfQz1tIQb_8?D!26FuduvSt&X}5=#~TRI xZC&CGg#I&Ju$}pBt7(M6bU}r2nwfFl#0Mm$q+XGHu~Yy6002ovPDHLkV1n1B*PH+V delta 457 zcmV;)0XF{b1MmZoF@LH_L_t(Ijh&ORYZ_q~#(!6$f#*}lZP=q*zLdl#x5C@ko zfj}rip-?&mkp_xnki;&9Oky_|hd7vjAkINroGgSuvP4p&muSCFbTEVXT~03<`oM9= zd++zV=lSk?HGof_Uk~{Y9sRh{W&k=J!Ty&G0OkU(2$)gT)PHK!`PaGupnrc&?{5cy zZ224jZQQsP-5i?63IMv#;N{Y+g52Hq0FYe)KtufDtbU>a%sjTF`wRfW5mVKyw&j2U zAnZp6VEl#p?+XCR)hvm4hP&IIdN-*TlMcq084i$$XULUOgd--=w{Iv{v&y9_Kz0RR zkM~sWTq#8&o`1n=TUc$2_v_!LoG5@465VG|NaiV4(rO=arIZ2|E9vJW$gW`P-~#}c z=M7a~SX^*j>;UM7u8OthfMO+0tvLYT@aIR@#o+QA3(35r!D?G7f^sV4G(ZaJh%nY_ z&_k^`U^VCgAogzec?U;{@4zVcq#o~!D?oOIeOxbFQ$o#d(g3!1g2UZd1c2FPKi>He z{rhXY^Pwk)>o9+6Pb1jVHPWw%yDh)pc@iH0)6%9~_MNRc00000NkvXXu0mjfQ?}do diff --git a/src/main/resources/assets/ars_nouveau/textures/item/thread_kindling.png b/src/main/resources/assets/ars_nouveau/textures/item/thread_kindling.png index ef98265ed30632b32176672c4d776355dc26d818..7c2c062cec5b04ae5b8df342a49233558b87020f 100644 GIT binary patch delta 439 zcmV;o0Z9Jj1KtCWF@KmzL_t(Ijh&M}NCIIP#(x(P-gTvE#I+=dkYhv5jZG~zG!_Yg z5VRSF5z#+z2!cQm-CA5+ni`!8DkqBwZ0QKQwCpZ&xQ4i^^HQM)zUh0uhu`~t?<)YT zu8o=eL&rxCLNCDEo6h0R5&(WB0>b2v%e+8S%K*GU0)McRy97Y6d{dEGQ<262 z5M>E(z+-3BpFaRF8ae=~e#3eBQ~>DtjU>tvqAU>%EBJ0&4NSoz?t<xd%lO?_kQmy z0IaT!H28;3j-LbvK)I~3w>}L(pKl1C5;9FiHOp7=1%TS;Gk?|BG5|*xIRFI1I1!p@ zDAE`JqAcO@JI#=fw<-X7MFT+99=Oe33IIK=NTMtu$`XN~g16sGA{_z1<9FimJI(V} zSpxKmhF;Og-anGPe`ICukVHDd$6FOOU*!BIYEt|fAj%T4s{=$?LJ9atq$6xDpArZv zgvLkNTt4kiuzxeP&G}8#e0Mw*ru1H-^j;#K3U?;ZHQgit2m}?2(WpneYy^hlsc_fJ zmH<%_JDUEIt%zq^Niv1H&6p|FS(x1YA=PwyfUfE07w*r;$Q0_9wKKJCDmKenT=C>} na~h#JT|c^O+naK^teyA`86B_@h$HLC00000NkvXXu0mjfv(U=q diff --git a/src/main/resources/assets/ars_nouveau/textures/item/thread_life_drain.png b/src/main/resources/assets/ars_nouveau/textures/item/thread_life_drain.png index d8bf7fa9d306317ed77743c62ac421ef27648949..046daebff451074c82403ef4db12b14b34b6fc9b 100644 GIT binary patch delta 404 zcmV;F0c-xi1G@u|F@JSQL_t(Ijh&M}OT$nU#eb0^O`6)8ip0f$6zu4rpTWt+Sx~G9 zg5ah^6bA=UL=Xx>(9JoEA49=EQxy?(v53}IZBpzIr#zD;Rq?W{Rb%l@c!blVrWZgO{bqS*R4Ziw8r3I0-yQ+jJbyX|K=OHGg$Ykrh5?XO zg-k9fH0m!+0Nf7;fQoa?Y57C~=n7hrRRvj9F!DOt-Yk}F0+7ii$>frv9z-H|@jH|+ z?n0#cOH}-yG0000@;BvY59?pBtdwC^* z^^Ng1|G?SllN17IG%WTvX8{<9jSuTpBFrM!loho}XyFPLdB!H#mk@nVn3V`rv zg#N(THJ7+Ix_%j%PpB+3xIG(NZr{v+XVwal#VVy@r6|4p3}>1SI$89 ztX>45=BESGYiY>04bzKpBvw2a&V(6u%d(V z7~Y&vpg#eoWq$&&KD0(MQy`fsDAB`Rx+*|xW4I$keE!fS`q@S)r0zfpiOdU9iF<}O zC$MuicFqRi;ADYhrckk!nuErGhuGu}P0dZJ2FXl;`1~QJ*V5{w4U!tyhb+;)#j1aI z0Y=7JoaJ!?xTdb5m3n`WkL)w`{$Q2mf|adXM{OgNwjK+v_$_=s_pE#af+3Q@kSgey P00000NkvXXu0mjf!KlT9 delta 426 zcmV;b0agCY1JMJJF@K9mL_t(Ijh&NAOF}^yhMyA=o|AU7!ZrmV9VT`wM`HNVY{}qus_f~q;O>*LT!>VJ*CY^E^HBw9nX=VcQeEA%`@+O7Y$%_ zZMeoibaMQpwF8t&g1z-=06O~y>GK6tP$8G*v+x4I*T*xJ*MAZKu|x&{tsXcTn5p@U zF#vS8LATeXAn$J#0AyJJkP{Ewrmr=C_TQFtw*kP2->1&ZqG^EvAR1c>p#DPoK1(7Q zv)l{ zbae1rp~#W~{eKD24IO}kxqVXkDye)`1wCeREdjPNj`)3CgyWW=<}ykl?GB`n$g&`P zpCuGo!YrDYMH7Itt1VLbs$(f_4!XTAPL_}8>FrTDNad?sgyZOL!rl_4)QL&TtqFj$Gs)|X#{hVK9;{o#Q-9HW`n@9n&ig0)`tb#T zjlDwvtoYpR{JqF`t^;7F9WvRJ_W1twCje?70qDt(ygPbp0Zd#(veOO#xp|+(&80t> z!M0%rfE+FjgSf-u<`T7qRs5VsIjr#N!AshmIso@?J~zBBjS|EZe$E4+Rc+Gl)LAa= z8kC6!Y9KX5e1GrLZ>Iok?LFn;oprrGW}u|PPCMiabF`{W*7j=%R}dbo5EL7UVz`jP zjoG`=wdsO^+3wT{iVcJ-0O%g~Py=bCpb2cp*5XVyrN!m2Lif0*#iKR$h`D*6@L+}I z(k{Xk>;&7a?bi%4C6(6b7?o70fz*#Rntf9DM1r8$AYhYCAzXoQ1?8|ptJ)-Am>Y}G zAc(u@@7nDHP+M3{>}(i3dNLioC|SSFIq&LHP|Aa|z<}bqq>sy~9J&iD&E;!_0 dH8o{k<2Sl_t8(bC$H@Qy002ovPDHLkV1j?l_ZR>G delta 492 zcmVRH){%@-mKu`_Z@(XvlGsL z^Z|JLp$&i)ZoHR!H1wR?0N8PdWICope*ZiNKn)}SUHO&I#~&?#sjEnK+yNky^;q6n zy~OnQj4%M?XlVq56_$5asVr{dWl|J_5^o-F(`;1%Sh~ArWL+C42r0Zw3V=qrPP0{I zedWNQj0{i%sedWLbD#b?1z`96bDrFPrT!wSL`1VdPAMeN^>G0%gBYBbkmNT!C-}#h^r^Tql=b zm}sFv5LVI8wbKKjvbY&pIg|zP^x5oiZ7B;t>_&p=nK>@bPMDsV`{!`&)<2D=5k}K> isV`&SkrD~>7=Hn2wXJXiI=fl`0000%8Gov?ylrf&1i*!T!rwo? z0hnIh1wiq6!^wx9q1^^R)it_$+N8$W=_LSeO#ontL%x?b6@W<4lB#O}#1n?BIaQ}Y z3;w*HCqhbSlrr&H?~$CYFdN z43hT-+1Oc-E`NPAjNq&LB44)N1CV(<%kugZ=~TY816R1Hy2i}ckHixO*cy|UyWN4z@(I&E4ws32L zUzI%$j=wc0F&Grfw3`IN5CIr}cFTJ=p#VR)+1W>Xtd|S>g!Wi(i{pa){7+9_Bh;@8 gcDW869gRu+2NxK>l;W2^#sB~S07*qoM6N<$f@IR+00000 delta 494 zcmVA@Kr+=`UkuE)Swcx3HBJaN}0+4vH%I3}j@mRXQ16R1Hy2kRyH$+T>WIiQH z{XPfIAT{+Gt7P{OBc>tS3KUQ^RoYMHQ)Ckx>{n0NubvQ(rLjsjGq-2YcHn*9p3e~; z39~()Bb(Te?RW!pg&RBre+y3C;nCVN09GC@lgy_AXJ;Ujcx&Qb`{uQ~GBn|la1Yrk z*|<%?uj(G(%b$9a=nsl*)p`Vipa496GS;4*F##C55@K+8oa3VkgTv!}muo%uxwDPX k*{=WicIxaP6zWdmKgLDDk~b@v2LJ#707*qoM6N<$f?`+d-v9sr diff --git a/src/main/resources/assets/ars_nouveau/textures/item/thread_starbuncle.png b/src/main/resources/assets/ars_nouveau/textures/item/thread_starbuncle.png index d3d3764816942d5d13cd67cf4a8dd785b3060340..d3b1a6d2d4bed2ef9cf5a2ceb7e150ad12d170e2 100644 GIT binary patch delta 426 zcmV;b0agCk1JMJJF@K9mL_t(Ijh&OvD@0Kg$3IWVdj@aDG>wg+6iG_4v9VEBHY{uu zF)5|&Ec{49A}OVm@&{P3v9+G_5T07zJ897K0DfPAMU-D3a{stL;7{oTDn27r}4Dg>Dd(a0qL z!H`cBWZvA!Q82MRNu$32fT6AhOs~nt&alMvv`s4t^4tn0JH|OlzAG&_lifat zyS}Pb`d``{R(}GW$xah<6htGJ^e%=!rG8;-aGkCF88O)jAZV;2c2;D#~> z)qy5yp?5K?1kQKQ3CUG5!fAX@orAQMmKJo6!P?NWB>(9fGty13Dfgx~+lregXOP6{ zSnAt~-zw-E@Y_>^8gNWuX$8f;057QYIOaK4?07*qoM6N<$g4Arop#T5? delta 433 zcmV;i0Z#tW1K0zQF@KUtL_t(Ijh&OtD@0)w#(!7Hy=J&GJ{lVzrA(5tu(7dGO0i&J zqZCp~$$|w_5|WRNQcC;*7A)9Wu(mMCVwA{iOg_fPa7Qf0f;soTcUbUj?(KcgdCqg5 z_Z$sic%(eVKd`zI)v^H+35%K0HURSdrT7Cu35v%eyvA<;cz=Js=Iu5Cz|!tH09rb* zG1#687&QRs9)rT7JRy0ye*+--VgV4d&NzzfX#m+yNxH`XprSe;XO9n$3K;;F{i_h9 zD@4K<00b)hq9A?eMuvjP?GW|FIRFfH&SUya)^~;^rn`AcQIO?U5Ne&^KW=pKXB!DUJQ(=(=}n?6&{O`qM0 zn6O0Wsw~v00000NkvXXu0mjf302Vq diff --git a/src/main/resources/assets/ars_nouveau/textures/item/thread_undying.png b/src/main/resources/assets/ars_nouveau/textures/item/thread_undying.png index 2ba1338017a64916831fcf323003e843cd556c23..a534467e424faa0a3bb557a2c9d608c16d53d09b 100644 GIT binary patch delta 488 zcmVSk7 zz~Z}20JO%rOv)0|=m$U#8H8g&rEzj}4uD&C0H`=W__Fgs1L$bBv{7C`4;du;Od>rI zB0UiR!m%LXSP(sAuu)!VT~8)uiIvWamClQZs8vK{d}KkztaM&7DNFUt4Gnt!OQ-2Pd2{doqy2FE^S@e*h>IOLea|}Q(TU34UF_0LQ@sS1D`h6koXj?)< zeY<+uI!g;w3A&*J@Z#Z;dcx`TJonC?+=A;fk zcd*CinOJ_R8n<1&2MrMZt{Gw zgWqzwhkO6?pL6fg0Op@2g#TcDZC@J#Xf_>|pUnVpEqa5fnSWM?j_bSpKK=`Yly!W%QsyGG!7O zjSv})01%D^2*(2GL4#_oJh+~0+7c^M5Gzv<5mBp%$lTUk!s7Mx z*Zq&0PvBDL_t(Ijh&OfOCv!X#Xl=SZa2}}#3SUIXdxI5t6&-n)7Wlf zVM>n+2m!$+D98OsVIf2i1VIqf*=nKf{RelVfh%$nIAY`Ck7U)jD{02!ZfAFsc*Q*! zhWYj8y*Kk!0G5`Mg8#tw)`b!RczCecTzd~dERh0b%G)J=(0?>*06aFY=-giduvR$* zKymkFQie!q69A|Yjn^ZuB*)$D697)z2Eep`@x6Ae0EGOK)QASa=y*cTSuHC-27uki zPbOsuBV80i2-*ALU(2KnnOTp5T(-o~$p(va>j3Cc9e|^g4Oa3ye^mMu4EPD0w#}!5 z&*ZWt?rxvhJ%9X2xl+JtSuD=2Q?3+b4m}DS+d++c8I&spR`NSoEh`XYHv$%1_D0<# zmo3Tg^r(&=?R(xMP&HLfcBkH`oBdDIm4O=3*k9daX}9?IR$UUh*|>IlFqxbcM!G1f z*BvoG^Ho%@JAvk|8R?>!OwP(@RQv?*#-;p0eb+|w zMc;me02V&H5nu8OP-SrVE#X+4$L1B`Sp0?Jf>QZh$Z70YFVr;?NY4dWDb1_9NR&i^fD+`a%`@av07Fj$S?vHT=sg+ zB%3M7@bs9D9vgVxBTzL}PKHyj*UZ7E31y&0G>*0oSwF}>-l|JNHyhV(9~Kge!bs)C zS)(UDy!|518ofYs*NjwNEF>1?Gb(<9`I$EX-(l2iCRa|!=HlOP{#<_V|A|h=_P%Sq z`J`_@6oBQGSK`zASpY^}M;RWSqIY-2@aWW&#Z^4~;Z-Ae)%Ad1q25C@ss+aX0W(L^ U2tpB7WdHyG07*qoM6N<$f@1{XO8@`> diff --git a/src/main/resources/assets/ars_nouveau/textures/item/thread_whirlisprig.png b/src/main/resources/assets/ars_nouveau/textures/item/thread_whirlisprig.png index cd9e0e15df29b4aa37c89c75c05ef3cd8c20a0a2..fe05768b6a5165a85104952c2ea3df86b6095251 100644 GIT binary patch delta 447 zcmV;w0YLuu1LgyeF@K;*L_t(Ijh&NCC`3^dfWN0n-ZOYJq-WzvQzls`Y;0_l6$=)Y zL`^AWh5RKUHA$%{HJP1_1shu%Ys!$tkZ5d7V*HK!#Nt`KJM)a8oYlSOo_o%B{uF@G zv09sdNM!v+@c_KO3f2|}0q`3^P+GHA_7Uk+0)V&l9Um{Z0DmmTjsZ{{yS8ArZDYg5-T+RRx*`v#W6Cn}50>Ci+ zlE8WUE_nnqJG1g039X|0bfUW>QrF)x|2x5K*R)J!`(OcpQ141Xk|Oz8Sg2l&U~@fY zz;Ka7cc%)bQGb+su`+^0{EFmdisil~sh=3$zzi6Y>_-Qxrph{0RF=31!m$yOm#M!A zRIi2^FwlKETa%ld-haAk;1F2Cl7D0oEn&$NoNh!ytFi_?E#rC7A!ibsYCG-5x^_7< zx=+tDcG9@Mk8^gjpFfFKMr6k|nf@{2ckuuW3{}~4!#E0XLUDNwrT%K((sz{ls|zd_ p%!e;*xs8zBE;!~lDJyfg@(bg|r;t7>S||Vj002ovPDHLkV1i-n%pL#$ delta 464 zcmV;>0WbdM1NQ@vF@Ld1L_t(Ijh&M}XcJ)+z<&uL8e?cBpHIc6Km`!wI1!SrTfDF^S)mcDN4ZzRTs0 zg}&wczW2TFz2AG^djWt)kJAp9km9>qAOz6u3SK{10N_gUDt}2mBaK=Oi+`;n08Tn} zj(>Fl*x0E65O57|XBHh@y#as{RhdXdq?5nDj{&fI0)U42$ye)303g(lq(oH!3{#i7 z_Mf)T834lD`W(0stnvW>x{;Iw?%kja5xn@kD$m8-CR#$Hw4Il_2X|lopI~+VxlHBL z{wn}-_uh^r34hAR!bXXzWM;2pn7WUow7oJmjbQ)5?g^~&0o6)_H}}`1{^|023{#h6 zBONHJBI_`biuefDKjf)a8W$5NQ5D0~(GnUTpKbBIdFrcyOJECIzL7<=g)LKXf1{Y& zlr_lSDhx%3zD}G;&p9`*-H}bBCA1-9H;uz)nIE;?;Ym)kd%|niYHMV~kpvHyCY?go z1RydMBOIURq*EsxpB_70>sx!?G=eu>=kje}^&}Saf8`mI0jZAEm=-+%0000BSJnyXWE_B8`hSVf_eTI?TW0`h@?DR= z-|`uq0O(GGhQ=C&@%H=yfSDBlB*ity@qG=z@tczFGyrJr@G0Nx%WDxB0HSa#0+1Qv z=XU_?oh}0q3P#jjsa2ISkV^&w>>Ne$2ioxm+7(M%05dBvvx1$YXj!JEtx*!U$ucGi zz!WCB(_sE!!GD&jWKyvNGb@ktYS^GLwg~~ zK$qL4{4RHXx9dWgkd#~#>9Tt5%mFYs?6u~?8gM~%eKRw)o+fhXCu%)Se+(BymToLH kjZl~_IHQu))fFr88$I-zx?Ezab^rhX07*qoM6N<$g1EB8KL7v# delta 444 zcmV;t0Ym=b1LFgbF@K#&L_t(Ijh&M}NJ3E*#(ytDdM_>ei!MeHeV7PZ#{VPXRxdQpgV1T2`75sq?{DBUo(w4x?3Cx_}=yIhZ)8@e>kI_Vh z5=CGN6WwXBc7L{RD^)7_vjj6ISn6LOocv_CcUk%8#&-cqd=lyrbwju8ca4k3ON5i3 z0E}!*s06v_1ZxL7#(Xa%no$|P&L!y!cpfXpNZqB^ZvSAoBJ2V mZG_@>S-2^)MYvq0llTSgA)L5tRxDxw0000g4Po zwEh7t1iIMKpf1JY;wBd(R4H8x2> zb8h#Ues}M^d*9!Czk5H47E0N)kkuGb?U6(WO4+mkI6l}0V1NATtB!tuL#XvZR%586 zlUS{j!uF!b8dhZ8^$n)*>~#x2yn~Zx^waKlR$jH-q`}6ZdXW5 ztxI7=CK?HIbacYtz<@6TE&wdw|K4U;y7~FsKx=o;7XhKf)Vc)lxEFEn1}HR zXeLWF4VyWIvi*BqDCYkN>KhtER%5;9{&&7vcZK-zRDbyKEvb}Ei`6v^fUqKahQ;{; zhMDvR&b{RmaEBFe=hhbhE+;N=>D^!a#w)8vqjymaD1@M!{<7K{rv!F7e}ym_sA?+-kpI@_eMZKKtMo1KtRBM;TL`3 Wq^P_9#0}N}0000Px%B1uF+R9J=Wl|N_`VHk&>le9^jTtlxW zS{j{Bt44`Ppe+G2b#M@bObQA*iKBw6tCNF5hKe9U=xS{SAy9BAEmHi0h9)6XNl2QQ z3&|y1lMd%_=1kH!XySIybl<%%_x`^3-tYGbbdlX$*2kx2&42ajOK*h!IKV+!1>oY1 z?Vk9*VC!CtPtD?#yfl^4z~ty^kcOu5_+E0@x`PEcB`?y+bAJ>7Fy}o^EFPw&Hi5+O z0y=GXN?!BjsS8(8iYfNK-O&Ns^#XDzA-F{+Gt+KbtwUUslS3B=ICfB0*;(19sg!6c zC6rog>jm2Ng89#lT^r>0%OeqBGY9EKhV^Hv?vr5SW16$_6XcNCGh_`- zqt!aZZXX*-ap;=?p9BHFN=})_Cml^ThA&Ah9;TsbqZbhHs|Z)B_>v+4zj`FOvb769 zWWk87yc&UkPTRW+UcSAD{%M-euT>o&r@-}xqVT?Q-+vGw$8mVX;j06-Og0VjJS2?| z27U#;CPi|J@tnz~0l0fB135|&c5dvcHBUwIMul)PH?|XmT z8;wSDYRK~(0OwqI7LlbGYb}Ql4goOM0HC!7pe)N?-FH{XR)0mEb3r_Qw<_*AK7O_s z%uk^=g!w7w-@dS4rpQC)1%NAeZy?WeilPYF#XLTGj)+hc1@IXqDoxoN@R`M;F(QJs zw($cW-aicEy_@$JRRAU@lQaYC0<5)&NXRU%f{5_s=~*;S&T#JSQVZ7_Sd^~40zM`# zuQ&4MX7zXuVD0Skd3JfFkpUD%K~+_? z0Zo(7^X~Osew=^j!njZcfIDdgAXB0+)-ZfD#8`vYI*9tx`+FTPUj4*a&^iY+W%)5_ z{d;y`(OY8;O4O2gTjrkF^d@A@y-mZLOfg%>&Yy^HgMZ{zFdmP?nNd|0{eJ&S%qDF} zHV{*{(X{QBZ6vo~U3N`})z%F771AWO@hV6SoX(~}NQq)Pn})JG=NKFe{;mPf>T(ki zM5JY_-jadA!65wg{O*~*6$5_9^JuNZQTg#x-47( P0000xXp&+#2iPrPky=_rzt$!B}|JxRKeERqjfTWsH zCFdm74D3&mXEE~7a{|E5)fq_B6s45UF68x_&xi<0Dc~2GWPplO2YN2EP&7nDFvc{# z;QN>J^<4$&B~`L|p4>(nI22%vK}6P>u~7vP;nmw&uuf(>Ej(yoRl5BZa52tAXyn_6 z1pwWCpXGc`w}0QKd-gPb4a7Q~+)ip&^*hEDux`^Cuvq^dU_dEFQ53ZSO^eU*^)6$% z_|0;@@KpeK@;uT&CK;tExqfj?X-c%#UeuM|UF*1cuP9A|)*S%y{72OMJ36rHZD~p} z$u`9IW$p+~A49LHx3M^rF=p%NJVyK!L{GtZJoaZsQGFB)27{fLW7-gHAf#@i*|%Hn zBf15LvTHi5PG-PONR!ynQxF?Cy`OraOfshTQ(ty#EyIi9-!jm1lNlIZ z4E Date: Sun, 28 Jul 2024 12:36:36 -0500 Subject: [PATCH 101/363] update block textures --- .../tile/AlterationTableRenderer.java | 13 +- .../renderer/tile/PotionMelderModel.java | 2 +- .../arsnouveau/common/block/PotionMelder.java | 28 +- .../arsnouveau/common/block/TableBlock.java | 3 +- .../common/block/WixieCauldron.java | 31 + .../common/datagen/BlockTagProvider.java | 5 + .../ars_nouveau/geo/alteration_table.geo.json | 15 + ...elder.geo.json => potion_stirrer.geo.json} | 8 +- .../ars_nouveau/geo/spell_turret.geo.json | 237 ++--- .../models/block/potion_melder.json | 225 +++-- .../models/block/wixie_cauldron_empty.json | 897 ++++------------- .../models/block/wixie_cauldron_full.json | 924 +++++------------- .../textures/block/agronomic_sourcelink.png | Bin 1314 -> 1309 bytes .../textures/block/alchemical_sourcelink.png | Bin 1052 -> 1078 bytes .../textures/block/alteration_table.png | Bin 6994 -> 5769 bytes .../textures/block/arcane_core.png | Bin 2150 -> 2040 bytes .../textures/block/arcane_pedestal.png | Bin 1612 -> 1519 bytes .../textures/block/arcane_platform.png | Bin 947 -> 964 bytes .../textures/block/book_wyrm_lectern.png | Bin 3014 -> 3001 bytes .../textures/block/enchanting_apparatus.png | Bin 716 -> 657 bytes .../block/gilded_sourcestone_alternating.png | Bin 562 -> 612 bytes .../block/gilded_sourcestone_basketweave.png | Bin 546 -> 575 bytes .../block/gilded_sourcestone_large_bricks.png | Bin 477 -> 505 bytes .../block/gilded_sourcestone_mosaic.png | Bin 490 -> 494 bytes .../block/gilded_sourcestone_small_bricks.png | Bin 529 -> 549 bytes .../textures/block/imbuement_chamber.png | Bin 1346 -> 1342 bytes .../textures/block/item_detector.png | Bin 877 -> 916 bytes .../textures/block/magelight_torch.png | Bin 854 -> 837 bytes .../ars_nouveau/textures/block/mob_jar.png | Bin 1185 -> 1194 bytes .../textures/block/mycelial_sourcelink.png | Bin 1952 -> 1941 bytes .../textures/block/potion_diffuser.png | Bin 1573 -> 1541 bytes .../ars_nouveau/textures/block/potion_jar.png | Bin 1788 -> 1607 bytes .../textures/block/potion_melder.png | Bin 1039 -> 861 bytes .../textures/block/potion_stirrer.png | Bin 361 -> 394 bytes .../textures/block/redstone_relay.png | Bin 703 -> 780 bytes .../ars_nouveau/textures/block/repository.png | Bin 3085 -> 3064 bytes .../textures/block/ritual_brazier.png | Bin 1376 -> 1376 bytes .../ars_nouveau/textures/block/sconce.png | Bin 748 -> 765 bytes .../textures/block/scribes_table.png | Bin 5234 -> 5232 bytes .../textures/block/scryers_eye_alert.png | Bin 951 -> 988 bytes .../textures/block/scryers_eye_idle.png | Bin 925 -> 959 bytes .../textures/block/scryers_eye_sleeping.png | Bin 856 -> 897 bytes .../textures/block/scryers_eye_squinting.png | Bin 910 -> 954 bytes .../smooth_gilded_sourcestone_alternating.png | Bin 605 -> 635 bytes .../smooth_gilded_sourcestone_basketweave.png | Bin 569 -> 596 bytes ...smooth_gilded_sourcestone_large_bricks.png | Bin 497 -> 533 bytes .../smooth_gilded_sourcestone_mosaic.png | Bin 543 -> 531 bytes ...smooth_gilded_sourcestone_small_bricks.png | Bin 567 -> 576 bytes .../textures/block/source_collector.png | Bin 1004 -> 999 bytes .../textures/block/source_deposit.png | Bin 984 -> 986 bytes .../ars_nouveau/textures/block/source_jar.png | Bin 1771 -> 1716 bytes .../textures/block/source_relay.png | Bin 1005 -> 1014 bytes .../textures/block/source_splitter.png | Bin 736 -> 736 bytes .../textures/block/source_warp.png | Bin 762 -> 761 bytes .../textures/block/spell_prism.png | Bin 466 -> 451 bytes .../textures/block/spell_prism_target.png | Bin 550 -> 541 bytes .../textures/block/spell_turret.png | Bin 1207 -> 754 bytes .../textures/block/vitalic_sourcelink.png | Bin 1116 -> 1113 bytes .../ars_nouveau/textures/block/void_prism.png | Bin 511 -> 508 bytes .../textures/block/volcanic_sourcelink.png | Bin 1268 -> 1262 bytes .../textures/block/wixie_cauldron.png | Bin 1564 -> 2125 bytes .../ars_nouveau/textures/gui/scroll_ball.png | Bin 278 -> 274 bytes .../model/chest/archwood/archwood.png | Bin 2243 -> 1853 bytes .../textures/model/chest/archwood/left.png | Bin 2106 -> 1994 bytes .../textures/model/chest/archwood/right.png | Bin 2261 -> 2071 bytes 65 files changed, 746 insertions(+), 1642 deletions(-) rename src/main/resources/assets/ars_nouveau/geo/{potion_melder.geo.json => potion_stirrer.geo.json} (91%) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java index 4e6b212a64..13c1e3f49e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java @@ -38,6 +38,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.armortrim.ArmorTrim; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import org.joml.Quaternionf; import org.joml.Vector3d; import software.bernie.geckolib.cache.object.BakedGeoModel; @@ -316,6 +317,16 @@ public RenderType getRenderType(AlterationTile animatable, ResourceLocation text @Override public boolean shouldRenderOffScreen(AlterationTile pBlockEntity) { - return false; + return true; + } + + @Override + public int getViewDistance() { + return 256; + } + + @Override + public AABB getRenderBoundingBox(AlterationTile blockEntity) { + return AABB.INFINITE; } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PotionMelderModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PotionMelderModel.java index b6819b4016..9e7ab6c859 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PotionMelderModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PotionMelderModel.java @@ -7,7 +7,7 @@ public class PotionMelderModel extends GeoModel { - public static final ResourceLocation model = ArsNouveau.prefix( "geo/potion_melder.geo.json"); + public static final ResourceLocation model = ArsNouveau.prefix( "geo/potion_stirrer.geo.json"); public static final ResourceLocation texture = ArsNouveau.prefix( "textures/block/potion_stirrer.png"); public static final ResourceLocation anim = ArsNouveau.prefix( "animations/potion_melder_animation.json"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionMelder.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionMelder.java index e553e0462c..ca5d7d4520 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionMelder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/PotionMelder.java @@ -18,11 +18,27 @@ import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; import net.minecraft.world.level.pathfinder.PathComputationType; +import net.minecraft.world.phys.shapes.BooleanOp; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.NotNull; +import java.util.stream.Stream; + import static net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED; public class PotionMelder extends TickableModBlock implements SimpleWaterloggedBlock { + + public static VoxelShape shape = Stream.of( + Block.box(0, 13, 0, 16, 15, 16), + Block.box(1, 4, 1, 15, 13, 15), + Block.box(1, 0, 7, 6, 4, 9), + Block.box(7, 0, 1, 9, 4, 6), + Block.box(10, 0, 7, 15, 4, 9), + Block.box(7, 0, 10, 9, 4, 15) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + public PotionMelder(Properties properties) { super(properties); registerDefaultState(defaultBlockState().setValue(BlockStateProperties.WATERLOGGED, false)); @@ -53,7 +69,17 @@ public FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : Fluids.EMPTY.defaultFluidState(); } - @NotNull + @Override + protected VoxelShape getCollisionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return super.getCollisionShape(pState, pLevel, pPos, pContext); + } + + @Override + public VoxelShape getShape(BlockState p_220053_1_, BlockGetter p_220053_2_, BlockPos p_220053_3_, CollisionContext p_220053_4_) { + return shape; + } + + @NotNull @Override public BlockState getStateForPlacement(BlockPlaceContext context) { FluidState fluidState = context.getLevel().getFluidState(context.getClickedPos()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/TableBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/TableBlock.java index d7df60e5fb..b5055c706e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/TableBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/TableBlock.java @@ -35,7 +35,8 @@ public abstract class TableBlock extends TickableModBlock{ public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; public TableBlock() { - super(Block.Properties.of().ignitedByLava().mapColor(MapColor.WOOD).sound(SoundType.WOOD).strength(2.0f, 3.0f).noOcclusion().pushReaction(PushReaction.BLOCK)); + super(Block.Properties.of().ignitedByLava().mapColor(MapColor.WOOD).sound(SoundType.WOOD) + .strength(2.0f, 3.0f).noOcclusion().pushReaction(PushReaction.BLOCK)); this.registerDefaultState(this.stateDefinition.any().setValue(PART, ThreePartBlock.FOOT)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/WixieCauldron.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/WixieCauldron.java index 51a6be241d..fb04cb9b1a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/WixieCauldron.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/WixieCauldron.java @@ -10,6 +10,7 @@ import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -17,11 +18,36 @@ import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.BooleanOp; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +import java.util.stream.Stream; import static com.hollingsworth.arsnouveau.common.block.tile.SummoningTile.CONVERTED; public class WixieCauldron extends SummonBlock { + public static final VoxelShape shape = Stream.of( + Block.box(2, 0, 4, 4, 13, 14), + Block.box(4, 0, 12, 14, 13, 14), + Block.box(12, 0, 2, 14, 13, 12), + Block.box(2, 0, 2, 12, 13, 4), + Block.box(4, 0, 4, 12, 5, 12), + Block.box(4, 0, 4, 12, 5, 12), + Block.box(14, 0, 5, 16, 4, 16), + Block.box(14, 4, 9, 16, 8, 16), + Block.box(9, 0, 14, 14, 4, 16), + Block.box(2, 0, 14, 7, 4, 16), + Block.box(0, 0, 11, 2, 4, 16), + Block.box(0, 0, 2, 2, 9, 7), + Block.box(0, 0, 0, 2, 9, 2), + Block.box(2, 0, 0, 7, 9, 2), + Block.box(7, 0, 0, 11, 5, 2), + Block.box(9, 4, 14, 14, 8, 16) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + public static final BooleanProperty FILLED = BooleanProperty.create("filled"); public WixieCauldron() { @@ -29,6 +55,11 @@ public WixieCauldron() { registerDefaultState(defaultBlockState().setValue(CONVERTED, false).setValue(FILLED, false)); } + @Override + protected VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return shape; + } + @Override public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { if (worldIn.isClientSide || handIn != InteractionHand.MAIN_HAND || !(worldIn.getBlockEntity(pos) instanceof WixieCauldronTile) || player.getMainHandItem().getItem() == ItemsRegistry.DOMINION_ROD.get()){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java index 0fc98291a0..bcd798b9b4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java @@ -15,6 +15,7 @@ import net.minecraft.world.level.block.Blocks; import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.common.data.ExistingFileHelper; + import java.util.concurrent.CompletableFuture; public class BlockTagProvider extends IntrinsicHolderTagsProvider { @@ -301,6 +302,10 @@ protected void addTags(HolderLookup.Provider pProvider) { this.tag(VEXING_LOGS).add(BlockRegistry.VEXING_LOG.get(), BlockRegistry.VEXING_WOOD.get(), BlockRegistry.STRIPPED_AWLOG_PURPLE.get(), BlockRegistry.STRIPPED_AWWOOD_PURPLE.get()); this.tag(DOWSING_ROD).addTag(BUDDING_BLOCKS); + + this.tag(BlockTags.SNOW_LAYER_CANNOT_SURVIVE_ON).add(BlockRegistry.ALTERATION_TABLE.get(), BlockRegistry.WIXIE_CAULDRON.get(), BlockRegistry.POTION_MELDER.get(), + BlockRegistry.SCRIBES_BLOCK.get(), BlockRegistry.IMBUEMENT_BLOCK.get(), BlockRegistry.SCRYERS_OCULUS.get(), BlockRegistry.ARCANE_PEDESTAL.get(), + BlockRegistry.CRAFTING_LECTERN.get(), BlockRegistry.ENCHANTING_APP_BLOCK.get()); } public String getName() { diff --git a/src/main/resources/assets/ars_nouveau/geo/alteration_table.geo.json b/src/main/resources/assets/ars_nouveau/geo/alteration_table.geo.json index 3e3c1e068c..e7e6d7db41 100644 --- a/src/main/resources/assets/ars_nouveau/geo/alteration_table.geo.json +++ b/src/main/resources/assets/ars_nouveau/geo/alteration_table.geo.json @@ -148,6 +148,21 @@ } ] }, + { + "name": "perk_bot", + "parent": "display", + "pivot": [5, 17, -0.5] + }, + { + "name": "perk_mid", + "parent": "display", + "pivot": [5, 17, 3.5] + }, + { + "name": "perk_top", + "parent": "display", + "pivot": [5, 17, 7.5] + }, { "name": "top", "parent": "display", diff --git a/src/main/resources/assets/ars_nouveau/geo/potion_melder.geo.json b/src/main/resources/assets/ars_nouveau/geo/potion_stirrer.geo.json similarity index 91% rename from src/main/resources/assets/ars_nouveau/geo/potion_melder.geo.json rename to src/main/resources/assets/ars_nouveau/geo/potion_stirrer.geo.json index 65a2efa439..2eecbe5134 100644 --- a/src/main/resources/assets/ars_nouveau/geo/potion_melder.geo.json +++ b/src/main/resources/assets/ars_nouveau/geo/potion_stirrer.geo.json @@ -13,16 +13,16 @@ "bones": [ { "name": "stirrer2", - "pivot": [0, 17, 0] + "pivot": [0, 0, 0] }, { "name": "stirrer", "parent": "stirrer2", - "pivot": [0, 18, 0], + "pivot": [0.75, 18, 0], "rotation": [0, 0, 22.5], "cubes": [ { - "origin": [3, 6, -1], + "origin": [3.75, 6, -1], "size": [2, 16, 2], "uv": { "north": {"uv": [0, 0], "uv_size": [2, 16]}, @@ -34,7 +34,7 @@ } }, { - "origin": [5, 19, -1], + "origin": [5.75, 19, -1], "size": [2, 3, 2], "uv": { "north": {"uv": [8, 0], "uv_size": [2, 3]}, diff --git a/src/main/resources/assets/ars_nouveau/geo/spell_turret.geo.json b/src/main/resources/assets/ars_nouveau/geo/spell_turret.geo.json index 51c53146b6..d03702f1a9 100644 --- a/src/main/resources/assets/ars_nouveau/geo/spell_turret.geo.json +++ b/src/main/resources/assets/ars_nouveau/geo/spell_turret.geo.json @@ -13,10 +13,10 @@ "bones": [ { "name": "spell_turret", - "pivot": [0, 8, -2.5], + "pivot": [0, 8, 0], "cubes": [ { - "origin": [-3.5, 4.5, -4.5], + "origin": [-3.5, 4.5, -2], "size": [7, 7, 7], "uv": { "north": {"uv": [0, 0], "uv_size": [7, 7]}, @@ -28,15 +28,15 @@ } }, { - "origin": [-1.5, 6.5, 2.5], + "origin": [-1.5, 6.5, 5], "size": [3, 3, 1], "uv": { - "north": {"uv": [0, 21], "uv_size": [3, 3]}, - "east": {"uv": [12, 23], "uv_size": [1, 3]}, - "south": {"uv": [21, 0], "uv_size": [3, 3]}, - "west": {"uv": [13, 23], "uv_size": [1, 3]}, - "up": {"uv": [21, 6], "uv_size": [3, 1]}, - "down": {"uv": [14, 24], "uv_size": [3, -1]} + "north": {"uv": [7, 16], "uv_size": [3, 3]}, + "east": {"uv": [9, 19], "uv_size": [1, 3]}, + "south": {"uv": [10, 16], "uv_size": [3, 3]}, + "west": {"uv": [19, 9], "uv_size": [1, 3]}, + "up": {"uv": [18, 13], "uv_size": [3, 1]}, + "down": {"uv": [18, 15], "uv_size": [3, -1]} } } ] @@ -44,42 +44,42 @@ { "name": "bone", "parent": "spell_turret", - "pivot": [0, 8, -5], + "pivot": [0, 8, -2.5], "cubes": [ { - "origin": [-0.5, 11.5, -6.5], + "origin": [-0.5, 11.5, -4], "size": [1, 2, 6], "uv": { - "north": {"uv": [14, 12], "uv_size": [1, 2]}, - "east": {"uv": [18, 18], "uv_size": [6, 2]}, - "south": {"uv": [24, 1], "uv_size": [1, 2]}, - "west": {"uv": [19, 7], "uv_size": [6, 2]}, - "up": {"uv": [5, 21], "uv_size": [1, 6]}, - "down": {"uv": [6, 27], "uv_size": [1, -6]} + "north": {"uv": [10, 19], "uv_size": [1, 2]}, + "east": {"uv": [7, 14], "uv_size": [6, 2]}, + "south": {"uv": [11, 19], "uv_size": [1, 2]}, + "west": {"uv": [14, 7], "uv_size": [6, 2]}, + "up": {"uv": [16, 13], "uv_size": [1, 6]}, + "down": {"uv": [17, 15], "uv_size": [1, -6]} } }, { - "origin": [-0.5, 11.5, -0.5], + "origin": [-0.5, 11.5, 2], "size": [1, 4, 3], "uv": { - "north": {"uv": [20, 22], "uv_size": [1, 4]}, - "east": {"uv": [7, 19], "uv_size": [3, 4]}, - "south": {"uv": [21, 22], "uv_size": [1, 4]}, - "west": {"uv": [15, 19], "uv_size": [3, 4]}, - "up": {"uv": [8, 23], "uv_size": [1, 3]}, - "down": {"uv": [9, 26], "uv_size": [1, -3]} + "north": {"uv": [18, 9], "uv_size": [1, 4]}, + "east": {"uv": [14, 9], "uv_size": [3, 4]}, + "south": {"uv": [13, 18], "uv_size": [1, 4]}, + "west": {"uv": [13, 14], "uv_size": [3, 4]}, + "up": {"uv": [7, 19], "uv_size": [1, 3]}, + "down": {"uv": [8, 22], "uv_size": [1, -3]} } }, { - "origin": [-0.5, 9.5, -7.5], + "origin": [-0.5, 9.5, -5], "size": [1, 2, 3], "uv": { - "north": {"uv": [24, 4], "uv_size": [1, 2]}, - "east": {"uv": [21, 4], "uv_size": [3, 2]}, - "south": {"uv": [24, 9], "uv_size": [1, 2]}, - "west": {"uv": [12, 21], "uv_size": [3, 2]}, - "up": {"uv": [22, 22], "uv_size": [1, 3]}, - "down": {"uv": [7, 26], "uv_size": [1, -3]} + "north": {"uv": [12, 19], "uv_size": [1, 2]}, + "east": {"uv": [17, 15], "uv_size": [3, 2]}, + "south": {"uv": [16, 19], "uv_size": [1, 2]}, + "west": {"uv": [17, 17], "uv_size": [3, 2]}, + "up": {"uv": [14, 18], "uv_size": [1, 3]}, + "down": {"uv": [15, 21], "uv_size": [1, -3]} } } ] @@ -87,43 +87,43 @@ { "name": "bone2", "parent": "spell_turret", - "pivot": [0, 8, -5], + "pivot": [0, 8, -2.5], "rotation": [0, 0, 90], "cubes": [ { - "origin": [-0.5, 11.5, -6.5], + "origin": [-0.5, 11.5, -4], "size": [1, 2, 6], "uv": { - "north": {"uv": [14, 12], "uv_size": [1, 2]}, - "east": {"uv": [18, 18], "uv_size": [6, 2]}, - "south": {"uv": [24, 1], "uv_size": [1, 2]}, - "west": {"uv": [19, 7], "uv_size": [6, 2]}, - "up": {"uv": [5, 21], "uv_size": [1, 6]}, - "down": {"uv": [6, 27], "uv_size": [1, -6]} + "north": {"uv": [10, 19], "uv_size": [1, 2]}, + "east": {"uv": [7, 14], "uv_size": [6, 2]}, + "south": {"uv": [11, 19], "uv_size": [1, 2]}, + "west": {"uv": [14, 7], "uv_size": [6, 2]}, + "up": {"uv": [16, 13], "uv_size": [1, 6]}, + "down": {"uv": [17, 15], "uv_size": [1, -6]} } }, { - "origin": [-0.5, 11.5, -0.5], + "origin": [-0.5, 11.5, 2], "size": [1, 4, 3], "uv": { - "north": {"uv": [20, 22], "uv_size": [1, 4]}, - "east": {"uv": [7, 19], "uv_size": [3, 4]}, - "south": {"uv": [21, 22], "uv_size": [1, 4]}, - "west": {"uv": [15, 19], "uv_size": [3, 4]}, - "up": {"uv": [8, 23], "uv_size": [1, 3]}, - "down": {"uv": [9, 26], "uv_size": [1, -3]} + "north": {"uv": [18, 9], "uv_size": [1, 4]}, + "east": {"uv": [14, 9], "uv_size": [3, 4]}, + "south": {"uv": [13, 18], "uv_size": [1, 4]}, + "west": {"uv": [13, 14], "uv_size": [3, 4]}, + "up": {"uv": [7, 19], "uv_size": [1, 3]}, + "down": {"uv": [8, 22], "uv_size": [1, -3]} } }, { - "origin": [-0.5, 9.5, -7.5], + "origin": [-0.5, 9.5, -5], "size": [1, 2, 3], "uv": { - "north": {"uv": [24, 4], "uv_size": [1, 2]}, - "east": {"uv": [21, 4], "uv_size": [3, 2]}, - "south": {"uv": [24, 9], "uv_size": [1, 2]}, - "west": {"uv": [12, 21], "uv_size": [3, 2]}, - "up": {"uv": [22, 22], "uv_size": [1, 3]}, - "down": {"uv": [7, 26], "uv_size": [1, -3]} + "north": {"uv": [12, 19], "uv_size": [1, 2]}, + "east": {"uv": [17, 15], "uv_size": [3, 2]}, + "south": {"uv": [16, 19], "uv_size": [1, 2]}, + "west": {"uv": [17, 17], "uv_size": [3, 2]}, + "up": {"uv": [14, 18], "uv_size": [1, 3]}, + "down": {"uv": [15, 21], "uv_size": [1, -3]} } } ] @@ -131,43 +131,43 @@ { "name": "bone3", "parent": "spell_turret", - "pivot": [0, 8, -5], + "pivot": [0, 8, -2.5], "rotation": [0, 0, -180], "cubes": [ { - "origin": [-0.5, 11.5, -6.5], + "origin": [-0.5, 11.5, -4], "size": [1, 2, 6], "uv": { - "north": {"uv": [14, 12], "uv_size": [1, 2]}, - "east": {"uv": [18, 18], "uv_size": [6, 2]}, - "south": {"uv": [24, 1], "uv_size": [1, 2]}, - "west": {"uv": [19, 7], "uv_size": [6, 2]}, - "up": {"uv": [5, 21], "uv_size": [1, 6]}, - "down": {"uv": [6, 27], "uv_size": [1, -6]} + "north": {"uv": [10, 19], "uv_size": [1, 2]}, + "east": {"uv": [7, 14], "uv_size": [6, 2]}, + "south": {"uv": [11, 19], "uv_size": [1, 2]}, + "west": {"uv": [14, 7], "uv_size": [6, 2]}, + "up": {"uv": [16, 13], "uv_size": [1, 6]}, + "down": {"uv": [17, 15], "uv_size": [1, -6]} } }, { - "origin": [-0.5, 11.5, -0.5], + "origin": [-0.5, 11.5, 2], "size": [1, 4, 3], "uv": { - "north": {"uv": [20, 22], "uv_size": [1, 4]}, - "east": {"uv": [7, 19], "uv_size": [3, 4]}, - "south": {"uv": [21, 22], "uv_size": [1, 4]}, - "west": {"uv": [15, 19], "uv_size": [3, 4]}, - "up": {"uv": [8, 23], "uv_size": [1, 3]}, - "down": {"uv": [9, 26], "uv_size": [1, -3]} + "north": {"uv": [18, 9], "uv_size": [1, 4]}, + "east": {"uv": [14, 9], "uv_size": [3, 4]}, + "south": {"uv": [13, 18], "uv_size": [1, 4]}, + "west": {"uv": [13, 14], "uv_size": [3, 4]}, + "up": {"uv": [7, 19], "uv_size": [1, 3]}, + "down": {"uv": [8, 22], "uv_size": [1, -3]} } }, { - "origin": [-0.5, 9.5, -7.5], + "origin": [-0.5, 9.5, -5], "size": [1, 2, 3], "uv": { - "north": {"uv": [24, 4], "uv_size": [1, 2]}, - "east": {"uv": [21, 4], "uv_size": [3, 2]}, - "south": {"uv": [24, 9], "uv_size": [1, 2]}, - "west": {"uv": [12, 21], "uv_size": [3, 2]}, - "up": {"uv": [22, 22], "uv_size": [1, 3]}, - "down": {"uv": [7, 26], "uv_size": [1, -3]} + "north": {"uv": [12, 19], "uv_size": [1, 2]}, + "east": {"uv": [17, 15], "uv_size": [3, 2]}, + "south": {"uv": [16, 19], "uv_size": [1, 2]}, + "west": {"uv": [17, 17], "uv_size": [3, 2]}, + "up": {"uv": [14, 18], "uv_size": [1, 3]}, + "down": {"uv": [15, 21], "uv_size": [1, -3]} } } ] @@ -175,86 +175,43 @@ { "name": "bone4", "parent": "spell_turret", - "pivot": [0, 8, -5], + "pivot": [0, 8, -2.5], "rotation": [0, 0, -90], "cubes": [ { - "origin": [-0.5, 11.5, -6.5], + "origin": [-0.5, 11.5, -4], "size": [1, 2, 6], "uv": { - "north": {"uv": [14, 12], "uv_size": [1, 2]}, - "east": {"uv": [18, 18], "uv_size": [6, 2]}, - "south": {"uv": [24, 1], "uv_size": [1, 2]}, - "west": {"uv": [19, 7], "uv_size": [6, 2]}, - "up": {"uv": [5, 21], "uv_size": [1, 6]}, - "down": {"uv": [6, 27], "uv_size": [1, -6]} + "north": {"uv": [10, 19], "uv_size": [1, 2]}, + "east": {"uv": [7, 14], "uv_size": [6, 2]}, + "south": {"uv": [11, 19], "uv_size": [1, 2]}, + "west": {"uv": [14, 7], "uv_size": [6, 2]}, + "up": {"uv": [16, 13], "uv_size": [1, 6]}, + "down": {"uv": [17, 15], "uv_size": [1, -6]} } }, { - "origin": [-0.5, 11.5, -0.5], + "origin": [-0.5, 11.5, 2], "size": [1, 4, 3], "uv": { - "north": {"uv": [20, 22], "uv_size": [1, 4]}, - "east": {"uv": [7, 19], "uv_size": [3, 4]}, - "south": {"uv": [21, 22], "uv_size": [1, 4]}, - "west": {"uv": [15, 19], "uv_size": [3, 4]}, - "up": {"uv": [8, 23], "uv_size": [1, 3]}, - "down": {"uv": [9, 26], "uv_size": [1, -3]} + "north": {"uv": [18, 9], "uv_size": [1, 4]}, + "east": {"uv": [14, 9], "uv_size": [3, 4]}, + "south": {"uv": [13, 18], "uv_size": [1, 4]}, + "west": {"uv": [13, 14], "uv_size": [3, 4]}, + "up": {"uv": [7, 19], "uv_size": [1, 3]}, + "down": {"uv": [8, 22], "uv_size": [1, -3]} } }, { - "origin": [-0.5, 9.5, -7.5], + "origin": [-0.5, 9.5, -5], "size": [1, 2, 3], "uv": { - "north": {"uv": [24, 4], "uv_size": [1, 2]}, - "east": {"uv": [21, 4], "uv_size": [3, 2]}, - "south": {"uv": [24, 9], "uv_size": [1, 2]}, - "west": {"uv": [12, 21], "uv_size": [3, 2]}, - "up": {"uv": [22, 22], "uv_size": [1, 3]}, - "down": {"uv": [7, 26], "uv_size": [1, -3]} - } - } - ] - }, - { - "name": "gem", - "parent": "spell_turret", - "pivot": [0, 8, 3.5], - "cubes": [ - { - "origin": [-3.5, 7.5, 3.5], - "size": [7, 1, 3], - "uv": { - "north": {"uv": [19, 11], "uv_size": [7, 1]}, - "east": {"uv": [0, 24], "uv_size": [3, 1]}, - "south": {"uv": [21, 3], "uv_size": [7, 1]}, - "west": {"uv": [24, 0], "uv_size": [3, 1]}, - "up": {"uv": [18, 12], "uv_size": [7, 3]}, - "down": {"uv": [18, 18], "uv_size": [7, -3]} - } - }, - { - "origin": [-0.5, 4.5, 3.5], - "size": [1, 7, 3], - "uv": { - "north": {"uv": [3, 21], "uv_size": [1, 7]}, - "east": {"uv": [12, 14], "uv_size": [3, 7]}, - "south": {"uv": [4, 21], "uv_size": [1, 7]}, - "west": {"uv": [15, 12], "uv_size": [3, 7]}, - "up": {"uv": [17, 23], "uv_size": [1, 3]}, - "down": {"uv": [23, 25], "uv_size": [1, -3]} - } - }, - { - "origin": [-2.5, 5.5, 5.5], - "size": [5, 5, 2], - "uv": { - "north": {"uv": [7, 14], "uv_size": [5, 5]}, - "east": {"uv": [10, 19], "uv_size": [2, 5]}, - "south": {"uv": [14, 7], "uv_size": [5, 5]}, - "west": {"uv": [18, 20], "uv_size": [2, 5]}, - "up": {"uv": [19, 9], "uv_size": [5, 2]}, - "down": {"uv": [20, 22], "uv_size": [5, -2]} + "north": {"uv": [12, 19], "uv_size": [1, 2]}, + "east": {"uv": [17, 15], "uv_size": [3, 2]}, + "south": {"uv": [16, 19], "uv_size": [1, 2]}, + "west": {"uv": [17, 17], "uv_size": [3, 2]}, + "up": {"uv": [14, 18], "uv_size": [1, 3]}, + "down": {"uv": [15, 21], "uv_size": [1, -3]} } } ] diff --git a/src/main/resources/assets/ars_nouveau/models/block/potion_melder.json b/src/main/resources/assets/ars_nouveau/models/block/potion_melder.json index fe69ce53c0..bd4f8755b4 100644 --- a/src/main/resources/assets/ars_nouveau/models/block/potion_melder.json +++ b/src/main/resources/assets/ars_nouveau/models/block/potion_melder.json @@ -1,140 +1,181 @@ { "credit": "Made with Blockbench", - "parent": "block/cube_all", + "parent": "block/cube_all", "textures": { "1": "ars_nouveau:block/potion_still", - "3": "ars_nouveau:block/potion_melder", - "particle": "ars_nouveau:block/potion_melder" + "2": "ars_nouveau:block/potion_melder", + "particle": "ars_nouveau:block/potion_still" }, "render_type": "cutout", - "elements": [ + "elements": [ { - "from": [1, 5, 1], - "to": [15, 14, 15], + "name": "liquid", + "from": [3, 14, 3], + "to": [13, 14, 13], "faces": { - "north": {"uv": [3.5, 0, 7, 2.25], "texture": "#3"}, - "east": {"uv": [3.5, 0, 7, 2.25], "texture": "#3"}, - "south": {"uv": [3.5, 0, 7, 2.25], "texture": "#3"}, - "west": {"uv": [3.5, 0, 7, 2.25], "texture": "#3"}, - "up": {"uv": [3.5, 3.5, 0, 0], "texture": "#3"}, - "down": {"uv": [3.5, 3.5, 0, 7], "texture": "#3"} + "north": {"uv": [0, 0, 1.25, 0], "texture": "#1"}, + "east": {"uv": [0, 0, 1.25, 0], "texture": "#1"}, + "south": {"uv": [0, 0, 1.25, 0], "texture": "#1"}, + "west": {"uv": [0, 0, 1.25, 0], "texture": "#1"}, + "up": {"uv": [12, 12, 2, 2], "texture": "#1", "tintindex": 0}, + "down": {"uv": [4.75, 0, 3.5, 1.25], "texture": "#1"} } }, { - "from": [0.25, 0, 7], - "to": [5.25, 5, 9], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 0, 8]}, + "from": [1, 4, 1], + "to": [15, 13, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, -1, 0]}, "faces": { - "north": {"uv": [7, 5, 8.25, 6.25], "texture": "#3"}, - "east": {"uv": [3, 7, 3.5, 8.25], "texture": "#3"}, - "south": {"uv": [7, 6.25, 8.25, 7.5], "texture": "#3"}, - "west": {"uv": [2.5, 7, 3, 8.25], "texture": "#3"}, - "up": {"uv": [7.5, 8.75, 7, 7.5], "rotation": 270, "texture": "#3"}, - "down": {"uv": [8, 7.5, 7.5, 8.75], "rotation": 90, "texture": "#3"} + "north": {"uv": [7, 0, 14, 4.5], "texture": "#2"}, + "east": {"uv": [7, 0, 14, 4.5], "texture": "#2"}, + "south": {"uv": [7, 0, 14, 4.5], "texture": "#2"}, + "west": {"uv": [7, 0, 14, 4.5], "texture": "#2"}, + "up": {"uv": [7, 7, 0, 0], "texture": "#2"}, + "down": {"uv": [7, 7, 0, 14], "texture": "#2"} } }, { - "from": [7, 0, 10.75], - "to": [9, 5, 15.75], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 0, 8]}, + "from": [3, 13, 0], + "to": [16, 15, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, "faces": { - "north": {"uv": [3, 7, 3.5, 8.25], "texture": "#3"}, - "east": {"uv": [7, 6.25, 8.25, 7.5], "texture": "#3"}, - "south": {"uv": [2.5, 7, 3, 8.25], "texture": "#3"}, - "west": {"uv": [7, 5, 8.25, 6.25], "texture": "#3"}, - "up": {"uv": [7.5, 8.75, 7, 7.5], "rotation": 180, "texture": "#3"}, - "down": {"uv": [8, 7.5, 7.5, 8.75], "rotation": 180, "texture": "#3"} + "north": {"uv": [7, 7.5, 13.5, 8.5], "texture": "#2"}, + "east": {"uv": [11, 11.5, 12.5, 12.5], "texture": "#2"}, + "south": {"uv": [7, 8.5, 13.5, 9.5], "texture": "#2"}, + "west": {"uv": [12, 9.5, 13.5, 10.5], "texture": "#2"}, + "up": {"uv": [13.5, 6, 7, 4.5], "texture": "#2"}, + "down": {"uv": [13.5, 6, 7, 7.5], "texture": "#2"} } }, { - "from": [10.75, 0, 7], - "to": [15.75, 5, 9], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 0, 8]}, + "from": [13, 13, 3], + "to": [16, 15, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, "faces": { - "north": {"uv": [7, 6.25, 8.25, 7.5], "texture": "#3"}, - "east": {"uv": [2.5, 7, 3, 8.25], "texture": "#3"}, - "south": {"uv": [7, 5, 8.25, 6.25], "texture": "#3"}, - "west": {"uv": [3, 7, 3.5, 8.25], "texture": "#3"}, - "up": {"uv": [7.5, 8.75, 7, 7.5], "rotation": 90, "texture": "#3"}, - "down": {"uv": [8, 7.5, 7.5, 8.75], "rotation": 270, "texture": "#3"} + "north": {"uv": [12, 9.5, 13.5, 10.5], "texture": "#2"}, + "east": {"uv": [7, 7.5, 13.5, 8.5], "texture": "#2"}, + "south": {"uv": [11, 11.5, 12.5, 12.5], "texture": "#2"}, + "west": {"uv": [7, 8.5, 13.5, 9.5], "texture": "#2"}, + "up": {"uv": [13.5, 6, 7, 4.5], "rotation": 90, "texture": "#2"}, + "down": {"uv": [13.5, 6, 7, 7.5], "rotation": 270, "texture": "#2"} } }, { - "from": [7, 0, 0.25], - "to": [9, 5, 5.25], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 0, 8]}, + "from": [0, 13, 13], + "to": [13, 15, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, "faces": { - "north": {"uv": [2.5, 7, 3, 8.25], "texture": "#3"}, - "east": {"uv": [7, 5, 8.25, 6.25], "texture": "#3"}, - "south": {"uv": [3, 7, 3.5, 8.25], "texture": "#3"}, - "west": {"uv": [7, 6.25, 8.25, 7.5], "texture": "#3"}, - "up": {"uv": [7.5, 8.75, 7, 7.5], "texture": "#3"}, - "down": {"uv": [8, 7.5, 7.5, 8.75], "texture": "#3"} + "north": {"uv": [7, 8.5, 13.5, 9.5], "texture": "#2"}, + "east": {"uv": [12, 9.5, 13.5, 10.5], "texture": "#2"}, + "south": {"uv": [7, 7.5, 13.5, 8.5], "texture": "#2"}, + "west": {"uv": [11, 11.5, 12.5, 12.5], "texture": "#2"}, + "up": {"uv": [13.5, 6, 7, 4.5], "rotation": 180, "texture": "#2"}, + "down": {"uv": [13.5, 6, 7, 7.5], "rotation": 180, "texture": "#2"} } }, { - "from": [3, 14, 3], - "to": [13, 14, 13], + "from": [0, 13, 0], + "to": [3, 15, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, "faces": { - "north": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, - "east": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, - "south": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, - "west": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, - "up": {"uv": [14, 14, 4, 4], "texture": "#1", "tintindex": 0}, - "down": {"uv": [9.5, 0, 7, 2.5], "texture": "#1"} + "north": {"uv": [11, 11.5, 12.5, 12.5], "texture": "#2"}, + "east": {"uv": [7, 8.5, 13.5, 9.5], "texture": "#2"}, + "south": {"uv": [12, 9.5, 13.5, 10.5], "texture": "#2"}, + "west": {"uv": [7, 7.5, 13.5, 8.5], "texture": "#2"}, + "up": {"uv": [13.5, 6, 7, 4.5], "rotation": 270, "texture": "#2"}, + "down": {"uv": [13.5, 6, 7, 7.5], "rotation": 90, "texture": "#2"} } }, { - "from": [3, 14, 0], - "to": [16, 16, 3], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 2, 8]}, + "from": [7, 0, 1], + "to": [9, 4, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, "faces": { - "north": {"uv": [7, 4, 10.25, 4.5], "texture": "#3"}, - "east": {"uv": [8, 7.5, 8.75, 8], "texture": "#3"}, - "south": {"uv": [7, 4.5, 10.25, 5], "texture": "#3"}, - "west": {"uv": [8, 8, 8.75, 8.5], "texture": "#3"}, - "up": {"uv": [10.25, 3.25, 7, 2.5], "texture": "#3"}, - "down": {"uv": [10.25, 3.25, 7, 4], "texture": "#3"} + "north": {"uv": [9, 11.5, 10, 13.5], "texture": "#2"}, + "east": {"uv": [7, 9.5, 9.5, 11.5], "texture": "#2"}, + "south": {"uv": [10, 11.5, 11, 13.5], "texture": "#2"}, + "west": {"uv": [9.5, 9.5, 12, 11.5], "texture": "#2"}, + "up": {"uv": [8, 14, 7, 11.5], "texture": "#2"}, + "down": {"uv": [9, 11.5, 8, 14], "texture": "#2"} } }, { - "from": [0, 14, 0], - "to": [3, 16, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 2, 8]}, + "from": [10, 0, 7], + "to": [15, 4, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, "faces": { - "north": {"uv": [8, 7.5, 8.75, 8], "texture": "#3"}, - "east": {"uv": [7, 4.5, 10.25, 5], "texture": "#3"}, - "south": {"uv": [8, 8, 8.75, 8.5], "texture": "#3"}, - "west": {"uv": [7, 4, 10.25, 4.5], "texture": "#3"}, - "up": {"uv": [10.25, 3.25, 7, 2.5], "rotation": 270, "texture": "#3"}, - "down": {"uv": [10.25, 3.25, 7, 4], "rotation": 90, "texture": "#3"} + "north": {"uv": [9.5, 9.5, 12, 11.5], "texture": "#2"}, + "east": {"uv": [9, 11.5, 10, 13.5], "texture": "#2"}, + "south": {"uv": [7, 9.5, 9.5, 11.5], "texture": "#2"}, + "west": {"uv": [10, 11.5, 11, 13.5], "texture": "#2"}, + "up": {"uv": [8, 14, 7, 11.5], "rotation": 90, "texture": "#2"}, + "down": {"uv": [9, 11.5, 8, 14], "rotation": 270, "texture": "#2"} } }, { - "from": [0, 14, 13], - "to": [13, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 2, 8]}, + "from": [7, 0, 10], + "to": [9, 4, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, "faces": { - "north": {"uv": [7, 4.5, 10.25, 5], "texture": "#3"}, - "east": {"uv": [8, 8, 8.75, 8.5], "texture": "#3"}, - "south": {"uv": [7, 4, 10.25, 4.5], "texture": "#3"}, - "west": {"uv": [8, 7.5, 8.75, 8], "texture": "#3"}, - "up": {"uv": [10.25, 3.25, 7, 2.5], "rotation": 180, "texture": "#3"}, - "down": {"uv": [10.25, 3.25, 7, 4], "rotation": 180, "texture": "#3"} + "north": {"uv": [10, 11.5, 11, 13.5], "texture": "#2"}, + "east": {"uv": [9.5, 9.5, 12, 11.5], "texture": "#2"}, + "south": {"uv": [9, 11.5, 10, 13.5], "texture": "#2"}, + "west": {"uv": [7, 9.5, 9.5, 11.5], "texture": "#2"}, + "up": {"uv": [8, 14, 7, 11.5], "rotation": 180, "texture": "#2"}, + "down": {"uv": [9, 11.5, 8, 14], "rotation": 180, "texture": "#2"} } }, { - "from": [13, 14, 3], - "to": [16, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 2, 8]}, + "from": [1, 0, 7], + "to": [6, 4, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, "faces": { - "north": {"uv": [8, 8, 8.75, 8.5], "texture": "#3"}, - "east": {"uv": [7, 4, 10.25, 4.5], "texture": "#3"}, - "south": {"uv": [8, 7.5, 8.75, 8], "texture": "#3"}, - "west": {"uv": [7, 4.5, 10.25, 5], "texture": "#3"}, - "up": {"uv": [10.25, 3.25, 7, 2.5], "rotation": 90, "texture": "#3"}, - "down": {"uv": [10.25, 3.25, 7, 4], "rotation": 270, "texture": "#3"} + "north": {"uv": [7, 9.5, 9.5, 11.5], "texture": "#2"}, + "east": {"uv": [10, 11.5, 11, 13.5], "texture": "#2"}, + "south": {"uv": [9.5, 9.5, 12, 11.5], "texture": "#2"}, + "west": {"uv": [9, 11.5, 10, 13.5], "texture": "#2"}, + "up": {"uv": [8, 14, 7, 11.5], "rotation": 270, "texture": "#2"}, + "down": {"uv": [9, 11.5, 8, 14], "rotation": 90, "texture": "#2"} } } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "block", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + } ] } \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/models/block/wixie_cauldron_empty.json b/src/main/resources/assets/ars_nouveau/models/block/wixie_cauldron_empty.json index 24b76092a1..a67c6309d1 100644 --- a/src/main/resources/assets/ars_nouveau/models/block/wixie_cauldron_empty.json +++ b/src/main/resources/assets/ars_nouveau/models/block/wixie_cauldron_empty.json @@ -1,759 +1,264 @@ { - "credit": "Made with Blockbench", - "parent": "block/cube_all", - "texture_size": [ - 64, - 64 - ], - "render_type": "cutout", - "textures": { - "3": "ars_nouveau:block/wixie_cauldron", - "particle": "ars_nouveau:block/wixie_cauldron" - }, - "elements": [ - { - "from": [ - 2, - 4, - 2 - ], - "to": [ - 14, - 6, - 14 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 15, - 12, - 9 - ] - }, - "faces": { - "north": {"uv": [6.25, 1, 9.25, 1.5], "texture": "#3"}, - "east": {"uv": [6.25, 1.5, 9.25, 2], "texture": "#3"}, - "south": {"uv": [6.25, 2, 9.25, 2.5], "texture": "#3"}, - "west": {"uv": [6.25, 3, 9.25, 3.5], "texture": "#3"}, + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "3": "ars_nouveau:block/wixie_cauldron", + "particle": "ars_nouveau:block/mana_still" + }, + "render_type": "cutout", + "elements": [ + { + "from": [2, 0, 2], + "to": [14, 11, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 12, 0]}, + "faces": { + "north": {"uv": [3, 0, 6, 2.75], "texture": "#3"}, + "east": {"uv": [3, 2.75, 6, 5.5], "texture": "#3"}, + "south": {"uv": [3, 5.5, 6, 8.25], "texture": "#3"}, + "west": {"uv": [0, 6, 3, 8.75], "texture": "#3"}, "up": {"uv": [3, 3, 0, 0], "texture": "#3"}, "down": {"uv": [3, 3, 0, 6], "texture": "#3"} } }, { - "from": [7, 3, 1], - "to": [9, 4, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 0]}, + "from": [9, 0, 9], + "to": [16, 8, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 12, 3]}, "faces": { - "north": {"uv": [7.25, 4.75, 7.75, 5], "texture": "#3"}, - "east": {"uv": [5.5, 6.5, 7, 6.75], "texture": "#3"}, - "south": {"uv": [7.25, 5, 7.75, 5.25], "texture": "#3"}, - "west": {"uv": [6.5, 2.5, 8, 2.75], "texture": "#3"}, - "up": {"uv": [1.5, 8, 1, 6.5], "texture": "#3"}, - "down": {"uv": [2, 6.5, 1.5, 8], "texture": "#3"} + "north": {"uv": [8, 0, 9.75, 2], "texture": "#3"}, + "east": {"uv": [8, 2, 9.75, 4], "texture": "#3"}, + "south": {"uv": [3, 8.25, 4.75, 10.25], "texture": "#3"}, + "west": {"uv": [4.75, 8.5, 6.5, 10.5], "texture": "#3"}, + "up": {"uv": [8.25, 10.25, 6.5, 8.5], "texture": "#3"}, + "down": {"uv": [10, 8.5, 8.25, 10.25], "texture": "#3"} } }, { - "from": [1, 3, 7], - "to": [15, 4, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [2, 11, 12], + "to": [12, 13, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]}, "faces": { - "north": {"uv": [6.25, 3.5, 9.75, 3.75], "texture": "#3"}, - "east": {"uv": [6, 7.25, 6.5, 7.5], "texture": "#3"}, - "south": {"uv": [6.25, 3.75, 9.75, 4], "texture": "#3"}, - "west": {"uv": [6.5, 7.25, 7, 7.5], "texture": "#3"}, - "up": {"uv": [6.5, 3, 3, 2.5], "texture": "#3"}, - "down": {"uv": [6.5, 5.5, 3, 6], "texture": "#3"} + "north": {"uv": [10, 9.5, 12.5, 10], "texture": "#3"}, + "east": {"uv": [5, 11.5, 5.5, 12], "texture": "#3"}, + "south": {"uv": [10, 10, 12.5, 10.5], "texture": "#3"}, + "west": {"uv": [9.5, 11.5, 10, 12], "texture": "#3"}, + "up": {"uv": [9, 10.75, 6.5, 10.25], "texture": "#3"}, + "down": {"uv": [5.5, 10.5, 3, 11], "texture": "#3"} } }, { - "from": [7, 3, 9], - "to": [9, 4, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [2, 11, 2], + "to": [4, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]}, "faces": { - "north": {"uv": [7, 7.25, 7.5, 7.5], "texture": "#3"}, - "east": {"uv": [2.5, 6.5, 4, 6.75], "texture": "#3"}, - "south": {"uv": [7.25, 4.5, 7.75, 4.75], "texture": "#3"}, - "west": {"uv": [4, 6.5, 5.5, 6.75], "texture": "#3"}, - "up": {"uv": [0.5, 8, 0, 6.5], "texture": "#3"}, - "down": {"uv": [1, 6.5, 0.5, 8], "texture": "#3"} + "north": {"uv": [10, 11.5, 10.5, 12], "texture": "#3"}, + "east": {"uv": [9, 10.5, 11.5, 11], "texture": "#3"}, + "south": {"uv": [10.5, 11.5, 11, 12], "texture": "#3"}, + "west": {"uv": [5.5, 10.75, 8, 11.25], "texture": "#3"}, + "up": {"uv": [0.5, 13, 0, 10.5], "texture": "#3"}, + "down": {"uv": [1, 10.5, 0.5, 13], "texture": "#3"} } }, { - "from": [7, 3, 0], - "to": [9, 6, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [4, 11, 2], + "to": [14, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]}, "faces": { - "north": {"uv": [2.5, 6.75, 3, 7.5], "texture": "#3"}, - "east": {"uv": [5.5, 6.75, 5.75, 7.5], "texture": "#3"}, - "south": {"uv": [3, 6.75, 3.5, 7.5], "texture": "#3"}, - "west": {"uv": [5.75, 6.75, 6, 7.5], "texture": "#3"}, - "up": {"uv": [7.75, 5.5, 7.25, 5.25], "texture": "#3"}, - "down": {"uv": [7.75, 5.75, 7.25, 6], "texture": "#3"} + "north": {"uv": [3, 11, 5.5, 11.5], "texture": "#3"}, + "east": {"uv": [11.5, 10.5, 12, 11], "texture": "#3"}, + "south": {"uv": [8, 11, 10.5, 11.5], "texture": "#3"}, + "west": {"uv": [11, 11.5, 11.5, 12], "texture": "#3"}, + "up": {"uv": [13, 11.5, 10.5, 11], "texture": "#3"}, + "down": {"uv": [13.75, 3.75, 11.25, 4.25], "texture": "#3"} } }, { - "from": [4, 5, 0], - "to": [7, 6, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [12, 11, 4], + "to": [14, 13, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]}, "faces": { - "north": {"uv": [6.5, 5.75, 7.25, 6], "texture": "#3"}, - "east": {"uv": [3.25, 7.75, 3.5, 8], "texture": "#3"}, - "south": {"uv": [6, 6.75, 6.75, 7], "texture": "#3"}, - "west": {"uv": [6, 7.75, 6.25, 8], "texture": "#3"}, - "up": {"uv": [7.5, 7, 6.75, 6.75], "texture": "#3"}, - "down": {"uv": [6.75, 7, 6, 7.25], "texture": "#3"} + "north": {"uv": [11.5, 11.5, 12, 12], "texture": "#3"}, + "east": {"uv": [11.25, 4.25, 13.75, 4.75], "texture": "#3"}, + "south": {"uv": [11.75, 0, 12.25, 0.5], "texture": "#3"}, + "west": {"uv": [11.25, 4.75, 13.75, 5.25], "texture": "#3"}, + "up": {"uv": [1.5, 13, 1, 10.5], "texture": "#3"}, + "down": {"uv": [2, 11.25, 1.5, 13.75], "texture": "#3"} } }, { - "from": [9, 5, 0], - "to": [12, 6, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [0, 0, 11], + "to": [7, 4, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [-2, 12, 3]}, "faces": { - "north": {"uv": [6.75, 7, 7.5, 7.25], "texture": "#3"}, - "east": {"uv": [6.25, 7.75, 6.5, 8], "texture": "#3"}, - "south": {"uv": [7, 6, 7.75, 6.25], "texture": "#3"}, - "west": {"uv": [6.5, 7.75, 6.75, 8], "texture": "#3"}, - "up": {"uv": [7.75, 6.5, 7, 6.25], "texture": "#3"}, - "down": {"uv": [7.75, 6.5, 7, 6.75], "texture": "#3"} + "north": {"uv": [9.75, 2.75, 11.5, 3.75], "texture": "#3"}, + "east": {"uv": [5.5, 11.25, 6.75, 12.25], "texture": "#3"}, + "south": {"uv": [10, 8.5, 11.75, 9.5], "texture": "#3"}, + "west": {"uv": [6.75, 11.25, 8, 12.25], "texture": "#3"}, + "up": {"uv": [11.25, 8.5, 9.5, 7.25], "texture": "#3"}, + "down": {"uv": [11.5, 1.5, 9.75, 2.75], "texture": "#3"} } }, { - "from": [4, 6, 0], - "to": [5, 9, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [7, 0, 0], + "to": [11, 5, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 12, -5]}, "faces": { - "north": {"uv": [3.5, 7.25, 3.75, 8], "texture": "#3"}, - "east": {"uv": [3.75, 7.25, 4, 8], "texture": "#3"}, - "south": {"uv": [4, 7.25, 4.25, 8], "texture": "#3"}, - "west": {"uv": [4.25, 7.25, 4.5, 8], "texture": "#3"}, - "up": {"uv": [7, 8, 6.75, 7.75], "texture": "#3"}, - "down": {"uv": [7.25, 7.75, 7, 8], "texture": "#3"} + "north": {"uv": [2, 11.25, 3, 12.5], "texture": "#3"}, + "east": {"uv": [1.75, 8.75, 3, 10], "texture": "#3"}, + "south": {"uv": [11.25, 7.25, 12.25, 8.5], "texture": "#3"}, + "west": {"uv": [1.75, 10, 3, 11.25], "texture": "#3"}, + "up": {"uv": [12.5, 2.75, 11.5, 1.5], "texture": "#3"}, + "down": {"uv": [4, 11.5, 3, 12.75], "texture": "#3"} } }, { - "from": [11, 6, 0], - "to": [12, 9, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [0, 0, 0], + "to": [7, 9, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [-2, 12, -5]}, "faces": { - "north": {"uv": [4.5, 7.25, 4.75, 8], "texture": "#3"}, - "east": {"uv": [4.75, 7.25, 5, 8], "texture": "#3"}, - "south": {"uv": [5, 7.25, 5.25, 8], "texture": "#3"}, - "west": {"uv": [5.25, 7.25, 5.5, 8], "texture": "#3"}, - "up": {"uv": [7.5, 8, 7.25, 7.75], "texture": "#3"}, - "down": {"uv": [7.75, 7.75, 7.5, 8], "texture": "#3"} + "north": {"uv": [6, 4, 7.75, 6.25], "texture": "#3"}, + "east": {"uv": [6, 6.25, 7.75, 8.5], "texture": "#3"}, + "south": {"uv": [7.75, 4, 9.5, 6.25], "texture": "#3"}, + "west": {"uv": [7.75, 6.25, 9.5, 8.5], "texture": "#3"}, + "up": {"uv": [1.75, 10.5, 0, 8.75], "texture": "#3"}, + "down": {"uv": [11.25, 4, 9.5, 5.75], "texture": "#3"} } }, { - "from": [5, 8, 0], - "to": [7, 9, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [13, 0, 5], + "to": [16, 4, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 12, -3]}, "faces": { - "north": {"uv": [2.5, 7.5, 3, 7.75], "texture": "#3"}, - "east": {"uv": [7.75, 7.75, 8, 8], "texture": "#3"}, - "south": {"uv": [3, 7.5, 3.5, 7.75], "texture": "#3"}, - "west": {"uv": [7.75, 4.5, 8, 4.75], "texture": "#3"}, - "up": {"uv": [6, 7.75, 5.5, 7.5], "texture": "#3"}, - "down": {"uv": [6.5, 7.5, 6, 7.75], "texture": "#3"} + "north": {"uv": [11.5, 5.25, 12.25, 6.25], "texture": "#3"}, + "east": {"uv": [11.5, 2.75, 12.5, 3.75], "texture": "#3"}, + "south": {"uv": [11.5, 6.25, 12.25, 7.25], "texture": "#3"}, + "west": {"uv": [4, 11.5, 5, 12.5], "texture": "#3"}, + "up": {"uv": [8.75, 12.5, 8, 11.5], "texture": "#3"}, + "down": {"uv": [9.5, 11.5, 8.75, 12.5], "texture": "#3"} } }, { - "from": [6, 7, 0], - "to": [7, 8, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [12, 5, 4], + "to": [12, 11, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [7.75, 4.75, 8, 5], "texture": "#3"}, - "east": {"uv": [7.75, 5, 8, 5.25], "texture": "#3"}, - "south": {"uv": [7.75, 5.25, 8, 5.5], "texture": "#3"}, - "west": {"uv": [7.75, 5.75, 8, 6], "texture": "#3"}, - "up": {"uv": [8, 6.25, 7.75, 6], "texture": "#3"}, - "down": {"uv": [8, 6.25, 7.75, 6.5], "texture": "#3"} + "north": {"uv": [0, 0, 0, 1.5], "texture": "#3"}, + "east": {"uv": [9.5, 5.75, 11.5, 7.25], "texture": "#3"}, + "south": {"uv": [0, 0, 0, 1.5], "texture": "#3"}, + "west": {"uv": [9.75, 0, 11.75, 1.5], "texture": "#3"}, + "up": {"uv": [0, 2, 0, 0], "texture": "#3"}, + "down": {"uv": [0, 0, 0, 2], "texture": "#3"} } }, { - "from": [9, 8, 0], - "to": [11, 9, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [4, 5, 12], + "to": [12, 11, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [6.5, 7.5, 7, 7.75], "texture": "#3"}, - "east": {"uv": [7.75, 6.5, 8, 6.75], "texture": "#3"}, - "south": {"uv": [7, 7.5, 7.5, 7.75], "texture": "#3"}, - "west": {"uv": [7.75, 7, 8, 7.25], "texture": "#3"}, - "up": {"uv": [8, 7.75, 7.5, 7.5], "texture": "#3"}, - "down": {"uv": [8, 2.75, 7.5, 3], "texture": "#3"} + "north": {"uv": [9.75, 0, 11.75, 1.5], "texture": "#3"}, + "east": {"uv": [0, 0, 0, 1.5], "texture": "#3"}, + "south": {"uv": [9.5, 5.75, 11.5, 7.25], "texture": "#3"}, + "west": {"uv": [0, 0, 0, 1.5], "texture": "#3"}, + "up": {"uv": [0, 2, 0, 0], "rotation": 90, "texture": "#3"}, + "down": {"uv": [0, 0, 0, 2], "rotation": 270, "texture": "#3"} } }, { - "from": [9, 7, 0], - "to": [10, 8, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [4, 5, 4], + "to": [4, 11, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [7.75, 7.25, 8, 7.5], "texture": "#3"}, - "east": {"uv": [0, 8, 0.25, 8.25], "texture": "#3"}, - "south": {"uv": [0.25, 8, 0.5, 8.25], "texture": "#3"}, - "west": {"uv": [0.5, 8, 0.75, 8.25], "texture": "#3"}, - "up": {"uv": [1, 8.25, 0.75, 8], "texture": "#3"}, - "down": {"uv": [1.25, 8, 1, 8.25], "texture": "#3"} + "north": {"uv": [0, 0, 0, 1.5], "texture": "#3"}, + "east": {"uv": [9.75, 0, 11.75, 1.5], "texture": "#3"}, + "south": {"uv": [0, 0, 0, 1.5], "texture": "#3"}, + "west": {"uv": [9.5, 5.75, 11.5, 7.25], "texture": "#3"}, + "up": {"uv": [0, 2, 0, 0], "rotation": 180, "texture": "#3"}, + "down": {"uv": [0, 0, 0, 2], "rotation": 180, "texture": "#3"} } }, { - "from": [6, 0, 0], - "to": [10, 1, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [4, 5, 4], + "to": [12, 11, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [6.5, 2.75, 7.5, 3], "texture": "#3"}, - "east": {"uv": [7.5, 5.5, 8, 5.75], "texture": "#3"}, - "south": {"uv": [6.5, 5.5, 7.5, 5.75], "texture": "#3"}, - "west": {"uv": [7.5, 6.75, 8, 7], "texture": "#3"}, - "up": {"uv": [7.25, 5, 6.25, 4.5], "texture": "#3"}, - "down": {"uv": [7.25, 5, 6.25, 5.5], "texture": "#3"} + "north": {"uv": [9.5, 5.75, 11.5, 7.25], "texture": "#3"}, + "east": {"uv": [0, 0, 0, 1.5], "texture": "#3"}, + "south": {"uv": [9.75, 0, 11.75, 1.5], "texture": "#3"}, + "west": {"uv": [0, 0, 0, 1.5], "texture": "#3"}, + "up": {"uv": [0, 2, 0, 0], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 0, 0, 2], "rotation": 90, "texture": "#3"} } }, { - "from": [7, 1, 1], - "to": [9, 3, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [4, 5, 4], + "to": [12, 5, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 4, 7]}, "faces": { - "north": {"uv": [3.5, 6.75, 4, 7.25], "texture": "#3"}, - "east": {"uv": [7.5, 7, 7.75, 7.5], "texture": "#3"}, - "south": {"uv": [4, 6.75, 4.5, 7.25], "texture": "#3"}, - "west": {"uv": [2.5, 7.75, 2.75, 8.25], "texture": "#3"}, - "up": {"uv": [3.25, 8, 2.75, 7.75], "texture": "#3"}, - "down": {"uv": [6, 7.75, 5.5, 8], "texture": "#3"} - } - }, - { - "from": [0, 3, 7], - "to": [1, 6, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [5.5, 6.75, 5.75, 7.5], "texture": "#3"}, - "east": {"uv": [3, 6.75, 3.5, 7.5], "texture": "#3"}, - "south": {"uv": [5.75, 6.75, 6, 7.5], "texture": "#3"}, - "west": {"uv": [2.5, 6.75, 3, 7.5], "texture": "#3"}, - "up": {"uv": [7.75, 5.5, 7.25, 5.25], "rotation": 270, "texture": "#3"}, - "down": {"uv": [7.75, 5.75, 7.25, 6], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [0, 5, 9], - "to": [1, 6, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [3.25, 7.75, 3.5, 8], "texture": "#3"}, - "east": {"uv": [6, 6.75, 6.75, 7], "texture": "#3"}, - "south": {"uv": [6, 7.75, 6.25, 8], "texture": "#3"}, - "west": {"uv": [6.5, 5.75, 7.25, 6], "texture": "#3"}, - "up": {"uv": [7.5, 7, 6.75, 6.75], "rotation": 270, "texture": "#3"}, - "down": {"uv": [6.75, 7, 6, 7.25], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [0, 5, 4], - "to": [1, 6, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [6.25, 7.75, 6.5, 8], "texture": "#3"}, - "east": {"uv": [7, 6, 7.75, 6.25], "texture": "#3"}, - "south": {"uv": [6.5, 7.75, 6.75, 8], "texture": "#3"}, - "west": {"uv": [6.75, 7, 7.5, 7.25], "texture": "#3"}, - "up": {"uv": [7.75, 6.5, 7, 6.25], "rotation": 270, "texture": "#3"}, - "down": {"uv": [7.75, 6.5, 7, 6.75], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [0, 6, 11], - "to": [1, 9, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [3.75, 7.25, 4, 8], "texture": "#3"}, - "east": {"uv": [4, 7.25, 4.25, 8], "texture": "#3"}, - "south": {"uv": [4.25, 7.25, 4.5, 8], "texture": "#3"}, - "west": {"uv": [3.5, 7.25, 3.75, 8], "texture": "#3"}, - "up": {"uv": [7, 8, 6.75, 7.75], "rotation": 270, "texture": "#3"}, - "down": {"uv": [7.25, 7.75, 7, 8], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [0, 6, 4], - "to": [1, 9, 5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [4.75, 7.25, 5, 8], "texture": "#3"}, - "east": {"uv": [5, 7.25, 5.25, 8], "texture": "#3"}, - "south": {"uv": [5.25, 7.25, 5.5, 8], "texture": "#3"}, - "west": {"uv": [4.5, 7.25, 4.75, 8], "texture": "#3"}, - "up": {"uv": [7.5, 8, 7.25, 7.75], "rotation": 270, "texture": "#3"}, - "down": {"uv": [7.75, 7.75, 7.5, 8], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [0, 8, 9], - "to": [1, 9, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.75, 7.75, 8, 8], "texture": "#3"}, - "east": {"uv": [3, 7.5, 3.5, 7.75], "texture": "#3"}, - "south": {"uv": [7.75, 4.5, 8, 4.75], "texture": "#3"}, - "west": {"uv": [2.5, 7.5, 3, 7.75], "texture": "#3"}, - "up": {"uv": [6, 7.75, 5.5, 7.5], "rotation": 270, "texture": "#3"}, - "down": {"uv": [6.5, 7.5, 6, 7.75], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [0, 7, 9], - "to": [1, 8, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.75, 5, 8, 5.25], "texture": "#3"}, - "east": {"uv": [7.75, 5.25, 8, 5.5], "texture": "#3"}, - "south": {"uv": [7.75, 5.75, 8, 6], "texture": "#3"}, - "west": {"uv": [7.75, 4.75, 8, 5], "texture": "#3"}, - "up": {"uv": [8, 6.25, 7.75, 6], "rotation": 270, "texture": "#3"}, - "down": {"uv": [8, 6.25, 7.75, 6.5], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [0, 8, 5], - "to": [1, 9, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.75, 6.5, 8, 6.75], "texture": "#3"}, - "east": {"uv": [7, 7.5, 7.5, 7.75], "texture": "#3"}, - "south": {"uv": [7.75, 7, 8, 7.25], "texture": "#3"}, - "west": {"uv": [6.5, 7.5, 7, 7.75], "texture": "#3"}, - "up": {"uv": [8, 7.75, 7.5, 7.5], "rotation": 270, "texture": "#3"}, - "down": {"uv": [8, 2.75, 7.5, 3], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [0, 7, 6], - "to": [1, 8, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [0, 8, 0.25, 8.25], "texture": "#3"}, - "east": {"uv": [0.25, 8, 0.5, 8.25], "texture": "#3"}, - "south": {"uv": [0.5, 8, 0.75, 8.25], "texture": "#3"}, - "west": {"uv": [7.75, 7.25, 8, 7.5], "texture": "#3"}, - "up": {"uv": [1, 8.25, 0.75, 8], "rotation": 270, "texture": "#3"}, - "down": {"uv": [1.25, 8, 1, 8.25], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [0, 0, 6], - "to": [2, 1, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.5, 5.5, 8, 5.75], "texture": "#3"}, - "east": {"uv": [6.5, 5.5, 7.5, 5.75], "texture": "#3"}, - "south": {"uv": [7.5, 6.75, 8, 7], "texture": "#3"}, - "west": {"uv": [6.5, 2.75, 7.5, 3], "texture": "#3"}, - "up": {"uv": [7.25, 5, 6.25, 4.5], "rotation": 270, "texture": "#3"}, - "down": {"uv": [7.25, 5, 6.25, 5.5], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [1, 1, 7], - "to": [2, 3, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.5, 7, 7.75, 7.5], "texture": "#3"}, - "east": {"uv": [4, 6.75, 4.5, 7.25], "texture": "#3"}, - "south": {"uv": [2.5, 7.75, 2.75, 8.25], "texture": "#3"}, - "west": {"uv": [3.5, 6.75, 4, 7.25], "texture": "#3"}, - "up": {"uv": [3.25, 8, 2.75, 7.75], "rotation": 270, "texture": "#3"}, - "down": {"uv": [6, 7.75, 5.5, 8], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [7, 3, 15], - "to": [9, 6, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [3, 6.75, 3.5, 7.5], "texture": "#3"}, - "east": {"uv": [5.75, 6.75, 6, 7.5], "texture": "#3"}, - "south": {"uv": [2.5, 6.75, 3, 7.5], "texture": "#3"}, - "west": {"uv": [5.5, 6.75, 5.75, 7.5], "texture": "#3"}, - "up": {"uv": [7.75, 5.5, 7.25, 5.25], "rotation": 180, "texture": "#3"}, - "down": {"uv": [7.75, 5.75, 7.25, 6], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [9, 5, 15], - "to": [12, 6, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [6, 6.75, 6.75, 7], "texture": "#3"}, - "east": {"uv": [6, 7.75, 6.25, 8], "texture": "#3"}, - "south": {"uv": [6.5, 5.75, 7.25, 6], "texture": "#3"}, - "west": {"uv": [3.25, 7.75, 3.5, 8], "texture": "#3"}, - "up": {"uv": [7.5, 7, 6.75, 6.75], "rotation": 180, "texture": "#3"}, - "down": {"uv": [6.75, 7, 6, 7.25], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [4, 5, 15], - "to": [7, 6, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7, 6, 7.75, 6.25], "texture": "#3"}, - "east": {"uv": [6.5, 7.75, 6.75, 8], "texture": "#3"}, - "south": {"uv": [6.75, 7, 7.5, 7.25], "texture": "#3"}, - "west": {"uv": [6.25, 7.75, 6.5, 8], "texture": "#3"}, - "up": {"uv": [7.75, 6.5, 7, 6.25], "rotation": 180, "texture": "#3"}, - "down": {"uv": [7.75, 6.5, 7, 6.75], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [11, 6, 15], - "to": [12, 9, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [4, 7.25, 4.25, 8], "texture": "#3"}, - "east": {"uv": [4.25, 7.25, 4.5, 8], "texture": "#3"}, - "south": {"uv": [3.5, 7.25, 3.75, 8], "texture": "#3"}, - "west": {"uv": [3.75, 7.25, 4, 8], "texture": "#3"}, - "up": {"uv": [7, 8, 6.75, 7.75], "rotation": 180, "texture": "#3"}, - "down": {"uv": [7.25, 7.75, 7, 8], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [4, 6, 15], - "to": [5, 9, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [5, 7.25, 5.25, 8], "texture": "#3"}, - "east": {"uv": [5.25, 7.25, 5.5, 8], "texture": "#3"}, - "south": {"uv": [4.5, 7.25, 4.75, 8], "texture": "#3"}, - "west": {"uv": [4.75, 7.25, 5, 8], "texture": "#3"}, - "up": {"uv": [7.5, 8, 7.25, 7.75], "rotation": 180, "texture": "#3"}, - "down": {"uv": [7.75, 7.75, 7.5, 8], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [9, 8, 15], - "to": [11, 9, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [3, 7.5, 3.5, 7.75], "texture": "#3"}, - "east": {"uv": [7.75, 4.5, 8, 4.75], "texture": "#3"}, - "south": {"uv": [2.5, 7.5, 3, 7.75], "texture": "#3"}, - "west": {"uv": [7.75, 7.75, 8, 8], "texture": "#3"}, - "up": {"uv": [6, 7.75, 5.5, 7.5], "rotation": 180, "texture": "#3"}, - "down": {"uv": [6.5, 7.5, 6, 7.75], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [9, 7, 15], - "to": [10, 8, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.75, 5.25, 8, 5.5], "texture": "#3"}, - "east": {"uv": [7.75, 5.75, 8, 6], "texture": "#3"}, - "south": {"uv": [7.75, 4.75, 8, 5], "texture": "#3"}, - "west": {"uv": [7.75, 5, 8, 5.25], "texture": "#3"}, - "up": {"uv": [8, 6.25, 7.75, 6], "rotation": 180, "texture": "#3"}, - "down": {"uv": [8, 6.25, 7.75, 6.5], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [5, 8, 15], - "to": [7, 9, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7, 7.5, 7.5, 7.75], "texture": "#3"}, - "east": {"uv": [7.75, 7, 8, 7.25], "texture": "#3"}, - "south": {"uv": [6.5, 7.5, 7, 7.75], "texture": "#3"}, - "west": {"uv": [7.75, 6.5, 8, 6.75], "texture": "#3"}, - "up": {"uv": [8, 7.75, 7.5, 7.5], "rotation": 180, "texture": "#3"}, - "down": {"uv": [8, 2.75, 7.5, 3], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [6, 7, 15], - "to": [7, 8, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [0.25, 8, 0.5, 8.25], "texture": "#3"}, - "east": {"uv": [0.5, 8, 0.75, 8.25], "texture": "#3"}, - "south": {"uv": [7.75, 7.25, 8, 7.5], "texture": "#3"}, - "west": {"uv": [0, 8, 0.25, 8.25], "texture": "#3"}, - "up": {"uv": [1, 8.25, 0.75, 8], "rotation": 180, "texture": "#3"}, - "down": {"uv": [1.25, 8, 1, 8.25], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [6, 0, 14], - "to": [10, 1, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [6.5, 5.5, 7.5, 5.75], "texture": "#3"}, - "east": {"uv": [7.5, 6.75, 8, 7], "texture": "#3"}, - "south": {"uv": [6.5, 2.75, 7.5, 3], "texture": "#3"}, - "west": {"uv": [7.5, 5.5, 8, 5.75], "texture": "#3"}, - "up": {"uv": [7.25, 5, 6.25, 4.5], "rotation": 180, "texture": "#3"}, - "down": {"uv": [7.25, 5, 6.25, 5.5], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [7, 1, 14], - "to": [9, 3, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [4, 6.75, 4.5, 7.25], "texture": "#3"}, - "east": {"uv": [2.5, 7.75, 2.75, 8.25], "texture": "#3"}, - "south": {"uv": [3.5, 6.75, 4, 7.25], "texture": "#3"}, - "west": {"uv": [7.5, 7, 7.75, 7.5], "texture": "#3"}, - "up": {"uv": [3.25, 8, 2.75, 7.75], "rotation": 180, "texture": "#3"}, - "down": {"uv": [6, 7.75, 5.5, 8], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [15, 3, 7], - "to": [16, 6, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [5.75, 6.75, 6, 7.5], "texture": "#3"}, - "east": {"uv": [2.5, 6.75, 3, 7.5], "texture": "#3"}, - "south": {"uv": [5.5, 6.75, 5.75, 7.5], "texture": "#3"}, - "west": {"uv": [3, 6.75, 3.5, 7.5], "texture": "#3"}, - "up": {"uv": [7.75, 5.5, 7.25, 5.25], "rotation": 90, "texture": "#3"}, - "down": {"uv": [7.75, 5.75, 7.25, 6], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [15, 5, 4], - "to": [16, 6, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [6, 7.75, 6.25, 8], "texture": "#3"}, - "east": {"uv": [6.5, 5.75, 7.25, 6], "texture": "#3"}, - "south": {"uv": [3.25, 7.75, 3.5, 8], "texture": "#3"}, - "west": {"uv": [6, 6.75, 6.75, 7], "texture": "#3"}, - "up": {"uv": [7.5, 7, 6.75, 6.75], "rotation": 90, "texture": "#3"}, - "down": {"uv": [6.75, 7, 6, 7.25], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [15, 5, 9], - "to": [16, 6, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [6.5, 7.75, 6.75, 8], "texture": "#3"}, - "east": {"uv": [6.75, 7, 7.5, 7.25], "texture": "#3"}, - "south": {"uv": [6.25, 7.75, 6.5, 8], "texture": "#3"}, - "west": {"uv": [7, 6, 7.75, 6.25], "texture": "#3"}, - "up": {"uv": [7.75, 6.5, 7, 6.25], "rotation": 90, "texture": "#3"}, - "down": {"uv": [7.75, 6.5, 7, 6.75], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [15, 6, 4], - "to": [16, 9, 5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [4.25, 7.25, 4.5, 8], "texture": "#3"}, - "east": {"uv": [3.5, 7.25, 3.75, 8], "texture": "#3"}, - "south": {"uv": [3.75, 7.25, 4, 8], "texture": "#3"}, - "west": {"uv": [4, 7.25, 4.25, 8], "texture": "#3"}, - "up": {"uv": [7, 8, 6.75, 7.75], "rotation": 90, "texture": "#3"}, - "down": {"uv": [7.25, 7.75, 7, 8], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [15, 6, 11], - "to": [16, 9, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [5.25, 7.25, 5.5, 8], "texture": "#3"}, - "east": {"uv": [4.5, 7.25, 4.75, 8], "texture": "#3"}, - "south": {"uv": [4.75, 7.25, 5, 8], "texture": "#3"}, - "west": {"uv": [5, 7.25, 5.25, 8], "texture": "#3"}, - "up": {"uv": [7.5, 8, 7.25, 7.75], "rotation": 90, "texture": "#3"}, - "down": {"uv": [7.75, 7.75, 7.5, 8], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [15, 8, 5], - "to": [16, 9, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.75, 4.5, 8, 4.75], "texture": "#3"}, - "east": {"uv": [2.5, 7.5, 3, 7.75], "texture": "#3"}, - "south": {"uv": [7.75, 7.75, 8, 8], "texture": "#3"}, - "west": {"uv": [3, 7.5, 3.5, 7.75], "texture": "#3"}, - "up": {"uv": [6, 7.75, 5.5, 7.5], "rotation": 90, "texture": "#3"}, - "down": {"uv": [6.5, 7.5, 6, 7.75], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [15, 7, 6], - "to": [16, 8, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.75, 5.75, 8, 6], "texture": "#3"}, - "east": {"uv": [7.75, 4.75, 8, 5], "texture": "#3"}, - "south": {"uv": [7.75, 5, 8, 5.25], "texture": "#3"}, - "west": {"uv": [7.75, 5.25, 8, 5.5], "texture": "#3"}, - "up": {"uv": [8, 6.25, 7.75, 6], "rotation": 90, "texture": "#3"}, - "down": {"uv": [8, 6.25, 7.75, 6.5], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [15, 8, 9], - "to": [16, 9, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.75, 7, 8, 7.25], "texture": "#3"}, - "east": {"uv": [6.5, 7.5, 7, 7.75], "texture": "#3"}, - "south": {"uv": [7.75, 6.5, 8, 6.75], "texture": "#3"}, - "west": {"uv": [7, 7.5, 7.5, 7.75], "texture": "#3"}, - "up": {"uv": [8, 7.75, 7.5, 7.5], "rotation": 90, "texture": "#3"}, - "down": {"uv": [8, 2.75, 7.5, 3], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [15, 7, 9], - "to": [16, 8, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [0.5, 8, 0.75, 8.25], "texture": "#3"}, - "east": {"uv": [7.75, 7.25, 8, 7.5], "texture": "#3"}, - "south": {"uv": [0, 8, 0.25, 8.25], "texture": "#3"}, - "west": {"uv": [0.25, 8, 0.5, 8.25], "texture": "#3"}, - "up": {"uv": [1, 8.25, 0.75, 8], "rotation": 90, "texture": "#3"}, - "down": {"uv": [1.25, 8, 1, 8.25], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [14, 0, 6], - "to": [16, 1, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.5, 6.75, 8, 7], "texture": "#3"}, - "east": {"uv": [6.5, 2.75, 7.5, 3], "texture": "#3"}, - "south": {"uv": [7.5, 5.5, 8, 5.75], "texture": "#3"}, - "west": {"uv": [6.5, 5.5, 7.5, 5.75], "texture": "#3"}, - "up": {"uv": [7.25, 5, 6.25, 4.5], "rotation": 90, "texture": "#3"}, - "down": {"uv": [7.25, 5, 6.25, 5.5], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [14, 1, 7], - "to": [15, 3, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [2.5, 7.75, 2.75, 8.25], "texture": "#3"}, - "east": {"uv": [3.5, 6.75, 4, 7.25], "texture": "#3"}, - "south": {"uv": [7.5, 7, 7.75, 7.5], "texture": "#3"}, - "west": {"uv": [4, 6.75, 4.5, 7.25], "texture": "#3"}, - "up": {"uv": [3.25, 8, 2.75, 7.75], "rotation": 90, "texture": "#3"}, - "down": {"uv": [6, 7.75, 5.5, 8], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [1, 4, 1], - "to": [14, 14, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, - "faces": { - "north": {"uv": [3, 3, 6.25, 5.5], "texture": "#3"}, - "east": {"uv": [2, 6.5, 2.25, 9], "texture": "#3"}, - "south": {"uv": [3, 0, 6.25, 2.5], "texture": "#3"}, - "west": {"uv": [2.25, 6.5, 2.5, 9], "texture": "#3"}, - "up": {"uv": [9.5, 4.25, 6.25, 4], "texture": "#3"}, - "down": {"uv": [9.5, 4.25, 6.25, 4.5], "texture": "#3"} - } - }, - { - "from": [0, 14, 0], - "to": [14, 16, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, - "faces": { - "north": {"uv": [0, 6, 3.5, 6.5], "texture": "#3"}, - "east": {"uv": [4.5, 6.75, 5, 7.25], "texture": "#3"}, - "south": {"uv": [3.5, 6, 7, 6.5], "texture": "#3"}, - "west": {"uv": [5, 6.75, 5.5, 7.25], "texture": "#3"}, - "up": {"uv": [9.75, 0.5, 6.25, 0], "texture": "#3"}, - "down": {"uv": [9.75, 0.5, 6.25, 1], "texture": "#3"} - } - }, - { - "from": [1, 4, 2], - "to": [2, 14, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, - "faces": { - "north": {"uv": [2, 6.5, 2.25, 9], "texture": "#3"}, - "east": {"uv": [3, 0, 6.25, 2.5], "texture": "#3"}, - "south": {"uv": [2.25, 6.5, 2.5, 9], "texture": "#3"}, - "west": {"uv": [3, 3, 6.25, 5.5], "texture": "#3"}, - "up": {"uv": [9.5, 4.25, 6.25, 4], "rotation": 270, "texture": "#3"}, - "down": {"uv": [9.5, 4.25, 6.25, 4.5], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [0, 14, 2], - "to": [2, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, - "faces": { - "north": {"uv": [4.5, 6.75, 5, 7.25], "texture": "#3"}, - "east": {"uv": [3.5, 6, 7, 6.5], "texture": "#3"}, - "south": {"uv": [5, 6.75, 5.5, 7.25], "texture": "#3"}, - "west": {"uv": [0, 6, 3.5, 6.5], "texture": "#3"}, - "up": {"uv": [9.75, 0.5, 6.25, 0], "rotation": 270, "texture": "#3"}, - "down": {"uv": [9.75, 0.5, 6.25, 1], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [2, 4, 14], - "to": [15, 14, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, - "faces": { - "north": {"uv": [3, 0, 6.25, 2.5], "texture": "#3"}, - "east": {"uv": [2.25, 6.5, 2.5, 9], "texture": "#3"}, - "south": {"uv": [3, 3, 6.25, 5.5], "texture": "#3"}, - "west": {"uv": [2, 6.5, 2.25, 9], "texture": "#3"}, - "up": {"uv": [9.5, 4.25, 6.25, 4], "rotation": 180, "texture": "#3"}, - "down": {"uv": [9.5, 4.25, 6.25, 4.5], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [2, 14, 14], - "to": [16, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, - "faces": { - "north": {"uv": [3.5, 6, 7, 6.5], "texture": "#3"}, - "east": {"uv": [5, 6.75, 5.5, 7.25], "texture": "#3"}, - "south": {"uv": [0, 6, 3.5, 6.5], "texture": "#3"}, - "west": {"uv": [4.5, 6.75, 5, 7.25], "texture": "#3"}, - "up": {"uv": [9.75, 0.5, 6.25, 0], "rotation": 180, "texture": "#3"}, - "down": {"uv": [9.75, 0.5, 6.25, 1], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [14, 4, 1], - "to": [15, 14, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, - "faces": { - "north": {"uv": [2.25, 6.5, 2.5, 9], "texture": "#3"}, - "east": {"uv": [3, 3, 6.25, 5.5], "texture": "#3"}, - "south": {"uv": [2, 6.5, 2.25, 9], "texture": "#3"}, - "west": {"uv": [3, 0, 6.25, 2.5], "texture": "#3"}, - "up": {"uv": [9.5, 4.25, 6.25, 4], "rotation": 90, "texture": "#3"}, - "down": {"uv": [9.5, 4.25, 6.25, 4.5], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [14, 14, 0], - "to": [16, 16, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, - "faces": { - "north": {"uv": [5, 6.75, 5.5, 7.25], "texture": "#3"}, - "east": {"uv": [0, 6, 3.5, 6.5], "texture": "#3"}, - "south": {"uv": [4.5, 6.75, 5, 7.25], "texture": "#3"}, - "west": {"uv": [3.5, 6, 7, 6.5], "texture": "#3"}, - "up": {"uv": [9.75, 0.5, 6.25, 0], "rotation": 90, "texture": "#3"}, - "down": {"uv": [9.75, 0.5, 6.25, 1], "rotation": 270, "texture": "#3"} + "north": {"uv": [0, 0, 2, 0], "texture": "#3"}, + "east": {"uv": [0, 0, 2, 0], "texture": "#3"}, + "south": {"uv": [0, 0, 2, 0], "texture": "#3"}, + "west": {"uv": [0, 0, 2, 0], "texture": "#3"}, + "up": {"uv": [8, 2, 6, 0], "texture": "#3"}, + "down": {"uv": [8, 2, 6, 4], "texture": "#3"} } } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "VoxelShapes", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "cauldron", + "origin": [6, 12, -3], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] + }, + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [] + }, + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [] + } + ] + } ] } \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/models/block/wixie_cauldron_full.json b/src/main/resources/assets/ars_nouveau/models/block/wixie_cauldron_full.json index 542ccc7cb0..e09746b8cf 100644 --- a/src/main/resources/assets/ars_nouveau/models/block/wixie_cauldron_full.json +++ b/src/main/resources/assets/ars_nouveau/models/block/wixie_cauldron_full.json @@ -1,773 +1,285 @@ { - "credit": "Made with Blockbench", - "texture_size": [ - 64, - 64 - ], - "render_type": "cutout", - "textures": { - "2": "ars_nouveau:block/mana_still", - "3": "ars_nouveau:block/wixie_cauldron", - "particle": "ars_nouveau:block/wixie_cauldron" - }, - "elements": [ - { - "from": [ - 2, - 4, - 2 - ], - "to": [ - 14, - 6, - 14 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 15, - 12, - 9 - ] - }, - "faces": { - "north": {"uv": [6.25, 1, 9.25, 1.5], "texture": "#3"}, - "east": {"uv": [6.25, 1.5, 9.25, 2], "texture": "#3"}, - "south": {"uv": [6.25, 2, 9.25, 2.5], "texture": "#3"}, - "west": {"uv": [6.25, 3, 9.25, 3.5], "texture": "#3"}, + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "2": "ars_nouveau:block/mana_still", + "3": "ars_nouveau:block/wixie_cauldron", + "particle": "ars_nouveau:block/mana_still" + }, + "render_type": "cutout", + "elements": [ + { + "from": [2, 0, 2], + "to": [14, 11, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 12, 0]}, + "faces": { + "north": {"uv": [3, 0, 6, 2.75], "texture": "#3"}, + "east": {"uv": [3, 2.75, 6, 5.5], "texture": "#3"}, + "south": {"uv": [3, 5.5, 6, 8.25], "texture": "#3"}, + "west": {"uv": [0, 6, 3, 8.75], "texture": "#3"}, "up": {"uv": [3, 3, 0, 0], "texture": "#3"}, "down": {"uv": [3, 3, 0, 6], "texture": "#3"} } }, { - "from": [7, 3, 1], - "to": [9, 4, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 0]}, - "faces": { - "north": {"uv": [7.25, 4.75, 7.75, 5], "texture": "#3"}, - "east": {"uv": [5.5, 6.5, 7, 6.75], "texture": "#3"}, - "south": {"uv": [7.25, 5, 7.75, 5.25], "texture": "#3"}, - "west": {"uv": [6.5, 2.5, 8, 2.75], "texture": "#3"}, - "up": {"uv": [1.5, 8, 1, 6.5], "texture": "#3"}, - "down": {"uv": [2, 6.5, 1.5, 8], "texture": "#3"} - } - }, - { - "from": [1, 3, 7], - "to": [15, 4, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [6.25, 3.5, 9.75, 3.75], "texture": "#3"}, - "east": {"uv": [6, 7.25, 6.5, 7.5], "texture": "#3"}, - "south": {"uv": [6.25, 3.75, 9.75, 4], "texture": "#3"}, - "west": {"uv": [6.5, 7.25, 7, 7.5], "texture": "#3"}, - "up": {"uv": [6.5, 3, 3, 2.5], "texture": "#3"}, - "down": {"uv": [6.5, 5.5, 3, 6], "texture": "#3"} - } - }, - { - "from": [7, 3, 9], - "to": [9, 4, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7, 7.25, 7.5, 7.5], "texture": "#3"}, - "east": {"uv": [2.5, 6.5, 4, 6.75], "texture": "#3"}, - "south": {"uv": [7.25, 4.5, 7.75, 4.75], "texture": "#3"}, - "west": {"uv": [4, 6.5, 5.5, 6.75], "texture": "#3"}, - "up": {"uv": [0.5, 8, 0, 6.5], "texture": "#3"}, - "down": {"uv": [1, 6.5, 0.5, 8], "texture": "#3"} - } - }, - { - "name": "mana", - "from": [2, 13.5, 2], - "to": [14, 14.5, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 21.5, 12]}, - "faces": { - "north": {"uv": [0, 0, 3, 0.25], "texture": "#2"}, - "east": {"uv": [0, 0, 3, 0.25], "texture": "#2"}, - "south": {"uv": [0, 0, 3, 0.25], "texture": "#2"}, - "west": {"uv": [0, 0, 3, 0.25], "texture": "#2"}, - "up": {"uv": [2, 3, 14, 15], "texture": "#2"}, - "down": {"uv": [0, 0, 3, 3], "texture": "#2"} - } - }, - { - "from": [7, 3, 0], - "to": [9, 6, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [2.5, 6.75, 3, 7.5], "texture": "#3"}, - "east": {"uv": [5.5, 6.75, 5.75, 7.5], "texture": "#3"}, - "south": {"uv": [3, 6.75, 3.5, 7.5], "texture": "#3"}, - "west": {"uv": [5.75, 6.75, 6, 7.5], "texture": "#3"}, - "up": {"uv": [7.75, 5.5, 7.25, 5.25], "texture": "#3"}, - "down": {"uv": [7.75, 5.75, 7.25, 6], "texture": "#3"} - } - }, - { - "from": [4, 5, 0], - "to": [7, 6, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [6.5, 5.75, 7.25, 6], "texture": "#3"}, - "east": {"uv": [3.25, 7.75, 3.5, 8], "texture": "#3"}, - "south": {"uv": [6, 6.75, 6.75, 7], "texture": "#3"}, - "west": {"uv": [6, 7.75, 6.25, 8], "texture": "#3"}, - "up": {"uv": [7.5, 7, 6.75, 6.75], "texture": "#3"}, - "down": {"uv": [6.75, 7, 6, 7.25], "texture": "#3"} - } - }, - { - "from": [9, 5, 0], - "to": [12, 6, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [6.75, 7, 7.5, 7.25], "texture": "#3"}, - "east": {"uv": [6.25, 7.75, 6.5, 8], "texture": "#3"}, - "south": {"uv": [7, 6, 7.75, 6.25], "texture": "#3"}, - "west": {"uv": [6.5, 7.75, 6.75, 8], "texture": "#3"}, - "up": {"uv": [7.75, 6.5, 7, 6.25], "texture": "#3"}, - "down": {"uv": [7.75, 6.5, 7, 6.75], "texture": "#3"} - } - }, - { - "from": [4, 6, 0], - "to": [5, 9, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [3.5, 7.25, 3.75, 8], "texture": "#3"}, - "east": {"uv": [3.75, 7.25, 4, 8], "texture": "#3"}, - "south": {"uv": [4, 7.25, 4.25, 8], "texture": "#3"}, - "west": {"uv": [4.25, 7.25, 4.5, 8], "texture": "#3"}, - "up": {"uv": [7, 8, 6.75, 7.75], "texture": "#3"}, - "down": {"uv": [7.25, 7.75, 7, 8], "texture": "#3"} - } - }, - { - "from": [11, 6, 0], - "to": [12, 9, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [4.5, 7.25, 4.75, 8], "texture": "#3"}, - "east": {"uv": [4.75, 7.25, 5, 8], "texture": "#3"}, - "south": {"uv": [5, 7.25, 5.25, 8], "texture": "#3"}, - "west": {"uv": [5.25, 7.25, 5.5, 8], "texture": "#3"}, - "up": {"uv": [7.5, 8, 7.25, 7.75], "texture": "#3"}, - "down": {"uv": [7.75, 7.75, 7.5, 8], "texture": "#3"} - } - }, - { - "from": [5, 8, 0], - "to": [7, 9, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [2.5, 7.5, 3, 7.75], "texture": "#3"}, - "east": {"uv": [7.75, 7.75, 8, 8], "texture": "#3"}, - "south": {"uv": [3, 7.5, 3.5, 7.75], "texture": "#3"}, - "west": {"uv": [7.75, 4.5, 8, 4.75], "texture": "#3"}, - "up": {"uv": [6, 7.75, 5.5, 7.5], "texture": "#3"}, - "down": {"uv": [6.5, 7.5, 6, 7.75], "texture": "#3"} - } - }, - { - "from": [6, 7, 0], - "to": [7, 8, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.75, 4.75, 8, 5], "texture": "#3"}, - "east": {"uv": [7.75, 5, 8, 5.25], "texture": "#3"}, - "south": {"uv": [7.75, 5.25, 8, 5.5], "texture": "#3"}, - "west": {"uv": [7.75, 5.75, 8, 6], "texture": "#3"}, - "up": {"uv": [8, 6.25, 7.75, 6], "texture": "#3"}, - "down": {"uv": [8, 6.25, 7.75, 6.5], "texture": "#3"} - } - }, - { - "from": [9, 8, 0], - "to": [11, 9, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [6.5, 7.5, 7, 7.75], "texture": "#3"}, - "east": {"uv": [7.75, 6.5, 8, 6.75], "texture": "#3"}, - "south": {"uv": [7, 7.5, 7.5, 7.75], "texture": "#3"}, - "west": {"uv": [7.75, 7, 8, 7.25], "texture": "#3"}, - "up": {"uv": [8, 7.75, 7.5, 7.5], "texture": "#3"}, - "down": {"uv": [8, 2.75, 7.5, 3], "texture": "#3"} - } - }, - { - "from": [9, 7, 0], - "to": [10, 8, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.75, 7.25, 8, 7.5], "texture": "#3"}, - "east": {"uv": [0, 8, 0.25, 8.25], "texture": "#3"}, - "south": {"uv": [0.25, 8, 0.5, 8.25], "texture": "#3"}, - "west": {"uv": [0.5, 8, 0.75, 8.25], "texture": "#3"}, - "up": {"uv": [1, 8.25, 0.75, 8], "texture": "#3"}, - "down": {"uv": [1.25, 8, 1, 8.25], "texture": "#3"} - } - }, - { - "from": [6, 0, 0], - "to": [10, 1, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [6.5, 2.75, 7.5, 3], "texture": "#3"}, - "east": {"uv": [7.5, 5.5, 8, 5.75], "texture": "#3"}, - "south": {"uv": [6.5, 5.5, 7.5, 5.75], "texture": "#3"}, - "west": {"uv": [7.5, 6.75, 8, 7], "texture": "#3"}, - "up": {"uv": [7.25, 5, 6.25, 4.5], "texture": "#3"}, - "down": {"uv": [7.25, 5, 6.25, 5.5], "texture": "#3"} - } - }, - { - "from": [7, 1, 1], - "to": [9, 3, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [3.5, 6.75, 4, 7.25], "texture": "#3"}, - "east": {"uv": [7.5, 7, 7.75, 7.5], "texture": "#3"}, - "south": {"uv": [4, 6.75, 4.5, 7.25], "texture": "#3"}, - "west": {"uv": [2.5, 7.75, 2.75, 8.25], "texture": "#3"}, - "up": {"uv": [3.25, 8, 2.75, 7.75], "texture": "#3"}, - "down": {"uv": [6, 7.75, 5.5, 8], "texture": "#3"} - } - }, - { - "from": [0, 3, 7], - "to": [1, 6, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [5.5, 6.75, 5.75, 7.5], "texture": "#3"}, - "east": {"uv": [3, 6.75, 3.5, 7.5], "texture": "#3"}, - "south": {"uv": [5.75, 6.75, 6, 7.5], "texture": "#3"}, - "west": {"uv": [2.5, 6.75, 3, 7.5], "texture": "#3"}, - "up": {"uv": [7.75, 5.5, 7.25, 5.25], "rotation": 270, "texture": "#3"}, - "down": {"uv": [7.75, 5.75, 7.25, 6], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [0, 5, 9], - "to": [1, 6, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [3.25, 7.75, 3.5, 8], "texture": "#3"}, - "east": {"uv": [6, 6.75, 6.75, 7], "texture": "#3"}, - "south": {"uv": [6, 7.75, 6.25, 8], "texture": "#3"}, - "west": {"uv": [6.5, 5.75, 7.25, 6], "texture": "#3"}, - "up": {"uv": [7.5, 7, 6.75, 6.75], "rotation": 270, "texture": "#3"}, - "down": {"uv": [6.75, 7, 6, 7.25], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [0, 5, 4], - "to": [1, 6, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [9, 0, 9], + "to": [16, 8, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 12, 3]}, "faces": { - "north": {"uv": [6.25, 7.75, 6.5, 8], "texture": "#3"}, - "east": {"uv": [7, 6, 7.75, 6.25], "texture": "#3"}, - "south": {"uv": [6.5, 7.75, 6.75, 8], "texture": "#3"}, - "west": {"uv": [6.75, 7, 7.5, 7.25], "texture": "#3"}, - "up": {"uv": [7.75, 6.5, 7, 6.25], "rotation": 270, "texture": "#3"}, - "down": {"uv": [7.75, 6.5, 7, 6.75], "rotation": 90, "texture": "#3"} + "north": {"uv": [8, 0, 9.75, 2], "texture": "#3"}, + "east": {"uv": [8, 2, 9.75, 4], "texture": "#3"}, + "south": {"uv": [3, 8.25, 4.75, 10.25], "texture": "#3"}, + "west": {"uv": [4.75, 8.5, 6.5, 10.5], "texture": "#3"}, + "up": {"uv": [8.25, 10.25, 6.5, 8.5], "texture": "#3"}, + "down": {"uv": [10, 8.5, 8.25, 10.25], "texture": "#3"} } }, { - "from": [0, 6, 11], - "to": [1, 9, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [2, 11, 12], + "to": [12, 13, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]}, "faces": { - "north": {"uv": [3.75, 7.25, 4, 8], "texture": "#3"}, - "east": {"uv": [4, 7.25, 4.25, 8], "texture": "#3"}, - "south": {"uv": [4.25, 7.25, 4.5, 8], "texture": "#3"}, - "west": {"uv": [3.5, 7.25, 3.75, 8], "texture": "#3"}, - "up": {"uv": [7, 8, 6.75, 7.75], "rotation": 270, "texture": "#3"}, - "down": {"uv": [7.25, 7.75, 7, 8], "rotation": 90, "texture": "#3"} + "north": {"uv": [10, 9.5, 12.5, 10], "texture": "#3"}, + "east": {"uv": [5, 11.5, 5.5, 12], "texture": "#3"}, + "south": {"uv": [10, 10, 12.5, 10.5], "texture": "#3"}, + "west": {"uv": [9.5, 11.5, 10, 12], "texture": "#3"}, + "up": {"uv": [9, 10.75, 6.5, 10.25], "texture": "#3"}, + "down": {"uv": [5.5, 10.5, 3, 11], "texture": "#3"} } }, { - "from": [0, 6, 4], - "to": [1, 9, 5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [2, 11, 2], + "to": [4, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]}, "faces": { - "north": {"uv": [4.75, 7.25, 5, 8], "texture": "#3"}, - "east": {"uv": [5, 7.25, 5.25, 8], "texture": "#3"}, - "south": {"uv": [5.25, 7.25, 5.5, 8], "texture": "#3"}, - "west": {"uv": [4.5, 7.25, 4.75, 8], "texture": "#3"}, - "up": {"uv": [7.5, 8, 7.25, 7.75], "rotation": 270, "texture": "#3"}, - "down": {"uv": [7.75, 7.75, 7.5, 8], "rotation": 90, "texture": "#3"} + "north": {"uv": [10, 11.5, 10.5, 12], "texture": "#3"}, + "east": {"uv": [9, 10.5, 11.5, 11], "texture": "#3"}, + "south": {"uv": [10.5, 11.5, 11, 12], "texture": "#3"}, + "west": {"uv": [5.5, 10.75, 8, 11.25], "texture": "#3"}, + "up": {"uv": [0.5, 13, 0, 10.5], "texture": "#3"}, + "down": {"uv": [1, 10.5, 0.5, 13], "texture": "#3"} } }, { - "from": [0, 8, 9], - "to": [1, 9, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [4, 11, 2], + "to": [14, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]}, "faces": { - "north": {"uv": [7.75, 7.75, 8, 8], "texture": "#3"}, - "east": {"uv": [3, 7.5, 3.5, 7.75], "texture": "#3"}, - "south": {"uv": [7.75, 4.5, 8, 4.75], "texture": "#3"}, - "west": {"uv": [2.5, 7.5, 3, 7.75], "texture": "#3"}, - "up": {"uv": [6, 7.75, 5.5, 7.5], "rotation": 270, "texture": "#3"}, - "down": {"uv": [6.5, 7.5, 6, 7.75], "rotation": 90, "texture": "#3"} + "north": {"uv": [3, 11, 5.5, 11.5], "texture": "#3"}, + "east": {"uv": [11.5, 10.5, 12, 11], "texture": "#3"}, + "south": {"uv": [8, 11, 10.5, 11.5], "texture": "#3"}, + "west": {"uv": [11, 11.5, 11.5, 12], "texture": "#3"}, + "up": {"uv": [13, 11.5, 10.5, 11], "texture": "#3"}, + "down": {"uv": [13.75, 3.75, 11.25, 4.25], "texture": "#3"} } }, { - "from": [0, 7, 9], - "to": [1, 8, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [12, 11, 4], + "to": [14, 13, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]}, "faces": { - "north": {"uv": [7.75, 5, 8, 5.25], "texture": "#3"}, - "east": {"uv": [7.75, 5.25, 8, 5.5], "texture": "#3"}, - "south": {"uv": [7.75, 5.75, 8, 6], "texture": "#3"}, - "west": {"uv": [7.75, 4.75, 8, 5], "texture": "#3"}, - "up": {"uv": [8, 6.25, 7.75, 6], "rotation": 270, "texture": "#3"}, - "down": {"uv": [8, 6.25, 7.75, 6.5], "rotation": 90, "texture": "#3"} + "north": {"uv": [11.5, 11.5, 12, 12], "texture": "#3"}, + "east": {"uv": [11.25, 4.25, 13.75, 4.75], "texture": "#3"}, + "south": {"uv": [11.75, 0, 12.25, 0.5], "texture": "#3"}, + "west": {"uv": [11.25, 4.75, 13.75, 5.25], "texture": "#3"}, + "up": {"uv": [1.5, 13, 1, 10.5], "texture": "#3"}, + "down": {"uv": [2, 11.25, 1.5, 13.75], "texture": "#3"} } }, { - "from": [0, 8, 5], - "to": [1, 9, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [0, 0, 11], + "to": [7, 4, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [-2, 12, 3]}, "faces": { - "north": {"uv": [7.75, 6.5, 8, 6.75], "texture": "#3"}, - "east": {"uv": [7, 7.5, 7.5, 7.75], "texture": "#3"}, - "south": {"uv": [7.75, 7, 8, 7.25], "texture": "#3"}, - "west": {"uv": [6.5, 7.5, 7, 7.75], "texture": "#3"}, - "up": {"uv": [8, 7.75, 7.5, 7.5], "rotation": 270, "texture": "#3"}, - "down": {"uv": [8, 2.75, 7.5, 3], "rotation": 90, "texture": "#3"} + "north": {"uv": [9.75, 2.75, 11.5, 3.75], "texture": "#3"}, + "east": {"uv": [5.5, 11.25, 6.75, 12.25], "texture": "#3"}, + "south": {"uv": [10, 8.5, 11.75, 9.5], "texture": "#3"}, + "west": {"uv": [6.75, 11.25, 8, 12.25], "texture": "#3"}, + "up": {"uv": [11.25, 8.5, 9.5, 7.25], "texture": "#3"}, + "down": {"uv": [11.5, 1.5, 9.75, 2.75], "texture": "#3"} } }, { - "from": [0, 7, 6], - "to": [1, 8, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [7, 0, 0], + "to": [11, 5, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 12, -5]}, "faces": { - "north": {"uv": [0, 8, 0.25, 8.25], "texture": "#3"}, - "east": {"uv": [0.25, 8, 0.5, 8.25], "texture": "#3"}, - "south": {"uv": [0.5, 8, 0.75, 8.25], "texture": "#3"}, - "west": {"uv": [7.75, 7.25, 8, 7.5], "texture": "#3"}, - "up": {"uv": [1, 8.25, 0.75, 8], "rotation": 270, "texture": "#3"}, - "down": {"uv": [1.25, 8, 1, 8.25], "rotation": 90, "texture": "#3"} + "north": {"uv": [2, 11.25, 3, 12.5], "texture": "#3"}, + "east": {"uv": [1.75, 8.75, 3, 10], "texture": "#3"}, + "south": {"uv": [11.25, 7.25, 12.25, 8.5], "texture": "#3"}, + "west": {"uv": [1.75, 10, 3, 11.25], "texture": "#3"}, + "up": {"uv": [12.5, 2.75, 11.5, 1.5], "texture": "#3"}, + "down": {"uv": [4, 11.5, 3, 12.75], "texture": "#3"} } }, { - "from": [0, 0, 6], - "to": [2, 1, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [0, 0, 0], + "to": [7, 9, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [-2, 12, -5]}, "faces": { - "north": {"uv": [7.5, 5.5, 8, 5.75], "texture": "#3"}, - "east": {"uv": [6.5, 5.5, 7.5, 5.75], "texture": "#3"}, - "south": {"uv": [7.5, 6.75, 8, 7], "texture": "#3"}, - "west": {"uv": [6.5, 2.75, 7.5, 3], "texture": "#3"}, - "up": {"uv": [7.25, 5, 6.25, 4.5], "rotation": 270, "texture": "#3"}, - "down": {"uv": [7.25, 5, 6.25, 5.5], "rotation": 90, "texture": "#3"} + "north": {"uv": [6, 4, 7.75, 6.25], "texture": "#3"}, + "east": {"uv": [6, 6.25, 7.75, 8.5], "texture": "#3"}, + "south": {"uv": [7.75, 4, 9.5, 6.25], "texture": "#3"}, + "west": {"uv": [7.75, 6.25, 9.5, 8.5], "texture": "#3"}, + "up": {"uv": [1.75, 10.5, 0, 8.75], "texture": "#3"}, + "down": {"uv": [11.25, 4, 9.5, 5.75], "texture": "#3"} } }, { - "from": [1, 1, 7], - "to": [2, 3, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [13, 0, 5], + "to": [16, 4, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 12, -3]}, "faces": { - "north": {"uv": [7.5, 7, 7.75, 7.5], "texture": "#3"}, - "east": {"uv": [4, 6.75, 4.5, 7.25], "texture": "#3"}, - "south": {"uv": [2.5, 7.75, 2.75, 8.25], "texture": "#3"}, - "west": {"uv": [3.5, 6.75, 4, 7.25], "texture": "#3"}, - "up": {"uv": [3.25, 8, 2.75, 7.75], "rotation": 270, "texture": "#3"}, - "down": {"uv": [6, 7.75, 5.5, 8], "rotation": 90, "texture": "#3"} + "north": {"uv": [11.5, 5.25, 12.25, 6.25], "texture": "#3"}, + "east": {"uv": [11.5, 2.75, 12.5, 3.75], "texture": "#3"}, + "south": {"uv": [11.5, 6.25, 12.25, 7.25], "texture": "#3"}, + "west": {"uv": [4, 11.5, 5, 12.5], "texture": "#3"}, + "up": {"uv": [8.75, 12.5, 8, 11.5], "texture": "#3"}, + "down": {"uv": [9.5, 11.5, 8.75, 12.5], "texture": "#3"} } }, { - "from": [7, 3, 15], - "to": [9, 6, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [12, 5, 4], + "to": [12, 11, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [3, 6.75, 3.5, 7.5], "texture": "#3"}, - "east": {"uv": [5.75, 6.75, 6, 7.5], "texture": "#3"}, - "south": {"uv": [2.5, 6.75, 3, 7.5], "texture": "#3"}, - "west": {"uv": [5.5, 6.75, 5.75, 7.5], "texture": "#3"}, - "up": {"uv": [7.75, 5.5, 7.25, 5.25], "rotation": 180, "texture": "#3"}, - "down": {"uv": [7.75, 5.75, 7.25, 6], "rotation": 180, "texture": "#3"} + "north": {"uv": [0, 0, 0, 1.5], "texture": "#3"}, + "east": {"uv": [9.5, 5.75, 11.5, 7.25], "texture": "#3"}, + "south": {"uv": [0, 0, 0, 1.5], "texture": "#3"}, + "west": {"uv": [9.75, 0, 11.75, 1.5], "texture": "#3"}, + "up": {"uv": [0, 2, 0, 0], "texture": "#3"}, + "down": {"uv": [0, 0, 0, 2], "texture": "#3"} } }, { - "from": [9, 5, 15], - "to": [12, 6, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [4, 5, 12], + "to": [12, 11, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [6, 6.75, 6.75, 7], "texture": "#3"}, - "east": {"uv": [6, 7.75, 6.25, 8], "texture": "#3"}, - "south": {"uv": [6.5, 5.75, 7.25, 6], "texture": "#3"}, - "west": {"uv": [3.25, 7.75, 3.5, 8], "texture": "#3"}, - "up": {"uv": [7.5, 7, 6.75, 6.75], "rotation": 180, "texture": "#3"}, - "down": {"uv": [6.75, 7, 6, 7.25], "rotation": 180, "texture": "#3"} + "north": {"uv": [9.75, 0, 11.75, 1.5], "texture": "#3"}, + "east": {"uv": [0, 0, 0, 1.5], "texture": "#3"}, + "south": {"uv": [9.5, 5.75, 11.5, 7.25], "texture": "#3"}, + "west": {"uv": [0, 0, 0, 1.5], "texture": "#3"}, + "up": {"uv": [0, 2, 0, 0], "rotation": 90, "texture": "#3"}, + "down": {"uv": [0, 0, 0, 2], "rotation": 270, "texture": "#3"} } }, { - "from": [4, 5, 15], - "to": [7, 6, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [4, 5, 4], + "to": [4, 11, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [7, 6, 7.75, 6.25], "texture": "#3"}, - "east": {"uv": [6.5, 7.75, 6.75, 8], "texture": "#3"}, - "south": {"uv": [6.75, 7, 7.5, 7.25], "texture": "#3"}, - "west": {"uv": [6.25, 7.75, 6.5, 8], "texture": "#3"}, - "up": {"uv": [7.75, 6.5, 7, 6.25], "rotation": 180, "texture": "#3"}, - "down": {"uv": [7.75, 6.5, 7, 6.75], "rotation": 180, "texture": "#3"} + "north": {"uv": [0, 0, 0, 1.5], "texture": "#3"}, + "east": {"uv": [9.75, 0, 11.75, 1.5], "texture": "#3"}, + "south": {"uv": [0, 0, 0, 1.5], "texture": "#3"}, + "west": {"uv": [9.5, 5.75, 11.5, 7.25], "texture": "#3"}, + "up": {"uv": [0, 2, 0, 0], "rotation": 180, "texture": "#3"}, + "down": {"uv": [0, 0, 0, 2], "rotation": 180, "texture": "#3"} } }, { - "from": [11, 6, 15], - "to": [12, 9, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [4, 5, 4], + "to": [12, 11, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [4, 7.25, 4.25, 8], "texture": "#3"}, - "east": {"uv": [4.25, 7.25, 4.5, 8], "texture": "#3"}, - "south": {"uv": [3.5, 7.25, 3.75, 8], "texture": "#3"}, - "west": {"uv": [3.75, 7.25, 4, 8], "texture": "#3"}, - "up": {"uv": [7, 8, 6.75, 7.75], "rotation": 180, "texture": "#3"}, - "down": {"uv": [7.25, 7.75, 7, 8], "rotation": 180, "texture": "#3"} + "north": {"uv": [9.5, 5.75, 11.5, 7.25], "texture": "#3"}, + "east": {"uv": [0, 0, 0, 1.5], "texture": "#3"}, + "south": {"uv": [9.75, 0, 11.75, 1.5], "texture": "#3"}, + "west": {"uv": [0, 0, 0, 1.5], "texture": "#3"}, + "up": {"uv": [0, 2, 0, 0], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 0, 0, 2], "rotation": 90, "texture": "#3"} } }, { - "from": [4, 6, 15], - "to": [5, 9, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "from": [4, 5, 4], + "to": [12, 5, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 4, 7]}, "faces": { - "north": {"uv": [5, 7.25, 5.25, 8], "texture": "#3"}, - "east": {"uv": [5.25, 7.25, 5.5, 8], "texture": "#3"}, - "south": {"uv": [4.5, 7.25, 4.75, 8], "texture": "#3"}, - "west": {"uv": [4.75, 7.25, 5, 8], "texture": "#3"}, - "up": {"uv": [7.5, 8, 7.25, 7.75], "rotation": 180, "texture": "#3"}, - "down": {"uv": [7.75, 7.75, 7.5, 8], "rotation": 180, "texture": "#3"} + "north": {"uv": [0, 0, 2, 0], "texture": "#3"}, + "east": {"uv": [0, 0, 2, 0], "texture": "#3"}, + "south": {"uv": [0, 0, 2, 0], "texture": "#3"}, + "west": {"uv": [0, 0, 2, 0], "texture": "#3"}, + "up": {"uv": [8, 2, 6, 0], "texture": "#3"}, + "down": {"uv": [8, 2, 6, 4], "texture": "#3"} } }, { - "from": [9, 8, 15], - "to": [11, 9, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "name": "liquid", + "from": [4, 11, 4], + "to": [12, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]}, "faces": { - "north": {"uv": [3, 7.5, 3.5, 7.75], "texture": "#3"}, - "east": {"uv": [7.75, 4.5, 8, 4.75], "texture": "#3"}, - "south": {"uv": [2.5, 7.5, 3, 7.75], "texture": "#3"}, - "west": {"uv": [7.75, 7.75, 8, 8], "texture": "#3"}, - "up": {"uv": [6, 7.75, 5.5, 7.5], "rotation": 180, "texture": "#3"}, - "down": {"uv": [6.5, 7.5, 6, 7.75], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [9, 7, 15], - "to": [10, 8, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.75, 5.25, 8, 5.5], "texture": "#3"}, - "east": {"uv": [7.75, 5.75, 8, 6], "texture": "#3"}, - "south": {"uv": [7.75, 4.75, 8, 5], "texture": "#3"}, - "west": {"uv": [7.75, 5, 8, 5.25], "texture": "#3"}, - "up": {"uv": [8, 6.25, 7.75, 6], "rotation": 180, "texture": "#3"}, - "down": {"uv": [8, 6.25, 7.75, 6.5], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [5, 8, 15], - "to": [7, 9, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7, 7.5, 7.5, 7.75], "texture": "#3"}, - "east": {"uv": [7.75, 7, 8, 7.25], "texture": "#3"}, - "south": {"uv": [6.5, 7.5, 7, 7.75], "texture": "#3"}, - "west": {"uv": [7.75, 6.5, 8, 6.75], "texture": "#3"}, - "up": {"uv": [8, 7.75, 7.5, 7.5], "rotation": 180, "texture": "#3"}, - "down": {"uv": [8, 2.75, 7.5, 3], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [6, 7, 15], - "to": [7, 8, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [0.25, 8, 0.5, 8.25], "texture": "#3"}, - "east": {"uv": [0.5, 8, 0.75, 8.25], "texture": "#3"}, - "south": {"uv": [7.75, 7.25, 8, 7.5], "texture": "#3"}, - "west": {"uv": [0, 8, 0.25, 8.25], "texture": "#3"}, - "up": {"uv": [1, 8.25, 0.75, 8], "rotation": 180, "texture": "#3"}, - "down": {"uv": [1.25, 8, 1, 8.25], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [6, 0, 14], - "to": [10, 1, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [6.5, 5.5, 7.5, 5.75], "texture": "#3"}, - "east": {"uv": [7.5, 6.75, 8, 7], "texture": "#3"}, - "south": {"uv": [6.5, 2.75, 7.5, 3], "texture": "#3"}, - "west": {"uv": [7.5, 5.5, 8, 5.75], "texture": "#3"}, - "up": {"uv": [7.25, 5, 6.25, 4.5], "rotation": 180, "texture": "#3"}, - "down": {"uv": [7.25, 5, 6.25, 5.5], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [7, 1, 14], - "to": [9, 3, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [4, 6.75, 4.5, 7.25], "texture": "#3"}, - "east": {"uv": [2.5, 7.75, 2.75, 8.25], "texture": "#3"}, - "south": {"uv": [3.5, 6.75, 4, 7.25], "texture": "#3"}, - "west": {"uv": [7.5, 7, 7.75, 7.5], "texture": "#3"}, - "up": {"uv": [3.25, 8, 2.75, 7.75], "rotation": 180, "texture": "#3"}, - "down": {"uv": [6, 7.75, 5.5, 8], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [15, 3, 7], - "to": [16, 6, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [5.75, 6.75, 6, 7.5], "texture": "#3"}, - "east": {"uv": [2.5, 6.75, 3, 7.5], "texture": "#3"}, - "south": {"uv": [5.5, 6.75, 5.75, 7.5], "texture": "#3"}, - "west": {"uv": [3, 6.75, 3.5, 7.5], "texture": "#3"}, - "up": {"uv": [7.75, 5.5, 7.25, 5.25], "rotation": 90, "texture": "#3"}, - "down": {"uv": [7.75, 5.75, 7.25, 6], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [15, 5, 4], - "to": [16, 6, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [6, 7.75, 6.25, 8], "texture": "#3"}, - "east": {"uv": [6.5, 5.75, 7.25, 6], "texture": "#3"}, - "south": {"uv": [3.25, 7.75, 3.5, 8], "texture": "#3"}, - "west": {"uv": [6, 6.75, 6.75, 7], "texture": "#3"}, - "up": {"uv": [7.5, 7, 6.75, 6.75], "rotation": 90, "texture": "#3"}, - "down": {"uv": [6.75, 7, 6, 7.25], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [15, 5, 9], - "to": [16, 6, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [6.5, 7.75, 6.75, 8], "texture": "#3"}, - "east": {"uv": [6.75, 7, 7.5, 7.25], "texture": "#3"}, - "south": {"uv": [6.25, 7.75, 6.5, 8], "texture": "#3"}, - "west": {"uv": [7, 6, 7.75, 6.25], "texture": "#3"}, - "up": {"uv": [7.75, 6.5, 7, 6.25], "rotation": 90, "texture": "#3"}, - "down": {"uv": [7.75, 6.5, 7, 6.75], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [15, 6, 4], - "to": [16, 9, 5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [4.25, 7.25, 4.5, 8], "texture": "#3"}, - "east": {"uv": [3.5, 7.25, 3.75, 8], "texture": "#3"}, - "south": {"uv": [3.75, 7.25, 4, 8], "texture": "#3"}, - "west": {"uv": [4, 7.25, 4.25, 8], "texture": "#3"}, - "up": {"uv": [7, 8, 6.75, 7.75], "rotation": 90, "texture": "#3"}, - "down": {"uv": [7.25, 7.75, 7, 8], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [15, 6, 11], - "to": [16, 9, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [5.25, 7.25, 5.5, 8], "texture": "#3"}, - "east": {"uv": [4.5, 7.25, 4.75, 8], "texture": "#3"}, - "south": {"uv": [4.75, 7.25, 5, 8], "texture": "#3"}, - "west": {"uv": [5, 7.25, 5.25, 8], "texture": "#3"}, - "up": {"uv": [7.5, 8, 7.25, 7.75], "rotation": 90, "texture": "#3"}, - "down": {"uv": [7.75, 7.75, 7.5, 8], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [15, 8, 5], - "to": [16, 9, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.75, 4.5, 8, 4.75], "texture": "#3"}, - "east": {"uv": [2.5, 7.5, 3, 7.75], "texture": "#3"}, - "south": {"uv": [7.75, 7.75, 8, 8], "texture": "#3"}, - "west": {"uv": [3, 7.5, 3.5, 7.75], "texture": "#3"}, - "up": {"uv": [6, 7.75, 5.5, 7.5], "rotation": 90, "texture": "#3"}, - "down": {"uv": [6.5, 7.5, 6, 7.75], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [15, 7, 6], - "to": [16, 8, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.75, 5.75, 8, 6], "texture": "#3"}, - "east": {"uv": [7.75, 4.75, 8, 5], "texture": "#3"}, - "south": {"uv": [7.75, 5, 8, 5.25], "texture": "#3"}, - "west": {"uv": [7.75, 5.25, 8, 5.5], "texture": "#3"}, - "up": {"uv": [8, 6.25, 7.75, 6], "rotation": 90, "texture": "#3"}, - "down": {"uv": [8, 6.25, 7.75, 6.5], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [15, 8, 9], - "to": [16, 9, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.75, 7, 8, 7.25], "texture": "#3"}, - "east": {"uv": [6.5, 7.5, 7, 7.75], "texture": "#3"}, - "south": {"uv": [7.75, 6.5, 8, 6.75], "texture": "#3"}, - "west": {"uv": [7, 7.5, 7.5, 7.75], "texture": "#3"}, - "up": {"uv": [8, 7.75, 7.5, 7.5], "rotation": 90, "texture": "#3"}, - "down": {"uv": [8, 2.75, 7.5, 3], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [15, 7, 9], - "to": [16, 8, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [0.5, 8, 0.75, 8.25], "texture": "#3"}, - "east": {"uv": [7.75, 7.25, 8, 7.5], "texture": "#3"}, - "south": {"uv": [0, 8, 0.25, 8.25], "texture": "#3"}, - "west": {"uv": [0.25, 8, 0.5, 8.25], "texture": "#3"}, - "up": {"uv": [1, 8.25, 0.75, 8], "rotation": 90, "texture": "#3"}, - "down": {"uv": [1.25, 8, 1, 8.25], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [14, 0, 6], - "to": [16, 1, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [7.5, 6.75, 8, 7], "texture": "#3"}, - "east": {"uv": [6.5, 2.75, 7.5, 3], "texture": "#3"}, - "south": {"uv": [7.5, 5.5, 8, 5.75], "texture": "#3"}, - "west": {"uv": [6.5, 5.5, 7.5, 5.75], "texture": "#3"}, - "up": {"uv": [7.25, 5, 6.25, 4.5], "rotation": 90, "texture": "#3"}, - "down": {"uv": [7.25, 5, 6.25, 5.5], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [14, 1, 7], - "to": [15, 3, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, - "faces": { - "north": {"uv": [2.5, 7.75, 2.75, 8.25], "texture": "#3"}, - "east": {"uv": [3.5, 6.75, 4, 7.25], "texture": "#3"}, - "south": {"uv": [7.5, 7, 7.75, 7.5], "texture": "#3"}, - "west": {"uv": [4, 6.75, 4.5, 7.25], "texture": "#3"}, - "up": {"uv": [3.25, 8, 2.75, 7.75], "rotation": 90, "texture": "#3"}, - "down": {"uv": [6, 7.75, 5.5, 8], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [1, 4, 1], - "to": [14, 14, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, - "faces": { - "north": {"uv": [3, 3, 6.25, 5.5], "texture": "#3"}, - "east": {"uv": [2, 6.5, 2.25, 9], "texture": "#3"}, - "south": {"uv": [3, 0, 6.25, 2.5], "texture": "#3"}, - "west": {"uv": [2.25, 6.5, 2.5, 9], "texture": "#3"}, - "up": {"uv": [9.5, 4.25, 6.25, 4], "texture": "#3"}, - "down": {"uv": [9.5, 4.25, 6.25, 4.5], "texture": "#3"} - } - }, - { - "from": [0, 14, 0], - "to": [14, 16, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, - "faces": { - "north": {"uv": [0, 6, 3.5, 6.5], "texture": "#3"}, - "east": {"uv": [4.5, 6.75, 5, 7.25], "texture": "#3"}, - "south": {"uv": [3.5, 6, 7, 6.5], "texture": "#3"}, - "west": {"uv": [5, 6.75, 5.5, 7.25], "texture": "#3"}, - "up": {"uv": [9.75, 0.5, 6.25, 0], "texture": "#3"}, - "down": {"uv": [9.75, 0.5, 6.25, 1], "texture": "#3"} - } - }, - { - "from": [1, 4, 2], - "to": [2, 14, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, - "faces": { - "north": {"uv": [2, 6.5, 2.25, 9], "texture": "#3"}, - "east": {"uv": [3, 0, 6.25, 2.5], "texture": "#3"}, - "south": {"uv": [2.25, 6.5, 2.5, 9], "texture": "#3"}, - "west": {"uv": [3, 3, 6.25, 5.5], "texture": "#3"}, - "up": {"uv": [9.5, 4.25, 6.25, 4], "rotation": 270, "texture": "#3"}, - "down": {"uv": [9.5, 4.25, 6.25, 4.5], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [0, 14, 2], - "to": [2, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, - "faces": { - "north": {"uv": [4.5, 6.75, 5, 7.25], "texture": "#3"}, - "east": {"uv": [3.5, 6, 7, 6.5], "texture": "#3"}, - "south": {"uv": [5, 6.75, 5.5, 7.25], "texture": "#3"}, - "west": {"uv": [0, 6, 3.5, 6.5], "texture": "#3"}, - "up": {"uv": [9.75, 0.5, 6.25, 0], "rotation": 270, "texture": "#3"}, - "down": {"uv": [9.75, 0.5, 6.25, 1], "rotation": 90, "texture": "#3"} - } - }, - { - "from": [2, 4, 14], - "to": [15, 14, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, - "faces": { - "north": {"uv": [3, 0, 6.25, 2.5], "texture": "#3"}, - "east": {"uv": [2.25, 6.5, 2.5, 9], "texture": "#3"}, - "south": {"uv": [3, 3, 6.25, 5.5], "texture": "#3"}, - "west": {"uv": [2, 6.5, 2.25, 9], "texture": "#3"}, - "up": {"uv": [9.5, 4.25, 6.25, 4], "rotation": 180, "texture": "#3"}, - "down": {"uv": [9.5, 4.25, 6.25, 4.5], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [2, 14, 14], - "to": [16, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, - "faces": { - "north": {"uv": [3.5, 6, 7, 6.5], "texture": "#3"}, - "east": {"uv": [5, 6.75, 5.5, 7.25], "texture": "#3"}, - "south": {"uv": [0, 6, 3.5, 6.5], "texture": "#3"}, - "west": {"uv": [4.5, 6.75, 5, 7.25], "texture": "#3"}, - "up": {"uv": [9.75, 0.5, 6.25, 0], "rotation": 180, "texture": "#3"}, - "down": {"uv": [9.75, 0.5, 6.25, 1], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [14, 4, 1], - "to": [15, 14, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, - "faces": { - "north": {"uv": [2.25, 6.5, 2.5, 9], "texture": "#3"}, - "east": {"uv": [3, 3, 6.25, 5.5], "texture": "#3"}, - "south": {"uv": [2, 6.5, 2.25, 9], "texture": "#3"}, - "west": {"uv": [3, 0, 6.25, 2.5], "texture": "#3"}, - "up": {"uv": [9.5, 4.25, 6.25, 4], "rotation": 90, "texture": "#3"}, - "down": {"uv": [9.5, 4.25, 6.25, 4.5], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [14, 14, 0], - "to": [16, 16, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, - "faces": { - "north": {"uv": [5, 6.75, 5.5, 7.25], "texture": "#3"}, - "east": {"uv": [0, 6, 3.5, 6.5], "texture": "#3"}, - "south": {"uv": [4.5, 6.75, 5, 7.25], "texture": "#3"}, - "west": {"uv": [3.5, 6, 7, 6.5], "texture": "#3"}, - "up": {"uv": [9.75, 0.5, 6.25, 0], "rotation": 90, "texture": "#3"}, - "down": {"uv": [9.75, 0.5, 6.25, 1], "rotation": 270, "texture": "#3"} + "north": {"uv": [8, 0, 16, 1], "texture": "#2"}, + "east": {"uv": [8, 0, 16, 1], "texture": "#2"}, + "south": {"uv": [8, 0, 16, 1], "texture": "#2"}, + "west": {"uv": [8, 0, 16, 1], "texture": "#2"}, + "up": {"uv": [8, 8, 0, 0], "texture": "#2"}, + "down": {"uv": [8, 8, 0, 16], "texture": "#2"} } } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "VoxelShapes", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "cauldron", + "origin": [6, 12, -3], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + }, + { + "name": "liquid", + "origin": [6, 12, -3], + "color": 0, + "children": [10] + }, + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [] + }, + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [] + } + ] + } ] } \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/textures/block/agronomic_sourcelink.png b/src/main/resources/assets/ars_nouveau/textures/block/agronomic_sourcelink.png index 994f87ee57a4458fb00314653eea468a263ab8c3..09b8dbe82f11ad92a4a7f9898c6007aca6ec55a2 100644 GIT binary patch delta 1276 zcmV{F1Y}Ml z#6JmU8c-lc{=`2KAAmStOfUoz_aZup3Gx67Ac+A)O_t1vNYpKmkpK}A6O0fB8+115 zZEe@P_J+1T+}^X^t+ajgf!|BdJw4}qfB(MUb8K5yZ7l(erGHXrxjc%?DSjh>%lFBV%a}HJ_NWbDRp*8hfR@X1a$r8emNsmTcWhKKX)Kk(T`?$#bZqC5Xe+&kHdMp3I-uq90Jvm@oUVznmeUwZ zrEr95A26lsynnUl4a?lO!=I4Qv{m)B!4GUUgviFhB&8^1z9zYC)j*%2hNX<;zz+;}amk zmRCyGM~-u>uY(;YBB&ErYwiV*Oz=RH-=YI18|vA~&!cFW0*cqcrrv45FW$bxrd|lm z{j4UBCB@|wB2=jZVDv<5{!t6sWj(>5iZ@JjFan}v>bd0PTt{Z?IX6t}S z$41NqSG*3gYMh13*5L^@bF6PUdOB8jzm!O41cxhiAUT=B?{e3rA;9{cbI88wXpijh z0fmMFuq|8iY6*;Vn{22Y5B?Mti%mY8O_x>UL>Biz>4K%et4hnGd`hEY)EC9*TSUC$uq<;wQNfzLl{9X2M^N2E3*7?lgc4S|e zuGOb3y%7j0tlWI1A#eaG5K`E?@1WQmizR^BqEnf6*%v06&_oHkR-YoP8f93y`3ibE zR`(VZ4s@+PWq>c}Agf-Zd&b7l+;!bHfb~7kmlSW5zygD2TE?n$dOFsS^v*Q98C^Y# zcAmEN9NsBZ?c?uu+oGMPZRXy}Ga5P1H0fT8gDq_h-REXWDpT$WHrKs|g#+eb=F`bg mvigEzf;S3y-|pN0&i(`byHP#!v@mJ_0000@Y{ delta 1281 zcmV+c1^)V-3Ze>-F@M}iL_t(oh3%GGY!qb}hM(P?%+8(<7^B=EG4X zx3jYoy6eSu{?5R%yO&<@-gM^M|Np;l-tT+gzmBaNw^aZ}vwvAMy@XeBi@&YmFsm20 zkx6L)L{u+;?fvlJWlS7BbI1X(@!2gE08KCP-M0$9=seWNzi?0k(r7k|xmc0CXu4)w z@XL*pb1&(8cBetp6~5fo&sZ9co;d_S&x-AIbuMDpfh~YiEALzZnqC4xk-g}KCZ082 zV>Fw^rPkd~(SI;_>+{!bv7b(TOzFf707foZzW}e|rd)QR8ybr2wH=(*i?pgWnG;yK zpjEW*xu;*P0HS>Wa&W4C0e~%erciB3#2@BPF2$nKlZ5;-V=0Y*TLK_ox(h(SE%DiJ zZ&0}u;qqSr#%5czab2FHrvkjR{WhalK5blpiA*6&#D5D>)K&r1 zp932MrE+y}R7($6FP<-C_e2dDUOzs<@|IWlXX0;hj#ULlE`uD5Ke&K%!^60pE&#%c zNBF?d?SD~9YLgw#>HZjQgi5xT#}A8Z zfPZ8r3o9P7dJ#a#()0y0S?cUn;xF`IVeTJLx;uIPuA^gwzUte-X8N334z_ zq_L|KC+3TVfTJ(QWMkZ3H<&d<3lMi2Y-U*=)_(wy zyOj_u=#zP2Hq$r97$5Smu&-Lc_)rSJzeup7rzr-UfcS?3Amo=t@_gwo7xoQ`Hdy^UNAE{BgulMLC*fGSdC+0*wVu(;c_yR>E%rs{HDxAdORSX3!Fa=KSQKDB rm_0Nxot|jQP|W1bCVYs8_}}3_J^WucyQOJS00000NkvXXu0mjfW&v?J diff --git a/src/main/resources/assets/ars_nouveau/textures/block/alchemical_sourcelink.png b/src/main/resources/assets/ars_nouveau/textures/block/alchemical_sourcelink.png index f1ac2a9272cf4b62bc0ad1e837d6f72c73f17e3a..87745e6a9f19c858e319168074c2f2257b809c25 100644 GIT binary patch delta 1044 zcmV+v1nc{p2(}22F@Nw$L_t(oh3%G4XdG1>$3Odr+3b`FJ3A0oN+e>aAw(k5f>xpz z1)&h6dJsIc5DVr|!5GA&mm(OAB~U!rLM;lR^c3|VIS2;v5(5DvNy#D5)ZGSVcC(wz z?v5toVfVev?Ck8$N{@a|zny*WeZTMbzQ5mlvG*=qbsv;U*nhP;09D5!tthB{DF6mD z8N7H;M49>Ca=dLDIW`U8`gCYnbIqfbfT3 zJ_f*D)A?~lWB$7-0A}8~#f6CqvFD483GQ!vIrSHI48&e|_6=8%cm)8Y;*B(>6@^l*N-CZptth@RrGHvgj;$Xb@&4I@+b+I?6?(j>?fi;qVG@Ccw zMt{(3QE)ZEpR^gFsLJ;hPcCF4<;ZbA(Mbkz% zR2eVMpGVaa;Q~Yu)(M4>sIV(X*cH$G4&(qyK`f5I+X>~OJsidUfkUPK4**&!$=frl z0JN(B=%Euv#psyf>jR7P=bQfoD*$@zgi+Ayfq!myLbB>O9ZAe`CD8pkq16M^3x@#A z+zt^CwG&1~s|UK_v3J5&4?v-_fYv)-kb5hm7b6x;n-6ZiiMytA{l-nQxe;QCcSG-y zq_^b?h;#2X{Q|y+OYCgNvB`T&Ps+DjHaEiUk4nB2UY>gu+*M+UyOGFsL*@F7n=-~- z?SCu);Laycp=t>(UE7qe8EB*vceU#-y!i7E^TdStDpsM32cXd|-}-PH7zmV+RoEn( zi_9;{TjNjxht?jtk>lPM!{~;}{(%`NBdf3(T|o;Dt-a0yoN}Iti+Pm(Cm0-k8OT8F zELQ$o;BV;<^Wm)Pedmjpj=<9|&Jl}07k|@IN#6#<+|VbPc(pbL+`)V}>v~h}l=Ctc z}ScOfBJO1={>Soa0Y>@?YBMO68?EmNm{{q$aCind|KMflI O0000%_ug;?W2I`?FcB zSgBS4%=rTGXoUUQEFa$(Ln+U*rL3dZN`%vU0XT5<%K#k^vIbBaO{8=RxmI@(etY{J z0F3Dz-~E*0%2($AcW zK|D96bKIFrxqpJ(nM+|z=gi-u6XRqgqbIp70|0WZPIG75982kxi+ojq;^Kn&PH}Mo zMjnT`6l1{RkJs4TjFC)g)Ru~*4<7Ospf;Llx{jvnCOJTJXWJAZva+gl545Vl7_j%` za{$zqioP-sC>%X)2okFRfJkrvfLJ(8wV@FS4iF26ZGUsB4b7a}+}Y;h3(r!KRRD5Q zoD*m70v;xeg~K-U2@#RtfVl2yIZRxaw>FE%!H>dij^NJUy6-*ZfY8M(6n5nR+e zv?@Ssjeij67f&3KY#tEUb4&t$a|>7~ubE8<+?`NuG+8LG`4&)-Rg<_Ps}yf3WF%u( zfEztKVZRwr>)WXH_WPOP?&PrR0qcHSJE0lW(f7UJ^nf7mQ~}UOC-e)a2a2~mx)*(R zLO*bN;J~o=nGn)+-IGLAgkLy4Fgh{b8ocMO0DtJC6Z%D`KH!Cay%W0o!0(>(gVuT% zhO?T_+9Uj+BCEW4b%HlupQIwIB=Un@4; zVTE2Rc|H%!UN0B`(MM9`hR1-GaaQi%HUo&ey>;xo^F8_EB!Pj+z}qL^HLMG`aJf~6 zU9V)~*4mnIljVD7Y`wGbM|(R2c_#?7U2>Xw-$rz4s_QE)0o{~|)rwPW`Q8~Lksowz zhd6A~2mjtSxq4-3>U#hZBahntPvi&54;?lIIFHxm^96rjBE1BRy!;Yd$~v{BqAmT> nzRRAs;$CL^&mqkGKl;UAH2Eq2)9LIB00000NkvXXu0mjfVpH(Q diff --git a/src/main/resources/assets/ars_nouveau/textures/block/alteration_table.png b/src/main/resources/assets/ars_nouveau/textures/block/alteration_table.png index f766927ecc84cdca8d8833989f82bfbd9023ee90..cf76d4f4628c0cc9b329fb3777efb1352f4727df 100644 GIT binary patch literal 5769 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 literal 6994 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 Cu!+q8 diff --git a/src/main/resources/assets/ars_nouveau/textures/block/arcane_core.png b/src/main/resources/assets/ars_nouveau/textures/block/arcane_core.png index 7b580cf3de6b038e922727007d41ce4da22ec513..e48676ca0e763d9a0b87ee64c85be06e451ea942 100644 GIT binary patch delta 2014 zcmV<42O;?85cm&}Fn|a= zG*G7ss&=SC)r5$um9>3gv@ey|fR}=(geo3j0u5;`AVm4INh=J2)=Jf=5Nr|yRFzd- ztELJB#Yyc(@}FGC*Y<5w^Kg8Q?aWP5Xc9l%&x`M$bC2)uoPXc>p5O0xJ+%iP)Bvbm zA(y$up1tEN#pQQ~h{cD&GXlWQPkd|1_U(uSf|MPHpr!$+<3gnjfWOO2^}zxF|Ge?G z=aK*55%2-Z_)>0Gy_|djiNDJWKq)s1KrD_LgyoRW%08vRdcY6BP<$h)LP51JJ5I|W ztR_Bb{QhSr0DlN-8fMraxgicfzo`T8e&*lUl`2P$Rwz3YT)b2tgcY#Zkm`d4s+F=D z=sQiuuQfh7^FYh2NWq~rl_KvHU&;x!hynpvH)UGt#yLJVDT;?7ChsW*$ zF!sDf^+A5wKZu$-rQ8I6`iIn(A$89T8)`sh-{T_kS({L-m#LY_kKD^zMK$|DO=CQBcg6ia zF1kRtVSjQ%oUPsc;2FX2`$!~$0Q7A#*!qNt;rCI>&GK~o<0Lo4S1eG%0~*Uk4n$DX zl-HSIL)~vaUJHEfF7|Y5L`|Kj2{ZpGq8nc24gV`gpL>?+9Q4P;`GvouW?TL?YrtBe zmH-ID<(kiDZS3L#eVfFL*u^4_m1b_fucd=M{eMqTtln3mIi0oXH+3bR`K*m&rJ2r& z_R~4IJu!|R@GDU@!v@Jngz?PX7F}2i+Iqm;yhGn6v&94E<{h+fqHQOqU$0ThO%jUr zDtC9RG~YkDg9NDOZchjyoSK>Bsb_{bw0o4nef!o#?H`5@ga)MUWk_Wpmnl)Kdbs&v zR)4vDI$fq%y^mw1xj8R{PzEZZ%{_kfwLTJwAa*eXz~NJ3D~*~uj+N%}UoN%$@uA(L zYiH#WC=akJRTTq>8Jz*dOlsi-j+LgltzVQo;T~_z=SsN{!;D^84 z3P9~@lxsH(2KO23I`b0W<#&cC837uT#7IX6((6csCQ^zhY5Q_B*JwRxKG#pTR&U#d<|jL`r#pU0eWc=H?wrxmo(n%`9x$fOF>%*V0Bu87}eR86g&jirDhv&&{pRf75ylQ5p z1|%a9)hJacs2KgsSr3kt=8G=|9)H?tC*}Lg;gc`pSZN$9ja`YVbuOc_pr(;36v$dd z9INz^PC7Z?Uk=aI^}{vCO7o>-A$3uPq|%6X;pzD|!T=mN`0$KyB}T5h2Q;5tyfjED zH(QVB8t>&;rIuJg4pu1E%hl^IiAGH&HEDP|;}@6IJY8?EieW3ocl=llyMGcTs5N#0 zSUjtN`n3SR`AG$UBS$OffxBFI_X?-SQUDx2HH*K?+mh5&A1t(JLM%Sa>9G{Lafh$| z>|<+Y=)>qrMj|S|Pi}o?*$1?60yAtVoe*0d9DM1o04lLD!v;GBl6-R0CWhi0F~bIW zz)vo7i^HcTv5O1p+4aPiDt{DIXuFaZl0pe$r;t_Tw_cQ9(g>Jjzs=;O*2mC|=K_Y>mdZrU-n+`9B zT;noU=;W&Ja`>RB65|;G{;=YQQ-uOw7~Y9)c5Av0V1=D#8te z?c3J2?6nkKAR@hn2P}=O_}G;ysX~FMsguvzY9K3 z;+)6=4;&Ptcj8&G1OQe4%V)))4D@YgYG#swzRhGRR{`p2v)xifmIJXKw3NlQZ~{G0 zQ`wu`=9)iOHCKMy(Ofx}#%~!M;^o)A+Yze27@y3>20y*B2h7&b0^~sud1|QTV^>Hg@>qONenim?FIqT(U0mRs=SDod_BeW9UH7 w7Z(>77Z(>77Z(>77Z(>77Z(>77ncs=zo&G^rLWy~nE(I)07*qoM6N<$g2^u02mk;8 delta 2125 zcmV-T2(tJ159Sb%FnBwsBlSDq9TzLI}Mh2 zIK?!^j)Uwqy9STF4?Md&*xr5^&-E_G4@CUp1Op0P#JNOaLI~be)fnyiRkILTA{R|Ij~v1b`k3iHpsLFcor6E`Sha3RWC4 z0F_0BbVnj$e1AgMvmU}sBAMbJ|3M6J;j}{_&qH&Q!qF4I1z`Q!mk8u}(2^-^w0f6Qvh~ClxP@}!ntUQ1k?WN^fJpeoRLuzF5cmd$5DCPLMEx4m?qem*m zIn%2EoOU~9J|AU1U)FM%X(TXQGLT{Ur+)b=9$CWcHiA^NuaWkiA(lP(1YmeVLf5A? z!SQoj2!Hs!v|ssR+&MKC7uI*$?X-n^r~SWQ781buqi@jMqyUEHJ+ee`u@fymOvw@t zCBT)-s_=y3yk!6!Jh^kq2?BmEon6;~A^^I2zM#D10kH!p4moRSWiEr+KmtU-^T-ka zUbh{8K*1k?o@;RwPcB}!ooHVpiKLx>U(tB-v40n*H9=?BbxH~gsQLPL2=+s1zH$8h za|mmjpR+9{C z{(p+ju#KffX{y(0aM-wZ*@I7@Mtk}GnsoriIgD7cSYALXbsHo@I2g;IdVM83Hmspy z^X6HJ_7fq2k>mvO3`^InJV1NT5LYg%A_#^;3F4_CI>R>JJ^M2N)V~-W;dR?lqrKej zYvkig=h5QBoIVRLJikwP1;FW#PGwEJV}HY%nO8Rrga>HJ6pBMejrIzQM*A88gyl2G zngmsi^=rRHXR;Z8KmjyDp@ayk8N((0jNvu92%Zz46+`_W?| zcJ4P0nEQOq$^(S^3=3ykUQ4D(=sNGz4PwtL=IviAEGRT6~z!uz!u9 zsxjCRWcQ{sq%S;8ORM2!W;~b=WPZ@zfAORby#U8WK>0It^q%@##O5Kmc`5RhVJp}vbmv{ilENG6sXQa2=_YMn@ z=2lm|P7`b1w7gjn2Gus2n-pGnet#eJ$6WyQ-EJh{EhOBhvv0%0SrcCEXrrrVd{Q)5 z*zUI+e(rmp1IAJ@w?HsrgGZJ)_`&by#af>TscJ<7a!#(W>>{5JfU?m~fbK{{5@oSH#=d#|P3Munu^jHWj=@(1D%*vd0JKd28YJV(F^5*zV zZ9dogQ(?P&Vr?4WCodO?gJw!P`cB;-0NeLECj9g1h@5i|a1?liRclu40U+Ql z6a`Q1wn3Vk6p`HlJiPlUz}N{ce7YXUjv=P-yNSOuhS+jX&YZewARTzF2rcQyX(WC8 z^HN>bfP?1!ji$ZlkG=uGo_}ZjD2_C5AN!0;hZ~5hHdfRwM$U0%6*Z}m;jEb8%3sJw zzyCYlKm)7xY@H2_lOmbHO^w9~cnha>kttAd$PD)1!0k>@xT;i~E1MvY0u1)wU`6d> z)c^dC!TuXxvYdNI>W)ORlAoz)Zc@bfGM|sFwby{v86zShVKT>M?tcPXYeCL&ks4VI zZ%y4%nrU*%d_K{SGc&%)s9vXu@g{OkuGk46dlyg~GONnVP#iKohZCQ}DXy6hNSQw} z3!aInKR&j`O&6cfUEisYU~ElK#{)9yjzp;2busIhtD=;_jv&>~egGKNpRH;z=p%7x^|11* zv)lHX3<-=(PmRU1x;zu1MtcFHGVG2-`0(nE(WWOXEnh^y4~I^!rLM#;D!{89Z9Kbc z5w@xURsy!FxetCO(x2;W=&=EI?l&sA%nq^H{^|_d49ky-2Y>j}%Uw7MJe+ERlEMOd zdT;V+n^73KolahT>pIITDn%QtrPVXt%r zmE{Gbu6>i5>dJYy?cK?J-;`NSn;bd4k=>il@X%wQ%tlMWcXHp0Z?Gen^?UcGGvkg~ zSXfwCSXfwCSXfwCSXfwCSXfwCSXfwCSXfwC%rXB5OK$wr9F1tP00000NkvXXu0mjf Dxgrr{ diff --git a/src/main/resources/assets/ars_nouveau/textures/block/arcane_pedestal.png b/src/main/resources/assets/ars_nouveau/textures/block/arcane_pedestal.png index 8824784c6615c5a70fb92d77b57ed6627699dfa7..b513136b2167e30694f04013422dad407def2602 100644 GIT binary patch delta 1489 zcmV;?1upu`4DSn&FnmBK|Hkzy-0=9Vh^QMJhUjaRFFbe1jD9kc1yC^ z%x;nyHk%$M?>UoXKU#H}mib-sz9yOf=lj2x!1&mSR-sa%)_*Vo$fgGX5Mx?I1z;#1 z2VkZ+*R@8VMO3-2bFP!?zg-EeIk|->GsQW6`t`KkYuyH*T+ES3zfQTBW4SyJfK|p+p|1eYRfQefV?cq$rEM6dZSB+3w%}_CH589` zDW=z$*9g`crhl~jo{Y|p?O_HpI)m-@o{a8#K)AS*LZz}LFZ(=DL_=2yqMO4bg96Pqh7|iG_lxm#0GDNwU6%>F(dITr{(0`xQWb#`m_0gZy06Q@PR2p^p z`KVGs4TdmRn;ghw0Qc_EYX=cZy1r#1u8%Slk5ew@SX|l$ZP&karjMEtV=$xfFmJH9 zWRXaZP;1Oefz@CL0CTkoz@1rJfzfanEuvDY8brfk;7KUdEz7mm3j}A1b1awVG0YVi z^ZiN9m46Eib45NN1Qu#)GdpfcfavQDZE}nawfJ?)sO;3d#n|^1C}KfB!q`2-gD{8 z2oPa-?=yM-rzR*G;$`cW<%-d0I85ELT*CB14TeyIA)?_hFZQSw1y=R()4uaFMG=BY z3xBpT+kNrb%j%toEWc3&=p`j6PU{{&G1ha@#p!DsW^R%2M3&#kW4wX_YP6BK*add(wWuY*ngzeYu)hP%bv*o0tIZ#njJZy6Jh;qdZ6oGK#Qo1 z9sHo>JpYSZqg(mB>w8|?`%cSTZSwmc-+y^R5t|NyUUj_K>jk|kK4;Y^@`RVp0?I#$ z|GHz3$Fit2>Ku4sgai8rSSZ!Fmp8ceS5D5Gt4-pOXxA~>O9|2y0vD&Rt-ClH4ntdE z(Que#L`7E>7D_dFapJ59lkG6+yesq)vJg^(A>xtfnxD=BN$mFkhPgt`XtKCu$$wL$ zbKdI&0l9Ar0iFHMT_V}1%S2eJwoi}1&Ye+oRq2}dI*RkKBCIx3oRgKI*{BnbL}kBo zzc!pWE%J9nhunsZVv=HxZJ7f^ouAuBub0)!`*pchWY(DV?8Pu=J8p!` zBnQt20KPbNzU4gJ^m2RWxcINpD=0#cvsb$(&tA0!TqxD#*jfUV9)8qHq(@}vfbH(W z^5Qv99){LKRC%J^X3!pc5AK0ZD^K0ZD^K0ZD^ rK0ZD^K0ZD^K0ZD^K0ZD^KAz-ni{kWA^Jo>w00000NkvXXu0mjfTR-3B delta 1583 zcmV+~2GIHM3(O3VFnX4^5>G1zdG z_CcLbPGKmzy(oKe7GY27qu`6+gP_nCx2K{AW1lPNBI@wx2y{c;F^yUEJ>61iKXr&0i9 zvOfZqO|a7yYn6iSW1)bypU1W2pVANno ztjyQH&L=i|!W&MeWWro&5_Ag+Ks?gH-D;?Aj)tTMOn;{HY>qmUVzyY2zYnunG@l=H zuEfFicEEXh)H^}MCSBYxiA$r1#Z66HP~-X{9Hyo%cErl$i>4H;`TPKwb0q+--5&!W zsH%hl8tI%tP^~0W5efy%a?EuDzTsqwMD7-bIV**4j)ok$K%4|HFIYT_jo7zss}!Fv zn(|p#Tz~X+#ah|7ZR>^$T@1zE7#TItH3dcupyCz(rYqu~>CF@RMk8A+NYQreRu!%< zykIPwm0mHNOi53014>t{mGo4Kj@?IzM>40U)4HDvE-g^cK$M!;(Ei3hRRf@L{k zG^nZ+EXyIL9-7aO=JOL&Ri3C*Eeaw#JF#+!)vkNZP=qjP!7668Eq?1+y%v$>m#P4* zTz>*J690dzT?Z7qb>BI8xbCD=1Lv2`+#=zLEWen?sF66iJ0q)G^%|l8D?XN%3WIdc z;Gxa(i+N1$&Io}PedQ}$XA}|RtED!pKfnKta=m$bjtsdX`wJAPSk|n`0ksJ0cg0#4 zd>04>G!FN^S+?K*#m(``=&0j=db*F4&40NPfBy4>D>h=qAyBW57iYboUd3mx8bzLP z(_KJ$l=v^$&Uh?~Y_Y(>mR%g&-^ye<&&a63m5G~j+?*@X6bLT3CNFoSZX}KnI5lv7 z$;m-gh3bX{Rh4K!L)R20(|P&f#9k3bt6@_6tVe1JT+g+P0|_LPW5beRa#x$5l^h{uEInzCTr?I`xkim=*nG9@cRvsj=h z5R~oO^WHFL*}W&qWIB&w&Mp`~{`L!w7ry?=ZJJ}dXz-t1S79qfDOeWKi0-)T6fBFT zfU}el?V~k<`eK8OT*z?fy&g6-Z-1dV_A;5|O@8_0d-fjN&d)X1-kHq!x(a$!eCAw< zbk4w>D`C!+7TgJzLsWHFPY*GZ8JFS#iW84P2z>SN1c4SEH4?8{a2J{6O=dFVSh)n( z&)lOiTBhT*XSsTMh;f`AP@FK>du+R-@4$(k`5Rx-`9kpyx1a=CbgrMd2Y=k-z=<9J zX~E7z%``^Kgu?}_T!O}EnOX-&=K zrk#hHWvAGPK#NW|TnPy^5+@uk@M8D3^u-3{+;F%+WM@Uxo+CpILbUKI(Qn@nH=$fg z9*3vl)g%24FytH^7~#sNPk)xDr-SkeD}~rx+sY+)srNV158f|Nj{YTuZ))B`Uu=;3 zH{L2+xdg=tgQt3ba>X4$pe#3GdOFBdx`FL2I;m?xqE%P!@9%E_xbRU&Id01zGnsKV zHE#i^w0Bn8+q%DWmGCv=yOW*ezt8p5z5051czAetczAetczAetcqn*yczAetczAet hczAetczC#i{{UR(7rt5NpDzFa002ovPDHLkV1ljk3cCOR diff --git a/src/main/resources/assets/ars_nouveau/textures/block/arcane_platform.png b/src/main/resources/assets/ars_nouveau/textures/block/arcane_platform.png index eacf9974dc7e386a3e987a513ed52596ca0c11bb..4341f04707d417bb121c916c51dad13dece99929 100644 GIT binary patch delta 929 zcmV;S177^I2gC=EF@JtZL_t(oh3%D3Xd`tL$3IDCGm}ZDola;wZHNRaZ4L^83L=WA z&`U2ld9!#BTo3i+sf(~DPs?6Vq)9dHKEf{l52m^ZlhRuC8|)u8SXp0Dmmoa{vgRuBiZ&OcQ`D zXP17aYpUEYa*0^rG2g8pzDxlqTh1=Gf8IFR)%gX0rc=YR-=OK#c+mU@fas{kl}{^u z!397oisXAMifBa6QbR&aqWbnNC~8- z$WtsE9PImCx>2I()VO)oX1V~>JuG{XhI?mVA~$H^27fK?yRPg=_^3UUKpMcZPls!| zpv&Pq*!QKs>C_$rj6cUdf|6;{bZQ(PUx04wzqmAs@8v0$b$03=hsP0?UBM5wCFp`_ za^H1XFird*9RCQmoLwF?HN0?+`T3ljgXsct7XI3Q*i(5DJl>779)S{nxm))zR0ZlD z0EfrXDSvqCC3NkM6q+~*H)!>=yD(``GEIKlZVV@|Y|jxL)!5iPapbL8EPJslMimJT zr)nlD79>n92QbzVq%N+mcSJy3dZAZ-MRM^O3K9bRyCH%zkieTSzS9AE^N}peO%2SNI)bOEfp3fw4H8paeuC&1EMQ&pIDDXKvV(n!TM_7P1iSX z$@Nq3z*&Qm)jn|t&cZyG%|87Oh{R!H2Ks@+;Cuh`Pqxu!46>8+c120c|2Dg zLSR(ZV&5Re(`F2Ae)c-k1)aCw`-5Q5Lz@}lE*J^DYoZJN6ff9w@Vz!G)o*|$v>Ah7 z&wm@5Gxf^z)ebQ9;t+~=`==FoT}MZM%Sr{<{L8Ol*%eZm_eWAjsRJaGFg{rE0c$!n zu6>k8H=bpsdRLzN*H>Q!U~Tcd&vMV(H{GPluOQCq>iF2OYxf-3@|7!mN45k7Av%p)x00000NkvXXu0mjf DIZn($ delta 912 zcmV;B18@Aq2eSu|F@J4IL_t(oh3%EkYaC@5$3L?>%*;;nZl=4WyPGw-L^df!Az+n& z9{d4%$fYO!2c#Auw|eyMp`hSJ!CNU5y$J8L}M@ z$@_M8-05z%#Zw+w=AC!n_xXO`@AJ&})h;Y8N9(Rj#}5FQFMpQ+kaM0x;=GgwS1Y9iO~;`&|gx~@_rxZfK}Ab$f;$=B7y$)Zii>tTy5JFSkI zmrWT5j6cUNft0Mh7eYdMS&sHz$ZR=MpOWi$nRXoRx-Qd>L&p!sFTrYalloI@c)>oE zO0G|O*$aQS_WMqr1dpq6)Dr0Nmzxa_Vd~KElqwSZg%>;6Uzo~h;v`(Z+b4H1FPL#0 ze!0CqoPWT4xkRhIN&U=QRPuE;cGpx-%$6es4)m1(P$V2H2QXF%vYa2Je(ei%}PL5}BdHEFjrN()Z_U`+}9EpKQ}ZSmQ25is=PkdF85_1D>M-r%3@ zdw+zx8|tJItn&Oz6w0U3vTu*%jLHW{IAOf8;tjUlyutS$e92@nqO?#{b^q<^EdcUQ z-x~#2MFt)?UD9@w&M5ysdw!92OY3X8xz`GuJ->J)aDcHcka)E2T#O3k)2#pg11Acn mC{`~$a?ay8j^p@W<6m^-_(ido(6#^o00{s|MNUMnLSTX!KEXx+ diff --git a/src/main/resources/assets/ars_nouveau/textures/block/book_wyrm_lectern.png b/src/main/resources/assets/ars_nouveau/textures/block/book_wyrm_lectern.png index 6bdaff60422c1fdffb48554fe017016fc6917822..43581b8c3b34c820db52afec184bb643ac820c52 100644 GIT binary patch delta 2982 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 delta 2995 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 diff --git a/src/main/resources/assets/ars_nouveau/textures/block/enchanting_apparatus.png b/src/main/resources/assets/ars_nouveau/textures/block/enchanting_apparatus.png index d04561c09beafd8829bc389bbe3cd212a99b2709..0c79d3b4879d994add119fa657bb41b2c36d0a88 100644 GIT binary patch delta 619 zcmV-x0+jvC1(5}iF@H-*L_t(oh3%C;NE>k!$3IEL*pvj4ECDGfbSQ`v2O+eyTcA+1 zf>N?Hi|x=+O{WgA)VV^Z4rwW+L+#YTEu9o?1}QB8k&^yFiQ2$L$&rgWxV#SW&eK$( ziCM~hmixWmJ$~=K?|VOfuIS*HgadxGgBk!;T?ZhW`{2SxbboM604{WQ1K{iNqLkGp zzkj6*U~ze-VaXb$-3=0Ve>XYS>IPo7$4YSjpxRE{qXf)~UO)QCo}w`^Q?%5u<8^z0 zBL%{T3bdU70J6rOqM@nAsg4~}z}MrYw7bE?Oc4ORyhByL$lQ2JeEvq&nrg84?JLj$ z1(dSN?OUpCxPKymiqG$1>eVR78uOFeol~GzZ^&LdJg}LV(Y?rr1W1ZX{q; zdxDca|8(OAN?GOYiwc*oXIudBY)s5`tGG}5VJ249b$_b5&i4L3wYtH(XV)wr`?_U@ z21exMUUYCw@+&df%q2uABtsy5hE>9|6+a5FRJ+#09)%z z#HV-8bpD=Q02aJ5&~2?Gv;=L_$kVRMt~u+@e!w~%rX4pw zE{;Nn{oUSoUf$>b{QvX3g0HqobGw|V=?nm=Y!(3jrIQrW*MIX7fD%yzz+sn&DG5fu z^$M842GHMe7l2Pe2f^?RZzno89L%idkStb1;O}(GOx-mB`Hmhx?O`dV;`Ou{ZWJO} ztiYNB?!OM0765wZOEDESkps`>2Y1Z@hg~8Vp26#B0}otmPICWsmfTnxhg0ubP2_gZ zftZru`S5My;(sT@5&#aTm4>?O{EP}j>D)aBGOIZNGJh{jWwYe>PMlUD=pY(}FJJw{ zqthhg3n;T;09=QU09UmAwO!ku1e;{BZWy^|-5*dBIXWIZ0`v&t(P`e_c}b~TLzYvl ztdw9ck083d+pVn&$alM*SK$d@E%Q)|L`*r#*~%J9Wq*BdAe5zjFkt>2*o>_*FO@~( z=LFGA?X3k!7AxHklcX0D*vp-WE-!n^_Tt`mPiVQ^phey(h6^{&-PFvuU<3V`T_45V zn_tLsiuv&pmSc0&xB8d~Hfo}4imtIkJLZBgbgN1O7zkZ3x>{b*Z7*E64+aEXfEQ&p z%=~zas(O*DN>|Jks|*Me*jmA5cyN>Q<(q& N002ovPDHLkV1lx@MR5QC diff --git a/src/main/resources/assets/ars_nouveau/textures/block/gilded_sourcestone_alternating.png b/src/main/resources/assets/ars_nouveau/textures/block/gilded_sourcestone_alternating.png index 98c9600deb0f7a548e789a75bd306adac16e36e4..4c6334f3efa229c99405e4ae88760338f9ff0c0f 100644 GIT binary patch delta 575 zcmV-F0>J&U1mpyeFn1gh6oo&}Om=NYN;b9?D=`i~EeIsq2zUSx zG!zt2A*9goI%$(WRd@nK8&OfXilR6_j%9DwmhANod)E}pj$#z$Ry(@0GxwbDOzHLZ zr+GUF=tdFkAfTvj6mfEP%!?<_-FiAph(-ha$_f?Fqdz#uw10zu-S3}aeni;o05A#r zeBA-94BaT=;_4iL&1Q>elwS~Ai&h2$!2F0eFMlwdB>)^8ZZVym0x+E=hzRvs)Af@~ z0MJ@vx=}>f>$qky0f1yF(P#j`FuX#t6s-(8nYg{`=8rckwibY3wL!hsL~G4@qeZ>e zL_`Qy8;A%dwttpM*yrGI%iUazsg)tNmWt;AP%Zn;k80VcpQV^26W)Ee##iG7eTBv( z6Ovi%{Mc-^9IcZxC_TQvJ=e;hwa#^mxbLDw1j$moB_9!4=$X4X55p_kn_JwL6M&z; zf8`WT&W-_iaPJYrP;wd8B3Vj12-rP*M%e2(kL>u8FMr?G@Roc`L1DeoawvVJ7rY32 z9p1k^b?g1T4XWii(Fja58laV-KRBoGB8kV?KZ%nz2}=v3+wmpS*%~5(@+&JjXJx3@ znvU;!qlH$6yK*8~im7;Bo@=eCmVLSxr;hXR-$pyWW`A!3JHB)W6ge@mwNCGJmN?gQ z&c`H~@Hla2nIyZ$SIZ=s;42N}xJyqTzM4yx=E3Fn zP#0YYZhVw(q)VTmui#Py-E`%qt4isn6w-((Nw^W3$&7O*F5+A|A@#s8=bX9R^XKBY{wc{dE{IY&1P$*t!c=ND%@+kE2V=`6-ghSpKiC3bI*S4L`1z^#r?VIlp;2%9T%5_GfYzA2 zwd#uG1G;zavWksvtCpEZq7bIDQwmU+n8_y52OR{jDNPd$SxW5?70 P0000;sX?J#Jcjx!}HeNk{y-KtO zV7J=^AkmtEEUud1>fGA$e(-o*q$D6#zw5 zAtLL>2!QIh!GE7+bGCxu(j`r!sf9&4bw2{AvSW(s3IH1q2QOBkr??oV7OJz9Yu9gK zYO#&~*!$I4ig-R!FHxTFbP%yc^Xvzzb#996+`0ek!6O*tIU5^I8a~<@Oiz#O2#wDGTR}jT9b@Xq6}BT8 z#{lf^+#%QuEe8Ohr^wHK(z$vQQwyP|tYx7ErWo+Wcb~3;%@7fBq+R6U bfB8SB{SsXKp#W#K00000NkvXXu0mjf0$u?P delta 507 zcmV6?p)hwmDh?d~<|=BA~&P=j+gSm>Vek;wj5aSYAZkj6&1Hp>; xJL$C6|GE`brLlXXw`i_~sH)$z)qVJ%{|`WfP>xyN;gbLW002ovPDHLkV1k1s`BVS^ diff --git a/src/main/resources/assets/ars_nouveau/textures/block/gilded_sourcestone_large_bricks.png b/src/main/resources/assets/ars_nouveau/textures/block/gilded_sourcestone_large_bricks.png index a786d5192a2b53425e5f3b7dfe6c14665d31193f..a8d71c6485770221ef90a25238151c5a0e72872f 100644 GIT binary patch delta 466 zcmV;@0WJRB1Nj4xF@Lj3L_t(IjdhYgixWW@#($Z2Z}+k%Ayx-sL~Jd@FJLX4wpXfP zW8;^xiC}kyMN0hy_I`j9m0MsqbR;z2tdm2yxn-(jR#=x^zq9rK%r#st%2N4)=(VXI$V=^Q{y+k z;h?~K-_8F4QGXc(?%%bDkWKDANQlAnN^35!E_itVQL@+11b_-wh0pvkzfSy~jK?t_ zXS3rZ6P4Cv{c1rJe9jMwW-&jfJS>=g93*1v99gibwKdRr zE9Hnn38B||af4}EUccE1q05MZ&MNOc6h~c9l*AjDrc1@uzp&2n>BBO)opo-P18?dW zlmKsP$~$)nO#=E2GPha)ov+^1h)8@2fLSdOk+>GwJPEl3DbLX$31lp+m9 zBpNCtgz^}O2cYH^c!5w+rJ$#YA~^*#@yT-bZbytwvFvi^Tt-^$%7cR#n-*FMoA?Nda(ra-I*<@=d@up*P>Q!O_b%YkvUW1V-B~1KNI{)vEaA zJXUaactN@(*(SMG?JNKhVQ{ejdR?osGaQokL;!N$FXx%$c6Q?<%Q;1@%KI1J?~pey z0+3N8hLsUk7JKmg$?+P%71I0H1SH&o8*d!mQkq|2t3R;iFth0Qm=q->?7vt0n^hHOhZnu%T9q=%6zT;4W`>M*afOiJAHO~WLWc-(Mhb{h znHjio9F#(G1-=Qqefq7px>}Vo>zvGuGr-KKRr&nm6)$aE`+-uIH$c?Y`~nflWQgM` gA~_cM|1~q?FKTWh|JiW8$^ZZW07*qoM6N<$g2l|xmH+?% diff --git a/src/main/resources/assets/ars_nouveau/textures/block/gilded_sourcestone_mosaic.png b/src/main/resources/assets/ars_nouveau/textures/block/gilded_sourcestone_mosaic.png index f6058b4d4f95c5d8eb7b9a3d2e6eacb856099ad3..aa30a225e0c86194fc77445a9de110e5cab624cb 100644 GIT binary patch delta 455 zcmV;&0XY8Z1MUNmF@LB@L_t(IjfIl2Zqq;<#((zNK7vGRL7-CFq*aB)5TptghKhw1 z@g6L^08hZ&B}jb*rn~|>6ALSrBa&L=l2&o<(sLNd9S%6+rjx((|L*&~U-0(zyEQ#Zm+C;Qj$_uPcjNO?rI=&mO;8Tl?n+TitFQNMcD{2M|K|Z&AA6_D{Z^UvYAD zN;gdb`26(?bzPTpUOeghJSIg>SQ^9S#neB$o2CqgXMFoH_BVbS_Ry8ZtTdTY3_b?j zy(2dk`ft_%GJg~-Zl-iQJ@3^u;)a`>pFCg9YL8cU= zaqj)P)a#jy#v2Y?&yIulA7(6;8ne>0l7!2PDQa2zTR;cHGp~CNT+b&*r{3$N$ho)o x&}X8{Ih}*UEj{QTpZftxEPdDY9GY~e{Q@86QN@hf!WjSn002ovPDHLkV1g(j+uQ&E delta 451 zcmV;!0X+Wh1L^~iF@K~CVW4g3=R2SXP&2Bt2oSdN<1f@@mExl7JrAUF zE%aY40aPHE-hck2*WLHMmJ=z9+uI*(cXoZ@ahB5R9~>`55F&*5oq=<;y(<<}xt*I@ zF5&;?+{CM%Gq@5uK$&Qk7fKJb~C td_s3;x5iujgJWMnM#|5+nnM#W*)L}`P}7n9GwA>T002ovPDHLkV1fst;m`m8 diff --git a/src/main/resources/assets/ars_nouveau/textures/block/gilded_sourcestone_small_bricks.png b/src/main/resources/assets/ars_nouveau/textures/block/gilded_sourcestone_small_bricks.png index 251661ce2662f04fd59d6fcb2743754a1f1960bf..00676a5e729574b592ab17491a513cbd335fd876 100644 GIT binary patch delta 510 zcmVL!F@N7lL_t(Ijdhc~Z`42##eeoXu{jVpfOOIw0fLZ_2%Pwk_=?bp z6f`t6&{0B3LzllGe+Kka=qd^dkSGup1rjY*LX2|9o|V|%&Fz^Y*^PaIsb=TxYUaIp z>pfa|R^_DvK#sTRw7V?EF#w5_*vL!e@Ot=psrc~aA%)f$V}DqTV-hLd-x74r9bmEG_ z4-i5CV2r_H!VfUhNdpH6?p^LVzIOaN=Q?idw!11af<#INpI$-rmDOAC8IDqf5QImL zyDo{8?%|u)5q~=S#gi8i0N#U}Ppd*}cUct~ghvk!yL8%J@>0>bbD){YGrZ+cc0`zyVF)3+JXK}B$)UWD$2X`7i5JI@R)ukT6?4B)e>x0{u zmK!)6dg1r>1_8j@`WT&U@%-fipTB=Y2tlXaMUI;WYDJ;*%-w4PgdgD5e`BF_gJ<3Q zttfPUu$rNE@vdK7t!BCFy~EE0I1kMJ4Iu=70Y`XAAgvzAr~m)}07*qoM6N<$f`E1U A{r~^~ delta 490 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 Y1NN43!T^_gY5)KL07*qoM6N<$f-pgV)Bpeg diff --git a/src/main/resources/assets/ars_nouveau/textures/block/item_detector.png b/src/main/resources/assets/ars_nouveau/textures/block/item_detector.png index 72f22fdda3590af00f2db3070cedf1153a5e54c5..3b60f85d7d64a7ca7a55d7b1cd9f3215969a8960 100644 GIT binary patch delta 879 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 delta 819 zcmV-31I+xz2G$0UFnY^79(n(}H2%$-c7j4W1rp7B9dtuuX0EFgd@%Ib^ zpr6F#`2O++s#*ZRFuVY$YJt12julRU2apR{(WuYgGfa7Vio@L*ItQn@(07x;r}yL> zK~@lPML>L@ss&0}O@3U;YPK;jGe6v&;aG?MRF0js6;!oAaB>VVD|qGl19Q>vv(pI} zhL=)SLsbhHhJTl!FNmuCqLkHW_XR7{4s3)v2dC*zNS9)AGk#uKs=($4r|7>3~`lU69Eatw^l$g#hF&NsC=K%3K9Ja@6v6s4Z5z7a1f z6FU1J=q54{b>F{^U2kI>FSR01nMO%&9?sf3aeRGr1>MLl4zh_u# z;OD2!<_TCGFOyaP=X;%4Tw>&9xGr0v0r40$3x6f?eWF}U<%magx&mdJt%6x%LBbl> z&Jo0-@7@D29^QB5hHXxcCl&>>3f9;Oc|FP2LfFlIb?^wsBeF>*t=OE-x`A-ST89+v zj!-YV-@Y_Yz^T*vyCoo8@b-Xn`>aqR;lZ-17Ht23)-x4ZHOjoM5*3|Xz46tZ284e* xoh-F}5+feb>)wOf_reP6IxV!&LJKXp!9U;P_E>(m#gYI3002ovPDHLkV1gBQkE8$q diff --git a/src/main/resources/assets/ars_nouveau/textures/block/mob_jar.png b/src/main/resources/assets/ars_nouveau/textures/block/mob_jar.png index b4c09fe4b710930fa779b07bc97f972a6485d8a9..e0dc1376ceb32abd29f2cfe73c3797b2adece3cf 100644 GIT binary patch delta 1161 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 ajDGu_Fv;;4K4mSqtN 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 literal 1039 zcmV+q1n~QbP)Px&$w@>(RCt{2non;VMHq)4JI<_kBRh61J1L4wR7!I}DiZ1eaYBewFGxsyhF0|upA5J*9%=A1VY)4sHfMa?`I8KLp$xui+x+o&HPF^`T=iMD<#uS2F+Qdp5^c+{2qA5f`kY%g@Fk=R|-Vny?f$1QpKQH6x!wdqv%+X&} z=1d`2KL7Wb*#rJBH?H3tO_oe)jHVEQDk0Ci-f*F-$H)bc$PAjCDwASJ7M(dtfUxfb zVJPQvRBc;T3oC6<9vde36 z>QOSCC5s|*0pwht4u0ALcDFWPUk`ww5%wJSOt4XTK;#0{Y#SrFLcP^KvpSR|(e;Lr zy*fuOfRS7|6S$FFiEX(Yxd7kYI%5Cl23J1W03cn=aQUO3V%sN-r3|hY{54ni$x}r3 zLL85vh(&Zo&m84(5mdys_X~MFfL;8fbNs0adi7qA{Riqe)gR!tQSVg4C5ko_x|_lpxJB! z&}cLO@H~%x-`}OlxnBa{{Nw-HbMw~4P#vyql<0I!4)6ZL^SY((7Z>OD0Fk}GpmjKx zPT&4?2Y|K9@dgi&T3uaL2l;#+fKI0afa5r%Qocr$ZavGW9sc$!fJ*(ZzrDtd>(@pA z-`x2s@)cpKQmFuNa&kf<;rDM@769dPSxt-Xv0t)UmHoNS+bCXn|BG`^fqB>K{LWRH zJc?}N<5i@@cn7vvEWQ}+ZWn-Bt%m1$09?9sJCL5UZlX5-dNj-Bb0fBG@%+wJ0Pa1! z9qT_vQqtsv5R^)Onjah-0MKsF-=*LC?7=wT2Xnu77!rGXdn16;(^Hl1QWVRwFbsdQ za(jDwss7tDFW&fVag9c!(P%UpjYgxPx$L`g(JR5*>rkv~hrP!z>~(MaGWwV2X2 z7(~b7qKm7}LUEUXh&c8ObSxAn6&D8=5urG^IQRuRJGyjLDE$Y)G^Ubvs7n)5lF~uJ zGo5$eJ(qjVmEK>E#;TqJz_YuoZSG>X8$_WS1?+YM-6$X}o_|WwzXgE1+tsjedDfp2 zKh)N-+YLOs8ygHD5Bn_?We3mh66L{G2m3ETj;k9pCI*lJe1F8S-y+H%pSA%wK1tMt zkSgWs*ecekJ?{Y!aI07cU}a+~%mIjHAXUoMvEzD}`7ED<0RWm1G&?=gDV0*`BWz9z zQPzY2Kv9-}A8DRWsc1r=8wNmPfH1kjJX~LV&Avjj)5FYX@%>S_HV8B!CYF{twBE>= z_fkyFgBYy!fNklv^*toiT zya8bJdRZU?SOyrf!5{CR0C>Y*DbbV~kH^{{1o&?r00#Sm0D#ujbvEgA(dvRm>p>L+ zqA0?3U7{!gKtu?`5E0?!Y4tN*vP4Tn0I+R4Z`!tvh#(^9b|0nJr3-}p6@JaA*94PU z^%cS}#C2VgBuL3^n;2Q74&JbbI-9EkoBb6`_Hx`oxBI}n)L}uO@EtEvPIbiE9n_Uo hH&B)R&m8=}z&8ltc2&N%o0I?m002ovPDHLkV1hRAn^gb+ diff --git a/src/main/resources/assets/ars_nouveau/textures/block/redstone_relay.png b/src/main/resources/assets/ars_nouveau/textures/block/redstone_relay.png index e33ac023839ba8e94e492c00e6bc721947197a91..b0da26d7c3c239abf19fca6ad1cfcf3fea974f54 100644 GIT binary patch delta 757 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 IM6N<$f`hZu`v3p{ diff --git a/src/main/resources/assets/ars_nouveau/textures/block/ritual_brazier.png b/src/main/resources/assets/ars_nouveau/textures/block/ritual_brazier.png index 4975a7763d3eed46d82c937426ccfffea4772109..2874daf8d28d4cf353aa7b8ecfc09a9029c359cb 100644 GIT binary patch delta 1358 zcmV-U1+n_z3g8NmBYyw^b5ch_0Itp)=>Px)8c9S!R9J=V8t_S zJm2aE;MRB=z`|etceI{k_~EN*03s`g6aYtEy8yr2WufhS(BsAJaN>4233|Me4|==+ z7CO|rOzxc(AfKr|%2+U8wa|8c{ffQhXA0zJ3girfoMDikDUh1Z;dVI5&lFg{VlScA zWhBQ(st5oW4}bHPVTR^+T4*~zINUR@FA!R-U!!`IiyONI7k{?ISObt!W7`dP)yyUdI_&t2Cc z)e!V}$r%O!UbPgUIm5uKs?rK#-i%onxP8?}8UL3HTz?faHIPjgWaMYlrKmRZKmK9O z0yE56P+@^BYxb24;Bd-cF$A`(*~k3{hUD)*Fe>;b$pVW2gTp=2MB-NrA;jQt59$0P zxhb80RKY*33mn2kVv*Sz0(QO{ejWK-YAvuZ7$oTNa_RUHf*vnj-6x6P-EHYTF0wfMeV3A&$zmtGBR;5vvCu<7s5*peA$3Abb{bnqfud;Lh z$CAGp`v(Bckz^6BmNlaQaQJkGh zUw_v}Qu=Bx5bM`=UE^H;Qeeum=J=lPh#uYsz;Az^lCE%3yuxSO?hy)W+#O%cd;9;! zn3~{pZ-i{Rz>Y&DP3GzanZzX7v`-3=Nm#8DJ-iLg<0d|pw#+-AbwvO*(1bBH!TYc7DJ}|Y@_S%WSSw#N#=!o?96f(f`I2Kr&F^Hx_J4~Q zQ!scGAj6rjSFv%|7|reLLFq(syiof^BoJ9Sq==@`(lMa)b*(C9)3g0R^E(NJHGF!5 zbWsh~) z6ixw5iiKmv z<|R==t;_J~4f3<=+ReXY9Ay%d6}17twQ<*&%wd472X+_r#x`!>xFF|_o zKxHowM72gy56r1*{^Aj_kc?+h15LHI<1%afG}s)yL`%m|h48}cA}wp-Ki=Hu>fVCq Q6aWAK07*qoM6N<$f)>G_p8x;= delta 1358 zcmV-U1+n_z3g8NmBYy=aNklbdB%}Ep{wgnpsY$l3-AA~wiS+gUG7133zXjW{ zA`tT0WG6q`-G4r9OGyzc2RPc@PWpQP3?7&RHL-wAcJjLk!Hgc54I{}3o9yJ3hQJAr ztb)S0%k9cMKlp=J_jHq#PouM$Rw*&=fO4 zbB2MYDAEh!z7^9U@CVC}68^6c_*{2pz(i(JX8uIR%ztVtKk>W03aqeJfy)CsHtaVY zQ00|ZF$8vO*w0wjkbEp_xcJ>vflYy<-R;sv;wpwv;%Ij}nZh0UQl@an#qTu)Rl-GL zlGPgmPF@aYdOwp^3oML8h^QLB9r=QYs`1?JgZy)Or)}@?S*;cjvQ;r>@3$i4_i^gL z$MjwaaepHPi=yWJ8!32leFo1XBQq-Q6BarX$9dn``>m+f6<&YuL&>iV-Uc9``sw)A z>@6L84g+tv6|lN}rtI}sxqH7AfsmJreR0>~qxqbacYpFC$B%_wb7UW|CY|`G6?5$c zbD^Avp_Bt+f-?!N`QdClR*WPkY$YZ-ppXkwlYc~1jm0azwzXj>g+SD=vl^^Q)Wia_ z?gfVqnu(@_>j9Nuw2n<%uE})*s-NZ+EwTbMMIoU2%|_&`d*{bRvziM7U2zhp&+zw& z^Ngp4Y|n0uj@o+6Xg`k)PNM5MZVm)^_<6_=XBg;;GnVwQ z=Cx*E?!CZBCm2hb>&DhC!$>CpRVvWdxr>16Cz;OJ6!QV-dXCt-Wn{B)Y5DwBKu=Om z9LpL6LYkCK1*Ump^LA<)%#-nWYKWIw^M5RinA`hAe)^oDDGHB2x~BnPwK*OwL%`+$|F2K(s#=m)A}MV4%CAZM6cdCoA1g+tPE zab^(Vu*DXj?W=b^e|_Iv1W;>3N*n|?UXL-v7kN5!*{{z*r zBD$VK3D;8{D@wPIB|Y^2lHztxl5_npaQgB#bUjB+!%D_eL!<`XKQ9#>ND>LNrB>?- zfshwn&yme)1fzB6y7|mVCurIjm49CQ@#kCIzjz_ptmZ1oIX&Qnb^q^=XJmeir-sO8 zHIg^?78{$lWAz%qrEAw^9vSIGSw(zLzxu1pe1K=)+F1-n>llgm%6ng)J7A03JDuj9 zE=sT5!Y^++i&`6EpsPrJIOBRQ6;Q(U1fz9wkzllr=z^uPDb0rba7O09Oh?Z}h=f;M z3J9UxMo|f@rE2}-5xJ1fYQ$5y7rxwg&vWnlz0WC!`_qnPW&zNIjxeH_nFWLq1%Ci1g?X?AfOp?X7MBJo z+BQK|rD)r{oO_{E-E;wd%gplWYcBvnRRxlak7W_Y+2URO^UChVq~ra5^|aSHE?59~ z*P0AyLYJG53l<%1t!P4*;+}9RpP{9DfWNC&H2P zo4XWk8xfAMw|}`JAMA-A?X1(%J%DFggd-K=E!_jPR{&)QNYc^PO3}96Rb>cGxTWvx z8v$jA^y&-%M?33svt?%K>YqQ+^W~ZiD9*n%2f)lMR6JM{y1a^T1lK6iNFZcT%4fKK zW4We7cN%|sb%sF5s8}rJGj#Ti@cCmq07d(Npqgar`G2SsF6A>-`!0j;d-8VG;+G#c z;0KPk;KPwhAp%aVcz)8t7kw`RiT(B??w&)q2ptEm89>jOA zO-`g(#qgRb)(eACQ8ZuNo6P}@-;R&}5=Om#wn%6qs z)^!Mdnt#yIgf9Ckt8sz&`wtzobPu@GQ71kTjv$Pv>}w!oxPfva3B9nBd9{&LkEoIm^Yi$Go0000< KMNUMnLSTYca9NT7 delta 711 zcmV;&0yzEs1?&ZoF@L5>L_t(oh3%EUOB-Pv#y^p8BqllVLed;+6EKQOYnE0F7MGH} z;9?iY?*0cEI}{wcId-yxP`ZgAR4S&{L2IkQAK))YOt_OI7Y$j`A-r!BZG?D^d6t9s zzVAKH_t$fdv)$QRwU_}wQFZ!9r#RnR!=nY!Lc^HZG-WdffPaWM`8 z;hc9}czf9Cbwa#{DYeHNlU*ZYC$2J9cv>;yZ4F#hc0LyaY z(Slr^>_}n&b$?)}-kyfbBCat8Qtb)QLc;*`hOeAAezRI*w(zF|%n&{21f_U7l!P z(}AMu3{J-}vuQaKhf5n23u-7oI-<)V}*Pz$r@E_+bETqBZ%i#Zz9q zo4}(5?SF6s(B;vB^p8%-zPbWF)PbQUClpSnsJaxmwUCnH?7*pohS{7?${z|q^lhxA z6aG0qU~DFQ$0r^vKur7Kbew82gR!xHuM+~?ZksIuWiv;?aB#S^K{yeS`|i<#l+7I9 z-hX9mrfxpvqYM1;k)|!MEdXF_CJfXw^LqDX_CQ+;DM{oC__*A5<9{S#ftD+Dw4SJm tK3DQ3p1n!gTDJ~5=%9lRI_RJk{sLAqY&jPsLJ0r>002ovPDHLkV1j%+RNDXm diff --git a/src/main/resources/assets/ars_nouveau/textures/block/scribes_table.png b/src/main/resources/assets/ars_nouveau/textures/block/scribes_table.png index a9904f5f25eac5cb8711cd8d52ba3b337ec6ad56..4b0ae189865628b5f540aea7582ada581dc3f3ec 100644 GIT binary patch literal 5232 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 UM%lct{t^M*`-X^04Ts480WuEw$^ZZW diff --git a/src/main/resources/assets/ars_nouveau/textures/block/scryers_eye_alert.png b/src/main/resources/assets/ars_nouveau/textures/block/scryers_eye_alert.png index 3bd5e7cebd821d53b4c9c83bbde6d4aabf92bd73..e04b055b4f7479e0840658a369fb5515bc34ae5d 100644 GIT binary patch delta 953 zcmV;q14jI}2iymcF@KgxL_t(oh3%G4h#OTL$3L?PJtRzMW@yMZ>#~cY!3Dc4dlFiO z_29u)DGGwf?rH^lQ8sJ^OAnPcH~*A^6v5)sf+rOedhk$-Tf9hFy1`&JETpU(6K0ti zn`uS~4e4R>UMHJuccPn{-^+XR-pu=c=lAD3qqLg&7Hzav;(ua_GG)_RiOccYO_jaG z(Tu79g#E;c#d+?V24OwHebeCTTg!~(RkB}PV)nI@dn!O6>?fapcLo4+%S1n*^Jex4 zHx`!%LM$+(OxdjFRla)p8vxRiqg=cAHRhJdjm2d)El4HC2PdGl66er_!-(d+`RSvl z2+zO%3b`L|b8h(^fWf8!ygYw6k!5QrM#cVz>o<#3{=UcT*z&&%eZVnnctPfSfN} zJ_yP*%Fv|JA)p_%f_OEra%jR~HLpUugM?#F9`p!Zr%7r|#dRE9r-@Z9pe4J{9O_=` zgB)ZB2}INoaXkV+`Hn+sOqJ2-g}@O|rfhCs9rXyek&kHj9P{^{&(|%Z=Xzfe5RTc4 zTsWrdG=Jrr1K6gE>oj*fH?RP|WA-8!5aG5>SJpyA4H4B6XvuWfxq(yQcg*7Y8c#m) z6hHmC#zwisXlh(K=ECK>Sk*$uvsyBZRju_rx34bnlNZ-J$-#3>t7=fU45C^Bc$j-F znFeLL>%71z5aePMq+$fG2Vc6n-d1Qt-Y3~V#z>uI;6*aj|OCtP|j3c$&W^^WU37ZBAFZIAbU+v0kJsFsk# z0)OJ#9~~{3X6b{!{+j?TndVrgAp2T4+ji3txN>%!)R>BGy3A$^96rA4ZG6&sUvM8# zrqPmV9(($Te6yX%1!m@Q^2-RYFE-qDPhU0g+1q~-*CW_wjM=PbtvlsBqK0VHDjYsu zp>7ScFE-q>V1o;2-6F0>n3>CQPhyD&dn=l&2R(>-5G-g8UW(*Uqz$G>MM_8l%bImzN!(>+mYJ|$ z*=4Cr50m%pZZgx%((KLW@_sGv^UU-Am|4aCFKM$6du>2WQGcd(vDXIVxO^wfapJ<2 zumTWhC5|r4ao;ou=uz&Q2G`$TC6NrX_|4Z`eDlL&6(A63C7=7?MF7mAi9V?F-s1DD zEUb2gSfEFl+GQgd=KI;70T`PcV)@G-F^eWE3#;TTh(|}dC%|4C;LJpYgyuZ?)eE1< z!<+@_%oceg+kZU)!hxIxHDga6=z}`x%vRTkr2uJK?&|(Q*c>7g0Z?5y%>O4SqLjX>kKb=^l*b||!+u+unG=+MVi%(nyx|@W7k3avN zyy4jV?x{=Un_1$gM#wj_a=)7n1YSD(vacV$^3jf*KYyxYt}LIWWGeLQPJ1IpAc>(_@I!UN<9jUzi|vs`f9@5lksG2O^T$1ItO zd~$$lHGfFSR6K6&KtOB9bR!oKc2}!GnG5~8O>ZPdNQ)l2*LMh7J7zkw#Z#kCbNkON zcJf(<;v=$SPR`FBO1O{~^-RK!s-TrTooOcrr(@PEgJ!uvZzKjhjD1LpqMaUlJORRL zK@P|foFr_Pf2C2ZNCAyv1%RPvesE0$-vU}YCVz0KONzO9H${HC4{rVOP}p$J^Iqkb zFDl+e+Jfiax+d)fWKwy>)(Z!n@a;g&GAP`XKvh%3&Y$au+zq}3G|PnpH63hA zwyq2C!o6>uSWjPmwrzdv0(v7cR5b;N5Y*|7#F)O^?tl=|>P|?DlKE-r@dSjlD6#YB ze19k5=F&Ft;S|+skSAZCAvBuUKWVQB-vUGvX(c_X0`!@2xSNvelY@u)+i# zRqOJpz&qysx=o{4AvBtxSuSvLFzlMJz6DtS{)MX6(PzfVFKx^H*S<=7zv}q=$a{Ui q4QrNxJ~K|ESb5|J#{cLP4*)%lsM=9J1`P`U0000D5V diff --git a/src/main/resources/assets/ars_nouveau/textures/block/scryers_eye_idle.png b/src/main/resources/assets/ars_nouveau/textures/block/scryers_eye_idle.png index c710d7d246273151cff0baaa4437a55a3478c163..288b2c85ff1226f686a489fd111d42509da888a2 100644 GIT binary patch delta 924 zcmV;N17rN12fqi9F@JeUL_t(oh3%G4XdG1>$3K$|6?U10nZad}jUfTi#bO&mPKCCI zc<^8&RPfpqd(cZIOH>dK70k`rqLd<746Qf+9E2V`XtBkMlqI{mxCw!jn01$_Gi!I4 zK|+`DF#BF+vzunN&EEW8-kW(d@B4kfKi?T8Xq5xn2nw2*qJK;`2nw1UZ{ATkNSw;6 z3c!#c4hkB@a!67vtE}7@=jNSoeEs}a2TC5rusC&Q@hkujZ7W&2y8jvS-xB_o;FxpUmX~+6c7|Nww&;y^z&W0uvz{y9IG1xO~J63 zh|}sLV;ng-L+OVV%+V7715Lqjl>FR_pRrlpfZvehFxVm-Uij!2s@6`J#ax^^Iv%mvv-jwr4Ip*anU*Nkfl4=4#&KItYf--|LG=HUZ2UqDf2nfgQMJ^oEcU$u001ey6cUybz8(TosF?*2< zh;TP-Uw_s@QcaN3Gw5cnYv0%@h&txl`YO*o`#eAWy2@sCgYoR7bj*co4{++0j(2r4 zhf{C%+_$eTh?1|ZcalTsAx_=Gb1YJN2H45HZstIl>Dn)L3Iw?r1*sSzEJDw**lyP3 zz3pZV&#_Pv=ak(Z0DVLtu4DeVe1z(~sC6Hc1%KHKu?1ZI?m;`ezXP<3O2?^-_Uhec zAw2B-VgO)dKYlzXbm|qp|HPzWrvcE6By;)7K5y-h*aAGqqG6{aJ?(cC+rS0vg{$XN z0KE07*KvK|0#bUW?eXDnn`R_Q=^05ZAg-g)(ajvo@BZ^-0(3LST)ravS~%No(-F9S zVSkeBgi6EqIkQyZ_~~M}aIy2b_&%V_pqn|KdEtaS*l3Y>a{+4&ON&DtY>F#bos_!SS3e4r7P5Mpxx0000$3GK8>}F>Zc7`ljcS$HjZ74AzD! zEK6lPOy0|EveV3x%+2rRy*F=p-|zeV`Od6j|C_eig`J9uDSyi37IrEs$HfN`juYpv zM-+fAL2Rd@tfU>1m2`yV+e0iqaK=j?et)dwZgh)V$L22s@XR!v4L!y)(_m@-eqiJP zUCQJZE9nT|&i=&Z58mSQA8+zv<0%&|POvn8pS%T$*va4o*r_Pvr>i72FiR#MpT8kD z^A==tYZQ$2;C}>&2;?oO8{2Y2AJEC>)&e7z0_;?jyyYxb?>&|qo9Vxuv9KO!3cAHa z+*XSxd2MEj)jP`!zVs$Qpeg8flV2IT#b#k0{zQ^PutnH??bF{W7<*wBb8&0;JP-kA zXWsVp!*@Q~l=J5~=F;K}WmBPFcMMj{C$7$-4W2@I;eU$KBA^qsf_NnzVf=K}an9Wi zN~R-x_SKiXKjjdXO@+kpHf6JyvZ+wFjJ9WX9f=%d2MP4+HmbSpKN*$IRx|cxB{O?mk*$v#`!k;-qxUiL0{*3NEb0Jd3cS zE^w1)bFJjycu3tcXjY2!^u>X_+=sOo+Tf|92@s(c$l zu5BUs7U0)0&4(EZ8@=$`AA7=v^PcA_zkE^kZhul2-gxg58D2mZl~-=Pus;&MBT%;t zig)f(tAzki)eP}-XF4Kp2j2pkmEyjh4z(0p-~znx_-iNEQ**DktdCtlPhT8W%>W_= zJM{F$nVM^jfDq!2PFRbP`(fc|0>WC1__;H_i*R*egT!!#S}nxO7pDo2BzJdOJHodB zVR9mF(!)AHpB{yW8M!_&aPZ$%M>Vkg&CjUnj=U9k=e%FHX_TsjN0KxvMNSMv+7_&D z0oFfHP}Lpu=}`&`8}j+Px3b=^I{rHJT;FfQx@DkGkJ2brpZkIFKRU&K4ji7;iJDQ& P00000NkvXXu0mjfuHv}7 diff --git a/src/main/resources/assets/ars_nouveau/textures/block/scryers_eye_sleeping.png b/src/main/resources/assets/ars_nouveau/textures/block/scryers_eye_sleeping.png index cb3ce8a18171c22824f8c72579783bd8d7ab626a..c9ddf9f1683d9b8ab01dd67b62a5a621b1f2f3fa 100644 GIT binary patch delta 861 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 A4*&oF diff --git a/src/main/resources/assets/ars_nouveau/textures/block/smooth_gilded_sourcestone_alternating.png b/src/main/resources/assets/ars_nouveau/textures/block/smooth_gilded_sourcestone_alternating.png index 25d4a497e6d895b2022d7adb44fe9c81c2bf0a47..7b7cb1311a104247d29529ed018137fc27121760 100644 GIT binary patch delta 597 zcmV-b0;>Jp1p5S#F@H5lL_t(IjeV0%OB+!XhM(%4D>IYS#(-6nK!%FY1PUTul&(s* z{R<*=<)Zx!;-ZU|T5wbP54z~CdsnWC2!e`Yi4dh30-1C&U*ygNyBOz6qwP@;6oAO<^5gRpq%i3BVvf(R0B9^Nf}1z+LxmIu0)Xp%zP$ZI9M}MC?937eBLL!H zM5Gd$HAm-yVFrLLO+>#JxR?Oys4V5e?ErApZlSUiDGY8aVWRl!-S9&NKz(kW zX3fEtCM(V|&3~Fhq!Q|L^F%5^_@N^5x@_#s-gHKfDTRR_DyB;k0INKy^{~p5s4PVU z!;BB_9#ftYz=Gbd*fAJpIu{2c8cT~~v_#jxL<)m6HS_&df-Oy5kfuJ7N>Et}E=27_ zzmvj1+{gK--Qsy;iU0Wo;OFjsPGRrx1b~;%o)WbajDMSvRhCkzTC9J3gy*_M-tRm= z=Sli4+#07ETc96p0pmmlrmL^`yFL+qsKz)Ksuv;#!;EiRs|3T0^3=l3DS#}$3zyzi&X}CBEloJj{Q&Sc ja_Rc%m{%^NTd({BuxUPF&6j>o00000NkvXXu0mjfp(7@E delta 567 zcmV-70?7UQ1l#|j3cTwo7^Vjh@JgI)}Gwg`^cYhGCF6uQh#HqBH8O7QL5H#)?W7X zrO7zr(Zf#wNMUA)zWw0)@fo&b=m)$&A%%$m=x(k85cx9zzJ7VG{m7pYs+dmG)iHmX z0#KF~A}?*;^1VtEPDbYd91QxXG(ifJ^4#50hOWqV3{;x1@cQwaD*$Iv6#4^55)ac{ z(tfMnz;+C+R&RS3ap4V-!X!y7074a0mR2E2sA5!_zzD)Ytk0w{5&zTqV9@8m-8@Y73FV8ZK$uurY3yw1$0DgrdF1)0`$}s%P${)0ePIX1wU{?SD002ovPDHLk FV1m8A8BG8H diff --git a/src/main/resources/assets/ars_nouveau/textures/block/smooth_gilded_sourcestone_basketweave.png b/src/main/resources/assets/ars_nouveau/textures/block/smooth_gilded_sourcestone_basketweave.png index d1403aa773a623218572b75470d878e2807140cf..e8fc0a96cec6acfe7847c66231f86cb04da63aaf 100644 GIT binary patch delta 559 zcmV+~0?_@r1k?nOFn1uDlP%eGQ>q8G#DWFA7*N532N4m$ zlO8;I^ytMy5l`N|*uPNy9bUy#D1|~&Qi7?Zkqv>}G@0xynd}k|$&6bm&T01hzGdEd z-ggRL-|sF)p#osziVMIfR4AEoG6;C|@V2crS{>?J+qixSfPWu{M-+emk|>#>WX32| zeEWV#qt&rPqfqhY^D~sp(CHl4FR`=(xPA#o zlupNN*oQXA^<%JY+uM( z%0?nIMyGQeQMMdnodEE2c!HDbN7L|JU%Ytw0F#48 zt3#eiqt)U0ScMVx1sNFpRH&^*PoF-fD0-UOJHH1R#tZMsnVFz%nuU$TK+T z9#b?Ynzeq(K~DlJGoKFw*1VMsw@TsdlMf46`h6PpxpBFMoTd0{f@m62F0TVnTfNj~ xuSKDacFJ|}67k`w@Y;b$$fN-n8U_3Nw1 zNeb}KyBLJ$jD&+u6I|g~9wHqB@MCa-n~VP(2YNyYBT@{;%0u0%Sf@a)d>Y0X<8(y^Vi`FZ%C|2Na8 WO2Rx0+YRCX0000GwM`3o)tAi(5^3KkiotgJ` zKA)Ve0rFHa8iyFlA526)R+^354HtkR?|D9GuRbq&8%!oev-ix`=k-`yLxex#NjERXBqilF@k-_MN*gZ~I&Fda$jrEVW%;o+`5B ziZI^g`NSt2wZ@t~2a(hGclKooR| zJHmFLiWPeP8(C^zy#D5NCriEY!K_NGQ4D5P!ri?)m`4oS4~VIp0FAD*Dj^EGb`*d~ kc1;v??Kuj%o6+=wKT1?Q&}0ImVgLXD07*qoM6N<$f~=e6N&o-= delta 458 zcmV;*0X6=W1n~oqF@LK`L_t(IjdhZ-PTW8chCeRrJ=x|kCmLQLO;V&wl_FAFkbp8p zN(5=6JVTn)P)4FigOr9m0xv*A9qBF-ie#JB+H2j~7AY>fT7xsvO0zTnzdJMkY<&Cl z^#P#F4fCA@XJu}@|G)V4%`Fpv{o^a2bjRo(qx;c#Xrjyw7k^*gVRTP2d*%Voe@p-{ zx<^$ODWY`+2ZxtF5rRTfl^q;_RK`qWsG?J^7#PhG%s_*_027BUcDH^!kqxtLk#8m{Yww@p6?{=A7A-c zxD#b=7&PukPUm^D1u(iNz5;lvv8t>eUYQ#X4lhT^s;Q#;t07*qoM6N<$g5qn~ Ap#T5? diff --git a/src/main/resources/assets/ars_nouveau/textures/block/smooth_gilded_sourcestone_mosaic.png b/src/main/resources/assets/ars_nouveau/textures/block/smooth_gilded_sourcestone_mosaic.png index 7a00c7fab58dae8f2eacb6afa1e9803337d36b22..1662bc35fd0589d36c3b35ef91e13d692cbd82f3 100644 GIT binary patch delta 492 zcmV0GmtEwGd|sM}3mzue=#UR+zp4tC_E`Aiwt?IzmM zPIY4F^DG(*01Tp=JLf1Kk<>lW$1?M?3?Ay)>pK5%KnGT`1&X(vq;ep8HuU*a4pd$b zagfXCj7AHo9ON>(GSS|?csG&z%s803-`_W>%lR({o@Fa&wAyN4nR+slMyoyLK=v#- zcvbs}2*!A#&r;T)dVEIP73$U6>9W!l2eRkN_LkbUZZ~g#@c$rBczNSXA5v z?NmB+5v04gJ9YAZ5NDx_dv#C{kxXU?p*gWB34!aGyX#kSNj!)2`*Nvg-|2wh|Eo-6oPYXGpaxBwjh z=!FrsVUfmrVMNd$VjC8k2u1+hxLiT@L4Sy>G@dNY>9hg(@v8|yG#mi_OB z97V@tf%4qE8hNkluzK@4cF6$X!|r#I{4jJ`y?a&pQEk>a*9#-Iwm+${?UKR62k$ue z8K@5>_k@q<3V)tHdyiqx0Fc>w^eP50a~k`HEmjs6)UNU(QoP&S=T_yK60SDuWY(6~ zV_nN~Ue5z?6dh0X(QrVLd&0*ytceF_-P!9p|KxxU6bmKFCpk&YfxNS>Wm9vY{5mTK zW=>-;$fxGO%xOv_^ZfpcSne~)!C3wDzDX|Yzd7(+L2<3oQu|8Rlb+NXt#J-EHg~3S zPz<*b!3a!c59T(ZA%eN9t#ngVM80000=R4Mi`rAZ`7=V+@3s#mZl*$DFd{3f7irC=k$Vm~?{C_-85GqD$OsQPJ_oOLq zb^3g7btufvn4-qV+ei^3MT{MUik)g305ys5J&B$OV5G*ZE-aax6ft|7Jph7GVQsB% zCu$Oz0@rpZx_MKqG1qoblPH4&*iRm<8NPb_H0Ly~^Sb*W^ss$T(m1F=@`Jt29>-^0 zif*2{Yh}|VO@Hgf?g?sm!TaVt0IYY<-XuY&%;!Pq;W#${h@ya%J-uhmTl-++!JP~a|GaS6ZIc72){m&Y`i2xSU%vjN)#)4W>$}iJ zjf0xG9oKfS($^S-ir%2l>cSFmb)AbhZvjx4oiTpUK8T_K>*d4O$uxIg4l_Kp2c~bM c=;rwYfD`{`MZN~jQ2+n{07*qoM6N<$f{J4aKL7v# delta 529 zcmV+s0`C351h)i`F@Nz%L_t(IjdhbTYZOrwg}>R%4D2jXHnC7x0|sJYB58~WhK<-* zS=od@79pTE{s2V~L{i$=q|F~lD;9!SrU-~m5eC*pXEDv}IC-;g@y!fl5#MuW!CMXY zygT=vbI-NjJbYD3Q2_Am<1x-etnnJI8>hnCwk#Ts*M2bE_v9KgQUT{V35_*KqTT<3N7Q5w;RBgsa0A1Mlk1Hqvm z;0GZ|s!SJ6OMe${^$rlfa{#Q@4_=nl$D=gDan1vfWeLkm9i%8~Kh(v)#wXZE{o~qN zT-yOP0YK#$eh?DNQ`+9SvuXZ*YklnX)oW(7uiyLpPZPb;`*&~DG-*gtaQ(ttl2jRW zHRs_#7$4{+aU_{bck4cQ7wrH!V>Mwo5JqLa%FA;dV}CR$3ciS^2DdiXw#(|?ftn9m zZqwwoF4eH7_pEtqAFSWHTEpR=7moVJGypcb`v!Rb=`(&18t?17s9JfecR-RVT-(8_ zUSpCfevCp^78ZfC>%4OD5&+)pjPZl^L6#+0JGUQ|)7)cuTH~obFnt>>x5*!7rg4jH ToG%yv015yANkvXXu0mjfw=ni$ diff --git a/src/main/resources/assets/ars_nouveau/textures/block/source_collector.png b/src/main/resources/assets/ars_nouveau/textures/block/source_collector.png index 04381687983546840670a33354829b1ce702adc5..8e86958da5fc4af03c0ddedca4cc46b24f24b0c3 100644 GIT binary patch delta 964 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 Xi*!tP45OWj00000NkvXXu0mjf1B~2w diff --git a/src/main/resources/assets/ars_nouveau/textures/block/source_jar.png b/src/main/resources/assets/ars_nouveau/textures/block/source_jar.png index 44804077b2c8905ef2b45cac39a32f1dc359f98c..6280b44e78842e0b8bf8fe9039ecc7fd91a1d859 100644 GIT binary patch delta 1687 zcmV;I259-~4YUoAF@J7JL_t(|ob8%jY!p=#fWK`<)){tL+QQWC+G<*{7;GiRpgd>{ zPvBn+E>RMaJ|H9zHTaVdkcS#gj2aV+QR5FLDhVd?(tz>J7<@6}L!pp#t!$uVTe=Hf zw!59lK$G=hdT(c!wmVyAfSCDSW_RZ7+wTYok!gP)K66k-9A$=-5P ztdZUC?^{R=fT7W=td1{tCHL#6UocU~V_Js1uZA_6VvQB|YxQrjD5hnQ&=b7z%D!?( zdz>rz0sxupWg@ByK%!+OCBtBFco=}Sddq^H`Eejsb}N_3X4v%j69Ak}os-WJ`U(>I z3IN%zA2j@Y?0=__Xvngz6VWs>*~|2Fb<)uuCl*~wW;_SL(WBp0C^V2AFVFST!E~B> z)vqQB*duIO1|ye7rRn|h`w1zehBcbZ#)=>QIFKsW znqjwcf1Wvo8n%@c{ScqUeZNou+V6@}GED#?s!BvviGM|x0`^h>q&W&+TH7_RQp=ll z*K%UL3nFS9K(^o97^_$sUehq!uu4K-K`gqIl4+93UZ%M*Mo(8K5mlv7obtT!t5>ps zJ-A}v0oi^;)3B`TOce5-w=GaagW@WjPoX$PdSp~SbHhM(+|{xWa?6`_Ol#J;I!)fR z47m#=^nXPCnz=-QS@SLwr{qj0T2=y3G7JjEDQS{JqgNMHN_=-K2hhE0)r{kP1c3C& zsN8wL_7Q%eI2%yInw*8yg@5Ed0P}*~nfdnjYNg!DIXRs=CzqkvdHiO^0ur_ln3;8$ zoq4bwl5mFe&8(BQSj4qlLQlwdXR;Y43VFE`-G2;1$z*T2d(|qbY)5;X)2VaxbaevA z&%z&Ucy$*57YilYVi7JDN;fFwq?X)5yTr{vX^J&6I6QnqkWZ=oH zC|pbKR-*_{n@skW`?jU#6xw^JO`0Zn8wxM3+uk8_frzT|+ux7OnG0-KSD6b4=G*oL z(|>7J#~*ejcdKbo!y0aL0cXbMWhi_rQTn!}=sS$7T;PN47nz>9=T#_tt66j|@PEP6 zTwuPmcd>FegSvA8uR~!`k#bgn#BL*kA?Np6+jYIvoeOv!3Jb?-CqMQ*p}2UK$@*6p zs4EwE;Zc7=;cA6}nGA4t=KU&;D0>gJxqr?D`VMO(57=9qn^4$|oG|%JHX{{u7D$|h zQRe`8g(BjBLUD@Bc&;KB5Y?ED_P893h;kVU^t9jrb&O1U(Vl^p;qYdz>|6sZ8Ld+;He z8)JZ7jRAYz3-ABunNvjdZpO~`J0b^fi0a*Z_Hhc!3bEtmGNoLaBmJF(!*{TG~GY%Gt?L$uM|s(@9_2 zt40B&2j24h1lK0V09dlDm0kNyMlOw#&=bUaY*Rdb=3P&tIAQ8Lw$7UU>#spn-&V0K z{GtJ%>z?~)zbnqQ$uT+~dy&rdA8~DRj1BA7-%y^qTc6wOFP2g+&G$bn;eSYfr?h~t zzX|c#$0?$Ex2J8*MS~jFh((vmNN?iO5S0G{ATyqmH37ev4i$NB(@9wYF6Gjc41>)Z zhisqYGfGpeQ65b#S=LJa{3-J1PqAcKDvziW<2Mp3Cwn8zUq!BnmUi$-`Y9Jbg0O|FB6nZv!di({eJ-Qz1rvaHS+?+vCexu-u1$`yd#k;(eE98}Igh)iRo4Xuvg75U(W^K8oIr7gyY>uJn!MW- z)S0`B6j#h>wRPQ2$eH-BGg9k4PqiGc5%a%!+g6SP0s;a80s;a80s;a80s;a80s;a8 h0s;a80{#d53;5g;dk~^9)N%j-002ovPDHLkV1f;&ImQ40 delta 1742 zcmV;<1~K`x4eJe%F@L2=L_t(|ob8%jXdKrSfIlY#o0%PVy}S0x+LdHs$yyt1OO(W| z(jSUUXiHm~2SGz#5-{yUNNMR?Akfg#=I0><0yPx;Pzb@LDHNL4gw}?{4|e<{TY_q> zAJ&RzCGASP8t>0&<(AFE=-!=KOWu*Z6QwZU%kJDcJLlee?teY^oHM&`eEfxmRj;9j zG-8n`0wZt8?`lW`AQp-8((A9#j_KSQ$CC#<$z6H(JVmpFRj;}9#UfEx`#=8vmwjy? zxC<1kUL%!Ap{puK`;x4dOnFmRRRB_5hp5zQOwP;zFp}tcXlE`?WEx)OjJ(13zx8bZ zZe`}=y;R~Lsei;l0IAmx9#cb_R8+6uN7por{0gVj103y364@WdSS|p#tOPKTUv6ym z(8>Av9m%bhOzQRfr2G5ORn`8~G;~dS#No9^iAADJ&dgxdYb-3~rO}WiPKg4&@?iWhYEYWv3Nq@z%0DIZ%s!C*k7yu)`0@zE^ zxfGupNpCx-1M!4sxmMq!t4RQaAoZQOH z$!#c39=}ll83zcfL(}rWruA1Snx$!dfLdw-ToB~sGS8hL}FS&}Ew7lGUYX1R*7 zT;OP5l3STMPNxT?2R_=DbUDF`6Pd6ZiYpFKLz+B; zopFGmXqM#CZvAxP429dt?KO(`R;2BosGE!ZeK2PA&cw0?qn$ZNWJd>u3RA3 z`+svLKeclKBflcg<*_sFTtKkhu{SwC&++6}J<07gyUqnV84B+u%JbdVcz*^@xxl&p z=6T$yPZm{2j0C;q0^mKw^(rSEtACyR*ll9q;+~QBuP&h6zFg!+)>|%cs#0X5 zzw@DR>wtmH46tc=zltNuh3v5BT;Tmhjd3~~3X3Igczyj6L=XqM!?qWO>q?GnYg#4coqQQvEJ#BT3J4Qagn>joS5a!hx) z1LuFQ5{@N^9X<{~acP=rG0(=mMF0lB@h@MaNCn``$zkHr2w+!Zz~1-5``?(l$;Q1k z)(d5bbhZN<_ZC_F=n9pJ%E(WDOn^2DM20Q};O11v1%NF`F7 zeAa$7_2Cp9jpBr^uMCV4jwJ}k5)6F(CvqzYU*s1GK>Ela0E_>N(*4voiGLkF&fN7s zGj?W_Om@Llp6W?#?e%xddZEni%S9sbEJvQ{C)z*EmEXRJu3N-MPjpn*Rw!ynlTjY9 zIqP=EjO7Bls`_4^8#)`KI(rv@QuZdgZV?{r@on2VQDTv(d^Pp*(aR diff --git a/src/main/resources/assets/ars_nouveau/textures/block/source_relay.png b/src/main/resources/assets/ars_nouveau/textures/block/source_relay.png index c433c5df9a4399ada6b1fdda1e576d9ee501ad16..6bb615b4be4264b9133d14202fadea95bfbffb55 100644 GIT binary patch delta 979 zcmV;^11$XQ2lfY$F@La0L_t(oh3%G2XxnBO$A3yq0yZ|W2SKh0c%2I+gP4vajGFq; zQbI32G_d+GR+nvsUIsI5DJ1j*mczp0jb3(GSDZ0MwvilsXjj^vGKb-r(S)rtb(J8eXAL=z=C0Xvf6`byUJ9A(` z7Fb?+Myx+V=J%`_(PsF`=xK{{Mi;>2U8O+yXz-S17=P?=J7~2&89m+91x^McHO`Iv zLXZDnYL#^YK{o(r$1m6`!efVrED^!>b6~43z>i6NVyu(1DsnL1)JaAve%-+`UZfvvjWgKPf)dI6S8w(aW-4 z`yll3-L*HF81^tR?AiGs+Q}R+BLDgm7XX1EpyfG#LoZl8dixIScn*B^^JA*Yb6%>F zS@kYo7ZbxCK);UdUc~^8&u=}#CmyPAUjc0>a(|(Y>1&{IMtC2enBNdaACNJ(20OMG z_-yE^76`gYjCBH#zVw2nQpG%AP-`e1{;8Yvr5D7KG60#BNMfv$r@#GZ`5y>H?%87? zo}6W7deDp%MB>R=0A{8KsVaJV1%kaCJ#`mF4g;d41{Ar#Tkq<3grVn2_Jn4~3E@fh zgntHX_?v0SM!enQx8&bgcfXxPk-n!~n!_6m+pmFUBQ9ST57NB==CyieRK+JAvetso zr*}jB`Q?ZI@#(jDi^F!M%^M8U-4ms|CrY_A$I(-FIi8p&o}8stStpYcEgvXy!8E@3 zSBla17EOHPSz8P=Pp#&hEiYZrobG*Q-b{_w^9IB9F45_aCnY9RM;erm>)+aDU}k!- z<)NzbeA9iq$4@A7PZ*iHZppXZ{O`%0?8%-0{0{}JQXC!0#a93T002ovPDHLkV1m5P B+sgm| delta 970 zcmV;*12z2i2ki%tF@L8?L_t(oh3%G4Xqsmn$3Jh7{8QhOR}!@=i$o(iY^{Z6SS&51 zY-N{F@X(xk+IsFWhq2pWE4}r!EcCF$mK|)nUP>sDZA2=6tj(pGpMyB%*Qas|?pZJHz0p6Bn?zTj^%E z;ea09X_jJkCOkE^3Ih9;1G@34#4uY0fvuRG{mKENKgilbk`KoJ1K^|U$*$1@*z~k& zrV#_3_*A07$$x5&0jCXsvvcEMX5ep28R(PMoEZ(k`kPe-oHjb~24poysl3B}<)GzI z(I2#A9O^w_90o8u9bxgw1KRN$`3&jwU*_*d^Z=QqZBDsrI2;?jIj~g_D3y1ZosRJM z&x9G#as20(Z?rgPOaZLER|#wz`3&ib9?{}I4@~3jcz@v7DUg@rRI5XjOO|@C;lRxK zXiG%USqIup0f58tmU3yBEAz8(@2)imnj^BR1IJB)Jy6$yi#;Xa{d8c$6EKY%Q?QdR z;c)16?-#w+9q3gD+D*aur#?V$KsBH3Ed!}Upp6b3<-fcC0?9LlQrHBjue1F7N{_r> z^!DUHpMSBC)f}>#V|F^yvf(f2mz(A$z)XTzFwjS5Wcu}zh)R5aN6j${^t8t-l;NsyA=jUoq(Qtc{vW~ z*Rj>B7{K=R-QTcFV=bhn6irT3iU8)f49dx_AJ; zfBTqIF7u6IrZ)Y#W}3N<_@_iuPA1u0Pc_rfb5FG zJ5>gtToMRgmCSw3J)kK?ywjI}M#k13g=<#c1j72Ga1Ai)dH6MRm>(QB%|`k~FPWunfcmxi7STV0T^d6Z8@(WfbsaGD;N{OtjQBQN9JY!+ z(H~^Qca9O?In;cX;8lsUbK|%}E~?cb))ta2f6$boX*{3&#q14DDIVEtDFe-O+g!8P z&u`YWmvP*oGiXZD96iw=H0!*#TfrT2u|tzCHBx>r%j@SiYgmLWyP|Nx-+7bKh|S-2 sX^g>9CxOV*Bek|#{}Y_x1SbIaAJwv4MBSc2i2wiq07*qoM6N<$f-I%$-v9sr diff --git a/src/main/resources/assets/ars_nouveau/textures/block/source_splitter.png b/src/main/resources/assets/ars_nouveau/textures/block/source_splitter.png index c359990d5df99df36ffd8f5023c1fded28de8ab0..dd539a09f6e1951510170df04dd9dd7a83b878f0 100644 GIT binary patch delta 691 zcmV;k0!;nj1>gmcIe(QwNEBfhhM!pn7k1eN6~Z+Tt2Mfa87ahq2O+}CUOd>zBueNS zB7qWJyp&M{osv+CFl{eh47xRD>_x&kmLlJ^%XXA+q`)g zq`GcIsID8ab$f z;^1HoJbxblL3!ml5H9lQ`UD%f9d12Q99_i#qTW-0Z0Z|;CcrKTO&Tw~wEQ&GvqtCr zDX#U)4EOq-=o%0*%iXGyO&e3pjIx?~OT4-`Ls?Bd!@YjWDm;X5r;K+_Dnwh^3zu#w9i{$&C3afcB8n)Yh$8+Q Z`~i<)!1=gmcIe(TxNEA^R$A4o(TduppO6E#*$W??25>ku-4}yq?Bv?YbcoLy| z2M^LEIs~1%MT>`mb}t*zA%lhJ;ACwOqEg|kODZv|vI{%wmWnkUc4wVQcXh^7u>aG0 z|C#yz-+SNte{Y26<5`^|R80ZE?`_45O1$6OimEBxy#0vtmw%rM*n|i$9LyJ|&BWze zLQ_$CJA#MuaXCPjlxJ*W&aUoW0)^Ez6N$RH(4>=032f(fIgF3XwIovl$*7y{+^*vU zYK(0)L=05o4RI)x!Q~Oz(Nq$0pPrEWbZnqT)f7v>h1F?X9+67C0aa5-XV=)y?Xn#E zPC$wY0V!td9Dj)BU;u-i5}~OVl;giH%`rRsx%AxSDTFwCr2*JW&Q=1+lt4PW#$cz! zt50&NrU&r@Jwuk{3>UzpZE*l$w0}}J1YI7H!^Q(WLnas0(k1<5Y~l^$cf)LL=tv@*I194g3=K^hM(SNQsP;>!6B2g>w;{rr>Hf5@a3$!FHt(NyLl%hWgMJbUjfff{3= zY6_~RFxV+sUig>Kq`r{|M*!H`$Wh;*7kj`l5-|KOwFM6B17R7jhrqW(`Oz5~JAC&`>P(uEkvJg)5}QorbuT^x#OXmUGH<#l@oL?u-b@axKZn%oZd<8_Eiip<6u z`CI{)x7C&bM}K)RfM9ok$(aad{QOdqMB z+fDkwUOsSAt_Tnuk%*4_@cKH*tcEmIUgyZE=QV#58uWpvq!5)9!R|oCg57-Yr8ma2 z@-cwde}%&*`fAk%Z1e$uY-ZC4kX`;vHse8-BvknwTZ(ASfYma-0000B zZrHF8H^hbd3tX6Jbis<~FCc`43qxYc!VMu!y0VcJVk#IRmNqStOer#^Go5HjlW{T3 zK*7>>qPw2eJLlfqbMC!!-YdL)TGZKtq@(}{czZaA>?5GU}`SHK;KARJ`oRcE3EPO`Es+m`v#2NbuklhaoMkv$qSU#3ibFzyn{?$ zAQN#>Rx4<7!IlAsd90?0iQ{-v9E@vldPH^=$({j8NmVWQ<@*Pm9+BgC6Oxi*r?^E~ ztPu@{=|0^jJ&SH;~B->=d^c4uyHY7^kdOsKwvy zzgK0>Oo5V~wr5~9y-ZRyb~N>4))KG91Ak4ykS%!-2l_^=k4E}HtrP@8cYuZF4M6jK zAQ9J(q`>FzZCV`mQUEX$aap_C&wFj&6gN{K=hti*5Pyy1)@t;DqkOFt*lk3jk@sMY zK5&$OH29)wfxyrJ(tHe;ZRNfsxjzoN+n>oIBb25|Y#0O0fYT7S1$ON*){_Iq2! zd*v!__iEF^CL91ulMCdcS#r@VOOp$hU~GH>O)j9x1!Ch9`24+S>zkBH?Z&aMZvy*Q zVh5ro7dY9ebM|JZ!6bLANELSkQjw2VE$7z=-cBE_x@&1Z2G}LI{;bB~s6VBJ7FuYbh5w5`HksQ1Q?0Gu00000NkvXX Hu0mjfnnheQ diff --git a/src/main/resources/assets/ars_nouveau/textures/block/spell_prism.png b/src/main/resources/assets/ars_nouveau/textures/block/spell_prism.png index f3f1c03e7d6815c3f8948a967e5e111c67ce3fde..9ad7f224878b1f4a10fd581adbd10491b9a728a1 100644 GIT binary patch delta 412 zcmV;N0b~Bs1H%K5F@JqYL_t(IjeV0rOT$1Ag}=&3+E|GV6ibCFUhEI>?+D_hmx4zT z!JBv%L{vmX5dVw^k3AJESc*#8Vw*I$8V~8FNlbmPB%7U=nK!d97yLX21W!1<7Kg_Q z0B6|8^IZT6h6#Y@yA%u)&v&`MT*t1|A-7E~_`V68UW=2{MSnJHRpMxOx`}VT|Ha4+ zf81;iuq$=M>9uI=zjJ+YN+#4Ke5kNG5dmPQalrj0$lYxf&wt4z=-~J}l8-_kAJ!3F zlA4VECZ7^TBteWzl6a#u<`Lp37$%0Xhzvi+c)p9|i~kZ(lRtfEce>dXXo8lJs0={z z*j95O5rl(cCg%@J#PDVwNAm@%D14~nLlJq70Ik6~@K z9Nq)lDkTG^nnlQLCd?YY&}QYRO;b7TJ<+bSjOoGuyQ>Z}~u`4ty22)`Y=`NUiR0000j9*^dePl+OuBW5K@wowL)2w7BZ2iyLD42A(w93qwae+lUE zTpu1DpUNvR1b-tVR~dj*P;P^EYZWOHidZDaAG{^!KzeD48IxoMY12f8BkspqInj); zWIDMX)E%dM3M|l{!P=+g{y9nQ{0`0* VzWSqhLRtU-002ovPDHLkV1flB#WVl_ diff --git a/src/main/resources/assets/ars_nouveau/textures/block/spell_prism_target.png b/src/main/resources/assets/ars_nouveau/textures/block/spell_prism_target.png index 8761fbd245bf00c19c7bb96470d050a4d25b0686..f75311a8a20a479ead4e86b5d89643cc34836c21 100644 GIT binary patch delta 502 zcmVnqokDFYdlJcRFY#g z3eOiaYi_wL5r2!T8{#A)ygWlGWr6==T~E>6^x(}j)=hoP3 zx6%YfgS6I}`+AxBA}YD3;o>6o4$>hpl1&E;bJ0}u&J3Dx@7%U>gJ6KDR8y(ztt%L5 zjP4I7h^ph*E)-dnQaJ^tEMxR`qn^%z=hkwpLYC1gA#VrEwWrwf!7#^VQV`)&R$u5NgFpzxX< sO6%*q-<#pNwcI)vB?EkTSGVi@7q?IVFgi;)H~;_u07*qoM6N<$f_|XwzW@LL delta 511 zcmV_Vr_oF#wz;za2PK zu7fC}f;wC6jVwXYAY;tZeKXH|5#`*|cygL~2icHV$+iQQxoE0=X9rCLm#a>081@k5 zS|)Y1bp<1>(cS(CQS*J*g(9ogI;X&vWsPn%*RwfLL3lmKDr5nJ+?>$r9aS~l!zXBDMSmR7kjX$-h$i$88%IDpoTQ!u7P)UWk#dAJ>2ag zMCrNqxG!AJIrn$|e9!OvKGO4vuLdQl`X&H=Pb;dviQm(ToqyPkM?r~W$_Wq|ER=?g zEXQ4(4;2`jTEpMnYAYrpr|G_t7YlCA_zXT~B^DpN=llK-?8Zb?RZeAj69A>Iftp$; zc4I;YRDF}>xXao^)i(*X1*}`ziHXRvyPjD>scRtA7O*xwY3w+XM*C-t!>(&;oz^W5 z_eEmQ5@W}w;D2KGpfwOdO+NJofc)+OUd2Uz_ke@bKbcy%E0hM?7>3S4&*j%td;9>n z<$Cfvt4uA39Df1~2clVI-xZL8Y`?onb4L`}e--EwGGH6Sf|er|&VZ4`+tLX}()2O~)=oMGrr4zJ<^bQT}?aD8?_==N{~hTfJ=E3H7O;?u;!`v4SmmHci1 z+1Ji+EPri}f}>EI8{e}Kn;YMwpyh}}6GWnBcD#xUq#*N?9(xp+s0IE&EtOiKsH^mj zfR?QXpm!ukQCCgwDHR>2!Qq%*8VhEi+*!{oS%;U+ln(+}yzj#;*K_v5GzBdOfR;@& z5X~YvMkS?bMv@$(!WcR?w%16dRshKGnT_o=3r98C*G_(CwKUadHb#=7uF~8Qwe{vg zGJd6ut$3fY74I_+|Nr!1$oSiuiYlt8qKZWI8{w|}9kO92*#H0l07*qoM6N<$f(3zC A4FCWD delta 1175 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 AZU6uP diff --git a/src/main/resources/assets/ars_nouveau/textures/block/void_prism.png b/src/main/resources/assets/ars_nouveau/textures/block/void_prism.png index 7c6c4120a17f8243f33444b3d034a086c8458887..21501cf467ccb8bf35d4bc38329c1b754c57812d 100644 GIT binary patch delta 469 zcmV;`0V@9g1N;M!F@Ls6L_t(IjdhbjYt%p#$A25Pgp8G#p(V=(wx$;syaf+_9P!f2 zLeE9;CZ2^JDu_ryya4e6G%F?;*xeEjepfHcV{${bZK445VvTS3gcD##}%q)Eo- zZ#|BWz}M5qW{7=Z^Qaao^4cH_Wk6c$=h(6WCXsz z_c!P+FR!U;^?whnW!vgR5E09itspigI|^*Wv~)W(Jg*957_mF(uP#{Uc2VZUGIe0B zswi{H7_UF)_YyG|Em81d-w^zSeo9^PS72s11I zlOJ>L-5r><-dkQ?^W@+L*&EWa$9Zr692rK=IP0)`<>iZQGtPeive+cj?oVW)00000 LNkvXXu0mjfMW5&7 delta 472 zcmV;}0Vn?a1OEe%F@L#9L_t(IjdhbjYt%p#$A1YcVP-2KL*0}H7Sn?YUL+v+F}(EB zTTfm~>0JuaqZBVi5WIQup!DKb5D&$Jg7nZpA*BgxmZeQXkg`22Gfv|AZu4e-GynO& z_ni67yLox}i>fSmb*KO+XH%NC20(ZcfTpbxo}_7Ojt&GvHGe{_J;M2&?aiyQ;P7q4 z#&{h&&dx77xwieob-lQFd+U^;8ZoHKg57;3#%2BR$Uyd3GNAyF@LB@L_t(oh3%JJXq#0S$A3w~n~$3AB!!uDrbL{qAa1oAZZdXb zFRQz-Iz=`eNO8SzU@rtINQF%h>Kql@8z-A=;QYAQWH6lyT69j!XoX2D%F5EUSs`y; z6PqSsX}oxIPT!M{ws^fi1kQ8Ld(QJe&w2jOIdS#uJyebf0e?WkvH)mgS0iCrJiBKH z=~NDYP-_4{v-b}q0chPa?5ekhCnf|5%OaOAsLq+>9RfZtF(DYcc!cux5SPY-+QgoH zSzKLd-hbswa@kU)*LM8+sb0$0L!A8Zqq@X30)TQJ@OhE8?0cef5WiulF^LoB3M?0k z9N5`avuOExh<~XY!J7Vha2@G+tt@w(%NH~f0iTy6y`wx3hVOr!(I!6m_%`NDnEGj0 z>)#R&YDdt0_;;Gan}Pbr;Og0XsO*eDE^qHl?t0#`@Vc7-D6H6_cG|ridIWyEJE_?p zk3P)U(PsKbmg*94I}=PgmylzHm6CE^ZU6J{>i5pJM1MGXkipMlHT{Z!+_{9`Ftjt@ z9gnj+9tWUJ2(8^F1e@+N)LdsKY(Z6vY4+p+6V$ZFIIk8+1bKfvW2_K{$O|$U%a=Kmyc%%M>;T* z(}W`(4S&~jgPl||u>ge6uh~*ksZ3VMbIwG|3yET8fn2u4nZcG-=dN8133z0quu?+! z{45uXSovjy&rc!0OiT#oO#2(Zv3kaT{#B7>b6)kyBYR=sX8@MWXk}!&ApzH8k33y= zb_kyzK!v%U1f4tI9glNuc2_hC9~?NT-FBl14(})#u((ZK;BK9dX+9FgvxlQ3M47%+;13o-Ax37P3m2+mi`q1 zfS&H!GnSQZ@>YV+$BzMagyc@&I`yKO<2MW~0=H+gO8?HYo7dEh*u_zuF6#u4zqYJX92p0TsiIdvYZNKe`lQbF}#CL0$bcT5Ow z-M$IbuXNQqueL9I8sfmtF24O{8<#F`W$b9P(!bFXt@T(PfyrA5;2eOGAi&ul-d=Yy z$lCv)vZVrymZ*9Ot(A`BHNcX&NIKP`4a(>=3O~Tsy;mxZu583#Edl#q rO|B-J<=bAO`hKYQ8oGyj_&@j$GLdIpGZ!f<00000NkvXXu0mjfg(q33 delta 1235 zcmV;^1T6dR3G@k&F@LT}L_t(oh3%GKXj@er$3IC!a&McirwQBIx@-aGR;SKxPS-M5 zVHNjK6|pK~APC~zix0jj!cZ8Z;Gex%Vb~XOD3pRs29CjCcG6BqX@$Ag4eXX}?OKxF zCTVgL*2agMb9ztyb@;q51kUfAd(Q87e!uVccjD>Y_hum?1b+ZA%L1U9U5c1x@mlAT zEW|SaG>7W}G`r`mzW~_$#P^;`XZRvQ5VI^Yc1}%B&EBQn2oMp1Z%-ekFxJeO;YMv^ z@BS2?-3xsE_7IuWa&gvi{Qf{6g|TK%eDht!z_kDX<-FbqAZ=przB-j7 zo6qycQ@hI!Eq{zPGjXM{Y`zjaM|uhgXdS=vmjw<&&fAInr4%170`5q;mo%X@Nz}x z0A4_=uj%(|HQyVJvNsw9piKyE+$ID~LBHDT9!n%FNQ*EQ^Q`Y;W19{iHeo z`ak|qZJ3(93&8Pr`iUn~Yi3|!dV)PiI;+d@j%9JD=;(e>Zv?RHtg=(Nd!%yrl>Ozg z3^&eA^M6QR7Y(5eEG6b>2yLi(o);WaNumJ=!_;gksdzG_2^8;x>ldVgB2jf}sji077GH4b>CQ<-+@SO(Iu zIYP(g2;eZ^J#G_%OViV|3E^aHWm!3I3KvucYQgKiZEj^*3qs=E*FRNbse)fld`>)> zDm!o~F~`nBTiDnU#-1-830iZo(*M>$|jC-nfzKQ|J znt!@8;f5q(Jeg8NoVe1ceJ2B6jC*JbYqY8f?^>NMB7|bRTLm&G>D=`D33%&h3Ks|l zor~1czX|}Lx2L?uveS*6smZwPH5vZK3d0KTV|^n{;eWWY zgTXBJe2UhmpC#1NPGWYl_G2XLGjsMltp^XNg~aS6*MIy8*ae^w&28KBDJ461Q1aZR z#9U1dc=O2_mJ)M>yB^hgx15vC-25oD-AJcR?D-V(+_m6~k6Z<=(t7YfF$+%JRx`4o z=^QAt8@6sz*y&r$& x0XPgcX((ZHI&BhmeOUTFRQfmc01xng@E^l7aA$!0{qz6;002ovPDHLkV1msNT}S`` diff --git a/src/main/resources/assets/ars_nouveau/textures/block/wixie_cauldron.png b/src/main/resources/assets/ars_nouveau/textures/block/wixie_cauldron.png index 9e04c260baef47801f79ab776ef4941bceb50bf7..9c628f37c153e97b004c2f6ca0b25af131e7890f 100644 GIT binary patch delta 2113 zcmV-H2)_5649yUbBYy}KNkl;k zy|;}{w;$NvLhT}kmW3BD|H|mku3f$1>h~N+BAXQefNw9&k<@bew4V>^im3b7S1v@F=; zLG=bh7(&1rSbykr`}pwj&6%0Fa{0Q;g$Gke9Psz4y@i7x63;y0Lfj8*kAb(3Pa=Km zI8yx)hL#ohKD62QvV>`nxHU`4(d^6cndCFh-NA8WB>&Z2CW!_4A+`l@fujgd(EUFy zNMPN9rbS{4a2)CB^M3C_Gv6peWU~T>7=1&8+Zzl40Do`ay_(wpkyHV3W}YL-%u!#t ztoTB@3H$d#x{Tt1Fe_Q9ue!D)VHW2UA=351p9g2YU0PgrOND%D<2!c+M8WUX-$p-j zqx@m7v^kMSaF8o3EiSvctWZ(u==EVDmxxV*VOXiJp2^;VKmx3Fws6;OsSMH&y}=N@ z!4M>TE`KXv7UvR=H?{?o3VH0{9xl$$VQq2C1#l)6F8^q{4?o|*UAyIJ#yWob_g6)B zlwSM65JK@msgQ^5$iVl*Ag*1#;rbB^4GN5m@`iy8Ym^ETHt-nbZ%pJ31I>O5=3ox% z);98nk$7N1LJ=9#|7oCHfEpr#p=%P{ucKU6Ab)QdYAujsp)M%PBTzzxaYku7GLYrH zo=p=Kggyv(2+uq4GU+Rque(*Vh;IK>`D0wO)HBPdLQNYIeeK7RQdt8fA3@*(cl)Pj zl$sXON`MH0lZtKy#Ii&-VcOQ8TT)I$g}hCD$kQn5C`yqkg!}aw(})MFD)*+pMUD_ z-G3T?yGx79F27!>uezV=@7=0d#Pj(F6FwW)f=Ky@S$&F&j92NI2EdiWf78;H251)N zl%In|5wkcKS}!z&NVJlp6h7%HkZ_?^DdTD37d)STfLf&tLkK)A{DR-Bzp3A5aSqSt zAE+7BLmj{7L>dL>F{^QqY20kMG=H0v#ttnDdBZ@re~MbIs^Tp9BAGV50|5QOFmj2E z*qr!<$8YLq+L?_C;g{PN3uFHqcrR#dMQytQSkU+e{n#IRY&pNoExVL~y;qa6&Np&F}N@3e9!WK&S=8 zVfQo;ROM~lY`D5YriHHse9ibwmKN4$+QK7ARd}Vo>hk!{qd^kHRdm_}nW(iVxhB>y zV(TZlCQyZM{N@!QA~mkOp?_tm`U9a<$gAoPUl36NHm!va{1i|ecgp=x--!VwF%fF{ zV7@)HEYEaVUx}6qdF2{jZKp-ho(c#vGn(zYb}N$k^EBHl^Q4gHMSM$(%Py@3DLSMH z&yjm|!cCOSkz#n14T`Wm0zV~smCMttHpjLAJ^&ItXssSaIYC7iet#f>N?wj5Q8kMb z30Trl?HdNm6*KU|sG$q2sN!e7yd39;s#!#DFjRHG)Hr~`8ZCh_j<eBgb7azl3J|_YhWq&DOXH&P3FB}-9{5FJp6nIYk%0n4({PmZ6ED+2d!)q zJH=hKv+TFo0cHh!a!B~b&4x?kPjYTp7zG3Ec1PXNEr48v(ol@Io*rR;P!%)@}r1-cH(BeLIqJy%q zqt}O-0~`PVo`2yP0N`jWAOO%aDqHJq==W#~jW#?`UFQKo z%uEO)LB5-efWr-5`GVIy$_ofzd!yt`7}WD}T|iPmS~`mo-hSH0U!velCRnRg1Fhiy r7~~8y%rL_YGt4l<3^U9yL)!QcqQ{pX0Yihv00000NkvXXu0mjf3u*X9 delta 1548 zcmV+n2J`vN5S$EPx))=5M`RCt{2nqO#JRUF4ZS@UpNZ%a&? zVrT+&-MaO`t@=`(2+o#)qE@sphxlk=4SR7@hO<;1#UczJ#MD0^_$c_WQ9&4O!3lK} zDXD^6|BbRHbR%glskJ0cEr;=W{Cs`s^KH7aGu&WyUUo=0AZ)e@4J&fr z@!2WHXQxXUdhs?l05Csy z%dk7pzRysEeE!9E?^itb1@2-7g$5y;%^J!nHb{WUQGX$MF&N@JoyZsiRW0_&C#5(d zvsFmQ*JQ`#co%K5ove^*uw@98LMeGcNE=4cZhO~u~)_%fP?o$oiP+B}&-*jp%S@M^ipSxvDd*V}8Ksu4B`kNQHq^U966WUU`AR;SJzs#hzITuD+gd&e|yCX_t}5 zXQxUkie#G;UA=h;&N>Uo)89vtGu5vHe6m24zDvHA0yLSyc zIrimzAd+G&W&u}UPdIm=eV>u2VDoK=fsm`XXn$&siwnJc^31Qi`TZe=Iw!ce(94U=HUQs?vlUmu9>6pui8n5)vea7AI0t>zmd$2) zbu7S8=L7(^GjUEv^*1YIpU(YBFxaxA+M=4c`g+1SS^joKi(I`$Q**$k?Dy|)Gp+IE zaDNB}TZqNtbhkZalDDiV@jN-yd>((*)&p+gm|Z>YZEi3nLZ8PEsW~)FGv0JGIzwmY z5f&B}^Ack$7Dv;xydp=gAH@CTwrUnbZpg34t?PAJ39|EoVw)K6^-l2Rjb{Pq@0c{= zeDH^EB9Tb#>i~HQlGPw)0YRaKid;#`ZGZA-f5&8AzjLRuL?Y#U{qk`Gc`VirZR=b6v0K0lz&I@u}mh0HczYhV>Sk_&32RCdkR;+TD_wfYsTEIH5+hI4? z|FgWN-*@?!a=!bnU{r$g>dv}jW5;%!2XKcxG`6(^P``8?fc4fcYP}Y4UyJ`{Dt}=C zl$5!6k+-amyweQ88^>M-;OFJvf&Be`>$$MGG?ZcFN_QoE*%5B5^Ws=;mw&vF?dIoh zu@E=U|Ej7Ijm{XyfT>1^TzQhWUY|!xW@v0{ul+1={lnX~7lgz|e|(K^uU|G|e^dHj zL5I1IE_vDRFR5K;)jMw-kBpY~<9|veDY`2x@`A|R?vUOds9QDJz5C5cQkRoli~k0| zOUE7s^tpZ=xVNa6(2b1&Mn+ZoJ0|Jxn54!6*xVH^l+=74zaiy7-D;lW0_%46!0~A= zJU6lFcw0M)zk$E+tuSzWnow(wBLio5#ffq-DPVcYWym$unqzs%g}1o@Wq(m2P?s?5 z0(Gl+pMRV1>1jUu^l<=AwO+k{^$|u!RRVPrhAsEAe!aLso&J%&Q`;E;iiAL@H3v8J zb?35u%1r9ots=Zzt`3YUG}>D;P3_)&hG`l`|u%P({XWLOZF5qNGCFAnx@a) z(_=6_#>lA3dOBhHvobQOGJiO{!MRgeR+nb(@Bcyg^fc?~1cSpHEdOyeuV2+k#n0x% z-@w2?E)_p(+9T}i3Fm?xPv=r&2lMt0{}=T2gmcz^qIi%f8UhbGMF*f(zt}i9I5;>s yI5;>sI5;>sI5;>sI5;>sI5;>sI5_Mk{{h9lFK`S4Qo{fM002ovP6b4+LSTaBmHJHp diff --git a/src/main/resources/assets/ars_nouveau/textures/gui/scroll_ball.png b/src/main/resources/assets/ars_nouveau/textures/gui/scroll_ball.png index cace1b89c3994845a3f8881f5078ed4cd204a7e9..88c5a94bd5eb4b46f09e7f24e70d8eff54947a30 100644 GIT binary patch delta 233 zcmVQQ@tmoaF_mMceizu0F;g)subM z@?CvwZBqZ_%V7(EjQ4a6+E@nK*q)r_1zBG3bWN0Bj|za1Tw)*O5JMZw{j?)Vr_mX7 z8T1gXhsVvtT0H!RXl-IXj7Cv0=U!7#S5k1`F nFpsbN18YL3`*zlA>R^B;q{?f|kZ(sp00000NkvXXu0mjfy25Pk diff --git a/src/main/resources/assets/ars_nouveau/textures/model/chest/archwood/archwood.png b/src/main/resources/assets/ars_nouveau/textures/model/chest/archwood/archwood.png index 1ca378a7aab42e43ae7547b3ae54375528381ec2..33898d3fa4a4b8dc3dcc916e896cfb5cc908122b 100644 GIT binary patch delta 1826 zcmV+-2i^F?5xowOFnmEAxT3aP?|z=aNFRXdN4gSO(7Rk=%J<1f(;D`Ma$aM z>sYp|-JO+I(u`)cTL;#bS}A zr6r2RB9|^*iqQvwe>DKG%S8a1b|v&YZRKg&71CB70Bd$hJcym$o8Sg^xrjBpq~?&2 zeb(%f8Xr6HwZ7jp2x6BnUk(5Yg#x8g3E5s=UhetAz`q*Y{^uXK{LTc8h6_L@V}!=Y zet;`)>~iMZMSr1CaD(#~t^;7`rW)gVj_Q-`k3Res#LkY4fP`%1aydmnE|=>oXqSt; z`RiFe{q$b|v|24vsT8eN>%dq|(|Gw;U+4YzideI7{=#*>y6_Zt%lCO^agkcRNyBx4 zX)=aEb|TFutE+r@_B7`&T<40rG`vgHiB9UNs zcNb054vY(e0Lv2ZvCBma-6T7ahBDOZO|lbd3a4ghI1Z)ChLS6snqg(_)&UneN+cE* z763@6({#7{LHK-1Op*|Ww14#_8L?Q5csxPVt}y@fvsl?(GNv%|>_nQ3X=0iw8jeFD zpCeFduxVFFr>9A!#K-%-uZW1pyW5#8kq9Xs1i^tZpMM9(X(>ynY}gpOuna3ZJ?tm;#Lxr? z|L&N0cO2Mn{xT=9Yg=k{SMJ{7_|Gls|=8jes{647n?qYQ!r6ChVp2Ep!?j>qGwA3D21+RCeK zuz%q=iU_&&t=zfG%ALC*QtaB+@eG0h)oL}g(jb)eeIHHJ2!cSxfk(a|L#*aHwR%$! z;kslDgHmOqqqythdJeUE6W4P_Y5@bMmogRp@y`T@`_o_`lp_D)rFtk8{?5g}t8x2x zgD)}_9*O`6ABN-ss2j)qFq9ZrkwFpMpnv;)pZ(`=2i_;YL6EQ~HsE*0;y>s~TrBXf z25-Gq20D3pKfL~P@m1p>*N=dNoN)0g^J)v~PE8@4q^$n;Gu1yXa=j1>9{oEYxWP-y zxA%^uoxNE?MrwdpUuk2_eP29y0=akIJrnZ(FG{Xo><|R(P5vZ7N#U5w^(CO!!+&15 z^^fNQfaK&HJKGO>j_n?E=G;Z#$xCVde0fj|l?Wv#=Xm~w+oG*?{BftBzYf5aH$GORjRFG`AeArVPqV&dvv7J2$MtYM4@hI^I;NqscK-o0(-zOa zAV`p8>9$;#60@w3YJdnSlls1xhHV}p;06NM^7`kwasmTcdJZ~pt0qJx&fq&_R$Cc8K z5=TNnH#~1gSweNYPEt#u>q#_a3fO-L9)=)$KZ))opg#Ej({$ zsE?F6!6-0P9?)(2((J`H*!ka`A4tej+F>9{Y5j|;gJLKPNNTB2pxdl&190!*I`Yz*#+v=+pr6?n z$Ko(_6qTJp5gSyIUVX<&?x}D5rGG_83jF!6!Yn_p((>H7KZPbA7k{~4IFX#3BW>lm za_uaohwJKwrh8J^cjeky(pH}2<;-b2okOjwDy{QJuGL&80 z;PiZjDb?R{Y@NjB%QkwObVO1%FDF@GZ``$n_*ZvS#R}GOg@HTGij>b&LbtZ#BG(Hi>~aw+ zJFUve`~9j`Z&JwT)Pz=c8oOL%T;%#87Wh{KyIkaz*TsRuu5AGwf9m!tD?82GZzYs( zjf32wuEyl#@Z@)c$6anz8DxYA5h6s05FtW@2oWMgh!7z{gc}GEB8(;e2T!J34lLfp Q0RR9107*qoM6N<$f{K}hj{pDw delta 2219 zcmV;c2vqmI4#N?UFnV*mwjT z;JtG-0HOz;0)ODx&z1pDyne}}>8hlO_NCt`+fI0?>!7qWu#2-?q7jeBr32#ecuy}s ze`%V}KD!1$xm?EQ^HDCBcksF0ZeD%+8@zdXlTs$d$=5WVn0=g;wfh{NnEV+ky_|gQHdo&7(b@svibNs+?BBni<$vX6+3p6<#0-k!qh7CL7zQqv zi(0LQ+wI=LYZwNxSOm|6k3eh+#hWG^3cwoV3MIm!0Es=56jhaEYF)}D_DphX`8K6Y zirDl+vbYJZ+1XhD0)YV5c3&@XnSs=kyvcQ7XXn%qMhXP|WaK@*}21wOX}3 zgT`7QliQS|d+W{$sr8I}Uur!=GPRDTtEj4(Q^d3x1%{denr7B{G2&vbTPuN>8rfVy zMt_Yp^n;4Ib||VQO-uu8=#R1r3>^Vtw1x3tIzrIF?vTvdB8t~fQB|cQMCrSAXN6mL zR%}kmJ@AxG*JFpTbc`Gqz@Pqn2xzR!O+;F-o3!IE{2PFG-;Dr~COJE=^|z4QsV~x2 z#?+T;q3=)!v+Vus1efT@+?V#t5@cPPf_;&)^xwOZ{&|t>1jk157e* z+AJV4HNfj<8`-=cxl=z)+CuwL$$#xm{J!H9a2WLk!+Js^5)jyzt?g)HzI97x)>EHm z*;ab*-uze^-u<+Qwx>)E=Zl>kP%Hlhr}ro)PMqk(XT#;om-*YvPZ;6dX8z1=G;|1> zm2Tzx>d{%-u~|7?=vqAh4u12)zRO@;|0^!vk2~_nGPtm?(9=uB!X~`iAb+>v;KH>@ z06gx-e5_Q!ZQ~n9X;Ff~y*3@i4>ceSxa3jVsNe!~L(?l94u^EYg=>=} zruLHF%rLum236D1bR7twc)j=)FU$8=nT*D`aLsf=CBMq~OVfPt!PTDhy&C!Yq9_j*0HDbf$bQQD|5umePb6UJGM2Z&6B&~#nq0QsF? zWoxUyd?uFAqrlMHVQ3g9pm@z`5t#@9pz9S|1Ox)TM}x=XZh6u2uzxVH1FYrF3SF-q@y_qhKhiqT9TuC??IYuzOgyU<_m0O^Hi#3biE?!qa4ja zFjR)IhQ0`UvkW$VTSH$|0dbVp3$nSw|8EZPxP7)nw~@^QaPL8ydk@k!rxexFkX;=O z295wx1yoI!j!?W_Hh;2to8gse8CBD5RUn&<_N-^CUZs*>8?>8U;R17c+v{pjtO5aE zIdYeapP22US|XF%u7p^ZyD8ZU1lZu;BQ|`8gvPv?rxv(Hxa_bbl*?L2UU<;?3~G2H=A8U!^*8|jQ0tSHXZBqJpprE=C#IZ_>)N)QV_Pn? zE$7^p3!8F5>~bHi9tY>PT&T4^p-aFMiSE?5ty9W1>Fb1D!uYG#pC|bsO;K%JNr}z~ z+STjN?|4B!a(|vklz#OIej(qlzHV@Qx^UR|?ca}Zcy3N!PKX1}T%l3A#4%JRx5?|@ zGc(`kLGJ4>-sn69-0=XKu5x2(34mlODIbdaIZan>ZGnE}-0{Fba>MHD=m61(g`*@> zNfJ{Df{G$N2@q8Fa%=fEiKzt1l>Np1$XW5I^|f_?Z+|i*y{35mGPJ^>fIPPsmzP0B zvEAA}DmmX|XehZ(*d@Fwj+2|`RjyDXF%_4}W8o;i$q>HD&?A!*7*wtk94j}D8I}Ah zZ~gHr0P;Fo%qQ!-iiM+``N_X*e~uir+%HdMY>TDeyc6q7U$?8VFZ|u$7-Nhv#u#Ia tF~%5Uj3hC}7-Nhv#u#IaF~%1P{{uyWj}T5I)V}}#002ovPDHLkV1icvUfBQu diff --git a/src/main/resources/assets/ars_nouveau/textures/model/chest/archwood/left.png b/src/main/resources/assets/ars_nouveau/textures/model/chest/archwood/left.png index b86b97a1ff89b8d5124a2e33f74e5d2e7a3bc46b..ae5f2382d7b88c022a327bbd451fe735c3bcaaf2 100644 GIT binary patch delta 1967 zcmV;g2T=IB5XujbF@JD zhe~yaGt0|VYYpm-qjAoVHchgb6xY_)I59WRGtXY-owvu7ZUn>t78VvL7K>vucRC&7 z@%X_0{r!Dnu^9XN`$QrUOw*)MDU;2dBAZE3sqRp%HGjxvQWPFO4nW=Z-gv3JrJhrG z_&BS@^|9wS3St1MREovL#jzOM?Y2+&L6#tI|L)zpsx3d8!?v3^u1z+RB5he%mPcn< zNy=Ll3i(;mmc`A@4J<2(X;{A45f)+qXV0D;+pl!Nbm9A1M6=lh;KL8Q!-!D2@Brnl z3g9WJynj_uF~D(c6)3|*ER2VU(9vkr*DivKvQnue;9%QLEGwymgRbCds~Z&avpE24 zyLo>tAPDyN_kH(~NW^F60I^t%PN#E#wio5CigF7;SwwlOf@ydblFQBno$63L6qGR* zi>Y5E5~1C0t6wx4rQL2HpaCym5CKiYV)dUl0e_TL=)#xETR5(*6mvfi*aF17#r$>O z*DXQ6b{vOBWe50(5-M$)fEWGiwyj)1{s-k3VIi;r`mF%s>v~%>8db^?h`&n=D3!M; zhq`T3sqT=Q`&7{B4#bgyV5j3HgJRRyz!ySqy&cS0pT zrhj2kcO25D>09@eRX7fgYg4T?d;v2|1XjT5CqCv&Rfn0X(7gPu9ddJ@Wwm%!(O0TF zl*;|HP@!2ZuB%iyYy{4$w@cqsdx1u!tTsb(uS5Fu4UeFAGj!|vdw{ob(%bLrW+(`H zcY|>Fj!^CF?m>2ZhoP76*7f&Dy5nsL`74D z!C^>DJwj{mwz}3a&I%HVe&fMd1wQ_Xr<4K`@#KO2R=cVCo=C6h0(^5_G!9kxtQxVqiIc3dpe;MnvOfKtTv?w+DQHa$hDyrJA+Tu3=BYy{p8 zPfukq4TDy@iDep?hJj%uFpLD#QyIV$T9jfKiN3D#-$q~sKvyUcUa-4Y1AjavIj*Z> zfcyu6UQP=WfnC6LTNp;dCzJ?o8ir~UYjEAxkt{&UX<_3?7NBEyucq7rP!_SfS0fQm zVi*b1)?q2{e;$DqAOa@hNj|uj6^d2p!f)^H(P}qw-PVyOtLF=0;YbA$5lY^=<9bV> z+{=F$!LM6R3m1VEApR~fV1Ije&$kT95@;IUQYkq@h+Y>80xLigpF}*V-nzc->sHZf zH?bY>KQXlwXgn#Wg^l35!SaSO?YiBdQr+%LCp4wfBtK#|FDu;Z#gY&Jn)+# zfmDSan9a~p6fmqUEWTcxeCpkBOJc9SagOE37J!45ApM9-uD|q|KYtvsg4W(`e*4GI zD_R}$%%`9H&7pj~M{2!u@+wO2_LU>B0;?kRFA zm%mq6ymNqG_<*tabm8l^t*TbTYL0;w(EC+Kwbtl6n9vpSvs}2i#%n8{zhAg`hcnB| zz5@|amO%P0T--U7uYY$QK+jhv{SjCJH#ax5iI%!ie3JvGIHqAysqXmB_#L;%wY4?H zuhV+{w(t5dKApFhzfv8XKm}HS6dPBI>*|}IF1#vi+BB&<4yAI5LcTz$>{m=KJEQu9 zR**L5SuL)Q&DYES_~OZ-avUiJ2*kt(xq-Y1{SE1D@8kmOV6TWvM*-Q#HyX9-C)aJ4?>h!l)fNHHlAwR23H4yp*&9Cqe*e2)hg%l^UpX6` zV1fxIm|%hlCMcL-f(a&=V1fxIm|%hlCiuU?zX4eeLH+%=OzQvu002ovPDHLkV1l)# B+8zJ^ delta 2080 zcmV+*2;cY054sSLF@N+)L_t(|ob8%Vj2m|q$3Mn@#xvu8>-D<3>!zzp*)#%Gs**#H zI3U3VLAjL+QG$w)N+l2hRY(z+TuP$QLvsqfP(c(VM8yS=Dsh4n=>fG$sj^C>X487J zb#}e>+Me;)o0`Mq{rnrRz46X^MFjpzmS=vy_nn#d=Dqj({eRwXA^_K~U+)2&K7BgE zn7DWIY_GF@e^+}Vv!ITpU)nm`_eo?Hu=7P))ryj{^F;vi^Tz?GuHOQnRjnvlJ6|L} zf1F742V+0uIEVmTxpJjfE|&qgeEITNH~7}KzthvtO~V>0=X#Fnzx2~J0Df{Qw3@xh8XyKxC=?I_jEh?z{R@C@w>wfMnM~4dw@D_G09?3wiVLr<^W4%= znyyQ=zQyy)%hVe!ny#xcXGobQ*|g2g+qZdUevz|3yu;OBn)_7m@rVH&IdX*6)zy8I zd%Yg{=uNRQ@J>Z3aTxFxG!U9kpQQ4?s8or0* zvonVh0$&JAjKyN=7l}mZcDw2qjYjEqySrorqJN-iSghQ=2cWz{SH4`?!1Wwun8QG5 z4-oej_t#@z_XPdebzL^CyGi;`-Z;$K&c;j8&`E=xlFMZrWqLbl~=efuIEs1v;qlpk_c^p<6k@xn5ypOsv>jo+!l$<0xPR`lzg?m zMY%G37Ai6;tNtwTFp^;CdG(Dqo>prC`{>gEBO}!B(o3^#yTtHUl`v5P0*H`52-yhTZj*a9BhV#Dq*ynuj!&OYTf!Y9GvBChAr zbXqJeF5tKxuIFhIHl|@S{w^4~^i13+IXQC?8n_Gf3gOd8koR1WBL+kwQmAL!+@Ng{Lz zcwPs?NGRo?uefO#s!hDX^EwCe0NXws@0mzV5PaoxnKYi)0Z<-M+isAECozl!Da#HF zll#RJl>~gaj_Vz06p(V-q!E5K zSXoo9-E>-1>zhO6M5bI>VP&+=c8$Zpfop=zroSFfrCgd#lT^wL$PM-jL~ay+T%O)G>b?M{Ui);iC9yx; zJ;U;|MQ{EYoV~g? z&r0svQq%b$6{U+q^?wL$fNa`Ur7EfS>08|38=~p>b^U9fy~vpt{t{5)+WRj84|ef| z2XO7<@p(%5M|`PT1?!bTgf_t7R~_|6Yv|2Hu2d}W`nxCi#W(yfOJ0BX1kW$qfejHc zmO%Q(;SD|qF!0sMaD+C%z4iXmwp=Oqv-mo@c5zI@qFUcl?SJutjq5qwynS2oby@JQ zp&vhvr*jAS)%xfWB(wpf*toKKM}70thwrK>)1>LTlq+RQ#S-O;L%h)UkbHJV^@*$? zWiGO^dS~CfLH=_~NB7j@Ksi7lE=*Osj4V^m*!6~MgVu~rIm|}`4rkG-iDW;fWiYca;Vi}76EBps0gMaNjID4T00000< KMNUMnLSTaX%QpD{ diff --git a/src/main/resources/assets/ars_nouveau/textures/model/chest/archwood/right.png b/src/main/resources/assets/ars_nouveau/textures/model/chest/archwood/right.png index c0342c1402eaea43fe25c85a1861005847a469c5..f67ed5b85d839aa2ffe9250ff07a05b1545ece7c 100644 GIT binary patch delta 2045 zcmV`P$;ye4}EY6lm`5$kQCF<5*ib5Fb(a#qy+kszJvuoB#=^yp)aM_gc#avAJ%M4 zz1zr}ckkbI&>VoPT@noI45t+`M_y1Aueq z&M6oZUhmHy0N9mn06^2O`ktFsUR(#CEkFBGU&u$0WmttZ*p+Qqg*9=X-{Uw{{QcNE zjsx}L#f#qN<|eLOxuR@rYj|F8t=IsgEo8`9I7xS}rg@qO?<0PiFG z@W+1_d`!k}Uw=kTqOJ+~j{~awV_{)oY(~4XjosM%~*{8(OI9-Fag zS3w9tuh)a;c~Dgq-EMbaWC%RZgQ5%qtoY>DuvfV&jDIiY*#x8w7D)}qLH(%7X!GMw z&LmJ*R#wCh(=^9sWI6tT2~k-fjhcP#6h%?c>2zRMwn20QhLHlm9MN!CnCBO)A%42+ zAZ-ljX9@NE`SW5*CRqdl;Ne4NP^Z&DDwP_V{Z6MN{%e|sL?VGiA^`v*uc_;x;W)@I zSg7vXsDJL;!U^19*;%uO`e>4HH0>%(Glx`)Dc0-tgd;c-i3EDRUMN4&4LA;q7;Z2R z{p!B$yU(4)>1T;2q6+ACyXbbiVjbx9dcHq^<-X^6f))U*Ob&*T0?`d&FrVeLVTg!$ z+?YB7I21(@VGV>=10Mbytj_-zj?)5l9h9s40Dstwb0_fGzIA6$l-I|y21H?|{j$Yp znj6{c^@i31o+1Ez8yjw1+8Cq+Ul0LS3hnv<9H(`%9KfppH!7I>96S;&_kkf4M7H_mL(0CP-(QV`t`&X_f(c7Rn_!{rzMgVGz{1`yl^`yp?Ysp|mBIzD(0 zVk>Od4^Xa_LwUK}<7lE_>KBViUxwu0*5c3mLQcTTkZg#o=qQ7@a+5-qcdGcUsf^g$ zdfwaHdfp4_6qGMNPF2X3iA*`f2gfYYM3A;5*;=X2{b=>l+4@6R$qaUWCHRjpMY$UVP_&|Mv~D`t-8c z!G-Y|Mhf`_OUQ@_we5=rveKSM{r>p67~fyWcSOz68ZnAaf13P zPlT^KQ?IC>{OkK303_!Z(SGpRM7+;D_cH*~wbPzD` zOI!!Rp8>#!*T-w8$*r*C_8CzywSNP+@x}ZSY6mt}mKNbq7u0oqbVS!-5FNXBKSSCu zL3CZT)2?29C$a%iF|`AD*q_SIqjq2m<4fVwUm>Izz5&`vuEh?W9c3c8*I zz>MRwpPio@qHR}OAi54+Pr|fJ@OIjljYtg;*)7kks;RGHXpWds9(#W25q7FMVM0Nl$sQX0Mh0$_3B)X1< z(}e4`g>z`&6zI!BBnLE{CV!|qD0`pYV;dM=?f~Ha;R6s|7YikIU6@t@C#4ER+6c8f zx8YD%7{?bto(=$W40T;3wUlrMz}jgi0g>JXMs0UPtcdt!l1lM(3$hwUhQMahUMSUYc6HTvm?59u$W74T*B{d$_!UV|&mdh; z-!Q0FVGY#XgPp8;lVnMvNFSV#J6MBSwrEF=E7s5hF&7 buM|E92NjM)xsQ}-00000NkvXXu0mjfxY^%u delta 2237 zcmV;u2txOl5Y-WoFnnVr3R*OGSE*pU5$(B7GIX3jZt=6}r0nTY^gy?WILIDY(i zgneS^`bodBwM-&C4M1aS89;sOWjYe+X=b1Q7Uh*2)XF82`GWcnke@mVKzZc`0JU;S z@h0;H#%JE%w~YHiNWb(D3M5nX0u6t>L`}6ifx+!%se$o)e&x9n8~K_H-3Fj`>z>B> z63Kjl%fAo@o!RHVsSZavlKBGpsiWG#X@8FK4+fFA8m=;(GCQUq3;DFtjwXggH4z?n__mkgZprF@Sg8$pYE1dR1Q8u8|o_0$E=9 z;iu?)?YeM&SughWGy76D45!Yl;(9J$|B5c}bD^}NPf;i34MR*4&p#s$LSf5|L`)ukAFk^?0ZT1>rbEaGvi`yudKJ5k!5;$knXELm?M#% z?n>*CXHrY{SHFb0sQ4BLiu(&&D~w^4|VXg z_Xe}te&CP&iX4i8_5l~JOfpkA#Og+wxkJ-9u7~S+9W<6!RyWE@`SENT5Q+o1o`>UliWb`Gv?l?B?F8c{hLHe-a&q*u z>9H=_MyZZv7`ybfLAo6(`c8;c)+1_OH=1=^&r^zTZnbx2hLONBj1FUoblOm3S>G7g z13a$*v`1aKzBGa?m&TIx$$#XNF$MbefXuj0%1&Y!2@-KrDJ)0XG7Pfmu?}yL&~J|( zH~Kb!gy%JAH0!KyZgm*JFcNCC?>$&mOQT^VLa)po7Y1GhpuO%}hM|1lg-WC;L;BP19`yDUR>qE74f_3)F@ZhL+RucY17zTIJ<#U z|30wyt+HM}?A_x)haqU63FL1O-qEWZ#9;`!4?+3?DF|72_#6Ki?)!j$o}c#tQYn{e zRh+9+DG{KmRjX&YM1NSlL@)k+Pjpw_{-Uqk<9@npGHoL z3`=Bpld`*`b)sSu^X=>(M8j+VD86g%D*)ILQ(bP@w%Nfivo<0_bK$_s1N`aEk3{Bb zj7~Xe-z3>%Z5e{{hCzkn_pZH+Rew~P<%Rq7aH=rTjbw>UC)xL@4?czQ}?jAUD#edTuh z3YWJRVj!#~Gpo{dg1LTaZGB|*GWnoMpEe-eQ%;dV=6`>XUzaniZCy5VvO7N^5i=*p z$Y*kjSZ`DsAv2bQm3I1BHYi_il`9)vic3_sYs?fTC|5T2xIoz(*B2JlbkgP2`wf#9 z?uWFtYk)+0nscvy!o}ZzxvLX>?&dQ&s; Date: Sun, 28 Jul 2024 13:22:47 -0500 Subject: [PATCH 102/363] update spell turrets --- .../ars_nouveau/geo/spell_turret.geo.json | 237 +++++++++++------- .../textures/block/basic_spell_turret.png | Bin 727 -> 754 bytes .../textures/block/spell_turret.png | Bin 754 -> 1186 bytes .../textures/block/spell_turret_timer.png | Bin 948 -> 961 bytes 4 files changed, 140 insertions(+), 97 deletions(-) diff --git a/src/main/resources/assets/ars_nouveau/geo/spell_turret.geo.json b/src/main/resources/assets/ars_nouveau/geo/spell_turret.geo.json index d03702f1a9..51c53146b6 100644 --- a/src/main/resources/assets/ars_nouveau/geo/spell_turret.geo.json +++ b/src/main/resources/assets/ars_nouveau/geo/spell_turret.geo.json @@ -13,10 +13,10 @@ "bones": [ { "name": "spell_turret", - "pivot": [0, 8, 0], + "pivot": [0, 8, -2.5], "cubes": [ { - "origin": [-3.5, 4.5, -2], + "origin": [-3.5, 4.5, -4.5], "size": [7, 7, 7], "uv": { "north": {"uv": [0, 0], "uv_size": [7, 7]}, @@ -28,15 +28,15 @@ } }, { - "origin": [-1.5, 6.5, 5], + "origin": [-1.5, 6.5, 2.5], "size": [3, 3, 1], "uv": { - "north": {"uv": [7, 16], "uv_size": [3, 3]}, - "east": {"uv": [9, 19], "uv_size": [1, 3]}, - "south": {"uv": [10, 16], "uv_size": [3, 3]}, - "west": {"uv": [19, 9], "uv_size": [1, 3]}, - "up": {"uv": [18, 13], "uv_size": [3, 1]}, - "down": {"uv": [18, 15], "uv_size": [3, -1]} + "north": {"uv": [0, 21], "uv_size": [3, 3]}, + "east": {"uv": [12, 23], "uv_size": [1, 3]}, + "south": {"uv": [21, 0], "uv_size": [3, 3]}, + "west": {"uv": [13, 23], "uv_size": [1, 3]}, + "up": {"uv": [21, 6], "uv_size": [3, 1]}, + "down": {"uv": [14, 24], "uv_size": [3, -1]} } } ] @@ -44,42 +44,42 @@ { "name": "bone", "parent": "spell_turret", - "pivot": [0, 8, -2.5], + "pivot": [0, 8, -5], "cubes": [ { - "origin": [-0.5, 11.5, -4], + "origin": [-0.5, 11.5, -6.5], "size": [1, 2, 6], "uv": { - "north": {"uv": [10, 19], "uv_size": [1, 2]}, - "east": {"uv": [7, 14], "uv_size": [6, 2]}, - "south": {"uv": [11, 19], "uv_size": [1, 2]}, - "west": {"uv": [14, 7], "uv_size": [6, 2]}, - "up": {"uv": [16, 13], "uv_size": [1, 6]}, - "down": {"uv": [17, 15], "uv_size": [1, -6]} + "north": {"uv": [14, 12], "uv_size": [1, 2]}, + "east": {"uv": [18, 18], "uv_size": [6, 2]}, + "south": {"uv": [24, 1], "uv_size": [1, 2]}, + "west": {"uv": [19, 7], "uv_size": [6, 2]}, + "up": {"uv": [5, 21], "uv_size": [1, 6]}, + "down": {"uv": [6, 27], "uv_size": [1, -6]} } }, { - "origin": [-0.5, 11.5, 2], + "origin": [-0.5, 11.5, -0.5], "size": [1, 4, 3], "uv": { - "north": {"uv": [18, 9], "uv_size": [1, 4]}, - "east": {"uv": [14, 9], "uv_size": [3, 4]}, - "south": {"uv": [13, 18], "uv_size": [1, 4]}, - "west": {"uv": [13, 14], "uv_size": [3, 4]}, - "up": {"uv": [7, 19], "uv_size": [1, 3]}, - "down": {"uv": [8, 22], "uv_size": [1, -3]} + "north": {"uv": [20, 22], "uv_size": [1, 4]}, + "east": {"uv": [7, 19], "uv_size": [3, 4]}, + "south": {"uv": [21, 22], "uv_size": [1, 4]}, + "west": {"uv": [15, 19], "uv_size": [3, 4]}, + "up": {"uv": [8, 23], "uv_size": [1, 3]}, + "down": {"uv": [9, 26], "uv_size": [1, -3]} } }, { - "origin": [-0.5, 9.5, -5], + "origin": [-0.5, 9.5, -7.5], "size": [1, 2, 3], "uv": { - "north": {"uv": [12, 19], "uv_size": [1, 2]}, - "east": {"uv": [17, 15], "uv_size": [3, 2]}, - "south": {"uv": [16, 19], "uv_size": [1, 2]}, - "west": {"uv": [17, 17], "uv_size": [3, 2]}, - "up": {"uv": [14, 18], "uv_size": [1, 3]}, - "down": {"uv": [15, 21], "uv_size": [1, -3]} + "north": {"uv": [24, 4], "uv_size": [1, 2]}, + "east": {"uv": [21, 4], "uv_size": [3, 2]}, + "south": {"uv": [24, 9], "uv_size": [1, 2]}, + "west": {"uv": [12, 21], "uv_size": [3, 2]}, + "up": {"uv": [22, 22], "uv_size": [1, 3]}, + "down": {"uv": [7, 26], "uv_size": [1, -3]} } } ] @@ -87,43 +87,43 @@ { "name": "bone2", "parent": "spell_turret", - "pivot": [0, 8, -2.5], + "pivot": [0, 8, -5], "rotation": [0, 0, 90], "cubes": [ { - "origin": [-0.5, 11.5, -4], + "origin": [-0.5, 11.5, -6.5], "size": [1, 2, 6], "uv": { - "north": {"uv": [10, 19], "uv_size": [1, 2]}, - "east": {"uv": [7, 14], "uv_size": [6, 2]}, - "south": {"uv": [11, 19], "uv_size": [1, 2]}, - "west": {"uv": [14, 7], "uv_size": [6, 2]}, - "up": {"uv": [16, 13], "uv_size": [1, 6]}, - "down": {"uv": [17, 15], "uv_size": [1, -6]} + "north": {"uv": [14, 12], "uv_size": [1, 2]}, + "east": {"uv": [18, 18], "uv_size": [6, 2]}, + "south": {"uv": [24, 1], "uv_size": [1, 2]}, + "west": {"uv": [19, 7], "uv_size": [6, 2]}, + "up": {"uv": [5, 21], "uv_size": [1, 6]}, + "down": {"uv": [6, 27], "uv_size": [1, -6]} } }, { - "origin": [-0.5, 11.5, 2], + "origin": [-0.5, 11.5, -0.5], "size": [1, 4, 3], "uv": { - "north": {"uv": [18, 9], "uv_size": [1, 4]}, - "east": {"uv": [14, 9], "uv_size": [3, 4]}, - "south": {"uv": [13, 18], "uv_size": [1, 4]}, - "west": {"uv": [13, 14], "uv_size": [3, 4]}, - "up": {"uv": [7, 19], "uv_size": [1, 3]}, - "down": {"uv": [8, 22], "uv_size": [1, -3]} + "north": {"uv": [20, 22], "uv_size": [1, 4]}, + "east": {"uv": [7, 19], "uv_size": [3, 4]}, + "south": {"uv": [21, 22], "uv_size": [1, 4]}, + "west": {"uv": [15, 19], "uv_size": [3, 4]}, + "up": {"uv": [8, 23], "uv_size": [1, 3]}, + "down": {"uv": [9, 26], "uv_size": [1, -3]} } }, { - "origin": [-0.5, 9.5, -5], + "origin": [-0.5, 9.5, -7.5], "size": [1, 2, 3], "uv": { - "north": {"uv": [12, 19], "uv_size": [1, 2]}, - "east": {"uv": [17, 15], "uv_size": [3, 2]}, - "south": {"uv": [16, 19], "uv_size": [1, 2]}, - "west": {"uv": [17, 17], "uv_size": [3, 2]}, - "up": {"uv": [14, 18], "uv_size": [1, 3]}, - "down": {"uv": [15, 21], "uv_size": [1, -3]} + "north": {"uv": [24, 4], "uv_size": [1, 2]}, + "east": {"uv": [21, 4], "uv_size": [3, 2]}, + "south": {"uv": [24, 9], "uv_size": [1, 2]}, + "west": {"uv": [12, 21], "uv_size": [3, 2]}, + "up": {"uv": [22, 22], "uv_size": [1, 3]}, + "down": {"uv": [7, 26], "uv_size": [1, -3]} } } ] @@ -131,43 +131,43 @@ { "name": "bone3", "parent": "spell_turret", - "pivot": [0, 8, -2.5], + "pivot": [0, 8, -5], "rotation": [0, 0, -180], "cubes": [ { - "origin": [-0.5, 11.5, -4], + "origin": [-0.5, 11.5, -6.5], "size": [1, 2, 6], "uv": { - "north": {"uv": [10, 19], "uv_size": [1, 2]}, - "east": {"uv": [7, 14], "uv_size": [6, 2]}, - "south": {"uv": [11, 19], "uv_size": [1, 2]}, - "west": {"uv": [14, 7], "uv_size": [6, 2]}, - "up": {"uv": [16, 13], "uv_size": [1, 6]}, - "down": {"uv": [17, 15], "uv_size": [1, -6]} + "north": {"uv": [14, 12], "uv_size": [1, 2]}, + "east": {"uv": [18, 18], "uv_size": [6, 2]}, + "south": {"uv": [24, 1], "uv_size": [1, 2]}, + "west": {"uv": [19, 7], "uv_size": [6, 2]}, + "up": {"uv": [5, 21], "uv_size": [1, 6]}, + "down": {"uv": [6, 27], "uv_size": [1, -6]} } }, { - "origin": [-0.5, 11.5, 2], + "origin": [-0.5, 11.5, -0.5], "size": [1, 4, 3], "uv": { - "north": {"uv": [18, 9], "uv_size": [1, 4]}, - "east": {"uv": [14, 9], "uv_size": [3, 4]}, - "south": {"uv": [13, 18], "uv_size": [1, 4]}, - "west": {"uv": [13, 14], "uv_size": [3, 4]}, - "up": {"uv": [7, 19], "uv_size": [1, 3]}, - "down": {"uv": [8, 22], "uv_size": [1, -3]} + "north": {"uv": [20, 22], "uv_size": [1, 4]}, + "east": {"uv": [7, 19], "uv_size": [3, 4]}, + "south": {"uv": [21, 22], "uv_size": [1, 4]}, + "west": {"uv": [15, 19], "uv_size": [3, 4]}, + "up": {"uv": [8, 23], "uv_size": [1, 3]}, + "down": {"uv": [9, 26], "uv_size": [1, -3]} } }, { - "origin": [-0.5, 9.5, -5], + "origin": [-0.5, 9.5, -7.5], "size": [1, 2, 3], "uv": { - "north": {"uv": [12, 19], "uv_size": [1, 2]}, - "east": {"uv": [17, 15], "uv_size": [3, 2]}, - "south": {"uv": [16, 19], "uv_size": [1, 2]}, - "west": {"uv": [17, 17], "uv_size": [3, 2]}, - "up": {"uv": [14, 18], "uv_size": [1, 3]}, - "down": {"uv": [15, 21], "uv_size": [1, -3]} + "north": {"uv": [24, 4], "uv_size": [1, 2]}, + "east": {"uv": [21, 4], "uv_size": [3, 2]}, + "south": {"uv": [24, 9], "uv_size": [1, 2]}, + "west": {"uv": [12, 21], "uv_size": [3, 2]}, + "up": {"uv": [22, 22], "uv_size": [1, 3]}, + "down": {"uv": [7, 26], "uv_size": [1, -3]} } } ] @@ -175,43 +175,86 @@ { "name": "bone4", "parent": "spell_turret", - "pivot": [0, 8, -2.5], + "pivot": [0, 8, -5], "rotation": [0, 0, -90], "cubes": [ { - "origin": [-0.5, 11.5, -4], + "origin": [-0.5, 11.5, -6.5], "size": [1, 2, 6], "uv": { - "north": {"uv": [10, 19], "uv_size": [1, 2]}, - "east": {"uv": [7, 14], "uv_size": [6, 2]}, - "south": {"uv": [11, 19], "uv_size": [1, 2]}, - "west": {"uv": [14, 7], "uv_size": [6, 2]}, - "up": {"uv": [16, 13], "uv_size": [1, 6]}, - "down": {"uv": [17, 15], "uv_size": [1, -6]} + "north": {"uv": [14, 12], "uv_size": [1, 2]}, + "east": {"uv": [18, 18], "uv_size": [6, 2]}, + "south": {"uv": [24, 1], "uv_size": [1, 2]}, + "west": {"uv": [19, 7], "uv_size": [6, 2]}, + "up": {"uv": [5, 21], "uv_size": [1, 6]}, + "down": {"uv": [6, 27], "uv_size": [1, -6]} } }, { - "origin": [-0.5, 11.5, 2], + "origin": [-0.5, 11.5, -0.5], "size": [1, 4, 3], "uv": { - "north": {"uv": [18, 9], "uv_size": [1, 4]}, - "east": {"uv": [14, 9], "uv_size": [3, 4]}, - "south": {"uv": [13, 18], "uv_size": [1, 4]}, - "west": {"uv": [13, 14], "uv_size": [3, 4]}, - "up": {"uv": [7, 19], "uv_size": [1, 3]}, - "down": {"uv": [8, 22], "uv_size": [1, -3]} + "north": {"uv": [20, 22], "uv_size": [1, 4]}, + "east": {"uv": [7, 19], "uv_size": [3, 4]}, + "south": {"uv": [21, 22], "uv_size": [1, 4]}, + "west": {"uv": [15, 19], "uv_size": [3, 4]}, + "up": {"uv": [8, 23], "uv_size": [1, 3]}, + "down": {"uv": [9, 26], "uv_size": [1, -3]} } }, { - "origin": [-0.5, 9.5, -5], + "origin": [-0.5, 9.5, -7.5], "size": [1, 2, 3], "uv": { - "north": {"uv": [12, 19], "uv_size": [1, 2]}, - "east": {"uv": [17, 15], "uv_size": [3, 2]}, - "south": {"uv": [16, 19], "uv_size": [1, 2]}, - "west": {"uv": [17, 17], "uv_size": [3, 2]}, - "up": {"uv": [14, 18], "uv_size": [1, 3]}, - "down": {"uv": [15, 21], "uv_size": [1, -3]} + "north": {"uv": [24, 4], "uv_size": [1, 2]}, + "east": {"uv": [21, 4], "uv_size": [3, 2]}, + "south": {"uv": [24, 9], "uv_size": [1, 2]}, + "west": {"uv": [12, 21], "uv_size": [3, 2]}, + "up": {"uv": [22, 22], "uv_size": [1, 3]}, + "down": {"uv": [7, 26], "uv_size": [1, -3]} + } + } + ] + }, + { + "name": "gem", + "parent": "spell_turret", + "pivot": [0, 8, 3.5], + "cubes": [ + { + "origin": [-3.5, 7.5, 3.5], + "size": [7, 1, 3], + "uv": { + "north": {"uv": [19, 11], "uv_size": [7, 1]}, + "east": {"uv": [0, 24], "uv_size": [3, 1]}, + "south": {"uv": [21, 3], "uv_size": [7, 1]}, + "west": {"uv": [24, 0], "uv_size": [3, 1]}, + "up": {"uv": [18, 12], "uv_size": [7, 3]}, + "down": {"uv": [18, 18], "uv_size": [7, -3]} + } + }, + { + "origin": [-0.5, 4.5, 3.5], + "size": [1, 7, 3], + "uv": { + "north": {"uv": [3, 21], "uv_size": [1, 7]}, + "east": {"uv": [12, 14], "uv_size": [3, 7]}, + "south": {"uv": [4, 21], "uv_size": [1, 7]}, + "west": {"uv": [15, 12], "uv_size": [3, 7]}, + "up": {"uv": [17, 23], "uv_size": [1, 3]}, + "down": {"uv": [23, 25], "uv_size": [1, -3]} + } + }, + { + "origin": [-2.5, 5.5, 5.5], + "size": [5, 5, 2], + "uv": { + "north": {"uv": [7, 14], "uv_size": [5, 5]}, + "east": {"uv": [10, 19], "uv_size": [2, 5]}, + "south": {"uv": [14, 7], "uv_size": [5, 5]}, + "west": {"uv": [18, 20], "uv_size": [2, 5]}, + "up": {"uv": [19, 9], "uv_size": [5, 2]}, + "down": {"uv": [20, 22], "uv_size": [5, -2]} } } ] diff --git a/src/main/resources/assets/ars_nouveau/textures/block/basic_spell_turret.png b/src/main/resources/assets/ars_nouveau/textures/block/basic_spell_turret.png index 612c3d3e43daf3ee22e87c811477be3c93d522b0..5620762a75e67b809a8d70743deb3e0c2247101e 100644 GIT binary patch delta 731 zcmV<10wn#{1@Z-uBYyw^b5ch_0Itp)=>Px%tVu*cR9J=WlV3x8c@qGou7R3bCw5~(22_2M<+#h*MAbJ5wFRtO+KGwCvb&yHLaA#Y)E2NdJ!$MX zl1BSyjl-^MYJZ*9Ee`iZV$Tv|$EV<8_nQaRMqu=F#PuA6)wNS!py6<02rCR#8cymp=Hy|PdWg|@2pbL za=2x&XZR<1%BESzEJP7bf)19TQ2_i%l7KF|9Du)ZmKAr`e@JV(T~>5u(SuTHp_g3( z11Ty!NS6@9LsSMW6wxWDu7%*O*b2f!xs=e+E*T}LiwKJ@=D`MIKv->eMRR-|R;RVd ze52j=yS#bxoA>7Td+&Wud3k$Tu*Kp^9Ds_V8WvaLR20=o{-q_(=1 zjEy>IYDv+1cZ!O}8cQ)5Y?agI;H-)#4CRzKwfz_A{dD~05JqbWraXI;g zHmt^^5?EY`GdAilCs|yH)8eZ(tF#i6!Ay60;R9vG<+S*!%}Mtg+Y8F&wx=RH>-<8S zSw;41mT4uitfA_5)875tWJiXjJ%6;U;kIf+*L>pqy=IJ50@Yap z4nIo%orBTPt6rqIOqiOvT&n;azkZ+R;(;I?W90EC0G20bad}Em-E!NotAy#~6F^9z)k@?=GdiJF_}2*D6BsWVYg^lJtzjOk-YS?x9o$2=Y;3Q2w0ZQvnVd$?iCq5mcsV5+H z>iR%Fn$87aWPe067XS$PYS7FDLcSUb z(W#$IW9TtbMgmzW1waYbBJJst$dO`z_T#C{wv5TBha*iX&h*U^I$Tqb&M}@gHDslf zK>5Hn!@>dE`!a^dWL^kb{H9BcU%k(x^~V&dbBz0qWvHyrXWMqbhB74{0SN5dPr~~L zh3YB}He={9VSjvWwa3brh9b>eU^40vk7(usO$Vw)l!fRFJ;s;kd?=v~lu!qO@&PGO zJ|N|-0f1ju?h@FypQZ!V;?Y8NO0brb;TTv`uJ8j$U9CgbqxHw)V6V3rXP>?PH@fiW zcafFSyp_Mjf&WTFXRVnFD9_vmAi1`IKj0y`w!y~w6My=~F63tc6h=d;;Db|TnRAPu z?$6S62wr~UCMCWQX;Ty5zOnoW6ih>h1;b;qK*#v&6()apdkaFX?_UIN<#nLQ`7xJH zd%eZD=^Pd~#x|YW6wO>f3D)KhACRuRJ7r~8utTTMMn`FAXe6J`DZ1?9yZX&TQbqy* zSt;GJ&VSbp3#MVyA%iwmw@^5@a>L z&O0Bc80?lQuk_NU>h81P*x}=1^G~Rzep;M~R?k2j6!%|!Yc{hgrL+Hcv33(z8tz0j zLz~M)ZA0utpIdC%W7tiKoT!J#WYOFEwouL1MSmYIZn>B;5+vg@40g)^7cOEY^qg@6il!G0+5M%JG6zQz?Fvis5aOw)2>bch;BC=c?pkqk7&XE zfCqq6S9)A$fh!F!4b5d})=1<%CnXn!;fgvnQ;;#*)roB__~&n1U84smo?n_}dfJ9| zg@0A%mu5w@DI>vPx6HXwm|rS_DoDm>=uTx3Jdv|vrdr&M!TP%NNJ^p}4)CJOuz=*iuH>mNjhL2G6dt7;Ui@qb=6%e?FC`^8d--7H0O* TcQ1%w00000NkvXXu0mjf%hD-Z delta 718 zcmV;<0x|uf3GxMyFnnJ+?>$r9aS~l!zXBDMSmR7kjX$-h$i$88%IDpoTQ!u7P)UWk#dAJ>2ag zMCrNqxG!AJIrn$|e9!OvKGO4vuLdQl`X&H=Pb;dviQm(ToqyPkM?r~W$_Wq|ER=?g zEXQ4(4;2`jTEpMnYAYrpr|G_t7YlCA_zXT~B^DpN=llK-?8Zb?RZeAj69A>Iftp$; zc4I;YRDF}>xXao^)i(*X1*}`ziHXRvyPjD>scRtA7O*xwY3w+XM*C-t!>(&;oz^W5 z_eEmQ5@W}w;D2KGpfwOdO+NJofc)+OUd2Uz_ke@bKbcy%E0hM?7>3S4&*j%td;9>n z<$Cfvt4uA39Df1~2clVI-xZL8Y`?onb4L`}e--EwGGH6Sf|er|&VZ4`+tLX}()2O~)=oMGrr4zJ<^bQT}?aD8?_==N{~hTfJ=E3H7O;?u;!`v4SmmHci1 z+1Ji+EPri}f}>EI8{e}Kn;YMwpyh}}6GWnBcD#xUq#*N?9(xp+s0IE&EtOiKsH^mj zfR?QXpm!ukQCCgwDHR>2!Qq%*8VhEi+*!{oS%;U+ln(+}yzj#;*K_v5GzBdOfR;@& z5X~YvMkS?bMv@$(!WcR?w%16dRshKGnT_o=3r98C*G_(CwKUadHb#=7uF~8Qwe{vg zGJd6ut$3fY74I_+|Nr!1$oSiuiYlt8qKZWI8{w|}9kO92*#H0l07*qoM6N<$g363n A_y7O^ diff --git a/src/main/resources/assets/ars_nouveau/textures/block/spell_turret_timer.png b/src/main/resources/assets/ars_nouveau/textures/block/spell_turret_timer.png index 1c49d1898475f638dda07f25897c6b8494a8e49d..3b91212bca6ccd80ef6e6799febad9074f91c297 100644 GIT binary patch delta 926 zcmV;P17ZBM2f+uBF@JkWL_t(oh3%G4XcSi*$3L?!E6lJfGXv|6B_Y<01f|(3B9fqo zisVqbhiYpMrAhx-@Dk_mfIho{|WarPama+Qc?w(VY(L zES+T*4ASXgcE_X%o7w55hkP&d-u&L5-}}DznK!~W=l^nPs()fH0H7s$sn`o>iC)6Q zMla-1Uz!jIpeVrbNvB!e#oc+4!-EbVT`Zy<=nWO?L{TsMUF3g|csb?ryCE?1`7b=H zKPPNV(cS?j0woY>S=kx{K;5yE?eQpKW946SfgOlc>;>-5i~b-Ldx62dX@8YrVk>qf za01a*;X!#0b$`cB2KT1@LBqymYdLTN!iPg&yU*&+{TJKgQCjuY^MeEd}bfbqA>ynERU z{0)HrfT3fVi19S1&MjgYHdA8~Kt~4h~4Ms{yre=2srhlO=hQ~*XWY5g{jgOBOk$W<9?K?&+ zq0zNpC!ZVe4qs1(nJ^XAUN3Cn$F|K`Llhq9%vjIwv09c$q;r@87pIX&(2e*J@nJB5w z9Ebo|MhPX=$BJF?uG6MALn*5p$f}5>B(aRry8b~FZS9|D-E|zxcp~)Eu2K9Tf%IMbZl!1>uQs- zfkQD2#s;ReuxnT7ZH#W~V7Fbi+t_Xy^pL}r9R^)*Bcw3aGE>54LLi=#jHXSIW0O}R zTO>7YwSyv&lFpH}%MSTo^qzk2{q*~z&y%F@uWs4w$}pD!(0`N+hPjNUWC&tAcljG$ ze05sFhe7}siq`J*D0glT@WzD2rOy}8PG$nxx>3l9{wOm)MR;l0=I@%sjj#XYQS&iD zZ7;n1CNS+QfF8G$t`h(?HpG!=h@iIB(vQ9?&|{d(+_^pAIWf#-CiJwIWf0p=qv<<< zkULnse+xA>#D9dI_M8T_X}u492OwQ6T(ciFAA2{BL_@gqz2k0d)4%l~^vI#mGLrqOi^0%Q2; zC)WrkquvAEvDW(#^_{kIik zIKs^@zJDT9%=x0BBZi_@q5R#?Y;8)sekqGS+4M41cdypUI&ITneyYS|NTXfwi)ZwZd-p>$F<^Y;6t@Njq(D&w)Ng^Yw5z07K)Kn_j8i zUPsc$yzJd;I2lEsbR5RTJ&Z=vHw_&zRCC7}8h=;4#cJ+2N=hd_dV+8=N-BGv>YQMw z(L_nc;TiPw$;2~=8BgMb_mtOdPa->pCF&jtz61F1 z@_!WCsWTpG@zE2k{4j%7$OHPnqO^EDYj6I(M62agN7O2`O{41y^Z;0*P9!ntU?u9F z@gS76LLOP(rccqZM19|WKMJ}1OAL=;aErESaQe!+#FfrJmEmL*bG5qfUbo)@7O!XR ngI7I&U(mgWI@F>5SNaFTAZ{-_n~B%}015yANkvXXu0mjfaz@0~ From f00953b1224581d29c74b2ae8c6251914a7174a7 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 29 Jul 2024 18:36:36 -0500 Subject: [PATCH 103/363] update geckolib, armor rendering on table broken --- gradle.properties | 2 +- .../tile/AlterationTableRenderer.java | 56 +++++++++++++------ 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/gradle.properties b/gradle.properties index baf97651dd..03e94d42c0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,6 +24,6 @@ mod_description=Craft spells, create powerful baubles, and summon magical creatu jei_version=19.5.0.44 curios_version=8.0.0-beta -geckolib_version=4.5.6 +geckolib_version=4.5.7 patchouli_version=85-NEOFORGE caelus_version=7.0.0+1.21 diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java index 13c1e3f49e..0556bbfadc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java @@ -39,6 +39,7 @@ import net.minecraft.world.item.armortrim.ArmorTrim; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; +import net.neoforged.neoforge.client.ClientHooks; import org.joml.Quaternionf; import org.joml.Vector3d; import software.bernie.geckolib.cache.object.BakedGeoModel; @@ -62,12 +63,13 @@ public AlterationTableRenderer(BlockEntityRendererProvider.Context p_i226006_1_) this.armorTrimAtlas = Minecraft.getInstance().getModelManager().getAtlas(Sheets.ARMOR_TRIMS_SHEET); } - public void renderArmorStack(AlterationTile tile, PoseStack matrixStack, float ticks, MultiBufferSource iRenderTypeBuffer, VertexConsumer bufferIn, int packedLightIn, int packedOverlayIn, float partialTicks, int colour) { + public void renderArmorStack(AlterationTile tile, PoseStack matrixStack, float ticks, MultiBufferSource iRenderTypeBuffer, int packedLightIn, int packedOverlayIn) { matrixStack.pushPose(); BlockState state = tile.getLevel().getBlockState(tile.getBlockPos()); if (!(state.getBlock() instanceof AlterationTable)) return; - if (tile.armorStack.getItem() instanceof ArmorItem armorItem) { + ItemStack stack = tile.armorStack; + if (stack.getItem() instanceof ArmorItem armorItem) { // to rotate around a point: scale, point translate, rotate, object translate matrixStack.scale(0.5f, 0.5f, 0.5f); matrixStack.translate(-2.1, 3.3, 0); @@ -84,14 +86,14 @@ public void renderArmorStack(AlterationTile tile, PoseStack matrixStack, float t matrixStack.mulPose(Axis.ZP.rotationDegrees(180F)); matrixStack.translate(0, yOffset + rotForSlot(armorItem.getEquipmentSlot()), 0); - this.renderArmorPiece(tile, tile.armorStack, matrixStack, iRenderTypeBuffer, packedLightIn, getArmorModel(armorItem.getEquipmentSlot()), colour); + this.renderArmorPiece(tile,stack, matrixStack, iRenderTypeBuffer, packedLightIn, getArmorModel(armorItem.getEquipmentSlot())); } else { - Minecraft.getInstance().getItemRenderer().renderStatic(tile.armorStack, ItemDisplayContext.FIXED, packedLightIn, packedOverlayIn, matrixStack, iRenderTypeBuffer, tile.getLevel(), (int) tile.getBlockPos().asLong()); + Minecraft.getInstance().getItemRenderer().renderStatic(stack, ItemDisplayContext.FIXED, packedLightIn, packedOverlayIn, matrixStack, iRenderTypeBuffer, tile.getLevel(), (int) tile.getBlockPos().asLong()); } matrixStack.popPose(); } - public void renderPerks(AlterationTile tile, PoseStack matrixStack, float ticks, MultiBufferSource iRenderTypeBuffer, VertexConsumer bufferIn, int packedLightIn, int packedOverlayIn, float partialTicks) { + public void renderPerks(AlterationTile tile, PoseStack matrixStack, MultiBufferSource iRenderTypeBuffer, int packedLightIn, int packedOverlayIn) { if (tile.perkList.isEmpty()) { return; } @@ -135,19 +137,21 @@ private ArmorStandArmorModel getArmorModel(EquipmentSlot pSlot) { return (this.usesInnerModel(pSlot) ? this.innerModel : this.outerModel); } - private void renderArmorPiece(AlterationTile tile, ItemStack itemstack, PoseStack pPoseStack, MultiBufferSource pBuffer, int packedLightIn, ArmorStandArmorModel armorModel, int defaultColor) { + private void renderArmorPiece(AlterationTile tile, ItemStack itemstack, PoseStack pPoseStack, MultiBufferSource pBuffer, int packedLightIn, ArmorStandArmorModel armorModel) { if (!(itemstack.getItem() instanceof ArmorItem armoritem)) return; EquipmentSlot pSlot = armoritem.getEquipmentSlot(); - Model model = getArmorModelHook(itemstack, pSlot, armorModel); + setPartVisibility(armorModel, pSlot); + + Model model = ClientHooks.getArmorModel(Minecraft.getInstance().player, itemstack, pSlot, armorModel); boolean innerModel = this.usesInnerModel(pSlot); var dyeColor = itemstack.get(DataComponents.DYED_COLOR); int color = dyeColor != null ? FastColor.ABGR32.opaque(dyeColor.rgb()) : -1; ArmorMaterial armormaterial = armoritem.getMaterial().value(); for (ArmorMaterial.Layer armormaterial$layer : armormaterial.layers()) { int j = armormaterial$layer.dyeable() ? color : -1; - var texture = net.neoforged.neoforge.client.ClientHooks.getArmorTexture(Minecraft.getInstance().player, itemstack, armormaterial$layer, innerModel, pSlot); + var texture = ClientHooks.getArmorTexture(Minecraft.getInstance().player, itemstack, armormaterial$layer, innerModel, pSlot); this.renderModel(pPoseStack, pBuffer, packedLightIn, model, j, texture); } @@ -161,10 +165,6 @@ private void renderArmorPiece(AlterationTile tile, ItemStack itemstack, PoseStac } } - protected net.minecraft.client.model.Model getArmorModelHook(ItemStack itemStack, EquipmentSlot slot, HumanoidModel model) { - return net.neoforged.neoforge.client.ClientHooks.getArmorModel(Minecraft.getInstance().player, itemStack, slot, model); - } - private void renderModel(PoseStack p_289664_, MultiBufferSource p_289689_, int p_289681_, net.minecraft.client.model.Model p_289658_, int p_350798_, ResourceLocation p_324344_) { VertexConsumer vertexconsumer = p_289689_.getBuffer(RenderType.armorCutoutNoCull(p_324344_)); p_289658_.renderToBuffer(p_289664_, vertexconsumer, p_289681_, OverlayTexture.NO_OVERLAY, p_350798_); @@ -225,8 +225,8 @@ public void actuallyRender(PoseStack stack, AlterationTile tile, BakedGeoModel m } @Override - public void renderFinal(PoseStack stack, AlterationTile animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay, int colour) { - super.renderFinal(stack, animatable, model, bufferSource, buffer, partialTick, packedLight, packedOverlay, colour); + public void render(AlterationTile animatable, float partialTick, PoseStack stack, MultiBufferSource bufferSource, int packedLight, int packedOverlay) { + super.render(animatable, partialTick, stack, bufferSource, packedLight, packedOverlay); if (animatable.getLevel().getBlockState(animatable.getBlockPos()).getBlock() != BlockRegistry.ALTERATION_TABLE.get()) return; if (animatable.getLevel().getBlockState(animatable.getBlockPos()).getValue(AlterationTable.PART) != ThreePartBlock.HEAD) @@ -263,14 +263,14 @@ public void renderFinal(PoseStack stack, AlterationTile animatable, BakedGeoMode stack.translate(-1.5, 1.95, 0); } - this.renderArmorStack(animatable, stack, (float) ticks, bufferSource, buffer, packedLight, packedOverlay, partialTick, colour); + this.renderArmorStack(animatable, stack, (float) ticks, bufferSource, packedLight, packedOverlay); stack.popPose(); stack.pushPose(); stack.mulPose(perkQuat); stack.translate(perkTranslate.x, perkTranslate.y, perkTranslate.z); - this.renderPerks(animatable, stack, (float) ticks, bufferSource, buffer, packedLight, packedOverlay, partialTick); + this.renderPerks(animatable, stack, bufferSource, packedLight, packedOverlay); stack.popPose(); } @@ -315,6 +315,30 @@ public RenderType getRenderType(AlterationTile animatable, ResourceLocation text return RenderType.entityTranslucent(texture); } + protected void setPartVisibility(HumanoidModel pModel, EquipmentSlot pSlot) { + pModel.setAllVisible(false); + switch (pSlot) { + case HEAD: + pModel.head.visible = true; + pModel.hat.visible = true; + break; + case CHEST: + pModel.body.visible = true; + pModel.rightArm.visible = true; + pModel.leftArm.visible = true; + break; + case LEGS: + pModel.body.visible = true; + pModel.rightLeg.visible = true; + pModel.leftLeg.visible = true; + break; + case FEET: + pModel.rightLeg.visible = true; + pModel.leftLeg.visible = true; + } + } + + @Override public boolean shouldRenderOffScreen(AlterationTile pBlockEntity) { return true; From 1c9c3b570c5ceadad9f757b60f089c2e2ea6a27b Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 29 Jul 2024 18:37:13 -0500 Subject: [PATCH 104/363] Fix crash with golems, codex --- .../hollingsworth/arsnouveau/common/entity/AmethystGolem.java | 2 +- .../hollingsworth/arsnouveau/common/items/data/CodexData.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java index bcffe3cfa7..6d0acd72fd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java @@ -265,7 +265,7 @@ public void addAdditionalSaveData(CompoundTag tag) { tag.putInt("harvest", harvestCooldown); tag.putInt("pickup", pickupCooldown); - if (getHeldStack() != null) { + if (getHeldStack() != null && !getHeldStack().isEmpty()) { Tag itemTag = getHeldStack().save(level.registryAccess()); tag.put("held", itemTag); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/CodexData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/CodexData.java index 7a10dec560..ece705e3b7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/CodexData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/CodexData.java @@ -39,7 +39,7 @@ public CodexData(UUID uuid, String playerName, List glyphIds) } public boolean wasRecorded(){ - return uuid.isPresent() && playerName != null && !playerName.isEmpty() && !uuid.get().equals(UUID.fromString("")); + return uuid.isPresent() && playerName != null && !playerName.isEmpty(); } @Override From 297d74346e5f79e721a2bfc1962ed6864fae8283 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 29 Jul 2024 18:46:09 -0500 Subject: [PATCH 105/363] Fix dynamic registry namespace for addons --- .../arsnouveau/setup/ModSetup.java | 2 +- .../setup/registry/CreativeTabRegistry.java | 24 ++++++++++++------- .../setup/registry/ItemsRegistry.java | 11 +++++---- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java index 570e1bfb4a..6a3a5cc26b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/ModSetup.java @@ -55,7 +55,7 @@ public static void registerEvents(RegisterEvent event) { }); event.register(Registries.ITEM, helper ->{ BlockRegistry.onBlockItemsRegistry(); - ItemsRegistry.onItemRegistry(); + ItemsRegistry.onItemRegistry(helper); }); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CreativeTabRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CreativeTabRegistry.java index d579ef86e9..39c8b75b54 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CreativeTabRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CreativeTabRegistry.java @@ -1,10 +1,16 @@ package com.hollingsworth.arsnouveau.setup.registry; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.registry.FamiliarRegistry; import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; +import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; +import com.hollingsworth.arsnouveau.api.registry.RitualRegistry; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; +import com.hollingsworth.arsnouveau.common.items.FamiliarScript; import com.hollingsworth.arsnouveau.common.items.Glyph; +import com.hollingsworth.arsnouveau.common.items.PerkItem; +import com.hollingsworth.arsnouveau.common.items.RitualTablet; import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; @@ -38,15 +44,15 @@ public class CreativeTabRegistry { output.accept(entry.get().getDefaultInstance()); } } -// for (PerkItem perk : PerkRegistry.getPerkItemMap().values()) { -// output.accept(perk.getDefaultInstance()); -// } -// for (RitualTablet ritual : RitualRegistry.getRitualItemMap().values()) { -// output.accept(ritual.getDefaultInstance()); -// } -// for (FamiliarScript familiar : FamiliarRegistry.getFamiliarScriptMap().values()) { -// output.accept(familiar.getDefaultInstance()); -// } + for (PerkItem perk : PerkRegistry.getPerkItemMap().values()) { + output.accept(perk.getDefaultInstance()); + } + for (RitualTablet ritual : RitualRegistry.getRitualItemMap().values()) { + output.accept(ritual.getDefaultInstance()); + } + for (FamiliarScript familiar : FamiliarRegistry.getFamiliarScriptMap().values()) { + output.accept(familiar.getDefaultInstance()); + } }).withTabsBefore(CreativeModeTabs.SPAWN_EGGS) .build()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java index b86a8743e0..caf30909e5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java @@ -36,6 +36,7 @@ import net.minecraft.world.item.*; import net.neoforged.neoforge.common.DeferredSpawnEggItem; import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.registries.RegisterEvent; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -233,30 +234,30 @@ public static ItemRegistryWrapper register(String name) { return register(name, ModItem::new); } - public static void onItemRegistry() { + public static void onItemRegistry(RegisterEvent.RegisterHelper helper) { ArsNouveauAPI api = ArsNouveauAPI.getInstance(); for (Map.Entry> glyphEntry : GlyphRegistry.getGlyphItemMap().entrySet()) { Glyph glyph = glyphEntry.getValue().get(); - ITEMS.register(glyphEntry.getKey().getPath(), () -> glyph); + helper.register(glyphEntry.getKey(), glyph); glyph.spellPart.glyphItem = glyph; } for (AbstractRitual ritual : RitualRegistry.getRitualMap().values()) { RitualTablet tablet = new RitualTablet(ritual); - ITEMS.register(ritual.getRegistryName().getPath(), () -> tablet); + helper.register(ritual.getRegistryName(), tablet); RitualRegistry.getRitualItemMap().put(ritual.getRegistryName(), tablet); } for (AbstractFamiliarHolder holder : FamiliarRegistry.getFamiliarHolderMap().values()) { FamiliarScript script = new FamiliarScript(holder); FamiliarRegistry.getFamiliarScriptMap().put(holder.getRegistryName(), script); - ITEMS.register(holder.getRegistryName().getPath(), () -> script); + helper.register(holder.getRegistryName(), script); } for(IPerk perk : PerkRegistry.getPerkMap().values()) { PerkItem perkItem = new PerkItem(perk); PerkRegistry.getPerkItemMap().put(perk.getRegistryName(), perkItem); - ITEMS.register(perk.getRegistryName().getPath(), () -> perkItem); + helper.register(perk.getRegistryName(), perkItem); if(perk instanceof EmptyPerk){ BLANK_THREAD = perkItem; } From c9f5b5341a87f3eabe3a126d65bc73f5f6735578 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 29 Jul 2024 18:47:21 -0500 Subject: [PATCH 106/363] Fix snow spawning on wrong blocks --- .../.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 | 3 ++- .../tags/block/snow_layer_cannot_survive_on.json | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 src/generated/resources/data/minecraft/tags/block/snow_layer_cannot_survive_on.json diff --git a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 index ed20fed5f5..5fda19716b 100644 --- a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 +++ b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 @@ -1,4 +1,4 @@ -// 1.21 2024-07-05T22:41:47.5461209 AN tags +// 1.21 2024-07-29T18:47:02.5107712 AN tags 939cde8f97e4e8d7ea8445415522f703b2b927d4 data/ars_nouveau/tags/block/an_decorative.json de95bc21249101b079255a1a00274f60d55e0602 data/ars_nouveau/tags/block/blazing_logs.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/block/break_blacklist.json @@ -49,6 +49,7 @@ f898aac12b01b598949701b1f6e45aa0cd1d9a25 data/minecraft/tags/block/planks.json 5a18f153ac2947c6cea854e2fa5be21d85eb6766 data/minecraft/tags/block/portals.json ce9ccf92ade8cd330c990516ee0f8a30c35adea9 data/minecraft/tags/block/saplings.json c5ffd8d59cb98c262e42a783ddf9a73a9b76ad9d data/minecraft/tags/block/slabs.json +e1f9228fcfd5239b31f41c19010ba7d145266843 data/minecraft/tags/block/snow_layer_cannot_survive_on.json e0e9a39db9de083bbe33dbea99e0f4c0be9627d0 data/minecraft/tags/block/stairs.json 23fc13405d4dc43512deb39ee5bbbb73da177166 data/minecraft/tags/block/trapdoors.json 43a847dca5f71ae27537abc65fabcd8d3fdb1c72 data/minecraft/tags/block/wooden_buttons.json diff --git a/src/generated/resources/data/minecraft/tags/block/snow_layer_cannot_survive_on.json b/src/generated/resources/data/minecraft/tags/block/snow_layer_cannot_survive_on.json new file mode 100644 index 0000000000..14884ebae6 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/block/snow_layer_cannot_survive_on.json @@ -0,0 +1,13 @@ +{ + "values": [ + "ars_nouveau:alteration_table", + "ars_nouveau:wixie_cauldron", + "ars_nouveau:potion_melder", + "ars_nouveau:scribes_table", + "ars_nouveau:imbuement_chamber", + "ars_nouveau:scryers_oculus", + "ars_nouveau:arcane_pedestal", + "ars_nouveau:storage_lectern", + "ars_nouveau:enchanting_apparatus" + ] +} \ No newline at end of file From 4c2bdf553350be4911073c6bfcceb0194e280e23 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 30 Jul 2024 09:30:36 -0500 Subject: [PATCH 107/363] 5.0.4 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 03e94d42c0..c98ece1a9b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.0.3 +mod_version=5.0.4 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From c24a59d0205e2b1859e20cc47ba64260200a0687 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 30 Jul 2024 18:56:43 -0500 Subject: [PATCH 108/363] Fix newly crafted starbuncles running to 0,0,0, charms not stacking --- .../arsnouveau/common/entity/Starbuncle.java | 2 +- .../entity/goal/carbuncle/FindItem.java | 141 ------------------ .../goal/carbuncle/ForageManaBerries.java | 113 -------------- .../entity/goal/carbuncle/StoreItemGoal.java | 75 ---------- .../entity/goal/carbuncle/TakeItemGoal.java | 101 ------------- .../common/items/StarbuncleShard.java | 4 +- .../items/data/StarbuncleCharmData.java | 2 +- 7 files changed, 4 insertions(+), 434 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/FindItem.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/ForageManaBerries.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StoreItemGoal.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/TakeItemGoal.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index be0dfe4e82..c44f499355 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -246,7 +246,7 @@ public void attemptTame() { if (tamingTime > 60 && !level.isClientSide) { ItemStack stack = new ItemStack(ItemsRegistry.STARBUNCLE_SHARD.get(), 1 + level.random.nextInt(2)); - if (this.data.adopter != null) { + if (this.data.adopter != null && !this.data.adopter.isEmpty()) { stack.setCount(1); stack.set(DataComponentRegistry.STARBUNCLE_DATA, this.data.immutable()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/FindItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/FindItem.java deleted file mode 100644 index 36e058a6a7..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/FindItem.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.hollingsworth.arsnouveau.common.entity.goal.carbuncle; - -import com.hollingsworth.arsnouveau.common.entity.Starbuncle; -import com.hollingsworth.arsnouveau.common.entity.debug.DebugEvent; -import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.pathfinder.Path; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.EnumSet; -import java.util.List; -import java.util.function.Predicate; - -public class FindItem extends Goal { - protected Starbuncle starbuncle; - boolean itemStuck; - int timeFinding; - int stuckTicks; - List destList = new ArrayList<>(); - ItemEntity dest; - public StarbyTransportBehavior behavior; - private final Predicate TRUSTED_TARGET_SELECTOR = itemEntity -> !itemEntity.hasPickUpDelay() && itemEntity.isAlive() && behavior.getValidStorePos(itemEntity.getItem()) != null; - - @Override - public void stop() { - super.stop(); - itemStuck = false; - timeFinding = 0; - destList = new ArrayList<>(); - dest = null; - stuckTicks = 0; - starbuncle.goalState = Starbuncle.StarbuncleGoalState.NONE; - } - - @Override - public void start() { - super.start(); - timeFinding = 0; - itemStuck = false; - stuckTicks = 0; - starbuncle.goalState = Starbuncle.StarbuncleGoalState.HUNTING_ITEM; - } - - public FindItem(Starbuncle starbuncle, StarbyTransportBehavior transportBehavior) { - this.starbuncle = starbuncle; - this.behavior = transportBehavior; - this.setFlags(EnumSet.of(Flag.MOVE)); - } - - public List nearbyItems() { - return starbuncle.level.getEntitiesOfClass(ItemEntity.class, starbuncle.getAABB(), TRUSTED_TARGET_SELECTOR); - } - - @Override - public boolean canContinueToUse() { - if (behavior.isPickupDisabled()) - return false; - if(timeFinding > 20 * 15){ - starbuncle.addGoalDebug(this, new DebugEvent("TooLong", "Stopped finding item, time finding expired")); - return false; - } - return !itemStuck && starbuncle.getHeldStack().isEmpty(); - } - - @Override - public boolean canUse() { - if (behavior.isPickupDisabled() || !starbuncle.getHeldStack().isEmpty()) - return false; - ItemStack itemstack = starbuncle.getHeldStack(); - List list = nearbyItems(); - itemStuck = false; - destList = new ArrayList<>(); - if (itemstack.isEmpty() && !list.isEmpty()) { - for (ItemEntity entity : list) { - if (behavior.getValidStorePos(entity.getItem()) == null) - continue; - destList.add(entity); - } - } - if (destList.isEmpty()) { - starbuncle.addGoalDebug(this, new DebugEvent("NoStacks", "No storable items nearby")); - return false; - } - Collections.shuffle(destList); - for (ItemEntity e : destList) { - Path path = starbuncle.minecraftPathNav.createPath(BlockPos.containing(e.position()), 1, 9); - if (path != null && path.canReach()) { - this.dest = e; - starbuncle.addGoalDebug(this, new DebugEvent("DestSet", "Dest set to " + e)); - break; - } - } - if (dest == null) { - starbuncle.setBackOff(30 + starbuncle.level.random.nextInt(30)); - starbuncle.addGoalDebug(this, new DebugEvent("NotReachable", "No pathable items nearby")); - return false; - } - if(behavior.isBedPowered()){ - starbuncle.addGoalDebug(this, new DebugEvent("BedPowered", "Bed powered, cannot pickup items")); - return false; - } - return dest != null && !nearbyItems().isEmpty(); - } - - @Override - public void tick() { - super.tick(); - if (dest == null || dest.getItem().isEmpty() || dest.isRemoved()) { - itemStuck = true; - starbuncle.addGoalDebug(this, new DebugEvent("ItemRemoved", "Item removed during goal")); - return; - } - timeFinding++; - starbuncle.minecraftPathNav.stop(); - Path path = starbuncle.minecraftPathNav.createPath(BlockPos.containing(dest.position()), 1, 9); - if (path == null || !path.canReach()) { - stuckTicks++; - if (stuckTicks > 20 * 5) { // Give up after 5 seconds of being unpathable, in case we fall or jump into the air - itemStuck = true; - starbuncle.addGoalDebug(this, new DebugEvent("ItemStuck", "Item stuck for 5 seconds. Ending goal")); - } - return; - } - ItemStack itemstack = starbuncle.getHeldStack(); - if (!itemstack.isEmpty()) { - itemStuck = true; - starbuncle.addGoalDebug(this, new DebugEvent("ItemPickup", "Received item, ending.")); - return; - } - starbuncle.getNavigation().moveTo(dest, 1.4d); - starbuncle.addGoalDebug(this, new DebugEvent("PathTo", "Pathing to " + dest)); - } - - @Override - public boolean isInterruptable() { - return false; - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/ForageManaBerries.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/ForageManaBerries.java deleted file mode 100644 index 750ffb8eda..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/ForageManaBerries.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.hollingsworth.arsnouveau.common.entity.goal.carbuncle; - -import com.hollingsworth.arsnouveau.api.util.BlockUtil; -import com.hollingsworth.arsnouveau.common.block.SourceBerryBush; -import com.hollingsworth.arsnouveau.common.entity.Starbuncle; -import com.hollingsworth.arsnouveau.common.entity.debug.DebugEvent; -import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; -import net.minecraft.commands.arguments.EntityAnchorArgument; -import net.minecraft.core.BlockPos; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.Vec3; - -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.List; - -import static com.hollingsworth.arsnouveau.common.block.SourceBerryBush.AGE; - -public class ForageManaBerries extends Goal { - private final Starbuncle entity; - private final Level world; - int timeSpent; - BlockPos pos; - StarbyTransportBehavior behavior; - - public ForageManaBerries(Starbuncle starbuncle, StarbyTransportBehavior transportBehavior) { - this.entity = starbuncle; - this.world = entity.level; - this.setFlags(EnumSet.of(Flag.MOVE)); - this.behavior = transportBehavior; - } - - @Override - public void start() { - super.start(); - timeSpent = 0; - entity.goalState = Starbuncle.StarbuncleGoalState.FORAGING; - } - - @Override - public void stop() { - super.stop(); - timeSpent = 0; - entity.goalState = Starbuncle.StarbuncleGoalState.NONE; - } - - @Override - public boolean canUse() { - if (behavior.isPickupDisabled() || !entity.getHeldStack().isEmpty() || world.random.nextDouble() > 0.05 || behavior.getValidStorePos(new ItemStack(BlockRegistry.SOURCEBERRY_BUSH)) == null) - return false; - this.pos = getNearbyManaBerry(); - if(pos == null){ - entity.addGoalDebug(this, new DebugEvent("NoBerries", "No Berries Nearby")); - return false; - } - if(behavior.isBedPowered()){ - entity.addGoalDebug(this, new DebugEvent("Bed Powered", "Bed powered, no berry pickin")); - return false; - } - return pos != null; - } - - @Override - public boolean isInterruptable() { - return false; - } - - @Override - public void tick() { - super.tick(); - timeSpent++; - if (this.pos == null) { - return; - } - - if (BlockUtil.distanceFrom(entity.position, pos) >= 2.0) { - entity.getNavigation().tryMoveToBlockPos(pos, 1.2d); - entity.addGoalDebug(this, new DebugEvent("PathTo", "Moving to berry " + pos.toString())); - } else if (world.getBlockState(pos).getBlock() instanceof SourceBerryBush) { - int i = world.getBlockState(pos).getValue(AGE); - boolean flag = i == 3; - entity.lookAt(EntityAnchorArgument.Anchor.EYES, new Vec3(this.pos.getX(), this.pos.getY(), this.pos.getZ())); - int j = 1 + world.random.nextInt(2); - SourceBerryBush.popResource(world, pos, new ItemStack(BlockRegistry.SOURCEBERRY_BUSH, j + (flag ? 1 : 0))); - world.playSound(null, pos, SoundEvents.SWEET_BERRY_BUSH_PICK_BERRIES, SoundSource.BLOCKS, 1.0F, 0.8F + world.random.nextFloat() * 0.4F); - world.setBlock(pos, world.getBlockState(pos).setValue(AGE, 1), 2); - entity.addGoalDebug(this, new DebugEvent("PickedBerry", "Popped berries at " + pos.getX() + "," + pos.getY() + "," + pos.getZ())); - pos = null; - } - } - - @Override - public boolean canContinueToUse() { - if (pos == null || behavior.isPickupDisabled()) - return false; - - return timeSpent <= 20 * 15 && world.getBlockState(pos).getBlock() instanceof SourceBerryBush && world.getBlockState(pos).getValue(AGE) > 1; - } - - public BlockPos getNearbyManaBerry() { - List posList = new ArrayList<>(); - for (BlockPos blockpos : BlockPos.withinManhattan(entity.blockPosition(), 10, 3, 10)) { - if (world.getBlockState(blockpos).getBlock() instanceof SourceBerryBush && world.getBlockState(blockpos).getValue(AGE) > 1) { - posList.add(blockpos.immutable()); - } - } - return posList.isEmpty() ? null : posList.get(world.random.nextInt(posList.size())); - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StoreItemGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StoreItemGoal.java deleted file mode 100644 index 1d7890b519..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StoreItemGoal.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.hollingsworth.arsnouveau.common.entity.goal.carbuncle; - -import com.hollingsworth.arsnouveau.api.event.EventQueue; -import com.hollingsworth.arsnouveau.common.entity.Starbuncle; -import com.hollingsworth.arsnouveau.common.entity.debug.DebugEvent; -import com.hollingsworth.arsnouveau.common.event.OpenChestEvent; -import com.hollingsworth.arsnouveau.common.items.ItemScroll; -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.neoforged.neoforge.items.IItemHandler; -import net.neoforged.neoforge.items.ItemHandlerHelper; - -public class StoreItemGoal extends GoToPosGoal { - - public StoreItemGoal(Starbuncle starbuncle, T behavior) { - super(starbuncle, behavior, () -> !starbuncle.getHeldStack().isEmpty()); - } - - @Override - public void start() { - super.start(); - starbuncle.goalState = Starbuncle.StarbuncleGoalState.STORING_ITEM; - } - - @Override - public BlockPos getDestination() { - return behavior.getValidStorePos(starbuncle.getHeldStack()); - } - - @Override - public boolean onDestinationReached() { - this.starbuncle.getNavigation().stop(); - Level world = starbuncle.level; - BlockEntity tileEntity = world.getBlockEntity(this.targetPos); - if (tileEntity == null) { - starbuncle.addGoalDebug(this, new DebugEvent("missing_tile", "store pos broken " + targetPos.toString())); - starbuncle.setBackOff(5 + starbuncle.level.random.nextInt(20)); - return true; - } - - IItemHandler iItemHandler = behavior.getItemCapFromTile(this.targetPos, behavior.TO_DIRECTION_MAP.get(targetPos.hashCode())); - if (iItemHandler == null) { - starbuncle.addGoalDebug(this, new DebugEvent("NoItemHandler", "No item handler at " + targetPos.toString())); - return true; - } - - ItemStack oldStack = new ItemStack(starbuncle.getHeldStack().getItem(), starbuncle.getHeldStack().getCount()); - ItemStack left = ItemHandlerHelper.insertItemStacked(iItemHandler, starbuncle.getHeldStack(), false); - if (left.equals(oldStack)) { - starbuncle.setBackOff(5 + starbuncle.level.random.nextInt(20)); - starbuncle.addGoalDebug(this, new DebugEvent("no_room", targetPos.toString())); - return true; - } - - try { - OpenChestEvent event = new OpenChestEvent((ServerLevel) starbuncle.level, targetPos, 20); - event.open(); - EventQueue.getServerInstance().addEvent(event); - } catch (Exception ignored) { - // Potential bug with OpenJDK causing irreproducible noClassDef errors - } - - starbuncle.setHeldStack(left); - starbuncle.addGoalDebug(this, new DebugEvent("stored_item", "successful at " + targetPos.toString() + "set stack to " + left.getCount() + "x " + left.getHoverName().getString())); - return true; - } - - @Override - public boolean isDestinationStillValid(BlockPos pos) { - return behavior.sortPrefForStack(pos, starbuncle.getHeldStack()) != ItemScroll.SortPref.INVALID; - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/TakeItemGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/TakeItemGoal.java deleted file mode 100644 index 0b5a56adc4..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/TakeItemGoal.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.hollingsworth.arsnouveau.common.entity.goal.carbuncle; - -import com.hollingsworth.arsnouveau.api.event.EventQueue; -import com.hollingsworth.arsnouveau.common.entity.Starbuncle; -import com.hollingsworth.arsnouveau.common.entity.debug.DebugEvent; -import com.hollingsworth.arsnouveau.common.event.OpenChestEvent; -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.neoforged.neoforge.items.IItemHandler; -import org.jetbrains.annotations.Nullable; - -public class TakeItemGoal extends GoToPosGoal { - - public TakeItemGoal(Starbuncle starbuncle, T behavior) { - super(starbuncle, behavior, () -> starbuncle.getHeldStack().isEmpty()); - } - - @Override - public boolean canUse() { - boolean superCan = super.canUse(); - if(!superCan || behavior.FROM_LIST.isEmpty()) - return false; - if(getDestination() == null){ - starbuncle.addGoalDebug(this, new DebugEvent("NoTakeDestination", "No valid take destination")); - starbuncle.setBackOff(5 + starbuncle.level.random.nextInt(20)); - return false; - } - if(behavior.isBedPowered()){ - starbuncle.addGoalDebug(this, new DebugEvent("BedPowered", "Bed Powered, cannot take items")); - return false; - } - return true; - } - - @Override - public boolean canContinueToUse() { - return super.canContinueToUse() && !behavior.isBedPowered(); - } - - @Override - public void start() { - super.start(); - starbuncle.goalState = Starbuncle.StarbuncleGoalState.TAKING_ITEM; - } - - @Override - public boolean isDestinationStillValid(BlockPos pos) { - return behavior.isPositionValidTake(pos); - } - - @Nullable - @Override - public BlockPos getDestination() { - return behavior.getValidTakePos(); - } - - @Override - public boolean onDestinationReached() { - Level world = starbuncle.level; - BlockEntity tileEntity = world.getBlockEntity(targetPos); - if (tileEntity == null) { - starbuncle.addGoalDebug(this, new DebugEvent("TakePosBroken", "Take Tile Broken" )); - return true; - } - IItemHandler iItemHandler = behavior.getItemCapFromTile(targetPos, behavior.FROM_DIRECTION_MAP.get(targetPos.hashCode())); - if (iItemHandler == null) { - starbuncle.addGoalDebug(this, new DebugEvent("NoItemHandler", "No item handler at " + targetPos.toString())); - return true; - } - for (int j = 0; j < iItemHandler.getSlots() && starbuncle.getHeldStack().isEmpty(); j++) { - ItemStack stack = iItemHandler.getStackInSlot(j); - if (!stack.isEmpty()) { - int count = behavior.getMaxTake(iItemHandler.getStackInSlot(j)); - if (count <= 0) - continue; - starbuncle.setHeldStack(iItemHandler.extractItem(j, Math.min(count, stack.getMaxStackSize()), false)); - starbuncle.addGoalDebug(this, new DebugEvent("SetHeld", "Taking " + count + "x " + starbuncle.getHeldStack().getHoverName().getString() + " from " + targetPos.toString())); - starbuncle.level.playSound(null, starbuncle.getX(), starbuncle.getY(), starbuncle.getZ(), - SoundEvents.ITEM_PICKUP, starbuncle.getSoundSource(), 1.0F, 1.0F); - - if (world instanceof ServerLevel serverLevel) { - try { - OpenChestEvent event = new OpenChestEvent(serverLevel, targetPos, 20); - event.open(); - EventQueue.getServerInstance().addEvent(event); - } catch (Exception ignored) { - // Potential bug with OpenJDK causing irreproducible noClassDef errors - } - } - } - } - if(starbuncle.getHeldStack().isEmpty()) { - starbuncle.addGoalDebug(this, new DebugEvent("TakeFromChest", "No items to take? Cancelling goal.")); - } - return true; - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java index bcab511fbb..c82102f106 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java @@ -22,10 +22,10 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List Date: Tue, 30 Jul 2024 21:11:39 -0500 Subject: [PATCH 109/363] Fix overlay rendering order --- .../arsnouveau/client/registry/ClientHandler.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index 727e07cc8f..a04ad0f111 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -51,6 +51,7 @@ import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; import net.neoforged.neoforge.client.event.RegisterGuiLayersEvent; import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; +import net.neoforged.neoforge.client.gui.VanillaGuiLayers; import org.jetbrains.annotations.Nullable; import static com.hollingsworth.arsnouveau.client.events.ClientEvents.localize; @@ -186,10 +187,10 @@ public static void registerMenu(final RegisterMenuScreensEvent event) { @SubscribeEvent public static void registerOverlays(final RegisterGuiLayersEvent event) { - event.registerAboveAll(ArsNouveau.prefix("scry_camera"), cameraOverlay); - event.registerAboveAll(ArsNouveau.prefix("tooltip"), GuiEntityInfoHUD.OVERLAY); - event.registerAboveAll(ArsNouveau.prefix("mana_hud"), GuiManaHUD.OVERLAY); - event.registerAboveAll(ArsNouveau.prefix("spell_hud"), GuiSpellHUD.OVERLAY); + event.registerAbove(VanillaGuiLayers.CROSSHAIR, ArsNouveau.prefix("scry_camera"), cameraOverlay); + event.registerAbove(VanillaGuiLayers.CROSSHAIR, ArsNouveau.prefix("tooltip"), GuiEntityInfoHUD.OVERLAY); + event.registerAbove(VanillaGuiLayers.CROSSHAIR, ArsNouveau.prefix("mana_hud"), GuiManaHUD.OVERLAY); + event.registerAbove(VanillaGuiLayers.CROSSHAIR, ArsNouveau.prefix("spell_hud"), GuiSpellHUD.OVERLAY); } From 54f343484ec6064446a9f2c1b7218ecbcd0670eb Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 30 Jul 2024 21:17:54 -0500 Subject: [PATCH 110/363] Fix shady wizard crash --- .../arsnouveau/common/event/EventHandler.java | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index da188dc16e..4e7ec77107 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -354,50 +354,49 @@ public static void registerTrades(VillagerTradesEvent event) { List level4 = trades.get(4); List level5 = trades.get(5); - level1.add((trader, rand) -> itemToEmer(BlockRegistry.SOURCEBERRY_BUSH, 16, 16, 2)); - level1.add((trader, rand) -> itemToEmer(ItemsRegistry.MAGE_FIBER, 16, 16, 2)); + level1.add((trader, rand) -> itemToEmer(trader,BlockRegistry.SOURCEBERRY_BUSH, 16, 16, 2)); + level1.add((trader, rand) -> itemToEmer(trader,ItemsRegistry.MAGE_FIBER, 16, 16, 2)); for (ItemStack fruit : Ingredient.of(ItemTagProvider.SHADY_WIZARD_FRUITS).getItems()) { - level1.add((trader, rand) -> itemToEmer(fruit.getItem(), 6, 16, 2)); + level1.add((trader, rand) -> itemToEmer(trader,fruit.getItem(), 6, 16, 2)); } - level1.add((trader, rand) -> itemToEmer(Items.AMETHYST_SHARD, 32, 16, 2)); + level1.add((trader, rand) -> itemToEmer(trader,Items.AMETHYST_SHARD, 32, 16, 2)); - level1.add((trader, rand) -> emerToItem(ItemsRegistry.SOURCE_BERRY_ROLL, 4, 16, 2)); + level1.add((trader, rand) -> emerToItem(trader,ItemsRegistry.SOURCE_BERRY_ROLL, 4, 16, 2)); - level2.add((trader, rand) -> emerToItem(BlockRegistry.GHOST_WEAVE, 1, 8, 2)); - level2.add((trader, rand) -> emerToItem(BlockRegistry.MIRROR_WEAVE, 1, 8, 2)); - level2.add((trader, rand) -> emerToItem(BlockRegistry.FALSE_WEAVE, 1, 8, 2)); - level2.add((trader, rand) -> emerToItem(ItemsRegistry.WARP_SCROLL, 1, 8, 2)); + level2.add((trader, rand) -> emerToItem(trader,BlockRegistry.GHOST_WEAVE, 1, 8, 2)); + level2.add((trader, rand) -> emerToItem(trader,BlockRegistry.MIRROR_WEAVE, 1, 8, 2)); + level2.add((trader, rand) -> emerToItem(trader,BlockRegistry.FALSE_WEAVE, 1, 8, 2)); + level2.add((trader, rand) -> emerToItem(trader,ItemsRegistry.WARP_SCROLL, 1, 8, 2)); for (ItemStack wilden : Ingredient.of(ItemTagProvider.WILDEN_DROP_TAG).getItems()) { - level2.add((trader, rand) -> itemToEmer(wilden.getItem(), 4, 8, 12)); + level2.add((trader, rand) -> itemToEmer(trader,wilden.getItem(), 4, 8, 12)); } List tablets = new ArrayList<>(RitualRegistry.getRitualItemMap().values()); for (RitualTablet tablet : tablets) { if (new ItemStack(tablet).is(ItemTagProvider.RITUAL_TRADE_BLACKLIST)) continue; if (tablet.ritual.canBeTraded()) { - level3.add((trader, rand) -> emerToItem(tablet, 4, 1, 12)); + level3.add((trader, rand) -> emerToItem(trader,tablet, 4, 1, 12)); } } for (ItemStack shard : Ingredient.of(ItemTagProvider.SUMMON_SHARDS_TAG).getItems()) { - level4.add((trader, rand) -> emerToItem(shard.getItem(), 20, 1, 20)); + level4.add((trader, rand) -> emerToItem(trader,shard.getItem(), 20, 1, 20)); } - - level5.add((trader, rand) -> emerToItem(ItemsRegistry.SOURCE_BERRY_PIE, 4, 8, 2)); + level5.add((trader, rand) -> emerToItem(trader, ItemsRegistry.SOURCE_BERRY_PIE, 4, 8, 2)); level5.add((trader, rand) -> new MerchantOffer(new ItemCost(Items.EMERALD, 48), DungeonLootTables.getRandomItem(DungeonLootTables.RARE_LOOT), 1, 20, 0.2F)); } } - public static MerchantOffer emerToItem(ItemLike itemLike, int cost, int uses, int exp) { - return new VillagerTrades.ItemsForEmeralds(itemLike.asItem(), cost, uses, exp).getOffer(null, null); + public static MerchantOffer emerToItem(Entity trader, ItemLike itemLike, int cost, int uses, int exp) { + return new VillagerTrades.ItemsForEmeralds(itemLike.asItem(), cost, uses, exp).getOffer(trader, trader.getRandom()); } - public static MerchantOffer itemToEmer(ItemLike itemLike, int cost, int uses, int exp) { - return new VillagerTrades.EmeraldForItems(itemLike.asItem(), cost, uses, exp).getOffer(null, null); + public static MerchantOffer itemToEmer(Entity trader,ItemLike itemLike, int cost, int uses, int exp) { + return new VillagerTrades.EmeraldForItems(itemLike.asItem(), cost, uses, exp).getOffer(trader, trader.getRandom()); } //TODO: restore looting level event From ce8750f082639c7dd42f10011f528f738747d4f4 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 30 Jul 2024 21:20:43 -0500 Subject: [PATCH 111/363] 5.0.5 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index c98ece1a9b..5a4b15977a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.0.4 +mod_version=5.0.5 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 50f1e11db14b685bf4b349505f16766c1641ccfc Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Fri, 2 Aug 2024 15:22:47 +0200 Subject: [PATCH 112/363] 1.21 fixes (#1367) * Removed bunch of overloaded deprecated method marked for removal. Restored skull data. Restored perks attributes. Removed IManaEquipment as its functionalities are all attribute based Fix Ignite using ticks as seconds Move neoforge ns tags to common ns * Regen Data * Make equipmentSlotGroup a parameter of applyAttributeModifiers * Initialize client and FixedGeoRenderer removal with newer gecko methods * Fix turret errors if a non-spellcaster item was used on it. Fix aim turret not being able to be aimed cause of it. Fix crash on breakBlocks due to null GameProfile * Fix missing event subscription * Update magic tag * Fix void jar, annotation soup * Fix void jar, annotation soup Looting Event replacement via mixin Todo restore drygmy fam looting ( hasFamiliar(Player) check needed) * Restored Advancements --- README.md | 13 +- .../2741af456691947b147d613b4e1cc70c9e71dd32 | 4 +- .../43f70b1d0fc3650d25dddf44c6efffef1900bb18 | 4 +- .../5c9e5647706b386caccf0aef27efaa68965030b8 | 8 +- .../9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e | 62 ++--- .../af617d50f86666f21b24a8919c1c50aad8faa4f8 | 16 +- .../e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 | 216 +++++++++--------- .../e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 | 40 +++- .../eac00f78ae0d33a31d4f208cb05939a004e6cb91 | 4 +- .../advancement/alteration_table.json | 32 +++ .../advancement/amethyst_golem_charm.json | 32 +++ .../advancement/apprentice_spell_book.json | 32 +++ .../advancement/archmage_spell_book.json | 32 +++ .../advancement/basic_spell_turret.json | 32 +++ .../advancement/catch_lightning.json | 27 +++ .../advancement/create_portal.json | 26 +++ .../ars_nouveau/advancement/drygmy_charm.json | 32 +++ .../advancement/eat_bombegranate.json | 31 +++ .../advancement/enchanting_apparatus.json | 32 +++ .../ars_nouveau/advancement/familiar.json | 26 +++ .../advancement/imbuement_chamber.json | 32 +++ .../advancement/magebloom_crop.json | 32 +++ .../data/ars_nouveau/advancement/mob_jar.json | 32 +++ .../advancement/novice_spell_book.json | 32 +++ .../ars_nouveau/advancement/poof_mob.json | 25 ++ .../advancement/potion_diffuser.json | 32 +++ .../ars_nouveau/advancement/potion_flask.json | 32 +++ .../ars_nouveau/advancement/potion_jar.json | 32 +++ .../advancement/potion_melder.json | 32 +++ .../ars_nouveau/advancement/prismatic.json | 27 +++ .../advancement/ritual_brazier.json | 32 +++ .../advancement/ritual_gravity.json | 31 +++ .../advancement/scryers_oculus.json | 32 +++ .../advancement/shapers_focus.json | 32 +++ .../advancement/shrunk_starbuncle.json | 27 +++ .../ars_nouveau/advancement/source_jar.json | 32 +++ .../ars_nouveau/advancement/spell_prism.json | 32 +++ .../advancement/starbuncle_shades.json | 32 +++ .../ars_nouveau/advancement/starby_charm.json | 32 +++ .../ars_nouveau/advancement/summon_focus.json | 32 +++ .../advancement/time_in_a_bottle.json | 27 +++ .../ars_nouveau/advancement/warp_scroll.json | 32 +++ .../advancement/whirlisprig_charm.json | 32 +++ .../advancement/wilden_explosion.json | 27 +++ .../advancement/wilden_tribute.json | 32 +++ .../ars_nouveau/advancement/wixie_charm.json | 32 +++ .../ars_nouveau/advancement/wixie_hat.json | 32 +++ .../recipe/abjuration_essence.json | 2 +- .../recipe/agronomic_sourcelink.json | 2 +- .../data/ars_nouveau/recipe/air_essence.json | 2 +- .../recipe/alchemical_sourcelink.json | 2 +- .../recipe/amulet_of_mana_boost.json | 10 +- .../recipe/amulet_of_mana_regen.json | 8 +- .../ars_nouveau/recipe/aqua_affinity_1.json | 4 +- .../data/ars_nouveau/recipe/arcane_core.json | 2 +- .../ars_nouveau/recipe/arcane_pedestal.json | 2 +- .../ars_nouveau/recipe/archwood_planks.json | 2 +- .../ars_nouveau/recipe/archwood_sconce.json | 2 +- .../recipe/bane_of_arthropods_1.json | 2 +- .../recipe/bane_of_arthropods_2.json | 2 +- .../recipe/bane_of_arthropods_3.json | 2 +- .../recipe/bane_of_arthropods_4.json | 4 +- .../recipe/bane_of_arthropods_5.json | 4 +- .../recipe/basic_spell_turret.json | 2 +- .../recipe/blast_protection_1.json | 2 +- .../recipe/blast_protection_2.json | 2 +- .../recipe/blast_protection_3.json | 4 +- .../recipe/blast_protection_4.json | 4 +- .../recipe/conjuration_essence.json | 2 +- .../ars_nouveau/recipe/depth_strider_1.json | 4 +- .../ars_nouveau/recipe/depth_strider_2.json | 4 +- .../ars_nouveau/recipe/depth_strider_3.json | 6 +- .../ars_nouveau/recipe/dominion_wand.json | 4 +- .../data/ars_nouveau/recipe/drygmy_charm.json | 6 +- .../data/ars_nouveau/recipe/dull_trinket.json | 2 +- .../ars_nouveau/recipe/earth_essence.json | 2 +- .../data/ars_nouveau/recipe/efficiency_1.json | 4 +- .../data/ars_nouveau/recipe/efficiency_2.json | 4 +- .../data/ars_nouveau/recipe/efficiency_3.json | 6 +- .../data/ars_nouveau/recipe/efficiency_4.json | 4 +- .../data/ars_nouveau/recipe/efficiency_5.json | 4 +- .../ars_nouveau/recipe/enchanters_mirror.json | 6 +- .../ars_nouveau/recipe/enchanters_shield.json | 4 +- .../ars_nouveau/recipe/enchanters_sword.json | 4 +- .../ars_nouveau/recipe/feather_falling_1.json | 4 +- .../ars_nouveau/recipe/feather_falling_2.json | 4 +- .../ars_nouveau/recipe/feather_falling_3.json | 4 +- .../ars_nouveau/recipe/feather_falling_4.json | 4 +- .../ars_nouveau/recipe/fire_aspect_1.json | 4 +- .../ars_nouveau/recipe/fire_aspect_2.json | 4 +- .../data/ars_nouveau/recipe/fire_essence.json | 2 +- .../ars_nouveau/recipe/fire_protection_1.json | 4 +- .../ars_nouveau/recipe/fire_protection_2.json | 4 +- .../ars_nouveau/recipe/fire_protection_3.json | 6 +- .../ars_nouveau/recipe/fire_protection_4.json | 4 +- .../ars_nouveau/recipe/fire_protection_5.json | 2 +- .../data/ars_nouveau/recipe/fortune_1.json | 12 +- .../data/ars_nouveau/recipe/fortune_2.json | 4 +- .../data/ars_nouveau/recipe/fortune_3.json | 4 +- .../data/ars_nouveau/recipe/knockback_1.json | 4 +- .../data/ars_nouveau/recipe/knockback_2.json | 4 +- .../data/ars_nouveau/recipe/looting_1.json | 12 +- .../data/ars_nouveau/recipe/looting_2.json | 4 +- .../data/ars_nouveau/recipe/looting_3.json | 4 +- .../ars_nouveau/recipe/magebloom_crop.json | 8 +- .../ars_nouveau/recipe/magelight_torch.json | 2 +- .../data/ars_nouveau/recipe/mana_boost_1.json | 8 +- .../data/ars_nouveau/recipe/mana_boost_2.json | 8 +- .../data/ars_nouveau/recipe/mana_boost_3.json | 8 +- .../data/ars_nouveau/recipe/mana_regen_1.json | 4 +- .../data/ars_nouveau/recipe/mana_regen_2.json | 4 +- .../data/ars_nouveau/recipe/mana_regen_3.json | 4 +- .../recipe/manipulation_essence.json | 2 +- .../data/ars_nouveau/recipe/multishot_1.json | 10 +- .../data/ars_nouveau/recipe/mundane_belt.json | 2 +- .../recipe/mycelial_sourcelink.json | 2 +- .../data/ars_nouveau/recipe/piercing_1.json | 4 +- .../data/ars_nouveau/recipe/piercing_2.json | 4 +- .../data/ars_nouveau/recipe/piercing_3.json | 4 +- .../data/ars_nouveau/recipe/piercing_4.json | 4 +- .../data/ars_nouveau/recipe/potion_flask.json | 2 +- .../data/ars_nouveau/recipe/power_1.json | 2 +- .../data/ars_nouveau/recipe/power_2.json | 4 +- .../data/ars_nouveau/recipe/power_3.json | 4 +- .../data/ars_nouveau/recipe/power_4.json | 2 +- .../data/ars_nouveau/recipe/power_5.json | 2 +- .../recipe/projectile_protection_1.json | 4 +- .../recipe/projectile_protection_2.json | 4 +- .../recipe/projectile_protection_3.json | 6 +- .../recipe/projectile_protection_4.json | 4 +- .../recipe/projectile_protection_5.json | 2 +- .../data/ars_nouveau/recipe/protection_1.json | 4 +- .../data/ars_nouveau/recipe/protection_2.json | 4 +- .../data/ars_nouveau/recipe/protection_3.json | 6 +- .../data/ars_nouveau/recipe/protection_4.json | 4 +- .../data/ars_nouveau/recipe/protection_5.json | 2 +- .../data/ars_nouveau/recipe/punch_1.json | 4 +- .../data/ars_nouveau/recipe/punch_2.json | 4 +- .../recipe/quartz_block_to_quartz.json | 2 +- .../ars_nouveau/recipe/quick_charge_1.json | 4 +- .../ars_nouveau/recipe/quick_charge_2.json | 4 +- .../ars_nouveau/recipe/quick_charge_3.json | 6 +- .../data/ars_nouveau/recipe/reactive.json | 2 +- .../ars_nouveau/recipe/redstone_relay.json | 2 +- .../data/ars_nouveau/recipe/relay.json | 2 +- .../data/ars_nouveau/recipe/repository.json | 2 +- .../ars_nouveau/recipe/respiration_1.json | 4 +- .../ars_nouveau/recipe/respiration_2.json | 8 +- .../ars_nouveau/recipe/respiration_3.json | 4 +- .../recipe/ring_of_greater_discount.json | 4 +- .../recipe/ring_of_lesser_discount.json | 4 +- .../ars_nouveau/recipe/ring_of_potential.json | 2 +- .../ars_nouveau/recipe/ritual_awakening.json | 8 +- .../ars_nouveau/recipe/ritual_binding.json | 6 +- .../ars_nouveau/recipe/ritual_brazier.json | 2 +- .../recipe/ritual_cloudshaping.json | 2 +- .../ars_nouveau/recipe/ritual_scrying.json | 2 +- .../data/ars_nouveau/recipe/sconce.json | 2 +- .../ars_nouveau/recipe/scribes_table.json | 2 +- .../ars_nouveau/recipe/scryers_crystal.json | 2 +- .../ars_nouveau/recipe/scryers_oculus.json | 2 +- .../data/ars_nouveau/recipe/sharpness_1.json | 2 +- .../data/ars_nouveau/recipe/sharpness_2.json | 4 +- .../data/ars_nouveau/recipe/silk_touch_1.json | 4 +- .../data/ars_nouveau/recipe/smite_1.json | 2 +- .../data/ars_nouveau/recipe/smite_2.json | 2 +- .../data/ars_nouveau/recipe/smite_3.json | 2 +- .../data/ars_nouveau/recipe/smite_4.json | 4 +- .../data/ars_nouveau/recipe/smite_5.json | 4 +- .../ars_nouveau/recipe/source_gem_block.json | 2 +- .../data/ars_nouveau/recipe/sourcestone.json | 2 +- .../recipe/sourcestone_sconce.json | 2 +- .../data/ars_nouveau/recipe/spell_bow.json | 2 +- .../ars_nouveau/recipe/spell_crossbow.json | 2 +- .../data/ars_nouveau/recipe/spell_prism.json | 2 +- .../data/ars_nouveau/recipe/spell_turret.json | 2 +- .../data/ars_nouveau/recipe/summon_focus.json | 2 +- .../ars_nouveau/recipe/sweeping_edge_1.json | 2 +- .../ars_nouveau/recipe/sweeping_edge_2.json | 4 +- .../ars_nouveau/recipe/sweeping_edge_3.json | 4 +- .../data/ars_nouveau/recipe/thorns_1.json | 2 +- .../data/ars_nouveau/recipe/thorns_2.json | 4 +- .../data/ars_nouveau/recipe/thorns_3.json | 4 +- .../data/ars_nouveau/recipe/unbreaking_1.json | 2 +- .../data/ars_nouveau/recipe/unbreaking_2.json | 4 +- .../data/ars_nouveau/recipe/unbreaking_3.json | 4 +- .../recipe/vitalic_sourcelink.json | 2 +- .../recipe/volcanic_sourcelink.json | 2 +- .../data/ars_nouveau/recipe/wand.json | 10 +- .../data/ars_nouveau/recipe/warp_scroll.json | 8 +- .../ars_nouveau/recipe/water_essence.json | 2 +- .../ars_nouveau/recipe/whirlisprig_charm.json | 2 +- .../{neoforge => c}/tags/block/bushes.json | 0 .../tags/item/gems/source.json | 0 .../tags/item/logs/archwood.json | 0 .../tags/item/storage_blocks/source.json | 0 .../tags/damage_type/is_magic.json | 0 .../arsnouveau/api/mana/IManaEquipment.java | 17 -- .../api/perk/IEffectResolvePerk.java | 20 -- .../arsnouveau/api/perk/IPerk.java | 34 ++- .../arsnouveau/api/util/BlockUtil.java | 11 +- .../arsnouveau/api/util/CuriosUtil.java | 5 +- .../renderer/item/MobJarItemRenderer.java | 5 +- .../renderer/item/ScryCasterRenderer.java | 11 +- .../renderer/item/SpellBookRenderer.java | 3 +- .../renderer/item/SpellBowRenderer.java | 5 +- .../renderer/item/SpellCrossbowRenderer.java | 7 +- .../client/renderer/item/SwordRenderer.java | 11 +- .../client/renderer/item/WandRenderer.java | 3 +- .../common/armor/AnimatedMagicArmor.java | 25 +- .../common/block/ArchwoodChest.java | 10 +- .../common/block/BasicSpellTurret.java | 60 ++--- .../common/block/EnchantedSpellTurret.java | 3 +- .../common/block/RotatingSpellTurret.java | 5 +- .../common/block/TimerSpellTurret.java | 10 +- .../common/datagen/BlockTagProvider.java | 2 +- .../common/datagen/DamageTypesProvider.java | 15 +- .../datagen/ImbuementRecipeProvider.java | 5 +- .../common/datagen/ItemTagProvider.java | 11 +- .../arsnouveau/common/datagen/ModDatagen.java | 1 - .../common/datagen/SimpleDataProvider.java | 3 +- .../advancement/ANAdvancementBuilder.java | 23 +- .../datagen/advancement/ANAdvancements.java | 105 +++++---- .../advancement/SimpleAdvancements.java | 44 ---- .../arsnouveau/common/entity/Cinder.java | 5 +- .../common/entity/EnchantedFallingBlock.java | 59 +++-- .../common/entity/EnchantedMageblock.java | 3 +- .../common/entity/EnchantedSkull.java | 73 +++--- .../common/entity/IceShardEntity.java | 3 +- .../familiar/FamiliarAmethystGolem.java | 5 +- .../entity/familiar/FamiliarBookwyrm.java | 5 +- .../entity/familiar/FamiliarDrygmy.java | 7 +- .../entity/familiar/FamiliarEntity.java | 23 +- .../entity/familiar/FamiliarStarbuncle.java | 7 +- .../common/entity/familiar/FamiliarWixie.java | 28 +-- .../arsnouveau/common/event/EventHandler.java | 61 +++-- .../common/items/AlchemistsCrown.java | 3 +- .../common/items/AnnotatedCodex.java | 6 +- .../arsnouveau/common/items/CasterTome.java | 10 +- .../arsnouveau/common/items/DominionWand.java | 15 +- .../arsnouveau/common/items/EarthEssence.java | 5 +- .../common/items/EnchantersMirror.java | 16 +- .../common/items/EnchantersShield.java | 21 +- .../common/items/EnchantersSword.java | 19 +- .../common/items/FamiliarScript.java | 7 +- .../arsnouveau/common/items/FireEssence.java | 5 +- .../arsnouveau/common/items/FlaskCannon.java | 30 +-- .../arsnouveau/common/items/Glyph.java | 8 +- .../arsnouveau/common/items/ItemScroll.java | 6 +- .../common/items/ManipulationEssence.java | 3 +- .../arsnouveau/common/items/MobJarItem.java | 17 +- .../arsnouveau/common/items/ModItem.java | 4 +- .../arsnouveau/common/items/PerkItem.java | 6 +- .../arsnouveau/common/items/PotionFlask.java | 21 +- .../arsnouveau/common/items/Present.java | 9 +- .../arsnouveau/common/items/RitualTablet.java | 8 +- .../arsnouveau/common/items/ScryCaster.java | 19 +- .../arsnouveau/common/items/ScryerScroll.java | 5 +- .../arsnouveau/common/items/SpellBook.java | 17 +- .../arsnouveau/common/items/SpellBow.java | 25 +- .../common/items/SpellCrossbow.java | 30 +-- .../common/items/SpellParchment.java | 8 +- .../common/items/StableWarpScroll.java | 10 +- .../common/items/StarbuncleShades.java | 15 +- .../common/items/StarbuncleShard.java | 3 +- .../arsnouveau/common/items/VoidJar.java | 8 +- .../arsnouveau/common/items/Wand.java | 21 +- .../arsnouveau/common/items/WarpScroll.java | 8 +- .../arsnouveau/common/items/WixieHat.java | 16 +- .../items/curios/AbstractManaCurio.java | 7 +- .../common/items/curios/DiscountRing.java | 6 +- .../common/items/curios/ShapersFocus.java | 10 - .../items/itemscrolls/MimicItemScroll.java | 3 +- .../common/mixin/GameRendererMixin.java | 2 +- .../EnchantedCountIncreaseFunctionMixin.java | 31 +++ ...hanceWithEnchantedBonusConditionMixin.java | 32 +++ .../network/PacketClientDelayEffect.java | 13 +- .../arsnouveau/common/perk/ChillingPerk.java | 18 +- .../arsnouveau/common/perk/DepthsPerk.java | 20 +- .../arsnouveau/common/perk/FeatherPerk.java | 10 +- .../arsnouveau/common/perk/IgnitePerk.java | 20 +- .../common/perk/KnockbackResistPerk.java | 13 +- .../common/perk/MagicCapacityPerk.java | 10 +- .../common/perk/MagicResistPerk.java | 13 +- .../common/perk/PotionDurationPerk.java | 10 +- .../common/perk/SaturationPerk.java | 26 +-- .../common/perk/SpellDamagePerk.java | 10 +- .../common/perk/StarbunclePerk.java | 14 +- .../common/perk/StepHeightPerk.java | 13 +- .../arsnouveau/common/perk/ToughnessPerk.java | 10 +- .../arsnouveau/common/perk/VampiricPerk.java | 18 -- .../common/spell/effect/EffectIgnite.java | 2 +- .../common/spell/effect/EffectName.java | 23 +- .../setup/registry/BlockRegistry.java | 9 +- .../arsnouveau/setup/registry/ModPotions.java | 2 + .../resources/META-INF/accesstransformer.cfg | 4 +- src/main/resources/ars_nouveau.mixins.json | 2 + 297 files changed, 2397 insertions(+), 1170 deletions(-) create mode 100644 src/generated/resources/data/ars_nouveau/advancement/alteration_table.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/amethyst_golem_charm.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/apprentice_spell_book.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/archmage_spell_book.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/basic_spell_turret.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/catch_lightning.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/create_portal.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/drygmy_charm.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/eat_bombegranate.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/enchanting_apparatus.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/familiar.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/imbuement_chamber.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/magebloom_crop.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/mob_jar.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/novice_spell_book.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/poof_mob.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/potion_diffuser.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/potion_flask.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/potion_jar.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/potion_melder.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/prismatic.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/ritual_brazier.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/ritual_gravity.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/scryers_oculus.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/shapers_focus.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/shrunk_starbuncle.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/source_jar.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/spell_prism.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/starbuncle_shades.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/starby_charm.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/summon_focus.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/time_in_a_bottle.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/warp_scroll.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/whirlisprig_charm.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/wilden_explosion.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/wilden_tribute.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/wixie_charm.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/wixie_hat.json rename src/generated/resources/data/{neoforge => c}/tags/block/bushes.json (100%) rename src/generated/resources/data/{neoforge => c}/tags/item/gems/source.json (100%) rename src/generated/resources/data/{neoforge => c}/tags/item/logs/archwood.json (100%) rename src/generated/resources/data/{neoforge => c}/tags/item/storage_blocks/source.json (100%) rename src/generated/resources/data/{c => neoforge}/tags/damage_type/is_magic.json (100%) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/mana/IManaEquipment.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/SimpleAdvancements.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/EnchantedCountIncreaseFunctionMixin.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/LootItemRandomChanceWithEnchantedBonusConditionMixin.java diff --git a/README.md b/README.md index 3fc29fdd19..f98cfa4c92 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,18 @@ repositories { } dependencies { - implementation fg.deobf("com.hollingsworth.ars_nouveau:ars_nouveau-[MC_VERSION]:[VERSION]") + + // Ars Nouveau + implementation "com.hollingsworth.ars_nouveau:ars_nouveau-[MC_VERSION]:[ARS_VERSION]" + + // Ars dependencies + implementation "software.bernie.geckolib:geckolib-neoforge-[MC_VERSION]:[GECKOLIB_VERSION]" + implementation 'top.theillusivec4.curios:curios-neoforge:[CURIO_VERSION]' + } ``` -Current version (1.20.1): -[![Maven](https://img.shields.io/maven-metadata/v?label=&color=C71A36&metadataUrl=https%3A%2F%2Fmaven.blamejared.com%2Fcom%2Fhollingsworth%2Fars_nouveau%2Fars_nouveau-1.20.1%2Fmaven-metadata.xml&style=flat-square)](https://maven.blamejared.com/com/hollingsworth/ars_nouveau/ars_nouveau-1.20.1/) +Current version (1.21): +[![Maven](https://img.shields.io/maven-metadata/v?label=&color=C71A36&metadataUrl=https%3A%2F%2Fmaven.blamejared.com%2Fcom%2Fhollingsworth%2Fars_nouveau%2Fars_nouveau-1.20.1%2Fmaven-metadata.xml&style=flat-square)](https://maven.blamejared.com/com/hollingsworth/ars_nouveau/ars_nouveau-1.21.0/) (remove the v) diff --git a/src/generated/resources/.cache/2741af456691947b147d613b4e1cc70c9e71dd32 b/src/generated/resources/.cache/2741af456691947b147d613b4e1cc70c9e71dd32 index 038739ebe1..e98111893f 100644 --- a/src/generated/resources/.cache/2741af456691947b147d613b4e1cc70c9e71dd32 +++ b/src/generated/resources/.cache/2741af456691947b147d613b4e1cc70c9e71dd32 @@ -1,7 +1,7 @@ -// 1.21 2024-07-05T22:41:47.5316058 Tags for minecraft:damage_type mod id ars_nouveau -8641b05da5b216be05123e3ed96b606930b31f26 data/c/tags/damage_type/is_magic.json +// 1.21 2024-08-02T11:37:31.2380448 Tags for minecraft:damage_type mod id ars_nouveau 8641b05da5b216be05123e3ed96b606930b31f26 data/minecraft/tags/damage_type/always_hurts_ender_dragons.json c07768ed08384f5d693ed8bed719a825a531b78e data/minecraft/tags/damage_type/bypasses_armor.json 4eb8deadc24e4e017387ef06cfa6543373cea902 data/minecraft/tags/damage_type/is_fall.json c03f05d0cd54c703078c47781e29b30b316ed23d data/minecraft/tags/damage_type/is_fire.json df18c48c123c4f2586bbcec49ba5d5768308be5a data/minecraft/tags/damage_type/is_freezing.json +8641b05da5b216be05123e3ed96b606930b31f26 data/neoforge/tags/damage_type/is_magic.json diff --git a/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 b/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 index d10b6e0f5f..79092dd5b2 100644 --- a/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 +++ b/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 @@ -1,4 +1,4 @@ -// 1.21 2024-07-07T16:24:07.0947972 Crush +// 1.21 2024-08-01T23:52:13.9514851 Crush b74461afbe445ac042cd1d04298474b2403054ae data/ars_nouveau/recipe/blue_dye.json 0ba5aafe171e9aab7bec69520d99698d5829fd97 data/ars_nouveau/recipe/brown_dye.json dfee25791763eafe3dacdb2ce45173e1f5862a70 data/ars_nouveau/recipe/cobblestone.json @@ -13,7 +13,7 @@ b667cbe48d5657fbb6b93fb7ff87b7314edd4fb9 data/ars_nouveau/recipe/magenta_dye_lil fa479269c71bb00c91df23e08e2bf701c64dae9c data/ars_nouveau/recipe/orange_dye.json dea87ef323ffd7180447688f935fe8afc1031abb data/ars_nouveau/recipe/pink_dye.json 78fa095a707a79aca21c05b7efec251ae1bddbf8 data/ars_nouveau/recipe/pink_dye_peony.json -683c09d8ed09d69a1044486d8d9fc3f65d9f5b17 data/ars_nouveau/recipe/quartz_block_to_quartz.json +f2d6a6686cb251547ec6d9dececa4fdc8dbf3dc0 data/ars_nouveau/recipe/quartz_block_to_quartz.json 5122d980c0da3a720e186ec2c1e490ca7c990333 data/ars_nouveau/recipe/red_dye_beetroot.json 8a755ef772635b520a59ade0adcd3528194416b4 data/ars_nouveau/recipe/red_dye_poppy.json 506b0eba7d9ea4066203c5161c4eac26a71a4c7a data/ars_nouveau/recipe/red_dye_rose_bush.json diff --git a/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 b/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 index 59e0327c3b..a22db79ce1 100644 --- a/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 +++ b/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 @@ -1,4 +1,4 @@ -// 1.21 2024-07-05T22:41:47.5481227 Tags for minecraft:item mod id ars_nouveau +// 1.21 2024-08-01T23:52:13.9453716 Tags for minecraft:item mod id ars_nouveau bde6ca31173d1f22d5f6fe355dc90c9faa35b239 data/ars_nouveau/tags/item/golem/shard.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/item/interact_jar_blacklist.json a0800fbffa0e00aecb2e86a1e991d42904427191 data/ars_nouveau/tags/item/magic_food.json @@ -19,10 +19,13 @@ d975e125845630962d46be3215fd2bf3c557e5dc data/c/tags/item/crops.json 0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/c/tags/item/fence_gates/wooden.json f36268e9375442e51cbf98f2c4d573082aa56378 data/c/tags/item/fruits/berry.json 0fab28203f8c9e1daa9c635ecb6c026ba0be0ba1 data/c/tags/item/gems.json +0fab28203f8c9e1daa9c635ecb6c026ba0be0ba1 data/c/tags/item/gems/source.json +f8f647d2f880955435d323e3c61b7d789d06d59c data/c/tags/item/logs/archwood.json a350e3112294fc7f7f26561673046c76017f3198 data/c/tags/item/music_discs.json f898aac12b01b598949701b1f6e45aa0cd1d9a25 data/c/tags/item/planks/archwood.json 3737e6b65e87993bd971b233c3aca5088721eb32 data/c/tags/item/seeds.json 6febc815f11d70abf442be0be941a9132ddd072d data/c/tags/item/storage_blocks.json +6febc815f11d70abf442be0be941a9132ddd072d data/c/tags/item/storage_blocks/source.json 877c63c507be1e55a9f5eeed6e73dfabea015dab data/c/tags/item/tools/shield.json 0fab28203f8c9e1daa9c635ecb6c026ba0be0ba1 data/minecraft/tags/item/beacon_payment_items.json 30ef7d5d3bbd42c50ac6566dce458cb5f7ee404b data/minecraft/tags/item/bookshelf_books.json @@ -50,6 +53,3 @@ a01909919207615cda1bb44f33db287efa02333b data/minecraft/tags/item/wooden_doors.j 70afef6fe4926a8dbf1205248dc1371974ef3037 data/minecraft/tags/item/wooden_slabs.json e5d97b748b59672ba4baec9c3f1093370adf0332 data/minecraft/tags/item/wooden_stairs.json 23fc13405d4dc43512deb39ee5bbbb73da177166 data/minecraft/tags/item/wooden_trapdoors.json -0fab28203f8c9e1daa9c635ecb6c026ba0be0ba1 data/neoforge/tags/item/gems/source.json -f8f647d2f880955435d323e3c61b7d789d06d59c data/neoforge/tags/item/logs/archwood.json -6febc815f11d70abf442be0be941a9132ddd072d data/neoforge/tags/item/storage_blocks/source.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index 047eebbf27..347590a830 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,4 +1,4 @@ -// 1.21 2024-07-14T16:49:32.7547917 Recipes +// 1.21 2024-08-01T23:52:13.9466897 Recipes a76e5d9eef406841f56740535ec2afdd509de507 data/ars_nouveau/advancement/recipes/building_blocks/archwood_button.json 443515bb80018fbe37a128cb6849f5e818be315d data/ars_nouveau/advancement/recipes/building_blocks/archwood_door.json 4dfc3afae271aae8423d20dedb67dc601ff71fa0 data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence.json @@ -277,28 +277,28 @@ af16e626f979fe486e94e2ce83029e605f9e0484 data/ars_nouveau/advancement/recipes/mi 3c94cedc091410f9753fafd28c68c70e065e43d2 data/ars_nouveau/advancement/recipes/misc/wixie_hat.json f5d0e8bf6c31595b6a37dc127d98a90a542353ca data/ars_nouveau/advancement/recipes/misc/worn_notebook.json 0d8e97944642ff8e877d0aa4688fa4407f09fe61 data/ars_nouveau/advancement/recipes/misc/yellow_sbed.json -281db2929d352e7f97ec4b5d5ff6d420b9ba2a0e data/ars_nouveau/recipe/agronomic_sourcelink.json +5ab358eb773cad4086a5e61e11b3c83fcde87c1b data/ars_nouveau/recipe/agronomic_sourcelink.json 03c20e84c9f6180060bce50d07e0dfcae78afd9a data/ars_nouveau/recipe/air_essence_to_snow_bucket.json -d44f4d6bfb9f8cceef5af7c4a53778e0069f83c8 data/ars_nouveau/recipe/alchemical_sourcelink.json +164aed13b9ce118e4e04c4d4de6584f01bd44f7e data/ars_nouveau/recipe/alchemical_sourcelink.json 3bcad68084c5963d189a3adda7178e5c1d2cd72b data/ars_nouveau/recipe/allow_scroll.json 53ee254fdf04074f4e24818108e3df9a10ceb791 data/ars_nouveau/recipe/alteration_table.json 6893d65f6c1b20b176a80d4acddbf08bbf49031b data/ars_nouveau/recipe/annotated_codex.json -95030b2241e712a64e84bc4180973d2f1c65f2cc data/ars_nouveau/recipe/arcane_core.json -8847040079205bf424aa43fcc5b0c55d9b33b688 data/ars_nouveau/recipe/arcane_pedestal.json +b668a35dfa9e5d5005cc5e871fa48941a0330a72 data/ars_nouveau/recipe/arcane_core.json +2abe5780b3c9b5e66f9fb89d3284cd5b01cf8ee0 data/ars_nouveau/recipe/arcane_pedestal.json b3b729af157d37ce8fd800f06eb9723237fa6fde data/ars_nouveau/recipe/arcane_platform.json 68f7b6c77cb804e36cee558b93189b95a35affd1 data/ars_nouveau/recipe/archwood_button.json 3390b28cb95c3c54012968d9e5c8b0a45d7124e7 data/ars_nouveau/recipe/archwood_chest.json 19ade102ab38051edba714910dc8f966d23d2ea2 data/ars_nouveau/recipe/archwood_door.json 145c3b2469019bda16df0cb8493ca735fbcde977 data/ars_nouveau/recipe/archwood_fence.json 035beb9e6e73ee4e88daded672e57b2d806be214 data/ars_nouveau/recipe/archwood_fence_gate.json -43dec629dee5ee3dda31027315870e9ba2560093 data/ars_nouveau/recipe/archwood_planks.json +67f00645627dc667301f3e9a8e3b4d8808fa3994 data/ars_nouveau/recipe/archwood_planks.json 3b4decb139ef2bbc828c428eb13862980a763847 data/ars_nouveau/recipe/archwood_pressure_plate.json -2bcdc0c44a334f4355e448c71293acf4dc5f41ab data/ars_nouveau/recipe/archwood_sconce.json +2601d9a5a1a8028377d3916bdfa7b5da4657d6ce data/ars_nouveau/recipe/archwood_sconce.json 5201be3f889d6a51d065363f17600a4614969353 data/ars_nouveau/recipe/archwood_slab.json 986ff47f53636936ffd6e0f074ec802862d96e12 data/ars_nouveau/recipe/archwood_stairs.json e27acf9a62c7ac6edd984df1f526089bb5d8c768 data/ars_nouveau/recipe/archwood_to_chest.json 4d6c7d5c0e64d0486d365377417117d5edb382c4 data/ars_nouveau/recipe/archwood_trapdoor.json -996c7d872b91004988c93878973932ca32be4acf data/ars_nouveau/recipe/basic_spell_turret.json +3f5387933813f70e39762ca4cd794fa504f82e89 data/ars_nouveau/recipe/basic_spell_turret.json 86f7be9a035d695bc99e98fc90d070a3c92e7935 data/ars_nouveau/recipe/blank_parchment.json 29b58ebf63ce034972b8aee060ab643fce3d9ba8 data/ars_nouveau/recipe/blank_thread.json 05a109cd0b76401aa94d1958644e15df3ee1295c data/ars_nouveau/recipe/blue_archwood_wood.json @@ -310,7 +310,7 @@ a6d152a895509e9499224a26df6a16958eb1a7ab data/ars_nouveau/recipe/conjuration_ess eb467e8db516eb4a594e598773148c391b95246b data/ars_nouveau/recipe/conjuration_essence_to_soul_sand.json 93301e4c21000b77f346500c66d17515abddb623 data/ars_nouveau/recipe/deny_scroll.json 1ae35513507490134369531a55de220f64f137e2 data/ars_nouveau/recipe/dowsing_rod.json -01bc9ca87d828cb1e8de2988c8fb935decc8546b data/ars_nouveau/recipe/dull_trinket.json +7df5535aa482f33d1c26dc11b4f33f6f671e4c02 data/ars_nouveau/recipe/dull_trinket.json a106290849c3a7cf7fe7b954e007b6211d8683df data/ars_nouveau/recipe/enchanting_apparatus.json b9ddb20217f0c3a7ccd43888986b8e1dd3737f5f data/ars_nouveau/recipe/experience_gem.json 2f5f3364bb268f60fecc7d2de647682aa5b876b8 data/ars_nouveau/recipe/falseweave.json @@ -352,7 +352,7 @@ cd414f88fe9d90cb7e6e483612fabca6efece561 data/ars_nouveau/recipe/magebloom_block 32e401c4e59339f6be8e031cd31c11599ea94466 data/ars_nouveau/recipe/magebloom_block_to_magebloom.json e6aa2f2be1609f389ab67f0ebeebfdc3470a7012 data/ars_nouveau/recipe/magebloom_fiber.json 205220ac210cf0a840b9559ab1336af5080d242b data/ars_nouveau/recipe/magebloom_to_pink.json -0d24f341fdeb54d084dbaf1ef4fe8f2945e247f0 data/ars_nouveau/recipe/magelight_torch.json +14701bc0c4eb6a1332322e1e981f740907b63ef2 data/ars_nouveau/recipe/magelight_torch.json c92467ad911ade5f06c0135a3e0587c3f3ef9314 data/ars_nouveau/recipe/manipulation_essence_to_andesite.json 2e3dcdfe595b65c8ff6703a125b14d4a7817528e data/ars_nouveau/recipe/manipulation_essence_to_blazin_sapling.json 0426e0c3b309f6f0f5f7ab25d0ef32e22ca9d51a data/ars_nouveau/recipe/manipulation_essence_to_calcite.json @@ -370,8 +370,8 @@ a36e18e1eb518eeaf677d8109574e13461c24561 data/ars_nouveau/recipe/manipulation_es 2934fb39403c24a9c6c363dd2b1eea19a094c4cf data/ars_nouveau/recipe/mirrorweave.json e1884cca124df55bf412d95549f86800492deaac data/ars_nouveau/recipe/mob_jar.json 60f6f54acffb0880bac374b48177fd9bd1dd4106 data/ars_nouveau/recipe/moonfall_2.json -d14d1bcf99c787e770333aca4cf115074615676a data/ars_nouveau/recipe/mundane_belt.json -4ad6635b57eec4221ff24ef683d4286578c9c180 data/ars_nouveau/recipe/mycelial_sourcelink.json +98db5ff95dbb53d498ae0b405c7c4e0b244a52be data/ars_nouveau/recipe/mundane_belt.json +f3c87219dc4de1677d67aeeb5f82ae5c8be34bdd data/ars_nouveau/recipe/mycelial_sourcelink.json b95a26ec7ca85f4b6c2d897f08188bcbce4aadf1 data/ars_nouveau/recipe/novice_spell_book.json ca12f5dca463bbf0aca09c46b8efe2f6446c90ce data/ars_nouveau/recipe/orange_sbed.json 598c51209c60374d958b0a81afe37462dad45081 data/ars_nouveau/recipe/platform_to_pedestal.json @@ -381,21 +381,21 @@ ca12f5dca463bbf0aca09c46b8efe2f6446c90ce data/ars_nouveau/recipe/orange_sbed.jso 21f23f67bae60bff26f2c255f38c0ab41f4a5cbd data/ars_nouveau/recipe/potion_jar_empty.json ea63cf7bea666ed17912b8fae45be7eaa3ed7288 data/ars_nouveau/recipe/purple_archwood_wood.json 4a2c4815844b91e8cf3636d33b6d0c53bdaf267c data/ars_nouveau/recipe/purple_sbed.json -aebabb5b244a14c33336386f60c98912fd05e099 data/ars_nouveau/recipe/redstone_relay.json +616946e3adf199d9d3c0707aeeb85982b10fce49 data/ars_nouveau/recipe/redstone_relay.json 5a328c1fbe2131697c8af1a91b48781d4d5b57ad data/ars_nouveau/recipe/red_archwood_wood.json 8ff451fad137ccc8a670fb3d335299810ea8eea0 data/ars_nouveau/recipe/red_sbed.json -9c9b067f9aa4bdcdf9766f4f959a638799a04e06 data/ars_nouveau/recipe/relay.json -6cb8d39204d624ee51b5f0d5450833632a0ac194 data/ars_nouveau/recipe/repository.json +25d2e36480a9d7d823739df070b6a2442fc00c7c data/ars_nouveau/recipe/relay.json +a67d41e3479aca3091003352a993477e07d36c7d data/ars_nouveau/recipe/repository.json d69b689c9d3d9beacb19470d85ae0563d16eaf21 data/ars_nouveau/recipe/reset_stable_warp_scroll.json e4fa6ed6a2cb95d4d609eb9f63342b4ff0cbaad9 data/ars_nouveau/recipe/reset_warp_scroll.json -9a850855f9eeddb1e20cde0399bd93d10ff42638 data/ars_nouveau/recipe/ring_of_potential.json +edb21a2954e2ad301954256943914108e3659ef3 data/ars_nouveau/recipe/ring_of_potential.json 8a46330ef6197232cc0e87155b9834eb57f56620 data/ars_nouveau/recipe/ritual_animal_summon.json -b7e8f61b9faf2b00693d209870838f790c6ea3d4 data/ars_nouveau/recipe/ritual_awakening.json -d5c136a07a295a3b25930678b65f373aabd2b217 data/ars_nouveau/recipe/ritual_binding.json -7d82169426617fb9d9ba3fc8ce1f4d78be1a365b data/ars_nouveau/recipe/ritual_brazier.json +880eeb058ab37b4c51ed9316d9284bdd49edea94 data/ars_nouveau/recipe/ritual_awakening.json +34cb48c0a5eafb291b5a4fa5b74b3ee49919b9de data/ars_nouveau/recipe/ritual_binding.json +524640c09874ddc3802035c8cacafd84cadf80b6 data/ars_nouveau/recipe/ritual_brazier.json f372b9092ba4f2990fa6a944b2c0dbf730c32367 data/ars_nouveau/recipe/ritual_burrowing.json f9607dc36c4f4626afa9d98369a5c21f471b32d9 data/ars_nouveau/recipe/ritual_challenge.json -cd230d36564bbe95f04f51288c172eb3db143309 data/ars_nouveau/recipe/ritual_cloudshaping.json +9a136e682d91ea37df5c69280d9838cbe343fdc1 data/ars_nouveau/recipe/ritual_cloudshaping.json d1b2121d00b5d216c29c005e195a835687939123 data/ars_nouveau/recipe/ritual_conjure_island_desert.json 4f6c73461d37232f39d4220994a7681298bd1f8c data/ars_nouveau/recipe/ritual_conjure_island_plains.json 71984fb8e25ca4a919b2332ee0e25256f92659af data/ars_nouveau/recipe/ritual_containment.json @@ -410,16 +410,16 @@ b66a7c4bd80359f57c798857de8e566e432cd126 data/ars_nouveau/recipe/ritual_moonfall b2a0966389179ec0f881c489fa5ecbc2c5055473 data/ars_nouveau/recipe/ritual_overgrowth.json 5061c6aafaad2e5b027adb74257390a262f13603 data/ars_nouveau/recipe/ritual_restoration.json f3c8e1e452d9e3da0d41bf55e60da60b476a204a data/ars_nouveau/recipe/ritual_sanctuary.json -accc32c820494bb259dc6f0902ccbfd11a6d0fd7 data/ars_nouveau/recipe/ritual_scrying.json +2d7430516998d606e1e4f7c36803d358e91320e5 data/ars_nouveau/recipe/ritual_scrying.json 5123654f5081a2901bb2919e9308c65c0358ab95 data/ars_nouveau/recipe/ritual_sunrise.json a4194bc3caca8f56ee425021f31738c189bec74d data/ars_nouveau/recipe/ritual_warping.json 6e3200ffef781dc82bad2f6b9658836cd816511b data/ars_nouveau/recipe/ritual_wilden_summon.json a37c13de84a1b1166110870ce4e289955bbb7126 data/ars_nouveau/recipe/rotating_spell_turret.json c575a5b0c428b291f1cfc84eeabd4dbbbb2c2a34 data/ars_nouveau/recipe/rotating_turret_to_basic_spell_turret.json 43458f912f2a3eef45c0786aafa19e8cdca7eae4 data/ars_nouveau/recipe/runic_chalk.json -3f7e6a6bc404cd3e5ce9396384b736ae86885bf2 data/ars_nouveau/recipe/sconce.json -5463e82e3cc0ceb956288d726c3c6d466b9e5af4 data/ars_nouveau/recipe/scribes_table.json -400b7a598f728a4e32d0c7be87226e3446f8ba3d data/ars_nouveau/recipe/scryers_crystal.json +ee5ba21b4320d4bd645ac3dad8243ca0515ddd8c data/ars_nouveau/recipe/sconce.json +825db5da332f1a056bd22a0e3e3e3cb8579d40fd data/ars_nouveau/recipe/scribes_table.json +5c800ecff28b24432eda44bd4d60b33e5e0cb739 data/ars_nouveau/recipe/scryers_crystal.json 40ac99a48606b92662bbab965d4a7d973e5580c7 data/ars_nouveau/recipe/scry_to_blank_parchment.json 0d8e0aa41af9c50473968e97f935509bf2891de9 data/ars_nouveau/recipe/sky_block.json 1ae6da8aeb72f0a39bd555e3e0ba3836f2425c08 data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_slab.json @@ -480,7 +480,7 @@ c5463533191816bf832dd59136803829ebfbfe3b data/ars_nouveau/recipe/smooth_sourcest 815af537716d5a9879a3e51c39ea662b8d34d669 data/ars_nouveau/recipe/sourceberry_sack.json d7293d221e0717498eb71355af2008ea2ad9c0ae data/ars_nouveau/recipe/sourceberry_sack_to_bush.json 2e861cae2c767aa5892e58bc39ffca478553316d data/ars_nouveau/recipe/sourceberry_to_purple.json -654efbc06185e618944f8bba2362cb8329ad1594 data/ars_nouveau/recipe/sourcestone.json +7452c7e0da8e56b63fb4fee9b0c7a3fce916b320 data/ars_nouveau/recipe/sourcestone.json b159d2ff355a3f08def030f597621b034126b94e data/ars_nouveau/recipe/sourcestone_1.json 5c80647e01b985769d977f597af8f397b8c444b7 data/ars_nouveau/recipe/sourcestone_10.json dadc5af121d0e6547541b38271af71e758cb4232 data/ars_nouveau/recipe/sourcestone_11.json @@ -522,7 +522,7 @@ fbef7ce258ce205b3025282fe6184d6c2b9ee8a6 data/ars_nouveau/recipe/sourcestone_lar e99742a48cbaefae14294f67296528e3ebc9fcfb data/ars_nouveau/recipe/sourcestone_mosaic_stonecutter_stair.json 6d345bf331f36f58111429200c9263f69c9f796f data/ars_nouveau/recipe/sourcestone_mosaic_stone_cutterslab.json 9b48c087b8662d53b6bd459a2e14d7de9fc1cd10 data/ars_nouveau/recipe/sourcestone_mosaic_to_sourcestone.json -c2d1c1bed407152bfb766dd479faa568bdde16a3 data/ars_nouveau/recipe/sourcestone_sconce.json +ab449f75dad19bff5448702d67bb32ab387e68de data/ars_nouveau/recipe/sourcestone_sconce.json 1cf3f3ec1144f994fb1951b1e839466c305c98d6 data/ars_nouveau/recipe/sourcestone_small_bricks_slab.json 206a6ae71999c8bcb2aee40ec68a71c1bf57b832 data/ars_nouveau/recipe/sourcestone_small_bricks_stairs.json 4a17f86391b25d61a3c5a2947434367826cc596b data/ars_nouveau/recipe/sourcestone_small_bricks_stonecutter_stair.json @@ -530,10 +530,10 @@ e44f13b1e300032a8b8f5c6751ed7fc583b210be data/ars_nouveau/recipe/sourcestone_sma 7f6168d5ae8e831e77cb0806e3a06d91b5450155 data/ars_nouveau/recipe/sourcestone_small_bricks_to_sourcestone.json fb928e4220c714f21512e797870c15e474f50dba data/ars_nouveau/recipe/source_berry_pie.json afe7ecef1ee8ae08a8d3a2acc1b08327d0ef9618 data/ars_nouveau/recipe/source_berry_roll.json -49b7be2f902611e6cf09f1b7ecf2344a3df3e33e data/ars_nouveau/recipe/source_gem_block.json +8e73daa42d1c3b50da95e8e9b17dd378394cb5e6 data/ars_nouveau/recipe/source_gem_block.json c06a657b4454d37d6a163c4cc10704a5c8cf5065 data/ars_nouveau/recipe/source_gem_block_2.json 9f629e68870a9bcb8827301b66f253caa5731d80 data/ars_nouveau/recipe/source_jar.json -89dd364bbdaa7000d4f7fb12e519af92a921318d data/ars_nouveau/recipe/spell_prism.json +d8b09f182394f57f1695154e21df6df2de1edb3c data/ars_nouveau/recipe/spell_prism.json 2ba1f528e85a732de26d7a83a4bc4924cbfd59f8 data/ars_nouveau/recipe/spike_to_arrow.json 958a7d7aedff3bc57fdfcb14ac84ed435927e115 data/ars_nouveau/recipe/spike_to_dye.json 068807a1afd31b9497831aeefe2df60d2565d690 data/ars_nouveau/recipe/starbuncle_shades.json @@ -542,10 +542,10 @@ c06a657b4454d37d6a163c4cc10704a5c8cf5065 data/ars_nouveau/recipe/source_gem_bloc 87f04a42c9dd11a6b0f87b823206876d8914afd6 data/ars_nouveau/recipe/stripped_purple_archwood_wood.json d128ca0b445cec01f08427a1161cc5d7c7786ca3 data/ars_nouveau/recipe/stripped_red_archwood_wood.json ca56d495360055deb4f24de0c41884339e8f9d56 data/ars_nouveau/recipe/sunrise_2.json -2e5aa7a43e48187bcf7825d17a879844e6f805d2 data/ars_nouveau/recipe/vitalic_sourcelink.json +f41669b944e5d9142e27e27c4042b8bc554d0734 data/ars_nouveau/recipe/vitalic_sourcelink.json 814123e61686726650596240db521172b91f7535 data/ars_nouveau/recipe/void_prism.json -af3c284b1aa5cd7db73e4744bc86a54be0d1806d data/ars_nouveau/recipe/volcanic_sourcelink.json -d109d81969bd3fe482ceb338954b92bb7ea76716 data/ars_nouveau/recipe/warp_scroll.json +018e98d19ca5d5afc67bad5191cd73cb510a1fa2 data/ars_nouveau/recipe/volcanic_sourcelink.json +aecf98c0d3730be9578dbceaac39fc5596d9982b data/ars_nouveau/recipe/warp_scroll.json c19871c38692c25e6045b280e8b4b5d36203c15f data/ars_nouveau/recipe/water_essence_to_bucket.json 3a1671e8f9c1c4f6348ee0ea0bb6626f104e850c data/ars_nouveau/recipe/water_essence_to_obsidian.json f9c3f8eef713e609e22c9c5b3eba2b848c13af89 data/ars_nouveau/recipe/wilden_summon_alt.json diff --git a/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 b/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 index f964dc123a..7bbd9aed30 100644 --- a/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 +++ b/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 @@ -1,14 +1,14 @@ -// 1.21 2024-07-07T16:24:07.0922909 Imbuement -6e961632461d03b6a326bc5e5b6f2363fd751372 data/ars_nouveau/recipe/abjuration_essence.json -78ba5b7234f21ac8eb5284531097cdeeb2e3dec3 data/ars_nouveau/recipe/air_essence.json +// 1.21 2024-08-01T23:52:13.9433713 Imbuement +d8ef9562f603943cf768422fb009c9ec77d7dc65 data/ars_nouveau/recipe/abjuration_essence.json +98efa28dfca47cd27a0e31e89208825c7e320e61 data/ars_nouveau/recipe/air_essence.json 6d57a8685026b987a6012bb592cf26c3dba0e89c data/ars_nouveau/recipe/amethyst.json 5bce1f0b9b92a9acdf9b856dfccd8ff4fb933c67 data/ars_nouveau/recipe/amethyst_block.json 82af4f7ca94590a4c01cbc4e7ab7524f6b603ed9 data/ars_nouveau/recipe/amplify_arrow.json -d90c66a9136a21aa6bace193134fc798183b371c data/ars_nouveau/recipe/conjuration_essence.json -654ada3c74db0c9b91368ea69600dec6ccdcf86a data/ars_nouveau/recipe/earth_essence.json -f34b432647402199429520208ac2be01ca7a863a data/ars_nouveau/recipe/fire_essence.json +4b3e5edb67c9661e999ef3aa56b07330d78052c0 data/ars_nouveau/recipe/conjuration_essence.json +71640142f8e3f340f1b4078e7a3e8fcbbbe232a9 data/ars_nouveau/recipe/earth_essence.json +bb798f4b25b7a191edb246e9122dd5756c83fa7c data/ars_nouveau/recipe/fire_essence.json 6ba22e7cf702e9be5ff66d6b28f62a61639679ce data/ars_nouveau/recipe/lapis.json -5a807ea6ff4091404cfdb2604f1127b92c669b03 data/ars_nouveau/recipe/manipulation_essence.json +7823618d4052b659f3cbb2036a28e098d263d5ae data/ars_nouveau/recipe/manipulation_essence.json 4c1e38069e88502d94768dae302127da9f8efbfd data/ars_nouveau/recipe/pierce_arrow.json 7103454e5168ee74e4e2363a76d8c94733b90433 data/ars_nouveau/recipe/split_arrow.json -9204795ab5012a8d4ef3a00a307c1152fda73336 data/ars_nouveau/recipe/water_essence.json +adbed7df2e908a20415400f5e5d86a20d4f2fe42 data/ars_nouveau/recipe/water_essence.json diff --git a/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 b/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 index ad2ca696df..e54e9434ea 100644 --- a/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 +++ b/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 @@ -1,105 +1,105 @@ -// 1.21 2024-07-07T16:24:07.0892912 Apparatus +// 1.21 2024-08-01T23:52:13.9403714 Apparatus adc3e3b582ab4d1fd6f29537bddaaecb9eaa0c2d data/ars_nouveau/recipe/alchemists_crown.json -c0b8211dd4aa5048b9408b5ae3bb42df184a218a data/ars_nouveau/recipe/amulet_of_mana_boost.json -04e95fa57004644ccb10c66974f34e38f3ef40c4 data/ars_nouveau/recipe/amulet_of_mana_regen.json -c7903c10d241ae32e21c2503bad9fcbf9cd2d68e data/ars_nouveau/recipe/aqua_affinity_1.json +9a7fefa487b159935c1f620dc9516a6600fb0d4b data/ars_nouveau/recipe/amulet_of_mana_boost.json +a653f866167b0fd7d0f7ded2166d45a2ff104d0d data/ars_nouveau/recipe/amulet_of_mana_regen.json +e0ede63fb9e91f8442442cda1dc14bcc89ef87ff data/ars_nouveau/recipe/aqua_affinity_1.json 96764d0d1d6065369fb46ddcfb990499e386dd24 data/ars_nouveau/recipe/arcanist_boots.json ccbfd1ce265f3c21637747b7c34bb6ec877d621c data/ars_nouveau/recipe/arcanist_hood.json d0f08dac1d7b5b3425d9df08cf446579311751f6 data/ars_nouveau/recipe/arcanist_leggings.json 9f811c123e1d73a606699a2a584db811ba362820 data/ars_nouveau/recipe/arcanist_robes.json -c2685fa7425b28a2214a70cd6709d8ea6632013b data/ars_nouveau/recipe/bane_of_arthropods_1.json -270331308c30919db45955292bdea990345bfcba data/ars_nouveau/recipe/bane_of_arthropods_2.json -5c3c462dfb21fd35d36b5721d05f455ff8b16b29 data/ars_nouveau/recipe/bane_of_arthropods_3.json -7df061c672b7cde4e94721d7b7f95e6446cfc152 data/ars_nouveau/recipe/bane_of_arthropods_4.json -1ce20a87cdee62e2fe40efc4b7759b39a1f3cf54 data/ars_nouveau/recipe/bane_of_arthropods_5.json +3306cf588159153c442a70d90a6e9893010c4def data/ars_nouveau/recipe/bane_of_arthropods_1.json +b1fd833a474ba2a21b2f196d753dc42606ce4d13 data/ars_nouveau/recipe/bane_of_arthropods_2.json +56f655b3dd536e8be63b051548d74d3256c74bad data/ars_nouveau/recipe/bane_of_arthropods_3.json +bdce3a3b190f3e920aed58aacea65d0ea41f5beb data/ars_nouveau/recipe/bane_of_arthropods_4.json +37cde589d1bf7b71c6e4b01ba234ff73bea2c50d data/ars_nouveau/recipe/bane_of_arthropods_5.json 55ee89af0523501993d31dc7f4c1f53d16a45d79 data/ars_nouveau/recipe/battlemage_boots.json db6cc03b8c0827571f8ed1b4ff28e560a00f624d data/ars_nouveau/recipe/battlemage_hood.json 80f55b2d64b5e90a9881119019c2fe4579f38fd1 data/ars_nouveau/recipe/battlemage_leggings.json 817efea3bd03f62a05b8237c37055658980da1ff data/ars_nouveau/recipe/battlemage_robes.json 513212420a63579f686068ddd83cad055772a60b data/ars_nouveau/recipe/belt_of_levitation.json 3e8803b889657fd206be6a5d3be96e430d6bad03 data/ars_nouveau/recipe/belt_of_unstable_gifts.json -bd291159ad9de2a17f05e205fdc30a4ec98c9cb0 data/ars_nouveau/recipe/blast_protection_1.json -22d7a9776b7a468bd9ad04594ab50e6640b28498 data/ars_nouveau/recipe/blast_protection_2.json -0e1d9224e9944898cddb6e37807a9db0e96e158d data/ars_nouveau/recipe/blast_protection_3.json -e27a5eb2238ed6cf85f7e49e9ad8fc5281de458e data/ars_nouveau/recipe/blast_protection_4.json +6d64042c146609fc4e052d7b7bd8fcee52eecff0 data/ars_nouveau/recipe/blast_protection_1.json +00218d0ab9e9deaa66d86060de60db62402ec397 data/ars_nouveau/recipe/blast_protection_2.json +a2ad8a49fe6cba6e11d13dc9f324647c674569b3 data/ars_nouveau/recipe/blast_protection_3.json +7965036dc90156eb95997759a6c0f90b8870b534 data/ars_nouveau/recipe/blast_protection_4.json 46bcd2e3d2267631de94dee8d44076cf5481332b data/ars_nouveau/recipe/brazier_relay.json -f0084bd997147acbae7dea267649414ef7e70cb1 data/ars_nouveau/recipe/depth_strider_1.json -cd5dffb6ead1bd7c3844b1c828d82455a0e84cda data/ars_nouveau/recipe/depth_strider_2.json -a17cc53c646cb611e850843c86e1ba5864b1e9dc data/ars_nouveau/recipe/depth_strider_3.json -37ecc47b3e1ae0a3c421e6f0f4f68600649760fb data/ars_nouveau/recipe/dominion_wand.json -a8c38051e5ebad721167b75d48000aa266b0a6b3 data/ars_nouveau/recipe/drygmy_charm.json -e090e7f262cc0373739085650e8eb0e3eb113d71 data/ars_nouveau/recipe/efficiency_1.json -6033cb96844662af7aeec4f9acaf45a0249eff48 data/ars_nouveau/recipe/efficiency_2.json -899b924d31dfdfc1a1ada96bcb7cd362bdcbf9cc data/ars_nouveau/recipe/efficiency_3.json -c9b8464f5d7f78072ab8bdd4456e207a28088771 data/ars_nouveau/recipe/efficiency_4.json -0bf51e7737df17e43ac7c27ec6a871391d3aeb32 data/ars_nouveau/recipe/efficiency_5.json +e6f0a11f58915ff515855bc56c4f606e70d88f87 data/ars_nouveau/recipe/depth_strider_1.json +a67db7bb1da0c861575559510bc83547803ae35e data/ars_nouveau/recipe/depth_strider_2.json +38d04b9b2faf0bc989bfd23fc735633957c22d16 data/ars_nouveau/recipe/depth_strider_3.json +802f73c849d161bd6eb1275982e043c3d397a5f9 data/ars_nouveau/recipe/dominion_wand.json +87e7b2ae1b18dde1411af59f47d42a3cf63327e0 data/ars_nouveau/recipe/drygmy_charm.json +2bb510c44c282a609978f5ed39b4b324ed3bf366 data/ars_nouveau/recipe/efficiency_1.json +ba94b8d4ebbb4ed60256abd9e23a5b354b297a66 data/ars_nouveau/recipe/efficiency_2.json +435f7bb8cc02fd02f6d9f7c4b9c9ac7eac27930c data/ars_nouveau/recipe/efficiency_3.json +29aa663334fce55ba539ea2d63bd10bb8c82be88 data/ars_nouveau/recipe/efficiency_4.json +ffd676653c81de14822f5859347f245b4cc0ce25 data/ars_nouveau/recipe/efficiency_5.json 1177e27111938b858fe4cbe43a3c8267e315c57c data/ars_nouveau/recipe/enchanters_eye.json -c82f44864c4f3bd16211d30f6972c9088d119678 data/ars_nouveau/recipe/enchanters_mirror.json -3230b794ed1e8191c8b3efb9d02ae110565da5ce data/ars_nouveau/recipe/enchanters_shield.json -c7675ead108d9d798bc12e5ab69da871468818b3 data/ars_nouveau/recipe/enchanters_sword.json -b3b17d161dc1bd034222098ea21d57bcaa9f32e3 data/ars_nouveau/recipe/feather_falling_1.json -24838ac2041b0bb5ab33fb3269850a05db93538c data/ars_nouveau/recipe/feather_falling_2.json -0a46a44ec5fc1431636d67d9f4eaf33adec9a59f data/ars_nouveau/recipe/feather_falling_3.json -3d1a3d5d7126541f11bfa5571465503420845785 data/ars_nouveau/recipe/feather_falling_4.json -07297d5bcd8eb8cf769b29de69e04c75adbd470f data/ars_nouveau/recipe/fire_aspect_1.json -7e0a25bd3ddeacb56ef95e39bfb16cc191b5f3ca data/ars_nouveau/recipe/fire_aspect_2.json -34026b2d3cc388e48e837d633d1b3d917879c092 data/ars_nouveau/recipe/fire_protection_1.json -07361509c856336c7f63013f764ece80e3d675a0 data/ars_nouveau/recipe/fire_protection_2.json -a1ca345ee50e3a7aa17ebe5af1e8eccf6f1eabf8 data/ars_nouveau/recipe/fire_protection_3.json -bfff59426d532856853a0c4be40f53dc2743afa5 data/ars_nouveau/recipe/fire_protection_4.json -8793ee59ded74d4ef71c51b8b658955c849ce184 data/ars_nouveau/recipe/fire_protection_5.json +67be8410e6968e09ed0eb852bda93a0932a77d11 data/ars_nouveau/recipe/enchanters_mirror.json +321f4d386c03038ff92a9233c1c6898123bdd80d data/ars_nouveau/recipe/enchanters_shield.json +f2c4f98facacbc8b2e4e322e99af3eaa56c16c07 data/ars_nouveau/recipe/enchanters_sword.json +af0b42edc8e28ea0ea99f83f696c67f5de5069db data/ars_nouveau/recipe/feather_falling_1.json +131481c03deb344ede5f794a3c63d564b6e41d3f data/ars_nouveau/recipe/feather_falling_2.json +d098fe9475b98f80f7b8308aa5a2cb88dd034a63 data/ars_nouveau/recipe/feather_falling_3.json +4d06aa8e39bfdd88040ab6c3cb5c917fa2d5e08d data/ars_nouveau/recipe/feather_falling_4.json +3a7bf4296a6eefee537d6fcb0b9c39f637ec8faf data/ars_nouveau/recipe/fire_aspect_1.json +89e9d058e692de7cab497404006842e1ec2d60e7 data/ars_nouveau/recipe/fire_aspect_2.json +739a3142c0fdfb61227ce74ca827501ef0a7faac data/ars_nouveau/recipe/fire_protection_1.json +8dedde3000d689cc3e6f4c0271ef126166fd26ed data/ars_nouveau/recipe/fire_protection_2.json +7869da04f7ef6bfee215bd8bb00bb2b16bdce594 data/ars_nouveau/recipe/fire_protection_3.json +222ae77d9d460ceab431071aa0c58d28421964a1 data/ars_nouveau/recipe/fire_protection_4.json +850db054d7dafe3bb52702482746ea94d0a33960 data/ars_nouveau/recipe/fire_protection_5.json 891a9103db5ab6a8e7fc019a0eabbafe6c400263 data/ars_nouveau/recipe/first_armor_upgrade.json 5ad83bd08d654192cdbbdeffdc7d3d29bcf138e7 data/ars_nouveau/recipe/flame_1.json -60d0ef222d29779a8a7a4f3f89c6a4dfb45426e7 data/ars_nouveau/recipe/fortune_1.json -332ea631e62861368f9f8815b0234288d99a24c3 data/ars_nouveau/recipe/fortune_2.json -a85d82f0987c559d883f47325adb184724c7e12d data/ars_nouveau/recipe/fortune_3.json +d5e5caf96f7c96de6e4c2526c92b971df23a68c4 data/ars_nouveau/recipe/fortune_1.json +4c012bab66e2f760d82a114218faf81918990dbe data/ars_nouveau/recipe/fortune_2.json +49c2c048fe15de5de5f7105ea0ecc32e7e7bd593 data/ars_nouveau/recipe/fortune_3.json 83baea4f1c4fd98b9ef02fb4be1d5eaa5bdc6583 data/ars_nouveau/recipe/infinity_1.json d714a9e43538aa400e99ebda2de4dac2aeb315e6 data/ars_nouveau/recipe/jar_of_light.json eed7cfd0f57e1b29f07d6f63f835a00f731ac18c data/ars_nouveau/recipe/jump_ring.json -0ec904b02e9d4d1138b33e5612fa7b47292de10f data/ars_nouveau/recipe/knockback_1.json -045e9c2a274ed482ee096b6ec4037215ef6e7292 data/ars_nouveau/recipe/knockback_2.json +424dd35dc4f31fa68f7b8c8c935457144d82a42c data/ars_nouveau/recipe/knockback_1.json +e1dc14480092525b1cf7913da5ca96f9c1e443ce data/ars_nouveau/recipe/knockback_2.json a0fa0cf20066df47ac661b2eed172d114d693fb5 data/ars_nouveau/recipe/lingering_flask_cannon.json -7c06fa55b445caaacb922e1f9d48a6c15610534b data/ars_nouveau/recipe/looting_1.json -0d282841438348a1a629743cf16b8c089103e138 data/ars_nouveau/recipe/looting_2.json -e529a6d7f3b18a773a3722af790dfcf06c8b5f92 data/ars_nouveau/recipe/looting_3.json -a25d3e554e201e1966bcc016f10f13c82e59c1c0 data/ars_nouveau/recipe/magebloom_crop.json -02f0ec7b168e847064743c88cc873fd1de014a4d data/ars_nouveau/recipe/mana_boost_1.json -6933f4ce281c6cb19d09ddbc01234d28b1c37c25 data/ars_nouveau/recipe/mana_boost_2.json -4eb3128e8da4192ed575e1ed7eb4ead88dc999b0 data/ars_nouveau/recipe/mana_boost_3.json -6e6279a3c8c5fd1ba177e4c82b8aff2c690bd8e1 data/ars_nouveau/recipe/mana_regen_1.json -3cd4fe7e4109fe06d1c5d8736234543da4a73689 data/ars_nouveau/recipe/mana_regen_2.json -7f59dc065294ad51b4006a09cd2c59c08df70925 data/ars_nouveau/recipe/mana_regen_3.json -12fad32c9b5648229eb5030d03c3965bd097ba12 data/ars_nouveau/recipe/multishot_1.json -6d39b96ce70048c9b772faadaf43156da080a48c data/ars_nouveau/recipe/piercing_1.json -150294840f8028ffaff57c122a0c40345e35042a data/ars_nouveau/recipe/piercing_2.json -1a386179b77c3030f12ab945f056af2bc14562cf data/ars_nouveau/recipe/piercing_3.json -21b34ef546d674cc8d497e47bf943975bc3f3bb9 data/ars_nouveau/recipe/piercing_4.json +ab597727803d76430871e3d423de2d61eb33bb3b data/ars_nouveau/recipe/looting_1.json +494600cf0a4328d870ece1316060dcf143f2ec5e data/ars_nouveau/recipe/looting_2.json +cc5389614ad3c7a85e79b2f2af7fa9239d0642bf data/ars_nouveau/recipe/looting_3.json +a830c33c0e77c830822fef2ee453201d5edf4fe5 data/ars_nouveau/recipe/magebloom_crop.json +abd6d0c3fd3ed63b0b4b12f65de7f1282bd7e710 data/ars_nouveau/recipe/mana_boost_1.json +e08e78544df38a0f8d1ebb410cb89b4e799231fb data/ars_nouveau/recipe/mana_boost_2.json +ff1f4c919b00d0362639d663ebb44c80f8ba8242 data/ars_nouveau/recipe/mana_boost_3.json +a298345e529420c84782a7fa489164f56c33fa3f data/ars_nouveau/recipe/mana_regen_1.json +7e927aa9ea56dabd8c897ce9866776461aa5ca36 data/ars_nouveau/recipe/mana_regen_2.json +48363af492d7d25aa03b42a6a9939062010290a0 data/ars_nouveau/recipe/mana_regen_3.json +f8ec79e93f8b1cc78c57833888b56a69d34be535 data/ars_nouveau/recipe/multishot_1.json +f1be2866f2800f904f6852da0f832b437fd6d290 data/ars_nouveau/recipe/piercing_1.json +e981a18401fc20feedcf33b53a395cc3b269e61f data/ars_nouveau/recipe/piercing_2.json +08dcd5a3f296194d199161772d42a8ec568101ec data/ars_nouveau/recipe/piercing_3.json +dccac5cdc1903e824a53fec92a253a5d5fe33708 data/ars_nouveau/recipe/piercing_4.json 946b4f2c7226fb68ce62e48f64610e918a31417b data/ars_nouveau/recipe/potion_diffuser.json -b5b7698755d881317f24315ade8a30f27dd84f84 data/ars_nouveau/recipe/potion_flask.json +45fe525c3b44e6577796b57e25a7c2530393e380 data/ars_nouveau/recipe/potion_flask.json 036e4f8c9ba8b1e91627021c43283ee08a15693d data/ars_nouveau/recipe/potion_flask_amplify.json 14373b9cbd4d828f577f37674813be308a39b711 data/ars_nouveau/recipe/potion_flask_extend_time.json 9607d38c036f878bc54cd4813c673c1c80f20e49 data/ars_nouveau/recipe/potion_melder.json -5f9e3b8280154539db4ef7d2205046e110eecf77 data/ars_nouveau/recipe/power_1.json -93318d756f8592e0123696ad21a0e9e924e02022 data/ars_nouveau/recipe/power_2.json -ebf25eeafaf1f617beb8e0e7486300ba680b8f34 data/ars_nouveau/recipe/power_3.json -00954478ee8e34dce91d764f1291828bfd2d0c76 data/ars_nouveau/recipe/power_4.json -c3e383cf1219515b6859261c88e195f04573a0af data/ars_nouveau/recipe/power_5.json -b080a3c1c3b090660dabb9e26c7b8972196b6915 data/ars_nouveau/recipe/projectile_protection_1.json -cbcc02cd5cebbe11666dfbccf4573d727a519f14 data/ars_nouveau/recipe/projectile_protection_2.json -bd36a6e55467a28689f6ae1154df52144ea6ac41 data/ars_nouveau/recipe/projectile_protection_3.json -f4260789b8d3f88ea51c8699faf334b1fae1dcb9 data/ars_nouveau/recipe/projectile_protection_4.json -b9474440a26f8aa7f4fece69b76417072cc5bbfa data/ars_nouveau/recipe/projectile_protection_5.json -525bb3a723cec3461b8581462e7dbcde2aed0a4a data/ars_nouveau/recipe/protection_1.json -19f411ca910e67898a6df6f30a883092d56d22e0 data/ars_nouveau/recipe/protection_2.json -d0b97eb377cfad2537c836ac5a858f1a8631949f data/ars_nouveau/recipe/protection_3.json -3e8b3d9328d5090d43e2d1adc8191ce3f0aecf19 data/ars_nouveau/recipe/protection_4.json -a94c38c55265345cdd8e490507194a302d6aa4c2 data/ars_nouveau/recipe/protection_5.json -74b575a1b366837c550a88aa2b7faf2f1a6f6294 data/ars_nouveau/recipe/punch_1.json -7881302755f7b430e1a47fffb0fa9b61255a6d4f data/ars_nouveau/recipe/punch_2.json -c676f30517b2985d9d16f1de47323e42124adff2 data/ars_nouveau/recipe/quick_charge_1.json -6d26004fa4f7cc97232eaf240e20f842add3211b data/ars_nouveau/recipe/quick_charge_2.json -2a899f087613df5da7263db621e085217b45bb77 data/ars_nouveau/recipe/quick_charge_3.json -a782baa08e8b6a0a8978e3e8728921f8b8531d8f data/ars_nouveau/recipe/reactive.json +ff7e61b9d71beeaa6302dbe370092d51df402468 data/ars_nouveau/recipe/power_1.json +92f28b2fe1bdb6ab8e56713a11c7b6dfbcd18e5f data/ars_nouveau/recipe/power_2.json +2d327c178a3ec18a8b01c9f636c0de93662f8a6e data/ars_nouveau/recipe/power_3.json +cf7a139ec7b47cd2615d1f0089b8f9ed0bcc4f30 data/ars_nouveau/recipe/power_4.json +a9943800ea132c316e5fe74cd0a0f0a9426598c0 data/ars_nouveau/recipe/power_5.json +99a5914a2a5cf47da0b4afcb21ef7e5791bfd54f data/ars_nouveau/recipe/projectile_protection_1.json +7587503e049e9a42740dd0e9ee6d7bfd5d422241 data/ars_nouveau/recipe/projectile_protection_2.json +c017a730e2d6fd8c4dc8f67e1dd7f8b029e1f113 data/ars_nouveau/recipe/projectile_protection_3.json +2066c88a742ba565349dd2ed9acfd4fef8048b31 data/ars_nouveau/recipe/projectile_protection_4.json +148ea785edb678d3bb6e4b4302b884f27dd01d67 data/ars_nouveau/recipe/projectile_protection_5.json +3753894e8209039ac41f373ea5d69fad403b7da1 data/ars_nouveau/recipe/protection_1.json +4223d9ac4fb2b113abc68c97e9340b029e6346e0 data/ars_nouveau/recipe/protection_2.json +20f3456b64546967b03b62bf90e6b65477104f93 data/ars_nouveau/recipe/protection_3.json +22186a33de99cd766b4d5e3d2bf71e52ff4e7322 data/ars_nouveau/recipe/protection_4.json +ae2d828cd3cf6afa7f18a367895827e21b70aacb data/ars_nouveau/recipe/protection_5.json +968255c290b40a37d5139eac4497eecdf8d356a9 data/ars_nouveau/recipe/punch_1.json +73b60592e4055cff5c3375dadd548a190d6538b3 data/ars_nouveau/recipe/punch_2.json +77816a335f883fb91cfa69abdfcddd57ebc8145e data/ars_nouveau/recipe/quick_charge_1.json +d8a8ae0d973af9f4983c9ba0cc785327a2d72a17 data/ars_nouveau/recipe/quick_charge_2.json +353bc9276470a20f0737d0908dd27d99910f74de data/ars_nouveau/recipe/quick_charge_3.json +291c08ec15ed58c1b8d905c09ec874b5c7024af7 data/ars_nouveau/recipe/reactive.json f8d2a48ea7cbb131ffce8dfbeaa54e7c668be22f data/ars_nouveau/recipe/reactive_2.json e1a23f3407ed876596ba65d5a38b32ea365db494 data/ars_nouveau/recipe/reactive_3.json 672d478694316122e6784152221af74d032d336a data/ars_nouveau/recipe/reactive_4.json @@ -107,45 +107,45 @@ e1a23f3407ed876596ba65d5a38b32ea365db494 data/ars_nouveau/recipe/reactive_3.json cd92ef2ff820bcbf43c00429923659e14ecc9f78 data/ars_nouveau/recipe/relay_deposit.json a72c98dc52caaa8b2186f851b8f57f33fb349200 data/ars_nouveau/recipe/relay_splitter.json 758f93d64c237455314fb2b2b5c8d7d616c55967 data/ars_nouveau/recipe/relay_warp.json -1bc88a5e5a73599b28a31f7ded6f84633573c4ab data/ars_nouveau/recipe/respiration_1.json -13673a7495133822b4e62be512540eec6dc18b9c data/ars_nouveau/recipe/respiration_2.json -d739a322279380f8c3ac64100bf37423aac938b6 data/ars_nouveau/recipe/respiration_3.json -d0c7a1ef3cacdf869f8d51f068aecc03fd1528b6 data/ars_nouveau/recipe/ring_of_greater_discount.json -811f0b997c1651c7bf70f6082f0aa475012a85f7 data/ars_nouveau/recipe/ring_of_lesser_discount.json -74a4cad9721143d2284ffe915a9151a8390bcb42 data/ars_nouveau/recipe/scryers_oculus.json +520e500239a71332157eeecee049beb88ce5a8f4 data/ars_nouveau/recipe/respiration_1.json +405a046ef3cb131f49c1f80d3e620cbb68daef21 data/ars_nouveau/recipe/respiration_2.json +0b8c1cba990621e1f06f9b967ac6f034b24a7094 data/ars_nouveau/recipe/respiration_3.json +a0105e2734c691161034cd98da6e9e3c26e03bab data/ars_nouveau/recipe/ring_of_greater_discount.json +d786fabdeee81841edad435f4a6382e473ef35f3 data/ars_nouveau/recipe/ring_of_lesser_discount.json +713d1ea6d6e63ab4bff5eef516eb822badc6dd8d data/ars_nouveau/recipe/scryers_oculus.json ee32a2dac6a622671113f3ab1f9a723c1b27c0bf data/ars_nouveau/recipe/second_armor_upgrade.json 173ddd3af438bfd8b6d1e4ca37ae7df8993aaae8 data/ars_nouveau/recipe/shapers_focus.json -a43d0ca45475a2f321112b0af592f063828c9f2a data/ars_nouveau/recipe/sharpness_1.json -e24bb3cf7348a0d6e3a6941d10346b9938790060 data/ars_nouveau/recipe/sharpness_2.json +eb7e2f2df686b900e8bd5f64adc2b2ff5d2bdc1f data/ars_nouveau/recipe/sharpness_1.json +0f60b6d00f08a680b6d37358c8a05e6ddaf1fef4 data/ars_nouveau/recipe/sharpness_2.json 3571c706391ea234f29393ddb25485e0b4cbffd7 data/ars_nouveau/recipe/sharpness_3.json dc4d90374183a39c28c58abebf5130a17111fe00 data/ars_nouveau/recipe/sharpness_4.json 6b488793612606c581dc70e0c7e968653312543c data/ars_nouveau/recipe/sharpness_5.json -a4ff93202c1ddf0e4f245e4364db205962baaf85 data/ars_nouveau/recipe/silk_touch_1.json -eed8e17b0fda6fe20817dd070b93e1e69e880bee data/ars_nouveau/recipe/smite_1.json -5f18b7fc7663630e4cb47ed944d7a5e72dfde0fb data/ars_nouveau/recipe/smite_2.json -5de675fc37fff5c8a5ebf3fc36df8b6bbbb2a0ce data/ars_nouveau/recipe/smite_3.json -1921d8199a1eddc2955fffa74a62b2a733332e4a data/ars_nouveau/recipe/smite_4.json -36fb70d672419e22b95b60d9f22756783f96872a data/ars_nouveau/recipe/smite_5.json +fe8bdb9ba8519d7dcfb32b0779c60a3b5633b507 data/ars_nouveau/recipe/silk_touch_1.json +d16b43c54cb3ed81e09d782fd97e04a6ca1f0581 data/ars_nouveau/recipe/smite_1.json +8c68ec02d0c433dc0a04cf3afb54afc954533255 data/ars_nouveau/recipe/smite_2.json +9a148c3928a92d59906353b9cf37fd52e8ebd6c9 data/ars_nouveau/recipe/smite_3.json +ea46ed0dea6fcb2cda6805784ce9b1fb5dab23c0 data/ars_nouveau/recipe/smite_4.json +d6afa6eb0ee482e343f702960e7bb5593758f366 data/ars_nouveau/recipe/smite_5.json 5890abc9dd6733e00b7cebdffacd0678c0ce1d5b data/ars_nouveau/recipe/sorcerer_boots.json 90635fd044ea07f1ace643ea91762bb3e94f19b5 data/ars_nouveau/recipe/sorcerer_hood.json efdab074a439128fcb823de36e7818d9acecb442 data/ars_nouveau/recipe/sorcerer_leggings.json 24bcf391984d3d2876a2651f27fc368e4193339b data/ars_nouveau/recipe/sorcerer_robes.json -b6b31cc17392dafc634d008b9247ea2c18acafc6 data/ars_nouveau/recipe/spell_bow.json -2e0859c6d8ea9993ef169dccabacde80559415d9 data/ars_nouveau/recipe/spell_crossbow.json +5d3affe68675b0c6a9e5b90395f3c65b81913ab0 data/ars_nouveau/recipe/spell_bow.json +5fb4c790b5d7ffb001c1e99c211f57b7c3d70f4c data/ars_nouveau/recipe/spell_crossbow.json d4a9d6c6cea711285eef80cf56774ce6f1816f47 data/ars_nouveau/recipe/spell_sensor.json -fd30ad5f262c0ecbc13c58a295d831f745b49aa7 data/ars_nouveau/recipe/spell_turret.json +248fe93ead9f6ae30d8a940b92c25f6080bff210 data/ars_nouveau/recipe/spell_turret.json 13ef111444d4c98faaecb82de62c7e4c260ac457 data/ars_nouveau/recipe/spell_write.json 2d0007371e00dbf644b90cc0eadb70592f9033fb data/ars_nouveau/recipe/splash_flask_cannon.json ecb2c1b5460c72e4e7cd7de78efc5f13d6623a41 data/ars_nouveau/recipe/stable_warp_scroll.json 0006d2de334ea83140b7a860ca693048d8d5866e data/ars_nouveau/recipe/starbuncle_charm.json 78aaf214ae173d9e3fe75d13f1da07d176855355 data/ars_nouveau/recipe/storage_lectern.json -2d19dd2cce6848d0afe670a99e6951d105d85a35 data/ars_nouveau/recipe/summon_focus.json -5280e9488fcc289e63becf29814a5c3eca484636 data/ars_nouveau/recipe/sweeping_edge_1.json -187de83398cd362e7a00874675361f4d30fb4d8f data/ars_nouveau/recipe/sweeping_edge_2.json -58d9dbb602eb56f14a151ee8fb25676c0418dc38 data/ars_nouveau/recipe/sweeping_edge_3.json -1469c1b7954ec12805296ea856665d43b98a796a data/ars_nouveau/recipe/thorns_1.json -5e5c2d09d1d57cdcd5fdf7d27bee81f260aedd44 data/ars_nouveau/recipe/thorns_2.json -10f7179165a127cfd3924618aee667a69fc6306c data/ars_nouveau/recipe/thorns_3.json +cb413e475021660182ca2c5da7096c7af4185d63 data/ars_nouveau/recipe/summon_focus.json +45640e50e3509b7587535d03f8d0a1ae95e4ddfa data/ars_nouveau/recipe/sweeping_edge_1.json +c2395f7c82cdcad36a461c0b9bf8171cfb02524b data/ars_nouveau/recipe/sweeping_edge_2.json +113aff634b21e9f69eb2e0235e9a1168def50f89 data/ars_nouveau/recipe/sweeping_edge_3.json +b8163f68cf9b5de956b9af9a8d4d312ca2ae716b data/ars_nouveau/recipe/thorns_1.json +c0a42357afbe1dbc1a89b7bcd2530b2de0e2b953 data/ars_nouveau/recipe/thorns_2.json +2fbfeb666dde166ebea42498e082dd3ea6f82edc data/ars_nouveau/recipe/thorns_3.json edacda871b183d1a339585fc8f902782100701c1 data/ars_nouveau/recipe/thread_amethyst_golem.json f1397781e9783a88b148fd73d59b2e9ce839d380 data/ars_nouveau/recipe/thread_chilling.json 18fca0f8164800609527ffb8a65f269fc064d656 data/ars_nouveau/recipe/thread_depths.json @@ -166,11 +166,11 @@ bdfa9e7d7be9d1ab936d8c37cf74b4a6ff5e8153 data/ars_nouveau/recipe/thread_undying. b24cab06a489af2b77eb182eae3b644aa15ced2e data/ars_nouveau/recipe/thread_whirlisprig.json 7d29e5fb5849312821a060dc2909138b99418dd6 data/ars_nouveau/recipe/thread_wixie.json 616c14a7aba336d86ad3f4e80e72ff55e7b04dff data/ars_nouveau/recipe/timer_spell_turret.json -5bf61565ee331120e0613eadea62381c3322b813 data/ars_nouveau/recipe/unbreaking_1.json -f998bc09f336a101cdf892d25afc5cb44f6f1642 data/ars_nouveau/recipe/unbreaking_2.json -e7450372fe497b1005a69e8ba69b624ecb35e027 data/ars_nouveau/recipe/unbreaking_3.json +06b23e343143f8ef7b804f45f5a59b995ee230b4 data/ars_nouveau/recipe/unbreaking_1.json +113d45ce053669cfb20138847894ce82800f6a86 data/ars_nouveau/recipe/unbreaking_2.json +aeb4943d3a16b38b623a6a252c1ec1b7fbc4df22 data/ars_nouveau/recipe/unbreaking_3.json fcf211f490f9bba03511bb94d59ff606007e81fd data/ars_nouveau/recipe/void_jar.json -430f68e98c50dad8e62c4123299510d2861e2bf2 data/ars_nouveau/recipe/wand.json +bc0dd44f2a595f7622aaa6a68801b6f35167dc3b data/ars_nouveau/recipe/wand.json 39f2882ad3d4a7d3b822bf5a8f7b034c9ee093a7 data/ars_nouveau/recipe/warp_scroll_copy.json -67bf6c12adf504176f049230001088a137de0697 data/ars_nouveau/recipe/whirlisprig_charm.json +fe5f114abf42ad1f6ba98978b2ac564f6ab720f2 data/ars_nouveau/recipe/whirlisprig_charm.json 608aff1e7a08a5431bf22133fc2201f56ce3bcf0 data/ars_nouveau/recipe/wixie_charm.json diff --git a/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 b/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 index 4ce5ae2613..0a4e3dce46 100644 --- a/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 +++ b/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 @@ -1,2 +1,40 @@ -// 1.21 2024-07-11T14:52:44.5425158 Advancements +// 1.21 2024-08-02T14:51:11.8592968 Advancements +48dd44d88536431cef54a84d4a7dce06d6567a5d data/ars_nouveau/advancement/alteration_table.json +da10d6cfc3154e84e349a4f51c6cb4b1bdd9cb97 data/ars_nouveau/advancement/amethyst_golem_charm.json +576e3c90dbff03f0668db9bce1d6d88ed511e672 data/ars_nouveau/advancement/apprentice_spell_book.json +34f9a0e9e7dcdb96a0553f28852b11a0f2b4f924 data/ars_nouveau/advancement/archmage_spell_book.json +025052e5d7381c2ad5776814b5f5c54a2986e044 data/ars_nouveau/advancement/basic_spell_turret.json +c2f835310d25bddc609920d35b301e69c491dee2 data/ars_nouveau/advancement/catch_lightning.json +2de4b15f3eb43aa4fc1ffe163d99a1cdbec0d3a9 data/ars_nouveau/advancement/create_portal.json +767f0952899b54bd4a66f50f1bc76ccf988fb628 data/ars_nouveau/advancement/drygmy_charm.json +9b55110cfc4ce805ebec5819747651ed83981a18 data/ars_nouveau/advancement/eat_bombegranate.json +95ba5a701816b72842b38be5c2b99815fc58c5d7 data/ars_nouveau/advancement/enchanting_apparatus.json +53364031e9b48f7e570c63c417c9f16ed49b68b3 data/ars_nouveau/advancement/familiar.json +6b8ed5b6cb733b4db63f5141c16ddab053863fcb data/ars_nouveau/advancement/imbuement_chamber.json +314db4db4c52b6733dbe5a15c9d965e5085451d8 data/ars_nouveau/advancement/magebloom_crop.json +dcc2ec877809d1e81ded0cf1b48ed764702ef7de data/ars_nouveau/advancement/mob_jar.json +1cbb3499bb2c1c8c989851aa3f75f397730660a6 data/ars_nouveau/advancement/novice_spell_book.json +50a2b92225b64d46ce09a522f4b0fb1363fdd701 data/ars_nouveau/advancement/poof_mob.json +c718823ad3bf3084c7e9337688487a33cee7722b data/ars_nouveau/advancement/potion_diffuser.json +02470aee5b815f93a5390bb8a26eb79dce4e2e9c data/ars_nouveau/advancement/potion_flask.json +a156b38ebcdeea8bf6eb8300c198a34f0c016a61 data/ars_nouveau/advancement/potion_jar.json +1acfa564b71a688c1ee3791bbf2f7d6a6e9039e5 data/ars_nouveau/advancement/potion_melder.json +118121e301e09b139959e3dc96b23c097f4bcad0 data/ars_nouveau/advancement/prismatic.json +606f9ce00dba2290ed04cf0d913612a472ad441e data/ars_nouveau/advancement/ritual_brazier.json +f4a12c645243c28ee124e0ae1c01709e61f3db5c data/ars_nouveau/advancement/ritual_gravity.json f8a2df2ff9bac6e637f619d7a2d41815bfd19ea1 data/ars_nouveau/advancement/root.json +1b2cda18fc65f6ced0adc768241357049f6b732f data/ars_nouveau/advancement/scryers_oculus.json +8849b85859743964af35b5477dbceed044e1906e data/ars_nouveau/advancement/shapers_focus.json +7a2d463300f16ca61a282e4ad269a5158bc375eb data/ars_nouveau/advancement/shrunk_starbuncle.json +fbaf7e26165e4a424e25be9c9de51b448d311bb3 data/ars_nouveau/advancement/source_jar.json +3b8c22be8dec7f707cccde99979934ea9ddce4c1 data/ars_nouveau/advancement/spell_prism.json +9772bf00b998c18828985edb1e7b6b2a8e7de80b data/ars_nouveau/advancement/starbuncle_shades.json +acfa5fae1daf1caa4856fa1eaa7c87393c3b387a data/ars_nouveau/advancement/starby_charm.json +d7d0f7d9c2fb3adbcf16b93c3c483899d17c3eec data/ars_nouveau/advancement/summon_focus.json +f9d69f4739a6659928668fec062d8f8e886a4ef7 data/ars_nouveau/advancement/time_in_a_bottle.json +634b6e5d5a65125bc7e11e5b758d323ddc4a2a52 data/ars_nouveau/advancement/warp_scroll.json +79bc127a92e39ff26da4b96b21990462f806f9a1 data/ars_nouveau/advancement/whirlisprig_charm.json +b6df1a4d14a2af309e8111700f7af2b460e0b85d data/ars_nouveau/advancement/wilden_explosion.json +7e7bc4f1c9dead03e194a1bf072fda402867dfb2 data/ars_nouveau/advancement/wilden_tribute.json +01628bc7755261fe3bd013e2b1e1d355107d2c10 data/ars_nouveau/advancement/wixie_charm.json +b83e08512e38cfe0675f9217ad7056bb50ac17bb data/ars_nouveau/advancement/wixie_hat.json diff --git a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 index 5fda19716b..ce4ba51ccf 100644 --- a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 +++ b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 @@ -1,4 +1,4 @@ -// 1.21 2024-07-29T18:47:02.5107712 AN tags +// 1.21 2024-08-01T23:52:13.9443715 AN tags 939cde8f97e4e8d7ea8445415522f703b2b927d4 data/ars_nouveau/tags/block/an_decorative.json de95bc21249101b079255a1a00274f60d55e0602 data/ars_nouveau/tags/block/blazing_logs.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/block/break_blacklist.json @@ -24,6 +24,7 @@ f5e3f6895ab28e98f84db162bb5a7ec0d8484aae data/ars_nouveau/tags/block/summon_bed. 47f1f23357a86b9184362224b5c7095555f6846d data/ars_nouveau/tags/block/vexing_logs.json a8499e798f3d96d8569c7b06e1c9b83d05da3caf data/ars_nouveau/tags/block/whirlisprig/greatly_likes.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/block/whirlisprig/kinda_likes.json +f36268e9375442e51cbf98f2c4d573082aa56378 data/c/tags/block/bushes.json 2f9b7e099208b0e404e0f81c89f2a368e5d909da data/c/tags/block/chests.json 2f9b7e099208b0e404e0f81c89f2a368e5d909da data/c/tags/block/chests/wooden.json 87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/c/tags/block/fences.json @@ -58,4 +59,3 @@ a01909919207615cda1bb44f33db287efa02333b data/minecraft/tags/block/wooden_doors. 70afef6fe4926a8dbf1205248dc1371974ef3037 data/minecraft/tags/block/wooden_slabs.json e5d97b748b59672ba4baec9c3f1093370adf0332 data/minecraft/tags/block/wooden_stairs.json 23fc13405d4dc43512deb39ee5bbbb73da177166 data/minecraft/tags/block/wooden_trapdoors.json -f36268e9375442e51cbf98f2c4d573082aa56378 data/neoforge/tags/block/bushes.json diff --git a/src/generated/resources/data/ars_nouveau/advancement/alteration_table.json b/src/generated/resources/data/ars_nouveau/advancement/alteration_table.json new file mode 100644 index 0000000000..d0a749c6c9 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/alteration_table.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:magebloom_crop", + "criteria": { + "has_alteration_table": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:alteration_table" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.alteration_table" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:alteration_table" + }, + "title": { + "translate": "ars_nouveau.adv.title.alteration_table" + } + }, + "requirements": [ + [ + "has_alteration_table" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/amethyst_golem_charm.json b/src/generated/resources/data/ars_nouveau/advancement/amethyst_golem_charm.json new file mode 100644 index 0000000000..a47deaefa7 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/amethyst_golem_charm.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:ritual_brazier", + "criteria": { + "has_amethyst_golem_charm": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:amethyst_golem_charm" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.amethyst_golem_charm" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:amethyst_golem_charm" + }, + "title": { + "translate": "ars_nouveau.adv.title.amethyst_golem_charm" + } + }, + "requirements": [ + [ + "has_amethyst_golem_charm" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/apprentice_spell_book.json b/src/generated/resources/data/ars_nouveau/advancement/apprentice_spell_book.json new file mode 100644 index 0000000000..3dc935effb --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/apprentice_spell_book.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:novice_spell_book", + "criteria": { + "has_apprentice_spell_book": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:apprentice_spell_book" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.apprentice_spell_book" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:apprentice_spell_book" + }, + "title": { + "translate": "ars_nouveau.adv.title.apprentice_spell_book" + } + }, + "requirements": [ + [ + "has_apprentice_spell_book" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/archmage_spell_book.json b/src/generated/resources/data/ars_nouveau/advancement/archmage_spell_book.json new file mode 100644 index 0000000000..b648af3c06 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/archmage_spell_book.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:wilden_tribute", + "criteria": { + "has_archmage_spell_book": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:archmage_spell_book" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.archmage_spell_book" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:archmage_spell_book" + }, + "title": { + "translate": "ars_nouveau.adv.title.archmage_spell_book" + } + }, + "requirements": [ + [ + "has_archmage_spell_book" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/basic_spell_turret.json b/src/generated/resources/data/ars_nouveau/advancement/basic_spell_turret.json new file mode 100644 index 0000000000..952a5e5e05 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/basic_spell_turret.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:enchanting_apparatus", + "criteria": { + "has_basic_spell_turret": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:basic_spell_turret" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.basic_spell_turret" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:basic_spell_turret" + }, + "title": { + "translate": "ars_nouveau.adv.title.basic_spell_turret" + } + }, + "requirements": [ + [ + "has_basic_spell_turret" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/catch_lightning.json b/src/generated/resources/data/ars_nouveau/advancement/catch_lightning.json new file mode 100644 index 0000000000..2ac5e5ce15 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/catch_lightning.json @@ -0,0 +1,27 @@ +{ + "parent": "ars_nouveau:mob_jar", + "criteria": { + "catch_lightning": { + "trigger": "ars_nouveau:catch_lightning" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.catch_lightning" + }, + "frame": "challenge", + "hidden": true, + "icon": { + "count": 1, + "id": "minecraft:lightning_rod" + }, + "title": { + "translate": "ars_nouveau.adv.title.catch_lightning" + } + }, + "requirements": [ + [ + "catch_lightning" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/create_portal.json b/src/generated/resources/data/ars_nouveau/advancement/create_portal.json new file mode 100644 index 0000000000..3fa7af52e7 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/create_portal.json @@ -0,0 +1,26 @@ +{ + "parent": "ars_nouveau:warp_scroll", + "criteria": { + "create_portal": { + "trigger": "ars_nouveau:portals" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.create_portal" + }, + "frame": "challenge", + "icon": { + "count": 1, + "id": "ars_nouveau:creative_source_jar" + }, + "title": { + "translate": "ars_nouveau.adv.title.create_portal" + } + }, + "requirements": [ + [ + "create_portal" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/drygmy_charm.json b/src/generated/resources/data/ars_nouveau/advancement/drygmy_charm.json new file mode 100644 index 0000000000..1b71336542 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/drygmy_charm.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:poof_mob", + "criteria": { + "has_drygmy_charm": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:drygmy_charm" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.drygmy_charm" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:drygmy_charm" + }, + "title": { + "translate": "ars_nouveau.adv.title.drygmy_charm" + } + }, + "requirements": [ + [ + "has_drygmy_charm" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/eat_bombegranate.json b/src/generated/resources/data/ars_nouveau/advancement/eat_bombegranate.json new file mode 100644 index 0000000000..d1b3234b78 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/eat_bombegranate.json @@ -0,0 +1,31 @@ +{ + "parent": "ars_nouveau:root", + "criteria": { + "eat_bombegranate": { + "conditions": { + "item": { + "items": "ars_nouveau:bombegranate_pod" + } + }, + "trigger": "minecraft:consume_item" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.eat_bombegranate" + }, + "hidden": true, + "icon": { + "count": 1, + "id": "ars_nouveau:bombegranate_pod" + }, + "title": { + "translate": "ars_nouveau.adv.title.eat_bombegranate" + } + }, + "requirements": [ + [ + "eat_bombegranate" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/enchanting_apparatus.json b/src/generated/resources/data/ars_nouveau/advancement/enchanting_apparatus.json new file mode 100644 index 0000000000..34e482ab71 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/enchanting_apparatus.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:imbuement_chamber", + "criteria": { + "has_enchanting_apparatus": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:enchanting_apparatus" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.enchanting_apparatus" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:enchanting_apparatus" + }, + "title": { + "translate": "ars_nouveau.adv.title.enchanting_apparatus" + } + }, + "requirements": [ + [ + "has_enchanting_apparatus" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/familiar.json b/src/generated/resources/data/ars_nouveau/advancement/familiar.json new file mode 100644 index 0000000000..b6fd7e3c76 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/familiar.json @@ -0,0 +1,26 @@ +{ + "parent": "ars_nouveau:ritual_brazier", + "criteria": { + "familiar": { + "trigger": "ars_nouveau:familiar" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.familiar" + }, + "frame": "goal", + "icon": { + "count": 1, + "id": "ars_nouveau:ritual_binding" + }, + "title": { + "translate": "ars_nouveau.adv.title.familiar" + } + }, + "requirements": [ + [ + "familiar" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/imbuement_chamber.json b/src/generated/resources/data/ars_nouveau/advancement/imbuement_chamber.json new file mode 100644 index 0000000000..8c212cf491 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/imbuement_chamber.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:root", + "criteria": { + "has_imbuement_chamber": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:imbuement_chamber" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.imbuement_chamber" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:imbuement_chamber" + }, + "title": { + "translate": "ars_nouveau.adv.title.imbuement_chamber" + } + }, + "requirements": [ + [ + "has_imbuement_chamber" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/magebloom_crop.json b/src/generated/resources/data/ars_nouveau/advancement/magebloom_crop.json new file mode 100644 index 0000000000..6de6fb929f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/magebloom_crop.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:enchanting_apparatus", + "criteria": { + "has_magebloom_crop": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:magebloom_crop" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.magebloom_crop" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:magebloom_crop" + }, + "title": { + "translate": "ars_nouveau.adv.title.magebloom_crop" + } + }, + "requirements": [ + [ + "has_magebloom_crop" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/mob_jar.json b/src/generated/resources/data/ars_nouveau/advancement/mob_jar.json new file mode 100644 index 0000000000..7b8380cba0 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/mob_jar.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:ritual_brazier", + "criteria": { + "has_mob_jar": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:mob_jar" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.mob_jar" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:mob_jar" + }, + "title": { + "translate": "ars_nouveau.adv.title.mob_jar" + } + }, + "requirements": [ + [ + "has_mob_jar" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/novice_spell_book.json b/src/generated/resources/data/ars_nouveau/advancement/novice_spell_book.json new file mode 100644 index 0000000000..90ebf6d84e --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/novice_spell_book.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:root", + "criteria": { + "has_novice_spell_book": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:novice_spell_book" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.novice_spell_book" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:novice_spell_book" + }, + "title": { + "translate": "ars_nouveau.adv.title.novice_spell_book" + } + }, + "requirements": [ + [ + "has_novice_spell_book" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/poof_mob.json b/src/generated/resources/data/ars_nouveau/advancement/poof_mob.json new file mode 100644 index 0000000000..4f1d35ad22 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/poof_mob.json @@ -0,0 +1,25 @@ +{ + "parent": "ars_nouveau:root", + "criteria": { + "poof_mob": { + "trigger": "ars_nouveau:poof_mob" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.poof_mob" + }, + "icon": { + "count": 1, + "id": "minecraft:gold_nugget" + }, + "title": { + "translate": "ars_nouveau.adv.title.poof_mob" + } + }, + "requirements": [ + [ + "poof_mob" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/potion_diffuser.json b/src/generated/resources/data/ars_nouveau/advancement/potion_diffuser.json new file mode 100644 index 0000000000..9ca5ed52b6 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/potion_diffuser.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:potion_jar", + "criteria": { + "has_potion_diffuser": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:potion_diffuser" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.potion_diffuser" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:potion_diffuser" + }, + "title": { + "translate": "ars_nouveau.adv.title.potion_diffuser" + } + }, + "requirements": [ + [ + "has_potion_diffuser" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/potion_flask.json b/src/generated/resources/data/ars_nouveau/advancement/potion_flask.json new file mode 100644 index 0000000000..cf0dde62c8 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/potion_flask.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:potion_jar", + "criteria": { + "has_potion_flask": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:potion_flask" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.potion_flask" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:potion_flask" + }, + "title": { + "translate": "ars_nouveau.adv.title.potion_flask" + } + }, + "requirements": [ + [ + "has_potion_flask" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/potion_jar.json b/src/generated/resources/data/ars_nouveau/advancement/potion_jar.json new file mode 100644 index 0000000000..cb154af5d9 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/potion_jar.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:enchanting_apparatus", + "criteria": { + "has_potion_jar": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:potion_jar" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.potion_jar" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:potion_jar" + }, + "title": { + "translate": "ars_nouveau.adv.title.potion_jar" + } + }, + "requirements": [ + [ + "has_potion_jar" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/potion_melder.json b/src/generated/resources/data/ars_nouveau/advancement/potion_melder.json new file mode 100644 index 0000000000..6606382a06 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/potion_melder.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:potion_jar", + "criteria": { + "has_potion_melder": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:potion_melder" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.potion_melder" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:potion_melder" + }, + "title": { + "translate": "ars_nouveau.adv.title.potion_melder" + } + }, + "requirements": [ + [ + "has_potion_melder" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/prismatic.json b/src/generated/resources/data/ars_nouveau/advancement/prismatic.json new file mode 100644 index 0000000000..51897a97d4 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/prismatic.json @@ -0,0 +1,27 @@ +{ + "parent": "ars_nouveau:spell_prism", + "criteria": { + "prismatic": { + "trigger": "ars_nouveau:prismatic" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.prismatic" + }, + "frame": "challenge", + "hidden": true, + "icon": { + "count": 1, + "id": "ars_nouveau:spell_prism" + }, + "title": { + "translate": "ars_nouveau.adv.title.prismatic" + } + }, + "requirements": [ + [ + "prismatic" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/ritual_brazier.json b/src/generated/resources/data/ars_nouveau/advancement/ritual_brazier.json new file mode 100644 index 0000000000..bc354d436b --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/ritual_brazier.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:root", + "criteria": { + "has_ritual_brazier": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:ritual_brazier" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.ritual_brazier" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:ritual_brazier" + }, + "title": { + "translate": "ars_nouveau.adv.title.ritual_brazier" + } + }, + "requirements": [ + [ + "has_ritual_brazier" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/ritual_gravity.json b/src/generated/resources/data/ars_nouveau/advancement/ritual_gravity.json new file mode 100644 index 0000000000..8da2b3dde8 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/ritual_gravity.json @@ -0,0 +1,31 @@ +{ + "parent": "ars_nouveau:ritual_brazier", + "criteria": { + "gravity_effect": { + "conditions": { + "effects": { + "ars_nouveau:gravity": {} + } + }, + "trigger": "minecraft:effects_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.ritual_gravity" + }, + "frame": "goal", + "icon": { + "count": 1, + "id": "ars_nouveau:ritual_gravity" + }, + "title": { + "translate": "ars_nouveau.adv.title.ritual_gravity" + } + }, + "requirements": [ + [ + "gravity_effect" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/scryers_oculus.json b/src/generated/resources/data/ars_nouveau/advancement/scryers_oculus.json new file mode 100644 index 0000000000..f988386540 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/scryers_oculus.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:enchanting_apparatus", + "criteria": { + "has_scryers_oculus": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:scryers_oculus" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.scryers_oculus" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:scryers_oculus" + }, + "title": { + "translate": "ars_nouveau.adv.title.scryers_oculus" + } + }, + "requirements": [ + [ + "has_scryers_oculus" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/shapers_focus.json b/src/generated/resources/data/ars_nouveau/advancement/shapers_focus.json new file mode 100644 index 0000000000..a2a2c46b5f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/shapers_focus.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:novice_spell_book", + "criteria": { + "has_shapers_focus": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:shapers_focus" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.shapers_focus" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:shapers_focus" + }, + "title": { + "translate": "ars_nouveau.adv.title.shapers_focus" + } + }, + "requirements": [ + [ + "has_shapers_focus" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/shrunk_starbuncle.json b/src/generated/resources/data/ars_nouveau/advancement/shrunk_starbuncle.json new file mode 100644 index 0000000000..951b7f7f42 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/shrunk_starbuncle.json @@ -0,0 +1,27 @@ +{ + "parent": "ars_nouveau:mob_jar", + "criteria": { + "shrunk_starbuncle": { + "trigger": "ars_nouveau:shrunk_starby" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.shrunk_starbuncle" + }, + "frame": "challenge", + "hidden": true, + "icon": { + "count": 1, + "id": "ars_nouveau:starbuncle_charm" + }, + "title": { + "translate": "ars_nouveau.adv.title.shrunk_starbuncle" + } + }, + "requirements": [ + [ + "shrunk_starbuncle" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/source_jar.json b/src/generated/resources/data/ars_nouveau/advancement/source_jar.json new file mode 100644 index 0000000000..8ecd982429 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/source_jar.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:imbuement_chamber", + "criteria": { + "has_source_jar": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:source_jar" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.source_jar" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:source_jar" + }, + "title": { + "translate": "ars_nouveau.adv.title.source_jar" + } + }, + "requirements": [ + [ + "has_source_jar" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/spell_prism.json b/src/generated/resources/data/ars_nouveau/advancement/spell_prism.json new file mode 100644 index 0000000000..ad6a4d0fc1 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/spell_prism.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:basic_spell_turret", + "criteria": { + "has_spell_prism": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:spell_prism" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.spell_prism" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:spell_prism" + }, + "title": { + "translate": "ars_nouveau.adv.title.spell_prism" + } + }, + "requirements": [ + [ + "has_spell_prism" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/starbuncle_shades.json b/src/generated/resources/data/ars_nouveau/advancement/starbuncle_shades.json new file mode 100644 index 0000000000..99faf6aa85 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/starbuncle_shades.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:starby_charm", + "criteria": { + "has_starbuncle_shades": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:starbuncle_shades" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.starbuncle_shades" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:starbuncle_shades" + }, + "title": { + "translate": "ars_nouveau.adv.title.starbuncle_shades" + } + }, + "requirements": [ + [ + "has_starbuncle_shades" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/starby_charm.json b/src/generated/resources/data/ars_nouveau/advancement/starby_charm.json new file mode 100644 index 0000000000..e924096886 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/starby_charm.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:poof_mob", + "criteria": { + "has_starbuncle_charm": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:starbuncle_charm" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.starby_charm" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:starbuncle_charm" + }, + "title": { + "translate": "ars_nouveau.adv.title.starby_charm" + } + }, + "requirements": [ + [ + "has_starbuncle_charm" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/summon_focus.json b/src/generated/resources/data/ars_nouveau/advancement/summon_focus.json new file mode 100644 index 0000000000..9b021c1494 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/summon_focus.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:wilden_tribute", + "criteria": { + "has_summon_focus": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:summon_focus" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.summon_focus" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:summon_focus" + }, + "title": { + "translate": "ars_nouveau.adv.title.summon_focus" + } + }, + "requirements": [ + [ + "has_summon_focus" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/time_in_a_bottle.json b/src/generated/resources/data/ars_nouveau/advancement/time_in_a_bottle.json new file mode 100644 index 0000000000..1b77d7080b --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/time_in_a_bottle.json @@ -0,0 +1,27 @@ +{ + "parent": "ars_nouveau:mob_jar", + "criteria": { + "time_in_a_bottle": { + "trigger": "ars_nouveau:time_in_bottle" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.time_in_a_bottle" + }, + "frame": "challenge", + "hidden": true, + "icon": { + "count": 1, + "id": "minecraft:clock" + }, + "title": { + "translate": "ars_nouveau.adv.title.time_in_a_bottle" + } + }, + "requirements": [ + [ + "time_in_a_bottle" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/warp_scroll.json b/src/generated/resources/data/ars_nouveau/advancement/warp_scroll.json new file mode 100644 index 0000000000..8d480d996f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/warp_scroll.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:magebloom_crop", + "criteria": { + "has_warp_scroll": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:warp_scroll" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.warp_scroll" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:warp_scroll" + }, + "title": { + "translate": "ars_nouveau.adv.title.warp_scroll" + } + }, + "requirements": [ + [ + "has_warp_scroll" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/whirlisprig_charm.json b/src/generated/resources/data/ars_nouveau/advancement/whirlisprig_charm.json new file mode 100644 index 0000000000..d4f5fb4cfb --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/whirlisprig_charm.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:poof_mob", + "criteria": { + "has_whirlisprig_charm": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:whirlisprig_charm" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.whirlisprig_charm" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:whirlisprig_charm" + }, + "title": { + "translate": "ars_nouveau.adv.title.whirlisprig_charm" + } + }, + "requirements": [ + [ + "has_whirlisprig_charm" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/wilden_explosion.json b/src/generated/resources/data/ars_nouveau/advancement/wilden_explosion.json new file mode 100644 index 0000000000..83ab3258c0 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/wilden_explosion.json @@ -0,0 +1,27 @@ +{ + "parent": "ars_nouveau:wilden_tribute", + "criteria": { + "wilden_explosion": { + "trigger": "ars_nouveau:chimera_explosion" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.wilden_explosion" + }, + "frame": "challenge", + "hidden": true, + "icon": { + "count": 1, + "id": "ars_nouveau:wilden_tribute" + }, + "title": { + "translate": "ars_nouveau.adv.title.wilden_explosion" + } + }, + "requirements": [ + [ + "wilden_explosion" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/wilden_tribute.json b/src/generated/resources/data/ars_nouveau/advancement/wilden_tribute.json new file mode 100644 index 0000000000..1d481fdce8 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/wilden_tribute.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:apprentice_spell_book", + "criteria": { + "has_wilden_tribute": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:wilden_tribute" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.wilden_tribute" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:wilden_tribute" + }, + "title": { + "translate": "ars_nouveau.adv.title.wilden_tribute" + } + }, + "requirements": [ + [ + "has_wilden_tribute" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/wixie_charm.json b/src/generated/resources/data/ars_nouveau/advancement/wixie_charm.json new file mode 100644 index 0000000000..ea9ca21816 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/wixie_charm.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:poof_mob", + "criteria": { + "has_wixie_charm": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:wixie_charm" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.wixie_charm" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:wixie_charm" + }, + "title": { + "translate": "ars_nouveau.adv.title.wixie_charm" + } + }, + "requirements": [ + [ + "has_wixie_charm" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/wixie_hat.json b/src/generated/resources/data/ars_nouveau/advancement/wixie_hat.json new file mode 100644 index 0000000000..dc1b740e63 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/wixie_hat.json @@ -0,0 +1,32 @@ +{ + "parent": "ars_nouveau:starby_charm", + "criteria": { + "has_wixie_hat": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:wixie_hat" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "ars_nouveau.adv.desc.wixie_hat" + }, + "icon": { + "count": 1, + "id": "ars_nouveau:wixie_hat" + }, + "title": { + "translate": "ars_nouveau.adv.title.wixie_hat" + } + }, + "requirements": [ + [ + "has_wixie_hat" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/abjuration_essence.json b/src/generated/resources/data/ars_nouveau/recipe/abjuration_essence.json index db45f7ed9a..f43ab87b95 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/abjuration_essence.json +++ b/src/generated/resources/data/ars_nouveau/recipe/abjuration_essence.json @@ -1,7 +1,7 @@ { "type": "ars_nouveau:imbuement", "input": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, "output": { "count": 1, diff --git a/src/generated/resources/data/ars_nouveau/recipe/agronomic_sourcelink.json b/src/generated/resources/data/ars_nouveau/recipe/agronomic_sourcelink.json index a1c2086ec4..6ceb7b1689 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/agronomic_sourcelink.json +++ b/src/generated/resources/data/ars_nouveau/recipe/agronomic_sourcelink.json @@ -9,7 +9,7 @@ "item": "minecraft:wheat" }, "s": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } }, "pattern": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/air_essence.json b/src/generated/resources/data/ars_nouveau/recipe/air_essence.json index ee16f19252..791ed060b7 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/air_essence.json +++ b/src/generated/resources/data/ars_nouveau/recipe/air_essence.json @@ -1,7 +1,7 @@ { "type": "ars_nouveau:imbuement", "input": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, "output": { "count": 1, diff --git a/src/generated/resources/data/ars_nouveau/recipe/alchemical_sourcelink.json b/src/generated/resources/data/ars_nouveau/recipe/alchemical_sourcelink.json index 88002115a2..13972e88ed 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/alchemical_sourcelink.json +++ b/src/generated/resources/data/ars_nouveau/recipe/alchemical_sourcelink.json @@ -9,7 +9,7 @@ "item": "minecraft:brewing_stand" }, "s": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } }, "pattern": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_boost.json b/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_boost.json index 149430fa49..c3a1cb666e 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_boost.json +++ b/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_boost.json @@ -12,19 +12,19 @@ "tag": "c:gems/diamond" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } ], "reagent": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_regen.json b/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_regen.json index 08d0f7b5d2..0d1a7d21fe 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_regen.json +++ b/src/generated/resources/data/ars_nouveau/recipe/amulet_of_mana_regen.json @@ -15,16 +15,16 @@ "tag": "c:ingots/gold" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } ], "reagent": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/aqua_affinity_1.json b/src/generated/resources/data/ars_nouveau/recipe/aqua_affinity_1.json index ecc4645660..12a2ba45b9 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/aqua_affinity_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/aqua_affinity_1.json @@ -16,10 +16,10 @@ "tag": "minecraft:fishes" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/arcane_core.json b/src/generated/resources/data/ars_nouveau/recipe/arcane_core.json index 9fc2091dbc..23bec660bf 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/arcane_core.json +++ b/src/generated/resources/data/ars_nouveau/recipe/arcane_core.json @@ -9,7 +9,7 @@ "tag": "c:ingots/gold" }, "z": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } }, "pattern": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/arcane_pedestal.json b/src/generated/resources/data/ars_nouveau/recipe/arcane_pedestal.json index a114e533b7..1a31188ec7 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/arcane_pedestal.json +++ b/src/generated/resources/data/ars_nouveau/recipe/arcane_pedestal.json @@ -9,7 +9,7 @@ "tag": "c:nuggets/gold" }, "z": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } }, "pattern": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/archwood_planks.json b/src/generated/resources/data/ars_nouveau/recipe/archwood_planks.json index c98baf7857..7aeb74448d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/archwood_planks.json +++ b/src/generated/resources/data/ars_nouveau/recipe/archwood_planks.json @@ -3,7 +3,7 @@ "category": "misc", "ingredients": [ { - "tag": "neoforge:logs/archwood" + "tag": "c:logs/archwood" } ], "result": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/archwood_sconce.json b/src/generated/resources/data/ars_nouveau/recipe/archwood_sconce.json index 1deb2ed751..e9e170885c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/archwood_sconce.json +++ b/src/generated/resources/data/ars_nouveau/recipe/archwood_sconce.json @@ -3,7 +3,7 @@ "category": "misc", "ingredients": [ { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { "item": "ars_nouveau:archwood_planks" diff --git a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_1.json b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_1.json index d48d4de812..11dca1713d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_1.json @@ -10,7 +10,7 @@ "item": "minecraft:spider_eye" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_2.json b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_2.json index 85b12fb248..c833edc33f 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_2.json @@ -13,7 +13,7 @@ "item": "minecraft:spider_eye" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_3.json b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_3.json index 940a6af84d..61d6ba8e94 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_3.json @@ -16,7 +16,7 @@ "item": "minecraft:fermented_spider_eye" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_4.json b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_4.json index ef93be8397..936d363ec3 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_4.json @@ -16,10 +16,10 @@ "item": "minecraft:fermented_spider_eye" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_5.json b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_5.json index 9be5d7ff07..9e7959a811 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_5.json +++ b/src/generated/resources/data/ars_nouveau/recipe/bane_of_arthropods_5.json @@ -16,10 +16,10 @@ "item": "minecraft:fermented_spider_eye" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/basic_spell_turret.json b/src/generated/resources/data/ars_nouveau/recipe/basic_spell_turret.json index dcbd6355e0..225949ba22 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/basic_spell_turret.json +++ b/src/generated/resources/data/ars_nouveau/recipe/basic_spell_turret.json @@ -3,7 +3,7 @@ "category": "misc", "key": { "x": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, "y": { "tag": "c:ingots/gold" diff --git a/src/generated/resources/data/ars_nouveau/recipe/blast_protection_1.json b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_1.json index df607c4e78..529db244b7 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/blast_protection_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_1.json @@ -10,7 +10,7 @@ "tag": "c:storage_blocks/iron" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/blast_protection_2.json b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_2.json index 10a6493718..9f086e0110 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/blast_protection_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_2.json @@ -10,7 +10,7 @@ "tag": "c:storage_blocks/iron" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/blast_protection_3.json b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_3.json index 754d643198..8954d25538 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/blast_protection_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_3.json @@ -10,10 +10,10 @@ "tag": "c:gems/diamond" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:obsidians" diff --git a/src/generated/resources/data/ars_nouveau/recipe/blast_protection_4.json b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_4.json index c78ef4d481..5b42b40231 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/blast_protection_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/blast_protection_4.json @@ -16,10 +16,10 @@ "tag": "c:gems/diamond" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/gold" diff --git a/src/generated/resources/data/ars_nouveau/recipe/conjuration_essence.json b/src/generated/resources/data/ars_nouveau/recipe/conjuration_essence.json index b102536934..8be70c68c9 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/conjuration_essence.json +++ b/src/generated/resources/data/ars_nouveau/recipe/conjuration_essence.json @@ -1,7 +1,7 @@ { "type": "ars_nouveau:imbuement", "input": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, "output": { "count": 1, diff --git a/src/generated/resources/data/ars_nouveau/recipe/depth_strider_1.json b/src/generated/resources/data/ars_nouveau/recipe/depth_strider_1.json index d8310895ac..b0d3179983 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/depth_strider_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/depth_strider_1.json @@ -10,10 +10,10 @@ "item": "ars_nouveau:water_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 3000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/depth_strider_2.json b/src/generated/resources/data/ars_nouveau/recipe/depth_strider_2.json index ba40d37bcd..0a224a7080 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/depth_strider_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/depth_strider_2.json @@ -10,10 +10,10 @@ "item": "ars_nouveau:water_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "item": "minecraft:prismarine_shard" diff --git a/src/generated/resources/data/ars_nouveau/recipe/depth_strider_3.json b/src/generated/resources/data/ars_nouveau/recipe/depth_strider_3.json index c6ce234b1b..bf28967db5 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/depth_strider_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/depth_strider_3.json @@ -16,13 +16,13 @@ "item": "ars_nouveau:water_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "item": "minecraft:nautilus_shell" diff --git a/src/generated/resources/data/ars_nouveau/recipe/dominion_wand.json b/src/generated/resources/data/ars_nouveau/recipe/dominion_wand.json index da65a120a1..ad363eb009 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/dominion_wand.json +++ b/src/generated/resources/data/ars_nouveau/recipe/dominion_wand.json @@ -3,10 +3,10 @@ "keepNbtOfReagent": false, "pedestalItems": [ { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { "tag": "c:ingots/gold" diff --git a/src/generated/resources/data/ars_nouveau/recipe/drygmy_charm.json b/src/generated/resources/data/ars_nouveau/recipe/drygmy_charm.json index 4d3715f696..4f9384b3a3 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/drygmy_charm.json +++ b/src/generated/resources/data/ars_nouveau/recipe/drygmy_charm.json @@ -18,13 +18,13 @@ "tag": "c:seeds" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } ], "reagent": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/dull_trinket.json b/src/generated/resources/data/ars_nouveau/recipe/dull_trinket.json index 539e622d2d..ae55966deb 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/dull_trinket.json +++ b/src/generated/resources/data/ars_nouveau/recipe/dull_trinket.json @@ -6,7 +6,7 @@ "tag": "c:nuggets/iron" }, "y": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } }, "pattern": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/earth_essence.json b/src/generated/resources/data/ars_nouveau/recipe/earth_essence.json index dfa380143f..380c36b233 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/earth_essence.json +++ b/src/generated/resources/data/ars_nouveau/recipe/earth_essence.json @@ -1,7 +1,7 @@ { "type": "ars_nouveau:imbuement", "input": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, "output": { "count": 1, diff --git a/src/generated/resources/data/ars_nouveau/recipe/efficiency_1.json b/src/generated/resources/data/ars_nouveau/recipe/efficiency_1.json index 335fc3bbb7..dbc53e9f20 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/efficiency_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/efficiency_1.json @@ -10,10 +10,10 @@ "item": "minecraft:iron_pickaxe" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/efficiency_2.json b/src/generated/resources/data/ars_nouveau/recipe/efficiency_2.json index ed81b74aba..679b37c559 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/efficiency_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/efficiency_2.json @@ -10,10 +10,10 @@ "item": "minecraft:golden_pickaxe" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipe/efficiency_3.json b/src/generated/resources/data/ars_nouveau/recipe/efficiency_3.json index a9c0e55cf7..5ec1e8a504 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/efficiency_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/efficiency_3.json @@ -13,13 +13,13 @@ "item": "minecraft:golden_pickaxe" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:obsidians" diff --git a/src/generated/resources/data/ars_nouveau/recipe/efficiency_4.json b/src/generated/resources/data/ars_nouveau/recipe/efficiency_4.json index 81fb4dd847..598e0d84bf 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/efficiency_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/efficiency_4.json @@ -16,10 +16,10 @@ "item": "minecraft:iron_shovel" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:obsidians" diff --git a/src/generated/resources/data/ars_nouveau/recipe/efficiency_5.json b/src/generated/resources/data/ars_nouveau/recipe/efficiency_5.json index 999830099c..e6dab260bf 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/efficiency_5.json +++ b/src/generated/resources/data/ars_nouveau/recipe/efficiency_5.json @@ -16,10 +16,10 @@ "item": "minecraft:diamond_shovel" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/enchanters_mirror.json b/src/generated/resources/data/ars_nouveau/recipe/enchanters_mirror.json index adf316f1bc..4eb1c3464a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/enchanters_mirror.json +++ b/src/generated/resources/data/ars_nouveau/recipe/enchanters_mirror.json @@ -15,10 +15,10 @@ "item": "ars_nouveau:manipulation_essence" }, { - "tag": "neoforge:logs/archwood" + "tag": "c:logs/archwood" }, { - "tag": "neoforge:logs/archwood" + "tag": "c:logs/archwood" }, { "tag": "c:ingots/gold" @@ -28,7 +28,7 @@ } ], "reagent": { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, "result": { "count": 1, diff --git a/src/generated/resources/data/ars_nouveau/recipe/enchanters_shield.json b/src/generated/resources/data/ars_nouveau/recipe/enchanters_shield.json index a68540f6ab..195ed2f83b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/enchanters_shield.json +++ b/src/generated/resources/data/ars_nouveau/recipe/enchanters_shield.json @@ -9,10 +9,10 @@ "tag": "c:storage_blocks/gold" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "reagent": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/enchanters_sword.json b/src/generated/resources/data/ars_nouveau/recipe/enchanters_sword.json index 9223e896ce..1c81848d0b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/enchanters_sword.json +++ b/src/generated/resources/data/ars_nouveau/recipe/enchanters_sword.json @@ -12,10 +12,10 @@ "tag": "c:storage_blocks/gold" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "reagent": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_1.json b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_1.json index f32b67934a..ba977481ac 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_1.json @@ -10,10 +10,10 @@ "tag": "c:slimeballs" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_2.json b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_2.json index 6c55e07a24..8bb6087df3 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_2.json @@ -13,10 +13,10 @@ "tag": "c:slimeballs" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_3.json b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_3.json index 8a5307e318..b64b7a6a2d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_3.json @@ -16,10 +16,10 @@ "tag": "c:slimeballs" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_4.json b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_4.json index bb052c9167..487a41aa11 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_4.json @@ -16,10 +16,10 @@ "item": "ars_nouveau:air_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_1.json b/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_1.json index 40c63abb33..75bd7bc75e 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_1.json @@ -7,10 +7,10 @@ "item": "ars_nouveau:fire_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_2.json b/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_2.json index dc218e39d1..36f4486dcf 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_aspect_2.json @@ -10,10 +10,10 @@ "item": "ars_nouveau:fire_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_essence.json b/src/generated/resources/data/ars_nouveau/recipe/fire_essence.json index f94ebcf017..31ba3e92e3 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fire_essence.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_essence.json @@ -1,7 +1,7 @@ { "type": "ars_nouveau:imbuement", "input": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, "output": { "count": 1, diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_1.json b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_1.json index 72468dcc97..5b65d193a8 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_1.json @@ -10,10 +10,10 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_2.json b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_2.json index 3df0750e0a..b8be66e610 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_2.json @@ -13,10 +13,10 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_3.json b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_3.json index ae5761093e..39ba86c117 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_3.json @@ -13,13 +13,13 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:rods/blaze" diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_4.json b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_4.json index e7375e8fc5..94095dedcf 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_4.json @@ -16,10 +16,10 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:rods/blaze" diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_5.json b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_5.json index 506289f004..e5fd012b20 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fire_protection_5.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fire_protection_5.json @@ -22,7 +22,7 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:rods/blaze" diff --git a/src/generated/resources/data/ars_nouveau/recipe/fortune_1.json b/src/generated/resources/data/ars_nouveau/recipe/fortune_1.json index 780a23a34b..f9cc5ae714 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fortune_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fortune_1.json @@ -10,22 +10,22 @@ "tag": "c:gems/diamond" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 6000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/fortune_2.json b/src/generated/resources/data/ars_nouveau/recipe/fortune_2.json index 0523375f1d..da2b504562 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fortune_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fortune_2.json @@ -22,10 +22,10 @@ "tag": "c:gems/diamond" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 8000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/fortune_3.json b/src/generated/resources/data/ars_nouveau/recipe/fortune_3.json index ba275e9358..2dabc51c64 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/fortune_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/fortune_3.json @@ -22,10 +22,10 @@ "tag": "c:storage_blocks/lapis" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 9000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/knockback_1.json b/src/generated/resources/data/ars_nouveau/recipe/knockback_1.json index c8f2ee60b5..4389fed418 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/knockback_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/knockback_1.json @@ -10,10 +10,10 @@ "item": "ars_nouveau:air_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/knockback_2.json b/src/generated/resources/data/ars_nouveau/recipe/knockback_2.json index 1ff81b1ed6..bbc8af4bc7 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/knockback_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/knockback_2.json @@ -13,10 +13,10 @@ "item": "ars_nouveau:air_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 4000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/looting_1.json b/src/generated/resources/data/ars_nouveau/recipe/looting_1.json index 520dafcd15..7d2f6e975b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/looting_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/looting_1.json @@ -10,22 +10,22 @@ "tag": "c:gems/emerald" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 6000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/looting_2.json b/src/generated/resources/data/ars_nouveau/recipe/looting_2.json index fbfb86b9c3..8be8bce763 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/looting_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/looting_2.json @@ -22,10 +22,10 @@ "tag": "c:gems/emerald" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 8000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/looting_3.json b/src/generated/resources/data/ars_nouveau/recipe/looting_3.json index bc487c2c41..700335afd2 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/looting_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/looting_3.json @@ -22,10 +22,10 @@ "tag": "c:storage_blocks/lapis" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 9000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/magebloom_crop.json b/src/generated/resources/data/ars_nouveau/recipe/magebloom_crop.json index 0faa26f34e..18d0398151 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/magebloom_crop.json +++ b/src/generated/resources/data/ars_nouveau/recipe/magebloom_crop.json @@ -3,16 +3,16 @@ "keepNbtOfReagent": false, "pedestalItems": [ { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } ], "reagent": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/magelight_torch.json b/src/generated/resources/data/ars_nouveau/recipe/magelight_torch.json index 7a4979b7fb..9ddc70f01d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/magelight_torch.json +++ b/src/generated/resources/data/ars_nouveau/recipe/magelight_torch.json @@ -6,7 +6,7 @@ "tag": "c:nuggets/gold" }, "y": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } }, "pattern": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/mana_boost_1.json b/src/generated/resources/data/ars_nouveau/recipe/mana_boost_1.json index 47de33321e..feab1f66ed 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/mana_boost_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mana_boost_1.json @@ -7,16 +7,16 @@ "item": "ars_nouveau:sourceberry_bush" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/mana_boost_2.json b/src/generated/resources/data/ars_nouveau/recipe/mana_boost_2.json index 5d7fa0a750..bea34da1a4 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/mana_boost_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mana_boost_2.json @@ -10,16 +10,16 @@ "tag": "c:gems/diamond" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/mana_boost_3.json b/src/generated/resources/data/ars_nouveau/recipe/mana_boost_3.json index 3ff0e92d2a..796ced0afd 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/mana_boost_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mana_boost_3.json @@ -13,16 +13,16 @@ "tag": "c:gems/diamond" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/mana_regen_1.json b/src/generated/resources/data/ars_nouveau/recipe/mana_regen_1.json index 5c03297a35..77f52fd993 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/mana_regen_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mana_regen_1.json @@ -10,10 +10,10 @@ "item": "ars_nouveau:sourceberry_bush" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/mana_regen_2.json b/src/generated/resources/data/ars_nouveau/recipe/mana_regen_2.json index 2e1240983c..9de79425e0 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/mana_regen_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mana_regen_2.json @@ -16,10 +16,10 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/mana_regen_3.json b/src/generated/resources/data/ars_nouveau/recipe/mana_regen_3.json index 688d870722..d48552c1df 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/mana_regen_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mana_regen_3.json @@ -19,10 +19,10 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence.json b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence.json index b6576d99c9..b408f46eec 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence.json +++ b/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence.json @@ -1,7 +1,7 @@ { "type": "ars_nouveau:imbuement", "input": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, "output": { "count": 1, diff --git a/src/generated/resources/data/ars_nouveau/recipe/multishot_1.json b/src/generated/resources/data/ars_nouveau/recipe/multishot_1.json index 0ca8157600..ceabac45f2 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/multishot_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/multishot_1.json @@ -13,19 +13,19 @@ "item": "ars_nouveau:manipulation_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 9000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/mundane_belt.json b/src/generated/resources/data/ars_nouveau/recipe/mundane_belt.json index 6f45b181cd..c79ec23c29 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/mundane_belt.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mundane_belt.json @@ -6,7 +6,7 @@ "tag": "c:leathers" }, "y": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } }, "pattern": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/mycelial_sourcelink.json b/src/generated/resources/data/ars_nouveau/recipe/mycelial_sourcelink.json index 7edf8278c8..c8ab3a8f33 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/mycelial_sourcelink.json +++ b/src/generated/resources/data/ars_nouveau/recipe/mycelial_sourcelink.json @@ -9,7 +9,7 @@ "item": "minecraft:mushroom_stew" }, "s": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } }, "pattern": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/piercing_1.json b/src/generated/resources/data/ars_nouveau/recipe/piercing_1.json index 08c7f8517d..6da502afc8 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/piercing_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/piercing_1.json @@ -7,10 +7,10 @@ "item": "ars_nouveau:manipulation_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/piercing_2.json b/src/generated/resources/data/ars_nouveau/recipe/piercing_2.json index 1874758554..79be3b47f2 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/piercing_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/piercing_2.json @@ -10,10 +10,10 @@ "item": "ars_nouveau:manipulation_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/piercing_3.json b/src/generated/resources/data/ars_nouveau/recipe/piercing_3.json index 484193dbed..73e0c22297 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/piercing_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/piercing_3.json @@ -13,10 +13,10 @@ "item": "ars_nouveau:manipulation_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/piercing_4.json b/src/generated/resources/data/ars_nouveau/recipe/piercing_4.json index 312ea4f0c2..be0aad98a4 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/piercing_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/piercing_4.json @@ -16,10 +16,10 @@ "item": "ars_nouveau:manipulation_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/potion_flask.json b/src/generated/resources/data/ars_nouveau/recipe/potion_flask.json index 6817c7dafa..47730dade4 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/potion_flask.json +++ b/src/generated/resources/data/ars_nouveau/recipe/potion_flask.json @@ -9,7 +9,7 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/gold" diff --git a/src/generated/resources/data/ars_nouveau/recipe/power_1.json b/src/generated/resources/data/ars_nouveau/recipe/power_1.json index 621869cc88..b8edbc1a54 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/power_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/power_1.json @@ -10,7 +10,7 @@ "item": "ars_nouveau:air_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/power_2.json b/src/generated/resources/data/ars_nouveau/recipe/power_2.json index 050c66726c..9b0e1aa128 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/power_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/power_2.json @@ -13,10 +13,10 @@ "item": "ars_nouveau:air_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipe/power_3.json b/src/generated/resources/data/ars_nouveau/recipe/power_3.json index 0fe1df883a..88250374c7 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/power_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/power_3.json @@ -16,10 +16,10 @@ "item": "ars_nouveau:air_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/power_4.json b/src/generated/resources/data/ars_nouveau/recipe/power_4.json index eff02db24a..ef69ea247f 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/power_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/power_4.json @@ -19,7 +19,7 @@ "item": "ars_nouveau:air_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/power_5.json b/src/generated/resources/data/ars_nouveau/recipe/power_5.json index c0e8b4b1ad..590816ba13 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/power_5.json +++ b/src/generated/resources/data/ars_nouveau/recipe/power_5.json @@ -22,7 +22,7 @@ "item": "ars_nouveau:air_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_1.json b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_1.json index 597b2adfb2..73d9c13fd6 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_1.json @@ -13,10 +13,10 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_2.json b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_2.json index 874819c728..0092d19f9d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_2.json @@ -16,10 +16,10 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 3500 diff --git a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_3.json b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_3.json index 9b302ab522..404f9235f9 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_3.json @@ -16,13 +16,13 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 5000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_4.json b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_4.json index a40e71ded6..792c56df20 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_4.json @@ -19,10 +19,10 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 6500 diff --git a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_5.json b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_5.json index c371ccc053..ea407b6c35 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_5.json +++ b/src/generated/resources/data/ars_nouveau/recipe/projectile_protection_5.json @@ -25,7 +25,7 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 8000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/protection_1.json b/src/generated/resources/data/ars_nouveau/recipe/protection_1.json index 1d914f54c0..c40a8b0920 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/protection_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/protection_1.json @@ -13,10 +13,10 @@ "tag": "c:storage_blocks/lapis" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/protection_2.json b/src/generated/resources/data/ars_nouveau/recipe/protection_2.json index 0e875350fb..e11d23e50a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/protection_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/protection_2.json @@ -13,10 +13,10 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/protection_3.json b/src/generated/resources/data/ars_nouveau/recipe/protection_3.json index a09444e40b..cf7d33e4c6 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/protection_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/protection_3.json @@ -13,13 +13,13 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/protection_4.json b/src/generated/resources/data/ars_nouveau/recipe/protection_4.json index 1a210c8020..bbd501bc53 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/protection_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/protection_4.json @@ -16,10 +16,10 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/protection_5.json b/src/generated/resources/data/ars_nouveau/recipe/protection_5.json index 7ba84bb80a..b28286ba48 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/protection_5.json +++ b/src/generated/resources/data/ars_nouveau/recipe/protection_5.json @@ -22,7 +22,7 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/diamond" diff --git a/src/generated/resources/data/ars_nouveau/recipe/punch_1.json b/src/generated/resources/data/ars_nouveau/recipe/punch_1.json index e9fd011ce5..5fc6889c9a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/punch_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/punch_1.json @@ -10,10 +10,10 @@ "item": "ars_nouveau:air_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/punch_2.json b/src/generated/resources/data/ars_nouveau/recipe/punch_2.json index 10f8450938..e8fc0807fa 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/punch_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/punch_2.json @@ -13,10 +13,10 @@ "item": "ars_nouveau:air_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 4000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/quartz_block_to_quartz.json b/src/generated/resources/data/ars_nouveau/recipe/quartz_block_to_quartz.json index b706afe7c1..b853651b86 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/quartz_block_to_quartz.json +++ b/src/generated/resources/data/ars_nouveau/recipe/quartz_block_to_quartz.json @@ -1,7 +1,7 @@ { "type": "ars_nouveau:crush", "input": { - "tag": "minecraft:storage_blocks/quartz" + "tag": "c:storage_blocks/quartz" }, "output": [ { diff --git a/src/generated/resources/data/ars_nouveau/recipe/quick_charge_1.json b/src/generated/resources/data/ars_nouveau/recipe/quick_charge_1.json index 31b52be852..46e5a3a83c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/quick_charge_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/quick_charge_1.json @@ -10,10 +10,10 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 2000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/quick_charge_2.json b/src/generated/resources/data/ars_nouveau/recipe/quick_charge_2.json index 78b844adc5..4700f10982 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/quick_charge_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/quick_charge_2.json @@ -13,10 +13,10 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 4000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/quick_charge_3.json b/src/generated/resources/data/ars_nouveau/recipe/quick_charge_3.json index dc267d7d14..2c65a3a0ba 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/quick_charge_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/quick_charge_3.json @@ -13,13 +13,13 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 6000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/reactive.json b/src/generated/resources/data/ars_nouveau/recipe/reactive.json index fabdbe537b..9acadcc905 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/reactive.json +++ b/src/generated/resources/data/ars_nouveau/recipe/reactive.json @@ -8,7 +8,7 @@ "tag": "c:storage_blocks/lapis" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 3000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/redstone_relay.json b/src/generated/resources/data/ars_nouveau/recipe/redstone_relay.json index 57095c53e8..0393545be4 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/redstone_relay.json +++ b/src/generated/resources/data/ars_nouveau/recipe/redstone_relay.json @@ -3,7 +3,7 @@ "category": "misc", "key": { "M": { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, "g": { "tag": "c:ingots/gold" diff --git a/src/generated/resources/data/ars_nouveau/recipe/relay.json b/src/generated/resources/data/ars_nouveau/recipe/relay.json index 360e13bad1..329b291d28 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/relay.json +++ b/src/generated/resources/data/ars_nouveau/recipe/relay.json @@ -3,7 +3,7 @@ "category": "misc", "key": { "M": { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, "g": { "tag": "c:ingots/gold" diff --git a/src/generated/resources/data/ars_nouveau/recipe/repository.json b/src/generated/resources/data/ars_nouveau/recipe/repository.json index 04c1490ac2..e470abe734 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/repository.json +++ b/src/generated/resources/data/ars_nouveau/recipe/repository.json @@ -3,7 +3,7 @@ "category": "misc", "key": { "x": { - "tag": "neoforge:logs/archwood" + "tag": "c:logs/archwood" }, "y": { "tag": "c:nuggets/gold" diff --git a/src/generated/resources/data/ars_nouveau/recipe/respiration_1.json b/src/generated/resources/data/ars_nouveau/recipe/respiration_1.json index 724d8c6900..18791a4217 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/respiration_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/respiration_1.json @@ -7,10 +7,10 @@ "item": "ars_nouveau:water_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 3000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/respiration_2.json b/src/generated/resources/data/ars_nouveau/recipe/respiration_2.json index ebccb7e5e6..1d489e67a7 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/respiration_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/respiration_2.json @@ -16,16 +16,16 @@ "item": "ars_nouveau:water_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 6000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/respiration_3.json b/src/generated/resources/data/ars_nouveau/recipe/respiration_3.json index 9632c4ae87..5fd6cfdfe3 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/respiration_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/respiration_3.json @@ -22,10 +22,10 @@ "item": "ars_nouveau:water_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "sourceCost": 9000 diff --git a/src/generated/resources/data/ars_nouveau/recipe/ring_of_greater_discount.json b/src/generated/resources/data/ars_nouveau/recipe/ring_of_greater_discount.json index 00c2c7d29d..dafc7ae701 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/ring_of_greater_discount.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ring_of_greater_discount.json @@ -21,10 +21,10 @@ "tag": "c:rods/blaze" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } ], "reagent": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/ring_of_lesser_discount.json b/src/generated/resources/data/ars_nouveau/recipe/ring_of_lesser_discount.json index d5e93f62de..78c185b964 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/ring_of_lesser_discount.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ring_of_lesser_discount.json @@ -21,10 +21,10 @@ "tag": "c:ender_pearls" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } ], "reagent": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/ring_of_potential.json b/src/generated/resources/data/ars_nouveau/recipe/ring_of_potential.json index c41dfefde0..eec51166dc 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/ring_of_potential.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ring_of_potential.json @@ -6,7 +6,7 @@ "tag": "c:nuggets/iron" }, "y": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } }, "pattern": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/ritual_awakening.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_awakening.json index c36ba75f44..db68f92631 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/ritual_awakening.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_awakening.json @@ -18,16 +18,16 @@ "item": "ars_nouveau:purple_archwood_sapling" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } ], "result": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/ritual_binding.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_binding.json index ef2180996f..eebf3a787c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/ritual_binding.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_binding.json @@ -12,13 +12,13 @@ "item": "minecraft:ender_pearl" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } ], "result": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/ritual_brazier.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_brazier.json index 1b36ff9ec9..45508a0e5e 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/ritual_brazier.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_brazier.json @@ -6,7 +6,7 @@ "item": "ars_nouveau:arcane_pedestal" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:ingots/gold" diff --git a/src/generated/resources/data/ars_nouveau/recipe/ritual_cloudshaping.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_cloudshaping.json index 6b74881927..6f88a566a6 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/ritual_cloudshaping.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_cloudshaping.json @@ -9,7 +9,7 @@ "item": "minecraft:feather" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "result": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/ritual_scrying.json b/src/generated/resources/data/ars_nouveau/recipe/ritual_scrying.json index 05c0082053..c2e0007e52 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/ritual_scrying.json +++ b/src/generated/resources/data/ars_nouveau/recipe/ritual_scrying.json @@ -18,7 +18,7 @@ "item": "minecraft:glowstone" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "result": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/sconce.json b/src/generated/resources/data/ars_nouveau/recipe/sconce.json index 507b2b1f6e..6f785ebe25 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sconce.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sconce.json @@ -3,7 +3,7 @@ "category": "misc", "ingredients": [ { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { "tag": "c:nuggets/gold" diff --git a/src/generated/resources/data/ars_nouveau/recipe/scribes_table.json b/src/generated/resources/data/ars_nouveau/recipe/scribes_table.json index 25d5e5cca8..0e92312302 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scribes_table.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scribes_table.json @@ -9,7 +9,7 @@ "tag": "c:nuggets/gold" }, "z": { - "tag": "neoforge:logs/archwood" + "tag": "c:logs/archwood" } }, "pattern": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/scryers_crystal.json b/src/generated/resources/data/ars_nouveau/recipe/scryers_crystal.json index 0df54cbb11..2ca5a54033 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scryers_crystal.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scryers_crystal.json @@ -6,7 +6,7 @@ "item": "minecraft:ender_eye" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } ], "result": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/scryers_oculus.json b/src/generated/resources/data/ars_nouveau/recipe/scryers_oculus.json index f0eab2f320..35beac0207 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scryers_oculus.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scryers_oculus.json @@ -9,7 +9,7 @@ "item": "minecraft:spyglass" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:gems/diamond" diff --git a/src/generated/resources/data/ars_nouveau/recipe/sharpness_1.json b/src/generated/resources/data/ars_nouveau/recipe/sharpness_1.json index 4097d8e6f0..cf2e445b59 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sharpness_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sharpness_1.json @@ -10,7 +10,7 @@ "item": "minecraft:quartz_block" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/sharpness_2.json b/src/generated/resources/data/ars_nouveau/recipe/sharpness_2.json index 5ae5350b05..bf64a28177 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sharpness_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sharpness_2.json @@ -10,10 +10,10 @@ "item": "minecraft:quartz_block" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/silk_touch_1.json b/src/generated/resources/data/ars_nouveau/recipe/silk_touch_1.json index 12482b42ed..e9c35e26fc 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/silk_touch_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/silk_touch_1.json @@ -16,10 +16,10 @@ "tag": "c:gems/diamond" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/smite_1.json b/src/generated/resources/data/ars_nouveau/recipe/smite_1.json index b13efd8f79..ce47125d32 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/smite_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smite_1.json @@ -10,7 +10,7 @@ "item": "minecraft:bone_block" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/smite_2.json b/src/generated/resources/data/ars_nouveau/recipe/smite_2.json index b388d6cb9f..726d7e79f2 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/smite_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smite_2.json @@ -13,7 +13,7 @@ "item": "minecraft:bone_block" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/smite_3.json b/src/generated/resources/data/ars_nouveau/recipe/smite_3.json index 36534fae0d..649c5a7591 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/smite_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smite_3.json @@ -16,7 +16,7 @@ "item": "minecraft:bone_block" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/smite_4.json b/src/generated/resources/data/ars_nouveau/recipe/smite_4.json index 22cd456a67..77a617cdbd 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/smite_4.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smite_4.json @@ -16,10 +16,10 @@ "item": "minecraft:bone_block" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/smite_5.json b/src/generated/resources/data/ars_nouveau/recipe/smite_5.json index 04491888b8..24b9c8900b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/smite_5.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smite_5.json @@ -16,10 +16,10 @@ "item": "minecraft:bone_block" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/source_gem_block.json b/src/generated/resources/data/ars_nouveau/recipe/source_gem_block.json index c766b6d48e..cb63b3880f 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/source_gem_block.json +++ b/src/generated/resources/data/ars_nouveau/recipe/source_gem_block.json @@ -3,7 +3,7 @@ "category": "misc", "key": { "x": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } }, "pattern": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/sourcestone.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone.json index 2eb6f7e89c..19686ddd71 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sourcestone.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone.json @@ -6,7 +6,7 @@ "tag": "c:stones" }, "y": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } }, "pattern": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/sourcestone_sconce.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_sconce.json index 3b8929da77..52bb6c91e2 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sourcestone_sconce.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_sconce.json @@ -3,7 +3,7 @@ "category": "misc", "ingredients": [ { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { "item": "ars_nouveau:sourcestone" diff --git a/src/generated/resources/data/ars_nouveau/recipe/spell_bow.json b/src/generated/resources/data/ars_nouveau/recipe/spell_bow.json index c78d0a0636..a72bb84261 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/spell_bow.json +++ b/src/generated/resources/data/ars_nouveau/recipe/spell_bow.json @@ -3,7 +3,7 @@ "keepNbtOfReagent": true, "pedestalItems": [ { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/gold" diff --git a/src/generated/resources/data/ars_nouveau/recipe/spell_crossbow.json b/src/generated/resources/data/ars_nouveau/recipe/spell_crossbow.json index 1097ed8bbf..80c3063ebc 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/spell_crossbow.json +++ b/src/generated/resources/data/ars_nouveau/recipe/spell_crossbow.json @@ -9,7 +9,7 @@ "item": "ars_nouveau:manipulation_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" } ], "reagent": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/spell_prism.json b/src/generated/resources/data/ars_nouveau/recipe/spell_prism.json index 7118f3d9ca..cb236599bd 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/spell_prism.json +++ b/src/generated/resources/data/ars_nouveau/recipe/spell_prism.json @@ -6,7 +6,7 @@ "tag": "c:ingots/gold" }, "n": { - "tag": "minecraft:storage_blocks/quartz" + "tag": "c:storage_blocks/quartz" }, "x": { "item": "ars_nouveau:archwood_planks" diff --git a/src/generated/resources/data/ars_nouveau/recipe/spell_turret.json b/src/generated/resources/data/ars_nouveau/recipe/spell_turret.json index 75a4ee015f..f33753d2c4 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/spell_turret.json +++ b/src/generated/resources/data/ars_nouveau/recipe/spell_turret.json @@ -3,7 +3,7 @@ "keepNbtOfReagent": false, "pedestalItems": [ { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:rods/blaze" diff --git a/src/generated/resources/data/ars_nouveau/recipe/summon_focus.json b/src/generated/resources/data/ars_nouveau/recipe/summon_focus.json index 3e7609d17e..6645f43517 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/summon_focus.json +++ b/src/generated/resources/data/ars_nouveau/recipe/summon_focus.json @@ -19,7 +19,7 @@ } ], "reagent": { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, "result": { "count": 1, diff --git a/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_1.json b/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_1.json index 76124f5f20..9ac63c7e62 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_1.json @@ -7,7 +7,7 @@ "item": "ars_nouveau:manipulation_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_2.json b/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_2.json index 5662aab48a..707b774a17 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_2.json @@ -10,10 +10,10 @@ "item": "ars_nouveau:manipulation_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_3.json b/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_3.json index 0d2cf14347..b006aebbed 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sweeping_edge_3.json @@ -13,10 +13,10 @@ "item": "ars_nouveau:manipulation_essence" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/thorns_1.json b/src/generated/resources/data/ars_nouveau/recipe/thorns_1.json index b59d4fee54..fa7f40e54b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thorns_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thorns_1.json @@ -7,7 +7,7 @@ "item": "ars_nouveau:wilden_spike" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/thorns_2.json b/src/generated/resources/data/ars_nouveau/recipe/thorns_2.json index c7c1097203..07f9f33051 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thorns_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thorns_2.json @@ -10,10 +10,10 @@ "item": "ars_nouveau:wilden_spike" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/thorns_3.json b/src/generated/resources/data/ars_nouveau/recipe/thorns_3.json index 40d003e390..800e73ecbf 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/thorns_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/thorns_3.json @@ -13,10 +13,10 @@ "item": "ars_nouveau:wilden_spike" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/unbreaking_1.json b/src/generated/resources/data/ars_nouveau/recipe/unbreaking_1.json index 024e1cb307..591449653a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/unbreaking_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/unbreaking_1.json @@ -10,7 +10,7 @@ "tag": "c:gems/diamond" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/unbreaking_2.json b/src/generated/resources/data/ars_nouveau/recipe/unbreaking_2.json index 82df1d7a91..5009a3847b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/unbreaking_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/unbreaking_2.json @@ -13,10 +13,10 @@ "tag": "c:gems/diamond" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/unbreaking_3.json b/src/generated/resources/data/ars_nouveau/recipe/unbreaking_3.json index 613146e4f9..4991201522 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/unbreaking_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/unbreaking_3.json @@ -16,10 +16,10 @@ "tag": "c:gems/diamond" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { - "tag": "neoforge:storage_blocks/source" + "tag": "c:storage_blocks/source" }, { "tag": "c:storage_blocks/lapis" diff --git a/src/generated/resources/data/ars_nouveau/recipe/vitalic_sourcelink.json b/src/generated/resources/data/ars_nouveau/recipe/vitalic_sourcelink.json index 6bbde35855..232bc53409 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/vitalic_sourcelink.json +++ b/src/generated/resources/data/ars_nouveau/recipe/vitalic_sourcelink.json @@ -9,7 +9,7 @@ "item": "minecraft:glistering_melon_slice" }, "s": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } }, "pattern": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/volcanic_sourcelink.json b/src/generated/resources/data/ars_nouveau/recipe/volcanic_sourcelink.json index 1ac681fbe3..6b2a746c1c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/volcanic_sourcelink.json +++ b/src/generated/resources/data/ars_nouveau/recipe/volcanic_sourcelink.json @@ -9,7 +9,7 @@ "item": "minecraft:lava_bucket" }, "s": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } }, "pattern": [ diff --git a/src/generated/resources/data/ars_nouveau/recipe/wand.json b/src/generated/resources/data/ars_nouveau/recipe/wand.json index 00b0457606..db0122888c 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/wand.json +++ b/src/generated/resources/data/ars_nouveau/recipe/wand.json @@ -3,16 +3,16 @@ "keepNbtOfReagent": false, "pedestalItems": [ { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { "tag": "c:ingots/gold" @@ -28,7 +28,7 @@ } ], "reagent": { - "tag": "neoforge:logs/archwood" + "tag": "c:logs/archwood" }, "result": { "count": 1, diff --git a/src/generated/resources/data/ars_nouveau/recipe/warp_scroll.json b/src/generated/resources/data/ars_nouveau/recipe/warp_scroll.json index e1c02fcda8..c6f61acc90 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/warp_scroll.json +++ b/src/generated/resources/data/ars_nouveau/recipe/warp_scroll.json @@ -18,16 +18,16 @@ "item": "ars_nouveau:blank_parchment" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" } ], "result": { diff --git a/src/generated/resources/data/ars_nouveau/recipe/water_essence.json b/src/generated/resources/data/ars_nouveau/recipe/water_essence.json index 741c834581..a2e32f8aa2 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/water_essence.json +++ b/src/generated/resources/data/ars_nouveau/recipe/water_essence.json @@ -1,7 +1,7 @@ { "type": "ars_nouveau:imbuement", "input": { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, "output": { "count": 1, diff --git a/src/generated/resources/data/ars_nouveau/recipe/whirlisprig_charm.json b/src/generated/resources/data/ars_nouveau/recipe/whirlisprig_charm.json index 8a838dd059..3fc395da7b 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/whirlisprig_charm.json +++ b/src/generated/resources/data/ars_nouveau/recipe/whirlisprig_charm.json @@ -3,7 +3,7 @@ "keepNbtOfReagent": false, "pedestalItems": [ { - "tag": "neoforge:gems/source" + "tag": "c:gems/source" }, { "item": "ars_nouveau:magebloom_crop" diff --git a/src/generated/resources/data/neoforge/tags/block/bushes.json b/src/generated/resources/data/c/tags/block/bushes.json similarity index 100% rename from src/generated/resources/data/neoforge/tags/block/bushes.json rename to src/generated/resources/data/c/tags/block/bushes.json diff --git a/src/generated/resources/data/neoforge/tags/item/gems/source.json b/src/generated/resources/data/c/tags/item/gems/source.json similarity index 100% rename from src/generated/resources/data/neoforge/tags/item/gems/source.json rename to src/generated/resources/data/c/tags/item/gems/source.json diff --git a/src/generated/resources/data/neoforge/tags/item/logs/archwood.json b/src/generated/resources/data/c/tags/item/logs/archwood.json similarity index 100% rename from src/generated/resources/data/neoforge/tags/item/logs/archwood.json rename to src/generated/resources/data/c/tags/item/logs/archwood.json diff --git a/src/generated/resources/data/neoforge/tags/item/storage_blocks/source.json b/src/generated/resources/data/c/tags/item/storage_blocks/source.json similarity index 100% rename from src/generated/resources/data/neoforge/tags/item/storage_blocks/source.json rename to src/generated/resources/data/c/tags/item/storage_blocks/source.json diff --git a/src/generated/resources/data/c/tags/damage_type/is_magic.json b/src/generated/resources/data/neoforge/tags/damage_type/is_magic.json similarity index 100% rename from src/generated/resources/data/c/tags/damage_type/is_magic.json rename to src/generated/resources/data/neoforge/tags/damage_type/is_magic.json diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/mana/IManaEquipment.java b/src/main/java/com/hollingsworth/arsnouveau/api/mana/IManaEquipment.java deleted file mode 100644 index e463656eb7..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/api/mana/IManaEquipment.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.hollingsworth.arsnouveau.api.mana; - -import net.minecraft.world.item.ItemStack; - - -//TODO split IManaBoost and IManaDiscount -public interface IManaEquipment extends IManaDiscountEquipment{ - - default int getMaxManaBoost(ItemStack i) { - return 0; - } - - default int getManaRegenBonus(ItemStack i) { - return 0; - } - -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IEffectResolvePerk.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IEffectResolvePerk.java index 78103f6a78..25fe5924a5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IEffectResolvePerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IEffectResolvePerk.java @@ -4,27 +4,9 @@ import com.hollingsworth.arsnouveau.api.event.SpellCastEvent; import com.hollingsworth.arsnouveau.api.event.SpellDamageEvent; import com.hollingsworth.arsnouveau.api.event.SpellResolveEvent; -import com.hollingsworth.arsnouveau.api.spell.AbstractEffect; -import com.hollingsworth.arsnouveau.api.spell.SpellContext; -import com.hollingsworth.arsnouveau.api.spell.SpellResolver; -import com.hollingsworth.arsnouveau.api.spell.SpellStats; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.HitResult; -import org.jetbrains.annotations.NotNull; public interface IEffectResolvePerk { - @Deprecated(forRemoval = true) - default void onPreResolve(HitResult rayTraceResult, Level world,@NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver, AbstractEffect effect, PerkInstance perkInstance){ - - } - - @Deprecated(forRemoval = true) - default void onPostResolve(HitResult rayTraceResult, Level world,@NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver, AbstractEffect effect, PerkInstance perkInstance){ - - } - default void onSpellCast(SpellCastEvent spellCastEvent, PerkInstance perkInstance){ } @@ -38,11 +20,9 @@ default void onSpellPostResolve(SpellResolveEvent.Post spellResolveEvent, PerkIn } default void onEffectPreResolve(EffectResolveEvent.Pre event, PerkInstance perkInstance){ - onPreResolve(event.rayTraceResult, event.world, event.shooter, event.spellStats, event.context, event.resolver, event.resolveEffect, perkInstance); } default void onEffectPostResolve(EffectResolveEvent.Post event, PerkInstance perkInstance){ - onPostResolve(event.rayTraceResult, event.world, event.shooter, event.spellStats, event.context, event.resolver, event.resolveEffect, perkInstance); } default void onPreSpellDamageEvent(final SpellDamageEvent.Pre event, PerkInstance perkInstance){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerk.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerk.java index c48e2d12db..01d26a6b56 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerk.java @@ -6,10 +6,13 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; 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.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import org.jetbrains.annotations.NotNull; /** @@ -17,16 +20,33 @@ */ public interface IPerk { - default Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue){ + /** + * @param modifiers The current modifiers, remember {@link ItemAttributeModifiers#withModifierAdded} creates a new instance, + * so you must assign it back to the original or chain the call in the return + * @param stack The stack with the perk + * @param slotValue The value of the slot the perk is in + * @param equipmentSlotGroup The slot where the attribute will be applied, seen in tooltips + * @return Modified modifiers + */ + default @NotNull ItemAttributeModifiers applyAttributeModifiers(ItemAttributeModifiers modifiers, ItemStack stack, int slotValue, EquipmentSlotGroup equipmentSlotGroup) { + return modifiers; + } + + /** + * Use {@link IPerk#applyAttributeModifiers} instead + */ + @Deprecated(forRemoval = true) + default Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { return new ImmutableMultimap.Builder().build(); } - default ImmutableMultimap.Builder attributeBuilder(){ + @Deprecated(forRemoval = true) + default ImmutableMultimap.Builder attributeBuilder() { return new ImmutableMultimap.Builder<>(); } - default PerkSlot minimumSlot(){ + default PerkSlot minimumSlot() { return PerkSlot.ONE; } @@ -36,8 +56,8 @@ default PerkSlot minimumSlot(){ * @param player The player applying the perk * @return Whether the perk is valid for the given slot, defaults to check slot level */ - default boolean validForSlot(PerkSlot slot, ItemStack stack, Player player){ - if(this.minimumSlot().value() > slot.value()){ + default boolean validForSlot(PerkSlot slot, ItemStack stack, Player player) { + if (this.minimumSlot().value() > slot.value()) { PortUtil.sendMessage(player, Component.translatable("ars_nouveau.perk.invalid_for_slot", this.minimumSlot().value())); return false; } @@ -50,11 +70,11 @@ default String getName() { return Component.translatable(getRegistryName().getNamespace() + ".thread_of", Component.translatable("item." + getRegistryName().getNamespace() + "." + getRegistryName().getPath()).getString()).getString(); } - default String getLangName(){ + default String getLangName() { return ""; } - default String getLangDescription(){ + default String getLangDescription() { return ""; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java index 0db526a9f1..acbab50570 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java @@ -22,6 +22,7 @@ import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.common.CommonHooks; import net.neoforged.neoforge.common.UsernameCache; import net.neoforged.neoforge.common.util.FakePlayer; import net.neoforged.neoforge.common.util.FakePlayerFactory; @@ -94,11 +95,6 @@ public static boolean destroyBlockSafely(Level world, BlockPos pos, boolean drop } - @Deprecated(forRemoval = true) - public static boolean destroyRespectsClaim(LivingEntity caster, Level world, BlockPos pos) { - return destroyRespectsClaim((Entity) caster, world, pos); - } - public static boolean destroyRespectsClaim(Entity caster, Level world, BlockPos pos) { Player playerEntity = caster instanceof Player ? (Player) caster : ANFakePlayer.getPlayer((ServerLevel) world); return !ANEventBus.post(new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), playerEntity)); @@ -323,7 +319,8 @@ public static boolean breakExtraBlock(ServerLevel world, BlockPos pos, ItemStack BlockState blockstate = world.getBlockState(pos); FakePlayer player; if (source != null) { - player = FakePlayerFactory.get(world, new GameProfile(source, UsernameCache.getLastKnownUsername(source))); + String lastKnownUsername = UsernameCache.getLastKnownUsername(source); + player = FakePlayerFactory.get(world, lastKnownUsername != null ? new GameProfile(source, lastKnownUsername) : ANFakePlayer.PROFILE); Player realPlayer = world.getPlayerByUUID(source); if (realPlayer != null) player.setPos(realPlayer.position()); } else player = FakePlayerFactory.getMinecraft(world); @@ -335,7 +332,7 @@ public static boolean breakExtraBlock(ServerLevel world, BlockPos pos, ItemStack } GameType type = player.getAbilities().instabuild ? GameType.CREATIVE : GameType.SURVIVAL; - boolean canceled = net.neoforged.neoforge.common.CommonHooks.fireBlockBreak(world, type, player, pos, blockstate).isCanceled(); + boolean canceled = CommonHooks.fireBlockBreak(world, type, player, pos, blockstate).isCanceled(); if (canceled) { return false; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/CuriosUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/CuriosUtil.java index 0dc562e8b8..647b798974 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/CuriosUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/CuriosUtil.java @@ -6,13 +6,16 @@ import net.neoforged.neoforge.items.IItemHandlerModifiable; import org.jetbrains.annotations.NotNull; import top.theillusivec4.curios.api.CuriosApi; +import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; import javax.annotation.Nullable; +import java.util.Optional; public class CuriosUtil { public static @Nullable IItemHandlerModifiable getAllWornItems(@NotNull LivingEntity living) { - return CuriosApi.getCuriosHelper().getEquippedCurios(living).orElse(null); + Optional curioInv = CuriosApi.getCuriosInventory(living); + return curioInv.map(ICuriosItemHandler::getEquippedCurios).orElse(null); } public static boolean hasItem(@Nullable LivingEntity entity, ItemStack stack) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/MobJarItemRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/MobJarItemRenderer.java index 573bf9e0fe..0554815c04 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/MobJarItemRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/MobJarItemRenderer.java @@ -11,11 +11,12 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.renderer.GeoItemRenderer; -public class MobJarItemRenderer extends FixedGeoItemRenderer { +public class MobJarItemRenderer extends GeoItemRenderer { private static MobJarTile jarTile; public MobJarItemRenderer() { - super(new GenericModel("mob_jar")); + super(new GenericModel<>("mob_jar")); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java index 58fc82974f..7ec5dfb395 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/ScryCasterRenderer.java @@ -12,24 +12,25 @@ import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.model.GeoModel; +import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.Color; -public class ScryCasterRenderer extends FixedGeoItemRenderer{ +public class ScryCasterRenderer extends GeoItemRenderer { public ScryCasterRenderer() { - super(new GeoModel() { + super(new GeoModel<>() { @Override public ResourceLocation getModelResource(ScryCaster wand) { - return ArsNouveau.prefix( "geo/enchanters_eye.geo.json"); + return ArsNouveau.prefix("geo/enchanters_eye.geo.json"); } @Override public ResourceLocation getTextureResource(ScryCaster wand) { - return ArsNouveau.prefix( "textures/item/enchanters_eye.png"); + return ArsNouveau.prefix("textures/item/enchanters_eye.png"); } @Override public ResourceLocation getAnimationResource(ScryCaster wand) { - return ArsNouveau.prefix( "animations/enchanters_eye.json"); + return ArsNouveau.prefix("animations/enchanters_eye.json"); } }); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java index 5d3accfaa6..2b799764c4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBookRenderer.java @@ -15,11 +15,12 @@ import net.minecraft.world.item.ItemDisplayContext; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.model.GeoModel; +import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.Color; import javax.annotation.Nullable; -public class SpellBookRenderer extends FixedGeoItemRenderer { +public class SpellBookRenderer extends GeoItemRenderer { public GeoModel closedModel; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java index 77e0309262..989f5ff98f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellBowRenderer.java @@ -19,11 +19,12 @@ import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.Color; -public class SpellBowRenderer extends FixedGeoItemRenderer { +public class SpellBowRenderer extends GeoItemRenderer { public SpellBowRenderer() { - super(new ANGeoModel("geo/spellbow.geo.json", "textures/item/spellbow.png", "animations/wand_animation.json")); + super(new ANGeoModel<>("geo/spellbow.geo.json", "textures/item/spellbow.png", "animations/wand_animation.json")); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java index 1db0c20f92..bd16ad352e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SpellCrossbowRenderer.java @@ -19,11 +19,12 @@ import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.Color; -public class SpellCrossbowRenderer extends FixedGeoItemRenderer { +public class SpellCrossbowRenderer extends GeoItemRenderer { public SpellCrossbowRenderer() { - super(new ANGeoModel("geo/spell_crossbow.geo.json", "textures/item/spell_crossbow.png", "animations/wand_animation.json")); + super(new ANGeoModel<>("geo/spell_crossbow.geo.json", "textures/item/spell_crossbow.png", "animations/wand_animation.json")); } @Override @@ -77,7 +78,7 @@ public void renderByItem(ItemStack itemStack, ItemDisplayContext transformType, int timeHeld = 72000 - Minecraft.getInstance().player.getUseItemRemainingTicks(); //These are used to calculate where the particles are going. We want them going into the laser, so we move the destination right, down, and forward a bit. if(timeHeld > 72000){ - right = right.scale(+0.1 - player.attackAnim); + right = right.scale(0.1 - player.attackAnim); forward = forward.scale(0.25f); down = down.scale(-0.1 - player.attackAnim); }else if(SpellCrossbow.isCharged(itemStack)){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java index 8b2ab70871..cc556abde8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/SwordRenderer.java @@ -11,24 +11,25 @@ import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.model.GeoModel; +import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.Color; -public class SwordRenderer extends FixedGeoItemRenderer { +public class SwordRenderer extends GeoItemRenderer { public SwordRenderer() { - super(new GeoModel() { + super(new GeoModel<>() { @Override public ResourceLocation getModelResource(EnchantersSword wand) { - return ArsNouveau.prefix( "geo/sword.geo.json"); + return ArsNouveau.prefix("geo/sword.geo.json"); } @Override public ResourceLocation getTextureResource(EnchantersSword wand) { - return ArsNouveau.prefix( "textures/item/enchanters_sword.png"); + return ArsNouveau.prefix("textures/item/enchanters_sword.png"); } @Override public ResourceLocation getAnimationResource(EnchantersSword wand) { - return ArsNouveau.prefix( "animations/sword.json"); + return ArsNouveau.prefix("animations/sword.json"); } }); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java index d229b2dc70..4685bbe714 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/item/WandRenderer.java @@ -9,9 +9,10 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.Color; -public class WandRenderer extends FixedGeoItemRenderer { +public class WandRenderer extends GeoItemRenderer { public WandRenderer() { super(new WandModel()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java index 11f776fb13..10e2838de2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java @@ -2,7 +2,6 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.client.IVariantColorProvider; -import com.hollingsworth.arsnouveau.api.mana.IManaEquipment; import com.hollingsworth.arsnouveau.api.perk.ITickablePerk; import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import com.hollingsworth.arsnouveau.api.perk.PerkInstance; @@ -31,6 +30,7 @@ import net.minecraft.world.level.Level; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animatable.client.GeoRenderProvider; @@ -43,7 +43,7 @@ import java.util.List; import java.util.function.Consumer; -public class AnimatedMagicArmor extends ArmorItem implements IManaEquipment, IDyeable, GeoItem, IVariantColorProvider { +public class AnimatedMagicArmor extends ArmorItem implements IDyeable, GeoItem, IVariantColorProvider { public GeoModel model; public AnimatedMagicArmor(Holder materialIn, ArmorItem.Type slot, Properties builder, GeoModel model) { @@ -72,7 +72,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar data) { } @Override - public void inventoryTick(ItemStack stack, Level world, Entity player, int slotId, boolean pIsSelected) { + public void inventoryTick(@NotNull ItemStack stack, @NotNull Level world, @NotNull Entity player, int slotId, boolean pIsSelected) { super.inventoryTick(stack, world, player, slotId, pIsSelected); if(slotId >= Inventory.INVENTORY_SIZE && slotId < Inventory.INVENTORY_SIZE + 4){ if (world.isClientSide()) @@ -92,21 +92,24 @@ public void inventoryTick(ItemStack stack, Level world, Entity player, int slotI } @Override - public ItemAttributeModifiers getDefaultAttributeModifiers(ItemStack stack) { + public @NotNull ItemAttributeModifiers getDefaultAttributeModifiers(@NotNull ItemStack stack) { var modifiers = super.getDefaultAttributeModifiers(stack); var perkHolder = PerkUtil.getPerkHolder(stack); - if(perkHolder == null) - return modifiers; - modifiers.withModifierAdded(PerkAttributes.MAX_MANA, new AttributeModifier(ArsNouveau.prefix("max_mana_armor"), 30 * (perkHolder.getTier() + 1), AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.bySlot(this.type.getSlot())); + if (perkHolder != null) { - modifiers.withModifierAdded(PerkAttributes.MANA_REGEN_BONUS, new AttributeModifier(ArsNouveau.prefix("mana_regen_armor"), perkHolder.getTier() + 1, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.bySlot(this.type.getSlot())); + for (PerkInstance instance : perkHolder.getPerkInstances(stack)) { + modifiers = instance.getPerk().applyAttributeModifiers(modifiers, stack, instance.getSlot().value(), EquipmentSlotGroup.bySlot(this.type.getSlot())); + } + modifiers = modifiers.withModifierAdded(PerkAttributes.MAX_MANA, new AttributeModifier(ArsNouveau.prefix("max_mana_armor"), 30 * (perkHolder.getTier() + 1), AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.bySlot(this.type.getSlot())); + modifiers = modifiers.withModifierAdded(PerkAttributes.MANA_REGEN_BONUS, new AttributeModifier(ArsNouveau.prefix("mana_regen_armor"), perkHolder.getTier() + 1, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.bySlot(this.type.getSlot())); + } return modifiers; } @Override @OnlyIn(Dist.CLIENT) - public void appendHoverText(ItemStack stack, TooltipContext world, List tooltip, TooltipFlag flag) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext world, @NotNull List tooltip, @NotNull TooltipFlag flag) { super.appendHoverText(stack, world, tooltip, flag); var data = stack.get(DataComponentRegistry.ARMOR_PERKS); if (data != null) { @@ -125,7 +128,7 @@ public void onDye(ItemStack stack, DyeColor dyeColor) { } @Override - public boolean makesPiglinsNeutral(ItemStack stack, LivingEntity wearer) { + public boolean makesPiglinsNeutral(@NotNull ItemStack stack, @NotNull LivingEntity wearer) { return true; } @@ -160,7 +163,7 @@ public GeoModel getArmorModel() { * Needed to avoid file not found errors since Geckolib doesn't redirect to the correct texture */ @Override - public @Nullable ResourceLocation getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, ArmorMaterial.Layer layer, boolean innerModel) { + public @Nullable ResourceLocation getArmorTexture(@NotNull ItemStack stack, @NotNull Entity entity, @NotNull EquipmentSlot slot, ArmorMaterial.@NotNull Layer layer, boolean innerModel) { GenericModel genericModel = (GenericModel) model; return ArsNouveau.prefix( "textures/" + genericModel.textPathRoot + "/" + genericModel.name + "_" + this.getColor(stack) + ".png"); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ArchwoodChest.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ArchwoodChest.java index abeb3dfb63..481216f481 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ArchwoodChest.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ArchwoodChest.java @@ -17,6 +17,8 @@ import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; + import java.util.function.Consumer; public class ArchwoodChest extends ChestBlock { @@ -25,7 +27,7 @@ public ArchwoodChest() { } @Override - public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) { return new ArchwoodChestTile(pos, state); } @@ -36,18 +38,18 @@ public Item(Block block, net.minecraft.world.item.Item.Properties props) { } @Override - public void initializeClient(Consumer consumer) { + public void initializeClient(@NotNull Consumer consumer) { super.initializeClient(consumer); consumer.accept(new IClientItemExtensions() { @Override - public BlockEntityWithoutLevelRenderer getCustomRenderer() { + public @NotNull BlockEntityWithoutLevelRenderer getCustomRenderer() { Minecraft mc = Minecraft.getInstance(); return new BlockEntityWithoutLevelRenderer(mc.getBlockEntityRenderDispatcher(), mc.getEntityModels()) { private final BlockEntity tile = new ArchwoodChestTile(BlockPos.ZERO, getBlock().defaultBlockState()); @Override - public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack pose, MultiBufferSource buffer, int x, int y) { + public void renderByItem(@NotNull ItemStack stack, @NotNull ItemDisplayContext transformType, @NotNull PoseStack pose, @NotNull MultiBufferSource buffer, int x, int y) { mc.getBlockEntityRenderDispatcher().renderItem(tile, pose, buffer, x, y); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java index a1d88349f8..d392839ebd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java @@ -66,8 +66,8 @@ public BasicSpellTurret() { } @Override - public void tick(BlockState state, ServerLevel worldIn, BlockPos pos, RandomSource rand) { - if(worldIn.getBlockEntity(pos) instanceof BasicSpellTurretTile tile){ + public void tick(@NotNull BlockState state, ServerLevel worldIn, @NotNull BlockPos pos, @NotNull RandomSource rand) { + if (worldIn.getBlockEntity(pos) instanceof BasicSpellTurretTile tile) { tile.shootSpell(); } } @@ -106,7 +106,7 @@ public void onCast(SpellResolver resolver, ServerLevel serverLevel, BlockPos pos }); } - public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { + public void neighborChanged(BlockState state, Level worldIn, @NotNull BlockPos pos, @NotNull Block blockIn, @NotNull BlockPos fromPos, boolean isMoving) { boolean neighborSignal = worldIn.hasNeighborSignal(pos) || worldIn.hasNeighborSignal(pos.above()); boolean isTriggered = state.getValue(TRIGGERED); if (neighborSignal && !isTriggered) { @@ -122,19 +122,19 @@ public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block * Get the position where the dispenser at the given Coordinates should dispense to. */ public static Position getDispensePosition(BlockPos pos, Direction direction) { - double d0 = pos.getX() + 0.5 + 0.5D * (double) direction.getStepX(); + double d0 = pos.getX() + 0.5 + 0.5D * (double) direction.getStepX(); double d1 = pos.getY() + 0.5 + 0.5D * (double) direction.getStepY(); - double d2 = pos.getZ() + 0.5 + 0.5D * (double) direction.getStepZ(); + double d2 = pos.getZ() + 0.5 + 0.5D * (double) direction.getStepZ(); return new Vec3(d0, d1, d2); } @Override - public RenderShape getRenderShape(BlockState p_149645_1_) { + public @NotNull RenderShape getRenderShape(@NotNull BlockState p_149645_1_) { return RenderShape.ENTITYBLOCK_ANIMATED; } @Override - public FluidState getFluidState(BlockState state) { + public @NotNull FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : Fluids.EMPTY.defaultFluidState(); } @@ -146,7 +146,7 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { } @Override - public BlockState updateShape(BlockState stateIn, Direction side, BlockState facingState, LevelAccessor worldIn, BlockPos currentPos, BlockPos facingPos) { + public @NotNull BlockState updateShape(BlockState stateIn, @NotNull Direction side, @NotNull BlockState facingState, @NotNull LevelAccessor worldIn, @NotNull BlockPos currentPos, @NotNull BlockPos facingPos) { if (stateIn.getValue(WATERLOGGED)) { worldIn.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(worldIn)); } @@ -154,28 +154,30 @@ public BlockState updateShape(BlockState stateIn, Direction side, BlockState fac } @Override - protected ItemInteractionResult useItemOn(ItemStack pStack, BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult pHitResult) { + protected @NotNull ItemInteractionResult useItemOn(@NotNull ItemStack pStack, @NotNull BlockState state, @NotNull Level worldIn, @NotNull BlockPos pos, @NotNull Player player, @NotNull InteractionHand handIn, @NotNull BlockHitResult pHitResult) { if (handIn != InteractionHand.MAIN_HAND) { return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } if (worldIn.isClientSide) return ItemInteractionResult.SUCCESS; ItemStack stack = player.getItemInHand(handIn); - Spell spell = SpellCasterRegistry.from(stack).getSpell(); - if (!spell.isEmpty()) { - if(spell.getCastMethod() == null){ - PortUtil.sendMessage(player, Component.translatable("ars_nouveau.alert.turret_needs_form")); - return ItemInteractionResult.SUCCESS; - } - if (!(TURRET_BEHAVIOR_MAP.containsKey(spell.getCastMethod()))) { - PortUtil.sendMessage(player, Component.translatable("ars_nouveau.alert.turret_type")); - return ItemInteractionResult.SUCCESS; - } - if (worldIn.getBlockEntity(pos) instanceof BasicSpellTurretTile tile) { - tile.setSpell(spell); - tile.updateBlock(); - PortUtil.sendMessage(player, Component.translatable("ars_nouveau.alert.spell_set")); - worldIn.sendBlockUpdated(pos, state, state, 2); + if (SpellCasterRegistry.from(stack) != null) { + Spell spell = SpellCasterRegistry.from(stack).getSpell(); + if (!spell.isEmpty()) { + if (spell.getCastMethod() == null) { + PortUtil.sendMessage(player, Component.translatable("ars_nouveau.alert.turret_needs_form")); + return ItemInteractionResult.SUCCESS; + } + if (!(TURRET_BEHAVIOR_MAP.containsKey(spell.getCastMethod()))) { + PortUtil.sendMessage(player, Component.translatable("ars_nouveau.alert.turret_type")); + return ItemInteractionResult.SUCCESS; + } + if (worldIn.getBlockEntity(pos) instanceof BasicSpellTurretTile tile) { + tile.setSpell(spell); + tile.updateBlock(); + PortUtil.sendMessage(player, Component.translatable("ars_nouveau.alert.spell_set")); + worldIn.sendBlockUpdated(pos, state, state, 2); + } } } return super.useItemOn(pStack, state, worldIn, pos, player, handIn, pHitResult); @@ -186,21 +188,21 @@ protected void createBlockStateDefinition(StateDefinition.Builder { public static TagKey VEXING_LOGS = BlockTags.create(ArsNouveau.prefix( "vexing_logs")); public static TagKey BLAZING_LOGS = BlockTags.create(ArsNouveau.prefix( "blazing_logs")); public static TagKey DOWSING_ROD = BlockTags.create(ArsNouveau.prefix( "dowsing_rod")); - public static TagKey BUSHES = BlockTags.create(ResourceLocation.fromNamespaceAndPath("neoforge", "bushes")); + public static TagKey BUSHES = BlockTags.create(ResourceLocation.fromNamespaceAndPath("c", "bushes")); public BlockTagProvider(PackOutput output, CompletableFuture future, ExistingFileHelper helper) { super(output, Registries.BLOCK, future, block -> block.builtInRegistryHolder().key(), ArsNouveau.MODID, helper); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DamageTypesProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DamageTypesProvider.java index 03311f7a79..88b475541e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DamageTypesProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DamageTypesProvider.java @@ -8,10 +8,9 @@ import net.minecraft.data.PackOutput; import net.minecraft.data.tags.DamageTypeTagsProvider; import net.minecraft.data.worldgen.BootstrapContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.DamageTypeTags; -import net.minecraft.tags.TagKey; import net.minecraft.world.damagesource.DamageType; +import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; import net.neoforged.neoforge.common.data.ExistingFileHelper; import org.jetbrains.annotations.NotNull; @@ -20,7 +19,7 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; -public class DamageTypesProvider extends DatapackBuiltinEntriesProvider { +public class DamageTypesProvider extends DatapackBuiltinEntriesProvider { private static final RegistrySetBuilder BUILDER = new RegistrySetBuilder() .add(Registries.DAMAGE_TYPE, DamageTypesProvider::bootstrap); @@ -45,20 +44,20 @@ public String getName() { public static class DamageTypesTagsProvider extends DamageTypeTagsProvider { - TagKey FORGE_MAGIC = TagKey.create(Registries.DAMAGE_TYPE, ResourceLocation.fromNamespaceAndPath("c", "is_magic")); public DamageTypesTagsProvider(PackOutput pPackOutput, CompletableFuture provider, @Nullable ExistingFileHelper existingFileHelper) { super(pPackOutput, provider, ArsNouveau.MODID, existingFileHelper); } @Override - protected void addTags(HolderLookup.Provider pProvider) { + protected void addTags(HolderLookup.@NotNull Provider pProvider) { tag(DamageTypeTags.IS_FIRE).addOptional(DamageTypesRegistry.FLARE.location()); tag(DamageTypeTags.IS_FREEZING).addOptional(DamageTypesRegistry.COLD_SNAP.location()); - tag(DamageTypeTags.BYPASSES_ARMOR).addOptional(DamageTypesRegistry.CRUSH.location()).addOptional(DamageTypesRegistry.WINDSHEAR.location()); + tag(DamageTypeTags.BYPASSES_ARMOR) + .addOptional(DamageTypesRegistry.CRUSH.location()) + .addOptional(DamageTypesRegistry.WINDSHEAR.location()); tag(DamageTypeTags.IS_FALL).addOptional(DamageTypesRegistry.WINDSHEAR.location()); - - tag(FORGE_MAGIC) + tag(Tags.DamageTypes.IS_MAGIC) .addOptional(DamageTypesRegistry.GENERIC_SPELL_DAMAGE.location()) .addOptional(DamageTypesRegistry.COLD_SNAP.location()) .addOptional(DamageTypesRegistry.FLARE.location()) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java index c0b31ca24c..f97ddefab0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java @@ -12,6 +12,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.neoforged.neoforge.common.Tags; +import org.jetbrains.annotations.NotNull; import java.nio.file.Path; import java.util.ArrayList; @@ -27,7 +28,7 @@ public ImbuementRecipeProvider(DataGenerator generatorIn) { } @Override - public CompletableFuture run(CachedOutput pOutput) { + public @NotNull CompletableFuture run(@NotNull CachedOutput pOutput) { collectJsons(pOutput); List> futures = new ArrayList<>(); return ModDatagen.registries.thenCompose((registry) -> { @@ -95,7 +96,7 @@ private static Path getRecipePath(Path pathIn, String str) { } @Override - public String getName() { + public @NotNull String getName() { return "Imbuement"; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java index df66ce7838..b48bb00777 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java @@ -14,14 +14,15 @@ import net.minecraft.world.item.Items; import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.NotNull; import java.util.concurrent.CompletableFuture; public class ItemTagProvider extends IntrinsicHolderTagsProvider { public static TagKey SUMMON_BED_ITEMS = ItemTags.create(ArsNouveau.prefix( "summon_bed")); - public static TagKey SOURCE_GEM_TAG = ItemTags.create(ResourceLocation.tryParse("neoforge:gems/source")); - public static TagKey SOURCE_GEM_BLOCK_TAG = ItemTags.create(ResourceLocation.tryParse("neoforge:storage_blocks/source")); - public static TagKey ARCHWOOD_LOG_TAG = ItemTags.create(ResourceLocation.tryParse("neoforge:logs/archwood")); + public static TagKey SOURCE_GEM_TAG = ItemTags.create(ResourceLocation.fromNamespaceAndPath("c", "gems/source")); + public static TagKey SOURCE_GEM_BLOCK_TAG = ItemTags.create(ResourceLocation.fromNamespaceAndPath("c", "storage_blocks/source")); + public static TagKey ARCHWOOD_LOG_TAG = ItemTags.create(ResourceLocation.fromNamespaceAndPath("c", "logs/archwood")); public static TagKey MAGIC_FOOD = ItemTags.create(ArsNouveau.prefix( "magic_food")); public static TagKey WILDEN_DROP_TAG = ItemTags.create(ArsNouveau.prefix( "wilden_drop")); public static TagKey SHARD_TAG = ItemTags.create(ArsNouveau.prefix( "golem/shard")); @@ -30,7 +31,7 @@ public class ItemTagProvider extends IntrinsicHolderTagsProvider { public static TagKey JAR_ITEM_BLACKLIST = ItemTags.create(ArsNouveau.prefix( "interact_jar_blacklist")); public static TagKey RITUAL_LOOT_BLACKLIST = ItemTags.create(ArsNouveau.prefix( "ritual_loot_blacklist")); public static TagKey RITUAL_TRADE_BLACKLIST = ItemTags.create(ArsNouveau.prefix( "ritual_trade_blacklist")); - public static TagKey STORAGE_BLOCKS_QUARTZ = ItemTags.create(ResourceLocation.tryParse("storage_blocks/quartz")); + public static TagKey STORAGE_BLOCKS_QUARTZ = ItemTags.create(ResourceLocation.fromNamespaceAndPath("c", "storage_blocks/quartz")); public static TagKey SHADY_WIZARD_FRUITS = ItemTags.create(ArsNouveau.prefix( "shady_wizard_fruits")); @@ -39,7 +40,7 @@ public ItemTagProvider(PackOutput output, CompletableFuture run(CachedOutput pOutput) { + public @NotNull CompletableFuture run(@NotNull CachedOutput pOutput) { collectJsons(pOutput); return CompletableFuture.allOf(futuresBuilder.build().toArray(CompletableFuture[]::new)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java index 74c2b190d5..4abd57dfd7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java @@ -18,13 +18,13 @@ import java.util.function.Function; /** - * Copied from Advancements.Builder with extentions to reduce copy pasta + * Copied from Advancements.Builder with extensions to reduce copy pasta */ -public class ANAdvancementBuilder implements net.neoforged.neoforge.common.extensions.IAdvancementBuilderExtension{ +public class ANAdvancementBuilder implements net.neoforged.neoforge.common.extensions.IAdvancementBuilderExtension { @Nullable private ResourceLocation parentId; @Nullable - private Advancement parent; + private AdvancementHolder parent; @Nullable private DisplayInfo display; private AdvancementRewards rewards = AdvancementRewards.EMPTY; @@ -53,6 +53,7 @@ public static ANAdvancementBuilder builder(String modid, String fileKey) { } public ANAdvancementBuilder parent(AdvancementHolder parent) { + this.parent = parent; return this.parent(parent.id()); } @@ -76,7 +77,7 @@ public ANAdvancementBuilder display(DisplayInfo pDisplay) { // The following displays cannot be used for roots. public ANAdvancementBuilder display(ItemStack pItem, AdvancementType pFrame) { - return this.display(new DisplayInfo(pItem, this.getComponent("title"), this.getComponent("desc"), null, pFrame, true, true, false)); + return this.display(new DisplayInfo(pItem, this.getComponent("title"), this.getComponent("desc"), Optional.empty(), pFrame, true, true, false)); } public ANAdvancementBuilder display(ItemLike pItem, AdvancementType pFrame) { @@ -85,7 +86,7 @@ public ANAdvancementBuilder display(ItemLike pItem, AdvancementType pFrame) { // The following displays cannot be used for roots. public ANAdvancementBuilder display(ItemStack pItem, AdvancementType pFrame, boolean hidden) { - return this.display(new DisplayInfo(pItem, this.getComponent("title"), this.getComponent("desc"), null, pFrame, true, true, hidden)); + return this.display(new DisplayInfo(pItem, this.getComponent("title"), this.getComponent("desc"), Optional.empty(), pFrame, true, true, hidden)); } public ANAdvancementBuilder display(ItemLike pItem, AdvancementType pFrame, boolean hidden) { @@ -125,22 +126,22 @@ public ANAdvancementBuilder requirements(AdvancementRequirements pRequirements) return this; } - public ANAdvancementBuilder normalItemRequirement(ItemLike item){ + public ANAdvancementBuilder normalItemRequirement(ItemLike item) { return this.display(item, AdvancementType.TASK).requireItem(item); } - public ANAdvancementBuilder requireItem(ItemLike item){ + public ANAdvancementBuilder requireItem(ItemLike item) { return this.addCriterion("has_" + BuiltInRegistries.ITEM.getKey(item.asItem()).getPath(), InventoryChangeTrigger.TriggerInstance.hasItems(item)); } - public MutableComponent getComponent(String type){ + public MutableComponent getComponent(String type) { return Component.translatable(modid + ".adv." + type + "." + fileKey); } /** * Tries to resolve the parent of this advancement, if possible. Returns true on success. */ - public boolean canBuild(Function pParentLookup) { + public boolean canBuild(Function pParentLookup) { if (this.parentId == null) { return true; } else { @@ -157,12 +158,10 @@ public Advancement build() { if (this.requirements == null) { this.requirements = this.requirementsStrategy.create(this.criteria.keySet()); } - if(this.criteria.isEmpty()){ + if (this.criteria.isEmpty()) { throw new IllegalStateException("Advancement " + fileKey + " has no criteria " + this); } - return new Advancement(Optional.ofNullable(this.parentId), Optional.ofNullable(this.display), this.rewards, this.criteria, this.requirements, false); - } public AdvancementHolder save(Consumer pConsumer, ResourceLocation pId) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancements.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancements.java index 009bfd7f03..a6c76e567a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancements.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancements.java @@ -1,17 +1,27 @@ package com.hollingsworth.arsnouveau.common.datagen.advancement; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.registry.RitualRegistry; +import com.hollingsworth.arsnouveau.common.advancement.ANCriteriaTriggers; +import com.hollingsworth.arsnouveau.common.lib.RitualLib; +import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.advancements.AdvancementHolder; import net.minecraft.advancements.AdvancementType; +import net.minecraft.advancements.critereon.ConsumeItemTrigger; +import net.minecraft.advancements.critereon.EffectsChangedTrigger; import net.minecraft.advancements.critereon.InventoryChangeTrigger; +import net.minecraft.advancements.critereon.MobEffectsPredicate; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; import net.minecraft.world.level.ItemLike; import net.neoforged.neoforge.common.data.AdvancementProvider; import net.neoforged.neoforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; @@ -19,62 +29,62 @@ public class ANAdvancements implements AdvancementProvider.AdvancementGenerator Consumer advCon; @Override - public void generate(HolderLookup.Provider registries, Consumer con, ExistingFileHelper existingFileHelper) { + public void generate(HolderLookup.@NotNull Provider registries, @NotNull Consumer con, @NotNull ExistingFileHelper existingFileHelper) { this.advCon = con; AdvancementHolder root = builder(ArsNouveau.MODID).display(ItemsRegistry.WORN_NOTEBOOK, Component.translatable("ars_nouveau.advancement.title.root"), Component.translatable("ars_nouveau.advancement.desc.root"), ResourceLocation.parse("ars_nouveau:textures/gui/advancements/backgrounds/sourcestone.png"), AdvancementType.TASK, false, false, false).addCriterion("ars_nouveau:worn_notebook", InventoryChangeTrigger.TriggerInstance.hasItems(ItemsRegistry.WORN_NOTEBOOK)).save(con, ArsNouveau.prefix("root")); - //todo: reimplement advancements -// AdvancementHolder poofMob = builder("poof_mob").display(Items.GOLD_NUGGET, AdvancementType.TASK).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.POOF_MOB)).parent(root).save(con); -// saveBasicItem(ItemsRegistry.WIXIE_CHARM, poofMob); -// saveBasicItem(ItemsRegistry.WHIRLISPRIG_CHARM, poofMob); -// saveBasicItem(ItemsRegistry.DRYGMY_CHARM, poofMob); -// AdvancementHolder starbyCharm = builder("starby_charm").normalItemRequirement(ItemsRegistry.STARBUNCLE_CHARM).parent(poofMob).save(con); -// saveBasicItem(ItemsRegistry.STARBUNCLE_SHADES, starbyCharm); -// saveBasicItem(ItemsRegistry.WIXIE_HAT, starbyCharm); -// AdvancementHolder novice = saveBasicItem(ItemsRegistry.NOVICE_SPELLBOOK, root); -// AdvancementHolder mages = saveBasicItem(ItemsRegistry.APPRENTICE_SPELLBOOK, novice); -// AdvancementHolder tribute = saveBasicItem(ItemsRegistry.WILDEN_TRIBUTE, mages); -// builder("wilden_explosion").display(ItemsRegistry.WILDEN_TRIBUTE, AdvancementType.CHALLENGE, true).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.CHIMERA_EXPLOSION)).parent(tribute).save(con); -// saveBasicItem(ItemsRegistry.ARCHMAGE_SPELLBOOK, tribute); -// saveBasicItem(ItemsRegistry.SUMMONING_FOCUS, tribute); -// saveBasicItem(ItemsRegistry.SHAPERS_FOCUS, novice); -// -// -// builder("eat_bombegranate").display(BlockRegistry.BOMBEGRANTE_POD, AdvancementType.TASK, true).addCriterion(ConsumeItemTrigger.TriggerInstance.usedItem(BlockRegistry.BOMBEGRANTE_POD)).parent(root).save(con); -// -// AdvancementHolder rituals = saveBasicItem(BlockRegistry.RITUAL_BLOCK, root); -// saveBasicItem(ItemsRegistry.AMETHYST_GOLEM_CHARM, rituals); -// builder("familiar").display(RitualRegistry.getRitualItemMap().get(ArsNouveau.prefix(RitualLib.BINDING)), AdvancementType.GOAL) -// .addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.FAMILIAR)).parent(rituals).save(con); -// var jars = saveBasicItem(BlockRegistry.MOB_JAR, rituals); -// builder("shrunk_starbuncle").display(ItemsRegistry.STARBUNCLE_CHARM, AdvancementType.CHALLENGE, true).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.SHRUNK_STARBY)).parent(jars).save(con); -// builder("catch_lightning").display(Items.LIGHTNING_ROD, AdvancementType.CHALLENGE, true).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.CAUGHT_LIGHTNING)).parent(jars).save(con); -// builder("time_in_a_bottle").display(Items.CLOCK, AdvancementType.CHALLENGE, true).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.TIME_IN_BOTTLE)).parent(jars).save(con); -// -// var chamber = saveBasicItem(BlockRegistry.IMBUEMENT_BLOCK, root); -// var jar = saveBasicItem(BlockRegistry.SOURCE_JAR, chamber); -// var apparatus = saveBasicItem(BlockRegistry.ENCHANTING_APP_BLOCK, chamber); -// saveBasicItem(BlockRegistry.SCRYERS_OCULUS, apparatus); -// var potionJar = saveBasicItem(BlockRegistry.POTION_JAR, apparatus); -// saveBasicItem(BlockRegistry.POTION_MELDER, potionJar); -// saveBasicItem(BlockRegistry.POTION_DIFFUSER, potionJar); -// saveBasicItem(ItemsRegistry.POTION_FLASK, potionJar); -// var turret = saveBasicItem(BlockRegistry.BASIC_SPELL_TURRET, apparatus); -// var prism = saveBasicItem(BlockRegistry.SPELL_PRISM, turret); -// builder("prismatic").display(BlockRegistry.SPELL_PRISM, AdvancementType.CHALLENGE, true).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.PRISMATIC)).parent(prism).save(con); -// var magebloom = saveBasicItem(BlockRegistry.MAGE_BLOOM_CROP, apparatus); -// var warpScroll = saveBasicItem(ItemsRegistry.WARP_SCROLL, magebloom); -// builder("create_portal").display(BlockRegistry.CREATIVE_SOURCE_JAR, AdvancementType.CHALLENGE, false).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.CREATE_PORTAL)).parent(warpScroll).save(con); -// var alteration = saveBasicItem(BlockRegistry.ALTERATION_TABLE, magebloom); -// -// builder("ritual_gravity").display(RitualRegistry.getRitualItemMap().get(ArsNouveau.prefix(RitualLib.GRAVITY)), AdvancementType.GOAL).addCriterion("gravity_effect", EffectsChangedTrigger.TriggerInstance.hasEffects(MobEffectsPredicate.Builder.effects().and(ModPotions.GRAVITY_EFFECT))).parent(rituals).save(con); + + AdvancementHolder poofMob = builder("poof_mob").display(Items.GOLD_NUGGET, AdvancementType.TASK).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.POOF_MOB)).parent(root).save(con); + saveBasicItem(ItemsRegistry.WIXIE_CHARM, poofMob); + saveBasicItem(ItemsRegistry.WHIRLISPRIG_CHARM, poofMob); + saveBasicItem(ItemsRegistry.DRYGMY_CHARM, poofMob); + AdvancementHolder starbyCharm = builder("starby_charm").normalItemRequirement(ItemsRegistry.STARBUNCLE_CHARM).parent(poofMob).save(con); + saveBasicItem(ItemsRegistry.STARBUNCLE_SHADES, starbyCharm); + saveBasicItem(ItemsRegistry.WIXIE_HAT, starbyCharm); + AdvancementHolder novice = saveBasicItem(ItemsRegistry.NOVICE_SPELLBOOK, root); + AdvancementHolder mages = saveBasicItem(ItemsRegistry.APPRENTICE_SPELLBOOK, novice); + AdvancementHolder tribute = saveBasicItem(ItemsRegistry.WILDEN_TRIBUTE, mages); + builder("wilden_explosion").display(ItemsRegistry.WILDEN_TRIBUTE, AdvancementType.CHALLENGE, true).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.CHIMERA_EXPLOSION)).parent(tribute).save(con); + saveBasicItem(ItemsRegistry.ARCHMAGE_SPELLBOOK, tribute); + saveBasicItem(ItemsRegistry.SUMMONING_FOCUS, tribute); + saveBasicItem(ItemsRegistry.SHAPERS_FOCUS, novice); + + + builder("eat_bombegranate").display(BlockRegistry.BOMBEGRANTE_POD, AdvancementType.TASK, true).addCriterion(ConsumeItemTrigger.TriggerInstance.usedItem(BlockRegistry.BOMBEGRANTE_POD)).parent(root).save(con); + + AdvancementHolder rituals = saveBasicItem(BlockRegistry.RITUAL_BLOCK, root); + saveBasicItem(ItemsRegistry.AMETHYST_GOLEM_CHARM, rituals); + builder("familiar").display(RitualRegistry.getRitualItemMap().get(ArsNouveau.prefix(RitualLib.BINDING)), AdvancementType.GOAL) + .addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.FAMILIAR)).parent(rituals).save(con); + AdvancementHolder jars = saveBasicItem(BlockRegistry.MOB_JAR, rituals); + builder("shrunk_starbuncle").display(ItemsRegistry.STARBUNCLE_CHARM, AdvancementType.CHALLENGE, true).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.SHRUNK_STARBY)).parent(jars).save(con); + builder("catch_lightning").display(Items.LIGHTNING_ROD, AdvancementType.CHALLENGE, true).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.CAUGHT_LIGHTNING)).parent(jars).save(con); + builder("time_in_a_bottle").display(Items.CLOCK, AdvancementType.CHALLENGE, true).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.TIME_IN_BOTTLE)).parent(jars).save(con); + + AdvancementHolder chamber = saveBasicItem(BlockRegistry.IMBUEMENT_BLOCK, root); + AdvancementHolder jar = saveBasicItem(BlockRegistry.SOURCE_JAR, chamber); + AdvancementHolder apparatus = saveBasicItem(BlockRegistry.ENCHANTING_APP_BLOCK, chamber); + saveBasicItem(BlockRegistry.SCRYERS_OCULUS, apparatus); + AdvancementHolder potionJar = saveBasicItem(BlockRegistry.POTION_JAR, apparatus); + saveBasicItem(BlockRegistry.POTION_MELDER, potionJar); + saveBasicItem(BlockRegistry.POTION_DIFFUSER, potionJar); + saveBasicItem(ItemsRegistry.POTION_FLASK, potionJar); + AdvancementHolder turret = saveBasicItem(BlockRegistry.BASIC_SPELL_TURRET, apparatus); + AdvancementHolder prism = saveBasicItem(BlockRegistry.SPELL_PRISM, turret); + builder("prismatic").display(BlockRegistry.SPELL_PRISM, AdvancementType.CHALLENGE, true).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.PRISMATIC)).parent(prism).save(con); + AdvancementHolder magebloom = saveBasicItem(BlockRegistry.MAGE_BLOOM_CROP, apparatus); + AdvancementHolder warpScroll = saveBasicItem(ItemsRegistry.WARP_SCROLL, magebloom); + builder("create_portal").display(BlockRegistry.CREATIVE_SOURCE_JAR, AdvancementType.CHALLENGE, false).addCriterion(ANCriteriaTriggers.createCriterion(ANCriteriaTriggers.CREATE_PORTAL)).parent(warpScroll).save(con); + AdvancementHolder alteration = saveBasicItem(BlockRegistry.ALTERATION_TABLE, magebloom); + + builder("ritual_gravity").display(RitualRegistry.getRitualItemMap().get(ArsNouveau.prefix(RitualLib.GRAVITY)), AdvancementType.GOAL).addCriterion("gravity_effect", EffectsChangedTrigger.TriggerInstance.hasEffects(MobEffectsPredicate.Builder.effects().and(ModPotions.GRAVITY_EFFECT))).parent(rituals).save(con); } public ANAdvancementBuilder buildBasicItem(ItemLike item, AdvancementHolder parent){ - return builder(BuiltInRegistries.ITEM.getKey(item.asItem()).getPath()).normalItemRequirement(item).parent(parent.id()); + return builder(BuiltInRegistries.ITEM.getKey(item.asItem()).getPath()).normalItemRequirement(item).parent(parent); } public AdvancementHolder saveBasicItem(ItemLike item, AdvancementHolder parent){ @@ -84,4 +94,5 @@ public AdvancementHolder saveBasicItem(ItemLike item, AdvancementHolder parent){ public ANAdvancementBuilder builder(String key){ return ANAdvancementBuilder.builder(ArsNouveau.MODID, key); } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/SimpleAdvancements.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/SimpleAdvancements.java deleted file mode 100644 index 3311a6c2bf..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/SimpleAdvancements.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.hollingsworth.arsnouveau.common.datagen.advancement; - -import com.hollingsworth.arsnouveau.common.datagen.ModDatagen; -import com.hollingsworth.arsnouveau.common.datagen.SimpleDataProvider; -import com.mojang.serialization.JsonOps; -import net.minecraft.advancements.Advancement; -import net.minecraft.advancements.AdvancementHolder; -import net.minecraft.data.CachedOutput; -import net.minecraft.data.DataGenerator; - -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -public class SimpleAdvancements extends SimpleDataProvider { - - public SimpleAdvancements(DataGenerator dataGenerator) { - super(dataGenerator); - } - - @Override - public void collectJsons(CachedOutput pOutput) { - List holders = new ArrayList<>(); - var advancements = new ANAdvancements(); - advancements.generate(null, holders::add, null); - - for(AdvancementHolder holder : holders){ - - Path path = getRecipePath(ModDatagen.output.getOutputFolder(), holder.id().getPath()); - saveStable(pOutput, Advancement.CODEC.encodeStart(JsonOps.INSTANCE, holder.value()).getOrThrow(), path); - } - - } - - private static Path getRecipePath(Path pathIn, String str) { - return pathIn.resolve("data/ars_nouveau/advancements/" + str + ".json"); - } - - - @Override - public String getName() { - return ""; - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Cinder.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Cinder.java index 32748a7c0b..717ac3a051 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Cinder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Cinder.java @@ -15,6 +15,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; public class Cinder extends EnchantedFallingBlock { public LivingEntity shooter; @@ -60,12 +61,12 @@ public void doPostHurtEffects(LivingEntity livingentity) { } @Override - protected boolean canHitEntity(Entity entity) { + protected boolean canHitEntity(@NotNull Entity entity) { return super.canHitEntity(entity) || entity.getType().is(EntityTags.SPELL_CAN_HIT); } @Override - public EntityType getType() { + public @NotNull EntityType getType() { return ModEntities.CINDER.get(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java index 4e1f271822..2f17e788a2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java @@ -18,8 +18,10 @@ import net.minecraft.CrashReportCategory; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.NbtUtils; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; @@ -52,6 +54,7 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; @@ -121,11 +124,6 @@ public EnchantedFallingBlock(Level world, BlockPos pos, BlockState blockState) { this(world, pos.getX(), pos.getY(), pos.getZ(), blockState, null); } - @Deprecated(forRemoval = true) - public static boolean canFall(Level level, BlockPos pos, LivingEntity owner, SpellStats spellStats) { - return canFall(level, pos, (Entity) owner, spellStats); - } - public static boolean canFall(Level level, BlockPos pos, Entity owner, SpellStats spellStats) { if (level.isEmptyBlock(pos) || !level.getFluidState(pos).isEmpty() @@ -160,7 +158,7 @@ public static boolean canFall(Level level, BlockPos pos, Entity owner, SpellStat if (resolver.hasFocus(ItemsRegistry.SHAPERS_FOCUS.get())) { fallingblockentity.hurtEntities = true; } - if(context != null){ + if (context != null) { RewindAttachment rewindAttachment = RewindAttachment.get(context); rewindAttachment.addRewindEvent(level.getGameTime(), new BlockToEntityRewind(pos, blockState)); } @@ -168,23 +166,18 @@ public static boolean canFall(Level level, BlockPos pos, Entity owner, SpellStat return fallingblockentity; } - @Deprecated(forRemoval = true) - public static @Nullable EnchantedFallingBlock fall(Level level, BlockPos pos, LivingEntity owner, SpellContext context, SpellResolver resolver, SpellStats spellStats) { - return fall(level, pos, (Entity) owner, context, resolver, spellStats); - } - @Override - public EntityType getType() { + public @NotNull EntityType getType() { return ModEntities.ENCHANTED_FALLING_BLOCK.get(); } @Override - public boolean canCollideWith(Entity pEntity) { + public boolean canCollideWith(@NotNull Entity pEntity) { return super.canCollideWith(pEntity) && !(pEntity instanceof FallingBlockEntity) && !(pEntity instanceof EnchantedFallingBlock) && pEntity != getOwner(); } @Override - protected boolean canHitEntity(Entity p_37250_) { + protected boolean canHitEntity(@NotNull Entity p_37250_) { return super.canHitEntity(p_37250_) && p_37250_ != getOwner() && !this.piercingIgnoreEntityIds.contains(p_37250_.getId()); } @@ -227,7 +220,7 @@ public void tick() { this.discard(); } } else { // on ground - if(this instanceof IRewindable rewindable && !rewindable.isRewinding()) { + if (this instanceof IRewindable rewindable && !rewindable.isRewinding()) { this.groundBlock(false); } } @@ -262,7 +255,7 @@ public BlockPos groundBlock(boolean ignoreAir) { this.discard(); if (block instanceof Fallable fallable) { fallable.onLand(this.level, blockpos, this.blockState, blockstate, new FallingBlockEntity(level, this.getX(), this.getY(), this.getZ(), this.blockState)); - }else if(context != null && resolver != null){ + } else if (context != null && resolver != null) { RewindAttachment.get(context).addRewindEvent(level.getGameTime(), new EntityToBlockRewind(this, blockpos, this.blockState)); ShapersFocus.tryPropagateBlockSpell(new BlockHitResult( new Vec3(blockpos.getX(), blockpos.getY(), blockpos.getZ()), Direction.DOWN, blockpos, false @@ -275,7 +268,7 @@ public BlockPos groundBlock(boolean ignoreAir) { try { blockentity.loadWithComponents(this.blockData, level.registryAccess()); - if(blockentity instanceof SkullBlockEntity sk && this.blockData != null && this.blockData.contains("SkullOwner")){ + if (blockentity instanceof SkullBlockEntity sk && this.blockData != null && this.blockData.contains("SkullOwner")) { sk.setOwner(ANCodecs.decode(ResolvableProfile.CODEC, this.blockData.getCompound("SkullOwner"))); } } catch (Exception exception) { @@ -295,10 +288,11 @@ public BlockPos groundBlock(boolean ignoreAir) { this.discard(); this.callOnBrokenAfterFall(block, blockpos); ItemStack itemstack = new ItemStack(block); - //todo: restore player head -// if(this.blockData != null && !itemstack.hasTag() && this.getBlockState().is(Blocks.PLAYER_HEAD)){ -// itemstack.setTag(this.blockData); -// } + if (this.blockData != null && this.getBlockState().is(Blocks.PLAYER_HEAD)) { + ResolvableProfile.CODEC + .parse(NbtOps.INSTANCE, blockData.get("profile")) + .resultOrPartial().ifPresent(profile -> itemstack.set(DataComponents.PROFILE, profile)); + } this.spawnAtLocation(itemstack); return null; } @@ -308,9 +302,12 @@ public BlockPos groundBlock(boolean ignoreAir) { this.callOnBrokenAfterFall(block, blockpos); ItemStack itemstack = new ItemStack(block); //todo: restore player head -// if(this.blockData != null && !itemstack.hasTag() && this.getBlockState().is(Blocks.PLAYER_HEAD)){ -// itemstack.setTag(this.blockData); -// } + if (this.blockData != null && this.getBlockState().is(Blocks.PLAYER_HEAD)) { + ResolvableProfile.CODEC + .parse(NbtOps.INSTANCE, blockData.get("profile")) + .resultOrPartial().ifPresent(profile -> itemstack.set(DataComponents.PROFILE, profile)); + + } this.spawnAtLocation(itemstack); } } @@ -329,7 +326,7 @@ public float getStateDamageBonus() { } @Override - protected void onHitEntity(EntityHitResult pResult) { + protected void onHitEntity(@NotNull EntityHitResult pResult) { if (!hurtEntities) return; super.onHitEntity(pResult); @@ -383,7 +380,7 @@ protected void onHitEntity(EntityHitResult pResult) { public void doPostHurtEffects(LivingEntity livingentity) { } - public void fillCrashReportCategory(CrashReportCategory pCategory) { + public void fillCrashReportCategory(@NotNull CrashReportCategory pCategory) { super.fillCrashReportCategory(pCategory); pCategory.setDetail("Immitating BlockState", this.blockState.toString()); } @@ -393,7 +390,7 @@ public BlockState getBlockState() { } @Override - public Packet getAddEntityPacket(ServerEntity p_352287_) { + public @NotNull Packet getAddEntityPacket(@NotNull ServerEntity p_352287_) { return new ClientboundAddEntityPacket(this, p_352287_, Block.getId(this.getBlockState())); } @@ -401,7 +398,7 @@ public boolean onlyOpCanSetNbt() { return true; } - public void recreateFromPacket(ClientboundAddEntityPacket pPacket) { + public void recreateFromPacket(@NotNull ClientboundAddEntityPacket pPacket) { super.recreateFromPacket(pPacket); this.blockState = Block.stateById(pPacket.getData()); this.blocksBuilding = true; @@ -419,7 +416,7 @@ public void callOnBrokenAfterFall(Block p_149651_, BlockPos p_149652_) { } - public boolean causeFallDamage(float pFallDistance, float pMultiplier, DamageSource pSource) { + public boolean causeFallDamage(float pFallDistance, float pMultiplier, @NotNull DamageSource pSource) { if (!this.hurtEntities) { return false; } else { @@ -469,7 +466,7 @@ public void addAdditionalSaveData(CompoundTag pCompound) { /** * (abstract) Protected helper method to read subclass entity data from NBT. */ - protected void readAdditionalSaveData(CompoundTag pCompound) { + protected void readAdditionalSaveData(@NotNull CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.blockState = NbtUtils.readBlockState(this.level().holderLookup(Registries.BLOCK), pCompound.getCompound("BlockState")); this.time = pCompound.getInt("Time"); @@ -516,7 +513,7 @@ public BlockPos getStartPos() { return this.entityData.get(DATA_START_POS); } - protected Entity.MovementEmission getMovementEmission() { + protected Entity.@NotNull MovementEmission getMovementEmission() { return Entity.MovementEmission.NONE; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedMageblock.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedMageblock.java index 6f0a638a2f..d46242d372 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedMageblock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedMageblock.java @@ -4,6 +4,7 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; public class EnchantedMageblock extends EnchantedFallingBlock { public EnchantedMageblock(EntityType p_31950_, Level p_31951_) { @@ -15,7 +16,7 @@ public EnchantedMageblock(Level level, double v, int y, double v1, BlockState bl } @Override - public EntityType getType() { + public @NotNull EntityType getType() { return ModEntities.ENCHANTED_MAGE_BLOCK.get(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java index 446d858be1..938382d4b7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedSkull.java @@ -2,16 +2,23 @@ import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; +import net.minecraft.nbt.NbtOps; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.PlayerHeadItem; +import net.minecraft.world.item.component.ResolvableProfile; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.entity.IEntityWithComplexSpawn; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class EnchantedSkull extends EnchantedFallingBlock { +public class EnchantedSkull extends EnchantedFallingBlock implements IEntityWithComplexSpawn { public EnchantedSkull(EntityType p_31950_, Level p_31951_) { super(p_31950_, p_31951_); } @@ -25,16 +32,17 @@ public EnchantedSkull(Level world, BlockPos pos, BlockState blockState) { } @Override - public EntityType getType() { + public @NotNull EntityType getType() { return ModEntities.ENCHANTED_HEAD_BLOCK.get(); } - //todo: restore player data packet @Nullable @Override public ItemEntity spawnAtLocation(ItemStack pStack) { - if (pStack.getItem() instanceof PlayerHeadItem) { -// pStack.setTag(blockData); + if (pStack.getItem() instanceof PlayerHeadItem && blockData != null) { + ResolvableProfile.CODEC + .parse(NbtOps.INSTANCE, blockData.get("profile")) + .resultOrPartial().ifPresent(profile -> pStack.set(DataComponents.PROFILE, profile)); } return this.spawnAtLocation(pStack, 0.0F); } @@ -42,35 +50,36 @@ public ItemEntity spawnAtLocation(ItemStack pStack) { public ItemStack getStack() { Item item = getBlockState().getBlock().asItem(); ItemStack stack = item.getDefaultInstance(); - if (item instanceof PlayerHeadItem){ -// stack.setTag(this.blockData); - + if (item instanceof PlayerHeadItem && blockData != null) { + ResolvableProfile.CODEC + .parse(NbtOps.INSTANCE, blockData.get("profile")) + .resultOrPartial().ifPresent(profile -> stack.set(DataComponents.PROFILE, profile)); } return stack; } -// -// /** -// * Called by the server when constructing the spawn packet. -// * Data should be added to the provided stream. -// * -// * @param buffer The packet data stream -// */ -// @Override -// public void writeSpawnData(FriendlyByteBuf buffer) { -// buffer.writeInt(Block.getId(blockState)); -// buffer.writeNbt(blockData); -// } -// -// /** -// * Called by the client when it receives a Entity spawn packet. -// * Data should be read out of the stream in the same way as it was written. -// * -// * @param additionalData The packet data stream -// */ -// @Override -// public void readSpawnData(FriendlyByteBuf additionalData) { -// blockState = Block.stateById(additionalData.readInt()); -// blockData = additionalData.readNbt(); -// } + + /** + * Called by the server when constructing the spawn packet. + * Data should be added to the provided stream. + * + * @param buffer The packet data stream + */ + @Override + public void writeSpawnData(RegistryFriendlyByteBuf buffer) { + buffer.writeInt(Block.getId(blockState)); + buffer.writeNbt(blockData); + } + + /** + * Called by the client when it receives a Entity spawn packet. + * Data should be read out of the stream in the same way as it was written. + * + * @param additionalData The packet data stream + */ + @Override + public void readSpawnData(RegistryFriendlyByteBuf additionalData) { + blockState = Block.stateById(additionalData.readInt()); + blockData = additionalData.readNbt(); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/IceShardEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/IceShardEntity.java index e7d215a25f..7ee82a0237 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/IceShardEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/IceShardEntity.java @@ -19,6 +19,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; +import org.jetbrains.annotations.NotNull; public class IceShardEntity extends EnchantedFallingBlock { public LivingEntity shooter; @@ -56,7 +57,7 @@ public void doPostHurtEffects(LivingEntity livingentity) { } @Override - public EntityType getType() { + public @NotNull EntityType getType() { return ModEntities.ICE_SHARD.get(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java index fd873bedfb..ef62ad15b9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java @@ -12,6 +12,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.Tags; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.animation.RawAnimation; @@ -25,7 +26,7 @@ public FamiliarAmethystGolem(EntityType p_i48575_1_, Le } @Override - protected InteractionResult mobInteract(Player player, InteractionHand hand) { + protected @NotNull InteractionResult mobInteract(@NotNull Player player, @NotNull InteractionHand hand) { if (level.isClientSide || hand != InteractionHand.MAIN_HAND) return InteractionResult.SUCCESS; @@ -47,7 +48,7 @@ public PlayState walkPredicate(AnimationState event) { } @Override - public EntityType getType() { + public @NotNull EntityType getType() { return ModEntities.FAMILIAR_AMETHYST_GOLEM.get(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java index 3c681012ec..0861a5917a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java @@ -19,6 +19,7 @@ import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.event.entity.player.ItemEntityPickupEvent; import net.neoforged.neoforge.items.wrapper.PlayerMainInvWrapper; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.animation.RawAnimation; @@ -33,7 +34,7 @@ public FamiliarBookwyrm(EntityType ent, Level world) { } @Override - public InteractionResult mobInteract(Player player, InteractionHand hand) { + public @NotNull InteractionResult mobInteract(@NotNull Player player, @NotNull InteractionHand hand) { if (level.isClientSide || hand != InteractionHand.MAIN_HAND) return InteractionResult.SUCCESS; @@ -96,7 +97,7 @@ public PlayState walkPredicate(AnimationState event) { } @Override - public EntityType getType() { + public @NotNull EntityType getType() { return ModEntities.ENTITY_FAMILIAR_BOOKWYRM.get(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java index 29b27a92ea..dbf0b1f6fe 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java @@ -15,6 +15,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.Tags; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.animation.RawAnimation; @@ -28,7 +29,7 @@ public FamiliarDrygmy(EntityType ent, Level world) { } @Override - protected InteractionResult mobInteract(Player player, InteractionHand hand) { + protected @NotNull InteractionResult mobInteract(@NotNull Player player, @NotNull InteractionHand hand) { if (level.isClientSide || hand != InteractionHand.MAIN_HAND) return InteractionResult.SUCCESS; @@ -69,7 +70,7 @@ public PlayState walkPredicate(AnimationState event) { } @Override - public EntityType getType() { + public @NotNull EntityType getType() { return ModEntities.ENTITY_FAMILIAR_DRYGMY.get(); } @@ -77,6 +78,6 @@ public EntityType getType() { public ResourceLocation getTexture(FamiliarEntity entity) { String color = getColor().toLowerCase(); if (color.isEmpty()) color = "brown"; - return ArsNouveau.prefix( "textures/entity/drygmy_" + color + ".png"); + return ArsNouveau.prefix("textures/entity/drygmy_" + color + ".png"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java index e1bb4ba9d5..ecc27537c1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java @@ -21,6 +21,8 @@ import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.entity.*; @@ -34,6 +36,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; @@ -64,6 +67,10 @@ public FamiliarEntity(EntityType p_i48575_1_, Level p_i FAMILIAR_SET.add(this); } + protected @NotNull InteractionResult mobInteract(@NotNull Player player, @NotNull InteractionHand hand) { + return super.mobInteract(player, hand); + } + @Override public boolean removeWhenFarAway(double p_213397_1_) { return false; @@ -123,7 +130,7 @@ protected void registerGoals() { this.targetSelector.addGoal(2, new FamOwnerHurtTargetGoal(this)); } - public PlayState walkPredicate(AnimationState event) { + public PlayState walkPredicate(AnimationState event) { return PlayState.CONTINUE; } @@ -155,7 +162,7 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + protected void defineSynchedData(SynchedEntityData.@NotNull Builder pBuilder) { super.defineSynchedData(pBuilder); pBuilder.define(OWNER_UUID, Optional.empty()); pBuilder.define(COLOR, ""); @@ -180,7 +187,7 @@ public void setOwnerID(UUID uuid) { this.getEntityData().set(OWNER_UUID, Optional.of(uuid)); } - public ItemStack getCosmeticItem() { + public @NotNull ItemStack getCosmeticItem() { return this.entityData.get(COSMETIC); } @@ -204,12 +211,12 @@ public static AttributeSupplier.Builder attributes() { } @Override - public boolean canTrample(BlockState state, BlockPos pos, float fallDistance) { + public boolean canTrample(@NotNull BlockState state, @NotNull BlockPos pos, float fallDistance) { return false; } @Override - protected boolean canRide(Entity p_184228_1_) { + protected boolean canRide(@NotNull Entity p_184228_1_) { return false; } @@ -224,13 +231,13 @@ public boolean onDispel(@Nullable LivingEntity caster) { } @Override - public void addAdditionalSaveData(CompoundTag tag) { + public void addAdditionalSaveData(@NotNull CompoundTag tag) { super.addAdditionalSaveData(tag); if (getOwnerID() != null) tag.putUUID("ownerID", getOwnerID()); tag.putBoolean("terminated", terminatedFamiliar); tag.put("familiarData", getPersistentFamiliarData().toTag(level)); - if(holderID != null) { + if (holderID != null) { tag.putString("holderID", holderID.toString()); } tag.putString("color", this.entityData.get(COLOR)); @@ -241,7 +248,7 @@ public void addAdditionalSaveData(CompoundTag tag) { } @Override - public void readAdditionalSaveData(CompoundTag tag) { + public void readAdditionalSaveData(@NotNull CompoundTag tag) { super.readAdditionalSaveData(tag); if (tag.hasUUID("ownerID")) setOwnerID(tag.getUUID("ownerID")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java index 9f59525338..4a49fe352d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java @@ -21,6 +21,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.Tags; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.animation.RawAnimation; @@ -44,7 +45,7 @@ public void tick() { } @Override - protected InteractionResult mobInteract(Player player, InteractionHand hand) { + protected @NotNull InteractionResult mobInteract(@NotNull Player player, @NotNull InteractionHand hand) { if (!player.level.isClientSide && player.equals(getOwner())) { ItemStack stack = player.getItemInHand(hand); if (stack.is(Tags.Items.NUGGETS_GOLD)) { @@ -73,7 +74,7 @@ public PlayState walkPredicate(AnimationState event) { } @Override - protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + protected void defineSynchedData(SynchedEntityData.@NotNull Builder pBuilder) { super.defineSynchedData(pBuilder); } @@ -86,7 +87,7 @@ public ResourceLocation getTexture(FamiliarEntity entity) { } @Override - public EntityType getType() { + public @NotNull EntityType getType() { return ModEntities.ENTITY_FAMILIAR_STARBUNCLE.get(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java index dd80158ec8..baded77228 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java @@ -34,9 +34,8 @@ import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.common.brewing.BrewingRecipe; import net.neoforged.neoforge.event.entity.living.MobEffectEvent; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.animation.RawAnimation; import java.util.ArrayList; @@ -52,7 +51,7 @@ public FamiliarWixie(EntityType ent, Level world) { @Override - protected InteractionResult mobInteract(Player player, InteractionHand hand) { + protected @NotNull InteractionResult mobInteract(@NotNull Player player, @NotNull InteractionHand hand) { if (level().isClientSide || hand != InteractionHand.MAIN_HAND) return InteractionResult.SUCCESS; @@ -64,15 +63,15 @@ protected InteractionResult mobInteract(Player player, InteractionHand hand) { return InteractionResult.SUCCESS; setColor(color); return InteractionResult.SUCCESS; - }else{ + } else { for (BrewingRecipe r : ArsNouveauAPI.getInstance().getAllPotionRecipes(level())) { ItemStack water = PotionUtil.getPotion(Potions.WATER); ItemStack awkward = PotionUtil.getPotion(Potions.AWKWARD); - if(r.isIngredient(stack) && (r.getInput().test(awkward) || r.getInput().test(water))){ + if (r.isIngredient(stack) && (r.getInput().test(awkward) || r.getInput().test(water))) { PotionContents contents = PotionUtil.getContents(r.getOutput()); - if(!PotionUtil.isEmpty(contents)){ + if (!PotionUtil.isEmpty(contents)) { PotionUtil.applyContents(contents, player, player, player); ItemStack potionStack = new ItemStack(Items.POTION); potionStack.set(DataComponents.POTION_CONTENTS, contents); @@ -89,15 +88,15 @@ protected InteractionResult mobInteract(Player player, InteractionHand hand) { } public void potionEvent(MobEffectEvent.Added event) { - if (!isAlive()) + if (!isAlive() || event.getEffectInstance() == null) return; Entity target = event.getEntity(); Entity applier = event.getEffectSource(); boolean isBeneficialOwner = target.equals(getOwner()) && event.getEffectInstance().getEffect().value().isBeneficial(); boolean isApplierOwner = applier != null && applier.equals(this.getOwner()); - if(isBeneficialOwner || isApplierOwner){ - event.getEffectInstance().getCures(); + if (isBeneficialOwner || isApplierOwner) { + //event.getEffectInstance().getCures(); why is this here Jarva event.getEffectInstance().mapDuration(duration -> duration + duration * 2); } } @@ -116,18 +115,13 @@ public void tick() { } @Override - public PlayState walkPredicate(AnimationState event) { - return PlayState.CONTINUE; - } - - @Override - public EntityType getType() { + public @NotNull EntityType getType() { return ModEntities.ENTITY_FAMILIAR_WIXIE.get(); } @Override public void startAnimation(int arg) { - if(controller == null) + if (controller == null) return; if (arg == EntityWixie.Animations.CAST.ordinal()) { controller.forceAnimationReset(); @@ -140,7 +134,7 @@ public ResourceLocation getTexture(FamiliarEntity entity) { String color = getColor().toLowerCase(); if (color.isEmpty()) color = "blue"; - return ArsNouveau.prefix( "textures/entity/wixie_" + color + ".png"); + return ArsNouveau.prefix("textures/entity/wixie_" + color + ".png"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index 4e7ec77107..bee1b7099b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -71,6 +71,7 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.ClientTickEvent; +import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.event.AddReloadListenerEvent; import net.neoforged.neoforge.event.RegisterCommandsEvent; import net.neoforged.neoforge.event.entity.EntityTravelToDimensionEvent; @@ -82,6 +83,7 @@ import net.neoforged.neoforge.event.tick.ServerTickEvent; import net.neoforged.neoforge.event.village.VillagerTradesEvent; import net.neoforged.neoforge.items.ItemHandlerHelper; +import org.jetbrains.annotations.NotNull; import java.util.*; @@ -93,12 +95,12 @@ public class EventHandler { public static void resourceLoadEvent(AddReloadListenerEvent event) { event.addListener(new SimplePreparableReloadListener<>() { @Override - protected Object prepare(ResourceManager pResourceManager, ProfilerFiller pProfiler) { + protected Object prepare(@NotNull ResourceManager pResourceManager, ProfilerFiller pProfiler) { return null; } @Override - protected void apply(Object pObject, ResourceManager pResourceManager, ProfilerFiller pProfiler) { + protected void apply(@NotNull Object pObject, @NotNull ResourceManager pResourceManager, @NotNull ProfilerFiller pProfiler) { MultiRecipeWrapper.RECIPE_CACHE = new HashMap<>(); EffectWololo.recipeCache = new FixedStack<>(EffectWololo.MAX_RECIPE_CACHE); ArsNouveauAPI.getInstance().onResourceReload(); @@ -168,7 +170,8 @@ public static void livingSpawnEvent(FinalizeSpawnEvent checkSpawn) { @SubscribeEvent public static void jumpEvent(LivingEvent.LivingJumpEvent e) { - if (e.getEntity() != null && e.getEntity().hasEffect(ModPotions.SNARE_EFFECT)) { + e.getEntity(); + if (e.getEntity().hasEffect(ModPotions.SNARE_EFFECT)) { e.getEntity().setDeltaMovement(0, 0, 0); return; } @@ -215,9 +218,9 @@ public static void onGlideTick(PlayerTickEvent.Pre event) { } if (player.hasEffect(ModPotions.FLIGHT_EFFECT) - && player.level.getGameTime() % 20 == 0 - && player.getEffect(ModPotions.FLIGHT_EFFECT).getDuration() <= 30 * 20 - && player instanceof ServerPlayer serverPlayer) { + && player.level.getGameTime() % 20 == 0 + && player.getEffect(ModPotions.FLIGHT_EFFECT).getDuration() <= 30 * 20 + && player instanceof ServerPlayer serverPlayer) { RitualEventQueue.getRitual(player.level, RitualFlight.class, flight -> flight.attemptRefresh(serverPlayer)); } @@ -252,10 +255,8 @@ public static void entityHurt(LivingDamageEvent.Pre e) { container.setNewDamage(Math.max(0, damage)); } LivingEntity entity = e.getEntity(); - if (entity == null) - return; if (entity.hasEffect(ModPotions.HEX_EFFECT) - && (entity.hasEffect(MobEffects.POISON) + && (entity.hasEffect(MobEffects.POISON) || entity.hasEffect(MobEffects.WITHER) || entity.isOnFire() || entity.hasEffect(ModPotions.SHOCKED_EFFECT) @@ -264,7 +265,7 @@ public static void entityHurt(LivingDamageEvent.Pre e) { } double warding = PerkUtil.valueOrZero(entity, PerkAttributes.WARDING); double feather = PerkUtil.valueOrZero(entity, PerkAttributes.FEATHER); - if (source.is(DamageTypes.MAGIC)) { + if (source.is(Tags.DamageTypes.IS_MAGIC)) { container.setNewDamage((float) (amount - warding)); } @@ -285,11 +286,11 @@ public static void fallEvent(LivingFallEvent fallEvent) { @SubscribeEvent public static void entityHeal(LivingHealEvent e) { LivingEntity entity = e.getEntity(); - if (entity != null && entity.hasEffect(ModPotions.HEX_EFFECT)) { + if (entity.hasEffect(ModPotions.HEX_EFFECT)) { e.setAmount(e.getAmount() / 2.0f); } - if (entity != null && entity.hasEffect(ModPotions.RECOVERY_EFFECT)) { + if (entity.hasEffect(ModPotions.RECOVERY_EFFECT)) { e.setAmount(e.getAmount() + 1 + entity.getEffect(ModPotions.RECOVERY_EFFECT).getAmplifier()); } } @@ -304,7 +305,7 @@ public static void eatEvent(LivingEntityUseItemEvent.Finish event) { } } - private static void replaceEntityWithItems(ServerLevel level, Entity entity, ItemStack ...items) { + private static void replaceEntityWithItems(ServerLevel level, Entity entity, ItemStack... items) { entity.remove(Entity.RemovalReason.KILLED); ParticleUtil.spawnPoof(level, entity.blockPosition()); for (ItemStack item : items) { @@ -354,36 +355,34 @@ public static void registerTrades(VillagerTradesEvent event) { List level4 = trades.get(4); List level5 = trades.get(5); - level1.add((trader, rand) -> itemToEmer(trader,BlockRegistry.SOURCEBERRY_BUSH, 16, 16, 2)); - level1.add((trader, rand) -> itemToEmer(trader,ItemsRegistry.MAGE_FIBER, 16, 16, 2)); + level1.add((trader, rand) -> itemToEmer(trader, BlockRegistry.SOURCEBERRY_BUSH, 16, 16, 2)); + level1.add((trader, rand) -> itemToEmer(trader, ItemsRegistry.MAGE_FIBER, 16, 16, 2)); for (ItemStack fruit : Ingredient.of(ItemTagProvider.SHADY_WIZARD_FRUITS).getItems()) { - level1.add((trader, rand) -> itemToEmer(trader,fruit.getItem(), 6, 16, 2)); + level1.add((trader, rand) -> itemToEmer(trader, fruit.getItem(), 6, 16, 2)); } - level1.add((trader, rand) -> itemToEmer(trader,Items.AMETHYST_SHARD, 32, 16, 2)); + level1.add((trader, rand) -> itemToEmer(trader, Items.AMETHYST_SHARD, 32, 16, 2)); - level1.add((trader, rand) -> emerToItem(trader,ItemsRegistry.SOURCE_BERRY_ROLL, 4, 16, 2)); + level1.add((trader, rand) -> emerToItem(trader, ItemsRegistry.SOURCE_BERRY_ROLL, 4, 16, 2)); - level2.add((trader, rand) -> emerToItem(trader,BlockRegistry.GHOST_WEAVE, 1, 8, 2)); - level2.add((trader, rand) -> emerToItem(trader,BlockRegistry.MIRROR_WEAVE, 1, 8, 2)); - level2.add((trader, rand) -> emerToItem(trader,BlockRegistry.FALSE_WEAVE, 1, 8, 2)); - level2.add((trader, rand) -> emerToItem(trader,ItemsRegistry.WARP_SCROLL, 1, 8, 2)); + level2.add((trader, rand) -> emerToItem(trader, BlockRegistry.GHOST_WEAVE, 1, 8, 2)); + level2.add((trader, rand) -> emerToItem(trader, BlockRegistry.MIRROR_WEAVE, 1, 8, 2)); + level2.add((trader, rand) -> emerToItem(trader, BlockRegistry.FALSE_WEAVE, 1, 8, 2)); + level2.add((trader, rand) -> emerToItem(trader, ItemsRegistry.WARP_SCROLL, 1, 8, 2)); for (ItemStack wilden : Ingredient.of(ItemTagProvider.WILDEN_DROP_TAG).getItems()) { - level2.add((trader, rand) -> itemToEmer(trader,wilden.getItem(), 4, 8, 12)); + level2.add((trader, rand) -> itemToEmer(trader, wilden.getItem(), 4, 8, 12)); } List tablets = new ArrayList<>(RitualRegistry.getRitualItemMap().values()); for (RitualTablet tablet : tablets) { - if (new ItemStack(tablet).is(ItemTagProvider.RITUAL_TRADE_BLACKLIST)) continue; - if (tablet.ritual.canBeTraded()) { - level3.add((trader, rand) -> emerToItem(trader,tablet, 4, 1, 12)); - } + if (tablet.getDefaultInstance().is(ItemTagProvider.RITUAL_TRADE_BLACKLIST)) continue; + level3.add((trader, rand) -> emerToItem(trader, tablet, 4, 1, 12)); } for (ItemStack shard : Ingredient.of(ItemTagProvider.SUMMON_SHARDS_TAG).getItems()) { - level4.add((trader, rand) -> emerToItem(trader,shard.getItem(), 20, 1, 20)); + level4.add((trader, rand) -> emerToItem(trader, shard.getItem(), 20, 1, 20)); } level5.add((trader, rand) -> emerToItem(trader, ItemsRegistry.SOURCE_BERRY_PIE, 4, 8, 2)); level5.add((trader, rand) -> new MerchantOffer(new ItemCost(Items.EMERALD, 48), DungeonLootTables.getRandomItem(DungeonLootTables.RARE_LOOT), 1, 20, 0.2F)); @@ -395,7 +394,7 @@ public static MerchantOffer emerToItem(Entity trader, ItemLike itemLike, int cos return new VillagerTrades.ItemsForEmeralds(itemLike.asItem(), cost, uses, exp).getOffer(trader, trader.getRandom()); } - public static MerchantOffer itemToEmer(Entity trader,ItemLike itemLike, int cost, int uses, int exp) { + public static MerchantOffer itemToEmer(Entity trader, ItemLike itemLike, int cost, int uses, int exp) { return new VillagerTrades.EmeraldForItems(itemLike.asItem(), cost, uses, exp).getOffer(trader, trader.getRandom()); } @@ -427,7 +426,7 @@ public static void onPotionAdd(MobEffectEvent.Added event) { event.getEffectInstance().duration = (int) (event.getEffectInstance().duration * bonus); } - if(holder.is(PotionEffectTags.TO_SYNC)){ + if (holder.is(PotionEffectTags.TO_SYNC)) { Networking.sendToNearbyClient(target.level(), target, new PotionSyncPacket(target.getId(), effect, event.getEffectInstance().getDuration())); } } @@ -447,7 +446,7 @@ private static void syncPotionRemoval(MobEffectEvent event) { LivingEntity target = event.getEntity(); Holder holder = event.getEffectInstance().getEffect(); MobEffect effect = holder.value(); - if(holder.is(PotionEffectTags.TO_SYNC)){ + if (holder.is(PotionEffectTags.TO_SYNC)) { Networking.sendToNearbyClient(target.level(), target, new PotionSyncPacket(target.getId(), effect, -1)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java index d0bc0c9fe6..9d173223b5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlchemistsCrown.java @@ -20,6 +20,7 @@ import net.minecraft.world.item.alchemy.PotionContents; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -31,7 +32,7 @@ public AlchemistsCrown(Properties properties) { } @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); tooltip2.add(Component.translatable("ars_nouveau.tooltip.alchemists_crown", KeyMapping.createNameSupplier(ModKeyBindings.HEAD_CURIO_HOTKEY.getName()).get())); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java index 450ff54904..198135401a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java @@ -18,7 +18,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collection; @@ -41,7 +41,7 @@ public int getUnlockLevelCost(Collection spellParts) { } @Override - public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) { + public @NotNull InteractionResultHolder use(@NotNull Level pLevel, Player pPlayer, @NotNull InteractionHand pUsedHand) { if (pPlayer.level.isClientSide) return super.use(pLevel, pPlayer, pUsedHand); ItemStack stack = pPlayer.getItemInHand(pUsedHand); @@ -107,7 +107,7 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte } @Override - public void appendHoverText(ItemStack stack, @Nullable Item.TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, Item.@NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); stack.addToTooltip(DataComponentRegistry.CODEX_DATA, context, tooltip2::add, flagIn); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java index 2285e1233c..37795eb08d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java @@ -22,8 +22,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; import java.util.List; import java.util.Optional; @@ -43,7 +43,7 @@ public boolean onScribe(Level world, BlockPos pos, Player player, InteractionHan } @Override - public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { + public @NotNull InteractionResultHolder use(@NotNull Level worldIn, Player playerIn, @NotNull InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); AbstractCaster caster = getSpellCaster(stack); Spell spell = caster.getSpell(); @@ -51,9 +51,7 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In } @Override - public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { - if (context == null) - return; + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { AbstractCaster caster = getSpellCaster(stack); if (Config.GLYPH_TOOLTIPS.get() || Screen.hasShiftDown()) { @@ -77,7 +75,7 @@ public int getManaDiscount(ItemStack i, Spell spell) { } @Override - public Optional getTooltipImage(ItemStack pStack) { + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { AbstractCaster caster = getSpellCaster(pStack); if (!Screen.hasShiftDown() && Config.GLYPH_TOOLTIPS.get() && !caster.isSpellHidden() && !caster.getSpell().isEmpty()) return Optional.of(new SpellTooltip(caster)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java index 093a36aefa..b2a93c6acf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java @@ -23,6 +23,7 @@ import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -33,7 +34,7 @@ public DominionWand() { } @Override - public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pSlotId, boolean pIsSelected) { + public void inventoryTick(@NotNull ItemStack pStack, @NotNull Level pLevel, @NotNull Entity pEntity, int pSlotId, boolean pIsSelected) { super.inventoryTick(pStack, pLevel, pEntity, pSlotId, pIsSelected); if (!pIsSelected || pLevel.isClientSide || pLevel.getGameTime() % 5 != 0) { return; @@ -52,7 +53,7 @@ public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pS } @Override - public InteractionResult interactLivingEntity(ItemStack doNotUseStack, Player playerEntity, LivingEntity target, InteractionHand hand) { + public @NotNull InteractionResult interactLivingEntity(@NotNull ItemStack doNotUseStack, Player playerEntity, @NotNull LivingEntity target, @NotNull InteractionHand hand) { if (playerEntity.level.isClientSide || hand != InteractionHand.MAIN_HAND) return InteractionResult.PASS; @@ -88,7 +89,7 @@ public InteractionResult interactLivingEntity(ItemStack doNotUseStack, Player pl return InteractionResult.SUCCESS; } - public boolean doesSneakBypassUse(ItemStack stack, LevelReader world, BlockPos pos, Player player) { + public boolean doesSneakBypassUse(@NotNull ItemStack stack, @NotNull LevelReader world, @NotNull BlockPos pos, @NotNull Player player) { return false; } @@ -101,7 +102,7 @@ public void clear(ItemStack stack, Player player) { } @Override - public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) { + public @NotNull InteractionResultHolder use(@NotNull Level pLevel, Player pPlayer, @NotNull InteractionHand pUsedHand) { ItemStack stack = pPlayer.getItemInHand(pUsedHand); DominionWandData data = stack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()); if (pPlayer.isShiftKeyDown() && !data.hasStoredData()) { @@ -112,7 +113,7 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte } @Override - public InteractionResult useOn(UseOnContext context) { + public @NotNull InteractionResult useOn(UseOnContext context) { if (context.getLevel().isClientSide || context.getPlayer() == null) return super.useOn(context); BlockPos pos = context.getClickedPos(); @@ -152,14 +153,14 @@ public InteractionResult useOn(UseOnContext context) { } @Override - public String getDescriptionId(ItemStack pStack) { + public @NotNull String getDescriptionId(ItemStack pStack) { DominionWandData data = pStack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()); if (data.strict()) return super.getDescriptionId(pStack) + ".strict"; return super.getDescriptionId(pStack); } @Override - public void appendHoverText(ItemStack stack, TooltipContext world, List tooltip, TooltipFlag p_77624_4_) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext world, @NotNull List tooltip, @NotNull TooltipFlag p_77624_4_) { DominionWandData data = stack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()); if (data.storedEntityId() == DominionWandData.NULL_ENTITY) { tooltip.add(Component.translatable("ars_nouveau.dominion_wand.no_entity")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EarthEssence.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EarthEssence.java index 09f2d905bd..53b01dda10 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EarthEssence.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EarthEssence.java @@ -9,6 +9,7 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.block.Blocks; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -20,7 +21,7 @@ public EarthEssence() { } @Override - public InteractionResult useOn(UseOnContext pContext) { + public @NotNull InteractionResult useOn(UseOnContext pContext) { if (pContext.getPlayer().level.isClientSide) { return super.useOn(pContext); @@ -35,7 +36,7 @@ public InteractionResult useOn(UseOnContext pContext) { } @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); tooltip2.add(Component.translatable("ars_nouveau.earth_essence.tooltip").withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java index 39ca436616..43224f9b7b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java @@ -17,8 +17,9 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; -import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.client.GeoRenderProvider; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; @@ -50,7 +51,7 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { + public @NotNull InteractionResultHolder use(@NotNull Level worldIn, Player playerIn, @NotNull InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); AbstractCaster caster = getSpellCaster(stack); return caster.castSpell(worldIn, playerIn, handIn, Component.translatable("ars_nouveau.mirror.invalid"), caster.getSpell()); @@ -80,7 +81,7 @@ public void scribeModifiedSpell(AbstractCaster caster, Player player, Interac } @Override - public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { getInformation(stack, context, tooltip2, flagIn); new SpellStats.Builder().addDurationModifier(1.0).build().addTooltip(tooltip2); super.appendHoverText(stack, context, tooltip2, flagIn); @@ -93,15 +94,16 @@ public SpellStats.Builder applyItemModifiers(ItemStack stack, SpellStats.Builder } @Override - public void initializeClient(Consumer consumer) { - super.initializeClient(consumer); - consumer.accept(new IClientItemExtensions() { + public void createGeoRenderer(Consumer consumer) { + consumer.accept(new GeoRenderProvider() { + private final BlockEntityWithoutLevelRenderer renderer = new MirrorRenderer(); @Override - public BlockEntityWithoutLevelRenderer getCustomRenderer() { + public @NotNull BlockEntityWithoutLevelRenderer getGeoItemRenderer() { return renderer; } }); } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersShield.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersShield.java index 6b06bde979..1d29a6cefd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersShield.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersShield.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.common.items; -import com.hollingsworth.arsnouveau.client.renderer.item.FixedGeoItemRenderer; import com.hollingsworth.arsnouveau.client.renderer.item.ShieldModel; import com.hollingsworth.arsnouveau.common.perk.RepairingPerk; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; @@ -11,10 +10,12 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ShieldItem; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.client.GeoRenderProvider; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.function.Consumer; @@ -32,14 +33,14 @@ public EnchantersShield(Properties p_i48470_1_) { } @Override - public void inventoryTick(ItemStack stack, Level world, Entity entity, int p_77663_4_, boolean p_77663_5_) { + public void inventoryTick(@NotNull ItemStack stack, @NotNull Level world, @NotNull Entity entity, int p_77663_4_, boolean p_77663_5_) { super.inventoryTick(stack, world, entity, p_77663_4_, p_77663_5_); if(entity instanceof Player player) RepairingPerk.attemptRepair(stack, player); } @Override - public InteractionResultHolder use(Level p_77659_1_, Player p_77659_2_, InteractionHand p_77659_3_) { + public @NotNull InteractionResultHolder use(@NotNull Level p_77659_1_, @NotNull Player p_77659_2_, @NotNull InteractionHand p_77659_3_) { return super.use(p_77659_1_, p_77659_2_, p_77659_3_); } @@ -55,20 +56,20 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { + public boolean shouldCauseReequipAnimation(@NotNull ItemStack oldStack, @NotNull ItemStack newStack, boolean slotChanged) { return false; } @Override - public void initializeClient(Consumer consumer) { - super.initializeClient(consumer); - consumer.accept(new IClientItemExtensions() { - private final BlockEntityWithoutLevelRenderer renderer = new FixedGeoItemRenderer(new ShieldModel()); + public void createGeoRenderer(Consumer consumer) { + consumer.accept(new GeoRenderProvider() { + private final BlockEntityWithoutLevelRenderer renderer = new GeoItemRenderer<>(new ShieldModel()); @Override - public BlockEntityWithoutLevelRenderer getCustomRenderer() { + public BlockEntityWithoutLevelRenderer getGeoItemRenderer() { return renderer; } }); } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java index 10c99a3c0d..0cee1e60d0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java @@ -25,8 +25,9 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.client.GeoRenderProvider; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; @@ -48,7 +49,7 @@ public EnchantersSword(Tier iItemTier, int baseDamage, float baseAttackSpeed, Pr } @Override - public void inventoryTick(ItemStack stack, Level world, Entity entity, int p_77663_4_, boolean p_77663_5_) { + public void inventoryTick(@NotNull ItemStack stack, @NotNull Level world, @NotNull Entity entity, int p_77663_4_, boolean p_77663_5_) { super.inventoryTick(stack, world, entity, p_77663_4_, p_77663_5_); if(entity instanceof Player player) RepairingPerk.attemptRepair(stack, player); @@ -74,7 +75,7 @@ public void scribeModifiedSpell(AbstractCaster caster, Player player, Interac } @Override - public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity entity) { + public boolean hurtEnemy(@NotNull ItemStack stack, LivingEntity target, @NotNull LivingEntity entity) { AbstractCaster caster = getSpellCaster(stack); IWrappedCaster wrappedCaster = entity instanceof Player player ? new PlayerCaster(player) : new LivingCaster(entity); SpellContext context = new SpellContext(entity.level, caster.modifySpellBeforeCasting(target.level, entity, InteractionHand.MAIN_HAND, caster.getSpell()), entity, wrappedCaster, stack); @@ -85,7 +86,7 @@ public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity enti } @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { getInformation(stack, context, tooltip2, flagIn); super.appendHoverText(stack, context, tooltip2, flagIn); } @@ -102,12 +103,12 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public void initializeClient(Consumer consumer) { - super.initializeClient(consumer); - consumer.accept(new IClientItemExtensions() { - private final BlockEntityWithoutLevelRenderer renderer = new SwordRenderer(); + public void createGeoRenderer(Consumer consumer) { + consumer.accept(new GeoRenderProvider() { + final SwordRenderer renderer = new SwordRenderer(); - public BlockEntityWithoutLevelRenderer getCustomRenderer() { + @Override + public BlockEntityWithoutLevelRenderer getGeoItemRenderer() { return renderer; } }); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FamiliarScript.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FamiliarScript.java index bd6f277649..10aef9709f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FamiliarScript.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FamiliarScript.java @@ -10,6 +10,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -30,7 +31,7 @@ public FamiliarScript() { } @Override - public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { + public @NotNull InteractionResultHolder use(Level worldIn, @NotNull Player playerIn, @NotNull InteractionHand handIn) { if (worldIn.isClientSide || handIn != InteractionHand.MAIN_HAND) return super.use(worldIn, playerIn, handIn); @@ -49,12 +50,12 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In } @Override - public Component getName(ItemStack pStack) { + public @NotNull Component getName(@NotNull ItemStack pStack) { return Component.translatable("ars_nouveau.bound_script", familiar.getLangName().getString()); } @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { tooltip2.add(Component.translatable("ars_nouveau.familiar.script")); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FireEssence.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FireEssence.java index f800a8f71c..f5e35f962a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FireEssence.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FireEssence.java @@ -6,6 +6,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.crafting.RecipeType; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -18,12 +19,12 @@ public FireEssence() { } @Override - public int getBurnTime(ItemStack itemStack, @Nullable RecipeType recipeType) { + public int getBurnTime(@NotNull ItemStack itemStack, @Nullable RecipeType recipeType) { return 200 * 20; // 200 seconds } @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); tooltip2.add(Component.translatable("ars_nouveau.fire_essence.tooltip").withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java index 08327d28ff..04f505a906 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/FlaskCannon.java @@ -38,8 +38,9 @@ import net.minecraft.world.level.LevelReader; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.client.GeoRenderProvider; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; @@ -55,12 +56,12 @@ public FlaskCannon(Properties properties) { @Override - public InteractionResult interactLivingEntity(ItemStack pStack, Player pPlayer, LivingEntity pInteractionTarget, InteractionHand pUsedHand) { + public @NotNull InteractionResult interactLivingEntity(@NotNull ItemStack pStack, @NotNull Player pPlayer, @NotNull LivingEntity pInteractionTarget, @NotNull InteractionHand pUsedHand) { return InteractionResult.FAIL; } @Override - public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pSlotId, boolean pIsSelected) { + public void inventoryTick(@NotNull ItemStack pStack, @NotNull Level pLevel, @NotNull Entity pEntity, int pSlotId, boolean pIsSelected) { super.inventoryTick(pStack, pLevel, pEntity, pSlotId, pIsSelected); if(pLevel.isClientSide) return; @@ -77,7 +78,7 @@ public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pS } } - public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pHand) { + public @NotNull InteractionResultHolder use(Level pLevel, Player pPlayer, @NotNull InteractionHand pHand) { ItemStack itemstack = pPlayer.getItemInHand(pHand); PotionLauncherData potionLauncherData = itemstack.get(DataComponentRegistry.POTION_LAUNCHER); if(pLevel.isClientSide) @@ -105,12 +106,12 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte public abstract ItemStack getThrownStack(Level pLevel, Player pPlayer, InteractionHand pHand, ItemStack launcherStack); @Override - public boolean doesSneakBypassUse(ItemStack stack, LevelReader world, BlockPos pos, Player player) { + public boolean doesSneakBypassUse(@NotNull ItemStack stack, @NotNull LevelReader world, @NotNull BlockPos pos, @NotNull Player player) { return true; } @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { + public boolean shouldCauseReequipAnimation(@NotNull ItemStack oldStack, @NotNull ItemStack newStack, boolean slotChanged) { return false; } @@ -168,16 +169,16 @@ public ItemStack getThrownStack(Level pLevel, Player pPlayer, InteractionHand pH } @Override - public void initializeClient(Consumer consumer) { - super.initializeClient(consumer); - consumer.accept(new IClientItemExtensions() { + public void createGeoRenderer(Consumer consumer) { + consumer.accept(new GeoRenderProvider() { private final BlockEntityWithoutLevelRenderer renderer = new FlaskCannonRenderer(new GenericModel<>("splash_flask_cannon", "item").withEmptyAnim()); - public BlockEntityWithoutLevelRenderer getCustomRenderer() { + public BlockEntityWithoutLevelRenderer getGeoItemRenderer() { return renderer; } }); } + } public static class LingeringLauncher extends FlaskCannon { @@ -195,17 +196,18 @@ public ItemStack getThrownStack(Level pLevel, Player pPlayer, InteractionHand pH return splashStack; } + @Override - public void initializeClient(Consumer consumer) { - super.initializeClient(consumer); - consumer.accept(new IClientItemExtensions() { + public void createGeoRenderer(Consumer consumer) { + consumer.accept(new GeoRenderProvider() { private final BlockEntityWithoutLevelRenderer renderer = new FlaskCannonRenderer(new GenericModel<>("lingering_flask_cannon", "item").withEmptyAnim()); - public BlockEntityWithoutLevelRenderer getCustomRenderer() { + public BlockEntityWithoutLevelRenderer getGeoItemRenderer() { return renderer; } }); } + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java index d8ba5175aa..54ed321703 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java @@ -20,8 +20,8 @@ import net.minecraft.world.level.Level; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; import java.util.List; public class Glyph extends ModItem { @@ -33,7 +33,7 @@ public Glyph(AbstractSpellPart part) { } @Override - public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { + public @NotNull InteractionResultHolder use(Level worldIn, @NotNull Player playerIn, @NotNull InteractionHand handIn) { if (worldIn.isClientSide) return super.use(worldIn, playerIn, handIn); @@ -56,13 +56,13 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In } @Override - public Component getName(ItemStack pStack) { + public @NotNull Component getName(@NotNull ItemStack pStack) { return Component.translatable("ars_nouveau.glyph_of", this.spellPart.getLocaleName()); } @Override @OnlyIn(Dist.CLIENT) - public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { if (spellPart == null) return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java index e53faa9099..a0047303f4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ItemScroll.java @@ -14,7 +14,7 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.neoforged.neoforge.items.IItemHandler; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -31,7 +31,7 @@ public ItemScroll(Properties properties) { public abstract SortPref getSortPref(ItemStack stackToStore, ItemStack scrollStack, IItemHandler inventory); @Override - public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) { + public @NotNull InteractionResultHolder use(@NotNull Level pLevel, @NotNull Player pPlayer, @NotNull InteractionHand pUsedHand) { if(pUsedHand == InteractionHand.MAIN_HAND && !pLevel.isClientSide){ ItemStack thisStack = pPlayer.getItemInHand(pUsedHand); ItemStack otherStack = pPlayer.getItemInHand(InteractionHand.OFF_HAND); @@ -61,7 +61,7 @@ public boolean onScribe(Level world, BlockPos pos, Player player, InteractionHan } @Override - public void appendHoverText(ItemStack stack, @Nullable Item.TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, Item.@NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); stack.addToTooltip(DataComponentRegistry.ITEM_SCROLL_DATA, context, tooltip2::add, flagIn); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ManipulationEssence.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ManipulationEssence.java index 0122a317dd..f223a32b1b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ManipulationEssence.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ManipulationEssence.java @@ -5,6 +5,7 @@ import net.minecraft.network.chat.Style; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -16,7 +17,7 @@ public ManipulationEssence() { } @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); tooltip2.add(Component.translatable("ars_nouveau.manipulation_essence.tooltip").withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java index c0bd978d40..8ddee4fca1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/MobJarItem.java @@ -16,8 +16,9 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.client.GeoRenderProvider; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; @@ -30,13 +31,13 @@ public MobJarItem(Block pBlock, Properties pProperties) { super(pBlock, pProperties); } + @Override - public void initializeClient(Consumer consumer) { - super.initializeClient(consumer); - consumer.accept(new IClientItemExtensions() { - MobJarItemRenderer renderer = new MobJarItemRenderer(); + public void createGeoRenderer(Consumer consumer) { + consumer.accept(new GeoRenderProvider() { + final MobJarItemRenderer renderer = new MobJarItemRenderer(); @Override - public BlockEntityWithoutLevelRenderer getCustomRenderer() { + public BlockEntityWithoutLevelRenderer getGeoItemRenderer() { return renderer; } }); @@ -54,10 +55,8 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public void appendHoverText(ItemStack stack, TooltipContext pLevel, List pTooltip, TooltipFlag pFlag) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext pLevel, @NotNull List pTooltip, @NotNull TooltipFlag pFlag) { super.appendHoverText(stack, pLevel, pTooltip, pFlag); - if(pLevel == null) - return; Entity entity = fromItem(stack, ArsNouveau.proxy.getClientWorld()); if(entity == null) return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java index 92ca6e2abf..add1be700d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ModItem.java @@ -7,8 +7,8 @@ import net.minecraft.world.item.TooltipFlag; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -48,7 +48,7 @@ protected static Properties defaultProps(){ */ @OnlyIn(Dist.CLIENT) @Override - public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); if (tooltip != null && !tooltip.isEmpty()) { tooltip2.addAll(tooltip); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/PerkItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/PerkItem.java index ab7765360d..d0101b3d11 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/PerkItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/PerkItem.java @@ -9,8 +9,8 @@ import net.minecraft.world.item.TooltipFlag; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; import java.util.List; public class PerkItem extends ModItem { @@ -27,13 +27,13 @@ public PerkItem(IPerk perk) { } @Override - public Component getName(ItemStack pStack) { + public @NotNull Component getName(@NotNull ItemStack pStack) { return Component.literal(perk.getName()); } @Override @OnlyIn(Dist.CLIENT) - public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { if (perk == null) return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java index 06b28bd876..9cd71871a1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/PotionFlask.java @@ -22,7 +22,6 @@ import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; import java.util.List; public abstract class PotionFlask extends ModItem { @@ -39,7 +38,7 @@ public PotionFlask(Item.Properties props) { } @Override - public InteractionResult useOn(UseOnContext context) { + public @NotNull InteractionResult useOn(UseOnContext context) { if (context.getLevel().isClientSide || !(context.getLevel().getBlockEntity(context.getClickedPos()) instanceof PotionJarTile jarTile)) return super.useOn(context); @@ -77,7 +76,7 @@ public int getMaxCapacity() { } @Override - public ItemStack finishUsingItem(ItemStack stack, Level worldIn, LivingEntity entityLiving) { + public @NotNull ItemStack finishUsingItem(@NotNull ItemStack stack, Level worldIn, @NotNull LivingEntity entityLiving) { Player playerentity = entityLiving instanceof Player player ? player : null; if (!worldIn.isClientSide) { @@ -106,45 +105,45 @@ public int getDamage(ItemStack stack) { } @Override - public int getMaxDamage(ItemStack stack) { + public int getMaxDamage(@NotNull ItemStack stack) { return getMaxCapacity(); } @Override - public boolean isDamaged(ItemStack stack) { + public boolean isDamaged(@NotNull ItemStack stack) { return false; } @Override - public boolean isBarVisible(ItemStack pStack) { + public boolean isBarVisible(@NotNull ItemStack pStack) { return true; } @Override - public float getXpRepairRatio(ItemStack stack) { + public float getXpRepairRatio(@NotNull ItemStack stack) { return 0.0f; } @Override - public int getUseDuration(ItemStack pStack, LivingEntity p_344979_) { + public int getUseDuration(@NotNull ItemStack pStack, @NotNull LivingEntity p_344979_) { return 32; } /** * returns the action that specifies what animation to play when the items is being used */ - public UseAnim getUseAnimation(ItemStack stack) { + public @NotNull UseAnim getUseAnimation(@NotNull ItemStack stack) { return UseAnim.DRINK; } - public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { + public @NotNull InteractionResultHolder use(@NotNull Level worldIn, Player playerIn, @NotNull InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); MultiPotionContents data = stack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY, 8)); return data.charges() > 0 ? ItemUtils.startUsingInstantly(worldIn, playerIn, handIn) : InteractionResultHolder.pass(playerIn.getItemInHand(handIn)); } @Override - public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip, @NotNull TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip, flagIn); MultiPotionContents data = stack.getOrDefault(DataComponentRegistry.MULTI_POTION, new MultiPotionContents(0, PotionContents.EMPTY, 8)); tooltip.add(Component.translatable("ars_nouveau.flask.charges", data.charges()).withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Present.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Present.java index fec1bad80f..3d1827b45a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Present.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Present.java @@ -15,6 +15,7 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.Optional; @@ -26,17 +27,17 @@ public Present(Properties properties) { } @Override - public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pSlotId, boolean pIsSelected) { + public void inventoryTick(@NotNull ItemStack pStack, @NotNull Level pLevel, @NotNull Entity pEntity, int pSlotId, boolean pIsSelected) { super.inventoryTick(pStack, pLevel, pEntity, pSlotId, pIsSelected); if(pLevel.isClientSide) return; if(pEntity instanceof Player player && !pStack.has(DataComponentRegistry.PRESENT)){ - pStack.set(DataComponentRegistry.PRESENT, new PresentData(player.getName().getString(), Optional.ofNullable(player.getUUID()))); + pStack.set(DataComponentRegistry.PRESENT, new PresentData(player.getName().getString(), Optional.of(player.getUUID()))); } } @Override - public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) { + public @NotNull InteractionResultHolder use(Level pLevel, @NotNull Player pPlayer, @NotNull InteractionHand pUsedHand) { if(pLevel.isClientSide) return super.use(pLevel, pPlayer, pUsedHand); PresentData presentData = pPlayer.getItemInHand(pUsedHand).get(DataComponentRegistry.PRESENT); @@ -60,7 +61,7 @@ public InteractionResultHolder use(Level pLevel, Player pPlayer, Inte } @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); PresentData data = stack.get(DataComponentRegistry.PRESENT); stack.addToTooltip(DataComponentRegistry.PRESENT, context, tooltip2::add, flagIn); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/RitualTablet.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/RitualTablet.java index c89af4e275..7442d72dcf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/RitualTablet.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/RitualTablet.java @@ -12,8 +12,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; +import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; import java.util.List; public class RitualTablet extends ModItem { @@ -29,7 +29,7 @@ public RitualTablet(AbstractRitual ritual) { } @Override - public InteractionResult useOn(UseOnContext context) { + public @NotNull InteractionResult useOn(UseOnContext context) { if (!context.getLevel().isClientSide() && context.getLevel().getBlockEntity(context.getClickedPos()) instanceof RitualBrazierTile tile) { if (!tile.canTakeAnotherRitual()) { @@ -46,7 +46,7 @@ public InteractionResult useOn(UseOnContext context) { } @Override - public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); tooltip2.add(Component.translatable("tooltip.ars_nouveau.tablet")); if (InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), Minecraft.getInstance().options.keyShift.getKey().getValue())) { @@ -57,7 +57,7 @@ public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, L } @Override - public Component getName(ItemStack pStack) { + public @NotNull Component getName(@NotNull ItemStack pStack) { return Component.literal(ritual.getName()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java index 34bea9a3af..233642601a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryCaster.java @@ -18,13 +18,13 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.client.GeoRenderProvider; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.Nullable; import java.util.List; import java.util.function.Consumer; @@ -39,7 +39,7 @@ public ScryCaster() { } @Override - public InteractionResult useOn(UseOnContext pContext) { + public @NotNull InteractionResult useOn(UseOnContext pContext) { BlockPos pos = pContext.getClickedPos(); ItemStack stack = pContext.getItemInHand(); if(pContext.getLevel().getBlockState(pos).getBlock() instanceof ScryerCrystal){ @@ -53,14 +53,14 @@ public InteractionResult useOn(UseOnContext pContext) { } @Override - public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) { + public @NotNull InteractionResultHolder use(@NotNull Level pLevel, Player pPlayer, @NotNull InteractionHand pUsedHand) { ItemStack stack = pPlayer.getItemInHand(pUsedHand); AbstractCaster caster = getSpellCaster(stack); return caster.castSpell(pLevel, pPlayer, pUsedHand, Component.translatable("ars_nouveau.invalid_spell")); } @Override - public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { getInformation(stack, context, tooltip2, flagIn); ScryPosData data = stack.get(DataComponentRegistry.SCRY_DATA); var pos = data.pos().orElse(null); @@ -74,16 +74,17 @@ public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, L } @Override - public void initializeClient(Consumer consumer) { - super.initializeClient(consumer); - consumer.accept(new IClientItemExtensions() { + public void createGeoRenderer(Consumer consumer) { + consumer.accept(new GeoRenderProvider() { private final BlockEntityWithoutLevelRenderer renderer = new ScryCasterRenderer(); - public BlockEntityWithoutLevelRenderer getCustomRenderer() { + @Override + public BlockEntityWithoutLevelRenderer getGeoItemRenderer() { return renderer; } }); } + AnimatableInstanceCache factory = GeckoLibUtil.createInstanceCache(this); @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java index b680ebb15d..e01bff35b5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/ScryerScroll.java @@ -9,6 +9,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; +import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.Optional; @@ -21,7 +22,7 @@ public ScryerScroll() { } @Override - public InteractionResult useOn(UseOnContext pContext) { + public @NotNull InteractionResult useOn(UseOnContext pContext) { if (pContext.getLevel().isClientSide) return super.useOn(pContext); if (pContext.getLevel().getBlockEntity(pContext.getClickedPos()) instanceof ICameraMountable) { @@ -34,7 +35,7 @@ public InteractionResult useOn(UseOnContext pContext) { @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { ScryPosData data = stack.get(DataComponentRegistry.SCRY_DATA); var pos = data.pos().orElse(null); if (pos != null) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java index b80fcd76b9..87723722c3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java @@ -39,13 +39,13 @@ import net.minecraft.world.level.LevelReader; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.client.GeoRenderProvider; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; @@ -65,7 +65,7 @@ public SpellBook(Properties properties, SpellTier tier) { } @Override - public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { + public @NotNull InteractionResultHolder use(@NotNull Level worldIn, Player playerIn, @NotNull InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); if (this != ItemsRegistry.CREATIVE_SPELLBOOK.get()) { var iMana = CapabilityRegistry.getMana(playerIn); @@ -91,13 +91,13 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In } @Override - public boolean doesSneakBypassUse(ItemStack stack, LevelReader world, BlockPos pos, Player player) { + public boolean doesSneakBypassUse(@NotNull ItemStack stack, @NotNull LevelReader world, @NotNull BlockPos pos, @NotNull Player player) { return true; } @Override @OnlyIn(Dist.CLIENT) - public void appendHoverText(final ItemStack stack, @Nullable final TooltipContext world, final List tooltip, final TooltipFlag flag) { + public void appendHoverText(final @NotNull ItemStack stack, final @NotNull TooltipContext world, final @NotNull List tooltip, final @NotNull TooltipFlag flag) { super.appendHoverText(stack, world, tooltip, flag); tooltip.add(Component.translatable("ars_nouveau.spell_book.select", KeyMapping.createNameSupplier(ModKeyBindings.OPEN_RADIAL_HUD.getName()).get())); tooltip.add(Component.translatable("ars_nouveau.spell_book.craft", KeyMapping.createNameSupplier(ModKeyBindings.OPEN_BOOK.getName()).get())); @@ -118,13 +118,12 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public void initializeClient(Consumer consumer) { - super.initializeClient(consumer); - consumer.accept(new IClientItemExtensions() { + public void createGeoRenderer(Consumer consumer) { + consumer.accept(new GeoRenderProvider() { private final BlockEntityWithoutLevelRenderer renderer = new SpellBookRenderer(); @Override - public BlockEntityWithoutLevelRenderer getCustomRenderer() { + public BlockEntityWithoutLevelRenderer getGeoItemRenderer() { return renderer; } }); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java index b2a3a77477..b6bc0088b9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java @@ -24,9 +24,11 @@ import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import net.neoforged.neoforge.common.CommonHooks; +import net.neoforged.neoforge.event.EventHooks; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.client.GeoRenderProvider; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; @@ -79,12 +81,12 @@ public ItemStack findAmmo(Player playerEntity, ItemStack shootable) { } @Override - public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { + public @NotNull InteractionResultHolder use(@NotNull Level worldIn, Player playerIn, @NotNull InteractionHand handIn) { ItemStack itemstack = playerIn.getItemInHand(handIn); AbstractCaster caster = getSpellCaster(playerIn.getItemInHand(handIn)); boolean hasAmmo = !findAmmo(playerIn, itemstack).isEmpty(); - InteractionResultHolder ret = net.neoforged.neoforge.event.EventHooks.onArrowNock(itemstack, worldIn, playerIn, handIn, hasAmmo); + InteractionResultHolder ret = EventHooks.onArrowNock(itemstack, worldIn, playerIn, handIn, hasAmmo); if (ret != null) return ret; if (hasAmmo || (caster.getSpell().isValid() && new SpellResolver(new SpellContext(worldIn, caster.getSpell(), playerIn, new PlayerCaster(playerIn), itemstack)).withSilent(true).canCast(playerIn))) { @@ -110,7 +112,7 @@ public EntitySpellArrow buildSpellArrow(Level worldIn, Player playerentity, Abst } @Override - public void releaseUsing(ItemStack bowStack, Level worldIn, LivingEntity entityLiving, int timeLeft) { + public void releaseUsing(@NotNull ItemStack bowStack, @NotNull Level worldIn, @NotNull LivingEntity entityLiving, int timeLeft) { //Copied from BowItem, so we can spawn arrows in case there are no items. if (!(entityLiving instanceof Player playerentity)) return; @@ -214,7 +216,7 @@ public void addArrow(AbstractArrow abstractarrowentity, ItemStack bowStack, Item /** * Get the predicate to match ammunition when searching the player's inventory, not their main/offhand */ - public Predicate getAllSupportedProjectiles() { + public @NotNull Predicate getAllSupportedProjectiles() { return super.getAllSupportedProjectiles().or(i -> i.getItem() instanceof SpellArrow); } @@ -230,7 +232,7 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { getInformation(stack, context, tooltip2, flagIn); super.appendHoverText(stack, context, tooltip2, flagIn); } @@ -254,23 +256,22 @@ public void scribeModifiedSpell(AbstractCaster caster, Player player, Interac } @Override - public boolean isEnchantable(ItemStack stack) { + public boolean isEnchantable(@NotNull ItemStack stack) { return true; } @Override - public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + public boolean isBookEnchantable(@NotNull ItemStack stack, @NotNull ItemStack book) { return true; } @Override - public void initializeClient(Consumer consumer) { - super.initializeClient(consumer); - consumer.accept(new IClientItemExtensions() { + public void createGeoRenderer(Consumer consumer) { + consumer.accept(new GeoRenderProvider() { private final BlockEntityWithoutLevelRenderer renderer = new SpellBowRenderer(); @Override - public BlockEntityWithoutLevelRenderer getCustomRenderer() { + public BlockEntityWithoutLevelRenderer getGeoItemRenderer() { return renderer; } }); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java index 5cab74d00d..5fc796043a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java @@ -33,11 +33,12 @@ import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Quaternionf; import org.joml.Vector3f; import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.client.GeoRenderProvider; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; @@ -58,7 +59,7 @@ public SpellCrossbow(Properties pProperties) { // Duplicate override except we use our own tryLoadProjectiles @Override - public void releaseUsing(ItemStack pStack, Level pLevel, LivingEntity pEntityLiving, int pTimeLeft) { + public void releaseUsing(@NotNull ItemStack pStack, @NotNull Level pLevel, @NotNull LivingEntity pEntityLiving, int pTimeLeft) { int i = this.getUseDuration(pStack, pEntityLiving) - pTimeLeft; float f = getPowerForTime(i, pStack, pEntityLiving); if (f >= 1.0F && !isCharged(pStack) && tryLoadProjectiles(pEntityLiving, pStack)) { @@ -170,7 +171,7 @@ private AbstractArrow getArrow(Level pLevel, LivingEntity pLivingEntity, ItemSta } @Override - public void performShooting(Level pLevel, LivingEntity pShooter, InteractionHand pUsedHand, ItemStack pCrossbowStack, float pVelocity, float pInaccuracy, @Nullable LivingEntity pTarget){ + public void performShooting(@NotNull Level pLevel, @NotNull LivingEntity pShooter, @NotNull InteractionHand pUsedHand, @NotNull ItemStack pCrossbowStack, float pVelocity, float pInaccuracy, @Nullable LivingEntity pTarget) { if (pShooter instanceof Player player && net.neoforged.neoforge.event.EventHooks.onArrowLoose(pCrossbowStack, pShooter.level, player, 1, true) < 0) return; ChargedProjectiles chargedprojectiles = pCrossbowStack.set(DataComponents.CHARGED_PROJECTILES, ChargedProjectiles.EMPTY); if(chargedprojectiles == null) @@ -201,7 +202,7 @@ public void performShooting(Level pLevel, LivingEntity pShooter, InteractionHand } @Override - public Predicate getAllSupportedProjectiles() { + public @NotNull Predicate getAllSupportedProjectiles() { return super.getAllSupportedProjectiles().or(i -> i.getItem() instanceof SpellArrow); } @@ -213,7 +214,7 @@ public EntitySpellArrow buildSpellArrow(Level worldIn, LivingEntity playerentity } @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { getInformation(stack, context, tooltip2, flagIn); super.appendHoverText(stack, context, tooltip2, flagIn); } @@ -242,33 +243,22 @@ public int getManaDiscount(ItemStack i, Spell spell) { } @Override - public boolean isEnchantable(ItemStack stack) { + public boolean isEnchantable(@NotNull ItemStack stack) { return true; } @Override - public boolean isBookEnchantable(ItemStack stack, ItemStack book) { - return true; - } - - @Override - public void initializeClient(Consumer consumer) { - super.initializeClient(consumer); - consumer.accept(new IClientItemExtensions() { + public void createGeoRenderer(Consumer consumer) { + consumer.accept(new GeoRenderProvider() { private final BlockEntityWithoutLevelRenderer renderer = new SpellCrossbowRenderer(); @Override - public BlockEntityWithoutLevelRenderer getCustomRenderer() { + public BlockEntityWithoutLevelRenderer getGeoItemRenderer() { return renderer; } }); } - @Override - public boolean useOnRelease(ItemStack pStack) { - return pStack.is(this); - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar data) {} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java index 34e19c5785..3bafd25646 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java @@ -12,8 +12,8 @@ import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; import java.util.List; import java.util.Optional; @@ -28,19 +28,19 @@ public SpellParchment() { } @Override - public Component getName(ItemStack pStack) { + public @NotNull Component getName(@NotNull ItemStack pStack) { AbstractCaster caster = getSpellCaster(pStack); return caster.getSpellName().isEmpty() ? super.getName(pStack) : Component.literal(caster.getSpellName()); } @Override - public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { stack.addToTooltip(DataComponentRegistry.SPELL_CASTER, context, tooltip2::add, flagIn); super.appendHoverText(stack, context, tooltip2, flagIn); } @Override - public Optional getTooltipImage(ItemStack pStack) { + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { AbstractCaster caster = getSpellCaster(pStack); if (Config.GLYPH_TOOLTIPS.get() && !Screen.hasShiftDown() && !caster.isSpellHidden() && !caster.getSpell().isEmpty()) return Optional.of(new SpellTooltip(caster)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java index af3be84b8e..c716083c1a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java @@ -18,7 +18,7 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -29,12 +29,12 @@ public StableWarpScroll(Item.Properties properties) { } @Override - public boolean onEntityItemUpdate(ItemStack stack, ItemEntity entity) { + public boolean onEntityItemUpdate(@NotNull ItemStack stack, @NotNull ItemEntity entity) { return ItemsRegistry.WARP_SCROLL.get().onEntityItemUpdate(stack, entity); } @Override - public InteractionResult useOn(UseOnContext context) { + public @NotNull InteractionResult useOn(UseOnContext context) { if (!context.getLevel().isClientSide) { WarpScrollData scrollData = context.getItemInHand().getOrDefault(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(null, null, null, true)); if(!scrollData.isValid()) @@ -46,7 +46,7 @@ public InteractionResult useOn(UseOnContext context) { } @Override - public InteractionResultHolder use(Level pLevel, Player player, InteractionHand pUsedHand) { + public @NotNull InteractionResultHolder use(@NotNull Level pLevel, @NotNull Player player, @NotNull InteractionHand pUsedHand) { if(pUsedHand != InteractionHand.MAIN_HAND) return InteractionResultHolder.success(player.getItemInHand(pUsedHand)); ItemStack stack = player.getItemInHand(InteractionHand.MAIN_HAND); @@ -64,7 +64,7 @@ public InteractionResultHolder use(Level pLevel, Player player, Inter } @Override - public void appendHoverText(ItemStack stack, @Nullable Item.TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, Item.@NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); stack.addToTooltip(DataComponentRegistry.WARP_SCROLL, context, tooltip2::add, flagIn); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShades.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShades.java index f791aa643d..abf3073ccc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShades.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShades.java @@ -14,7 +14,9 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.animatable.client.GeoRenderProvider; + import java.util.function.Consumer; public class StarbuncleShades extends AnimModItem implements ICosmeticItem { @@ -25,7 +27,7 @@ public StarbuncleShades() { } @Override - public InteractionResult interactLivingEntity(ItemStack pStack, Player pPlayer, LivingEntity pInteractionTarget, InteractionHand pUsedHand) { + public @NotNull InteractionResult interactLivingEntity(@NotNull ItemStack pStack, @NotNull Player pPlayer, @NotNull LivingEntity pInteractionTarget, @NotNull InteractionHand pUsedHand) { if (pInteractionTarget instanceof IDecoratable starbuncle && canWear(pInteractionTarget)) { starbuncle.setCosmeticItem(pStack.split(1)); return InteractionResult.SUCCESS; @@ -51,17 +53,16 @@ public Vec3 getScaling() { return new Vec3(1.0, 1.0, 1.0); } - @Override - public void initializeClient(Consumer consumer) { - super.initializeClient(consumer); - consumer.accept(new IClientItemExtensions() { + public void createGeoRenderer(Consumer consumer) { + consumer.accept(new GeoRenderProvider() { private final BlockEntityWithoutLevelRenderer renderer = new GenericItemRenderer(new GenericModel<>("starbuncle_shades", "item")).withTranslucency(); @Override - public BlockEntityWithoutLevelRenderer getCustomRenderer() { + public BlockEntityWithoutLevelRenderer getGeoItemRenderer() { return renderer; } }); } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java index c82102f106..b7ccbe9857 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java @@ -7,6 +7,7 @@ import net.minecraft.network.chat.Style; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -18,7 +19,7 @@ public StarbuncleShard(){ } @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { StarbuncleCharmData data = stack.get(DataComponentRegistry.STARBUNCLE_DATA); if(data != null){ data.getName().ifPresent(tooltip2::add); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java index 726b2844df..1a58005ed6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/VoidJar.java @@ -16,7 +16,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -66,11 +66,11 @@ public void preConsume(Player player, ItemStack jar, ItemStack voided, int amoun if(mana == null){ return; } - mana.removeMana(5.0 * amount); + mana.addMana(5.0 * amount); } @Override - public InteractionResultHolder use(Level worldIn, Player player, InteractionHand handIn) { + public @NotNull InteractionResultHolder use(Level worldIn, @NotNull Player player, @NotNull InteractionHand handIn) { if (worldIn.isClientSide) return super.use(worldIn, player, handIn); ItemStack stack = player.getItemInHand(handIn); @@ -99,7 +99,7 @@ public boolean onScribe(Level world, BlockPos pos, Player player, InteractionHan } @Override - public void appendHoverText(ItemStack stack, @Nullable Item.TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull Item.TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); stack.addToTooltip(DataComponentRegistry.VOID_JAR, context, tooltip2::add, flagIn); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java index adabd81958..3d26056854 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java @@ -11,20 +11,19 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; 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 net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoAnimatable; import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.client.GeoRenderProvider; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; @@ -46,10 +45,10 @@ private

PlayState predicate(AnimationState

e } @Override - public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { + public @NotNull InteractionResultHolder use(@NotNull Level worldIn, Player playerIn, @NotNull InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); AbstractCaster caster = getSpellCaster(stack); - return caster.castSpell(worldIn, (LivingEntity) playerIn, handIn, Component.translatable("ars_nouveau.wand.invalid")); + return caster.castSpell(worldIn, playerIn, handIn, Component.translatable("ars_nouveau.wand.invalid")); } @Override @@ -82,19 +81,17 @@ public void scribeModifiedSpell(AbstractCaster caster, Player player, Interac } @Override - public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { getInformation(stack, context, tooltip2, flagIn); super.appendHoverText(stack, context, tooltip2, flagIn); } @Override - public void initializeClient(Consumer consumer) { - super.initializeClient(consumer); - consumer.accept(new IClientItemExtensions() { - private final BlockEntityWithoutLevelRenderer renderer = new WandRenderer(); - + public void createGeoRenderer(Consumer consumer) { + consumer.accept(new GeoRenderProvider() { + final WandRenderer renderer = new WandRenderer(); @Override - public BlockEntityWithoutLevelRenderer getCustomRenderer() { + public BlockEntityWithoutLevelRenderer getGeoItemRenderer() { return renderer; } }); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java index 8e79729c6c..8b1286eb8b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java @@ -25,7 +25,7 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec2; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -35,7 +35,7 @@ public WarpScroll() { } @Override - public boolean onEntityItemUpdate(ItemStack stack, ItemEntity entity) { + public boolean onEntityItemUpdate(@NotNull ItemStack stack, ItemEntity entity) { if (entity.getCommandSenderWorld().isClientSide) return false; @@ -59,7 +59,7 @@ public boolean onEntityItemUpdate(ItemStack stack, ItemEntity entity) { } @Override - public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { + public @NotNull InteractionResultHolder use(@NotNull Level world, Player player, @NotNull InteractionHand hand) { ItemStack stack = player.getItemInHand(hand); WarpScrollData data = stack.getOrDefault(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(null, null, null, false)); if (hand == InteractionHand.OFF_HAND) @@ -108,7 +108,7 @@ public InteractionResultHolder use(Level world, Player player, Intera } @Override - public void appendHoverText(ItemStack stack, @Nullable Item.TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, Item.@NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); stack.addToTooltip(DataComponentRegistry.WARP_SCROLL, context, tooltip2::add, flagIn); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/WixieHat.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/WixieHat.java index 4890dea328..0e5c0bf451 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/WixieHat.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/WixieHat.java @@ -19,13 +19,16 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.animatable.client.GeoRenderProvider; + import java.util.function.Consumer; public class WixieHat extends AnimModItem implements ICosmeticItem { @Override - public InteractionResult interactLivingEntity(ItemStack pStack, Player pPlayer, LivingEntity pInteractionTarget, InteractionHand pUsedHand) { + public @NotNull InteractionResult interactLivingEntity(@NotNull ItemStack pStack, @NotNull Player pPlayer, @NotNull LivingEntity pInteractionTarget, @NotNull InteractionHand pUsedHand) { if (pInteractionTarget instanceof Starbuncle starbuncle) { starbuncle.setBehavior(new StarbyPotionBehavior(starbuncle, new CompoundTag())); PortUtil.sendMessage(pPlayer, Component.translatable("ars_nouveau.starbuncle.potion_behavior_set")); @@ -38,18 +41,17 @@ public InteractionResult interactLivingEntity(ItemStack pStack, Player pPlayer, } @Override - public InteractionResult useOn(UseOnContext pContext) { + public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) { return super.useOn(pContext); } @Override - public void initializeClient(Consumer consumer) { - super.initializeClient(consumer); - consumer.accept(new IClientItemExtensions() { + public void createGeoRenderer(Consumer consumer) { + consumer.accept(new GeoRenderProvider() { private final BlockEntityWithoutLevelRenderer renderer = new GenericItemRenderer(new GenericModel<>("witch_hat", "item")).withTranslucency(); @Override - public BlockEntityWithoutLevelRenderer getCustomRenderer() { + public @Nullable BlockEntityWithoutLevelRenderer getGeoItemRenderer() { return renderer; } }); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/AbstractManaCurio.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/AbstractManaCurio.java index 5136fc6e4f..b10abb306d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/AbstractManaCurio.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/AbstractManaCurio.java @@ -2,7 +2,6 @@ import com.google.common.collect.Multimap; import com.hollingsworth.arsnouveau.api.item.ArsNouveauCurio; -import com.hollingsworth.arsnouveau.api.mana.IManaEquipment; import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import net.minecraft.core.Holder; import net.minecraft.resources.ResourceLocation; @@ -11,7 +10,7 @@ import net.minecraft.world.item.ItemStack; import top.theillusivec4.curios.api.SlotContext; -public abstract class AbstractManaCurio extends ArsNouveauCurio implements IManaEquipment { +public abstract class AbstractManaCurio extends ArsNouveauCurio { public AbstractManaCurio() { super(); } @@ -27,8 +26,8 @@ public int getManaRegenBonus(ItemStack i) { @Override public Multimap, AttributeModifier> getAttributeModifiers(SlotContext slotContext, ResourceLocation id, ItemStack stack) { Multimap, AttributeModifier> attributes = super.getAttributeModifiers(slotContext, id, stack); - attributes.put(PerkAttributes.MAX_MANA, new AttributeModifier(id, this.getMaxManaBoost(stack), AttributeModifier.Operation.ADD_VALUE) ); - attributes.put(PerkAttributes.MANA_REGEN_BONUS, new AttributeModifier(id, this.getManaRegenBonus(stack), AttributeModifier.Operation.ADD_VALUE) ); + attributes.put(PerkAttributes.MAX_MANA, new AttributeModifier(id, this.getMaxManaBoost(stack), AttributeModifier.Operation.ADD_VALUE)); + attributes.put(PerkAttributes.MANA_REGEN_BONUS, new AttributeModifier(id, this.getManaRegenBonus(stack), AttributeModifier.Operation.ADD_VALUE)); return attributes; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/DiscountRing.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/DiscountRing.java index 13df14ff03..31ed94a030 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/DiscountRing.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/DiscountRing.java @@ -1,13 +1,15 @@ package com.hollingsworth.arsnouveau.common.items.curios; +import com.hollingsworth.arsnouveau.api.mana.IManaDiscountEquipment; import com.hollingsworth.arsnouveau.api.spell.Spell; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +import org.jetbrains.annotations.NotNull; import java.util.List; -public abstract class DiscountRing extends AbstractManaCurio { +public abstract class DiscountRing extends AbstractManaCurio implements IManaDiscountEquipment { public abstract int getManaDiscount(); @@ -27,7 +29,7 @@ public int getManaDiscount(ItemStack i, Spell spell) { } @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip2, TooltipFlag flagIn) { + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip2, flagIn); tooltip2.add(Component.translatable("tooltip.discount_item", getManaDiscount(stack))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/ShapersFocus.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/ShapersFocus.java index 09c1e98677..77f7286172 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/ShapersFocus.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/ShapersFocus.java @@ -28,11 +28,6 @@ public ShapersFocus(Properties properties) { withTooltip(Component.translatable("tooltip.ars_nouveau.shapers_focus")); } - @Deprecated(forRemoval = true) - public static void tryPropagateEntitySpell(EnchantedFallingBlock fallingblockentity, Level level, LivingEntity shooter, SpellContext spellContext, SpellResolver resolver) { - tryPropagateEntitySpell(fallingblockentity, level, (Entity) shooter, spellContext, resolver); - } - public static @Nullable SpellContext tryPropagateEntitySpell(EnchantedFallingBlock fallingblockentity, Level level, Entity shooter, SpellContext spellContext, SpellResolver resolver) { if (!resolver.hasFocus(ItemsRegistry.SHAPERS_FOCUS.get())) @@ -54,11 +49,6 @@ public static void tryPropagateEntitySpell(EnchantedFallingBlock fallingblockent return context; } - @Deprecated(forRemoval = true) - public static void tryPropagateBlockSpell(BlockHitResult blockHitResult, Level level, LivingEntity shooter, SpellContext spellContext, SpellResolver resolver) { - tryPropagateBlockSpell(blockHitResult, level, (Entity) shooter, spellContext, resolver); - } - /** * @return the new context */ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/MimicItemScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/MimicItemScroll.java index 180836d645..f3fe4003b8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/MimicItemScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/itemscrolls/MimicItemScroll.java @@ -7,6 +7,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.neoforged.neoforge.items.IItemHandler; +import org.jetbrains.annotations.NotNull; public class MimicItemScroll extends ItemScroll { @@ -19,7 +20,7 @@ public MimicItemScroll(Properties properties) { } @Override - public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) { + public @NotNull InteractionResultHolder use(@NotNull Level pLevel, @NotNull Player pPlayer, @NotNull InteractionHand pUsedHand) { return InteractionResultHolder.pass(pPlayer.getItemInHand(pUsedHand)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/GameRendererMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/GameRendererMixin.java index 146c2106b0..97b2fc807b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/GameRendererMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/GameRendererMixin.java @@ -10,7 +10,7 @@ @Mixin(GameRenderer.class) public class GameRendererMixin { @Inject(method = "resize", at = @At(value = "TAIL")) - public void arsNouveou$resize(int width, int height, CallbackInfo ci) { + public void arsNouveau$resize(int width, int height, CallbackInfo ci) { SkyTextureHandler.setupRenderTarget(width, height); } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/EnchantedCountIncreaseFunctionMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/EnchantedCountIncreaseFunctionMixin.java new file mode 100644 index 0000000000..f5c506f558 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/EnchantedCountIncreaseFunctionMixin.java @@ -0,0 +1,31 @@ +package com.hollingsworth.arsnouveau.common.mixin.looting; + +import com.hollingsworth.arsnouveau.api.util.PerkUtil; +import com.hollingsworth.arsnouveau.common.perk.LootingPerk; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.core.Holder; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.functions.EnchantedCountIncreaseFunction; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(EnchantedCountIncreaseFunction.class) +public class EnchantedCountIncreaseFunctionMixin { + + @WrapOperation( + method = "run", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/item/enchantment/EnchantmentHelper;getEnchantmentLevel(Lnet/minecraft/core/Holder;Lnet/minecraft/world/entity/LivingEntity;)I" + ) + ) + private int ars_nouveau$lootingPerk(Holder enchantment, LivingEntity attacker, Operation original, @Local(argsOnly = true) LootContext context) { + int add = PerkUtil.countForPerk(LootingPerk.INSTANCE, attacker); + // TODO: add FamilarEntity check + return original.call(enchantment, attacker) + add; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/LootItemRandomChanceWithEnchantedBonusConditionMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/LootItemRandomChanceWithEnchantedBonusConditionMixin.java new file mode 100644 index 0000000000..569fab5365 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/LootItemRandomChanceWithEnchantedBonusConditionMixin.java @@ -0,0 +1,32 @@ +package com.hollingsworth.arsnouveau.common.mixin.looting; + +import com.hollingsworth.arsnouveau.api.util.PerkUtil; +import com.hollingsworth.arsnouveau.common.perk.LootingPerk; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.core.Holder; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceWithEnchantedBonusCondition; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(LootItemRandomChanceWithEnchantedBonusCondition.class) +public class LootItemRandomChanceWithEnchantedBonusConditionMixin { + + @WrapOperation( + method = "test(Lnet/minecraft/world/level/storage/loot/LootContext;)Z", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/item/enchantment/EnchantmentHelper;getEnchantmentLevel(Lnet/minecraft/core/Holder;Lnet/minecraft/world/entity/LivingEntity;)I" + ) + ) + private int ars_nouveau$lootingOnGoldSnowball(Holder enchantment, LivingEntity attacker, Operation original, @Local(argsOnly = true) LootContext context) { + int add = PerkUtil.countForPerk(LootingPerk.INSTANCE, attacker); + // TODO: add FamilarEntity check + return original.call(enchantment, attacker) + add; + } + +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientDelayEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientDelayEffect.java index 31eacdd7f0..8611be6340 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientDelayEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketClientDelayEffect.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.api.event.EventQueue; import com.hollingsworth.arsnouveau.api.spell.Spell; import com.hollingsworth.arsnouveau.api.spell.SpellContext; +import com.hollingsworth.arsnouveau.api.spell.SpellResolver; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.LivingCaster; import com.hollingsworth.arsnouveau.common.util.ANCodecs; import net.minecraft.client.Minecraft; @@ -21,10 +22,11 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -public class PacketClientDelayEffect extends AbstractPacket{ +public class PacketClientDelayEffect extends AbstractPacket { public static final Type TYPE = new Type<>(ArsNouveau.prefix("client_delay_effect")); public static final StreamCodec CODEC = StreamCodec.ofMember(PacketClientDelayEffect::toBytes, PacketClientDelayEffect::new); @@ -52,7 +54,7 @@ public void toBytes(RegistryFriendlyByteBuf buf) { buf.writeInt(shooterID); buf.writeInt(hitEntityID); - if (hitEntityID == -1) { + if (hitEntityID == -1 && hitPos != null) { buf.writeBlockHitResult(hitPos); } // buf.writeBlockHitResult(); @@ -78,12 +80,13 @@ public void onClientReceived(Minecraft minecraft, Player player) { } else { result = new EntityHitResult(hitEntity); } - EventQueue.getClientQueue().addEvent(new DelayedSpellEvent(duration, spell, result, world, (LivingEntity) world.getEntity(shooterID), - new SpellContext(world, spell, (LivingEntity) world.getEntity(shooterID), new LivingCaster((LivingEntity) world.getEntity(shooterID))))); + LivingEntity entity = (LivingEntity) world.getEntity(shooterID); + EventQueue.getClientQueue().addEvent(new DelayedSpellEvent(duration, result, world, + new SpellResolver(new SpellContext(world, spell, entity, new LivingCaster(entity))))); } @Override - public Type type() { + public @NotNull Type type() { return TYPE; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ChillingPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ChillingPerk.java index 3bdd859fe9..bf5b4554e2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ChillingPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ChillingPerk.java @@ -1,21 +1,19 @@ package com.hollingsworth.arsnouveau.common.perk; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.event.EffectResolveEvent; import com.hollingsworth.arsnouveau.api.perk.IEffectResolvePerk; import com.hollingsworth.arsnouveau.api.perk.Perk; import com.hollingsworth.arsnouveau.api.perk.PerkInstance; -import com.hollingsworth.arsnouveau.api.spell.*; +import com.hollingsworth.arsnouveau.api.spell.IDamageEffect; import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.minecraft.world.phys.HitResult; -import org.jetbrains.annotations.NotNull; public class ChillingPerk extends Perk implements IEffectResolvePerk { - public static ChillingPerk INSTANCE = new ChillingPerk(ArsNouveau.prefix( "thread_chilling")); + public static ChillingPerk INSTANCE = new ChillingPerk(ArsNouveau.prefix("thread_chilling")); public ChillingPerk(ResourceLocation key) { super(key); @@ -32,17 +30,13 @@ public String getLangName() { } @Override - public void onPreResolve(HitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver, AbstractEffect effect, PerkInstance perkInstance) { - if(effect instanceof IDamageEffect damageEffect && rayTraceResult instanceof EntityHitResult entityHitResult && entityHitResult.getEntity() instanceof LivingEntity livingEntity){ - if(damageEffect.canDamage(shooter, spellStats, spellContext, resolver, entityHitResult.getEntity()) && shooter != entityHitResult.getEntity()){ + public void onEffectPreResolve(EffectResolveEvent.Pre event, PerkInstance perkInstance) { + if (event.resolveEffect instanceof IDamageEffect damageEffect && event.rayTraceResult instanceof EntityHitResult entityHitResult && entityHitResult.getEntity() instanceof LivingEntity livingEntity) { + if (damageEffect.canDamage(event.shooter, event.spellStats, event.resolver.spellContext, event.resolver, entityHitResult.getEntity()) && event.shooter != entityHitResult.getEntity()) { livingEntity.setTicksFrozen(livingEntity.getTicksFrozen() + 1); livingEntity.addEffect(new MobEffectInstance(ModPotions.FREEZING_EFFECT, perkInstance.getSlot().value() * 10 * 20, perkInstance.getSlot().value() >= 3 ? 2 : 1)); } } } - @Override - public void onPostResolve(HitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver, AbstractEffect effect, PerkInstance perkInstance) { - - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/DepthsPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/DepthsPerk.java index 895a9ed5c3..ec05b1f523 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/DepthsPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/DepthsPerk.java @@ -1,32 +1,32 @@ package com.hollingsworth.arsnouveau.common.perk; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.perk.Perk; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; import net.neoforged.neoforge.common.NeoForgeMod; +import org.jetbrains.annotations.NotNull; public class DepthsPerk extends Perk { - public static DepthsPerk INSTANCE = new DepthsPerk(ArsNouveau.prefix( "thread_depths")); + public static DepthsPerk INSTANCE = new DepthsPerk(ArsNouveau.prefix("thread_depths")); public DepthsPerk(ResourceLocation key) { super(key); } + @Override - public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - ImmutableMultimap.Builder modifiers = new ImmutableMultimap.Builder<>(); - if(slotValue >= 3){ - modifiers.put(NeoForgeMod.SWIM_SPEED.value(), new AttributeModifier(INSTANCE.getRegistryName(), 2.0, AttributeModifier.Operation.ADD_VALUE)); + public @NotNull ItemAttributeModifiers applyAttributeModifiers(ItemAttributeModifiers modifiers, ItemStack stack, int slotValue, EquipmentSlotGroup equipmentSlotGroup) { + if (slotValue >= 3) { + return modifiers.withModifierAdded(NeoForgeMod.SWIM_SPEED, new AttributeModifier(INSTANCE.getRegistryName(), 2.0, AttributeModifier.Operation.ADD_VALUE), equipmentSlotGroup); } + return modifiers; + - return modifiers.build(); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/FeatherPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/FeatherPerk.java index 83345b4b59..e33670d57c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/FeatherPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/FeatherPerk.java @@ -1,14 +1,14 @@ package com.hollingsworth.arsnouveau.common.perk; -import com.google.common.collect.Multimap; import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.perk.Perk; import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import org.jetbrains.annotations.NotNull; public class FeatherPerk extends Perk { @@ -19,8 +19,8 @@ public FeatherPerk(ResourceLocation key) { } @Override - public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - return attributeBuilder().put(PerkAttributes.FEATHER.get(), new AttributeModifier(INSTANCE.getRegistryName(), 0.2 * slotValue, AttributeModifier.Operation.ADD_VALUE)).build(); + public @NotNull ItemAttributeModifiers applyAttributeModifiers(ItemAttributeModifiers modifiers, ItemStack stack, int slotValue, EquipmentSlotGroup equipmentSlotGroup) { + return modifiers.withModifierAdded(PerkAttributes.FEATHER, new AttributeModifier(INSTANCE.getRegistryName(), 0.2 * slotValue, AttributeModifier.Operation.ADD_VALUE), equipmentSlotGroup); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/IgnitePerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/IgnitePerk.java index a70bc76861..5059408805 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/IgnitePerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/IgnitePerk.java @@ -1,19 +1,16 @@ package com.hollingsworth.arsnouveau.common.perk; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.event.EffectResolveEvent; import com.hollingsworth.arsnouveau.api.perk.IEffectResolvePerk; import com.hollingsworth.arsnouveau.api.perk.Perk; import com.hollingsworth.arsnouveau.api.perk.PerkInstance; -import com.hollingsworth.arsnouveau.api.spell.*; +import com.hollingsworth.arsnouveau.api.spell.IDamageEffect; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; -import net.minecraft.world.phys.HitResult; -import org.jetbrains.annotations.NotNull; public class IgnitePerk extends Perk implements IEffectResolvePerk { - public static IgnitePerk INSTANCE = new IgnitePerk(ArsNouveau.prefix( "thread_kindling")); + public static IgnitePerk INSTANCE = new IgnitePerk(ArsNouveau.prefix("thread_kindling")); public IgnitePerk(ResourceLocation key) { super(key); @@ -30,16 +27,11 @@ public String getLangName() { } @Override - public void onPreResolve(HitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver, AbstractEffect effect, PerkInstance perkInstance) { - if(effect instanceof IDamageEffect damageEffect && rayTraceResult instanceof EntityHitResult entityHitResult){ - if(damageEffect.canDamage(shooter, spellStats, spellContext, resolver, entityHitResult.getEntity()) && shooter != entityHitResult.getEntity()){ + public void onEffectPreResolve(EffectResolveEvent.Pre event, PerkInstance perkInstance) { + if (event.resolveEffect instanceof IDamageEffect damageEffect && event.rayTraceResult instanceof EntityHitResult entityHitResult) { + if (damageEffect.canDamage(event.shooter, event.spellStats, event.resolver.spellContext, event.resolver, entityHitResult.getEntity()) && event.shooter != entityHitResult.getEntity()) { entityHitResult.getEntity().setRemainingFireTicks(20 * 5 * perkInstance.getSlot().value()); } } } - - @Override - public void onPostResolve(HitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver, AbstractEffect effect, PerkInstance perkInstance) { - - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/KnockbackResistPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/KnockbackResistPerk.java index a01bc23ace..3046aee585 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/KnockbackResistPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/KnockbackResistPerk.java @@ -1,26 +1,27 @@ package com.hollingsworth.arsnouveau.common.perk; -import com.google.common.collect.Multimap; import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.perk.Perk; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import org.jetbrains.annotations.NotNull; public class KnockbackResistPerk extends Perk { - public static final KnockbackResistPerk INSTANCE = new KnockbackResistPerk(ArsNouveau.prefix( "thread_amethyst_golem")); + public static final KnockbackResistPerk INSTANCE = new KnockbackResistPerk(ArsNouveau.prefix("thread_amethyst_golem")); public KnockbackResistPerk(ResourceLocation key) { super(key); } + @Override - public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - return attributeBuilder().put(Attributes.KNOCKBACK_RESISTANCE.value(), new AttributeModifier(INSTANCE.getRegistryName(), .15 * slotValue, AttributeModifier.Operation.ADD_VALUE)).build(); + public @NotNull ItemAttributeModifiers applyAttributeModifiers(ItemAttributeModifiers modifiers, ItemStack stack, int slotValue, EquipmentSlotGroup equipmentSlotGroup) { + return modifiers.withModifierAdded(Attributes.KNOCKBACK_RESISTANCE, new AttributeModifier(INSTANCE.getRegistryName(), .15 * slotValue, AttributeModifier.Operation.ADD_VALUE), equipmentSlotGroup); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicCapacityPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicCapacityPerk.java index 183a3bf585..68bcd04351 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicCapacityPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicCapacityPerk.java @@ -1,14 +1,14 @@ package com.hollingsworth.arsnouveau.common.perk; -import com.google.common.collect.Multimap; import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.perk.Perk; import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import org.jetbrains.annotations.NotNull; public class MagicCapacityPerk extends Perk { @@ -19,8 +19,8 @@ public MagicCapacityPerk(ResourceLocation key) { } @Override - public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - return attributeBuilder().put(PerkAttributes.MAX_MANA.get(), new AttributeModifier(INSTANCE.getRegistryName(), 0.1 * slotValue, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)).build(); + public @NotNull ItemAttributeModifiers applyAttributeModifiers(ItemAttributeModifiers modifiers, ItemStack stack, int slotValue, EquipmentSlotGroup equipmentSlotGroup) { + return modifiers.withModifierAdded(PerkAttributes.MAX_MANA, new AttributeModifier(INSTANCE.getRegistryName(), 0.1 * slotValue, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL), equipmentSlotGroup); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicResistPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicResistPerk.java index 45fa15eb88..144cf8764b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicResistPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/MagicResistPerk.java @@ -1,26 +1,26 @@ package com.hollingsworth.arsnouveau.common.perk; -import com.google.common.collect.Multimap; import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.perk.Perk; import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import org.jetbrains.annotations.NotNull; public class MagicResistPerk extends Perk { - public static final MagicResistPerk INSTANCE = new MagicResistPerk(ArsNouveau.prefix( "thread_warding")); + public static final MagicResistPerk INSTANCE = new MagicResistPerk(ArsNouveau.prefix("thread_warding")); public MagicResistPerk(ResourceLocation key) { super(key); } @Override - public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - return attributeBuilder().put(PerkAttributes.WARDING.get(), new AttributeModifier(INSTANCE.getRegistryName(), 2 * slotValue, AttributeModifier.Operation.ADD_VALUE)).build(); + public @NotNull ItemAttributeModifiers applyAttributeModifiers(ItemAttributeModifiers modifiers, ItemStack stack, int slotValue, EquipmentSlotGroup equipmentSlotGroup) { + return modifiers.withModifierAdded(PerkAttributes.WARDING, new AttributeModifier(INSTANCE.getRegistryName(), 2 * slotValue, AttributeModifier.Operation.ADD_VALUE), equipmentSlotGroup); } @Override @@ -32,4 +32,5 @@ public String getLangName() { public String getLangDescription() { return "Reduces the amount of magic damage taken by a flat amount each level."; } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/PotionDurationPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/PotionDurationPerk.java index aaedd85764..22df0ba8dc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/PotionDurationPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/PotionDurationPerk.java @@ -1,14 +1,14 @@ package com.hollingsworth.arsnouveau.common.perk; -import com.google.common.collect.Multimap; import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.perk.Perk; import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import org.jetbrains.annotations.NotNull; public class PotionDurationPerk extends Perk { @@ -19,8 +19,8 @@ public PotionDurationPerk(ResourceLocation key) { } @Override - public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - return attributeBuilder().put(PerkAttributes.WIXIE.get(), new AttributeModifier(INSTANCE.getRegistryName(), 0.15 * slotValue, AttributeModifier.Operation.ADD_MULTIPLIED_BASE)).build(); + public @NotNull ItemAttributeModifiers applyAttributeModifiers(ItemAttributeModifiers modifiers, ItemStack stack, int slotValue, EquipmentSlotGroup equipmentSlotGroup) { + return modifiers.withModifierAdded(PerkAttributes.WIXIE, new AttributeModifier(INSTANCE.getRegistryName(), 0.15 * slotValue, AttributeModifier.Operation.ADD_MULTIPLIED_BASE), equipmentSlotGroup); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/SaturationPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/SaturationPerk.java index f1e989bca8..753ffed4ae 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/SaturationPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/SaturationPerk.java @@ -1,33 +1,33 @@ package com.hollingsworth.arsnouveau.common.perk; -import com.google.common.collect.Multimap; import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.perk.Perk; import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import org.jetbrains.annotations.NotNull; public class SaturationPerk extends Perk { - public static final SaturationPerk INSTANCE = new SaturationPerk(ArsNouveau.prefix( "thread_whirlisprig")); + public static final SaturationPerk INSTANCE = new SaturationPerk(ArsNouveau.prefix("thread_whirlisprig")); public SaturationPerk(ResourceLocation key) { super(key); } @Override - public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - double val = 0.0; - if(slotValue == 1) - val = 0.3; - if(slotValue == 2) - val = 0.6; - if(slotValue >= 3) - val = 1.0; - return attributeBuilder().put(PerkAttributes.WHIRLIESPRIG.get(), new AttributeModifier(INSTANCE.getRegistryName(), val, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)).build(); + public @NotNull ItemAttributeModifiers applyAttributeModifiers(ItemAttributeModifiers modifiers, ItemStack stack, int slotValue, EquipmentSlotGroup equipmentSlotGroup) { + double val = switch (slotValue) { + case 0 -> 0.0; + case 1 -> 0.3; + case 2 -> 0.6; + default -> 1.0; + }; + return modifiers.withModifierAdded(PerkAttributes.WHIRLIESPRIG, new AttributeModifier(INSTANCE.getRegistryName(), val, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL), equipmentSlotGroup); + } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/SpellDamagePerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/SpellDamagePerk.java index d943a948b8..8b6d194cae 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/SpellDamagePerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/SpellDamagePerk.java @@ -1,14 +1,14 @@ package com.hollingsworth.arsnouveau.common.perk; -import com.google.common.collect.Multimap; import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.perk.Perk; import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import org.jetbrains.annotations.NotNull; public class SpellDamagePerk extends Perk { @@ -19,8 +19,8 @@ public SpellDamagePerk(ResourceLocation key) { } @Override - public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - return attributeBuilder().put(PerkAttributes.SPELL_DAMAGE_BONUS.get(), new AttributeModifier(INSTANCE.getRegistryName(), 2 * slotValue, AttributeModifier.Operation.ADD_VALUE)).build(); + public @NotNull ItemAttributeModifiers applyAttributeModifiers(ItemAttributeModifiers modifiers, ItemStack stack, int slotValue, EquipmentSlotGroup equipmentSlotGroup) { + return modifiers.withModifierAdded(PerkAttributes.SPELL_DAMAGE_BONUS, new AttributeModifier(INSTANCE.getRegistryName(), 2 * slotValue, AttributeModifier.Operation.ADD_VALUE), equipmentSlotGroup); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/StarbunclePerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/StarbunclePerk.java index b89747ece8..b2aa3f196d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/StarbunclePerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/StarbunclePerk.java @@ -1,15 +1,14 @@ package com.hollingsworth.arsnouveau.common.perk; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.perk.Perk; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import org.jetbrains.annotations.NotNull; import java.util.UUID; @@ -22,11 +21,8 @@ protected StarbunclePerk(ResourceLocation key) { super(key); } - @Override - public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - ImmutableMultimap.Builder modifiers = new ImmutableMultimap.Builder<>(); - modifiers.put(Attributes.MOVEMENT_SPEED.value(), new AttributeModifier(INSTANCE.getRegistryName(), 0.2 * slotValue, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); - return modifiers.build(); + public @NotNull ItemAttributeModifiers applyAttributeModifiers(ItemAttributeModifiers modifiers, ItemStack stack, int slotValue, EquipmentSlotGroup equipmentSlotGroup) { + return modifiers.withModifierAdded(Attributes.MOVEMENT_SPEED, new AttributeModifier(INSTANCE.getRegistryName(), 0.2 * slotValue, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL), equipmentSlotGroup); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/StepHeightPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/StepHeightPerk.java index 44d0d7abce..3a44b17025 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/StepHeightPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/StepHeightPerk.java @@ -1,15 +1,14 @@ package com.hollingsworth.arsnouveau.common.perk; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.perk.Perk; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import org.jetbrains.annotations.NotNull; import java.util.UUID; @@ -24,10 +23,8 @@ public StepHeightPerk(ResourceLocation key) { } @Override - public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - ImmutableMultimap.Builder modifiers = new ImmutableMultimap.Builder<>(); - modifiers.put(Attributes.STEP_HEIGHT.value(), new AttributeModifier(INSTANCE.getRegistryName(), slotValue, AttributeModifier.Operation.ADD_VALUE)); - return modifiers.build(); + public @NotNull ItemAttributeModifiers applyAttributeModifiers(ItemAttributeModifiers modifiers, ItemStack stack, int slotValue, EquipmentSlotGroup equipmentSlotGroup) { + return modifiers.withModifierAdded(Attributes.STEP_HEIGHT, new AttributeModifier(INSTANCE.getRegistryName(), slotValue, AttributeModifier.Operation.ADD_VALUE), equipmentSlotGroup); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ToughnessPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ToughnessPerk.java index 347e1c61f7..6400c014ef 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/ToughnessPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/ToughnessPerk.java @@ -1,14 +1,14 @@ package com.hollingsworth.arsnouveau.common.perk; -import com.google.common.collect.Multimap; import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.perk.Perk; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import org.jetbrains.annotations.NotNull; public class ToughnessPerk extends Perk { @@ -19,8 +19,8 @@ public ToughnessPerk(ResourceLocation key) { } @Override - public Multimap getModifiers(EquipmentSlot pEquipmentSlot, ItemStack stack, int slotValue) { - return attributeBuilder().put(Attributes.ARMOR_TOUGHNESS.value(), new AttributeModifier(INSTANCE.getRegistryName(), 1 * slotValue, AttributeModifier.Operation.ADD_VALUE)).build(); + public @NotNull ItemAttributeModifiers applyAttributeModifiers(ItemAttributeModifiers modifiers, ItemStack stack, int slotValue, EquipmentSlotGroup equipmentSlotGroup) { + return modifiers.withModifierAdded(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(INSTANCE.getRegistryName(), 1F * slotValue, AttributeModifier.Operation.ADD_VALUE), equipmentSlotGroup); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/VampiricPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/VampiricPerk.java index cfb7b950c0..b9dc5c584b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/VampiricPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/VampiricPerk.java @@ -5,16 +5,8 @@ import com.hollingsworth.arsnouveau.api.perk.IEffectResolvePerk; import com.hollingsworth.arsnouveau.api.perk.Perk; import com.hollingsworth.arsnouveau.api.perk.PerkInstance; -import com.hollingsworth.arsnouveau.api.spell.AbstractEffect; -import com.hollingsworth.arsnouveau.api.spell.SpellContext; -import com.hollingsworth.arsnouveau.api.spell.SpellResolver; -import com.hollingsworth.arsnouveau.api.spell.SpellStats; import com.hollingsworth.arsnouveau.api.util.PerkUtil; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.HitResult; -import org.jetbrains.annotations.NotNull; public class VampiricPerk extends Perk implements IEffectResolvePerk { public static VampiricPerk INSTANCE = new VampiricPerk(ArsNouveau.prefix( "thread_life_drain")); @@ -32,16 +24,6 @@ public String getLangName() { return "Life Drain"; } - @Override - public void onPreResolve(HitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver, AbstractEffect effect, PerkInstance perkInstance) { - - } - - @Override - public void onPostResolve(HitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver, AbstractEffect effect, PerkInstance perkInstance) { - - } - @Override public void onPostSpellDamageEvent(SpellDamageEvent.Post event, PerkInstance perkInstance) { float healAmount = event.damage * (0.2f * PerkUtil.countForPerk(perkInstance.getPerk(), event.caster)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIgnite.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIgnite.java index cac53de891..e39aa724c8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIgnite.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIgnite.java @@ -33,7 +33,7 @@ private EffectIgnite() { @Override public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { int duration = (int) (POTION_TIME.get() + EXTEND_TIME.get() * spellStats.getDurationMultiplier()); - rayTraceResult.getEntity().setRemainingFireTicks(duration); + rayTraceResult.getEntity().setRemainingFireTicks(duration * 20); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java index 8c1281e8e6..7c0d3d0eb4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectName.java @@ -7,7 +7,7 @@ import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.api.util.StackUtil; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; -import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.PropertyMap; import net.minecraft.core.BlockPos; import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; @@ -29,6 +29,7 @@ import net.minecraft.world.phys.EntityHitResult; import org.jetbrains.annotations.NotNull; +import java.util.Optional; import java.util.Set; public class EffectName extends AbstractEffect { @@ -50,17 +51,17 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul item.getItem().set(DataComponents.CUSTOM_NAME, newName); } - if(shooter instanceof Player player && isRealPlayer(shooter) && player.equals(entity)){ + if (shooter instanceof Player player && isRealPlayer(shooter) && player.equals(entity)) { ItemStack offhand = player.getOffhandItem(); offhand.set(DataComponents.CUSTOM_NAME, newName); } } - public Component getName(Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver){ + public Component getName(Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { Component newName = null; InventoryManager manager = spellContext.getCaster().getInvManager(); SlotReference slotRef = manager.findItem(i -> i.getItem() == Items.NAME_TAG, InteractType.EXTRACT); - if(slotRef.getHandler() != null){ + if (slotRef.getHandler() != null) { ItemStack stack = slotRef.getHandler().getStackInSlot(slotRef.getSlot()); newName = stack.getDisplayName().plainCopy(); } @@ -80,19 +81,21 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull BlockPos pos = rayTraceResult.getBlockPos(); BlockState state = world.getBlockState(pos); BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof SkullBlockEntity head){ - head.setOwner(new ResolvableProfile(new GameProfile(null, name.getString()))); + if (blockEntity instanceof SkullBlockEntity head) { + head.setOwner(new ResolvableProfile(Optional.of(name.getString()), Optional.empty(), new PropertyMap())); + // TODO AT this + // head.updateOwnerProfile(); world.sendBlockUpdated(pos, state, state, 3); head.setChanged(); return; } - if(blockEntity instanceof BaseContainerBlockEntity nameable){ + if (blockEntity instanceof BaseContainerBlockEntity nameable) { nameable.name = name; world.sendBlockUpdated(pos, state, state, 3); nameable.setChanged(); return; } - for(Entity entity : world.getEntities(null, new AABB(pos).inflate(0.08))){ + for (Entity entity : world.getEntities(null, new AABB(pos).inflate(0.08))) { entity.setCustomName(name); if (entity instanceof Mob mob) { mob.setPersistenceRequired(); @@ -106,7 +109,7 @@ public SpellTier defaultTier() { return SpellTier.TWO; } - @NotNull + @NotNull @Override public Set getSchools() { return setOf(SpellSchools.MANIPULATION); @@ -117,7 +120,7 @@ public int getDefaultManaCost() { return 25; } - @NotNull + @NotNull @Override public Set getCompatibleAugments() { return augmentSetOf(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java index 27dac1bf4c..e42fee8e85 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.common.block.LightBlock; import com.hollingsworth.arsnouveau.common.block.*; import com.hollingsworth.arsnouveau.common.block.tile.*; +import com.hollingsworth.arsnouveau.common.datagen.BlockTagProvider; import com.hollingsworth.arsnouveau.common.items.MobJarItem; import com.hollingsworth.arsnouveau.common.items.ModBlockItem; import com.hollingsworth.arsnouveau.common.items.RendererBlockItem; @@ -266,10 +267,10 @@ public Supplier getRenderer() { public static BlockEntityTypeRegistryWrapper SCRYERS_OCULUS_TILE = registerTile(LibBlockNames.SCRYERS_OCULUS, ScryersOculusTile::new, SCRYERS_OCULUS); public static BlockRegistryWrapper SCRYERS_CRYSTAL = registerBlockAndItem(LibBlockNames.SCRYERS_CRYSTAL, ScryerCrystal::new); public static BlockEntityTypeRegistryWrapper SCRYER_CRYSTAL_TILE = registerTile(LibBlockNames.SCRYERS_CRYSTAL, ScryerCrystalTile::new, SCRYERS_CRYSTAL); - public static BlockRegistryWrapper MENDOSTEEN_POD = registerBlockAndItem(LibBlockNames.MENDOSTEEN_POD, () -> new ArchfruitPod(() -> FLOURISHING_LOG.get()), (reg) -> new ItemNameBlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.MENDOSTEEN_FOOD))); - public static BlockRegistryWrapper BASTION_POD = registerBlockAndItem(LibBlockNames.BASTION_POD, () -> new ArchfruitPod(() -> VEXING_LOG.get()), (reg) -> new ItemNameBlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.BASTION_FOOD))); - public static BlockRegistryWrapper FROSTAYA_POD = registerBlockAndItem(LibBlockNames.FROSTAYA_POD, () -> new ArchfruitPod(() -> CASCADING_LOG.get()), (reg) -> new ItemNameBlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.FROSTAYA_FOOD))); - public static BlockRegistryWrapper BOMBEGRANTE_POD = registerBlockAndItem(LibBlockNames.BOMBEGRANATE_POD, () -> new ArchfruitPod(() -> BLAZING_LOG.get()), (reg) -> new ItemNameBlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.BLASTING_FOOD))); + public static BlockRegistryWrapper MENDOSTEEN_POD = registerBlockAndItem(LibBlockNames.MENDOSTEEN_POD, () -> new ArchfruitPod(BlockTagProvider.FLOURISHING_LOGS), (reg) -> new ItemNameBlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.MENDOSTEEN_FOOD))); + public static BlockRegistryWrapper BASTION_POD = registerBlockAndItem(LibBlockNames.BASTION_POD, () -> new ArchfruitPod(BlockTagProvider.VEXING_LOGS), (reg) -> new ItemNameBlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.BASTION_FOOD))); + public static BlockRegistryWrapper FROSTAYA_POD = registerBlockAndItem(LibBlockNames.FROSTAYA_POD, () -> new ArchfruitPod(BlockTagProvider.CASCADING_LOGS), (reg) -> new ItemNameBlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.FROSTAYA_FOOD))); + public static BlockRegistryWrapper BOMBEGRANTE_POD = registerBlockAndItem(LibBlockNames.BOMBEGRANATE_POD, () -> new ArchfruitPod(BlockTagProvider.BLAZING_LOGS), (reg) -> new ItemNameBlockItem(reg.get(), defaultItemProperties().food(ItemsRegistry.BLASTING_FOOD))); public static BlockRegistryWrapper POTION_DIFFUSER = registerBlockAndItem(LibBlockNames.POTION_DIFFUSER, PotionDiffuserBlock::new); public static BlockEntityTypeRegistryWrapper POTION_DIFFUSER_TILE = registerTile(LibBlockNames.POTION_DIFFUSER, PotionDiffuserTile::new, POTION_DIFFUSER); public static BlockRegistryWrapper ALTERATION_TABLE = registerBlockAndItem(LibBlockNames.ALTERATION_TABLE, AlterationTable::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java index 6536e005be..d8c56888ba 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java @@ -15,6 +15,7 @@ import net.minecraft.world.item.alchemy.PotionBrewing; import net.minecraft.world.item.alchemy.Potions; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.common.NeoForgeMod; import net.neoforged.neoforge.event.brewing.RegisterBrewingRecipesEvent; import net.neoforged.neoforge.registries.DeferredHolder; @@ -23,6 +24,7 @@ import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; import static com.hollingsworth.arsnouveau.common.lib.LibPotions.*; +@EventBusSubscriber(modid = MODID) public class ModPotions { public static final DeferredRegister EFFECTS = DeferredRegister.create(BuiltInRegistries.MOB_EFFECT, MODID); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 1c4994155f..eb14d2eea0 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -75,4 +75,6 @@ public net.minecraft.client.model.AgeableListModel babyYHeadOffset # babyYHeadOf public net.minecraft.client.model.AgeableListModel babyZHeadOffset # babyZHeadOffset public net.minecraft.client.model.AgeableListModel babyHeadScale # babyHeadScale public net.minecraft.client.model.AgeableListModel babyBodyScale # babyBodyScale -public net.minecraft.client.model.AgeableListModel bodyYOffset # bodyYOffset \ No newline at end of file +public net.minecraft.client.model.AgeableListModel bodyYOffset # bodyYOffset + +# public net.minecraft.world.level.block.entity.SkullBlockEntity updateOwnerProfile()V # updateOwnerProfile diff --git a/src/main/resources/ars_nouveau.mixins.json b/src/main/resources/ars_nouveau.mixins.json index 6c2c135676..c94d090f00 100644 --- a/src/main/resources/ars_nouveau.mixins.json +++ b/src/main/resources/ars_nouveau.mixins.json @@ -29,6 +29,8 @@ "elytra.MixinLivingEntity", "jar.DispenserMixin", "jar.MobAccessorMixin", + "looting.EnchantedCountIncreaseFunctionMixin", + "looting.LootItemRandomChanceWithEnchantedBonusConditionMixin", "perks.PerkLivingEntity", "redstone.RedstoneLevelMixin", "rewind.RewindEntityMixin", From 41dddf28ac45d9894a7f3abe3212fed333f0e114 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 3 Aug 2024 09:13:24 -0500 Subject: [PATCH 113/363] fix annotations on event handler --- .../hollingsworth/arsnouveau/common/event/EventHandler.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index bee1b7099b..0715f089f1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -83,7 +83,6 @@ import net.neoforged.neoforge.event.tick.ServerTickEvent; import net.neoforged.neoforge.event.village.VillagerTradesEvent; import net.neoforged.neoforge.items.ItemHandlerHelper; -import org.jetbrains.annotations.NotNull; import java.util.*; @@ -95,12 +94,12 @@ public class EventHandler { public static void resourceLoadEvent(AddReloadListenerEvent event) { event.addListener(new SimplePreparableReloadListener<>() { @Override - protected Object prepare(@NotNull ResourceManager pResourceManager, ProfilerFiller pProfiler) { + protected Object prepare(ResourceManager pResourceManager, ProfilerFiller pProfiler) { return null; } @Override - protected void apply(@NotNull Object pObject, @NotNull ResourceManager pResourceManager, @NotNull ProfilerFiller pProfiler) { + protected void apply(Object pObject, ResourceManager pResourceManager, ProfilerFiller pProfiler) { MultiRecipeWrapper.RECIPE_CACHE = new HashMap<>(); EffectWololo.recipeCache = new FixedStack<>(EffectWololo.MAX_RECIPE_CACHE); ArsNouveauAPI.getInstance().onResourceReload(); From 759ff69113c01d4eaddfcf851b1d8d9bd1ca39a8 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 3 Aug 2024 10:37:01 -0500 Subject: [PATCH 114/363] Fix bookwyrm charm crash, fix charms not stacking --- .../common/entity/EntityBookwyrm.java | 2 +- .../items/data/PersistentFamiliarData.java | 4 ++-- .../items/summon_charms/BookwyrmCharm.java | 18 ++++++++++++++++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java index bd11d65e1c..829de68ae6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java @@ -220,7 +220,7 @@ public EntityType getType() { public ItemStack toCharm(){ ItemStack stack = new ItemStack(ItemsRegistry.BOOKWYRM_CHARM.get()); - PersistentFamiliarData data = new PersistentFamiliarData(getName(), getColor(this), getHeldStack()); + PersistentFamiliarData data = new PersistentFamiliarData(getCustomName(), getColor(this), getHeldStack()); stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, data); return stack; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java index 88e5bf92ae..ed677c008f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PersistentFamiliarData.java @@ -29,7 +29,7 @@ public class PersistentFamiliarData implements NBTComponent STREAM_CODEC = StreamCodec.composite(ComponentSerialization.STREAM_CODEC, s -> s.name, - ByteBufCodecs.STRING_UTF8, s -> s.color, ItemStack.STREAM_CODEC, s -> s.cosmetic, PersistentFamiliarData::new); + ByteBufCodecs.STRING_UTF8, s -> s.color, ItemStack.OPTIONAL_STREAM_CODEC, s -> s.cosmetic, PersistentFamiliarData::new); private final Component name; private final String color; @@ -42,7 +42,7 @@ public PersistentFamiliarData(Component name, String color, ItemStack cosmetic) } public PersistentFamiliarData(){ - this(Component.nullToEmpty(""), "", ItemStack.EMPTY); + this(null, null, null); } public PersistentFamiliarData setName(Component name){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/BookwyrmCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/BookwyrmCharm.java index bcff191fcb..0488685455 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/BookwyrmCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/BookwyrmCharm.java @@ -3,15 +3,22 @@ import com.hollingsworth.arsnouveau.common.block.tile.StorageLecternTile; import com.hollingsworth.arsnouveau.common.entity.EntityBookwyrm; import com.hollingsworth.arsnouveau.common.items.ModItem; +import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; + +import java.util.List; public class BookwyrmCharm extends ModItem { public BookwyrmCharm() { - super(); - withTooltip("ars_nouveau.tooltip.bookwyrm"); + super(defaultProps().component(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, new PersistentFamiliarData().setColor("blue"))); } @@ -30,4 +37,11 @@ public InteractionResult useOn(UseOnContext pContext) { } return super.useOn(pContext); } + + @Override + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); + stack.addToTooltip(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, context, tooltip2::add, flagIn); + tooltip2.add(Component.translatable("ars_nouveau.tooltip.bookwyrm")); + } } From b163246680b737bec7397ba7da6dc590da80f725 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 3 Aug 2024 10:37:09 -0500 Subject: [PATCH 115/363] Fix melder cast exception --- .../arsnouveau/common/block/tile/PotionMelderTile.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java index 96e5416bfc..d796dbccdc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java @@ -305,15 +305,15 @@ public void getTooltip(List tooltip) { tooltip.add(Component.translatable("ars_nouveau.melder.needs_potion").setStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); } if(fromJars.size() >= 2 && toPos != null && level.getBlockEntity(toPos) instanceof PotionJarTile combJar){ - PotionJarTile tile1 = (PotionJarTile) level.getBlockEntity(fromJars.get(0)); - PotionJarTile tile2 = (PotionJarTile) level.getBlockEntity(fromJars.get(1)); + BlockEntity tile1 = level.getBlockEntity(fromJars.get(0)); + BlockEntity tile2 = level.getBlockEntity(fromJars.get(1)); int inputCost = Config.MELDER_INPUT_COST.get(); - if(tile1 == null || tile1.getAmount() < inputCost || tile2 == null || tile2.getAmount() < inputCost) { + if(!(tile1 instanceof PotionJarTile jar1) || !(tile2 instanceof PotionJarTile jar2) || jar1.getAmount() < inputCost || jar2.getAmount() < inputCost) { return; } - PotionContents data = getCombinedResult(tile1, tile2); + PotionContents data = getCombinedResult(jar1, jar2); - if(!isOutputUnique(data, tile1, tile2)){ + if(!isOutputUnique(data, jar1, jar2)){ tooltip.add(Component.translatable("ars_nouveau.melder.output_not_unique").setStyle(Style.EMPTY.withColor(ChatFormatting.GOLD))); return; } From c783141eca42972b9f0c3b9b1068705042992644 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 3 Aug 2024 10:42:36 -0500 Subject: [PATCH 116/363] Fix magic find, ticking potion effects --- .../arsnouveau/common/potions/BlastEffect.java | 5 +++++ .../arsnouveau/common/potions/FreezingEffect.java | 5 +++++ .../arsnouveau/common/potions/GravityEffect.java | 5 +++++ .../arsnouveau/common/potions/MagicFindEffect.java | 7 ++++++- .../common/potions/ParticleMobEffect.java | 7 ++++++- .../arsnouveau/common/potions/ShockedEffect.java | 13 ++++--------- 6 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/BlastEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/BlastEffect.java index 4842fa984a..39e4b57d20 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/BlastEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/BlastEffect.java @@ -20,4 +20,9 @@ public boolean applyEffectTick(LivingEntity pLivingEntity, int pAmplifier) { public static void explode(LivingEntity pLivingEntity, int pAmplifier) { pLivingEntity.level.explode(null, pLivingEntity.getX(), pLivingEntity.getY() + 1, pLivingEntity.getZ(), 2.0f + pAmplifier, false, Level.ExplosionInteraction.NONE); } + + @Override + public boolean shouldApplyEffectTickThisTick(int pDuration, int pAmplifier) { + return pDuration == 1; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/FreezingEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/FreezingEffect.java index 5d382f835b..e88bcc4db2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/FreezingEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/FreezingEffect.java @@ -16,4 +16,9 @@ public boolean applyEffectTick(LivingEntity pLivingEntity, int pAmplifier) { pLivingEntity.setTicksFrozen(Math.min(pLivingEntity.getTicksRequiredToFreeze() + 3, pLivingEntity.getTicksFrozen() + 3 + pAmplifier)); return true; } + + @Override + public boolean shouldApplyEffectTickThisTick(int pDuration, int pAmplifier) { + return true; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java index 2bea36bb02..c666f183af 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/GravityEffect.java @@ -43,6 +43,11 @@ public boolean applyEffectTick(LivingEntity livingEntity, int p_76394_2_) { return true; } + @Override + public boolean shouldApplyEffectTickThisTick(int pDuration, int pAmplifier) { + return true; + } + // Disable flight here because items tick after our potions @SubscribeEvent public static void entityTick(PlayerTickEvent.Post e) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/MagicFindEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/MagicFindEffect.java index 4f84e624e5..33b3fa7fe2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/MagicFindEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/MagicFindEffect.java @@ -21,7 +21,7 @@ public MagicFindEffect() { public boolean applyEffectTick(LivingEntity pLivingEntity, int pAmplifier) { Level level = pLivingEntity.level; if (level.isClientSide || level.getGameTime() % 60 != 0) - return false; + return true; for (Entity e : level.getEntities(pLivingEntity, new AABB(pLivingEntity.blockPosition()).inflate(75))) { if (e instanceof LivingEntity living && living.getType().is(EntityTags.MAGIC_FIND)) { living.addEffect(new MobEffectInstance(MobEffects.GLOWING, 60 * 20)); @@ -29,4 +29,9 @@ public boolean applyEffectTick(LivingEntity pLivingEntity, int pAmplifier) { } return true; } + + @Override + public boolean shouldApplyEffectTickThisTick(int pDuration, int pAmplifier) { + return true; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/ParticleMobEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/ParticleMobEffect.java index 5b29a02a21..c78824a18d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/ParticleMobEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/ParticleMobEffect.java @@ -16,7 +16,12 @@ public boolean applyEffectTick(LivingEntity living, int amplifier) { if (living.level.random.nextInt(getChance()) == 0) { living.level.addParticle(getParticle(), living.getRandomX(1.0D), living.getRandomY(), living.getRandomZ(1.0D), 0.0D, 0.0D, 0.0D); } - return false; + return true; + } + + @Override + public boolean shouldApplyEffectTickThisTick(int pDuration, int pAmplifier) { + return true; } public abstract ParticleOptions getParticle(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/ShockedEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/ShockedEffect.java index 5f28e2ea20..d301b4c222 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/ShockedEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/ShockedEffect.java @@ -15,15 +15,10 @@ public ShockedEffect() { super(MobEffectCategory.HARMFUL, 2039587); } -// @Override -// public boolean isDurationEffectTick(int duration, int amp) { -// int j = 25 >> amp; -// if (j > 0) { -// return duration % j == 0; -// } else { -// return true; -// } -// } + @Override + public boolean shouldApplyEffectTickThisTick(int pDuration, int pAmplifier) { + return true; + } @Override public boolean applyEffectTick(LivingEntity entity, int amp) { From 90ffa093929edd26985cb2486bcc200c0c4d5046 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 3 Aug 2024 10:50:56 -0500 Subject: [PATCH 117/363] Fix wixie hat --- .../common/entity/goal/carbuncle/StarbyPotionBehavior.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java index c640c9a7b9..f27009ab57 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java @@ -29,7 +29,9 @@ public class StarbyPotionBehavior extends StarbyListBehavior { public StarbyPotionBehavior(Starbuncle entity, CompoundTag tag) { super(entity, tag); - heldPotion = ANCodecs.decode(PotionContents.CODEC, tag.get("potionData")); + if(tag.contains("potionData")) { + heldPotion = ANCodecs.decode(PotionContents.CODEC, tag.get("potionData")); + } amount = tag.getInt("amount"); goals.add(new WrappedGoal(4, new GoToBedGoal(starbuncle, this))); goals.add(new WrappedGoal(3, new PotionTakeGoal(entity, this))); From b28705e98f200ece4483f4e5664d35e36463eac0 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 3 Aug 2024 12:07:42 -0500 Subject: [PATCH 118/363] Fix annotated codex --- .../hollingsworth/arsnouveau/common/items/AnnotatedCodex.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java index 198135401a..f83c99299c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AnnotatedCodex.java @@ -48,7 +48,7 @@ public int getUnlockLevelCost(Collection spellParts) { CodexData data = stack.get(DataComponentRegistry.CODEX_DATA); IPlayerCap playerCap = CapabilityRegistry.getPlayerDataCap(pPlayer); - if (playerCap == null) + if (data == null || playerCap == null) return super.use(pLevel, pPlayer, pUsedHand); Collection known = playerCap.getKnownGlyphs(); Collection storedGlyphs = data.glyphIds().stream().map(GlyphRegistry::getSpellPart).toList(); @@ -64,7 +64,7 @@ public int getUnlockLevelCost(Collection spellParts) { PortUtil.sendMessageNoSpam(pPlayer, Component.translatable("ars_nouveau.recorded_codex")); pPlayer.giveExperiencePoints(-expCost); } - } else if (pPlayer.getUUID().equals(data.uuid())) { // Player updating codex + } else if (pPlayer.getUUID().equals(data.uuid().orElse(null))) { // Player updating codex Collection difference = new ArrayList<>(); for (AbstractSpellPart spellPart : known) { if (!storedGlyphs.contains(spellPart)) { From 14401b85b5eea7cc6e94d4598b95507a22b845ff Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 3 Aug 2024 22:33:16 -0500 Subject: [PATCH 119/363] 5.0.6 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 5a4b15977a..1d44bc9bb7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.0.5 +mod_version=5.0.6 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From b2706a310882cffcacddb96673b9dedd79a8052f Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 4 Aug 2024 12:44:15 -0500 Subject: [PATCH 120/363] despaghetti settings --- .../AbstractStorageTerminalScreen.java | 47 +++++++-------- .../container/CraftingTerminalMenu.java | 17 ++---- .../container/CraftingTerminalScreen.java | 20 +++---- .../client/container/SortSettings.java | 55 ++++++++--------- .../client/container/StorageTerminalMenu.java | 36 ++++------- .../common/block/tile/StorageLecternTile.java | 7 ++- .../arsnouveau/common/network/Networking.java | 2 + .../network/SetTerminalSettingsPacket.java | 60 +++++++++++++++++++ 8 files changed, 143 insertions(+), 101 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/network/SetTerminalSettingsPacket.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java index b1c472fd94..f0863b08f6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java @@ -11,6 +11,7 @@ import com.hollingsworth.arsnouveau.client.gui.buttons.StorageTabButton; import com.hollingsworth.arsnouveau.common.network.ClientToServerStoragePacket; import com.hollingsworth.arsnouveau.common.network.Networking; +import com.hollingsworth.arsnouveau.common.network.SetTerminalSettingsPacket; import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; @@ -79,7 +80,6 @@ public List load(StoredItemStack key) { private Comparator sortComp; List tabNames = new ArrayList<>(); public List tabButtons = new ArrayList<>(); - public String selectedTab = null; boolean noSort; @@ -90,17 +90,23 @@ public AbstractStorageTerminalScreen(T screenContainer, Inventory inv, Component super(screenContainer, inv, titleIn); } - protected void onPacket() { - SortSettings s = menu.terminalData; - if(s != null) { - controllMode = s.controlMode; - comparator = StoredItemStack.SortingTypes.VALUES[s.sortType % StoredItemStack.SortingTypes.VALUES.length].create(s.reverseSort); - searchType = s.searchType; - buttonSortingType.state = s.sortType; - buttonDirection.state = s.reverseSort ? 1 : 0; + public void receiveSettings(SortSettings settings){ + boolean wasExpanded = expanded; + if(settings != null) { + controllMode = settings.controlMode(); + comparator = StoredItemStack.SortingTypes.VALUES[settings.sortType() % StoredItemStack.SortingTypes.VALUES.length].create(settings.reverseSort()); + searchType = settings.searchType(); + buttonSortingType.state = settings.sortType(); + buttonDirection.state = settings.reverseSort() ? 1 : 0; buttonSearchType.state = searchType; - expanded = s.expanded; + expanded = settings.expanded(); + } + if(expanded != wasExpanded) { + menu.addStorageSlots(expanded); } + } + + protected void onPacket() { if(tabNames != null && !tabNames.isEmpty()){ for(StorageTabButton tabButton : tabButtons){ tabButton.visible = false; @@ -127,16 +133,9 @@ protected void onPacket() { } } - protected void sendUpdate() { - CompoundTag c = new CompoundTag(); - c.put("sortSettings", getSortSettings().toTag()); + protected void syncSortSettings() { StorageTabButton selectedTabButton = tabButtons.stream().filter(i -> i.visible && i.isSelected).findFirst().orElse(null); - if(selectedTabButton != null && selectedTabButton.highlightText != null){ - c.putString("selectedTab", selectedTabButton.highlightText); - } - CompoundTag msg = new CompoundTag(); - msg.put("termData", c); - Networking.sendToServer(new ClientToServerStoragePacket(msg)); + Networking.sendToServer(new SetTerminalSettingsPacket(getSortSettings(), selectedTabButton == null ? null : selectedTabButton.highlightText)); } public SortSettings getSortSettings() { @@ -167,26 +166,26 @@ protected void init() { buttonSortingType = addRenderableWidget(new StorageSettingsButton(leftPos - 17, topPos + 14, 22, 12, 44, 13, 0, ArsNouveau.prefix( "textures/gui/sort_type.png"), b -> { comparator = StoredItemStack.SortingTypes.VALUES[(comparator.type() + 1) % StoredItemStack.SortingTypes.VALUES.length].create(comparator.isReversed()); buttonSortingType.state = comparator.type(); - sendUpdate(); + syncSortSettings(); refreshItemList = true; })); buttonDirection = addRenderableWidget(new StorageSettingsButton(leftPos - 17, topPos + 29, 22, 12, 44, 13, 0, ArsNouveau.prefix( "textures/gui/sort_order.png"), b -> { comparator.setReversed(!comparator.isReversed()); buttonDirection.state = comparator.isReversed() ? 1 : 0; - sendUpdate(); + syncSortSettings(); refreshItemList = true; })); buttonSearchType = addRenderableWidget(new StorageSettingsButton(leftPos - 17, topPos + 44, 22, 12, 44, 13, 0, ArsNouveau.prefix( "textures/gui/search_sync.png"), b -> { searchType = searchType == 0 ? 1 : 0; buttonSearchType.state = searchType; - sendUpdate(); + syncSortSettings(); })); for(int i = 0; i < 12; i++){ var button = addRenderableWidget(new StorageTabButton(leftPos - 13, topPos + 59 + i * 15, 18, 12, 256, 13, i, 0, tabImages, b -> { StorageTabButton tabButton = (StorageTabButton) b; setSelectedTab(tabButton.state); - sendUpdate(); + syncSortSettings(); })); button.visible = false; if(i == 0){ @@ -273,7 +272,7 @@ protected void updateSearch() { } public final void scrollTo(float p_148329_1_) { - int lines = this.getSortSettings() == null || !this.getSortSettings().expanded ? 3 : 7; + int lines = this.getSortSettings() == null || !this.getSortSettings().expanded() ? 3 : 7; int i = (this.itemsSorted.size() + 9 - 1) / 9 - lines; int j = (int) (p_148329_1_ * i + 0.5D); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java index 84f316d80f..f0f27fc299 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java @@ -105,7 +105,7 @@ public void onTake(Player thePlayer, ItemStack stack) { } } }); - if(this.terminalData == null || !terminalData.expanded) { + if(te == null || te.sortSettings == null || !te.sortSettings.expanded()) { for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { SlotCrafting slot = new SlotCrafting(craftMatrix, j + i * 3, x + 36 + j * 18, 89 + i * 18); @@ -117,18 +117,13 @@ public void onTake(Player thePlayer, ItemStack stack) { } @Override - protected void addStorageSlots() { - addStorageSlots(13, 21); - } - - @Override - public void addStorageSlots(int slotOffsetX, int slotOffsetY) { - super.addStorageSlots(slotOffsetX, slotOffsetY); - if(craftSlotList != null && terminalData != null){ + public void addStorageSlots(boolean expanded) { + super.addStorageSlots(expanded); + if(craftSlotList != null){ for(SlotCrafting slot : craftSlotList){ - slot.active = !terminalData.expanded; + slot.active = !expanded; } - craftingResultSlot.active = !terminalData.expanded; + craftingResultSlot.active = !expanded; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java index d30f9646c5..918abc7638 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java @@ -113,20 +113,18 @@ protected void init() { } @Override - protected void onPacket() { - super.onPacket(); - SortSettings s = menu.terminalData; - if (s != null) { - btnCollapse.visible = this.expanded; - btnExpand.visible = !this.expanded; - btnClr.visible = !this.expanded; - btnRecipeBook.visible = !this.expanded && Config.SHOW_RECIPE_BOOK.get(); - } + public void receiveSettings(SortSettings settings) { + super.receiveSettings(settings); + btnCollapse.visible = this.expanded; + btnExpand.visible = !this.expanded; + btnClr.visible = !this.expanded; + btnRecipeBook.visible = !this.expanded && Config.SHOW_RECIPE_BOOK.get(); } + public void collapseScreen(){ rowCount = 3; this.expanded = false; - sendUpdate(); + syncSortSettings(); } public void expandScreen(){ @@ -135,7 +133,7 @@ public void expandScreen(){ if(this.recipeBookGui.isVisible()){ btnRecipeBook.onPress(); } - sendUpdate(); + syncSortSettings(); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/SortSettings.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/SortSettings.java index f995d1d6a8..5972f46dc9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/SortSettings.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/SortSettings.java @@ -1,35 +1,36 @@ package com.hollingsworth.arsnouveau.client.container; -import net.minecraft.nbt.CompoundTag; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; -public class SortSettings { - public int controlMode; - public boolean reverseSort; - public int sortType; - public int searchType; - public boolean expanded; +public record SortSettings(int controlMode, boolean reverseSort, int sortType, int searchType, boolean expanded) { - public SortSettings(int controlMode, boolean reverseSort, int sortType, int searchType, boolean collapse) { - this.controlMode = controlMode; - this.reverseSort = reverseSort; - this.sortType = sortType; - this.searchType = searchType; - this.expanded = collapse; - } - - public SortSettings(){} + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.INT.fieldOf("controlMode").forGetter(SortSettings::controlMode), + Codec.BOOL.fieldOf("reverseSort").forGetter(SortSettings::reverseSort), + Codec.INT.fieldOf("sortType").forGetter(SortSettings::sortType), + Codec.INT.fieldOf("searchType").forGetter(SortSettings::searchType), + Codec.BOOL.fieldOf("expanded").forGetter(SortSettings::expanded) + ).apply(instance, SortSettings::new)); - public CompoundTag toTag(){ - CompoundTag updateTag = new CompoundTag(); - updateTag.putInt("controlMode", controlMode); - updateTag.putBoolean("reverse", reverseSort); - updateTag.putInt("sortType", sortType); - updateTag.putInt("searchType", searchType); - updateTag.putBoolean("expanded", expanded); - return updateTag; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.INT, + SortSettings::controlMode, + ByteBufCodecs.BOOL, + SortSettings::reverseSort, + ByteBufCodecs.INT, + SortSettings::sortType, + ByteBufCodecs.INT, + SortSettings::searchType, + ByteBufCodecs.BOOL, + SortSettings::expanded, + SortSettings::new + ); - public static SortSettings fromTag(CompoundTag tag){ - return new SortSettings(tag.getInt("controlMode"), tag.getBoolean("reverse"), tag.getInt("sortType"), tag.getInt("searchType"), tag.getBoolean("expanded")); + public SortSettings(){ + this(0, false, 0, 0, false); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java index 2212bc7cd6..94bea99e1f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.common.block.tile.StorageLecternTile; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.ServerToClientStoragePacket; +import com.hollingsworth.arsnouveau.common.network.SetTerminalSettingsPacket; import com.hollingsworth.arsnouveau.common.network.UpdateStorageItemsPacket; import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.hollingsworth.arsnouveau.setup.registry.MenuRegistry; @@ -32,7 +33,6 @@ public class StorageTerminalMenu extends RecipeBookMenu storageSlotList = new ArrayList<>(); public List itemList = new ArrayList<>(); protected Inventory pinv; - public SortSettings terminalData = null; public String search; public String selectedTab = null; public Map itemMap = new HashMap<>(); @@ -46,17 +46,13 @@ public StorageTerminalMenu(MenuType type, int id, Inventory inv, StorageLecte super(type, id); this.te = te; this.pinv = inv; - addStorageSlots(); + addStorageSlots(false); } public StorageTerminalMenu(MenuType type, int id, Inventory inv) { this(type, id, inv, null); } - protected void addStorageSlots() { - addStorageSlots(8, 18); - } - protected void addPlayerSlots(Inventory playerInventory, int x, int y) { this.playerSlotsStart = slots.size() - 1; for (int i = 0;i < 3;++i) { @@ -70,12 +66,12 @@ protected void addPlayerSlots(Inventory playerInventory, int x, int y) { } } - public void addStorageSlots(int x, int y) { + public void addStorageSlots(boolean expanded) { storageSlotList.clear(); - int lines = this.terminalData == null || !terminalData.expanded ? 3 : 7; + int lines = !expanded ? 3 : 7; for (int i = 0; i < lines; ++i) { for (int j = 0;j < 9;++j) { - storageSlotList.add(new SlotStorage(this.te, i * 9 + j, x + j * 18, y + i * 18)); + storageSlotList.add(new SlotStorage(this.te, i * 9 + j, 13 + j * 18, 21 + i * 18)); } } } @@ -131,7 +127,7 @@ public void broadcastChanges() { tabs.add(nameTag); } tag.put("tabs", tabs); - tag.put("sortSettings", te.sortSettings.toTag()); + Networking.sendToPlayerClient(new SetTerminalSettingsPacket(te.sortSettings, null), (ServerPlayer) pinv.player); Networking.sendToPlayerClient(new ServerToClientStoragePacket(tag), (ServerPlayer) pinv.player); super.broadcastChanges(); } @@ -211,13 +207,6 @@ public void updateItems(List stacks){ public final void receiveClientNBTPacket(CompoundTag message) { if(message.contains("search")) search = message.getString("search"); - if(message.contains("sortSettings")) { - boolean isExpanded = terminalData != null && terminalData.expanded; - terminalData = SortSettings.fromTag(message.getCompound("sortSettings")); - if(isExpanded != terminalData.expanded) { - addStorageSlots(); - } - } } @@ -227,14 +216,11 @@ public void receive(HolderLookup.Provider reg, CompoundTag message) { te.setLastSearch(message.getString("search")); } this.receiveInteract(message); - if(message.contains("termData")) { - CompoundTag d = message.getCompound("termData"); - te.setSorting(SortSettings.fromTag(d.getCompound("sortSettings"))); - selectedTab = null; - if(d.contains("selectedTab")){ - selectedTab = d.getString("selectedTab"); - } - } + } + + public void receiveSettings(SortSettings settings, String selectedTab) { + this.selectedTab = selectedTab; + te.setSorting(settings); } public void receiveInteract(CompoundTag tag) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java index 1016f3d90f..9ad70c4bc9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java @@ -15,6 +15,7 @@ import com.hollingsworth.arsnouveau.common.datagen.BlockTagProvider; import com.hollingsworth.arsnouveau.common.entity.EntityBookwyrm; import com.hollingsworth.arsnouveau.common.entity.goal.bookwyrm.TransferTask; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.config.Config; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; @@ -473,7 +474,7 @@ public int getMaxConnectedInventories() { @Override public void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.saveAdditional(compound, pRegistries); - compound.put("sortSettings", sortSettings.toTag()); + compound.put("settings", ANCodecs.encode(SortSettings.CODEC, sortSettings)); ListTag list = new ListTag(); for (BlockPos pos : connectedInventories) { CompoundTag c = new CompoundTag(); @@ -496,8 +497,8 @@ public void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistri @Override protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { super.loadAdditional(compound, pRegistries); - if (compound.contains("sortSettings")) { - sortSettings = SortSettings.fromTag(compound.getCompound("sortSettings")); + if (compound.contains("settings")) { + sortSettings = ANCodecs.decode(SortSettings.CODEC, compound.getCompound("settings")); } ListTag list = compound.getList("invs", 10); connectedInventories.clear(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java index 116e7cf4ea..fa60e4ef94 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java @@ -12,6 +12,7 @@ import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.network.PacketDistributor; import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.network.handling.DirectionalPayloadHandler; import net.neoforged.neoforge.network.handling.IPayloadContext; import net.neoforged.neoforge.network.registration.PayloadRegistrar; @@ -30,6 +31,7 @@ public static void register(final RegisterPayloadHandlersEvent event) { reg.playToClient(ChangeBiomePacket.TYPE, ChangeBiomePacket.CODEC, Networking::handle); reg.playToServer(PacketSetLauncher.TYPE, PacketSetLauncher.CODEC, Networking::handle); reg.playToServer(ClientToServerStoragePacket.TYPE, ClientToServerStoragePacket.CODEC, Networking::handle); + reg.playBidirectional(SetTerminalSettingsPacket.TYPE, SetTerminalSettingsPacket.CODEC, new DirectionalPayloadHandler<>((msg, ctx) -> ClientMessageHandler.handleClient(msg, ctx), (msg, ctx) -> msg.onServerReceived(ctx.player().getServer(), (ServerPlayer) ctx.player()))); reg.playToClient(HighlightAreaPacket.TYPE, HighlightAreaPacket.CODEC, Networking::handle); reg.playToClient(NotEnoughManaPacket.TYPE, NotEnoughManaPacket.CODEC, Networking::handle); reg.playToClient(PacketAddFadingLight.TYPE, PacketAddFadingLight.CODEC, Networking::handle); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/SetTerminalSettingsPacket.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/SetTerminalSettingsPacket.java new file mode 100644 index 0000000000..9e67e91132 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/SetTerminalSettingsPacket.java @@ -0,0 +1,60 @@ +package com.hollingsworth.arsnouveau.common.network; + +import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.client.container.AbstractStorageTerminalScreen; +import com.hollingsworth.arsnouveau.client.container.SortSettings; +import com.hollingsworth.arsnouveau.client.container.StorageTerminalMenu; +import net.minecraft.client.Minecraft; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; + +import java.util.Optional; + +public class SetTerminalSettingsPacket extends AbstractPacket{ + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("terminal_settings")); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.optional(SortSettings.STREAM_CODEC), + s -> Optional.ofNullable(s.settings), + ByteBufCodecs.optional(ByteBufCodecs.STRING_UTF8), + s -> Optional.ofNullable(s.selectedTab), + SetTerminalSettingsPacket::new); + + public SortSettings settings; + public String selectedTab; + + public SetTerminalSettingsPacket(Optional settings, Optional selectedTab) { + this(settings.orElse(null), selectedTab.orElse(null)); + } + + public SetTerminalSettingsPacket(SortSettings settings, String selectedTab) { + this.settings = settings; + this.selectedTab = selectedTab; + } + + @Override + public Type type() { + return TYPE; + } + + @Override + public void onClientReceived(Minecraft minecraft, Player player) { + super.onClientReceived(minecraft, player); + if (minecraft.screen instanceof AbstractStorageTerminalScreen terminalScreen) { + terminalScreen.receiveSettings(settings); + } + } + + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + super.onServerReceived(minecraftServer, player); + if (player.containerMenu instanceof StorageTerminalMenu terminalScreen){ + terminalScreen.receiveSettings(settings, selectedTab); + } + } +} From 5c8222c9a1eb02877b9706d642ef5c4598332367 Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Tue, 6 Aug 2024 02:39:34 +0200 Subject: [PATCH 121/363] Fix wrong pos in Ritual inv scan (#1373) --- .../java/com/hollingsworth/arsnouveau/api/util/InvUtil.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java index 0bf7b61e89..3062807dd1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java @@ -23,11 +23,13 @@ public class InvUtil { public static List adjacentInventories(Level level, BlockPos pos){ List inventories = new ArrayList<>(); for (Direction d : Direction.values()) { - BlockEntity adjacentInvTile = level.getBlockEntity(pos.relative(d)); + BlockPos relativePos = pos.relative(d); + // TODO: Disentangle inventory handling from block entities due to new capabilities system + BlockEntity adjacentInvTile = level.getBlockEntity(relativePos); if (adjacentInvTile == null || adjacentInvTile.isRemoved()) continue; - IItemHandler handler = level.getCapability(Capabilities.ItemHandler.BLOCK, pos, d); + IItemHandler handler = level.getCapability(Capabilities.ItemHandler.BLOCK, relativePos, d); if(handler == null) continue; inventories.add(new FilterableItemHandler(handler, filtersOnTile(adjacentInvTile))); From 26584c19e1f88366441604e958f34307b02deaa8 Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Wed, 7 Aug 2024 01:57:50 +0200 Subject: [PATCH 122/363] fix look angles (#1378) Knockback fix --- .../common/spell/effect/EffectKnockback.java | 30 ++++++++++++---- .../common/spell/effect/EffectLeap.java | 34 ++++++++++++++----- 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectKnockback.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectKnockback.java index 680cf68b4c..3f4de7f04a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectKnockback.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectKnockback.java @@ -1,7 +1,13 @@ package com.hollingsworth.arsnouveau.common.spell.effect; import com.hollingsworth.arsnouveau.api.spell.*; +import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.IWrappedCaster; +import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.LivingCaster; +import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.TileCaster; import com.hollingsworth.arsnouveau.api.util.SpellUtil; +import com.hollingsworth.arsnouveau.common.block.tile.BasicSpellTurretTile; +import com.hollingsworth.arsnouveau.common.block.tile.RotatingTurretTile; +import com.hollingsworth.arsnouveau.common.block.tile.RuneTile; import com.hollingsworth.arsnouveau.common.entity.EnchantedFallingBlock; import com.hollingsworth.arsnouveau.common.items.curios.ShapersFocus; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; @@ -12,6 +18,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; @@ -21,6 +28,8 @@ import java.util.List; import java.util.Set; +import static net.minecraft.world.level.block.state.properties.BlockStateProperties.FACING; + public class EffectKnockback extends AbstractEffect { public static EffectKnockback INSTANCE = new EffectKnockback(); @@ -32,7 +41,7 @@ private EffectKnockback() { public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { float strength = (float) (GENERIC_DOUBLE.get() + AMP_VALUE.get() * spellStats.getAmpMultiplier()); - knockback(rayTraceResult.getEntity(), shooter, strength); + knockback(rayTraceResult.getEntity(), spellContext.getCaster(), strength); rayTraceResult.getEntity().hurtMarked = true; } @@ -46,14 +55,23 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull for (BlockPos p : posList) { EnchantedFallingBlock fallingBlock = EnchantedFallingBlock.fall(world, p, shooter, spellContext, resolver, spellStats); if (fallingBlock != null) { - knockback(fallingBlock, shooter, strength); + knockback(fallingBlock, spellContext.getCaster(), strength); ShapersFocus.tryPropagateEntitySpell(fallingBlock, world, shooter, spellContext, resolver); } } } - public void knockback(Entity target, LivingEntity shooter, float strength) { - knockback(target, strength, Mth.sin(shooter.yRot * ((float) Math.PI / 180F)), -Mth.cos(shooter.yRot * ((float) Math.PI / 180F))); + public void knockback(Entity target, @NotNull IWrappedCaster shooter, float strength) { + float v = 0; + if (shooter instanceof TileCaster tc) { + BlockEntity tile = tc.getTile(); + if (tile instanceof RotatingTurretTile rotatingTurretTile) { + v = rotatingTurretTile.getRotationY(); + } else if (tile instanceof BasicSpellTurretTile || tile instanceof RuneTile) { + v = tile.getBlockState().getValue(FACING).toYRot(); + } + } else if (shooter instanceof LivingCaster lc) v = lc.livingEntity.yRot; + knockback(target, strength, Mth.sin(v * ((float) Math.PI / 180F)), -Mth.cos(v * ((float) Math.PI / 180F))); } public void knockback(Entity entity, double strength, double xRatio, double zRatio) { @@ -79,7 +97,7 @@ public int getDefaultManaCost() { return 15; } - @NotNull + @NotNull @Override public Set getCompatibleAugments() { return augmentSetOf(AugmentAmplify.INSTANCE, AugmentDampen.INSTANCE, AugmentAOE.INSTANCE, AugmentPierce.INSTANCE, AugmentSensitive.INSTANCE); @@ -90,7 +108,7 @@ public String getBookDescription() { return "Knocks a target or block away a short distance from the caster. Sensitive will stop this spell from launching blocks."; } - @NotNull + @NotNull @Override public Set getSchools() { return setOf(SpellSchools.ELEMENTAL_AIR); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLeap.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLeap.java index 005c7f0c5e..ff909d4fc8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLeap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLeap.java @@ -1,18 +1,20 @@ package com.hollingsworth.arsnouveau.common.spell.effect; import com.hollingsworth.arsnouveau.api.spell.*; +import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.TileCaster; import com.hollingsworth.arsnouveau.api.util.SpellUtil; +import com.hollingsworth.arsnouveau.common.block.tile.BasicSpellTurretTile; +import com.hollingsworth.arsnouveau.common.block.tile.RotatingTurretTile; +import com.hollingsworth.arsnouveau.common.block.tile.RuneTile; import com.hollingsworth.arsnouveau.common.entity.EnchantedFallingBlock; import com.hollingsworth.arsnouveau.common.items.curios.ShapersFocus; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; -import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAOE; -import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; -import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDampen; -import com.hollingsworth.arsnouveau.common.spell.augment.AugmentPierce; +import com.hollingsworth.arsnouveau.common.spell.augment.*; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; @@ -22,6 +24,8 @@ import java.util.List; import java.util.Set; +import static net.minecraft.world.level.block.state.properties.BlockStateProperties.FACING; + public class EffectLeap extends AbstractEffect { public static EffectLeap INSTANCE = new EffectLeap(); @@ -34,14 +38,12 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul Entity entity = rayTraceResult.getEntity(); double bonus; Vec3 vector; - if (NERF.get() && entity == shooter && !shooter.onGround()) { - return; - } + if (NERF.get() && entity == shooter && !shooter.onGround()) return; if (entity instanceof LivingEntity) { vector = entity.getLookAngle(); bonus = Math.max(0, GENERIC_DOUBLE.get() + AMP_VALUE.get() * spellStats.getAmpMultiplier()); } else { - vector = shooter.getLookAngle(); + vector = getLookVector(shooter, spellContext); bonus = GENERIC_DOUBLE.get() + AMP_VALUE.get() * spellStats.getAmpMultiplier(); } entity.setDeltaMovement(vector.x * bonus, vector.y * bonus, vector.z * bonus); @@ -49,13 +51,27 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul entity.hurtMarked = true; } + public static Vec3 getLookVector(@NotNull LivingEntity shooter, SpellContext spellContext) { + Vec3 vector; + vector = shooter.getLookAngle(); + if (spellContext.getCaster() instanceof TileCaster tc) { + BlockEntity tile = tc.getTile(); + if (tile instanceof RotatingTurretTile rotatingTurretTile) { + vector = rotatingTurretTile.getShootAngle(); + } else if (tile instanceof BasicSpellTurretTile || tile instanceof RuneTile) { + vector = new Vec3(tile.getBlockState().getValue(FACING).step()); + } + } + return vector; + } + @Override public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { List posList = SpellUtil.calcAOEBlocks(shooter, rayTraceResult.getBlockPos(), rayTraceResult, spellStats); for (BlockPos pos1 : posList) { EnchantedFallingBlock entity = EnchantedFallingBlock.fall(world, pos1, shooter, spellContext, resolver, spellStats); if (entity != null) { - Vec3 vector = shooter.getLookAngle(); + Vec3 vector = getLookVector(shooter, spellContext); double bonus = GENERIC_DOUBLE.get() + AMP_VALUE.get() * spellStats.getAmpMultiplier(); entity.setDeltaMovement(vector.x * bonus, vector.y * bonus, vector.z * bonus); entity.hurtMarked = true; From 13fabf590d307622f800dd296ba024338e1d483c Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Wed, 7 Aug 2024 02:39:20 +0200 Subject: [PATCH 123/363] =?UTF-8?q?Move=20curio=20to=20datagen,=20fix=20LG?= =?UTF-8?q?M=20using=20old=20forge=20cond,=20fix=20wilDen=20using=E2=80=A6?= =?UTF-8?q?=20(#1380)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Move curio to datagen, fix LGM using old forge cond, fix wilDen using old forge tag * Fix scribing returning false for BlankParchmentItem * Fix keepNbt with data components, up neo version --- gradle.properties | 2 +- .../b7d20159a598c550a793f4787d1e0a9f9d0b61c6 | 7 ++++ .../curios/entities/an_curios.json | 12 ++++++ .../ars_nouveau/curios/slots/an_focus.json | 6 ++- .../data/ars_nouveau/curios/slots/belt.json | 0 .../data/ars_nouveau/curios/slots/head.json | 0 .../ars_nouveau/curios/slots/necklace.json | 0 .../data/ars_nouveau/curios/slots/ring.json | 0 .../arsnouveau/api/item/ICasterTool.java | 42 +++++++++---------- .../api/registry/SpellCasterRegistry.java | 5 +++ .../arsnouveau/api/spell/AbstractCaster.java | 28 +++++++------ .../common/block/tile/MobJarTile.java | 14 ++++--- .../common/block/tile/ModdedTile.java | 7 ++-- .../common/block/tile/ScribesTile.java | 15 +++---- .../crafting/recipes/ArmorUpgradeRecipe.java | 13 +++--- .../crafting/recipes/BookUpgradeRecipe.java | 7 ++-- .../common/crafting/recipes/DyeRecipe.java | 7 ++-- .../recipes/EnchantingApparatusRecipe.java | 19 +++++---- .../crafting/recipes/EnchantmentRecipe.java | 13 +++--- .../recipes/ReactiveEnchantmentRecipe.java | 10 ++--- .../crafting/recipes/SpellWriteRecipe.java | 11 ++--- .../common/datagen/ANCurioProvider.java | 34 +++++++++++++++ .../arsnouveau/common/datagen/ModDatagen.java | 2 + .../common/items/BlankParchmentItem.java | 3 +- .../ars_nouveau/curios/entities/player.json | 4 -- .../loot_modifiers/dungeon_loot.json | 30 ++++++------- .../structure/guardian_wilden_den.json | 2 +- 27 files changed, 183 insertions(+), 110 deletions(-) create mode 100644 src/generated/resources/.cache/b7d20159a598c550a793f4787d1e0a9f9d0b61c6 create mode 100644 src/generated/resources/data/ars_nouveau/curios/entities/an_curios.json rename src/{main => generated}/resources/data/ars_nouveau/curios/slots/an_focus.json (64%) rename src/{main => generated}/resources/data/ars_nouveau/curios/slots/belt.json (100%) rename src/{main => generated}/resources/data/ars_nouveau/curios/slots/head.json (100%) rename src/{main => generated}/resources/data/ars_nouveau/curios/slots/necklace.json (100%) rename src/{main => generated}/resources/data/ars_nouveau/curios/slots/ring.json (100%) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/datagen/ANCurioProvider.java delete mode 100644 src/main/resources/data/ars_nouveau/curios/entities/player.json diff --git a/gradle.properties b/gradle.properties index 1d44bc9bb7..865e285336 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ neogradle.subsystems.parchment.mappingsVersion=2024.05.01 minecraft_version=1.21.0 parchment_version=2024.05.01 minecraft_version_range=[1.20.6,1.21) -neo_version=21.0.113-beta +neo_version=21.0.163 neo_version_range=[20.6,) loader_version_range=[2,) diff --git a/src/generated/resources/.cache/b7d20159a598c550a793f4787d1e0a9f9d0b61c6 b/src/generated/resources/.cache/b7d20159a598c550a793f4787d1e0a9f9d0b61c6 new file mode 100644 index 0000000000..7380a67063 --- /dev/null +++ b/src/generated/resources/.cache/b7d20159a598c550a793f4787d1e0a9f9d0b61c6 @@ -0,0 +1,7 @@ +// 1.21 2024-08-06T14:35:24.0835043 Curios for ars_nouveau +a515afa522bcbf0b8b05736bae63a9af4054cf26 data/ars_nouveau/curios/entities/an_curios.json +84db829ff6895b514af66069168752d2bc107a02 data/ars_nouveau/curios/slots/an_focus.json +240e1f476f220fc486f85d0132786a1374faaa46 data/ars_nouveau/curios/slots/belt.json +240e1f476f220fc486f85d0132786a1374faaa46 data/ars_nouveau/curios/slots/head.json +240e1f476f220fc486f85d0132786a1374faaa46 data/ars_nouveau/curios/slots/necklace.json +73c12c96c060bd6e4fc4f3fd712b76dce176a840 data/ars_nouveau/curios/slots/ring.json diff --git a/src/generated/resources/data/ars_nouveau/curios/entities/an_curios.json b/src/generated/resources/data/ars_nouveau/curios/entities/an_curios.json new file mode 100644 index 0000000000..ff857210c4 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/curios/entities/an_curios.json @@ -0,0 +1,12 @@ +{ + "entities": [ + "minecraft:player" + ], + "slots": [ + "head", + "ring", + "belt", + "necklace", + "an_focus" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/ars_nouveau/curios/slots/an_focus.json b/src/generated/resources/data/ars_nouveau/curios/slots/an_focus.json similarity index 64% rename from src/main/resources/data/ars_nouveau/curios/slots/an_focus.json rename to src/generated/resources/data/ars_nouveau/curios/slots/an_focus.json index 283c97da31..fb03969b05 100644 --- a/src/main/resources/data/ars_nouveau/curios/slots/an_focus.json +++ b/src/generated/resources/data/ars_nouveau/curios/slots/an_focus.json @@ -1,6 +1,8 @@ { + "icon": "curios:slot/empty_curio_slot", "order": 1, "size": 1, - "icon": "curios:slot/empty_curio_slot", - "validators": ["curios:tag"] + "validators": [ + "curios:tag" + ] } \ No newline at end of file diff --git a/src/main/resources/data/ars_nouveau/curios/slots/belt.json b/src/generated/resources/data/ars_nouveau/curios/slots/belt.json similarity index 100% rename from src/main/resources/data/ars_nouveau/curios/slots/belt.json rename to src/generated/resources/data/ars_nouveau/curios/slots/belt.json diff --git a/src/main/resources/data/ars_nouveau/curios/slots/head.json b/src/generated/resources/data/ars_nouveau/curios/slots/head.json similarity index 100% rename from src/main/resources/data/ars_nouveau/curios/slots/head.json rename to src/generated/resources/data/ars_nouveau/curios/slots/head.json diff --git a/src/main/resources/data/ars_nouveau/curios/slots/necklace.json b/src/generated/resources/data/ars_nouveau/curios/slots/necklace.json similarity index 100% rename from src/main/resources/data/ars_nouveau/curios/slots/necklace.json rename to src/generated/resources/data/ars_nouveau/curios/slots/necklace.json diff --git a/src/main/resources/data/ars_nouveau/curios/slots/ring.json b/src/generated/resources/data/ars_nouveau/curios/slots/ring.json similarity index 100% rename from src/main/resources/data/ars_nouveau/curios/slots/ring.json rename to src/generated/resources/data/ars_nouveau/curios/slots/ring.json diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java index 0ed94ab05c..cee9f9f930 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICasterTool.java @@ -17,7 +17,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -32,22 +32,14 @@ default boolean onScribe(Level world, BlockPos pos, Player player, InteractionHa AbstractCaster tableCaster = SpellCasterRegistry.from(tableStack); if (!((heldStack.getItem() instanceof SpellBook) || (heldStack.getItem() instanceof SpellParchment) || (heldStack.getItem() == ItemsRegistry.MANIPULATION_ESSENCE.asItem()))) return false; - if(tableCaster == null){ + if (tableCaster == null) { return false; } - boolean success; AbstractCaster heldCaster = SpellCasterRegistry.from(heldStack); Spell spell = new Spell(); - if (heldCaster != null) { - spell = heldCaster.getSpell(); - tableCaster.setColor(heldCaster.getColor()) - .setFlavorText(heldCaster.getFlavorText()) - .setSpellName(heldCaster.getSpellName()) - .setSound(heldCaster.getCurrentSound()) - .saveToStack(tableStack); - - } else if (heldStack.getItem() == ItemsRegistry.MANIPULATION_ESSENCE.asItem()) { + // If the held item is a manipulation essence, set the spell to a random hidden spell + if (heldStack.getItem() == ItemsRegistry.MANIPULATION_ESSENCE.asItem()) { // Thanks mojang String[] words = new String[]{"the", "elder", "scrolls", "klaatu", "berata", "niktu", "xyzzy", "bless", "curse", "light", "darkness", "fire", "air", "earth", "water", "hot", "dry", "cold", "wet", "ignite", "snuff", "embiggen", "twist", "shorten", "stretch", "fiddle", "destroy", "imbue", "galvanize", "enchant", "free", "limited", "range", "of", "towards", "inside", "sphere", "cube", "self", "other", "ball", "mental", "physical", "grow", "shrink", "demon", "elemental", "spirit", "animal", "creature", "beast", "humanoid", "undead", "fresh", "stale", "phnglui", "mglwnafh", "cthulhu", "rlyeh", "wgahnagl", "fhtagn", "baguette"}; // Pick between 3 and 5 words @@ -62,14 +54,25 @@ default boolean onScribe(Level world, BlockPos pos, Player player, InteractionHa PortUtil.sendMessageNoSpam(player, Component.translatable("ars_nouveau.spell_hidden")); return true; } + // If the held caster is not null, set the spell to the held caster's spell + if (heldCaster != null) { + spell = heldCaster.getSpell(); + tableCaster.setColor(heldCaster.getColor()) + .setFlavorText(heldCaster.getFlavorText()) + .setSpellName(heldCaster.getSpellName()) + .setSound(heldCaster.getCurrentSound()) + .saveToStack(tableStack); + + } + // modify the spell (ex. add Amplify with Enchanter Sword) if valid and then send the appropriate message if (isScribedSpellValid(tableCaster, player, handIn, tableStack, spell)) { var mutableSpell = spell.mutable(); scribeModifiedSpell(tableCaster, player, handIn, tableStack, mutableSpell); tableCaster.setSpell(mutableSpell.immutable()).saveToStack(tableStack); sendSetMessage(player); - } else { - sendInvalidMessage(player); + return true; } + sendInvalidMessage(player); return false; } @@ -82,23 +85,20 @@ default void sendInvalidMessage(Player player) { } @Override - default @NotNull AbstractCaster getSpellCaster(ItemStack stack) { + default @Nullable AbstractCaster getSpellCaster(ItemStack stack) { return SpellCasterRegistry.from(stack); } - default void scribeModifiedSpell(AbstractCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell){} + default void scribeModifiedSpell(AbstractCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell.Mutable spell) { + } default boolean isScribedSpellValid(AbstractCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { return spell.isValid(); } - @Override - default boolean shouldDisplay(ItemStack stack) { - return true; - } - default void getInformation(ItemStack stack, Item.TooltipContext context, List tooltip2, TooltipFlag flagIn) { AbstractCaster caster = getSpellCaster(stack); + if (caster == null) return; stack.addToTooltip(caster.getComponentType(), context, tooltip2::add, flagIn); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellCasterRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellCasterRegistry.java index 222550ca54..766053f48b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellCasterRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/SpellCasterRegistry.java @@ -11,6 +11,7 @@ import javax.annotation.Nullable; import java.util.concurrent.ConcurrentHashMap; +@SuppressWarnings("deprecation") public class SpellCasterRegistry { private static final ConcurrentHashMap MAP = new ConcurrentHashMap<>(); @@ -29,6 +30,10 @@ public class SpellCasterRegistry { return MAP.getOrDefault(stack.getItem().builtInRegistryHolder().key().location(), (s) -> s.get(DataComponentRegistry.SPELL_CASTER)).getSpellCaster(stack); } + public static boolean hasCaster(ItemStack stack) { + return MAP.containsKey(stack.getItem().builtInRegistryHolder().key().location()); + } + public static void register(ItemLike itemLike, ItemCasterProvider provider){ MAP.put(itemLike.asItem().builtInRegistryHolder().key().location(), provider); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java index 7ea8472688..0ad2e1a72a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java @@ -51,7 +51,7 @@ import java.util.Objects; import java.util.function.Consumer; -public abstract class AbstractCaster > implements TooltipProvider { +public abstract class AbstractCaster> implements TooltipProvider { public static > MapCodec createCodec(Function6 constructor) { return RecordCodecBuilder.mapCodec(instance -> instance.group( @@ -71,6 +71,7 @@ public static > StreamCodec codec(); + public abstract StreamCodec streamCodec(); protected final SpellSlotMap spells; @@ -80,7 +81,7 @@ public static > StreamCodec other) { return self; } - public void saveToStack(ItemStack stack){ + @SuppressWarnings("unchecked") + public void saveToStack(ItemStack stack) { stack.set(this.getComponentType(), this); } + @SuppressWarnings("rawtypes") public abstract DataComponentType getComponentType(); public SpellResolver getSpellResolver(SpellContext context, Level worldIn, LivingEntity playerIn, InteractionHand handIn) { @@ -325,6 +328,7 @@ public void playSound(BlockPos pos, Level worldIn, @Nullable Entity playerIn, Co return; worldIn.playSound(null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, configuredSound.getSound().getSoundEvent(), source, configuredSound.getVolume(), configuredSound.getPitch()); } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -345,7 +349,7 @@ public int hashCode() { protected abstract T build(int slot, String flavorText, Boolean isHidden, String hiddenText, int maxSlots, SpellSlotMap spells); @Override - public void addToTooltip(Item.TooltipContext pContext, Consumer pTooltipAdder, TooltipFlag pTooltipFlag) { + public void addToTooltip(Item.@NotNull TooltipContext pContext, @NotNull Consumer pTooltipAdder, @NotNull TooltipFlag pTooltipFlag) { if (getSpell().isEmpty()) { pTooltipAdder.accept(Component.translatable("ars_nouveau.tooltip.can_inscribe")); return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java index 8d4895157c..8c2814d8fb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MobJarTile.java @@ -87,7 +87,9 @@ public boolean setEntityData(@NotNull Entity entity){ public void writeSimple(Entity e){ CompoundTag tag = new CompoundTag(); tag.putString("id", EntityType.getKey(e.getType()).toString()); + if (level == null) return; this.cachedEntity = e.getType().create(level); + assert cachedEntity != null; this.cachedEntity.setBoundingBox(new AABB(0,0,0,0,0,0)); this.cachedEntity.setPos(worldPosition.getX() + 0.5, worldPosition.getY() + 0.5, worldPosition.getZ() + 0.5); this.extraDataTag = null; @@ -129,7 +131,7 @@ public int calculateLight(){ @Override public boolean onDispel(@NotNull LivingEntity caster) { - if(entityTag == null) + if (entityTag == null || level == null) return false; Entity entity = loadEntityFromTag(level, entityTag); if(entity == null || entity.getType().is(EntityTags.JAR_RELEASE_BLACKLIST)) @@ -157,7 +159,7 @@ public void setExtraDataTag(CompoundTag tag){ } @Override - public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + public void saveAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider pRegistries) { super.saveAdditional(tag, pRegistries); // Check both conditions because the entity may have never been loaded on the server side. @@ -176,7 +178,7 @@ public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { } @Override - protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { + protected void loadAdditional(@NotNull CompoundTag pTag, HolderLookup.@NotNull Provider pRegistries) { super.loadAdditional(pTag, pRegistries); if(pTag.contains("entityTag")){ this.entityTag = pTag.getCompound("entityTag"); @@ -186,7 +188,7 @@ protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistrie } @Override - public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, HolderLookup.Provider lookupProvider) { + public void onDataPacket(@NotNull Connection net, @NotNull ClientboundBlockEntityDataPacket pkt, HolderLookup.@NotNull Provider lookupProvider) { this.cachedEntity = null; this.entityTag = null; super.onDataPacket(net, pkt, lookupProvider); @@ -235,7 +237,7 @@ public void getTooltip(List tooltip) { @Override - protected void applyImplicitComponents(DataComponentInput pComponentInput) { + protected void applyImplicitComponents(@NotNull DataComponentInput pComponentInput) { super.applyImplicitComponents(pComponentInput); var jar = pComponentInput.getOrDefault(DataComponentRegistry.MOB_JAR, new MobJarData(Optional.empty(), Optional.empty())); this.entityTag = jar.entityTag().orElse(null); @@ -243,7 +245,7 @@ protected void applyImplicitComponents(DataComponentInput pComponentInput) { } @Override - protected void collectImplicitComponents(DataComponentMap.Builder pComponents) { + protected void collectImplicitComponents(DataComponentMap.@NotNull Builder pComponents) { super.collectImplicitComponents(pComponents); pComponents.set(DataComponentRegistry.MOB_JAR, new MobJarData(this.entityTag, this.extraDataTag)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ModdedTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ModdedTile.java index 3cbe59ae46..62c076724e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ModdedTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ModdedTile.java @@ -9,6 +9,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -29,9 +30,9 @@ public ClientboundBlockEntityDataPacket getUpdatePacket() { } @Override - public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, HolderLookup.Provider lookupProvider) { + public void onDataPacket(@NotNull Connection net, @NotNull ClientboundBlockEntityDataPacket pkt, HolderLookup.@NotNull Provider lookupProvider) { super.onDataPacket(net, pkt, lookupProvider); - handleUpdateTag(pkt.getTag() == null ? new CompoundTag() : pkt.getTag(), lookupProvider); + handleUpdateTag(pkt.getTag(), lookupProvider); } public boolean updateBlock() { @@ -45,7 +46,7 @@ public boolean updateBlock() { } @Override - public CompoundTag getUpdateTag(HolderLookup.Provider pRegistries) { + public @NotNull CompoundTag getUpdateTag(HolderLookup.@NotNull Provider pRegistries) { CompoundTag tag = new CompoundTag(); this.saveAdditional(tag, pRegistries); return tag; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java index 24ae9d109f..c3264f2d54 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ScribesTile.java @@ -37,6 +37,7 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.items.IItemHandler; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoAnimatable; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -263,7 +264,7 @@ public void onWanded(Player playerEntity) { } @Override - protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + protected void loadAdditional(@NotNull CompoundTag compound, HolderLookup.@NotNull Provider pRegistries) { super.loadAdditional(compound, pRegistries); stack = ItemStack.parseOptional(pRegistries, compound.getCompound("itemStack")); if (compound.contains("recipe")) { @@ -278,7 +279,7 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis } @Override - public void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + public void saveAdditional(@NotNull CompoundTag compound, HolderLookup.@NotNull Provider pRegistries) { super.saveAdditional(compound, pRegistries); if (!stack.isEmpty()) { Tag reagentTag = stack.save(pRegistries); @@ -334,7 +335,7 @@ public boolean isEmpty() { } @Override - public ItemStack getItem(int pIndex) { + public @NotNull ItemStack getItem(int pIndex) { return stack; } @@ -344,7 +345,7 @@ public int size() { } @Override - public ItemStack removeItem(int pIndex, int pCount) { + public @NotNull ItemStack removeItem(int pIndex, int pCount) { ItemStack removed = stack.copy().split(pCount); stack.shrink(pCount); updateBlock(); @@ -352,7 +353,7 @@ public ItemStack removeItem(int pIndex, int pCount) { } @Override - public ItemStack removeItemNoUpdate(int pIndex) { + public @NotNull ItemStack removeItemNoUpdate(int pIndex) { ItemStack stack = this.stack.copy(); this.stack = ItemStack.EMPTY; updateBlock(); @@ -360,13 +361,13 @@ public ItemStack removeItemNoUpdate(int pIndex) { } @Override - public void setItem(int pIndex, ItemStack pStack) { + public void setItem(int pIndex, @NotNull ItemStack pStack) { this.stack = pStack; setChanged(); } @Override - public boolean stillValid(Player pPlayer) { + public boolean stillValid(@NotNull Player pPlayer) { return true; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java index 53e68b43f9..ee49fd9891 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java @@ -18,6 +18,7 @@ import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -58,12 +59,12 @@ public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.a } @Override - public ItemStack getResultItem(HolderLookup.Provider pRegistries) { + public @NotNull ItemStack getResultItem(HolderLookup.@NotNull Provider pRegistries) { return ItemStack.EMPTY; } @Override - public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider p_346030_) { + public @NotNull ItemStack assemble(ApparatusRecipeInput input, HolderLookup.@NotNull Provider p_346030_) { ItemStack reagent = input.catalyst(); ArmorPerkHolder perkHolder = PerkUtil.getPerkHolder(reagent); if(!(perkHolder instanceof ArmorPerkHolder armorPerkHolder)){ @@ -74,7 +75,7 @@ public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider p_34 } @Override - public RecipeType getType() { + public @NotNull RecipeType getType() { return RecipeRegistry.ARMOR_UPGRADE_TYPE.get(); } @@ -84,7 +85,7 @@ public Component getOutputComponent() { } @Override - public RecipeSerializer getSerializer() { + public @NotNull RecipeSerializer getSerializer() { return RecipeRegistry.ARMOR_SERIALIZER.get(); } @@ -98,12 +99,12 @@ public static class Serializer implements RecipeSerializer { public static StreamCodec STREAM_CODEC = CheatSerializer.create(CODEC); @Override - public MapCodec codec() { + public @NotNull MapCodec codec() { return CODEC; } @Override - public StreamCodec streamCodec() { + public @NotNull StreamCodec streamCodec() { return STREAM_CODEC; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BookUpgradeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BookUpgradeRecipe.java index 01655470dc..01b43d82df 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BookUpgradeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/BookUpgradeRecipe.java @@ -6,6 +6,7 @@ import net.minecraft.core.NonNullList; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.*; +import org.jetbrains.annotations.NotNull; public class BookUpgradeRecipe extends ShapelessRecipe { @@ -14,14 +15,14 @@ public BookUpgradeRecipe(final String group, CraftingBookCategory category, fina } @Override - public ItemStack assemble(final CraftingInput inv, HolderLookup.Provider p_266797_) { + public @NotNull ItemStack assemble(final @NotNull CraftingInput inv, HolderLookup.@NotNull Provider p_266797_) { final ItemStack output = super.assemble(inv, p_266797_); // Get the default output if (!output.isEmpty()) { for (int i = 0; i < inv.size(); i++) { // For each slot in the crafting inventory, final ItemStack ingredient = inv.getItem(i); // Get the ingredient in the slot if (!ingredient.isEmpty() && ingredient.getItem() instanceof SpellBook) { - output.applyComponents(ingredient.getComponents()); + output.applyComponents(ingredient.getComponentsPatch()); } } } @@ -30,7 +31,7 @@ public ItemStack assemble(final CraftingInput inv, HolderLookup.Provider p_26679 } @Override - public RecipeSerializer getSerializer() { + public @NotNull RecipeSerializer getSerializer() { return RecipeRegistry.BOOK_UPGRADE_RECIPE.get(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java index 5478096334..e7954b5385 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DyeRecipe.java @@ -6,6 +6,7 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.*; +import org.jetbrains.annotations.NotNull; public class DyeRecipe extends ShapelessRecipe { @@ -14,13 +15,13 @@ public DyeRecipe(String groupIn, CraftingBookCategory category, ItemStack recipe } @Override - public ItemStack assemble(CraftingInput inv, HolderLookup.Provider p_266797_) { + public @NotNull ItemStack assemble(@NotNull CraftingInput inv, HolderLookup.@NotNull Provider p_266797_) { ItemStack output = super.assemble(inv, p_266797_); if (!output.isEmpty()) { for (int i = 0; i < inv.size(); i++) { // For each slot in the crafting inventory, final ItemStack ingredient = inv.getItem(i); // Get the ingredient in the slot if (!ingredient.isEmpty() && ingredient.getItem() instanceof IDyeable) { - output.applyComponents(ingredient.getComponents()); + output.applyComponents(ingredient.getComponentsPatch()); } } for (int i = 0; i < inv.size(); i++) { // For each slot in the crafting inventory, @@ -37,7 +38,7 @@ public ItemStack assemble(CraftingInput inv, HolderLookup.Provider p_266797_) { } @Override - public RecipeSerializer getSerializer() { + public @NotNull RecipeSerializer getSerializer() { return RecipeRegistry.DYE_RECIPE.get(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantingApparatusRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantingApparatusRecipe.java index 3f1290d13c..754a430ed6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantingApparatusRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantingApparatusRecipe.java @@ -15,6 +15,7 @@ import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.List; @@ -29,7 +30,7 @@ public class EnchantingApparatusRecipe implements IEnchantingRecipe { private final boolean keepNbtOfReagent; - public EnchantingApparatusRecipe(Ingredient reagent, ItemStack result, List pedestalItems, int sourceCost, boolean keepNbtOfReagent){ + public EnchantingApparatusRecipe(Ingredient reagent, ItemStack result, List pedestalItems, int sourceCost, boolean keepNbtOfReagent) { this.reagent = reagent; this.result = result; this.pedestalItems = pedestalItems; @@ -38,7 +39,7 @@ public EnchantingApparatusRecipe(Ingredient reagent, ItemStack result, List inputs, List reci } @Override - public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider p_346030_) { + public @NotNull ItemStack assemble(ApparatusRecipeInput input, HolderLookup.@NotNull Provider p_346030_) { ItemStack result = this.result.copy(); ItemStack reagent = input.catalyst(); if (keepNbtOfReagent) { - result.applyComponents(reagent.getComponents()); + result.applyComponents(reagent.getComponentsPatch()); result.setDamageValue(0); } return result.copy(); @@ -83,17 +84,17 @@ public int sourceCost() { } @Override - public ItemStack getResultItem(HolderLookup.Provider pRegistries) { + public @NotNull ItemStack getResultItem(HolderLookup.@NotNull Provider pRegistries) { return this.result.copy(); } @Override - public RecipeSerializer getSerializer() { + public @NotNull RecipeSerializer getSerializer() { return RecipeRegistry.APPARATUS_SERIALIZER.get(); } @Override - public RecipeType getType() { + public @NotNull RecipeType getType() { return RecipeRegistry.APPARATUS_TYPE.get(); } @@ -138,12 +139,12 @@ public static class Serializer implements RecipeSerializer codec() { + public @NotNull MapCodec codec() { return CODEC; } @Override - public StreamCodec streamCodec() { + public @NotNull StreamCodec streamCodec() { return STREAM_CODEC; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantmentRecipe.java index 33390dc2f7..a48ce3bf98 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantmentRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantmentRecipe.java @@ -23,6 +23,7 @@ import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.ItemEnchantments; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.ArrayList; @@ -43,7 +44,7 @@ public EnchantmentRecipe(List pedestalItems, ResourceKey getType() { + public @NotNull RecipeType getType() { return RecipeRegistry.ENCHANTMENT_TYPE.get(); } @@ -96,7 +97,7 @@ public boolean doesReagentMatch(ApparatusRecipeInput input, Level world, @Nullab } @Override - public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider lookup) { + public @NotNull ItemStack assemble(ApparatusRecipeInput input, HolderLookup.@NotNull Provider lookup) { ItemStack inStack = input.catalyst(); ItemStack stack = inStack.getItem() == Items.BOOK ? new ItemStack(Items.ENCHANTED_BOOK) : inStack.copy(); ItemEnchantments enchantments = EnchantmentHelper.getEnchantmentsForCrafting(stack); @@ -108,12 +109,12 @@ public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider look } @Override - public ItemStack getResultItem(HolderLookup.Provider pRegistries) { + public @NotNull ItemStack getResultItem(HolderLookup.@NotNull Provider pRegistries) { return ItemStack.EMPTY; } @Override - public RecipeSerializer getSerializer() { + public @NotNull RecipeSerializer getSerializer() { return RecipeRegistry.ENCHANTMENT_SERIALIZER.get(); } @@ -147,12 +148,12 @@ public static class Serializer implements RecipeSerializer { ); @Override - public MapCodec codec() { + public @NotNull MapCodec codec() { return CODEC; } @Override - public StreamCodec streamCodec() { + public @NotNull StreamCodec streamCodec() { return STREAM_CODEC; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java index d0d176ce34..77a56e405a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java @@ -30,7 +30,7 @@ public ReactiveEnchantmentRecipe(List pedestalItems, int sourceCost) } @Override - public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider lookup) { + public @NotNull ItemStack assemble(ApparatusRecipeInput input, HolderLookup.@NotNull Provider lookup) { ItemStack result = super.assemble(input, lookup); ItemStack parchment = getParchment(input.pedestals()); AbstractCaster parchmentCaster = SpellCasterRegistry.from(parchment); @@ -56,12 +56,12 @@ public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.a } @Override - public RecipeType getType() { + public @NotNull RecipeType getType() { return RecipeRegistry.REACTIVE_TYPE.get(); } @Override - public RecipeSerializer getSerializer() { + public @NotNull RecipeSerializer getSerializer() { return RecipeRegistry.REACTIVE_RECIPE.get(); } @@ -76,12 +76,12 @@ public static class Serializer implements RecipeSerializer STREAM = CheatSerializer.create(CODEC); @Override - public MapCodec codec() { + public @NotNull MapCodec codec() { return CODEC; } @Override - public StreamCodec streamCodec() { + public @NotNull StreamCodec streamCodec() { return STREAM; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java index 29b0ac9eda..7f205996be 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java @@ -22,6 +22,7 @@ import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.enchantment.ItemEnchantments; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -53,7 +54,7 @@ public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.a } @Override - public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider p_346030_) { + public @NotNull ItemStack assemble(ApparatusRecipeInput input, HolderLookup.@NotNull Provider p_346030_) { ItemStack parchment = getParchment(input.pedestals()); AbstractCaster caster = SpellCasterRegistry.from(parchment); ItemStack result = input.catalyst().copy(); @@ -64,7 +65,7 @@ public ItemStack assemble(ApparatusRecipeInput input, HolderLookup.Provider p_34 } @Override - public RecipeType getType() { + public @NotNull RecipeType getType() { return RecipeRegistry.SPELL_WRITE_TYPE.get(); } @@ -75,7 +76,7 @@ public Component getOutputComponent() { @Override - public RecipeSerializer getSerializer() { + public @NotNull RecipeSerializer getSerializer() { return RecipeRegistry.SPELL_WRITE_RECIPE.get(); } @@ -90,12 +91,12 @@ public static class Serializer implements RecipeSerializer { public static final StreamCodec STREAM = CheatSerializer.create(CODEC); @Override - public MapCodec codec() { + public @NotNull MapCodec codec() { return CODEC; } @Override - public StreamCodec streamCodec() { + public @NotNull StreamCodec streamCodec() { return STREAM; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ANCurioProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ANCurioProvider.java new file mode 100644 index 0000000000..d1f5031e7c --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ANCurioProvider.java @@ -0,0 +1,34 @@ +package com.hollingsworth.arsnouveau.common.datagen; + +import com.hollingsworth.arsnouveau.ArsNouveau; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import top.theillusivec4.curios.api.CuriosDataProvider; + +import java.util.concurrent.CompletableFuture; + +public class ANCurioProvider extends CuriosDataProvider { + public ANCurioProvider(PackOutput output, ExistingFileHelper fileHelper, CompletableFuture registries) { + super(ArsNouveau.MODID, output, fileHelper, registries); + } + + @Override + public void generate(HolderLookup.Provider registries, ExistingFileHelper fileHelper) { + ResourceLocation curioValidator = ResourceLocation.fromNamespaceAndPath("curios", "tag"); + + this.createSlot("head").size(1); + this.createSlot("ring").size(2); + this.createSlot("belt").size(1); + this.createSlot("necklace").size(1); + this.createSlot("an_focus") + .addValidator(curioValidator) + .icon(ResourceLocation.fromNamespaceAndPath("curios", "slot/empty_curio_slot")) + .order(1) + .size(1); + + this.createEntities("an_curios").addPlayer() + .addSlots("head", "ring", "belt", "necklace", "an_focus"); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java index 196bf38d40..c1aae9528e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java @@ -57,6 +57,8 @@ public static void datagen(GatherDataEvent event) { event.getGenerator().addProvider(event.includeServer(), new DamageTypesProvider.DamageTypesTagsProvider(output, provider, fileHelper)); event.getGenerator().addProvider(event.includeServer(), new CompostablesProvider(output, provider)); + event.getGenerator().addProvider(event.includeServer(), new ANCurioProvider(output, fileHelper, provider)); + DatapackBuiltinEntriesProvider datapackProvider = new WorldgenProvider(output, provider); event.getGenerator().addProvider(event.includeServer(), datapackProvider); CompletableFuture lookupProvider = datapackProvider.getRegistryProvider(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/BlankParchmentItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/BlankParchmentItem.java index 688766218b..469512111c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/BlankParchmentItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/BlankParchmentItem.java @@ -14,6 +14,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; public class BlankParchmentItem extends ModItem implements IScribeable { public BlankParchmentItem(Properties properties) { @@ -26,7 +27,7 @@ public BlankParchmentItem() { } @Override - public InteractionResult useOn(UseOnContext pContext) { + public @NotNull InteractionResult useOn(UseOnContext pContext) { if (pContext.getLevel().isClientSide) return super.useOn(pContext); if (pContext.getLevel().getBlockEntity(pContext.getClickedPos()) instanceof ICameraMountable) { diff --git a/src/main/resources/data/ars_nouveau/curios/entities/player.json b/src/main/resources/data/ars_nouveau/curios/entities/player.json deleted file mode 100644 index 8544fd1d02..0000000000 --- a/src/main/resources/data/ars_nouveau/curios/entities/player.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "entities": ["minecraft:player"], - "slots": ["head", "ring", "necklace", "an_focus"] -} \ No newline at end of file diff --git a/src/main/resources/data/ars_nouveau/loot_modifiers/dungeon_loot.json b/src/main/resources/data/ars_nouveau/loot_modifiers/dungeon_loot.json index e577892161..8a76daf204 100644 --- a/src/main/resources/data/ars_nouveau/loot_modifiers/dungeon_loot.json +++ b/src/main/resources/data/ars_nouveau/loot_modifiers/dungeon_loot.json @@ -7,63 +7,63 @@ "condition": "minecraft:any_of", "terms": [ { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/simple_dungeon" }, { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/jungle_temple" }, { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/abandoned_mineshaft" }, { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/bastion_treasure" }, { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/desert_pyramid" }, { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/end_city_treasure" }, { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/ruined_portal" }, { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/pillager_outpost" }, { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/nether_bridge" }, { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/stronghold_corridor" }, { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/stronghold_crossing" }, { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/stronghold_library" }, { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/woodland_mansion" }, { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/underwater_ruin_big" }, { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/underwater_ruin_small" } ] diff --git a/src/main/resources/data/ars_nouveau/worldgen/structure/guardian_wilden_den.json b/src/main/resources/data/ars_nouveau/worldgen/structure/guardian_wilden_den.json index d0548f26da..f924912748 100644 --- a/src/main/resources/data/ars_nouveau/worldgen/structure/guardian_wilden_den.json +++ b/src/main/resources/data/ars_nouveau/worldgen/structure/guardian_wilden_den.json @@ -3,7 +3,7 @@ "start_pool": "ars_nouveau:wilden_den_top_guardian", "size": 3, "max_distance_from_center": 80, - "biomes": "#forge:is_coniferous", + "biomes": "#c:is_coniferous", "step": "surface_structures", "terrain_adaptation": "beard_thin", "use_expansion_hack": false, From 94fdaa34e1a4c0ddd2e2c2e00ba9f6c1f72e3651 Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Thu, 8 Aug 2024 03:08:56 +0200 Subject: [PATCH 124/363] Make glowing color match, fix temporary lights (#1382) * Make glowing color match, fix temporary lights * fix balls --- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 +- .../assets/ars_nouveau/lang/en_us.json | 2 +- .../common/block/tile/LightTile.java | 5 +- .../common/block/tile/TempLightTile.java | 14 ++--- .../common/datagen/GlyphRecipeProvider.java | 5 +- .../common/mixin/perks/PerkLivingEntity.java | 38 +++++++++++++- .../arsnouveau/common/network/Networking.java | 1 + .../common/network/PacketUpdateGlowColor.java | 52 +++++++++++++++++++ .../common/spell/effect/EffectLight.java | 21 ++++---- 9 files changed, 118 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateGlowColor.java diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index cf2d7e9833..28f0c39b49 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21 2024-07-22T20:22:40.0416633 Languages: en_us for mod: ars_nouveau -fc5aaae5849bacb9dac9a49948220bf2bbf08a46 assets/ars_nouveau/lang/en_us.json +// 1.21 2024-08-07T12:53:38.654994 Languages: en_us for mod: ars_nouveau +ad0ccb9476538b6b03045d6eb71b01ea6b556b71 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index a1ccf2f12c..6f4dc7e636 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -253,7 +253,7 @@ "ars_nouveau.glyph_desc.glyph_invisibility": "Causes the target to turn invisible for a short time.", "ars_nouveau.glyph_desc.glyph_launch": "Launches an entity or block into the air. Can be used for large jumps, yeeting mobs in the sky or for scaling mountains! Sensitive will stop this spell from launching blocks.", "ars_nouveau.glyph_desc.glyph_leap": "Launches the target in the direction they are looking. Amplification will increase the distance moved.", - "ars_nouveau.glyph_desc.glyph_light": "If cast on a block, a permanent light source is created. May be amplified up to Glowstone brightness, or Dampened for a lower light level. When cast on yourself, you will receive night vision. When cast on other entities, they will receive Night Vision and Glowing.", + "ars_nouveau.glyph_desc.glyph_light": "If cast on a block, a permanent light source is created. May be amplified up to Glowstone brightness, or Dampened for a lower light level. When cast on yourself, you will receive night vision. When cast on other entities or with Sensitive, they will receive Night Vision and Glowing. If Sensitive, Glowing will use the spell color.", "ars_nouveau.glyph_desc.glyph_lightning": "Summons a lightning bolt at the location. Entities struck will be given the Shocked effect. Shocked causes all additional lightning damage to deal bonus damage, and increases the level of Shocked up to III. Lightning also deals bonus damage to entities that are wet or wearing RF powered items. Can be augmented with Amplify, Dampen, and Extend Time.", "ars_nouveau.glyph_desc.glyph_linger": "Creates a lingering field that applies spells on nearby entities for a short time. Applying Sensitive will make this spell target blocks instead. AOE will expand the effective range, Accelerate will cast spells faster, Dampen will ignore gravity, and Extend Time will increase the duration.", "ars_nouveau.glyph_desc.glyph_name": "Names an entity after the set Spell Name. Targeting a block will name nearby entities or name inventory blocks directly if possible. Targeting with Self will name the held offhand item. Can be overridden with a name tag in the hotbar.", diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/LightTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/LightTile.java index a35997018f..6fb90929bd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/LightTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/LightTile.java @@ -14,6 +14,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; public class LightTile extends ModdedTile implements ITickable, IWololoable { @@ -41,13 +42,13 @@ public void tick(Level level, BlockState state, BlockPos pos) { } @Override - protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) { + protected void loadAdditional(@NotNull CompoundTag compound, HolderLookup.@NotNull Provider pRegistries) { super.loadAdditional(compound, pRegistries); this.color = ParticleColorRegistry.from(compound.getCompound("color")); } @Override - public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + public void saveAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider pRegistries) { super.saveAdditional(tag, pRegistries); tag.put("color", color.serialize()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TempLightTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TempLightTile.java index a8f2f082d9..b39d5ff8d1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TempLightTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/TempLightTile.java @@ -5,9 +5,11 @@ import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.IntTag; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; -public class TempLightTile extends LightTile{ +public class TempLightTile extends LightTile { int age; public double lengthModifier; @@ -17,23 +19,23 @@ public TempLightTile(BlockPos pos, BlockState state) { } @Override - public void loadAdditional(CompoundTag nbt, HolderLookup.Provider pRegistries) { + public void loadAdditional(@NotNull CompoundTag nbt, HolderLookup.@NotNull Provider pRegistries) { super.loadAdditional(nbt, pRegistries); this.age = nbt.getInt("age"); this.lengthModifier = nbt.getDouble("modifier"); } @Override - public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + public void saveAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider pRegistries) { super.saveAdditional(tag, pRegistries); tag.putDouble("modifier", lengthModifier); tag.put("age", IntTag.valueOf(age)); } @Override - public void tick() { - super.tick(); - if (level != null && !level.isClientSide) { + public void tick(Level level, BlockState state, BlockPos pos) { + super.tick(level, state, pos); + if (!level.isClientSide) { age++; //15 seconds if (age > (20 * 15 + 20 * 5 * lengthModifier)) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java index 10b0de636c..249e91535e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java @@ -18,6 +18,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.neoforged.neoforge.common.Tags; +import org.jetbrains.annotations.NotNull; import java.nio.file.Path; import java.util.ArrayList; @@ -56,7 +57,7 @@ public void collectJsons(CachedOutput pOutput) { add(get(MethodUnderfoot.INSTANCE).withItem(Items.IRON_BOOTS).withIngredient(Ingredient.of(ItemTags.WOODEN_PRESSURE_PLATES))); add(get(EffectBlink.INSTANCE).withItem(ItemsRegistry.MANIPULATION_ESSENCE).withIngredient(Ingredient.of(Tags.Items.ENDER_PEARLS), 4)); - add(get(EffectBounce.INSTANCE).withItem(ItemsRegistry.ABJURATION_ESSENCE).withIngredient(Ingredient.of(Tags.Items.SLIMEBALLS), 3)); + add(get(EffectBounce.INSTANCE).withItem(ItemsRegistry.ABJURATION_ESSENCE).withIngredient(Ingredient.of(Tags.Items.SLIME_BALLS), 3)); add(get(EffectBreak.INSTANCE).withItem(Items.IRON_PICKAXE)); add(get(EffectColdSnap.INSTANCE).withItem(ItemsRegistry.WATER_ESSENCE).withItem(Items.POWDER_SNOW_BUCKET).withItem(Items.ICE)); add(get(EffectConjureWater.INSTANCE).withItem(ItemsRegistry.WATER_ESSENCE).withItem(Items.WATER_BUCKET)); @@ -160,7 +161,7 @@ protected static Path getScribeGlyphPath(Path pathIn, Item glyph) { } @Override - public String getName() { + public @NotNull String getName() { return "Glyph Recipes"; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/perks/PerkLivingEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/perks/PerkLivingEntity.java index 8368214dbc..32d10f4729 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/perks/PerkLivingEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/perks/PerkLivingEntity.java @@ -1,22 +1,32 @@ package com.hollingsworth.arsnouveau.common.mixin.perks; import com.hollingsworth.arsnouveau.api.util.PerkUtil; +import com.hollingsworth.arsnouveau.client.ClientInfo; +import com.hollingsworth.arsnouveau.client.gui.Color; import com.hollingsworth.arsnouveau.common.perk.DepthsPerk; import com.hollingsworth.arsnouveau.common.perk.JumpHeightPerk; +import com.hollingsworth.arsnouveau.common.spell.effect.EffectLight; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(LivingEntity.class) -public class PerkLivingEntity { +public abstract class PerkLivingEntity extends Entity { + + @Shadow + public abstract boolean isCurrentlyGlowing(); @Inject(method = "decreaseAirSupply", at = @At("HEAD"), cancellable = true) protected void decreaseAirSupply(int pCurrentAir, CallbackInfoReturnable cir) { LivingEntity thisEntity = (LivingEntity) (Object) this; int numDepths = PerkUtil.countForPerk(DepthsPerk.INSTANCE, thisEntity); - if(numDepths >= 3 || thisEntity.getRandom().nextDouble() <= numDepths * .33) { + if (numDepths >= 3 || thisEntity.getRandom().nextDouble() <= numDepths * .33) { cir.setReturnValue(thisEntity.getAirSupply()); } } @@ -26,4 +36,28 @@ protected void getJumpPower(CallbackInfoReturnable cir) { LivingEntity thisEntity = (LivingEntity) (Object) this; cir.setReturnValue(cir.getReturnValueF() + PerkUtil.countForPerk(JumpHeightPerk.INSTANCE, thisEntity) * 0.1f); } + + public PerkLivingEntity(EntityType pEntityType, Level pLevel) { + super(pEntityType, pLevel); + } + + /** + * Used to make the glowing effect on mobs use the tag applied by {@link EffectLight}. + */ + @Override + public int getTeamColor() { + int color = super.getTeamColor(); + if (color == 16777215 && this.isCurrentlyGlowing()) { + var perData = this.getPersistentData(); + if (perData.contains("GlowColor")) { + color = perData.getInt("GlowColor"); + if (color < 0) { + color = Color.rainbowColor(ClientInfo.ticksInGame).getRGB(); + } + } + } + return color; + } + + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java index fa60e4ef94..6d736097c6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java @@ -76,6 +76,7 @@ public static void register(final RegisterPayloadHandlersEvent event) { reg.playToClient(PotionSyncPacket.TYPE, PotionSyncPacket.CODEC, Networking::handle); reg.playToClient(ServerToClientStoragePacket.TYPE, ServerToClientStoragePacket.CODEC, Networking::handle); reg.playToClient(UpdateStorageItemsPacket.TYPE, UpdateStorageItemsPacket.CODEC, Networking::handle); + reg.playToClient(PacketUpdateGlowColor.TYPE, PacketUpdateGlowColor.CODEC, Networking::handle); } private static void handle(T message, IPayloadContext ctx) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateGlowColor.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateGlowColor.java new file mode 100644 index 0000000000..5cbf5aa21f --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateGlowColor.java @@ -0,0 +1,52 @@ +package com.hollingsworth.arsnouveau.common.network; + +import com.hollingsworth.arsnouveau.ArsNouveau; +import net.minecraft.client.Minecraft; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.NotNull; + +public class PacketUpdateGlowColor extends AbstractPacket { + + public int entity; + public int color; + + public PacketUpdateGlowColor(int entity, int color) { + this.entity = entity; + this.color = color; + } + + public void toBytes(RegistryFriendlyByteBuf RegistryFriendlyByteBuf) { + RegistryFriendlyByteBuf.writeInt(this.entity); + RegistryFriendlyByteBuf.writeInt(this.color); + } + + public PacketUpdateGlowColor(RegistryFriendlyByteBuf RegistryFriendlyByteBuf) { + this.entity = RegistryFriendlyByteBuf.readInt(); + this.color = RegistryFriendlyByteBuf.readInt(); + } + + @Override + public void onClientReceived(Minecraft mc, Player player) { + if (player.level.getEntity(this.entity) instanceof LivingEntity living) + if (color != 0) { + living.getPersistentData().putInt("GlowColor", color); + } else { + living.getPersistentData().remove("GlowColor"); + } + } + + + @Override + public @NotNull Type type() { + return TYPE; + } + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("glow_sync")); + public static final StreamCodec CODEC = StreamCodec + .ofMember(PacketUpdateGlowColor::toBytes, PacketUpdateGlowColor::new); + +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLight.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLight.java index fafa05aec7..e7e77657b7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLight.java @@ -3,14 +3,14 @@ import com.hollingsworth.arsnouveau.api.ANFakePlayer; import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.api.util.BlockUtil; +import com.hollingsworth.arsnouveau.client.particle.RainbowParticleColor; import com.hollingsworth.arsnouveau.common.block.SconceBlock; import com.hollingsworth.arsnouveau.common.block.tile.LightTile; import com.hollingsworth.arsnouveau.common.block.tile.TempLightTile; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; -import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; -import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDampen; -import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDurationDown; -import com.hollingsworth.arsnouveau.common.spell.augment.AugmentExtendTime; +import com.hollingsworth.arsnouveau.common.network.Networking; +import com.hollingsworth.arsnouveau.common.network.PacketUpdateGlowColor; +import com.hollingsworth.arsnouveau.common.spell.augment.*; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; @@ -49,8 +49,11 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul if (!(rayTraceResult.getEntity() instanceof LivingEntity living)) return; - if (!shooter.equals(living)) { + if (!shooter.equals(living) || spellStats.isSensitive()) { this.applyConfigPotion(living, MobEffects.GLOWING, spellStats); + // apply custom color to the entity if sensitive and the effect is successfully applied + if (living.hasEffect(MobEffects.GLOWING) && spellStats.isSensitive()) + Networking.sendToNearbyClient(world, living, new PacketUpdateGlowColor(living.getId(), spellContext.getColors() instanceof RainbowParticleColor ? -1 : spellContext.getColors().getColor())); } this.applyConfigPotion(living, MobEffects.NIGHT_VISION, spellStats); } @@ -76,8 +79,8 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull } if (world.getBlockState(pos).canBeReplaced() - && world.isUnobstructed(BlockRegistry.LIGHT_BLOCK.get().defaultBlockState(), pos, CollisionContext.of(ANFakePlayer.getPlayer((ServerLevel) world))) - && world.isInWorldBounds(pos)) { + && world.isUnobstructed(BlockRegistry.LIGHT_BLOCK.get().defaultBlockState(), pos, CollisionContext.of(ANFakePlayer.getPlayer((ServerLevel) world))) + && world.isInWorldBounds(pos)) { BlockState lightBlockState = (spellStats.getDurationMultiplier() != 0 ? BlockRegistry.T_LIGHT_BLOCK.get() : BlockRegistry.LIGHT_BLOCK.get()).defaultBlockState().setValue(WATERLOGGED, world.getFluidState(pos).getType() == Fluids.WATER); world.setBlockAndUpdate(pos, lightBlockState.setValue(SconceBlock.LIGHT_LEVEL, Math.max(0, Math.min(15, 14 + (int) spellStats.getAmpMultiplier())))); if (world.getBlockEntity(pos) instanceof LightTile tile) { @@ -110,12 +113,12 @@ public int getDefaultManaCost() { @NotNull @Override public Set getCompatibleAugments() { - return augmentSetOf(AugmentAmplify.INSTANCE, AugmentDurationDown.INSTANCE, AugmentDampen.INSTANCE, AugmentExtendTime.INSTANCE); + return augmentSetOf(AugmentAmplify.INSTANCE, AugmentDurationDown.INSTANCE, AugmentDampen.INSTANCE, AugmentExtendTime.INSTANCE, AugmentSensitive.INSTANCE); } @Override public String getBookDescription() { - return "If cast on a block, a permanent light source is created. May be amplified up to Glowstone brightness, or Dampened for a lower light level. When cast on yourself, you will receive night vision. When cast on other entities, they will receive Night Vision and Glowing."; + return "If cast on a block, a permanent light source is created. May be amplified up to Glowstone brightness, or Dampened for a lower light level. When cast on yourself, you will receive night vision. When cast on other entities or with Sensitive, they will receive Night Vision and Glowing. If Sensitive, Glowing will use the spell color."; } @NotNull From c8a706c3520b7cc01c3c6d6c4423b9e4116060d3 Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Thu, 8 Aug 2024 03:09:55 +0200 Subject: [PATCH 125/363] Allow regex to parse any char in the resourcelocation part of the string (#1374) --- .../com/hollingsworth/arsnouveau/setup/config/ConfigUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ConfigUtil.java b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ConfigUtil.java index 90424804c9..bd36297750 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ConfigUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ConfigUtil.java @@ -15,7 +15,7 @@ public class ConfigUtil { * Expected format is "string=int" * Example: "fortune=3" */ - public static final Pattern STRING_INT_MAP = Pattern.compile("([^/=]+)=(\\p{Digit}+)"); + public static final Pattern STRING_INT_MAP = Pattern.compile("(.+?)=(\\d+)"); /** Parse glyph_limits into a Map from augment glyph tags to limits. */ public static Map parseMapConfig(ModConfigSpec.ConfigValue> configValue) { From 39dfa21fa13bca2c3b477d8a611c6fcdccd9102d Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 7 Aug 2024 20:36:02 -0500 Subject: [PATCH 126/363] Fix wilden structures --- .../{structures => structure}/wilden_den_bottom.nbt | Bin .../{structures => structure}/wilden_den_top.nbt | Bin .../wilden_den_top_defender.nbt | Bin .../wilden_den_top_hunter.nbt | Bin .../wilden_den_top_stalker.nbt | Bin 5 files changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/data/ars_nouveau/{structures => structure}/wilden_den_bottom.nbt (100%) rename src/main/resources/data/ars_nouveau/{structures => structure}/wilden_den_top.nbt (100%) rename src/main/resources/data/ars_nouveau/{structures => structure}/wilden_den_top_defender.nbt (100%) rename src/main/resources/data/ars_nouveau/{structures => structure}/wilden_den_top_hunter.nbt (100%) rename src/main/resources/data/ars_nouveau/{structures => structure}/wilden_den_top_stalker.nbt (100%) diff --git a/src/main/resources/data/ars_nouveau/structures/wilden_den_bottom.nbt b/src/main/resources/data/ars_nouveau/structure/wilden_den_bottom.nbt similarity index 100% rename from src/main/resources/data/ars_nouveau/structures/wilden_den_bottom.nbt rename to src/main/resources/data/ars_nouveau/structure/wilden_den_bottom.nbt diff --git a/src/main/resources/data/ars_nouveau/structures/wilden_den_top.nbt b/src/main/resources/data/ars_nouveau/structure/wilden_den_top.nbt similarity index 100% rename from src/main/resources/data/ars_nouveau/structures/wilden_den_top.nbt rename to src/main/resources/data/ars_nouveau/structure/wilden_den_top.nbt diff --git a/src/main/resources/data/ars_nouveau/structures/wilden_den_top_defender.nbt b/src/main/resources/data/ars_nouveau/structure/wilden_den_top_defender.nbt similarity index 100% rename from src/main/resources/data/ars_nouveau/structures/wilden_den_top_defender.nbt rename to src/main/resources/data/ars_nouveau/structure/wilden_den_top_defender.nbt diff --git a/src/main/resources/data/ars_nouveau/structures/wilden_den_top_hunter.nbt b/src/main/resources/data/ars_nouveau/structure/wilden_den_top_hunter.nbt similarity index 100% rename from src/main/resources/data/ars_nouveau/structures/wilden_den_top_hunter.nbt rename to src/main/resources/data/ars_nouveau/structure/wilden_den_top_hunter.nbt diff --git a/src/main/resources/data/ars_nouveau/structures/wilden_den_top_stalker.nbt b/src/main/resources/data/ars_nouveau/structure/wilden_den_top_stalker.nbt similarity index 100% rename from src/main/resources/data/ars_nouveau/structures/wilden_den_top_stalker.nbt rename to src/main/resources/data/ars_nouveau/structure/wilden_den_top_stalker.nbt From 27a889802cc7bf18abf08ba5069d41fbd07c93ee Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 7 Aug 2024 20:47:52 -0500 Subject: [PATCH 127/363] Add missing enchantment tags for bow and shield --- .../.cache/5c9e5647706b386caccf0aef27efaa68965030b8 | 5 ++++- .../.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 | 8 ++++---- .../.cache/f0f2bcace349d412215f006e6183aa56b9316c3c | 4 ++-- .../data/ars_nouveau/recipe/feather_falling_1.json | 2 +- .../data/ars_nouveau/recipe/feather_falling_2.json | 2 +- .../data/ars_nouveau/recipe/feather_falling_3.json | 2 +- .../resources/data/ars_nouveau/recipe/glyph_bounce.json | 6 +++--- .../data/minecraft/tags/item/enchantable/bow.json | 5 +++++ .../data/minecraft/tags/item/enchantable/crossbow.json | 5 +++++ .../data/minecraft/tags/item/enchantable/durability.json | 5 +++++ .../common/datagen/ApparatusRecipeProvider.java | 6 +++--- .../arsnouveau/common/datagen/ItemTagProvider.java | 4 ++++ 12 files changed, 38 insertions(+), 16 deletions(-) create mode 100644 src/generated/resources/data/minecraft/tags/item/enchantable/bow.json create mode 100644 src/generated/resources/data/minecraft/tags/item/enchantable/crossbow.json create mode 100644 src/generated/resources/data/minecraft/tags/item/enchantable/durability.json diff --git a/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 b/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 index a22db79ce1..de395cecad 100644 --- a/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 +++ b/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 @@ -1,4 +1,4 @@ -// 1.21 2024-08-01T23:52:13.9453716 Tags for minecraft:item mod id ars_nouveau +// 1.21 2024-08-07T20:42:54.1584909 Tags for minecraft:item mod id ars_nouveau bde6ca31173d1f22d5f6fe355dc90c9faa35b239 data/ars_nouveau/tags/item/golem/shard.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/item/interact_jar_blacklist.json a0800fbffa0e00aecb2e86a1e991d42904427191 data/ars_nouveau/tags/item/magic_food.json @@ -32,6 +32,9 @@ f898aac12b01b598949701b1f6e45aa0cd1d9a25 data/c/tags/item/planks/archwood.json 43a847dca5f71ae27537abc65fabcd8d3fdb1c72 data/minecraft/tags/item/buttons.json debde73c045884d2f3335478b8e70e443135fe48 data/minecraft/tags/item/chest_armor.json a01909919207615cda1bb44f33db287efa02333b data/minecraft/tags/item/doors.json +46865d605d1c44b2ab5023e21848213c969eec08 data/minecraft/tags/item/enchantable/bow.json +d856556e7a50694e4fafc11b5b85240ad831548b data/minecraft/tags/item/enchantable/crossbow.json +877c63c507be1e55a9f5eeed6e73dfabea015dab data/minecraft/tags/item/enchantable/durability.json 87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/minecraft/tags/item/fences.json c417d25dbf09fa35316563dab44086ea9c57398f data/minecraft/tags/item/foot_armor.json b11f943ffa45a788b39c9d51e5bd83e321044249 data/minecraft/tags/item/head_armor.json diff --git a/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 b/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 index e54e9434ea..290581aadd 100644 --- a/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 +++ b/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 @@ -1,4 +1,4 @@ -// 1.21 2024-08-01T23:52:13.9403714 Apparatus +// 1.21 2024-08-07T20:47:22.7006199 Apparatus adc3e3b582ab4d1fd6f29537bddaaecb9eaa0c2d data/ars_nouveau/recipe/alchemists_crown.json 9a7fefa487b159935c1f620dc9516a6600fb0d4b data/ars_nouveau/recipe/amulet_of_mana_boost.json a653f866167b0fd7d0f7ded2166d45a2ff104d0d data/ars_nouveau/recipe/amulet_of_mana_regen.json @@ -37,9 +37,9 @@ ffd676653c81de14822f5859347f245b4cc0ce25 data/ars_nouveau/recipe/efficiency_5.js 67be8410e6968e09ed0eb852bda93a0932a77d11 data/ars_nouveau/recipe/enchanters_mirror.json 321f4d386c03038ff92a9233c1c6898123bdd80d data/ars_nouveau/recipe/enchanters_shield.json f2c4f98facacbc8b2e4e322e99af3eaa56c16c07 data/ars_nouveau/recipe/enchanters_sword.json -af0b42edc8e28ea0ea99f83f696c67f5de5069db data/ars_nouveau/recipe/feather_falling_1.json -131481c03deb344ede5f794a3c63d564b6e41d3f data/ars_nouveau/recipe/feather_falling_2.json -d098fe9475b98f80f7b8308aa5a2cb88dd034a63 data/ars_nouveau/recipe/feather_falling_3.json +b94d896ec37f1f50ed5b6b1d71a03779261cbd6f data/ars_nouveau/recipe/feather_falling_1.json +501853d55ff7e69cab7826f9160a4dfcdceb0355 data/ars_nouveau/recipe/feather_falling_2.json +adee2bfa7bf7e244bc68a8b764038fa7d06a3e67 data/ars_nouveau/recipe/feather_falling_3.json 4d06aa8e39bfdd88040ab6c3cb5c917fa2d5e08d data/ars_nouveau/recipe/feather_falling_4.json 3a7bf4296a6eefee537d6fcb0b9c39f637ec8faf data/ars_nouveau/recipe/fire_aspect_1.json 89e9d058e692de7cab497404006842e1ec2d60e7 data/ars_nouveau/recipe/fire_aspect_2.json diff --git a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c index 357e434dad..2bab514f83 100644 --- a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c +++ b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c @@ -1,10 +1,10 @@ -// 1.21 2024-07-14T12:08:42.895409 Glyph Recipes +// 1.21 2024-08-07T20:42:54.1489715 Glyph Recipes 231d9f126c606465601e36e83948dda99a508834 data/ars_nouveau/recipe/glyph_accelerate.json dbad772acd31382cfcf19c7f276da5f91354dfcf data/ars_nouveau/recipe/glyph_amplify.json 1a8499b67d1ce8614ef1d420106d32d27567eeb9 data/ars_nouveau/recipe/glyph_animate_block.json 232197139f5fa7a33b4e1d42c453833394a4c4ba data/ars_nouveau/recipe/glyph_aoe.json c827180b8f5111736c1641e4683e63b3f764a80a data/ars_nouveau/recipe/glyph_blink.json -10e7f63b9784ce9693c7ec690dc13b21e9106297 data/ars_nouveau/recipe/glyph_bounce.json +e7d1836f1f0438e05c86aee27c2de1d32742f217 data/ars_nouveau/recipe/glyph_bounce.json 6989360984c711d43b4e9175efbec3a23608db8e data/ars_nouveau/recipe/glyph_break.json c5d245630add4160c2ea36ef8df4add7a45f7616 data/ars_nouveau/recipe/glyph_burst.json 5a951b64a1a102d1e71ee5ba85524cf1877378d5 data/ars_nouveau/recipe/glyph_cold_snap.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_1.json b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_1.json index ba977481ac..96f27b9c7e 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_1.json +++ b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_1.json @@ -7,7 +7,7 @@ "item": "ars_nouveau:air_essence" }, { - "tag": "c:slimeballs" + "tag": "c:slime_balls" }, { "tag": "c:storage_blocks/source" diff --git a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_2.json b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_2.json index 8bb6087df3..984de2dfdf 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_2.json +++ b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_2.json @@ -10,7 +10,7 @@ "item": "ars_nouveau:air_essence" }, { - "tag": "c:slimeballs" + "tag": "c:slime_balls" }, { "tag": "c:storage_blocks/source" diff --git a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_3.json b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_3.json index b64b7a6a2d..f295f5a5c5 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/feather_falling_3.json +++ b/src/generated/resources/data/ars_nouveau/recipe/feather_falling_3.json @@ -13,7 +13,7 @@ "item": "ars_nouveau:air_essence" }, { - "tag": "c:slimeballs" + "tag": "c:slime_balls" }, { "tag": "c:storage_blocks/source" diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_bounce.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_bounce.json index ec7b36bd86..a3d6af6ee0 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/glyph_bounce.json +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_bounce.json @@ -6,13 +6,13 @@ "item": "ars_nouveau:abjuration_essence" }, { - "tag": "c:slimeballs" + "tag": "c:slime_balls" }, { - "tag": "c:slimeballs" + "tag": "c:slime_balls" }, { - "tag": "c:slimeballs" + "tag": "c:slime_balls" } ], "output": { diff --git a/src/generated/resources/data/minecraft/tags/item/enchantable/bow.json b/src/generated/resources/data/minecraft/tags/item/enchantable/bow.json new file mode 100644 index 0000000000..4e42b9fd0d --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/item/enchantable/bow.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ars_nouveau:spell_bow" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/item/enchantable/crossbow.json b/src/generated/resources/data/minecraft/tags/item/enchantable/crossbow.json new file mode 100644 index 0000000000..921ae0cd4f --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/item/enchantable/crossbow.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ars_nouveau:spell_crossbow" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/item/enchantable/durability.json b/src/generated/resources/data/minecraft/tags/item/enchantable/durability.json new file mode 100644 index 0000000000..650bdf6077 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/item/enchantable/durability.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ars_nouveau:enchanters_shield" + ] +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java index acb0b1a6d9..c9f408e9f3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java @@ -333,17 +333,17 @@ public void addEntries() { addRecipe(builder() .withPedestalItem(1, ItemsRegistry.AIR_ESSENCE) - .withPedestalItem(1, Ingredient.of(Tags.Items.SLIMEBALLS)) + .withPedestalItem(1, Ingredient.of(Tags.Items.SLIME_BALLS)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) .buildEnchantmentRecipe(Enchantments.FEATHER_FALLING, 1, 2000)); addRecipe(builder() .withPedestalItem(2, ItemsRegistry.AIR_ESSENCE) - .withPedestalItem(1, Ingredient.of(Tags.Items.SLIMEBALLS)) + .withPedestalItem(1, Ingredient.of(Tags.Items.SLIME_BALLS)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) .buildEnchantmentRecipe(Enchantments.FEATHER_FALLING, 2, 3500)); addRecipe(builder() .withPedestalItem(3, ItemsRegistry.AIR_ESSENCE) - .withPedestalItem(1, Ingredient.of(Tags.Items.SLIMEBALLS)) + .withPedestalItem(1, Ingredient.of(Tags.Items.SLIME_BALLS)) .withPedestalItem(2, RecipeDatagen.SOURCE_GEM_BLOCK) .withPedestalItem(2, Ingredient.of(Tags.Items.STORAGE_BLOCKS_LAPIS)) .buildEnchantmentRecipe(Enchantments.FEATHER_FALLING, 3, 5000)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java index b48bb00777..9a36f78167 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java @@ -218,5 +218,9 @@ protected void addTags(HolderLookup.@NotNull Provider pProvider) { BlockRegistry.FROSTAYA_POD.asItem(), BlockRegistry.MENDOSTEEN_POD.asItem() ); + + this.tag(ItemTags.BOW_ENCHANTABLE).add(ItemsRegistry.SPELL_BOW.get()); + this.tag(ItemTags.CROSSBOW_ENCHANTABLE).add(ItemsRegistry.SPELL_CROSSBOW.get()); + this.tag(ItemTags.DURABILITY_ENCHANTABLE).add(ItemsRegistry.ENCHANTERS_SHIELD.get()); } } From 65a7c2b949e0b68b07ed382a27d1fcce8220f434 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 7 Aug 2024 23:04:18 -0500 Subject: [PATCH 128/363] compile patchouli in dev --- build.gradle | 2 +- gradle.properties | 4 +- .../client/patchouli/ApparatusProcessor.java | 92 +++++------ .../patchouli/EnchantmentProcessor.java | 98 ++++++------ .../client/patchouli/GlyphProcessor.java | 133 ++++++++-------- .../client/patchouli/ImbuementProcessor.java | 90 +++++------ .../patchouli/NoOutputApparatusProcessor.java | 92 +++++------ .../component/RotatingItemListComponent.java | 149 +++++++++--------- .../RotatingItemListComponentBase.java | 114 +++++++------- 9 files changed, 393 insertions(+), 381 deletions(-) diff --git a/build.gradle b/build.gradle index 95bdef674e..5ff9761d88 100644 --- a/build.gradle +++ b/build.gradle @@ -106,7 +106,7 @@ dependencies { // } implementation "software.bernie.geckolib:geckolib-neoforge-1.21:${geckolib_version}" // -// implementation "vazkii.patchouli:Patchouli:1.20.4-${patchouli_version}" + implementation "vazkii.patchouli:Patchouli:1.21-${patchouli_version}" // runtimeOnly "com.illusivesoulworks.caelus:caelus-neoforge:${caelus_version}" compileOnly "com.illusivesoulworks.caelus:caelus-neoforge:${caelus_version}:api" diff --git a/gradle.properties b/gradle.properties index 865e285336..2179fb7d43 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.0.6 +mod_version=5.0.7 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! @@ -25,5 +25,5 @@ mod_description=Craft spells, create powerful baubles, and summon magical creatu jei_version=19.5.0.44 curios_version=8.0.0-beta geckolib_version=4.5.7 -patchouli_version=85-NEOFORGE +patchouli_version=87-NEOFORGE-SNAPSHOT caelus_version=7.0.0+1.21 diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ApparatusProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ApparatusProcessor.java index 986044ab4f..6792c9ee04 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ApparatusProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ApparatusProcessor.java @@ -1,45 +1,47 @@ -//package com.hollingsworth.arsnouveau.client.patchouli; -// -// -//import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantingApparatusRecipe; -//import net.minecraft.client.Minecraft; -//import net.minecraft.resources.ResourceLocation; -//import net.minecraft.world.item.crafting.RecipeManager; -//import net.minecraft.world.level.Level; -//import vazkii.patchouli.api.IComponentProcessor; -//import vazkii.patchouli.api.IVariable; -//import vazkii.patchouli.api.IVariableProvider; -// -//import java.util.Arrays; -//import java.util.stream.Collectors; -// -//public class ApparatusProcessor implements IComponentProcessor { -// EnchantingApparatusRecipe recipe; -// -// @Override -// public void setup(Level level, IVariableProvider variables) { -// RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); -// String recipeID = variables.get("recipe").asString(); -// recipe = (EnchantingApparatusRecipe) manager.byKey(ResourceLocation.tryParse(recipeID)).orElse(null); -// } -// -// @Override -// public IVariable process(Level level, String key) { -// if (recipe == null) -// return null; -// if (key.equals("reagent")) -// return IVariable.wrapList(Arrays.stream(recipe.reagent.getItems()).map(IVariable::from).collect(Collectors.toList())); -// -// if (key.equals("recipe")) { -// return IVariable.wrap(recipe.getId().toString()); -// } -// if (key.equals("output")) { -// return IVariable.from(recipe.result); -// } -// if (key.equals("footer")) { -// return IVariable.wrap(recipe.result.getItem().getDescriptionId()); -// } -// -// return null; -// } -//} +package com.hollingsworth.arsnouveau.client.patchouli; + + +import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantingApparatusRecipe; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.level.Level; +import vazkii.patchouli.api.IComponentProcessor; +import vazkii.patchouli.api.IVariable; +import vazkii.patchouli.api.IVariableProvider; + +import java.util.Arrays; +import java.util.stream.Collectors; + +public class ApparatusProcessor implements IComponentProcessor { + RecipeHolder holder; + + @Override + public void setup(Level level, IVariableProvider variables) { + RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); + String recipeID = variables.get("recipe", level.registryAccess()).asString(); + holder = (RecipeHolder) manager.byKey(ResourceLocation.tryParse(recipeID)).orElse(null); + } + + @Override + public IVariable process(Level level, String key) { + if (holder == null) + return null; + var recipe = holder.value(); + if (key.equals("reagent")) + return IVariable.wrapList(Arrays.stream(recipe.reagent().getItems()).map(i -> IVariable.from(i, level.registryAccess())).collect(Collectors.toList()), level.registryAccess()); + + if (key.equals("recipe")) { + return IVariable.wrap(holder.id().toString(), level.registryAccess()); + } + if (key.equals("output")) { + return IVariable.from(recipe.result(), level.registryAccess()); + } + if (key.equals("footer")) { + return IVariable.wrap(recipe.result().getItem().getDescriptionId(), level.registryAccess()); + } + + return null; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/EnchantmentProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/EnchantmentProcessor.java index 064fee739a..a8cad1d211 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/EnchantmentProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/EnchantmentProcessor.java @@ -1,47 +1,51 @@ -//package com.hollingsworth.arsnouveau.client.patchouli; -// -// -//import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantmentRecipe; -//import net.minecraft.client.Minecraft; -//import net.minecraft.resources.ResourceLocation; -//import net.minecraft.world.item.ItemStack; -//import net.minecraft.world.item.crafting.Ingredient; -//import net.minecraft.world.item.crafting.RecipeManager; -//import net.minecraft.world.level.Level; -//import vazkii.patchouli.api.IComponentProcessor; -//import vazkii.patchouli.api.IVariable; -//import vazkii.patchouli.api.IVariableProvider; -// -//import java.util.Arrays; -//import java.util.stream.Collectors; -// -//public class EnchantmentProcessor implements IComponentProcessor { -// EnchantmentRecipe recipe; -// -// @Override -// public void setup(Level level, IVariableProvider variables) { -// RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); -// String recipeID = variables.get("recipe").asString(); -// recipe = (EnchantmentRecipe) manager.byKey(ResourceLocation.tryParse(recipeID)).orElse(null); -// } -// -// @Override -// public IVariable process(Level level, String key) { -// if (recipe == null) -// return null; -// if (key.equals("enchantment")) -// return IVariable.wrap(recipe.enchantment.getDescriptionId()); -// if (key.equals("level")) -// return IVariable.wrap(recipe.enchantLevel); -// -// if (key.startsWith("item")) { -// int index = Integer.parseInt(key.substring(4)) - 1; -// if (recipe.pedestalItems.size() <= index) -// return IVariable.from(ItemStack.EMPTY); -// Ingredient ingredient = recipe.pedestalItems.get(Integer.parseInt(key.substring(4)) - 1); -// return IVariable.wrapList(Arrays.stream(ingredient.getItems()).map(IVariable::from).collect(Collectors.toList())); -// } -// -// return null; -// } -//} +package com.hollingsworth.arsnouveau.client.patchouli; + + +import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantmentRecipe; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.level.Level; +import vazkii.patchouli.api.IComponentProcessor; +import vazkii.patchouli.api.IVariable; +import vazkii.patchouli.api.IVariableProvider; + +import java.util.Arrays; +import java.util.stream.Collectors; + +public class EnchantmentProcessor implements IComponentProcessor { + RecipeHolder recipe; + + @Override + public void setup(Level level, IVariableProvider variables) { + RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); + String recipeID = variables.get("recipe", level.registryAccess()).asString(); + recipe = (RecipeHolder) manager.byKey(ResourceLocation.tryParse(recipeID)).orElse(null); + } + + @Override + public IVariable process(Level level, String key) { + if (recipe == null) + return null; + var enchant = recipe.value(); + if (key.equals("enchantment")) { + var enchantment = level.holderOrThrow(enchant.enchantmentKey); + return IVariable.wrap(enchantment.value().description().getString(), level.registryAccess()); + } + if (key.equals("level")) + return IVariable.wrap(enchant.enchantLevel); + + if (key.startsWith("item")) { + int index = Integer.parseInt(key.substring(4)) - 1; + if (enchant.pedestalItems().size() <= index) + return IVariable.from(ItemStack.EMPTY, level.registryAccess()); + Ingredient ingredient = enchant.pedestalItems().get(Integer.parseInt(key.substring(4)) - 1); + return IVariable.wrapList(Arrays.stream(ingredient.getItems()).map(i -> IVariable.from(i, level.registryAccess())).collect(Collectors.toList()), level.registryAccess()); + } + + return null; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/GlyphProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/GlyphProcessor.java index bab5300021..818acc5009 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/GlyphProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/GlyphProcessor.java @@ -1,66 +1,67 @@ -//package com.hollingsworth.arsnouveau.client.patchouli; -// -//import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; -//import com.hollingsworth.arsnouveau.api.spell.SpellSchool; -//import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; -//import com.hollingsworth.arsnouveau.common.items.Glyph; -//import net.minecraft.client.Minecraft; -//import net.minecraft.network.chat.Component; -//import net.minecraft.resources.ResourceLocation; -//import net.minecraft.world.item.crafting.RecipeManager; -//import net.minecraft.world.level.Level; -//import vazkii.patchouli.api.IComponentProcessor; -//import vazkii.patchouli.api.IVariable; -//import vazkii.patchouli.api.IVariableProvider; -// -//public class GlyphProcessor implements IComponentProcessor { -// -// GlyphRecipe recipe; -// -// @Override -// public void setup(Level level, IVariableProvider variables) { -// RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); -// String recipeID = variables.get("recipe").asString(); -// try { -// recipe = (GlyphRecipe) manager.byKey(ResourceLocation.tryParse(recipeID)).orElse(null); -// } catch (Exception ignored) { -// } -// } -// -// @Override -// public IVariable process(Level level, String s) { -// if (recipe == null) -// return null; -// -// if (s.equals("tier")) -// return IVariable.wrap(Component.translatable("ars_nouveau.tier").getString() + ": " + Component.translatable("ars_nouveau.spell_tier." + recipe.getSpellPart().getConfigTier().value).getString()); -// if (s.equals("schools")) { -// AbstractSpellPart part = ((Glyph) recipe.output.getItem()).spellPart; -// StringBuilder str = new StringBuilder(Component.translatable("ars_nouveau.spell_schools").getString() + ": "); -// for (SpellSchool spellSchool : part.spellSchools) { -// str.append(spellSchool.getTextComponent().getString()).append(","); -// } -// if (!part.spellSchools.isEmpty()) -// str = new StringBuilder(str.substring(0, str.length() - 1)); -// return IVariable.wrap(str.toString()); -// } -// if (s.equals("mana_cost")) { -// if (recipe.output.getItem() instanceof Glyph) { -// int cost = ((Glyph) recipe.output.getItem()).spellPart.getCastingCost(); -// String costLang = ""; -// if (cost == 0) -// costLang = Component.translatable("ars_nouveau.mana_cost.none").getString(); -// if (cost < 20) -// costLang = Component.translatable("ars_nouveau.mana_cost.low").getString(); -// if (cost < 50) -// costLang = Component.translatable("ars_nouveau.mana_cost.medium").getString(); -// if (cost >= 50) -// costLang = Component.translatable("ars_nouveau.mana_cost.high").getString(); -// return IVariable.wrap(Component.translatable("ars_nouveau.casting_cost").getString() + ": " + costLang); -// } -// return IVariable.wrap(""); -// } -// return null; -// } -//} -// +package com.hollingsworth.arsnouveau.client.patchouli; + +import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; +import com.hollingsworth.arsnouveau.api.spell.SpellSchool; +import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; +import com.hollingsworth.arsnouveau.common.items.Glyph; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.level.Level; +import vazkii.patchouli.api.IComponentProcessor; +import vazkii.patchouli.api.IVariable; +import vazkii.patchouli.api.IVariableProvider; + +public class GlyphProcessor implements IComponentProcessor { + + RecipeHolder holder; + + @Override + public void setup(Level level, IVariableProvider variables) { + RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); + String recipeID = variables.get("recipe", level.registryAccess()).asString(); + try { + holder = (RecipeHolder) manager.byKey(ResourceLocation.tryParse(recipeID)).orElse(null); + } catch (Exception ignored) { + } + } + + @Override + public IVariable process(Level level, String s) { + if (holder == null) + return null; + var recipe = holder.value(); + if (s.equals("tier")) + return IVariable.wrap(Component.translatable("ars_nouveau.tier").getString() + ": " + Component.translatable("ars_nouveau.spell_tier." + recipe.getSpellPart().getConfigTier().value).getString()); + if (s.equals("schools")) { + AbstractSpellPart part = ((Glyph) recipe.output.getItem()).spellPart; + StringBuilder str = new StringBuilder(Component.translatable("ars_nouveau.spell_schools").getString() + ": "); + for (SpellSchool spellSchool : part.spellSchools) { + str.append(spellSchool.getTextComponent().getString()).append(","); + } + if (!part.spellSchools.isEmpty()) + str = new StringBuilder(str.substring(0, str.length() - 1)); + return IVariable.wrap(str.toString()); + } + if (s.equals("mana_cost")) { + if (recipe.output.getItem() instanceof Glyph) { + int cost = ((Glyph) recipe.output.getItem()).spellPart.getCastingCost(); + String costLang = ""; + if (cost == 0) + costLang = Component.translatable("ars_nouveau.mana_cost.none").getString(); + if (cost < 20) + costLang = Component.translatable("ars_nouveau.mana_cost.low").getString(); + if (cost < 50) + costLang = Component.translatable("ars_nouveau.mana_cost.medium").getString(); + if (cost >= 50) + costLang = Component.translatable("ars_nouveau.mana_cost.high").getString(); + return IVariable.wrap(Component.translatable("ars_nouveau.casting_cost").getString() + ": " + costLang); + } + return IVariable.wrap(""); + } + return null; + } +} + diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ImbuementProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ImbuementProcessor.java index 1d032e17df..e7f411dd7f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ImbuementProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ImbuementProcessor.java @@ -1,44 +1,46 @@ -//package com.hollingsworth.arsnouveau.client.patchouli; -// -//import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; -//import net.minecraft.client.Minecraft; -//import net.minecraft.resources.ResourceLocation; -//import net.minecraft.world.item.crafting.RecipeManager; -//import net.minecraft.world.level.Level; -//import vazkii.patchouli.api.IComponentProcessor; -//import vazkii.patchouli.api.IVariable; -//import vazkii.patchouli.api.IVariableProvider; -// -//import java.util.Arrays; -//import java.util.stream.Collectors; -// -//public class ImbuementProcessor implements IComponentProcessor { -// ImbuementRecipe recipe; -// -// @Override -// public void setup(Level level, IVariableProvider variables) { -// RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); -// String recipeID = variables.get("recipe").asString(); -// recipe = (ImbuementRecipe) manager.byKey(ResourceLocation.tryParse(recipeID)).orElse(null); -// } -// -// @Override -// public IVariable process(Level level, String key) { -// if (recipe == null) -// return null; -// if (key.equals("reagent")) -// return IVariable.wrapList(Arrays.stream(recipe.input.getItems()).map(IVariable::from).collect(Collectors.toList())); -// -// if (key.equals("recipe")) { -// return IVariable.wrap(recipe.getId().toString()); -// } -// if (key.equals("output")) { -// return IVariable.from(recipe.output); -// } -// if (key.equals("footer")) { -// return IVariable.wrap(recipe.output.getItem().getDescriptionId()); -// } -// -// return null; -// } -//} +package com.hollingsworth.arsnouveau.client.patchouli; + +import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.level.Level; +import vazkii.patchouli.api.IComponentProcessor; +import vazkii.patchouli.api.IVariable; +import vazkii.patchouli.api.IVariableProvider; + +import java.util.Arrays; +import java.util.stream.Collectors; + +public class ImbuementProcessor implements IComponentProcessor { + RecipeHolder holder; + + @Override + public void setup(Level level, IVariableProvider variables) { + RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); + String recipeID = variables.get("recipe", level.registryAccess()).asString(); + holder = (RecipeHolder) manager.byKey(ResourceLocation.tryParse(recipeID)).orElse(null); + } + + @Override + public IVariable process(Level level, String key) { + if (holder == null) + return null; + var recipe = holder.value(); + if (key.equals("reagent")) + return IVariable.wrapList(Arrays.stream(recipe.input.getItems()).map(i -> IVariable.from(i, level.registryAccess())).collect(Collectors.toList()), level.registryAccess()); + + if (key.equals("recipe")) { + return IVariable.wrap(recipe.id.toString(), level.registryAccess()); + } + if (key.equals("output")) { + return IVariable.from(recipe.output, level.registryAccess()); + } + if (key.equals("footer")) { + return IVariable.wrap(recipe.output.getItem().getDescriptionId(), level.registryAccess()); + } + + return null; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/NoOutputApparatusProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/NoOutputApparatusProcessor.java index c4c352b1c1..2b808cbec8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/NoOutputApparatusProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/NoOutputApparatusProcessor.java @@ -1,45 +1,47 @@ -//package com.hollingsworth.arsnouveau.client.patchouli; -// -//import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantingApparatusRecipe; -//import com.hollingsworth.arsnouveau.common.crafting.recipes.ITextOutput; -//import net.minecraft.client.Minecraft; -//import net.minecraft.resources.ResourceLocation; -//import net.minecraft.world.item.crafting.RecipeManager; -//import net.minecraft.world.level.Level; -//import vazkii.patchouli.api.IComponentProcessor; -//import vazkii.patchouli.api.IVariable; -//import vazkii.patchouli.api.IVariableProvider; -// -//import java.util.Arrays; -//import java.util.stream.Collectors; -// -//public class NoOutputApparatusProcessor implements IComponentProcessor { -// EnchantingApparatusRecipe recipe; -// -// @Override -// public void setup(Level level, IVariableProvider variables) { -// RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); -// String recipeID = variables.get("recipe").asString(); -// recipe = (EnchantingApparatusRecipe) manager.byKey(ResourceLocation.tryParse(recipeID)).orElse(null); -// } -// -// @Override -// public IVariable process(Level level, String key) { -// if (recipe == null) -// return null; -// if (key.equals("reagent")) -// return IVariable.wrapList(Arrays.stream(recipe.reagent.getItems()).map(IVariable::from).collect(Collectors.toList())); -// -// if (key.equals("recipe")) { -// return IVariable.wrap(recipe.getId().toString()); -// } -// if(recipe instanceof ITextOutput textOutput && key.equals("output")){ -// return IVariable.wrap(textOutput.getOutputComponent().getString()); -// } -// if (key.equals("footer")) { -// return IVariable.wrap(recipe.result.getItem().getDescriptionId()); -// } -// return null; -// } -//} -// +package com.hollingsworth.arsnouveau.client.patchouli; + +import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantingApparatusRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.ITextOutput; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.level.Level; +import vazkii.patchouli.api.IComponentProcessor; +import vazkii.patchouli.api.IVariable; +import vazkii.patchouli.api.IVariableProvider; + +import java.util.Arrays; +import java.util.stream.Collectors; + +public class NoOutputApparatusProcessor implements IComponentProcessor { + RecipeHolder holder; + + @Override + public void setup(Level level, IVariableProvider variables) { + RecipeManager manager = Minecraft.getInstance().level.getRecipeManager(); + String recipeID = variables.get("recipe", level.registryAccess()).asString(); + holder = (RecipeHolder)manager.byKey(ResourceLocation.tryParse(recipeID)).orElse(null); + } + + @Override + public IVariable process(Level level, String key) { + if (holder == null) + return null; + var recipe = holder.value(); + if (key.equals("reagent")) + return IVariable.wrapList(Arrays.stream(recipe.reagent().getItems()).map(i -> IVariable.from(i, level.registryAccess())).collect(Collectors.toList()), level.registryAccess()); + + if (key.equals("recipe")) { + return IVariable.wrap(holder.id().toString(), level.registryAccess()); + } + if(recipe instanceof ITextOutput textOutput && key.equals("output")){ + return IVariable.wrap(textOutput.getOutputComponent().getString(), level.registryAccess()); + } + if (key.equals("footer")) { + return IVariable.wrap(recipe.result().getItem().getDescriptionId(), level.registryAccess()); + } + return null; + } +} + diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponent.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponent.java index 22b3495cd8..d4e544d31a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponent.java @@ -1,76 +1,77 @@ package com.hollingsworth.arsnouveau.client.patchouli.component; -//import com.google.common.collect.ImmutableList; -//import com.google.gson.annotations.SerializedName; -//import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; -//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.EnchantingApparatusRecipe; -//import com.hollingsworth.arsnouveau.api.enchanting_apparatus.IEnchantingRecipe; -//import com.hollingsworth.arsnouveau.api.imbuement_chamber.IImbuementRecipe; -//import com.hollingsworth.arsnouveau.api.registry.ImbuementRecipeRegistry; -//import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; -//import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; -//import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; -//import net.minecraft.client.Minecraft; -//import net.minecraft.client.multiplayer.ClientLevel; -//import net.minecraft.resources.ResourceLocation; -//import net.minecraft.world.item.crafting.Ingredient; -//import net.minecraft.world.item.crafting.Recipe; -//import net.minecraft.world.item.crafting.RecipeType; -//import vazkii.patchouli.api.IVariable; -// -//import java.util.ArrayList; -//import java.util.List; -//import java.util.Map; -//import java.util.function.UnaryOperator; -// -//public class RotatingItemListComponent extends RotatingItemListComponentBase { -// @SerializedName("recipe_name") -// public String recipeName; -// -// @SerializedName("recipe_type") -// public String recipeType; -// -// -// -// @Override -// protected List makeIngredients() { -// ClientLevel world = Minecraft.getInstance().level; -// if (world == null) return new ArrayList<>(); -// -// Map> map; -// if ("enchanting_apparatus".equals(recipeType)) { -// EnchantingApparatusRecipe recipe = world.getRecipeManager().getAllRecipesFor(RecipeRegistry.APPARATUS_TYPE.get()).stream().filter(f -> f.id.toString().equals(recipeName)).findFirst().orElse(null); -// for(RecipeType type : ArsNouveauAPI.getInstance().getEnchantingRecipeTypes()) { -// RecipeType enchantingRecipeRecipeType = (RecipeType) type; -// Recipe recipe1 = world.getRecipeManager().getAllRecipesFor(enchantingRecipeRecipeType).stream().filter(f -> f.getId().toString().equals(recipeName)).findFirst().orElse(null); -// if(recipe1 instanceof EnchantingApparatusRecipe enchantingApparatusRecipe){ -// recipe = enchantingApparatusRecipe; -// break; -// } -// } -// return recipe == null ? ImmutableList.of() : recipe.pedestalItems; -// } else if ("imbuement_chamber".equals(recipeType)) { -// ImbuementRecipe recipe = world.getRecipeManager().getAllRecipesFor(RecipeRegistry.IMBUEMENT_TYPE.get()).stream().filter(f -> f.id.toString().equals(recipeName)).findFirst().orElse(null); -// for (RecipeType type : ImbuementRecipeRegistry.INSTANCE.getRecipeTypes()) { -// RecipeType imbuementRecipeType = (RecipeType) type; -// Recipe recipe1 = world.getRecipeManager().getAllRecipesFor(imbuementRecipeType).stream().filter(f -> f.getId().toString().equals(recipeName)).findFirst().orElse(null); -// if (recipe1 instanceof ImbuementRecipe imbuementRecipe){ -// recipe = imbuementRecipe; -// break; -// } -// } -// return recipe == null ? ImmutableList.of() : recipe.pedestalItems; -// } else if ("glyph_recipe".equals(recipeType)) { -// GlyphRecipe recipe = (GlyphRecipe) world.getRecipeManager().byKey(new ResourceLocation(recipeName)).orElse(null); -// return recipe == null ? ImmutableList.of() : recipe.inputs; -// } else { -// throw new IllegalArgumentException("Type must be 'enchanting_apparatus', 'glyph_recipe', or 'imbuement_chamber'!"); -// } -// } -// -// @Override -// public void onVariablesAvailable(UnaryOperator lookup) { -// recipeName = lookup.apply(IVariable.wrap(recipeName)).asString(); -// recipeType = lookup.apply(IVariable.wrap(recipeType)).asString(); -// } -//} +import com.google.common.collect.ImmutableList; +import com.google.gson.annotations.SerializedName; +import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; +import com.hollingsworth.arsnouveau.api.imbuement_chamber.IImbuementRecipe; +import com.hollingsworth.arsnouveau.api.registry.ImbuementRecipeRegistry; +import com.hollingsworth.arsnouveau.common.crafting.recipes.EnchantingApparatusRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.IEnchantingRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; +import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.HolderLookup; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeType; +import vazkii.patchouli.api.IVariable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.UnaryOperator; + +public class RotatingItemListComponent extends RotatingItemListComponentBase { + @SerializedName("recipe_name") + public String recipeName; + + @SerializedName("recipe_type") + public String recipeType; + + @Override + protected List makeIngredients() { + ClientLevel world = Minecraft.getInstance().level; + if (world == null) return new ArrayList<>(); + + Map> map; + if ("enchanting_apparatus".equals(recipeType)) { + RecipeHolder holder = world.getRecipeManager().getAllRecipesFor(RecipeRegistry.APPARATUS_TYPE.get()).stream().filter(f -> f.id().toString().equals(recipeName)).findFirst().orElse(null); + var recipe = holder != null ? holder.value() : null; + for(RecipeType type : ArsNouveauAPI.getInstance().getEnchantingRecipeTypes()) { + RecipeHolder recipe1 = world.getRecipeManager().getAllRecipesFor(type).stream().filter(f -> f.id().toString().equals(recipeName)).findFirst().orElse(null); + if(recipe1 != null && recipe1.value() instanceof EnchantingApparatusRecipe enchantingApparatusRecipe){ + recipe = enchantingApparatusRecipe; + break; + } + } + return recipe == null ? ImmutableList.of() : recipe.pedestalItems(); + } else if ("imbuement_chamber".equals(recipeType)) { + RecipeHolder holder = world.getRecipeManager().getAllRecipesFor(RecipeRegistry.IMBUEMENT_TYPE.get()).stream().filter(f -> f.id().toString().equals(recipeName)).findFirst().orElse(null); + var recipe = holder != null ? holder.value() : null; + for (RecipeType type : ImbuementRecipeRegistry.INSTANCE.getRecipeTypes()) { + RecipeType imbuementRecipeType = (RecipeType) type; + RecipeHolder recipe1 = world.getRecipeManager().getAllRecipesFor(imbuementRecipeType).stream().filter(f -> f.id().toString().equals(recipeName)).findFirst().orElse(null); + if (recipe1 != null && recipe1.value() instanceof ImbuementRecipe imbuementRecipe){ + recipe = imbuementRecipe; + break; + } + } + return recipe == null ? ImmutableList.of() : recipe.pedestalItems; + } else if ("glyph_recipe".equals(recipeType)) { + RecipeHolder recipe = (RecipeHolder) world.getRecipeManager().byKey(ResourceLocation.tryParse(recipeName)).orElse(null); + return recipe == null ? ImmutableList.of() : recipe.value().inputs; + } else { + throw new IllegalArgumentException("Type must be 'enchanting_apparatus', 'glyph_recipe', or 'imbuement_chamber'!"); + } + } + + @Override + public void onVariablesAvailable(UnaryOperator lookup, HolderLookup.Provider registries) { + recipeName = lookup.apply(IVariable.wrap(recipeName)).asString(); + recipeType = lookup.apply(IVariable.wrap(recipeType)).asString(); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponentBase.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponentBase.java index 48093aae51..a46de75f38 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponentBase.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/component/RotatingItemListComponentBase.java @@ -1,57 +1,57 @@ -//package com.hollingsworth.arsnouveau.client.patchouli.component; -// -//import com.mojang.blaze3d.vertex.PoseStack; -//import net.minecraft.client.gui.GuiGraphics; -//import net.minecraft.world.item.crafting.Ingredient; -//import vazkii.patchouli.api.IComponentRenderContext; -//import vazkii.patchouli.api.ICustomComponent; -// -//import java.util.List; -// -///** -// * Base custom Patchouli component that draws a rotating circle of items. -// * Size is 80x80. For a centered one, set X to -1. -// */ -//abstract class RotatingItemListComponentBase implements ICustomComponent { -// protected transient List ingredients; -// protected transient int x, y; -// -// @Override -// public void build(int componentX, int componentY, int pageNum) { -// this.x = componentX != -1 ? componentX : 17; -// this.y = componentY; -// this.ingredients = makeIngredients(); -// } -// -// protected abstract List makeIngredients(); -// -// @Override -// public void render(GuiGraphics ms, IComponentRenderContext context, float pticks, int mouseX, int mouseY) { -// int degreePerInput = (int) (360F / ingredients.size()); -// int ticksElapsed = 0; -// float currentDegree = ticksElapsed; -// for (Ingredient input : ingredients) { -// renderIngredientAtAngle(ms, context, currentDegree, input, mouseX, mouseY); -// -// currentDegree += degreePerInput; -// } -// } -// -// -// private void renderIngredientAtAngle(GuiGraphics graphics, IComponentRenderContext context, float angle, Ingredient ingredient, int mouseX, int mouseY) { -// if (ingredient.isEmpty()) { -// return; -// } -// -// angle -= 90; -// int radius = 32; -// double xPos = x + Math.cos(angle * Math.PI / 180D) * radius + 32; -// double yPos = y + Math.sin(angle * Math.PI / 180D) * radius + 32; -// PoseStack ms = graphics.pose(); -// ms.pushPose(); // This translation makes it not stuttery. It does not affect the tooltip as that is drawn separately later. -// ms.translate(xPos - (int) xPos, yPos - (int) yPos, 0); -// context.renderIngredient(graphics, (int) xPos, (int) yPos, mouseX, mouseY, ingredient); -// ms.popPose(); -// } -// -//} \ No newline at end of file +package com.hollingsworth.arsnouveau.client.patchouli.component; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.world.item.crafting.Ingredient; +import vazkii.patchouli.api.IComponentRenderContext; +import vazkii.patchouli.api.ICustomComponent; + +import java.util.List; + +/** + * Base custom Patchouli component that draws a rotating circle of items. + * Size is 80x80. For a centered one, set X to -1. + */ +abstract class RotatingItemListComponentBase implements ICustomComponent { + protected transient List ingredients; + protected transient int x, y; + + @Override + public void build(int componentX, int componentY, int pageNum) { + this.x = componentX != -1 ? componentX : 17; + this.y = componentY; + this.ingredients = makeIngredients(); + } + + protected abstract List makeIngredients(); + + @Override + public void render(GuiGraphics ms, IComponentRenderContext context, float pticks, int mouseX, int mouseY) { + int degreePerInput = (int) (360F / ingredients.size()); + int ticksElapsed = 0; + float currentDegree = ticksElapsed; + for (Ingredient input : ingredients) { + renderIngredientAtAngle(ms, context, currentDegree, input, mouseX, mouseY); + + currentDegree += degreePerInput; + } + } + + + private void renderIngredientAtAngle(GuiGraphics graphics, IComponentRenderContext context, float angle, Ingredient ingredient, int mouseX, int mouseY) { + if (ingredient.isEmpty()) { + return; + } + + angle -= 90; + int radius = 32; + double xPos = x + Math.cos(angle * Math.PI / 180D) * radius + 32; + double yPos = y + Math.sin(angle * Math.PI / 180D) * radius + 32; + PoseStack ms = graphics.pose(); + ms.pushPose(); // This translation makes it not stuttery. It does not affect the tooltip as that is drawn separately later. + ms.translate(xPos - (int) xPos, yPos - (int) yPos, 0); + context.renderIngredient(graphics, (int) xPos, (int) yPos, mouseX, mouseY, ingredient); + ms.popPose(); + } + +} \ No newline at end of file From fb110034e7fc34a75983eab072efffa4576adf55 Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Fri, 9 Aug 2024 01:37:13 +0200 Subject: [PATCH 129/363] Fix smelt sensitive, allow wololo to process items (#1383) * Fix smelt sensitive, allow wololo to process items * Restore DyeRecipeDatagen --- .../f49682cfc17456297bb895b136258055d85afc0c | 17 +++++- .../recipe/dye_apprentice_spell_book.json | 16 +++++ .../recipe/dye_arcanist_boots.json | 16 +++++ .../ars_nouveau/recipe/dye_arcanist_hood.json | 16 +++++ .../recipe/dye_arcanist_leggings.json | 16 +++++ .../recipe/dye_arcanist_robes.json | 16 +++++ .../recipe/dye_archmage_spell_book.json | 16 +++++ .../recipe/dye_battlemage_boots.json | 16 +++++ .../recipe/dye_battlemage_hood.json | 16 +++++ .../recipe/dye_battlemage_leggings.json | 16 +++++ .../recipe/dye_battlemage_robes.json | 16 +++++ .../recipe/dye_novice_spell_book.json | 16 +++++ .../recipe/dye_sorcerer_boots.json | 16 +++++ .../ars_nouveau/recipe/dye_sorcerer_hood.json | 16 +++++ .../recipe/dye_sorcerer_leggings.json | 16 +++++ .../recipe/dye_sorcerer_robes.json | 16 +++++ .../common/datagen/DyeRecipeDatagen.java | 28 ++++++--- .../common/spell/effect/EffectSmelt.java | 21 ++++--- .../common/spell/effect/EffectWololo.java | 60 +++++++++++-------- 19 files changed, 325 insertions(+), 41 deletions(-) create mode 100644 src/generated/resources/data/ars_nouveau/recipe/dye_apprentice_spell_book.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/dye_arcanist_boots.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/dye_arcanist_hood.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/dye_arcanist_leggings.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/dye_arcanist_robes.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/dye_archmage_spell_book.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/dye_battlemage_boots.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/dye_battlemage_hood.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/dye_battlemage_leggings.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/dye_battlemage_robes.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/dye_novice_spell_book.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/dye_sorcerer_boots.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/dye_sorcerer_hood.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/dye_sorcerer_leggings.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/dye_sorcerer_robes.json diff --git a/src/generated/resources/.cache/f49682cfc17456297bb895b136258055d85afc0c b/src/generated/resources/.cache/f49682cfc17456297bb895b136258055d85afc0c index eb4aa692c3..f0a192b806 100644 --- a/src/generated/resources/.cache/f49682cfc17456297bb895b136258055d85afc0c +++ b/src/generated/resources/.cache/f49682cfc17456297bb895b136258055d85afc0c @@ -1 +1,16 @@ -// 1.21 2024-07-05T22:41:47.5536456 ArsNouveau: Json Datagen +// 1.21 2024-08-08T19:04:13.6142678 ArsNouveau: Json Datagen +e59d0832c1d168df4772338fe24485c4b6b94723 data/ars_nouveau/recipe/dye_apprentice_spell_book.json +d89b9456df55cd4bd1c30fa9fa253ac31fc7bf37 data/ars_nouveau/recipe/dye_arcanist_boots.json +9e0bcbe43d8ea6f0c1d354eb28878c8053ebe006 data/ars_nouveau/recipe/dye_arcanist_hood.json +41253ba787d247092cc0aa01a63f611f1960d495 data/ars_nouveau/recipe/dye_arcanist_leggings.json +189ad235d1115d185132d8d04fdac48e615a785b data/ars_nouveau/recipe/dye_arcanist_robes.json +29defc84bb87d7412f33f288516e36f45552dda9 data/ars_nouveau/recipe/dye_archmage_spell_book.json +2bf5abd01fa5e7206391bce9f1f7e7323b49af1c data/ars_nouveau/recipe/dye_battlemage_boots.json +172bcb20f3c1e37210dc0049f021bdbb1cb4db09 data/ars_nouveau/recipe/dye_battlemage_hood.json +ee135fc9c4739d1c73fb8e98288a5b24c6f518a6 data/ars_nouveau/recipe/dye_battlemage_leggings.json +f6099c592818ed29dc459e38f1e3da1a682da357 data/ars_nouveau/recipe/dye_battlemage_robes.json +4bbbd1b2d5198c2c905ba478db19c3c89088130e data/ars_nouveau/recipe/dye_novice_spell_book.json +30f621c895fd77d008e986f9e4270a3a6f814f2a data/ars_nouveau/recipe/dye_sorcerer_boots.json +afc5b6ee4ae0d417f1577d42b7fc8b9ab8b59207 data/ars_nouveau/recipe/dye_sorcerer_hood.json +64d136a9e98f5a1900692bd5fd5338f2b2691101 data/ars_nouveau/recipe/dye_sorcerer_leggings.json +5b91e0567ec0850bc91d899bfa91fc74faae4627 data/ars_nouveau/recipe/dye_sorcerer_robes.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/dye_apprentice_spell_book.json b/src/generated/resources/data/ars_nouveau/recipe/dye_apprentice_spell_book.json new file mode 100644 index 0000000000..c73148c0ed --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/dye_apprentice_spell_book.json @@ -0,0 +1,16 @@ +{ + "type": "ars_nouveau:dye", + "category": "misc", + "ingredients": [ + { + "tag": "c:dyes" + }, + { + "item": "ars_nouveau:apprentice_spell_book" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:apprentice_spell_book" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/dye_arcanist_boots.json b/src/generated/resources/data/ars_nouveau/recipe/dye_arcanist_boots.json new file mode 100644 index 0000000000..8efc31173f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/dye_arcanist_boots.json @@ -0,0 +1,16 @@ +{ + "type": "ars_nouveau:dye", + "category": "misc", + "ingredients": [ + { + "tag": "c:dyes" + }, + { + "item": "ars_nouveau:arcanist_boots" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:arcanist_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/dye_arcanist_hood.json b/src/generated/resources/data/ars_nouveau/recipe/dye_arcanist_hood.json new file mode 100644 index 0000000000..17b7ceb8cd --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/dye_arcanist_hood.json @@ -0,0 +1,16 @@ +{ + "type": "ars_nouveau:dye", + "category": "misc", + "ingredients": [ + { + "tag": "c:dyes" + }, + { + "item": "ars_nouveau:arcanist_hood" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:arcanist_hood" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/dye_arcanist_leggings.json b/src/generated/resources/data/ars_nouveau/recipe/dye_arcanist_leggings.json new file mode 100644 index 0000000000..5171ac2c84 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/dye_arcanist_leggings.json @@ -0,0 +1,16 @@ +{ + "type": "ars_nouveau:dye", + "category": "misc", + "ingredients": [ + { + "tag": "c:dyes" + }, + { + "item": "ars_nouveau:arcanist_leggings" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:arcanist_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/dye_arcanist_robes.json b/src/generated/resources/data/ars_nouveau/recipe/dye_arcanist_robes.json new file mode 100644 index 0000000000..8e92c2b754 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/dye_arcanist_robes.json @@ -0,0 +1,16 @@ +{ + "type": "ars_nouveau:dye", + "category": "misc", + "ingredients": [ + { + "tag": "c:dyes" + }, + { + "item": "ars_nouveau:arcanist_robes" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:arcanist_robes" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/dye_archmage_spell_book.json b/src/generated/resources/data/ars_nouveau/recipe/dye_archmage_spell_book.json new file mode 100644 index 0000000000..1822b72989 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/dye_archmage_spell_book.json @@ -0,0 +1,16 @@ +{ + "type": "ars_nouveau:dye", + "category": "misc", + "ingredients": [ + { + "tag": "c:dyes" + }, + { + "item": "ars_nouveau:archmage_spell_book" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:archmage_spell_book" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/dye_battlemage_boots.json b/src/generated/resources/data/ars_nouveau/recipe/dye_battlemage_boots.json new file mode 100644 index 0000000000..3e5b3c9a91 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/dye_battlemage_boots.json @@ -0,0 +1,16 @@ +{ + "type": "ars_nouveau:dye", + "category": "misc", + "ingredients": [ + { + "tag": "c:dyes" + }, + { + "item": "ars_nouveau:battlemage_boots" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:battlemage_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/dye_battlemage_hood.json b/src/generated/resources/data/ars_nouveau/recipe/dye_battlemage_hood.json new file mode 100644 index 0000000000..695b3fde29 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/dye_battlemage_hood.json @@ -0,0 +1,16 @@ +{ + "type": "ars_nouveau:dye", + "category": "misc", + "ingredients": [ + { + "tag": "c:dyes" + }, + { + "item": "ars_nouveau:battlemage_hood" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:battlemage_hood" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/dye_battlemage_leggings.json b/src/generated/resources/data/ars_nouveau/recipe/dye_battlemage_leggings.json new file mode 100644 index 0000000000..6aa632a92c --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/dye_battlemage_leggings.json @@ -0,0 +1,16 @@ +{ + "type": "ars_nouveau:dye", + "category": "misc", + "ingredients": [ + { + "tag": "c:dyes" + }, + { + "item": "ars_nouveau:battlemage_leggings" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:battlemage_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/dye_battlemage_robes.json b/src/generated/resources/data/ars_nouveau/recipe/dye_battlemage_robes.json new file mode 100644 index 0000000000..5c900ca0f4 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/dye_battlemage_robes.json @@ -0,0 +1,16 @@ +{ + "type": "ars_nouveau:dye", + "category": "misc", + "ingredients": [ + { + "tag": "c:dyes" + }, + { + "item": "ars_nouveau:battlemage_robes" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:battlemage_robes" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/dye_novice_spell_book.json b/src/generated/resources/data/ars_nouveau/recipe/dye_novice_spell_book.json new file mode 100644 index 0000000000..c01ff1e437 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/dye_novice_spell_book.json @@ -0,0 +1,16 @@ +{ + "type": "ars_nouveau:dye", + "category": "misc", + "ingredients": [ + { + "tag": "c:dyes" + }, + { + "item": "ars_nouveau:novice_spell_book" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:novice_spell_book" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/dye_sorcerer_boots.json b/src/generated/resources/data/ars_nouveau/recipe/dye_sorcerer_boots.json new file mode 100644 index 0000000000..df51c20dca --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/dye_sorcerer_boots.json @@ -0,0 +1,16 @@ +{ + "type": "ars_nouveau:dye", + "category": "misc", + "ingredients": [ + { + "tag": "c:dyes" + }, + { + "item": "ars_nouveau:sorcerer_boots" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:sorcerer_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/dye_sorcerer_hood.json b/src/generated/resources/data/ars_nouveau/recipe/dye_sorcerer_hood.json new file mode 100644 index 0000000000..3f30a1b4c5 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/dye_sorcerer_hood.json @@ -0,0 +1,16 @@ +{ + "type": "ars_nouveau:dye", + "category": "misc", + "ingredients": [ + { + "tag": "c:dyes" + }, + { + "item": "ars_nouveau:sorcerer_hood" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:sorcerer_hood" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/dye_sorcerer_leggings.json b/src/generated/resources/data/ars_nouveau/recipe/dye_sorcerer_leggings.json new file mode 100644 index 0000000000..8d6c70dccf --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/dye_sorcerer_leggings.json @@ -0,0 +1,16 @@ +{ + "type": "ars_nouveau:dye", + "category": "misc", + "ingredients": [ + { + "tag": "c:dyes" + }, + { + "item": "ars_nouveau:sorcerer_leggings" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:sorcerer_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/dye_sorcerer_robes.json b/src/generated/resources/data/ars_nouveau/recipe/dye_sorcerer_robes.json new file mode 100644 index 0000000000..0a40add92d --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/dye_sorcerer_robes.json @@ -0,0 +1,16 @@ +{ + "type": "ars_nouveau:dye", + "category": "misc", + "ingredients": [ + { + "tag": "c:dyes" + }, + { + "item": "ars_nouveau:sorcerer_robes" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:sorcerer_robes" + } +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DyeRecipeDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DyeRecipeDatagen.java index 0213adfcb4..5f1298048f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DyeRecipeDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DyeRecipeDatagen.java @@ -1,15 +1,24 @@ package com.hollingsworth.arsnouveau.common.datagen; import com.google.gson.JsonElement; +import com.hollingsworth.arsnouveau.common.crafting.recipes.DyeRecipe; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import com.mojang.serialization.JsonOps; +import net.minecraft.core.NonNullList; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; +import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.ItemLike; +import net.neoforged.neoforge.common.Tags; +import org.jetbrains.annotations.NotNull; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; + public class DyeRecipeDatagen extends SimpleDataProvider { List files = new ArrayList<>(); @@ -40,22 +49,25 @@ public void collectJsons(CachedOutput pOutput) { } - public void add(FileObj fileObj){ + public void add(FileObj fileObj) { files.add(fileObj); } - public void addDyeRecipe(ItemLike inputItem){ - //todo: restore dye serializer -// var dyeRecipe = new DyeRecipe("", CraftingBookCategory.MISC, inputItem, List.of()) -// RecipeRegistry.DYE_RECIPE.get().codec().codec().encode(new DyeRecipe()) -// add(new FileObj(output.resolve("data/ars_nouveau/recipes/dye_" + getRegistryName(inputItem.asItem()).getPath() + ".json"), DyeRecipe.)); + public void addDyeRecipe(ItemLike inputItem) { + var dyeRecipe = new DyeRecipe("", CraftingBookCategory.MISC, inputItem.asItem().getDefaultInstance(), NonNullList.of(Ingredient.EMPTY, Ingredient.of(Tags.Items.DYES), Ingredient.of(inputItem))); + files.add(new FileObj(resolvePath("data/ars_nouveau/recipe/dye_" + getRegistryName(inputItem.asItem()).getPath() + ".json"), DyeRecipe.CODEC.encodeStart(JsonOps.INSTANCE, dyeRecipe).getOrThrow())); } @Override - public String getName() { + public @NotNull String getName() { return "ArsNouveau: Json Datagen"; } - public record FileObj(Path path, JsonElement element){ + + Path resolvePath(String path) { + return this.generator.getPackOutput().getOutputFolder().resolve(path); + } + + public record FileObj(Path path, JsonElement element) { } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java index 25f61f1c01..499e1171cf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java @@ -8,12 +8,14 @@ import com.hollingsworth.arsnouveau.common.spell.augment.*; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.SimpleContainer; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.*; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SingleRecipeInput; +import net.minecraft.world.item.crafting.SmeltingRecipe; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; @@ -50,12 +52,15 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull double aoeBuff = spellStats.getAoeMultiplier(); int pierceBuff = spellStats.getBuffCount(AugmentPierce.INSTANCE); int maxItemSmelt = (int) Math.round(4 * (1 + aoeBuff + pierceBuff)); - List posList = SpellUtil.calcAOEBlocks(shooter, rayTraceResult.getBlockPos(), rayTraceResult, spellStats); - List itemEntities = world.getEntitiesOfClass(ItemEntity.class, new AABB(rayTraceResult.getBlockPos()).inflate(aoeBuff + 1.0)); - smeltItems(world, itemEntities, maxItemSmelt, spellStats); - - for (BlockPos pos : posList) { - smeltBlock(world, pos, shooter, rayTraceResult, spellStats, spellContext, resolver); + if (spellStats.isSensitive()) { + List itemEntities = world.getEntitiesOfClass(ItemEntity.class, new AABB(rayTraceResult.getBlockPos()).inflate(aoeBuff + 1.0)); + smeltItems(world, itemEntities, maxItemSmelt, spellStats); + } else { + List posList = SpellUtil.calcAOEBlocks(shooter, rayTraceResult.getBlockPos(), rayTraceResult, spellStats); + + for (BlockPos pos : posList) { + smeltBlock(world, pos, shooter, rayTraceResult, spellStats, spellContext, resolver); + } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java index e6cd7e380b..7a0eb23f4a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java @@ -24,6 +24,7 @@ import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.animal.Sheep; import net.minecraft.world.entity.decoration.ArmorStand; +import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.CraftingContainer; @@ -32,6 +33,7 @@ import net.minecraft.world.item.component.DyedItemColor; import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -56,33 +58,43 @@ public EffectWololo() { @Override public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { - if (!(rayTraceResult.getEntity() instanceof LivingEntity living)) return; - Player player = ANFakePlayer.getPlayer((ServerLevel) world); ItemStack dyeStack = getDye(shooter, spellStats, spellContext, player); if (dyeStack.isEmpty()) return; DyeItem dye = (DyeItem) dyeStack.getItem(); - if (living instanceof Sheep sheep) - sheep.setColor(dye.getDyeColor()); - else if (spellStats.isSensitive() || living instanceof ArmorStand) { - for (ItemStack armorStack : living.getArmorSlots()) { - if (!armorStack.isEmpty()) { - var dyeComponent = armorStack.get(DataComponents.DYED_COLOR); - if (dyeComponent != null) { - armorStack.set(DataComponents.DYED_COLOR, new DyedItemColor(dye.getDyeColor().getTextureDiffuseColor(), false)); - } else if (armorStack.getItem() instanceof IDyeable iDyeable) { - iDyeable.onDye(armorStack, dye.getDyeColor()); + if (rayTraceResult.getEntity() instanceof ItemEntity itemEntity) { + if (itemEntity.getItem().getItem() instanceof IDyeable iDyeable) + iDyeable.onDye(itemEntity.getItem(), dye.getDyeColor()); + else if (itemEntity.getItem().getItem() instanceof BlockItem blockItem) { + ItemStack result = getDyedResult((ServerLevel) world, makeContainer(dye, blockItem)); + result.setCount(itemEntity.getItem().getCount()); + if (!result.isEmpty() && result.getItem() instanceof BlockItem) { + itemEntity.setItem(result); + } + } + } else if (rayTraceResult.getEntity() instanceof LivingEntity living) { + if (living instanceof Sheep sheep) + sheep.setColor(dye.getDyeColor()); + else if (spellStats.isSensitive() || living instanceof ArmorStand) { + for (ItemStack armorStack : living.getArmorSlots()) { + if (!armorStack.isEmpty()) { + var dyeComponent = armorStack.get(DataComponents.DYED_COLOR); + if (dyeComponent != null) { + armorStack.set(DataComponents.DYED_COLOR, new DyedItemColor(dye.getDyeColor().getTextureDiffuseColor(), false)); + } else if (armorStack.getItem() instanceof IDyeable iDyeable) { + iDyeable.onDye(armorStack, dye.getDyeColor()); + } } } + } else if (living instanceof Mob mob) { + player.setItemInHand(InteractionHand.MAIN_HAND, dyeStack); + ((MobAccessor) mob).callMobInteract(player, InteractionHand.MAIN_HAND); + player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); } - } else if (living instanceof Mob mob) { - player.setItemInHand(InteractionHand.MAIN_HAND, dyeStack); - ((MobAccessor) mob).callMobInteract(player, InteractionHand.MAIN_HAND); - player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); } - world.playSound(null, living.getX(), living.getY(), living.getZ(), SoundEvents.EVOKER_PREPARE_WOLOLO, SoundSource.PLAYERS, spellContext.getSpell().sound().getVolume(), spellContext.getSpell().sound().getPitch()); + world.playSound(null, rayTraceResult.getEntity().getX(), rayTraceResult.getEntity().getY(), rayTraceResult.getEntity().getZ(), SoundEvents.EVOKER_PREPARE_WOLOLO, SoundSource.PLAYERS, spellContext.getSpell().sound().getVolume(), spellContext.getSpell().sound().getPitch()); } @NotNull @@ -90,7 +102,7 @@ private ItemStack getDye(@NotNull LivingEntity shooter, SpellStats spellStats, S if (spellContext.getCaster() instanceof TileCaster) { InventoryManager manager = spellContext.getCaster().getInvManager(); - SlotReference reference = manager.findItem(i -> (i.getItem() instanceof DyeItem), InteractType.EXTRACT); + SlotReference reference = manager.findItem(i -> i.getItem() instanceof DyeItem, InteractType.EXTRACT); if (!reference.isEmpty()) { return reference.getHandler().getStackInSlot(reference.getSlot()); } @@ -145,23 +157,23 @@ private ItemStack getDyedResult(ServerLevel world, CraftingContainer craftingcon recipeCache.add(recipe.get()); return recipe.get().assemble(craftingcontainer.asCraftInput(), world.registryAccess()); } - return world.getRecipeManager().getRecipeFor(RecipeType.CRAFTING, craftingcontainer.asCraftInput(), world).map((craftingRecipe) -> craftingRecipe.value().assemble(craftingcontainer.asCraftInput(), world.registryAccess())).orElse(ItemStack.EMPTY); + return world.getRecipeManager().getRecipeFor(RecipeType.CRAFTING, craftingcontainer.asCraftInput(), world).map(craftingRecipe -> craftingRecipe.value().assemble(craftingcontainer.asCraftInput(), world.registryAccess())).orElse(ItemStack.EMPTY); } - private static CraftingContainer makeContainer(DyeItem targetColor, Block blockToDye) { + private static CraftingContainer makeContainer(DyeItem targetColor, ItemLike blockToDye) { CraftingContainer craftingcontainer = new TransientCraftingContainer(new AbstractContainerMenu(null, -1) { /** * Handle when the stack in slot {@code index} is shift-clicked. Normally this moves the stack between the * player inventory and the other inventory(s). */ - public ItemStack quickMoveStack(Player p_218264_, int p_218265_) { + public @NotNull ItemStack quickMoveStack(@NotNull Player p_218264_, int p_218265_) { return ItemStack.EMPTY; } /** * Determines whether supplied player can use this container */ - public boolean stillValid(Player p_29888_) { + public boolean stillValid(@NotNull Player p_29888_) { return false; } }, 2, 1); @@ -176,14 +188,14 @@ private static CraftingContainer makeContainer8(DyeItem targetColor, Block block * Handle when the stack in slot {@code index} is shift-clicked. Normally this moves the stack between the * player inventory and the other inventory(s). */ - public ItemStack quickMoveStack(Player p_218264_, int p_218265_) { + public @NotNull ItemStack quickMoveStack(@NotNull Player p_218264_, int p_218265_) { return ItemStack.EMPTY; } /** * Determines whether supplied player can use this container */ - public boolean stillValid(Player p_29888_) { + public boolean stillValid(@NotNull Player p_29888_) { return false; } }, 3, 3); From 1d0c755ca34d7ac2793f1b6f9064f4c9c845d4ca Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 15 Aug 2024 19:59:09 -0500 Subject: [PATCH 130/363] Fix spell sensor crash --- .../java/com/hollingsworth/arsnouveau/api/util/NBTUtil.java | 1 + .../arsnouveau/common/block/tile/SpellSensorTile.java | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/NBTUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/NBTUtil.java index 8532792091..a9b27f830e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/NBTUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/NBTUtil.java @@ -93,6 +93,7 @@ public static List readItems(HolderLookup.Provider pRegistries, Compo public static void writeItems(HolderLookup.Provider pRegistries, CompoundTag tag, String prefix, List items) { CompoundTag allItemsTag = new CompoundTag(); + items = items.stream().filter(stack -> !stack.isEmpty()).collect(Collectors.toList()); for (int i = 0; i < items.size(); i++) { ItemStack stack = items.get(i); Tag itemTag = stack.save(pRegistries); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java index bb23dd055b..b440d197b8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SpellSensorTile.java @@ -156,7 +156,9 @@ public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { tag.putInt("outputDuration", outputDuration); tag.putInt("outputStrength", outputStrength); tag.putBoolean("isOnResolve", isOnResolve); - tag.put("parchment", parchment.save(pRegistries)); + if(!this.parchment.isEmpty()) { + tag.put("parchment", parchment.save(pRegistries)); + } } @Override From b720a351d57f19a7372fd70536e1ec2d2c641bf3 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 15 Aug 2024 21:31:32 -0500 Subject: [PATCH 131/363] Fix guis rendering in hideGui setting --- .../com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java | 3 +++ .../com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java | 3 +++ .../arsnouveau/client/registry/ClientHandler.java | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java index 7d1a1cd87b..effe329aad 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiManaHUD.java @@ -24,6 +24,9 @@ public class GuiManaHUD { private static final Minecraft minecraft = Minecraft.getInstance(); public static boolean shouldDisplayBar() { + if (Minecraft.getInstance().options.hideGui) { + return false; + } ItemStack mainHand = minecraft.player.getMainHandItem(); ItemStack offHand = minecraft.player.getOffhandItem(); var isMainDisplayable = mainHand.getItem() instanceof IDisplayMana iDisplayMana && iDisplayMana.shouldDisplay(mainHand); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java index 353e238178..27bbdeff99 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java @@ -17,6 +17,9 @@ public class GuiSpellHUD { private static final Minecraft minecraft = Minecraft.getInstance(); public static void renderOverlay(GuiGraphics graphics, DeltaTracker deltaTracker) { + if (Minecraft.getInstance().options.hideGui) { + return; + } ItemStack stack = StackUtil.getHeldSpellbook(minecraft.player); if (stack != ItemStack.EMPTY && stack.getItem() instanceof SpellBook) { int offsetLeft = 10; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index a04ad0f111..23342aabe8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -164,7 +164,7 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer Minecraft mc = Minecraft.getInstance(); Level level = mc.level; BlockPos pos = mc.cameraEntity.blockPosition(); - if (!CameraUtil.isPlayerMountedOnCamera(mc.player)) { + if (!CameraUtil.isPlayerMountedOnCamera(mc.player) || mc.options.hideGui) { return; } if (!mc.options.reducedDebugInfo().get()) { From 3f5eff5d4066f81e8e9d57a9dba9120ad641abfa Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Sat, 17 Aug 2024 17:44:22 +0200 Subject: [PATCH 132/363] Fix README.md link (#1384) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f98cfa4c92..44d8a95c79 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,6 @@ dependencies { ``` Current version (1.21): -[![Maven](https://img.shields.io/maven-metadata/v?label=&color=C71A36&metadataUrl=https%3A%2F%2Fmaven.blamejared.com%2Fcom%2Fhollingsworth%2Fars_nouveau%2Fars_nouveau-1.20.1%2Fmaven-metadata.xml&style=flat-square)](https://maven.blamejared.com/com/hollingsworth/ars_nouveau/ars_nouveau-1.21.0/) +[![Maven](https://img.shields.io/maven-metadata/v?label=&color=C71A36&metadataUrl=https%3A%2F%2Fmaven.blamejared.com%2Fcom%2Fhollingsworth%2Fars_nouveau%2Fars_nouveau-1.21.0%2Fmaven-metadata.xml&style=flat-square)](https://maven.blamejared.com/com/hollingsworth/ars_nouveau/ars_nouveau-1.21.0/) (remove the v) From 27a905bd3e2e4be2c5a96b7868e8c52744604fbb Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 17 Aug 2024 10:54:56 -0500 Subject: [PATCH 133/363] add missing food, bow tags --- gradle.properties | 2 +- .../103d9f3f36b01595f1aa5172191e60eff02e6924 | 2 +- .../1fdcfe145635ded7bf0d505f6787667f0b49b64e | 2 +- .../2741af456691947b147d613b4e1cc70c9e71dd32 | 2 +- .../303313689de900e45df1f7ca17c3d36f2c78ac0c | 2 +- .../366e6cedc97b567a76524805ff813b15bef0b4f4 | 2 +- .../43f70b1d0fc3650d25dddf44c6efffef1900bb18 | 2 +- .../457d401e850e914fe39c053c4aa175787ef49774 | 2 +- .../56408d4385cae198e776e71d25785a05a196148d | 2 +- .../57a62c95f59bc5868cffb1d040840f0d715117bd | 2 +- .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 2 +- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 2 +- .../5c9e5647706b386caccf0aef27efaa68965030b8 | 8 +- .../73a0c150702b0db33c4f7a4031c7885e3223a862 | 2 +- .../7b0970ef111b287b053eb2a386d0fca6ee5aa291 | 2 +- .../8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 | 2 +- .../95c82c0d51fb7266bfeb5f2d122be5f9b82ff056 | 2 +- .../9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e | 2 +- .../a4c3c262a85f6a179e7e29128e8b31d4da806803 | 2 +- .../a5922da861c7ee259705eec42cf3df986f0db576 | 2 +- .../abe0934abf823d33d3e88ae408c1d215f03f6bdc | 2 +- .../af617d50f86666f21b24a8919c1c50aad8faa4f8 | 2 +- .../b7d20159a598c550a793f4787d1e0a9f9d0b61c6 | 2 +- .../c03ccd0f93606faadfab316dc8aedf1ba96c844a | 2 +- .../cdae075e2d4d58384fe4d2075f6d5323fe5baa69 | 2 +- .../d0c924a870929ce1baf161c329e85242236b3530 | 2 +- .../d2032e9832fa171affe4a9c0c99fb97f183ff8a6 | 2 +- .../e0d3d0b8d9c807675613821fa865a35f707cd83f | 2 +- .../e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 | 2 +- .../e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 | 2 +- .../e7c243f38c2b0774b1bff1a90ede0b19a4077240 | 2 +- .../eac00f78ae0d33a31d4f208cb05939a004e6cb91 | 2 +- .../f0f2bcace349d412215f006e6183aa56b9316c3c | 2 +- .../f49682cfc17456297bb895b136258055d85afc0c | 2 +- .../resources/data/c/tags/item/foods.json | 5 + .../data/c/tags/item/foods/berry.json | 5 + .../data/c/tags/item/foods/fruit.json | 8 ++ .../resources/data/c/tags/item/tools/bow.json | 5 + .../data/c/tags/item/tools/crossbow.json | 5 + .../data/c/tags/item/tools/ranged_weapon.json | 6 + .../arsnouveau/api/util/BlockUtil.java | 103 +++++++++++------- .../common/datagen/ItemTagProvider.java | 10 ++ 42 files changed, 145 insertions(+), 76 deletions(-) create mode 100644 src/generated/resources/data/c/tags/item/foods.json create mode 100644 src/generated/resources/data/c/tags/item/foods/berry.json create mode 100644 src/generated/resources/data/c/tags/item/foods/fruit.json create mode 100644 src/generated/resources/data/c/tags/item/tools/bow.json create mode 100644 src/generated/resources/data/c/tags/item/tools/crossbow.json create mode 100644 src/generated/resources/data/c/tags/item/tools/ranged_weapon.json diff --git a/gradle.properties b/gradle.properties index 2179fb7d43..74ea11bb39 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ neogradle.subsystems.parchment.mappingsVersion=2024.05.01 minecraft_version=1.21.0 parchment_version=2024.05.01 minecraft_version_range=[1.20.6,1.21) -neo_version=21.0.163 +neo_version=21.1.13 neo_version_range=[20.6,) loader_version_range=[2,) diff --git a/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 index f39112575f..208ae85368 100644 --- a/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 +++ b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 @@ -1,4 +1,4 @@ -// 1.21 2024-07-05T22:41:47.5401094 Registries +// 1.21.1 2024-08-17T10:54:39.1843046 Registries 32a6b3988ea60702ed982c1c98ce98d780914ee6 data/ars_nouveau/neoforge/biome_modifier/common_source_berry.json 48f1ed52be8710f33085755655620cd53a9a6705 data/ars_nouveau/neoforge/biome_modifier/drygmy_spawn.json e91a5b67459e7010b9d1a4352ce270b6d1c14d24 data/ars_nouveau/neoforge/biome_modifier/gift_starbuncle_spawn.json diff --git a/src/generated/resources/.cache/1fdcfe145635ded7bf0d505f6787667f0b49b64e b/src/generated/resources/.cache/1fdcfe145635ded7bf0d505f6787667f0b49b64e index f502209b5a..bfe17a8e56 100644 --- a/src/generated/resources/.cache/1fdcfe145635ded7bf0d505f6787667f0b49b64e +++ b/src/generated/resources/.cache/1fdcfe145635ded7bf0d505f6787667f0b49b64e @@ -1,4 +1,4 @@ -// 1.21 2024-07-05T22:41:47.5326053 Ars Nouveau's Damage Type Data +// 1.21.1 2024-08-17T10:54:39.1742947 Ars Nouveau's Damage Type Data 4b4b2ff422d23e4cb6282f664d89dad7ac8ff8e6 data/ars_nouveau/damage_type/crush.json fe8c85729655f971ee94229cbb7d68bbb513d08b data/ars_nouveau/damage_type/flare.json 3aa319bb73ba25bbeae84aace10603b4900b6100 data/ars_nouveau/damage_type/frost.json diff --git a/src/generated/resources/.cache/2741af456691947b147d613b4e1cc70c9e71dd32 b/src/generated/resources/.cache/2741af456691947b147d613b4e1cc70c9e71dd32 index e98111893f..43e453005f 100644 --- a/src/generated/resources/.cache/2741af456691947b147d613b4e1cc70c9e71dd32 +++ b/src/generated/resources/.cache/2741af456691947b147d613b4e1cc70c9e71dd32 @@ -1,4 +1,4 @@ -// 1.21 2024-08-02T11:37:31.2380448 Tags for minecraft:damage_type mod id ars_nouveau +// 1.21.1 2024-08-17T10:54:39.172785 Tags for minecraft:damage_type mod id ars_nouveau 8641b05da5b216be05123e3ed96b606930b31f26 data/minecraft/tags/damage_type/always_hurts_ender_dragons.json c07768ed08384f5d693ed8bed719a825a531b78e data/minecraft/tags/damage_type/bypasses_armor.json 4eb8deadc24e4e017387ef06cfa6543373cea902 data/minecraft/tags/damage_type/is_fall.json diff --git a/src/generated/resources/.cache/303313689de900e45df1f7ca17c3d36f2c78ac0c b/src/generated/resources/.cache/303313689de900e45df1f7ca17c3d36f2c78ac0c index 0ce305e7b0..2581d5bb9c 100644 --- a/src/generated/resources/.cache/303313689de900e45df1f7ca17c3d36f2c78ac0c +++ b/src/generated/resources/.cache/303313689de900e45df1f7ca17c3d36f2c78ac0c @@ -1,4 +1,4 @@ -// 1.21 2024-07-05T22:41:47.5306079 Tags for minecraft:worldgen/biome mod id ars_nouveau +// 1.21.1 2024-08-17T10:54:39.1707777 Tags for minecraft:worldgen/biome mod id ars_nouveau 92c4e65802ffcb7533e9259f0b0356510154d662 data/ars_nouveau/tags/worldgen/biome/archwood_biome.json 60daaef808d1b0ed031d9007b5ad3007d1fdb695 data/ars_nouveau/tags/worldgen/biome/berry_spawn.json e65d864a8148e6a6c372dcc989f9c68e0ae6110c data/ars_nouveau/tags/worldgen/biome/no_mob_spawn.json diff --git a/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 b/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 index 4438826562..866f530b6e 100644 --- a/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 +++ b/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 @@ -1,2 +1,2 @@ -// 1.21 2024-07-07T16:24:07.0958013 Dispel Entity Datagen +// 1.21.1 2024-08-17T10:54:39.2161684 Dispel Entity Datagen 55a9fb696041d92f6546f9017307a9e660678713 data/ars_nouveau/recipe/dispel_entity/blaze_powder.json diff --git a/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 b/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 index 79092dd5b2..3618ba3dce 100644 --- a/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 +++ b/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 @@ -1,4 +1,4 @@ -// 1.21 2024-08-01T23:52:13.9514851 Crush +// 1.21.1 2024-08-17T10:54:39.2151663 Crush b74461afbe445ac042cd1d04298474b2403054ae data/ars_nouveau/recipe/blue_dye.json 0ba5aafe171e9aab7bec69520d99698d5829fd97 data/ars_nouveau/recipe/brown_dye.json dfee25791763eafe3dacdb2ce45173e1f5862a70 data/ars_nouveau/recipe/cobblestone.json diff --git a/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 b/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 index 04d72a75aa..0d6212eaf3 100644 --- a/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 +++ b/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 @@ -1,4 +1,4 @@ -// 1.21 2024-07-07T16:24:07.0947972 Scry Ritual Datagen +// 1.21.1 2024-08-17T10:54:39.2126506 Scry Ritual Datagen 232f269b1fff184deb77cb619f1cfef3dbb29d1d data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json b32750a842adeae968d1a3aee9cf1765d896245f data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json 8841bb51fbd86c8fdfd0a8b4ef5a2b6cdf8193a0 data/ars_nouveau/recipe/scry_ritual/coal_ores.json diff --git a/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d b/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d index ab52b54ebf..e51978c557 100644 --- a/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d +++ b/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d @@ -1,4 +1,4 @@ -// 1.21 2024-07-16T17:27:46.6062375 Ars Nouveau's Enchantment Data +// 1.21.1 2024-08-17T10:54:39.1707777 Ars Nouveau's Enchantment Data e86598b47a336ed9c1c12c8c0391cf4d2f771c21 data/ars_nouveau/enchantment/mana_boost.json 321253ad8e6e58e584e3fe140e7fc39a1f2f11b7 data/ars_nouveau/enchantment/mana_regen.json 8091c2c07766c95ebf45a5618abc2da3ab8c9051 data/ars_nouveau/enchantment/reactive.json diff --git a/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd b/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd index f94d129dd4..2fe79b2f3c 100644 --- a/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd +++ b/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd @@ -1,2 +1,2 @@ -// 1.21 2024-07-07T16:24:07.0932908 Summon Ritual Datagen +// 1.21.1 2024-08-17T10:54:39.2031315 Summon Ritual Datagen 71d5df7266f203db9b869b49529b50e286ea662d data/ars_nouveau/recipe/summon_ritual/bats.json diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d index 2a57d4d59b..eebf78b782 100644 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -1,4 +1,4 @@ -// 1.21 2024-07-23T20:42:37.1745902 Loot Tables +// 1.21.1 2024-08-17T10:54:39.1657699 Loot Tables 4f70eae621815da8d08d3ea0b9fd479b48bad2d3 data/ars_nouveau/loot_table/blocks/agronomic_sourcelink.json 8a6d60f2b39de0408c7e4537b53e866a04236d22 data/ars_nouveau/loot_table/blocks/alchemical_sourcelink.json 8bdff8a0a49a9f3f21a822eb1d1d01a950d6ad1a data/ars_nouveau/loot_table/blocks/alteration_table.json diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 28f0c39b49..195f2df47f 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21 2024-08-07T12:53:38.654994 Languages: en_us for mod: ars_nouveau +// 1.21.1 2024-08-17T10:54:39.1906122 Languages: en_us for mod: ars_nouveau ad0ccb9476538b6b03045d6eb71b01ea6b556b71 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 b/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 index de395cecad..1ab187d143 100644 --- a/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 +++ b/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 @@ -1,4 +1,4 @@ -// 1.21 2024-08-07T20:42:54.1584909 Tags for minecraft:item mod id ars_nouveau +// 1.21.1 2024-08-17T10:54:39.1951343 Tags for minecraft:item mod id ars_nouveau bde6ca31173d1f22d5f6fe355dc90c9faa35b239 data/ars_nouveau/tags/item/golem/shard.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/item/interact_jar_blacklist.json a0800fbffa0e00aecb2e86a1e991d42904427191 data/ars_nouveau/tags/item/magic_food.json @@ -17,6 +17,9 @@ d975e125845630962d46be3215fd2bf3c557e5dc data/c/tags/item/crops.json 87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/c/tags/item/fences/wooden.json 0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/c/tags/item/fence_gates.json 0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/c/tags/item/fence_gates/wooden.json +37ff325e2c724ad60fc99b6770ec7cfe48f1101d data/c/tags/item/foods.json +f36268e9375442e51cbf98f2c4d573082aa56378 data/c/tags/item/foods/berry.json +79c704885f8d5df4cd8bf9c7b063f6bddee0b7ad data/c/tags/item/foods/fruit.json f36268e9375442e51cbf98f2c4d573082aa56378 data/c/tags/item/fruits/berry.json 0fab28203f8c9e1daa9c635ecb6c026ba0be0ba1 data/c/tags/item/gems.json 0fab28203f8c9e1daa9c635ecb6c026ba0be0ba1 data/c/tags/item/gems/source.json @@ -26,6 +29,9 @@ f898aac12b01b598949701b1f6e45aa0cd1d9a25 data/c/tags/item/planks/archwood.json 3737e6b65e87993bd971b233c3aca5088721eb32 data/c/tags/item/seeds.json 6febc815f11d70abf442be0be941a9132ddd072d data/c/tags/item/storage_blocks.json 6febc815f11d70abf442be0be941a9132ddd072d data/c/tags/item/storage_blocks/source.json +46865d605d1c44b2ab5023e21848213c969eec08 data/c/tags/item/tools/bow.json +d856556e7a50694e4fafc11b5b85240ad831548b data/c/tags/item/tools/crossbow.json +638c18209321ba35c9243fdd8aaefda97d64292e data/c/tags/item/tools/ranged_weapon.json 877c63c507be1e55a9f5eeed6e73dfabea015dab data/c/tags/item/tools/shield.json 0fab28203f8c9e1daa9c635ecb6c026ba0be0ba1 data/minecraft/tags/item/beacon_payment_items.json 30ef7d5d3bbd42c50ac6566dce458cb5f7ee404b data/minecraft/tags/item/bookshelf_books.json diff --git a/src/generated/resources/.cache/73a0c150702b0db33c4f7a4031c7885e3223a862 b/src/generated/resources/.cache/73a0c150702b0db33c4f7a4031c7885e3223a862 index f22fd9e978..c933f43056 100644 --- a/src/generated/resources/.cache/73a0c150702b0db33c4f7a4031c7885e3223a862 +++ b/src/generated/resources/.cache/73a0c150702b0db33c4f7a4031c7885e3223a862 @@ -1,4 +1,4 @@ -// 1.21 2024-07-05T22:41:47.5356055 Tags for minecraft:mob_effect mod id ars_nouveau +// 1.21.1 2024-08-17T10:54:39.1783109 Tags for minecraft:mob_effect mod id ars_nouveau 08d652bf70406a53ea8f4c794d20f054284765b9 data/ars_nouveau/tags/mob_effect/deny_dispel.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/mob_effect/to_sync.json 0315b9264874191953c091e06cf2d340f81d6d67 data/ars_nouveau/tags/mob_effect/unstable_gifts.json diff --git a/src/generated/resources/.cache/7b0970ef111b287b053eb2a386d0fca6ee5aa291 b/src/generated/resources/.cache/7b0970ef111b287b053eb2a386d0fca6ee5aa291 index 068a2a1cdf..245a74571a 100644 --- a/src/generated/resources/.cache/7b0970ef111b287b053eb2a386d0fca6ee5aa291 +++ b/src/generated/resources/.cache/7b0970ef111b287b053eb2a386d0fca6ee5aa291 @@ -1,3 +1,3 @@ -// 1.21 2024-07-05T22:41:47.5316058 Tags for minecraft:worldgen/placed_feature mod id ars_nouveau +// 1.21.1 2024-08-17T10:54:39.17178 Tags for minecraft:worldgen/placed_feature mod id ars_nouveau 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/worldgen/placed_feature/archwood_trees.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/worldgen/placed_feature/source_berries.json diff --git a/src/generated/resources/.cache/8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 b/src/generated/resources/.cache/8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 index f33caecc93..0025cd0e89 100644 --- a/src/generated/resources/.cache/8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 +++ b/src/generated/resources/.cache/8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 @@ -1,4 +1,4 @@ -// 1.21 2024-07-14T18:50:50.8010562 Grab bag Datagen +// 1.21.1 2024-08-17T10:54:39.1951343 Grab bag Datagen 9f12aa688a076e34ed4b457c7fe492205a824d83 data/ars_nouveau/recipe/apprentice_book_upgrade.json 98ef162dd5449b8a1e3b5f9a98cf46852e4d2da3 data/ars_nouveau/recipe/archmage_book_upgrade.json 09fbe1cf323f738d045cfc231fc12a311ab62325 data/ars_nouveau/recipe/fill_potion_flask_0.json diff --git a/src/generated/resources/.cache/95c82c0d51fb7266bfeb5f2d122be5f9b82ff056 b/src/generated/resources/.cache/95c82c0d51fb7266bfeb5f2d122be5f9b82ff056 index e513f4fef1..40bab15ddc 100644 --- a/src/generated/resources/.cache/95c82c0d51fb7266bfeb5f2d122be5f9b82ff056 +++ b/src/generated/resources/.cache/95c82c0d51fb7266bfeb5f2d122be5f9b82ff056 @@ -1,2 +1,2 @@ -// 1.21 2024-07-05T22:41:47.5451208 Tags for minecraft:worldgen/structure mod id ars_nouveau +// 1.21.1 2024-08-17T10:54:39.1916083 Tags for minecraft:worldgen/structure mod id ars_nouveau eedfc051e19e8fe8ea38287245711becdf5d7ba7 data/ars_nouveau/tags/worldgen/structure/wilden_den.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index 347590a830..5fa64232b1 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,4 +1,4 @@ -// 1.21 2024-08-01T23:52:13.9466897 Recipes +// 1.21.1 2024-08-17T10:54:39.2056451 Recipes a76e5d9eef406841f56740535ec2afdd509de507 data/ars_nouveau/advancement/recipes/building_blocks/archwood_button.json 443515bb80018fbe37a128cb6849f5e818be315d data/ars_nouveau/advancement/recipes/building_blocks/archwood_door.json 4dfc3afae271aae8423d20dedb67dc601ff71fa0 data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence.json diff --git a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 index bd23d0646e..01c776254c 100644 --- a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 +++ b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 @@ -1,4 +1,4 @@ -// 1.21 2024-07-14T12:08:42.8994253 Ars Nouveau Item Models +// 1.21.1 2024-08-17T10:54:39.1793029 Ars Nouveau Item Models 11ee554b11a3a830e89b742762e5b754c2ecb5ee assets/ars_nouveau/models/item/agronomic_sourcelink.json 339a05323ebef7efc5c70db708a2e7a24708e9bc assets/ars_nouveau/models/item/alchemical_sourcelink.json a0214090201827dd5f954d0b33e64e4df6e53764 assets/ars_nouveau/models/item/alchemists_crown.json diff --git a/src/generated/resources/.cache/a5922da861c7ee259705eec42cf3df986f0db576 b/src/generated/resources/.cache/a5922da861c7ee259705eec42cf3df986f0db576 index b4092e298b..4d53dd3c60 100644 --- a/src/generated/resources/.cache/a5922da861c7ee259705eec42cf3df986f0db576 +++ b/src/generated/resources/.cache/a5922da861c7ee259705eec42cf3df986f0db576 @@ -1,4 +1,4 @@ -// 1.21 2024-07-05T22:41:47.5336056 Block States: ars_nouveau +// 1.21.1 2024-08-17T10:54:39.1753084 Block States: ars_nouveau 1b2e60c29cbc9cba57df1e1d0fd9b6f5394b7980 assets/ars_nouveau/blockstates/agronomic_sourcelink.json ca9e60aa92a8af0ebf19eb2abd29e68574574b75 assets/ars_nouveau/blockstates/alchemical_sourcelink.json 638796836b1f117aedad8d79ecec507b605c60d3 assets/ars_nouveau/blockstates/archwood_door.json diff --git a/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc b/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc index 681b999833..89077780ad 100644 --- a/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc +++ b/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc @@ -1,2 +1,2 @@ -// 1.21 2024-07-07T16:24:07.0922909 Budding Conversion Datagen +// 1.21.1 2024-08-17T10:54:39.1896081 Budding Conversion Datagen bc1af13edf233755680b29b8951ea6dc71e98707 data/ars_nouveau/recipe/budding_conversion/budding_amethyst.json diff --git a/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 b/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 index 7bbd9aed30..5c7b024f23 100644 --- a/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 +++ b/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 @@ -1,4 +1,4 @@ -// 1.21 2024-08-01T23:52:13.9433713 Imbuement +// 1.21.1 2024-08-17T10:54:39.1916083 Imbuement d8ef9562f603943cf768422fb009c9ec77d7dc65 data/ars_nouveau/recipe/abjuration_essence.json 98efa28dfca47cd27a0e31e89208825c7e320e61 data/ars_nouveau/recipe/air_essence.json 6d57a8685026b987a6012bb592cf26c3dba0e89c data/ars_nouveau/recipe/amethyst.json diff --git a/src/generated/resources/.cache/b7d20159a598c550a793f4787d1e0a9f9d0b61c6 b/src/generated/resources/.cache/b7d20159a598c550a793f4787d1e0a9f9d0b61c6 index 7380a67063..fa6d3c066a 100644 --- a/src/generated/resources/.cache/b7d20159a598c550a793f4787d1e0a9f9d0b61c6 +++ b/src/generated/resources/.cache/b7d20159a598c550a793f4787d1e0a9f9d0b61c6 @@ -1,4 +1,4 @@ -// 1.21 2024-08-06T14:35:24.0835043 Curios for ars_nouveau +// 1.21.1 2024-08-17T10:54:39.1941224 Curios for ars_nouveau a515afa522bcbf0b8b05736bae63a9af4054cf26 data/ars_nouveau/curios/entities/an_curios.json 84db829ff6895b514af66069168752d2bc107a02 data/ars_nouveau/curios/slots/an_focus.json 240e1f476f220fc486f85d0132786a1374faaa46 data/ars_nouveau/curios/slots/belt.json diff --git a/src/generated/resources/.cache/c03ccd0f93606faadfab316dc8aedf1ba96c844a b/src/generated/resources/.cache/c03ccd0f93606faadfab316dc8aedf1ba96c844a index 10b3c18d60..570a5bf8d6 100644 --- a/src/generated/resources/.cache/c03ccd0f93606faadfab316dc8aedf1ba96c844a +++ b/src/generated/resources/.cache/c03ccd0f93606faadfab316dc8aedf1ba96c844a @@ -1,3 +1,3 @@ -// 1.21 2024-07-10T21:15:15.9194307 Tags for minecraft:enchantment mod id ars_nouveau +// 1.21.1 2024-08-17T10:54:39.1632562 Tags for minecraft:enchantment mod id ars_nouveau e654e32b0c3eb36d0912b1f29ad16fa0429c826f data/minecraft/tags/enchantment/non_treasure.json e654e32b0c3eb36d0912b1f29ad16fa0429c826f data/minecraft/tags/enchantment/tradeable.json diff --git a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 index a315128aed..0f143279e2 100644 --- a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 +++ b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 @@ -1,4 +1,4 @@ -// 1.21 2024-07-14T19:09:57.1955072 Ars Nouveau Caster Tomes Datagen +// 1.21.1 2024-08-17T10:54:39.1697774 Ars Nouveau Caster Tomes Datagen ab9cf50e4958592dcee6f5dae6d6bad2e7fe08ab data/ars_nouveau/recipe/tomes/alex_tome.json dae41a867bde9258624fe4676128e8140f2e7fe4 data/ars_nouveau/recipe/tomes/arachne_tome.json 71e004bfa5837d293c6ee00dd9fd99493b9b9aba data/ars_nouveau/recipe/tomes/aurellia_tome.json diff --git a/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 b/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 index 856ae18868..533527b937 100644 --- a/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 +++ b/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 @@ -1,4 +1,4 @@ -// 1.21 2024-07-05T22:41:47.5386059 Tags for minecraft:entity_type mod id ars_nouveau +// 1.21.1 2024-08-17T10:54:39.1833046 Tags for minecraft:entity_type mod id ars_nouveau 4d0235b95823f5d315aae7e9f9e484cbde8294a0 data/ars_nouveau/tags/entity_type/animal_summon_blacklist.json a958530eef4b0d5ac2f1c7bd552b60e23cb66d9a data/ars_nouveau/tags/entity_type/an_hostile.json 290c285b1e334d322b8d070b2c6a071114b1d70c data/ars_nouveau/tags/entity_type/berry_blacklist.json diff --git a/src/generated/resources/.cache/d2032e9832fa171affe4a9c0c99fb97f183ff8a6 b/src/generated/resources/.cache/d2032e9832fa171affe4a9c0c99fb97f183ff8a6 index 140b46b943..a0b4546b67 100644 --- a/src/generated/resources/.cache/d2032e9832fa171affe4a9c0c99fb97f183ff8a6 +++ b/src/generated/resources/.cache/d2032e9832fa171affe4a9c0c99fb97f183ff8a6 @@ -1,2 +1,2 @@ -// 1.21 2024-07-05T22:41:47.5316058 atlases generator for ars_nouveau +// 1.21.1 2024-08-17T10:54:39.172785 atlases generator for ars_nouveau 0824a6d8558f29057b8af23a64a6dfa5da2ca88b assets/minecraft/atlases/chests.json diff --git a/src/generated/resources/.cache/e0d3d0b8d9c807675613821fa865a35f707cd83f b/src/generated/resources/.cache/e0d3d0b8d9c807675613821fa865a35f707cd83f index d3c359ae55..8f4ff4d14b 100644 --- a/src/generated/resources/.cache/e0d3d0b8d9c807675613821fa865a35f707cd83f +++ b/src/generated/resources/.cache/e0d3d0b8d9c807675613821fa865a35f707cd83f @@ -1,2 +1,2 @@ -// 1.21 2024-07-05T22:41:47.5526451 Data Maps +// 1.21.1 2024-08-17T10:54:39.2021298 Data Maps 835362efe6b3a85abe6e05e01dcb8d34823e18a0 data/neoforge/data_maps/item/compostables.json diff --git a/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 b/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 index 290581aadd..9b39f844f2 100644 --- a/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 +++ b/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 @@ -1,4 +1,4 @@ -// 1.21 2024-08-07T20:47:22.7006199 Apparatus +// 1.21.1 2024-08-17T10:54:39.185609 Apparatus adc3e3b582ab4d1fd6f29537bddaaecb9eaa0c2d data/ars_nouveau/recipe/alchemists_crown.json 9a7fefa487b159935c1f620dc9516a6600fb0d4b data/ars_nouveau/recipe/amulet_of_mana_boost.json a653f866167b0fd7d0f7ded2166d45a2ff104d0d data/ars_nouveau/recipe/amulet_of_mana_regen.json diff --git a/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 b/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 index 0a4e3dce46..b4b3bfac74 100644 --- a/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 +++ b/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 @@ -1,4 +1,4 @@ -// 1.21 2024-08-02T14:51:11.8592968 Advancements +// 1.21.1 2024-08-17T10:54:39.2171764 Advancements 48dd44d88536431cef54a84d4a7dce06d6567a5d data/ars_nouveau/advancement/alteration_table.json da10d6cfc3154e84e349a4f51c6cb4b1bdd9cb97 data/ars_nouveau/advancement/amethyst_golem_charm.json 576e3c90dbff03f0668db9bce1d6d88ed511e672 data/ars_nouveau/advancement/apprentice_spell_book.json diff --git a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 index 85d591e8c7..f0b0417482 100644 --- a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 +++ b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 @@ -1,4 +1,4 @@ -// 1.21 2024-07-14T12:08:42.9054421 Patchouli +// 1.21.1 2024-08-17T10:54:39.1971324 Patchouli 2ec536fea831588201432d61d70af61385882054 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/alteration_table.json a82f4fc73946d228b1e3f5e03d0ecef46f33cdfb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/applying_perks.json 8ce1d8e886b45066bc5c1d9d8e87bdabbb27ae27 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor.json diff --git a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 index ce4ba51ccf..cd25d6bd5e 100644 --- a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 +++ b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 @@ -1,4 +1,4 @@ -// 1.21 2024-08-01T23:52:13.9443715 AN tags +// 1.21.1 2024-08-17T10:54:39.1926117 AN tags 939cde8f97e4e8d7ea8445415522f703b2b927d4 data/ars_nouveau/tags/block/an_decorative.json de95bc21249101b079255a1a00274f60d55e0602 data/ars_nouveau/tags/block/blazing_logs.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/block/break_blacklist.json diff --git a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c index 2bab514f83..7dc1675e30 100644 --- a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c +++ b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c @@ -1,4 +1,4 @@ -// 1.21 2024-08-07T20:42:54.1489715 Glyph Recipes +// 1.21.1 2024-08-17T10:54:39.1642564 Glyph Recipes 231d9f126c606465601e36e83948dda99a508834 data/ars_nouveau/recipe/glyph_accelerate.json dbad772acd31382cfcf19c7f276da5f91354dfcf data/ars_nouveau/recipe/glyph_amplify.json 1a8499b67d1ce8614ef1d420106d32d27567eeb9 data/ars_nouveau/recipe/glyph_animate_block.json diff --git a/src/generated/resources/.cache/f49682cfc17456297bb895b136258055d85afc0c b/src/generated/resources/.cache/f49682cfc17456297bb895b136258055d85afc0c index f0a192b806..58165ae490 100644 --- a/src/generated/resources/.cache/f49682cfc17456297bb895b136258055d85afc0c +++ b/src/generated/resources/.cache/f49682cfc17456297bb895b136258055d85afc0c @@ -1,4 +1,4 @@ -// 1.21 2024-08-08T19:04:13.6142678 ArsNouveau: Json Datagen +// 1.21.1 2024-08-17T10:54:39.2031315 ArsNouveau: Json Datagen e59d0832c1d168df4772338fe24485c4b6b94723 data/ars_nouveau/recipe/dye_apprentice_spell_book.json d89b9456df55cd4bd1c30fa9fa253ac31fc7bf37 data/ars_nouveau/recipe/dye_arcanist_boots.json 9e0bcbe43d8ea6f0c1d354eb28878c8053ebe006 data/ars_nouveau/recipe/dye_arcanist_hood.json diff --git a/src/generated/resources/data/c/tags/item/foods.json b/src/generated/resources/data/c/tags/item/foods.json new file mode 100644 index 0000000000..5322e55c1e --- /dev/null +++ b/src/generated/resources/data/c/tags/item/foods.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#ars_nouveau:magic_food" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/c/tags/item/foods/berry.json b/src/generated/resources/data/c/tags/item/foods/berry.json new file mode 100644 index 0000000000..831ed72d3e --- /dev/null +++ b/src/generated/resources/data/c/tags/item/foods/berry.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ars_nouveau:sourceberry_bush" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/c/tags/item/foods/fruit.json b/src/generated/resources/data/c/tags/item/foods/fruit.json new file mode 100644 index 0000000000..331d7442e1 --- /dev/null +++ b/src/generated/resources/data/c/tags/item/foods/fruit.json @@ -0,0 +1,8 @@ +{ + "values": [ + "ars_nouveau:frostaya_pod", + "ars_nouveau:bombegranate_pod", + "ars_nouveau:mendosteen_pod", + "ars_nouveau:bastion_pod" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/c/tags/item/tools/bow.json b/src/generated/resources/data/c/tags/item/tools/bow.json new file mode 100644 index 0000000000..4e42b9fd0d --- /dev/null +++ b/src/generated/resources/data/c/tags/item/tools/bow.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ars_nouveau:spell_bow" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/c/tags/item/tools/crossbow.json b/src/generated/resources/data/c/tags/item/tools/crossbow.json new file mode 100644 index 0000000000..921ae0cd4f --- /dev/null +++ b/src/generated/resources/data/c/tags/item/tools/crossbow.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ars_nouveau:spell_crossbow" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/c/tags/item/tools/ranged_weapon.json b/src/generated/resources/data/c/tags/item/tools/ranged_weapon.json new file mode 100644 index 0000000000..0777bae142 --- /dev/null +++ b/src/generated/resources/data/c/tags/item/tools/ranged_weapon.json @@ -0,0 +1,6 @@ +{ + "values": [ + "ars_nouveau:spell_bow", + "ars_nouveau:spell_crossbow" + ] +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java index acbab50570..35758d434b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java @@ -7,6 +7,7 @@ import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.level.ServerPlayerGameMode; import net.minecraft.tags.BlockTags; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; @@ -16,7 +17,9 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameType; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.GameMasterBlock; +import net.minecraft.world.level.block.ObserverBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; @@ -26,6 +29,7 @@ import net.neoforged.neoforge.common.UsernameCache; import net.neoforged.neoforge.common.util.FakePlayer; import net.neoforged.neoforge.common.util.FakePlayerFactory; +import net.neoforged.neoforge.event.EventHooks; import net.neoforged.neoforge.event.level.BlockEvent; import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.ItemHandlerHelper; @@ -315,69 +319,84 @@ public static void updateObservers(Level level, BlockPos pos ){ * @param source The UUID of the breaking player. * @return If the block was successfully broken. */ - public static boolean breakExtraBlock(ServerLevel world, BlockPos pos, ItemStack mainhand, @Nullable UUID source, boolean bypassToolCheck) { - BlockState blockstate = world.getBlockState(pos); + public static boolean breakExtraBlock(ServerLevel level, BlockPos pos, ItemStack mainhand, @Nullable UUID source, boolean bypassTool) { + BlockState state = level.getBlockState(pos); FakePlayer player; if (source != null) { - String lastKnownUsername = UsernameCache.getLastKnownUsername(source); - player = FakePlayerFactory.get(world, lastKnownUsername != null ? new GameProfile(source, lastKnownUsername) : ANFakePlayer.PROFILE); - Player realPlayer = world.getPlayerByUUID(source); - if (realPlayer != null) player.setPos(realPlayer.position()); - } else player = FakePlayerFactory.getMinecraft(world); + player = FakePlayerFactory.get(level, new GameProfile(source, UsernameCache.getLastKnownUsername(source))); + Player realPlayer = level.getPlayerByUUID(source); + if (realPlayer != null) { + // Move the fakeplayer to the position of the real player, if one is known + player.setPos(realPlayer.position()); + } + } + else { + player = FakePlayerFactory.getMinecraft(level); + } + player.getInventory().items.set(player.getInventory().selected, mainhand); - //player.setPos(pos.getX(), pos.getY(), pos.getZ()); - if (blockstate.getDestroySpeed(world, pos) < 0 || (!blockstate.canHarvestBlock(world, pos, player) && !bypassToolCheck)){ + if (!bypassTool && (state.getDestroySpeed(level, pos) < 0 || !state.canHarvestBlock(level, pos, player ))) { return false; } GameType type = player.getAbilities().instabuild ? GameType.CREATIVE : GameType.SURVIVAL; - boolean canceled = CommonHooks.fireBlockBreak(world, type, player, pos, blockstate).isCanceled(); - if (canceled) { + BlockEvent.BreakEvent exp = CommonHooks.fireBlockBreak(level, type, player, pos, state); + if (exp.isCanceled()) { return false; } - BlockEntity tileentity = world.getBlockEntity(pos); - Block block = blockstate.getBlock(); - if ((block instanceof CommandBlock || block instanceof StructureBlock || block instanceof JigsawBlock) && !player.canUseGameMasterBlocks()) { - world.sendBlockUpdated(pos, blockstate, blockstate, 3); - return false; - } else if (player.blockActionRestricted(world, pos, type)) { - return false; - } else { - if (player.getAbilities().instabuild) { - removeBlock(world, player, pos, false); - return true; - } else { - ItemStack copyMain = mainhand.copy(); - boolean canHarvest = blockstate.canHarvestBlock(world, pos, player) || bypassToolCheck; - mainhand.mineBlock(world, blockstate, pos, player); - if (mainhand.isEmpty() && !copyMain.isEmpty()){ - net.neoforged.neoforge.event.EventHooks.onPlayerDestroyItem(player, copyMain, InteractionHand.MAIN_HAND); + else { + BlockEntity blockEntity = level.getBlockEntity(pos); + Block block = state.getBlock(); + if (block instanceof GameMasterBlock && !player.canUseGameMasterBlocks()) { + level.sendBlockUpdated(pos, state, state, 3); + return false; + } + else if (player.blockActionRestricted(level, pos, type)) { + return false; + } + else { + BlockState newState = block.playerWillDestroy(level, pos, state, player); + if (player.getAbilities().instabuild) { + removeBlock(level, player, pos, newState, false); + return true; } - boolean removed = removeBlock(world, player, pos, canHarvest); + else { + ItemStack tool = player.getMainHandItem(); + ItemStack toolCopy = tool.copy(); + boolean canHarvest = bypassTool || newState.canHarvestBlock(level, pos, player); + tool.mineBlock(level, newState, pos, player); + boolean removed = removeBlock(level, player, pos, newState, canHarvest); + + if (canHarvest && removed) { + block.playerDestroy(level, player, pos, newState, blockEntity, toolCopy); + } - if (removed && canHarvest) { - block.playerDestroy(world, player, pos, blockstate, tileentity, copyMain); - } + if (tool.isEmpty() && !toolCopy.isEmpty()) { + EventHooks.onPlayerDestroyItem(player, toolCopy, InteractionHand.MAIN_HAND); + } - return true; + return true; + } } } } /** - * Vanilla Copy: - * @param world The world - * @param player The removing player - * @param pos The block location + * Vanilla Copy: {@link ServerPlayerGameMode#removeBlock(BlockPos, BlockState, boolean)} + * + * @param level The world + * @param player The removing player + * @param pos The block location * @param canHarvest If the player can actually harvest this block. * @return If the block was actually removed. */ - public static boolean removeBlock(ServerLevel world, ServerPlayer player, BlockPos pos, boolean canHarvest) { - BlockState state = world.getBlockState(pos); - boolean removed = state.onDestroyedByPlayer(world, pos, player, canHarvest, world.getFluidState(pos)); - if (removed) state.getBlock().destroy(world, pos, state); + public static boolean removeBlock(ServerLevel level, ServerPlayer player, BlockPos pos, BlockState state, boolean canHarvest) { + boolean removed = state.onDestroyedByPlayer(level, pos, player, canHarvest, level.getFluidState(pos)); + if (removed) { + state.getBlock().destroy(level, pos, state); + } return removed; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java index 9a36f78167..68e7b55647 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java @@ -53,9 +53,17 @@ protected void addTags(HolderLookup.@NotNull Provider pProvider) { this.tag(MAGIC_FOOD) .add(ItemsRegistry.SOURCE_BERRY_PIE.get(), ItemsRegistry.SOURCE_BERRY_ROLL.get()); + this.tag(Tags.Items.FOODS).addTag(MAGIC_FOOD); + this.tag(Tags.Items.FOODS_BERRY).add(BlockRegistry.SOURCEBERRY_BUSH.asItem()); + this.tag(Tags.Items.FOODS_FRUIT).add(BlockRegistry.FROSTAYA_POD.asItem(), + BlockRegistry.BOMBEGRANTE_POD.asItem(), + BlockRegistry.MENDOSTEEN_POD.asItem(), + BlockRegistry.BASTION_POD.asItem()); this.tag(ItemTags.create(ArsNouveau.prefix( "whirlisprig/denied_drop"))) .add(Items.DIRT).addTag(Tags.Items.SEEDS); + this.tag(Tags.Items.RANGED_WEAPON_TOOLS).add(ItemsRegistry.SPELL_BOW.get(), ItemsRegistry.SPELL_CROSSBOW.get()); + this.tag(Tags.Items.FENCES).add(BlockRegistry.ARCHWOOD_FENCE.asItem()); this.tag(Tags.Items.FENCES_WOODEN).add(BlockRegistry.ARCHWOOD_FENCE.asItem()); this.tag(Tags.Items.FENCE_GATES).add(BlockRegistry.ARCHWOOD_FENCE_GATE.asItem()); @@ -219,6 +227,8 @@ protected void addTags(HolderLookup.@NotNull Provider pProvider) { BlockRegistry.MENDOSTEEN_POD.asItem() ); + this.tag(Tags.Items.TOOLS_BOW).add(ItemsRegistry.SPELL_BOW.get()); + this.tag(Tags.Items.TOOLS_CROSSBOW).add(ItemsRegistry.SPELL_CROSSBOW.get()); this.tag(ItemTags.BOW_ENCHANTABLE).add(ItemsRegistry.SPELL_BOW.get()); this.tag(ItemTags.CROSSBOW_ENCHANTABLE).add(ItemsRegistry.SPELL_CROSSBOW.get()); this.tag(ItemTags.DURABILITY_ENCHANTABLE).add(ItemsRegistry.ENCHANTERS_SHIELD.get()); From 7730c4346d38999ac31e7da3d6c1a74207843bac Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 17 Aug 2024 11:18:05 -0500 Subject: [PATCH 134/363] Fix warp scroll nullability --- .../common/block/BasicSpellTurret.java | 5 +---- .../arsnouveau/common/block/PortalBlock.java | 2 +- .../common/block/RotatingSpellTurret.java | 1 + .../arsnouveau/common/block/tile/PortalTile.java | 2 +- .../common/compat/PatchouliHandler.java | 12 ++++++++---- .../common/items/StableWarpScroll.java | 9 +++++---- .../arsnouveau/common/items/WarpScroll.java | 11 ++++++----- .../common/items/data/WarpScrollData.java | 16 +++++++++++----- .../arsnouveau/common/ritual/RitualWarp.java | 2 +- .../common/spell/effect/EffectBlink.java | 7 ++++--- 10 files changed, 39 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java index f85e209117..02d4cfaf07 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java @@ -1,10 +1,7 @@ package com.hollingsworth.arsnouveau.common.block; import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; -import com.hollingsworth.arsnouveau.api.spell.AbstractCastMethod; -import com.hollingsworth.arsnouveau.api.spell.ITurretBehavior; -import com.hollingsworth.arsnouveau.api.spell.Spell; -import com.hollingsworth.arsnouveau.api.spell.SpellResolver; +import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.common.block.tile.BasicSpellTurretTile; import com.hollingsworth.arsnouveau.common.block.tile.RotatingTurretTile; import com.hollingsworth.arsnouveau.common.entity.EntityProjectileSpell; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java index cb0fcc7ba8..dc4578c646 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java @@ -153,7 +153,7 @@ public boolean trySpawnHorizontalPortal(Level worldIn, BlockPos stackPos, WarpSc BlockPos.betweenClosed(helper.lowerCorner, helper.lowerCorner.relative(Direction.Axis.X, helper.xSize - 1).relative(Direction.Axis.Z, helper.zSize - 1)).forEach((blockPos) -> { worldIn.setBlock(blockPos, BlockRegistry.PORTAL_BLOCK.defaultBlockState().setValue(PortalBlock.AXIS, Direction.Axis.Y), 18); if (worldIn.getBlockEntity(blockPos) instanceof PortalTile tile) { - tile.warpPos = data.pos(); + tile.warpPos = data.pos().orElse(null); tile.dimID = data.dimension(); tile.rotationVec = data.rotation(); tile.displayName = displayName; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java index c73396a892..82300258a7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RotatingSpellTurret.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.api.spell.AbstractCastMethod; import com.hollingsworth.arsnouveau.api.spell.ITurretBehavior; import com.hollingsworth.arsnouveau.api.spell.SpellResolver; +import com.hollingsworth.arsnouveau.api.spell.SpellStats; import com.hollingsworth.arsnouveau.common.block.tile.RotatingTurretTile; import com.hollingsworth.arsnouveau.common.entity.EntityProjectileSpell; import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java index 974369926a..5ec51f7a33 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java @@ -66,7 +66,7 @@ public void warp(Entity e) { } public void setFromScroll(WarpScrollData scrollData){ - this.warpPos = scrollData.pos(); + this.warpPos = scrollData.pos().orElse(null); this.dimID = scrollData.dimension(); this.rotationVec = scrollData.rotation(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java index ee2993fa1e..2e01283aa8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/compat/PatchouliHandler.java @@ -1,25 +1,29 @@ package com.hollingsworth.arsnouveau.common.compat; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import net.minecraft.client.Minecraft; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.server.level.ServerPlayer; +import vazkii.patchouli.api.PatchouliAPI; +import vazkii.patchouli.client.book.gui.GuiBookEntry; //TODO: reenable patchouli public class PatchouliHandler { public static void openBookGUI(ServerPlayer player) { -// PatchouliAPI.get().openBookGUI(player, ArsNouveau.prefix( "worn_notebook")); + PatchouliAPI.get().openBookGUI(player, ArsNouveau.prefix( "worn_notebook")); } public static void openBookClient(){ -// PatchouliAPI.get().openBookGUI(ForgeRegistries.ITEMS.getKey(ItemsRegistry.WORN_NOTEBOOK.asItem())); + PatchouliAPI.get().openBookGUI(BuiltInRegistries.ITEM.getKey(ItemsRegistry.WORN_NOTEBOOK.asItem())); } public static boolean isPatchouliWorld() { if(!ArsNouveau.patchouliLoaded){ return false; } - return false; -// return Minecraft.getInstance().screen instanceof GuiBookEntry; + return Minecraft.getInstance().screen instanceof GuiBookEntry; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java index c716083c1a..ff9fe0d7a0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java @@ -21,11 +21,12 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Optional; public class StableWarpScroll extends ModItem{ public StableWarpScroll(Item.Properties properties) { - super(properties.stacksTo(1).component(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(null, null, null, true))); + super(properties.stacksTo(1).component(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(true))); } @Override @@ -36,7 +37,7 @@ public boolean onEntityItemUpdate(@NotNull ItemStack stack, @NotNull ItemEntity @Override public @NotNull InteractionResult useOn(UseOnContext context) { if (!context.getLevel().isClientSide) { - WarpScrollData scrollData = context.getItemInHand().getOrDefault(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(null, null, null, true)); + WarpScrollData scrollData = context.getItemInHand().get(DataComponentRegistry.WARP_SCROLL); if(!scrollData.isValid()) return InteractionResult.FAIL; EventQueue.getServerInstance().addEvent(new BuildPortalEvent(context.getLevel(), context.getClickedPos(), context.getPlayer().getDirection().getClockWise(), scrollData)); @@ -50,12 +51,12 @@ public boolean onEntityItemUpdate(@NotNull ItemStack stack, @NotNull ItemEntity if(pUsedHand != InteractionHand.MAIN_HAND) return InteractionResultHolder.success(player.getItemInHand(pUsedHand)); ItemStack stack = player.getItemInHand(InteractionHand.MAIN_HAND); - WarpScrollData data = stack.getOrDefault(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(null, null, null, true)); + WarpScrollData data = stack.get(DataComponentRegistry.WARP_SCROLL); if (!(pLevel instanceof ServerLevel serverLevel)) return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); if (player.isShiftKeyDown() && !data.isValid()) { - stack.set(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(player.blockPosition(), player.getCommandSenderWorld().dimension().location().toString(), player.getRotationVector(), true)); + stack.set(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(Optional.of(player.blockPosition()), player.getCommandSenderWorld().dimension().location().toString(), player.getRotationVector(), true)); player.sendSystemMessage(Component.translatable("ars_nouveau.warp_scroll.recorded")); }else if(player.isShiftKeyDown() && data.isValid()){ player.sendSystemMessage(Component.translatable("ars_nouveau.warp_scroll.already_recorded")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java index 8b1286eb8b..8dc6a53e88 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java @@ -28,10 +28,11 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Optional; public class WarpScroll extends ModItem { public WarpScroll() { - super(ItemsRegistry.defaultItemProperties().component(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(null, null, null, false))); + super(ItemsRegistry.defaultItemProperties().component(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(false))); } @Override @@ -40,7 +41,7 @@ public boolean onEntityItemUpdate(@NotNull ItemStack stack, ItemEntity entity) { return false; String displayName = stack.get(DataComponents.CUSTOM_NAME) != null ? stack.getHoverName().getString() : ""; - WarpScrollData data = stack.getOrDefault(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(null, null, null, false)); + WarpScrollData data = stack.get(DataComponentRegistry.WARP_SCROLL); if (data.isValid() && data.canTeleportWithDim(entity.getCommandSenderWorld().dimension().location().toString()) && SourceUtil.hasSourceNearby(entity.blockPosition(), entity.getCommandSenderWorld(), 10, 9000) @@ -61,7 +62,7 @@ public boolean onEntityItemUpdate(@NotNull ItemStack stack, ItemEntity entity) { @Override public @NotNull InteractionResultHolder use(@NotNull Level world, Player player, @NotNull InteractionHand hand) { ItemStack stack = player.getItemInHand(hand); - WarpScrollData data = stack.getOrDefault(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(null, null, null, false)); + WarpScrollData data = stack.get(DataComponentRegistry.WARP_SCROLL); if (hand == InteractionHand.OFF_HAND) return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); @@ -73,7 +74,7 @@ public boolean onEntityItemUpdate(@NotNull ItemStack stack, ItemEntity entity) { player.sendSystemMessage(Component.translatable("ars_nouveau.warp_scroll.wrong_dim")); return InteractionResultHolder.fail(stack); } - BlockPos pos = data.pos(); + BlockPos pos = data.pos().get(); player.teleportTo(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); Vec2 rotation = data.rotation(); player.setXRot(rotation.x); @@ -87,7 +88,7 @@ public boolean onEntityItemUpdate(@NotNull ItemStack stack, ItemEntity entity) { } if (player.isShiftKeyDown()) { ItemStack newWarpStack = new ItemStack(ItemsRegistry.WARP_SCROLL.get()); - newWarpStack.set(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(player.blockPosition(), player.getCommandSenderWorld().dimension().location().toString(), player.getRotationVector(), false)); + newWarpStack.set(DataComponentRegistry.WARP_SCROLL, new WarpScrollData(Optional.of(player.blockPosition()), player.getCommandSenderWorld().dimension().location().toString(), player.getRotationVector(), false)); boolean didAdd; if (stack.getCount() == 1) { stack = newWarpStack; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java index 46462ad2e2..fb5d9caf4b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java @@ -19,20 +19,25 @@ import javax.annotation.Nullable; import java.util.Objects; +import java.util.Optional; import java.util.function.Consumer; -public record WarpScrollData(BlockPos pos, String dimension, Vec2 rotation, boolean crossDim) implements TooltipProvider { +public record WarpScrollData(Optional pos, String dimension, Vec2 rotation, boolean crossDim) implements TooltipProvider { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - BlockPos.CODEC.fieldOf("pos").forGetter(WarpScrollData::pos), - Codec.STRING.optionalFieldOf("dimension", null).forGetter(WarpScrollData::dimension), + BlockPos.CODEC.optionalFieldOf("pos").forGetter(WarpScrollData::pos), + Codec.STRING.optionalFieldOf("dimension", "").forGetter(WarpScrollData::dimension), ANCodecs.VEC2.fieldOf("rotation").forGetter(WarpScrollData::rotation), Codec.BOOL.optionalFieldOf("crossDim", false).forGetter(WarpScrollData::crossDim) ).apply(instance, WarpScrollData::new)); + public WarpScrollData(boolean crossDim){ + this(Optional.empty(), "", new Vec2(0, 0), crossDim); + } + public static final StreamCodec STREAM_CODEC = CheatSerializer.create(WarpScrollData.CODEC); public WarpScrollData setPos(@Nullable BlockPos pos, @Nullable String dimension) { - return new WarpScrollData(pos, dimension, rotation, crossDim); + return new WarpScrollData(Optional.ofNullable(pos), dimension, rotation, crossDim); } public WarpScrollData setRotation(Vec2 rotation) { @@ -48,7 +53,7 @@ public boolean canTeleportWithDim(Level level){ } public boolean isValid() { - return pos != null && dimension != null && rotation != null; + return pos != null && pos.isPresent() && dimension != null && !dimension.isEmpty() && rotation != null; } @Override @@ -57,6 +62,7 @@ public void addToTooltip(Item.TooltipContext pContext, Consumer pTool pTooltipAdder.accept(Component.translatable("ars_nouveau.warp_scroll.no_location")); return; } + var pos = this.pos.get(); pTooltipAdder.accept(Component.translatable("ars_nouveau.position", pos.getX(), pos.getY(), pos.getZ())); if(crossDim) { String dimId = dimension(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWarp.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWarp.java index f8808d17d6..cab5c4be13 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWarp.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWarp.java @@ -44,7 +44,7 @@ protected void tick() { ItemStack i = getConsumedItems().get(0); WarpScrollData data = i.get(DataComponentRegistry.WARP_SCROLL); - BlockPos b = data.pos(); + BlockPos b = data.pos().orElse(null); for (Entity a : entities) { if (b != null) a.teleportTo(b.getX(), b.getY(), b.getZ()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java index bfed7a01cf..cf4e03e35a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java @@ -77,15 +77,16 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull public static void warpEntity(Entity entity, WarpScrollData warpScrollData){ if (entity == null) return; - + var pos = warpScrollData.pos().get(); if (entity instanceof LivingEntity living){ - EntityTeleportEvent. EnderEntity event = EventHooks.onEnderTeleport(living, warpScrollData.pos().getX(), warpScrollData.pos().getY(), warpScrollData.pos().getZ()); + + EntityTeleportEvent. EnderEntity event = EventHooks.onEnderTeleport(living, pos.getX(), pos.getY(), pos.getZ()); if (event.isCanceled()) return; } ServerLevel dimension = PortalTile.getServerLevel(warpScrollData.dimension(), (ServerLevel) entity.level); if(dimension == null) return; - PortalTile.teleportEntityTo(entity, dimension, warpScrollData.pos(), warpScrollData.rotation()); + PortalTile.teleportEntityTo(entity, dimension, pos, warpScrollData.rotation()); } From 1742c15e0970a6a32f3e007961b70077d01d5ee9 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 17 Aug 2024 11:19:37 -0500 Subject: [PATCH 135/363] Render plain stacks for armor --- .../tile/AlterationTableRenderer.java | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java index 0556bbfadc..114806d666 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java @@ -3,7 +3,6 @@ import com.google.common.collect.Maps; import com.hollingsworth.arsnouveau.api.perk.PerkSlot; import com.hollingsworth.arsnouveau.api.util.PerkUtil; -import com.hollingsworth.arsnouveau.client.ClientInfo; import com.hollingsworth.arsnouveau.client.renderer.item.GenericItemBlockRenderer; import com.hollingsworth.arsnouveau.common.block.AlterationTable; import com.hollingsworth.arsnouveau.common.block.ThreePartBlock; @@ -30,7 +29,6 @@ import net.minecraft.core.component.DataComponents; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.FastColor; -import net.minecraft.util.Mth; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterial; @@ -69,27 +67,27 @@ public void renderArmorStack(AlterationTile tile, PoseStack matrixStack, float t if (!(state.getBlock() instanceof AlterationTable)) return; ItemStack stack = tile.armorStack; - if (stack.getItem() instanceof ArmorItem armorItem) { - // to rotate around a point: scale, point translate, rotate, object translate - matrixStack.scale(0.5f, 0.5f, 0.5f); - matrixStack.translate(-2.1, 3.3, 0); - double yOffset = Mth.smoothstepDerivative((Math.sin((ClientInfo.ticksInGame + ticks) / 20f) + 1f) / 2f) * 0.0625; - if (tile.newPerkTimer >= 0) { - // need zero it out or else it fights the translation we're doing below - yOffset = 0; - float percentage = Mth.abs(tile.newPerkTimer - 20) / 20f; - double smooooooooth = Mth.smoothstep(percentage); - double perkYOffset = 0.625 - (smooooooooth * 0.625); - matrixStack.mulPose(Axis.YP.rotationDegrees((float) (Mth.smoothstep(tile.newPerkTimer / 40f) * 360))); - matrixStack.translate(0, perkYOffset, 0); - } - matrixStack.mulPose(Axis.ZP.rotationDegrees(180F)); - matrixStack.translate(0, yOffset + rotForSlot(armorItem.getEquipmentSlot()), 0); - - this.renderArmorPiece(tile,stack, matrixStack, iRenderTypeBuffer, packedLightIn, getArmorModel(armorItem.getEquipmentSlot())); - } else { +// if (stack.getItem() instanceof ArmorItem armorItem) { +// // to rotate around a point: scale, point translate, rotate, object translate +// matrixStack.scale(0.5f, 0.5f, 0.5f); +// matrixStack.translate(-2.1, 3.3, 0); +// double yOffset = Mth.smoothstepDerivative((Math.sin((ClientInfo.ticksInGame + ticks) / 20f) + 1f) / 2f) * 0.0625; +// if (tile.newPerkTimer >= 0) { +// // need zero it out or else it fights the translation we're doing below +// yOffset = 0; +// float percentage = Mth.abs(tile.newPerkTimer - 20) / 20f; +// double smooooooooth = Mth.smoothstep(percentage); +// double perkYOffset = 0.625 - (smooooooooth * 0.625); +// matrixStack.mulPose(Axis.YP.rotationDegrees((float) (Mth.smoothstep(tile.newPerkTimer / 40f) * 360))); +// matrixStack.translate(0, perkYOffset, 0); +// } +// matrixStack.mulPose(Axis.ZP.rotationDegrees(180F)); +// matrixStack.translate(0, yOffset + rotForSlot(armorItem.getEquipmentSlot()), 0); +// +// this.renderArmorPiece(tile,stack, matrixStack, iRenderTypeBuffer, packedLightIn, getArmorModel(armorItem.getEquipmentSlot())); +// } else { Minecraft.getInstance().getItemRenderer().renderStatic(stack, ItemDisplayContext.FIXED, packedLightIn, packedOverlayIn, matrixStack, iRenderTypeBuffer, tile.getLevel(), (int) tile.getBlockPos().asLong()); - } +// } matrixStack.popPose(); } From db2fb6ae43f65ac159cd65328541e3a107c0e7cf Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 17 Aug 2024 11:31:29 -0500 Subject: [PATCH 136/363] Fix interact --- .../common/spell/effect/EffectInteract.java | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java index 95ab6e3c61..7180250312 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java @@ -15,6 +15,7 @@ import net.minecraft.stats.Stats; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; @@ -24,7 +25,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemUtils; import net.minecraft.world.item.Items; -import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BucketPickup; import net.minecraft.world.level.block.state.BlockState; @@ -133,19 +133,28 @@ public void useOnEntity(Player player, SpellStats spellStats, Entity target) { } } - public void useOnBlock(Player player, SpellStats spellStats, BlockPos pos, BlockState state, Level world, BlockHitResult rayTraceResult) { + public void useOnBlock(Player player, SpellStats spellStats, BlockPos blockpos, BlockState blockstate, Level pLevel, BlockHitResult pHitResult) { + var pPlayer = (ServerPlayer) player; + InteractionHand pHand = spellStats.isSensitive() ? InteractionHand.OFF_HAND : InteractionHand.MAIN_HAND; + ItemStack itemstack = pPlayer.getItemInHand(pHand); + ItemInteractionResult iteminteractionresult = blockstate.useItemOn(pPlayer.getItemInHand(pHand), pLevel, pPlayer, pHand, pHitResult); - if (spellStats.isSensitive()) { - ItemStack item = player.getItemInHand(getHand(player)); - if (item.getItem() instanceof BucketItem bucket) { - handleBucket(item, bucket, player, state, world, pos, rayTraceResult, getHand(player)); - return; + if (itemstack.getItem() instanceof BucketItem bucket) { + handleBucket(itemstack, bucket, player, blockstate, pLevel, blockpos, pHitResult, getHand(player)); + return; + } + + if (iteminteractionresult.consumesAction()) { + CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger(pPlayer, blockpos, itemstack); + } + + if (iteminteractionresult == ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION && pHand == InteractionHand.MAIN_HAND) { + InteractionResult interactionresult = blockstate.useWithoutItem(pLevel, pPlayer, pHitResult); + if (interactionresult.consumesAction()) { + CriteriaTriggers.DEFAULT_BLOCK_USE.trigger(pPlayer, blockpos); } - UseOnContext context = new UseOnContext(player, getHand(player), rayTraceResult); - item.useOn(context); - } else { - state.useItemOn(player.getItemInHand(InteractionHand.MAIN_HAND), world, player, InteractionHand.MAIN_HAND, rayTraceResult); } + } @Override From ab3f7e45a9fdb8469eae0a425c32fb6b5fde0126 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 17 Aug 2024 11:46:35 -0500 Subject: [PATCH 137/363] Fix apparatus particles --- .../tile/AlterationTableRenderer.java | 32 ++++++++++--------- .../block/tile/EnchantingApparatusTile.java | 13 +++++--- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java index 114806d666..6eaa75f817 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java @@ -3,6 +3,7 @@ import com.google.common.collect.Maps; import com.hollingsworth.arsnouveau.api.perk.PerkSlot; import com.hollingsworth.arsnouveau.api.util.PerkUtil; +import com.hollingsworth.arsnouveau.client.ClientInfo; import com.hollingsworth.arsnouveau.client.renderer.item.GenericItemBlockRenderer; import com.hollingsworth.arsnouveau.common.block.AlterationTable; import com.hollingsworth.arsnouveau.common.block.ThreePartBlock; @@ -29,6 +30,7 @@ import net.minecraft.core.component.DataComponents; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.FastColor; +import net.minecraft.util.Mth; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterial; @@ -68,22 +70,22 @@ public void renderArmorStack(AlterationTile tile, PoseStack matrixStack, float t return; ItemStack stack = tile.armorStack; // if (stack.getItem() instanceof ArmorItem armorItem) { -// // to rotate around a point: scale, point translate, rotate, object translate -// matrixStack.scale(0.5f, 0.5f, 0.5f); + // to rotate around a point: scale, point translate, rotate, object translate + matrixStack.scale(0.5f, 0.5f, 0.5f); // matrixStack.translate(-2.1, 3.3, 0); -// double yOffset = Mth.smoothstepDerivative((Math.sin((ClientInfo.ticksInGame + ticks) / 20f) + 1f) / 2f) * 0.0625; -// if (tile.newPerkTimer >= 0) { -// // need zero it out or else it fights the translation we're doing below -// yOffset = 0; -// float percentage = Mth.abs(tile.newPerkTimer - 20) / 20f; -// double smooooooooth = Mth.smoothstep(percentage); -// double perkYOffset = 0.625 - (smooooooooth * 0.625); + double yOffset = Mth.smoothstepDerivative((Math.sin((ClientInfo.ticksInGame + ticks) / 20f) + 1f) / 2f) * 0.0625; + if (tile.newPerkTimer >= 0) { + // need zero it out or else it fights the translation we're doing below + yOffset = 0; + float percentage = Mth.abs(tile.newPerkTimer - 20) / 20f; + double smooooooooth = Mth.smoothstep(percentage); + double perkYOffset = 0.625 - (smooooooooth * 0.625); // matrixStack.mulPose(Axis.YP.rotationDegrees((float) (Mth.smoothstep(tile.newPerkTimer / 40f) * 360))); -// matrixStack.translate(0, perkYOffset, 0); -// } + matrixStack.translate(0, perkYOffset, 0); + } // matrixStack.mulPose(Axis.ZP.rotationDegrees(180F)); -// matrixStack.translate(0, yOffset + rotForSlot(armorItem.getEquipmentSlot()), 0); -// + matrixStack.translate(0, yOffset, 0); + // this.renderArmorPiece(tile,stack, matrixStack, iRenderTypeBuffer, packedLightIn, getArmorModel(armorItem.getEquipmentSlot())); // } else { Minecraft.getInstance().getItemRenderer().renderStatic(stack, ItemDisplayContext.FIXED, packedLightIn, packedOverlayIn, matrixStack, iRenderTypeBuffer, tile.getLevel(), (int) tile.getBlockPos().asLong()); @@ -256,10 +258,10 @@ public void render(AlterationTile animatable, float partialTick, PoseStack stack stack.mulPose(perkQuat); stack.translate(perkTranslate.x, perkTranslate.y + 0.2, perkTranslate.z); - if (!(animatable.armorStack.getItem() instanceof ArmorItem)) { +// if (!(animatable.armorStack.getItem() instanceof ArmorItem)) { stack.scale(0.75f, 0.75f, 0.75f); stack.translate(-1.5, 1.95, 0); - } +// } this.renderArmorStack(animatable, stack, (float) ticks, bufferSource, packedLight, packedOverlay); stack.popPose(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java index 30e642b5c1..dbe646f671 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.api.block.IPedestalMachine; import com.hollingsworth.arsnouveau.api.util.SourceUtil; import com.hollingsworth.arsnouveau.client.particle.*; +import com.hollingsworth.arsnouveau.common.block.ArcanePlatform; import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.crafting.recipes.ApparatusRecipeInput; import com.hollingsworth.arsnouveau.common.crafting.recipes.IEnchantingRecipe; @@ -59,21 +60,23 @@ public void tick() { if (level.isClientSide) { if (this.isCrafting) { Level world = getLevel(); - BlockPos pos = getBlockPos().offset(0, 1, 0); + BlockPos pos = getBlockPos().offset(0, 0, 0); RandomSource rand = world.getRandom(); Vec3 particlePos = new Vec3(pos.getX(), pos.getY(), pos.getZ()).add(0.5, 0, 0.5); particlePos = particlePos.add(ParticleUtil.pointInSphere()); world.addParticle(ParticleLineData.createData(new ParticleColor(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255))), - particlePos.x(), particlePos.y(), particlePos.z(), - pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5); + particlePos.x(), particlePos.y() + 1, particlePos.z(), + pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); for (BlockPos p : pedestalList()) { - if (level.getBlockEntity(p) instanceof ArcanePedestalTile pedestalTile && pedestalTile.getStack() != null && !pedestalTile.getStack().isEmpty()) + if (level.getBlockEntity(p) instanceof ArcanePedestalTile pedestalTile && pedestalTile.getStack() != null && !pedestalTile.getStack().isEmpty()) { + var yOffset = level.getBlockState(p).getBlock() instanceof ArcanePlatform ? 0.6 : 1.3; getLevel().addParticle( GlowParticleData.createData(new ParticleColor(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255))), - p.getX() + 0.5 + ParticleUtil.inRange(-0.2, 0.2), p.getY() + 1.5 + ParticleUtil.inRange(-0.3, 0.3), p.getZ() + 0.5 + ParticleUtil.inRange(-0.2, 0.2), + p.getX() + 0.5 + ParticleUtil.inRange(-0.2, 0.2), p.getY() + yOffset + ParticleUtil.inRange(-0.3, 0.3), p.getZ() + 0.5 + ParticleUtil.inRange(-0.2, 0.2), 0, 0, 0); + } } } From 06106ea8e3f5abdd84a455fae0efcda58ecbf742 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 17 Aug 2024 14:42:25 -0500 Subject: [PATCH 138/363] Fix totem perk and persistent perk data --- .../arsnouveau/api/nbt/PerkData.java | 28 --------- .../arsnouveau/api/perk/IPerk.java | 9 +++ .../arsnouveau/api/perk/Perk.java | 1 + .../arsnouveau/api/util/PerkUtil.java | 10 +++- .../common/block/tile/AlterationTile.java | 15 +++-- .../arsnouveau/common/event/PerkEvents.java | 24 +++++--- .../common/items/data/ArmorPerkHolder.java | 20 ++++--- .../arsnouveau/common/items/data/PerkMap.java | 60 +++++++++++++++++++ .../common/items/data/StackPerkHolder.java | 14 +++-- .../arsnouveau/common/perk/TotemPerk.java | 33 ++-------- .../setup/registry/DataComponentRegistry.java | 2 +- 11 files changed, 129 insertions(+), 87 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/nbt/PerkData.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/PerkMap.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/nbt/PerkData.java b/src/main/java/com/hollingsworth/arsnouveau/api/nbt/PerkData.java deleted file mode 100644 index 0b68323c05..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/api/nbt/PerkData.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.hollingsworth.arsnouveau.api.nbt; - -import com.hollingsworth.arsnouveau.api.perk.IPerk; -import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; -import net.minecraft.nbt.CompoundTag; - -public abstract class PerkData extends AbstractData{ - public IPerkHolder perkHolder; - public IPerk perk; - - public PerkData(IPerkHolder perkHolder, IPerk perk) { - super(perkHolder.getTagForPerk(perk)); - this.perkHolder = perkHolder; - this.perk = perk; - } - - /** - * Call this when the perk data is manipulated in order to save it to the PerkHolder. - */ - public void writePerks(){ - CompoundTag tag = new CompoundTag(); - writeToNBT(tag); - perkHolder.setTagForPerk(perk, tag); - } - - @Override - public void writeToNBT(CompoundTag tag) {} -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerk.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerk.java index 01d26a6b56..54d9d599cc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerk.java @@ -3,6 +3,7 @@ import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EquipmentSlot; @@ -13,6 +14,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.ItemAttributeModifiers; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** @@ -64,6 +66,13 @@ default boolean validForSlot(PerkSlot slot, ItemStack stack, Player player) { return true; } + /** + * Return the initial perk data when this Perk is added to an item for the first time. + */ + default @Nullable CompoundTag getInitTag(){ + return null; + } + ResourceLocation getRegistryName(); default String getName() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/Perk.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/Perk.java index eb9f86ddcb..9e652f0cab 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/Perk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/Perk.java @@ -12,4 +12,5 @@ public Perk(ResourceLocation key) { public ResourceLocation getRegistryName() { return id; } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java index f6153b40be..1453a3f01e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/PerkUtil.java @@ -11,6 +11,7 @@ import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.item.ItemStack; +import oshi.util.tuples.Pair; import javax.annotation.Nullable; import java.util.ArrayList; @@ -80,8 +81,9 @@ public static int countForPerk(IPerk perk, LivingEntity entity){ return maxCount; } - public static @Nullable ArmorPerkHolder getHolderForPerk(IPerk perk, LivingEntity entity){ + public static @Nullable Pair getHolderForPerk(IPerk perk, LivingEntity entity){ ArmorPerkHolder highestHolder = null; + ItemStack selectedStack = null; int maxCount = 0; for(ItemStack stack : entity.getArmorSlots()){ var data = stack.get(DataComponentRegistry.ARMOR_PERKS); @@ -92,9 +94,13 @@ public static int countForPerk(IPerk perk, LivingEntity entity){ if(instance.getPerk() == perk){ maxCount = Math.max(maxCount, instance.getSlot().value()); highestHolder = data; + selectedStack = stack; } } } - return highestHolder; + if(highestHolder == null){ + return null; + } + return new Pair<>(selectedStack, highestHolder); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java index 67f6e833bf..2dbc170de2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlterationTile.java @@ -30,10 +30,7 @@ import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Objects; +import java.util.*; public class AlterationTile extends ModdedTile implements GeoBlockEntity, ITickable { @@ -98,14 +95,20 @@ public void removePerk(Player player) { public void removeArmorStack(Player player){ ArmorPerkHolder perkHolder = PerkUtil.getPerkHolder(armorStack); + Map perkTags = new HashMap<>(); var newHolder = perkHolder.setPerks(new ArrayList<>(perkList.stream().map(i ->{ if(i.getItem() instanceof PerkItem perkItem){ - return perkItem.perk; + var perk = perkItem.perk; + CompoundTag initTag = perk.getInitTag(); + if(initTag != null && perkHolder.getTagForPerk(perk) == null){ + perkTags.put(perk, initTag); + } + return perk; } return null; }).filter(Objects::nonNull).toList())); var copyStack = armorStack.copy(); - copyStack.set(DataComponentRegistry.ARMOR_PERKS, newHolder); + copyStack.set(DataComponentRegistry.ARMOR_PERKS, newHolder.setPerkTags(perkTags)); if(!player.addItem(copyStack)){ level.addFreshEntity(new ItemEntity(level, player.position().x(), player.position().y(), player.position().z(), copyStack)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java index c29b8ecf2e..1fea6aad4d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java @@ -9,9 +9,10 @@ import com.hollingsworth.arsnouveau.api.perk.IPerk; import com.hollingsworth.arsnouveau.api.perk.PerkInstance; import com.hollingsworth.arsnouveau.api.util.PerkUtil; -import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; import com.hollingsworth.arsnouveau.common.perk.TotemPerk; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; @@ -130,19 +131,23 @@ public static void postSpellDamageEvent(final SpellDamageEvent.Post event) { @SubscribeEvent public static void totemEvent(final LivingDeathEvent event) { LivingEntity entity = event.getEntity(); - ArmorPerkHolder holder = PerkUtil.getHolderForPerk(TotemPerk.INSTANCE, entity); + if(!(entity instanceof Player player)) + return; + var holder = PerkUtil.getHolderForPerk(TotemPerk.INSTANCE, entity); if (holder == null) return; - TotemPerk.Data perkData = new TotemPerk.Data(holder); - if (!perkData.isActive()) + CompoundTag tag = holder.getB().getTagForPerk(TotemPerk.INSTANCE); + if (tag == null || !tag.getBoolean("isActive")) { return; + } entity.setHealth(1.0F); entity.removeAllEffects(); entity.addEffect(new MobEffectInstance(MobEffects.REGENERATION, 900, 1)); entity.addEffect(new MobEffectInstance(MobEffects.ABSORPTION, 100, 1)); entity.addEffect(new MobEffectInstance(MobEffects.FIRE_RESISTANCE, 800, 0)); entity.level.broadcastEntityEvent(entity, (byte) 35); - perkData.setActive(false); + tag.putBoolean("isActive", false); + holder.getA().set(DataComponentRegistry.ARMOR_PERKS, holder.getB().setTagForPerk(TotemPerk.INSTANCE, tag)); PortUtil.sendMessage(entity, Component.translatable("ars_nouveau.totem_perk.trigger")); event.setCanceled(true); } @@ -150,11 +155,14 @@ public static void totemEvent(final LivingDeathEvent event) { @SubscribeEvent public static void sleepEvent(final SleepFinishedTimeEvent event) { for (Player p : event.getLevel().players()) { - ArmorPerkHolder holder = PerkUtil.getHolderForPerk(TotemPerk.INSTANCE, p); + var holder = PerkUtil.getHolderForPerk(TotemPerk.INSTANCE, p); if (holder == null) continue; - TotemPerk.Data perkData = new TotemPerk.Data(holder); - perkData.setActive(true); + CompoundTag tag = holder.getB().getTagForPerk(TotemPerk.INSTANCE); + if(tag != null){ + tag.putBoolean("isActive", true); + holder.getA().set(DataComponentRegistry.ARMOR_PERKS, holder.getB().setTagForPerk(TotemPerk.INSTANCE, tag)); + } PortUtil.sendMessage(p, Component.translatable("ars_nouveau.totem_perk.active")); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java index de9d17dd28..581e98db70 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ArmorPerkHolder.java @@ -3,13 +3,9 @@ import com.hollingsworth.arsnouveau.api.perk.IPerk; import com.hollingsworth.arsnouveau.api.perk.PerkSlot; import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; -import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.Util; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; @@ -21,19 +17,21 @@ public class ArmorPerkHolder extends StackPerkHolder { Codec.STRING.fieldOf("color").forGetter(ArmorPerkHolder::getColor), StackPerkHolder.PERK_CODEC.listOf().fieldOf("perks").forGetter(ArmorPerkHolder::getPerks), Codec.INT.fieldOf("tier").forGetter(ArmorPerkHolder::getTier), - StackPerkHolder.PERK_TAG_CODEC.fieldOf("perkTags").forGetter(ArmorPerkHolder::getPerkTags) + PerkMap.CODEC.fieldOf("perkTags").forGetter(ArmorPerkHolder::getPerkTags) ).apply(instance, ArmorPerkHolder::new)); - public static final StreamCodec STREAM_CODEC = CheatSerializer.create(CODEC); - private String color; - public ArmorPerkHolder(String color, List perks, int tier, Map perkTags) { super(perks, tier, perkTags); this.color = color; } + public ArmorPerkHolder(String color, List perks, int tier, PerkMap perkTags) { + super(perks, tier, perkTags); + this.color = color; + } + public ArmorPerkHolder() { this("", new ArrayList<>(), 0, new HashMap<>()); } @@ -69,7 +67,11 @@ public ArmorPerkHolder setTier(int tier) { @Override public ArmorPerkHolder setTagForPerk(IPerk perk, CompoundTag tag) { - return new ArmorPerkHolder(color, getPerks(), getTier(), Util.copyAndPut(getPerkTags(), perk, tag)); + return new ArmorPerkHolder(color, getPerks(), getTier(), getPerkTags().put(perk, tag)); + } + + public ArmorPerkHolder setPerkTags(Map perkTags) { + return new ArmorPerkHolder(color, getPerks(), getTier(), perkTags); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PerkMap.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PerkMap.java new file mode 100644 index 0000000000..c8b985399f --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/PerkMap.java @@ -0,0 +1,60 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import com.google.common.collect.ImmutableMap; +import com.hollingsworth.arsnouveau.api.perk.IPerk; +import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; +import com.hollingsworth.arsnouveau.common.perk.StarbunclePerk; +import com.mojang.serialization.Codec; +import net.minecraft.Util; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; + +import java.util.Map; +import java.util.Objects; + +public record PerkMap(Map map) { + public static Codec CODEC = Codec.unboundedMap(Codec.STRING, CompoundTag.CODEC).xmap((stringMap) ->{ + var builder = ImmutableMap.builder(); + stringMap.forEach((key, value) ->{ + if(key != null) { + var loc = ResourceLocation.tryParse(key); + if(loc == null){ + return; + } + var perk = PerkRegistry.getPerkMap().getOrDefault(loc, StarbunclePerk.INSTANCE); + builder.put(perk, value); + } + }); + return new PerkMap(builder.build()); + }, obj -> { + var builder = ImmutableMap.builder(); + obj.map.forEach((key, value) -> builder.put(key.getRegistryName().toString(), value)); + return builder.build(); + }); + + public CompoundTag getOrDefault(IPerk slot, CompoundTag tag) { + return map.getOrDefault(slot, tag); + } + + public CompoundTag get(IPerk slot) { + return map.get(slot); + } + + public PerkMap put(IPerk slot, CompoundTag tag){ + return new PerkMap(Util.copyAndPut(map, slot, tag)); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PerkMap that = (PerkMap) o; + return Objects.equals(map, that.map); + } + + @Override + public int hashCode() { + return Objects.hashCode(map); + } + +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StackPerkHolder.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StackPerkHolder.java index 4cefe70027..9c88ad63b1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StackPerkHolder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StackPerkHolder.java @@ -23,16 +23,18 @@ public abstract class StackPerkHolder implements IPerkHolder { ResourceLocation.CODEC.fieldOf("perk").forGetter(IPerk::getRegistryName) ).apply(instance, (name) -> PerkRegistry.getPerkMap().getOrDefault(name, StarbunclePerk.INSTANCE))); - public static Codec> PERK_TAG_CODEC = Codec.unboundedMap(PERK_CODEC, CompoundTag.CODEC); - private List perks; private int tier; - private Map perkTags; + private PerkMap perkTags; public StackPerkHolder(List perks, int tier, Map perkTags) { + this(perks, tier, new PerkMap(Map.copyOf(perkTags))); + } + + public StackPerkHolder(List perks, int tier, PerkMap perkTags) { this.perks = List.copyOf(perks); this.tier = tier; - this.perkTags = Map.copyOf(perkTags); + this.perkTags = perkTags; } @Override @@ -44,13 +46,13 @@ public int getTier() { return this.tier; } - protected Map getPerkTags() { + public PerkMap getPerkTags() { return this.perkTags; } @Override public @Nullable CompoundTag getTagForPerk(IPerk perk) { - return this.perkTags.getOrDefault(perk, null); + return this.perkTags.map().getOrDefault(perk, null); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/TotemPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/TotemPerk.java index f8584579da..72221f737d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/TotemPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/TotemPerk.java @@ -1,12 +1,11 @@ package com.hollingsworth.arsnouveau.common.perk; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.nbt.PerkData; -import com.hollingsworth.arsnouveau.api.perk.IPerkHolder; import com.hollingsworth.arsnouveau.api.perk.Perk; import com.hollingsworth.arsnouveau.api.perk.PerkSlot; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; public class TotemPerk extends Perk { public static TotemPerk INSTANCE = new TotemPerk(ArsNouveau.prefix( "thread_undying")); @@ -30,30 +29,10 @@ public String getLangName() { return "Undying"; } - public static class Data extends PerkData{ - private boolean isActive; - public Data(IPerkHolder perkHolder) { - super(perkHolder, INSTANCE); - CompoundTag initTag = getInitTag(); - if(initTag != null) { - // Set to true if the field is missing, because it's the first time to be used. - this.isActive = !initTag.contains("isActive") || initTag.getBoolean("isActive"); - } - } - - public void setActive(boolean active) { - isActive = active; - writePerks(); - } - - public boolean isActive(){ - return isActive; - } - - @Override - public void writeToNBT(CompoundTag tag) { - super.writeToNBT(tag); - tag.putBoolean("isActive", isActive); - } + @Override + public @Nullable CompoundTag getInitTag() { + CompoundTag tag = new CompoundTag(); + tag.putBoolean("isActive", true); + return tag; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java index cb276ef723..4a479164c3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java @@ -21,7 +21,7 @@ public class DataComponentRegistry { public static final DeferredHolder , DataComponentType> VOID_JAR = DATA.register("void_jar", () -> DataComponentType.builder().persistent(VoidJarData.CODEC).networkSynchronized(VoidJarData.STREAM_CODEC).build()); - public static final DeferredHolder , DataComponentType> ARMOR_PERKS = DATA.register("armor_perks", () -> DataComponentType.builder().persistent(ArmorPerkHolder.CODEC).networkSynchronized(ArmorPerkHolder.STREAM_CODEC).build()); + public static final DeferredHolder , DataComponentType> ARMOR_PERKS = DATA.register("armor_perks", () -> DataComponentType.builder().persistent(ArmorPerkHolder.CODEC).build()); public static final DeferredHolder , DataComponentType> DOMINION_WAND = DATA.register("dominion_wand", () -> DataComponentType.builder().persistent(DominionWandData.CODEC).networkSynchronized(DominionWandData.STREAM).build()); From 7cfd7f43aa067035a55e4cb6c9e0f2d260d232a1 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 17 Aug 2024 15:18:08 -0500 Subject: [PATCH 139/363] feat: allow potion spell arrows --- .../arsnouveau/common/items/SpellBow.java | 16 +++++----- .../common/items/data/ContainmentJarData.java | 32 ------------------- .../setup/registry/DataComponentRegistry.java | 1 - 3 files changed, 8 insertions(+), 41 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/ContainmentJarData.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java index b6bc0088b9..4e0fda5cf6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java @@ -102,8 +102,8 @@ public ItemStack findAmmo(Player playerEntity, ItemStack shootable) { } } - public EntitySpellArrow buildSpellArrow(Level worldIn, Player playerentity, AbstractCaster caster, boolean isSpellArrow, ItemStack bowStack) { - EntitySpellArrow spellArrow = new EntitySpellArrow(worldIn, playerentity, ItemStack.EMPTY, bowStack); + public EntitySpellArrow buildSpellArrow(Level worldIn, Player playerentity, AbstractCaster caster, boolean isSpellArrow, ItemStack bowStack, ItemStack arrowStack) { + EntitySpellArrow spellArrow = new EntitySpellArrow(worldIn, playerentity, arrowStack, bowStack); spellArrow.spellResolver = new SpellResolver(new SpellContext(worldIn, caster.getSpell(), playerentity, new PlayerCaster(playerentity), bowStack)).withSilent(true); spellArrow.setColors(caster.getColor()); if (isSpellArrow) @@ -150,17 +150,17 @@ public void releaseUsing(@NotNull ItemStack bowStack, @NotNull Level worldIn, @N List arrows = new ArrayList<>(); SpellResolver resolver = new SpellResolver(new SpellContext(worldIn, caster.modifySpellBeforeCasting(worldIn, entityLiving, InteractionHand.MAIN_HAND, caster.getSpell()), playerentity, new PlayerCaster(playerentity), bowStack)); - if (arrowitem == Items.ARROW && resolver.withSilent(true).canCast(playerentity)) { - abstractarrowentity = buildSpellArrow(worldIn, playerentity, caster, isSpellArrow, bowStack); - resolver.expendMana(); - didCastSpell = true; - } else if (arrowitem instanceof SpellArrow) { + if (arrowitem instanceof SpellArrow) { if (!(resolver.canCast(playerentity))) { return; } else if (resolver.canCast(playerentity)) { resolver.expendMana(); didCastSpell = true; } + }else if (resolver.withSilent(true).canCast(playerentity)) { + abstractarrowentity = buildSpellArrow(worldIn, playerentity, caster, isSpellArrow, bowStack, arrowStack); + resolver.expendMana(); + didCastSpell = true; } arrows.add(abstractarrowentity); if (caster.getSpell().isValid() && didCastSpell) { @@ -170,7 +170,7 @@ public void releaseUsing(@NotNull ItemStack bowStack, @NotNull Level worldIn, @N } for (int i = 0; i < numSplits; i++) { - EntitySpellArrow spellArrow = buildSpellArrow(worldIn, playerentity, caster, isSpellArrow, bowStack); + EntitySpellArrow spellArrow = buildSpellArrow(worldIn, playerentity, caster, isSpellArrow, bowStack, arrowStack); arrows.add(spellArrow); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ContainmentJarData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ContainmentJarData.java deleted file mode 100644 index c21e0d9a3a..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ContainmentJarData.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.hollingsworth.arsnouveau.common.items.data; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.ByteBufCodecs; -import net.minecraft.network.codec.StreamCodec; - -import java.util.Objects; - -public record ContainmentJarData(CompoundTag entityTag, CompoundTag extraDataTag){ - public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - CompoundTag.CODEC.fieldOf("entityTag").forGetter(ContainmentJarData::entityTag), - CompoundTag.CODEC.fieldOf("extraDataTag").forGetter(ContainmentJarData::extraDataTag) - ).apply(instance, ContainmentJarData::new)); - - public static StreamCodec STREAM_CODEC = StreamCodec.composite(ByteBufCodecs.COMPOUND_TAG, ContainmentJarData::entityTag, ByteBufCodecs.COMPOUND_TAG, ContainmentJarData::extraDataTag, ContainmentJarData::new); - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ContainmentJarData that = (ContainmentJarData) o; - return Objects.equals(entityTag, that.entityTag) && Objects.equals(extraDataTag, that.extraDataTag); - } - - @Override - public int hashCode() { - return Objects.hash(entityTag, extraDataTag); - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java index 4a479164c3..9372c3bc52 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java @@ -53,5 +53,4 @@ public class DataComponentRegistry { public static final DeferredHolder, DataComponentType> POTION_JAR = DATA.register("potion_jar", () -> DataComponentType.builder().persistent(PotionJarData.CODEC).networkSynchronized(PotionJarData.STREAM).build()); - public static final DeferredHolder, DataComponentType> CONTAINMENT_JAR = DATA.register("containment_jar", () -> DataComponentType.builder().persistent(ContainmentJarData.CODEC).networkSynchronized(ContainmentJarData.STREAM_CODEC).build()); } From f0c67280b0aae5caba7341fc562be8a53e884c75 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 17 Aug 2024 15:22:00 -0500 Subject: [PATCH 140/363] Dont jump when flying, spectator, or swimming --- .../arsnouveau/common/items/curios/JumpingRing.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/JumpingRing.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/JumpingRing.java index 275e477795..4acc69b25f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/JumpingRing.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/curios/JumpingRing.java @@ -27,6 +27,9 @@ public static void doJump(Player player){ if(manaCap == null || (manaCap.getCurrentMana() < Config.JUMP_RING_COST.get() && !player.isCreative())){ return; } + if(player.isSpectator() || player.abilities.flying || player.isSwimming()){ + return; + } manaCap.removeMana(Config.JUMP_RING_COST.get()); LivingAccessor accessor = (LivingAccessor) player; double d0 = (double)accessor.callGetJumpPower() + player.getJumpBoostPower() + 0.1f; From 93a2098565b72ce39bc774b38c2432c3d24f9dbf Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 17 Aug 2024 15:26:03 -0500 Subject: [PATCH 141/363] 5.0.8 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 74ea11bb39..9722c285a6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.0.7 +mod_version=5.0.8 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From b2e80d3e582cd65c17df558dbba33a74bc5304ae Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 21 Aug 2024 20:27:57 -0500 Subject: [PATCH 142/363] remove unused functions --- .../client/gui/buttons/ANButton.java | 21 ----------- .../client/gui/buttons/GuiImageButton.java | 5 --- .../gui/utils/TintedVertexConsumer.java | 11 ------ .../advancement/ANAdvancementBuilder.java | 19 ++-------- .../arsnouveau/common/network/Networking.java | 6 ---- .../arsnouveau/setup/config/ANModConfig.java | 36 ------------------- 6 files changed, 2 insertions(+), 96 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/setup/config/ANModConfig.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ANButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ANButton.java index bdbf46e12f..c08b6de307 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ANButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/ANButton.java @@ -17,27 +17,6 @@ public ANButton(int x, int y, int w, int h, OnPress onPress) { this(x, y, w, h, Component.empty(), onPress); } - public void setX(int i) { - x = i; - } - - public void setY(int i) { - y = i; - } - - public int getX() { - return x; - } - - public int getY() { - return y; - } - - public void setPosition(int x, int y) { - this.x = x; - this.y = y; - } - @Override public void getTooltip(List tooltip) {} } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiImageButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiImageButton.java index ff3c45bc71..897c19ad13 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiImageButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GuiImageButton.java @@ -59,9 +59,4 @@ public void playDownSound(SoundManager pHandler) { return; super.playDownSound(pHandler); } - - public void setPosition(int pX, int pY) { - this.x = pX; - this.y = pY; - } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/TintedVertexConsumer.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/TintedVertexConsumer.java index 86eca96385..95eeda0e79 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/TintedVertexConsumer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/TintedVertexConsumer.java @@ -58,15 +58,4 @@ public VertexConsumer setNormal(float x, float y, float z) { return wrapped.setNormal(x, y, z); } - -// @Override -// public void defaultColor(int r, int g, int b, int a) { -// wrapped.defaultColor(r, g, b, a); -// } -// -// @Override -// public void unsetDefaultColor() { -// wrapped.unsetDefaultColor(); -// } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java index 4abd57dfd7..058bcf0862 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/advancement/ANAdvancementBuilder.java @@ -10,17 +10,17 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; +import net.neoforged.neoforge.common.extensions.IAdvancementBuilderExtension; import javax.annotation.Nullable; import java.util.Map; import java.util.Optional; import java.util.function.Consumer; -import java.util.function.Function; /** * Copied from Advancements.Builder with extensions to reduce copy pasta */ -public class ANAdvancementBuilder implements net.neoforged.neoforge.common.extensions.IAdvancementBuilderExtension { +public class ANAdvancementBuilder implements IAdvancementBuilderExtension { @Nullable private ResourceLocation parentId; @Nullable @@ -138,21 +138,6 @@ public MutableComponent getComponent(String type) { return Component.translatable(modid + ".adv." + type + "." + fileKey); } - /** - * Tries to resolve the parent of this advancement, if possible. Returns true on success. - */ - public boolean canBuild(Function pParentLookup) { - if (this.parentId == null) { - return true; - } else { - if (this.parent == null) { - this.parent = pParentLookup.apply(this.parentId); - } - - return this.parent != null; - } - } - public Advancement build() { if (this.requirements == null) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java index 6d736097c6..39be1672c2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java @@ -18,12 +18,6 @@ public class Networking { - private static int ID = 0; - - public static int nextID() { - return ID++; - } - public static void register(final RegisterPayloadHandlersEvent event) { // Sets the current network version final PayloadRegistrar reg = event.registrar("1"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ANModConfig.java b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ANModConfig.java deleted file mode 100644 index 3e3efb2f3d..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ANModConfig.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.hollingsworth.arsnouveau.setup.config; - -// -//public class ANModConfig extends ModConfig { -// private static final ANConfigFileTypeHandler AN_TOML = new ANConfigFileTypeHandler(); -// -// public ANModConfig(ModConfig.Type type, IConfigSpec iConfigSpec, ModContainer container, String fileName) { -// super(type, iConfigSpec, container, fileName + ".toml"); -// -// } -//// @Override -//// public ConfigFileTypeHandler getHandler() { -//// return AN_TOML; -//// } -// -// private static class ANConfigFileTypeHandler extends ConfigFileTypeHandler { -// -// private static Path getPath(Path configBasePath) { -// //Intercept server config path reading for ArsNouveau configs and reroute it to the normal config directory -// if (configBasePath.endsWith("serverconfig")) { -// return FMLPaths.CONFIGDIR.get(); -// } -// return configBasePath; -// } -// -// @Override -// public Function reader(Path configBasePath) { -// return super.reader(getPath(configBasePath)); -// } -// -//// @Override -//// public void unload(Path configBasePath, ModConfig config) { -//// super.unload(getPath(configBasePath), config); -//// } -// } -//} From 9746d5c9b7a3bdf85a0dae11345f0437915b7d0d Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 21 Aug 2024 20:40:59 -0500 Subject: [PATCH 143/363] Fix display case --- .../arsnouveau/common/block/tile/ItemDetectorTile.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java index 3222ee181b..d844c7da94 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ItemDetectorTile.java @@ -121,7 +121,7 @@ public void setFilterStack(ItemStack stack){ @Override public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable LivingEntity storedEntity, Player playerEntity) { if(storedPos != null){ - if(level.getBlockEntity(storedPos) == null || level.getCapability(Capabilities.ItemHandler.BLOCK, connectedPos, null) == null){ + if(level.getBlockEntity(storedPos) == null || level.getCapability(Capabilities.ItemHandler.BLOCK, storedPos, null) == null){ return; } if(BlockUtil.distanceFrom(storedPos, worldPosition) > 30){ From 40c680c407f1ebacb1dd23ecac02482ee6cc3384 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 21 Aug 2024 20:57:50 -0500 Subject: [PATCH 144/363] Make inventory normal inv cap --- .../java/com/hollingsworth/arsnouveau/api/util/InvUtil.java | 2 +- .../arsnouveau/setup/registry/CapabilityRegistry.java | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java index 3062807dd1..673f8a82c8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java @@ -29,7 +29,7 @@ public static List adjacentInventories(Level level, Block if (adjacentInvTile == null || adjacentInvTile.isRemoved()) continue; - IItemHandler handler = level.getCapability(Capabilities.ItemHandler.BLOCK, relativePos, d); + IItemHandler handler = level.getCapability(Capabilities.ItemHandler.BLOCK, relativePos, level.getBlockState(relativePos), adjacentInvTile, d); if(handler == null) continue; inventories.add(new FilterableItemHandler(handler, filtersOnTile(adjacentInvTile))); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java index efad042433..58fb264977 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java @@ -5,19 +5,16 @@ import com.hollingsworth.arsnouveau.common.capability.ANPlayerDataCap; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; import com.hollingsworth.arsnouveau.common.capability.ManaCap; -import net.minecraft.core.Direction; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.capabilities.BlockCapability; import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.capabilities.EntityCapability; import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; -import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.wrapper.InvWrapper; import java.util.List; @@ -27,7 +24,6 @@ public class CapabilityRegistry { public static final EntityCapability MANA_CAPABILITY = EntityCapability.createVoid(ArsNouveau.prefix("mana"), ManaCap.class); public static final EntityCapability PLAYER_DATA_CAP = EntityCapability.createVoid(ArsNouveau.prefix("player_data"), ANPlayerDataCap.class); - public static final BlockCapability LECTERN_CAP = BlockCapability.create(ArsNouveau.prefix("lectern_handler"), IItemHandler.class, Direction.class); /** * Get the {@link IManaCap} from the specified entity. * @@ -65,7 +61,7 @@ public static void registerCapabilities(RegisterCapabilitiesEvent event) { event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, container.get(), (c, side) -> new InvWrapper(c)); } - event.registerBlockEntity(LECTERN_CAP, BlockRegistry.CRAFTING_LECTERN_TILE.get(), (c, side) -> c.getCapability(c, side)); + event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, BlockRegistry.CRAFTING_LECTERN_TILE.get(), (c, side) -> c.getCapability(c, side)); } From c320a843cdd9deb05712e8b24588eb69a4cd112a Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 21 Aug 2024 21:10:32 -0500 Subject: [PATCH 145/363] Fix GUI scrolling --- .../client/container/AbstractStorageTerminalScreen.java | 2 +- .../arsnouveau/client/gui/book/GuiSpellBook.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java index f0863b08f6..296f7496bc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java @@ -542,7 +542,7 @@ public boolean mouseScrolled(double p_mouseScrolled_1_, double p_mouseScrolled_3 return false; } else { int i = (itemsSorted.size() + 9 - 1) / 9 - 5; - this.currentScroll = (float)(this.currentScroll - p_mouseScrolled_5_ / i); + this.currentScroll = (float)(this.currentScroll + scrollY / i); this.currentScroll = Mth.clamp(this.currentScroll, 0.0F, 1.0F); this.scrollTo(this.currentScroll); return true; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index 71b2e8fcdf..cdefc52cb9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -368,10 +368,10 @@ public void onPageDec(Button button) { @Override public boolean mouseScrolled(double pMouseX, double pMouseY, double pScrollX, double pScrollY) { SoundManager manager = Minecraft.getInstance().getSoundManager(); - if (pScrollX < 0 && nextButton.active) { + if (pScrollY < 0 && nextButton.active) { onPageIncrease(nextButton); manager.play(SimpleSoundInstance.forUI(SoundEvents.BOOK_PAGE_TURN, 1.0F)); - } else if (pScrollX > 0 && previousButton.active) { + } else if (pScrollY > 0 && previousButton.active) { onPageDec(previousButton); manager.play(SimpleSoundInstance.forUI(SoundEvents.BOOK_PAGE_TURN, 1.0F)); } From 75c1ab6e33db5e4fd36d6daf731303d5a8af6ebd Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 21 Aug 2024 21:50:13 -0500 Subject: [PATCH 146/363] Set itemstack for chimera projectile --- .../arsnouveau/common/entity/EntityChimeraProjectile.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java index 08fd7323b1..7adea94f7e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityChimeraProjectile.java @@ -11,6 +11,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; import software.bernie.geckolib.animatable.GeoEntity; @@ -41,12 +42,12 @@ public void tick() { @Override protected ItemStack getPickupItem() { - return ItemStack.EMPTY; + return new ItemStack(Items.ARROW); } @Override protected ItemStack getDefaultPickupItem() { - return ItemStack.EMPTY; + return new ItemStack(Items.ARROW); } @Override From ec5e023bd6454d775f13cf4081b40e8d28e9b925 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 21 Aug 2024 22:03:28 -0500 Subject: [PATCH 147/363] Fix selected button, scrollable glyph craft --- .../client/gui/book/GlyphUnlockMenu.java | 17 +++++++++++++++++ .../client/gui/buttons/SelectableButton.java | 4 +++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java index a233b8a2c4..33b1ec85ae 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java @@ -26,10 +26,13 @@ import net.minecraft.client.gui.screens.inventory.tooltip.DefaultTooltipPositioner; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.client.sounds.SoundManager; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; +import net.minecraft.sounds.SoundEvents; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeHolder; @@ -139,6 +142,20 @@ public void init() { } } + @Override + public boolean mouseScrolled(double pMouseX, double pMouseY, double pScrollX, double pScrollY) { + SoundManager manager = Minecraft.getInstance().getSoundManager(); + if (pScrollY < 0 && nextButton.active) { + onPageIncrease(nextButton); + manager.play(SimpleSoundInstance.forUI(SoundEvents.BOOK_PAGE_TURN, 1.0F)); + } else if (pScrollY > 0 && previousButton.active) { + onPageDec(previousButton); + manager.play(SimpleSoundInstance.forUI(SoundEvents.BOOK_PAGE_TURN, 1.0F)); + } + + return true; + } + public void setFilter(Filter filter, SelectableButton button, String displayTitle) { displayedGlyphs = allParts; for (SelectableButton b : filterButtons) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/SelectableButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/SelectableButton.java index 54ebed3741..4407e10341 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/SelectableButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/SelectableButton.java @@ -7,15 +7,17 @@ public class SelectableButton extends GuiImageButton { public ResourceLocation secondImage; public boolean isSelected; + public ResourceLocation originalImage; public SelectableButton(int x, int y, int u, int v, int w, int h, int image_width, int image_height, ResourceLocation resource_image, ResourceLocation secondImage, Button.OnPress onPress) { super(x, y, u, v, w, h, image_width, image_height, resource_image.getPath(), onPress); this.secondImage = secondImage; + this.originalImage = resource_image; } @Override protected void renderWidget(GuiGraphics graphics, int pMouseX, int pMouseY, float pPartialTick) { - this.image = isSelected ? secondImage : image; + this.image = isSelected ? secondImage : originalImage; super.renderWidget(graphics, pMouseX, pMouseY, pPartialTick); } } From 3b6653f222eb59d7bcb8cf0c4ecdb12a3e793f84 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 21 Aug 2024 22:33:29 -0500 Subject: [PATCH 148/363] 5.0.9 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 9722c285a6..fc1ca07d97 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.0.8 +mod_version=5.0.9 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 7d912aa5828b40155d42531e95d2cf89ef173d7c Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 24 Aug 2024 11:02:43 -0500 Subject: [PATCH 149/363] Fix brazier relay crash #1394 --- .../arsnouveau/common/block/BrazierRelay.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/BrazierRelay.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/BrazierRelay.java index ecf94f1f69..8f420be160 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/BrazierRelay.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/BrazierRelay.java @@ -7,8 +7,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.BooleanProperty; -import net.minecraft.world.level.block.state.properties.Property; +import net.minecraft.world.level.material.PushReaction; import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.shapes.BooleanOp; import net.minecraft.world.phys.shapes.CollisionContext; @@ -17,6 +16,8 @@ import java.util.stream.Stream; +import static com.hollingsworth.arsnouveau.common.block.RitualBrazierBlock.LIT; + public class BrazierRelay extends TickableModBlock{ public static VoxelShape shape = Stream.of( Block.box(3, 0, 3, 13, 3, 13), @@ -27,10 +28,10 @@ public class BrazierRelay extends TickableModBlock{ ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); public BrazierRelay() { - super(defaultProperties().noOcclusion().lightLevel((b) -> b.getValue(LIT) ? 15 : 0)); + super(defaultProperties().noOcclusion().pushReaction(PushReaction.BLOCK).lightLevel((b) -> b.getValue(LIT) ? 15 : 0)); + registerDefaultState(defaultBlockState().setValue(LIT, false)); } - public static final Property LIT = BooleanProperty.create("lit"); @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { From 0d5a7933db6d33acc2fb2f486f004fc46e237ee0 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 24 Aug 2024 11:43:22 -0500 Subject: [PATCH 150/363] Readd jukebox songs --- .../2851bad206eacbcf07f44fe5df73fe54d649e042 | 4 ++ .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 +- .../assets/ars_nouveau/lang/en_us.json | 6 +- .../ars_nouveau/jukebox_song/aria_biblio.json | 8 +++ .../jukebox_song/firel_the_wild_hunt.json | 8 +++ .../thistle_the_sound_of_glass.json | 8 +++ .../common/datagen/LangDatagen.java | 6 +- .../arsnouveau/common/datagen/ModDatagen.java | 2 +- .../common/datagen/MusicProvider.java | 55 +++++++++++++++++++ .../setup/registry/ItemsRegistry.java | 8 +-- .../setup/registry/JukeboxRegistry.java | 20 +++++++ .../setup/registry/SoundRegistry.java | 1 + .../arsnouveau/setup/reward/Rewards.java | 7 ++- 13 files changed, 123 insertions(+), 14 deletions(-) create mode 100644 src/generated/resources/.cache/2851bad206eacbcf07f44fe5df73fe54d649e042 create mode 100644 src/generated/resources/data/ars_nouveau/jukebox_song/aria_biblio.json create mode 100644 src/generated/resources/data/ars_nouveau/jukebox_song/firel_the_wild_hunt.json create mode 100644 src/generated/resources/data/ars_nouveau/jukebox_song/thistle_the_sound_of_glass.json create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/datagen/MusicProvider.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/setup/registry/JukeboxRegistry.java diff --git a/src/generated/resources/.cache/2851bad206eacbcf07f44fe5df73fe54d649e042 b/src/generated/resources/.cache/2851bad206eacbcf07f44fe5df73fe54d649e042 new file mode 100644 index 0000000000..ad0b8f6729 --- /dev/null +++ b/src/generated/resources/.cache/2851bad206eacbcf07f44fe5df73fe54d649e042 @@ -0,0 +1,4 @@ +// 1.21.1 2024-08-24T11:29:07.3818652 Ars Nouveau's Jukebox Data +7e8e4bde7700db0a53308df777880a129e98b5d0 data/ars_nouveau/jukebox_song/aria_biblio.json +3a76a49e3c264090a26ae2e512fdf36e94a0e382 data/ars_nouveau/jukebox_song/firel_the_wild_hunt.json +8df17e7d75fa4d9822e6b2ed109e2c9f92e874e0 data/ars_nouveau/jukebox_song/thistle_the_sound_of_glass.json diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 195f2df47f..6aaf3018d8 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-08-17T10:54:39.1906122 Languages: en_us for mod: ars_nouveau -ad0ccb9476538b6b03045d6eb71b01ea6b556b71 assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-08-24T11:29:07.3803511 Languages: en_us for mod: ars_nouveau +4bb5aefcf36fd5eb50ef3b74225febfd4d49bd22 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 6f4dc7e636..b4c915f627 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -1264,11 +1264,8 @@ "item.ars_nouveau.mimic_scroll": "Mimic Scroll", "item.ars_nouveau.mundane_belt": "Mundane Belt", "item.ars_nouveau.music_disc_aria_biblio": "Music Disc", - "item.ars_nouveau.music_disc_aria_biblio.desc": "Firel - Aria Biblio", "item.ars_nouveau.music_disc_firel_the_wild_hunt": "Music Disc", - "item.ars_nouveau.music_disc_firel_the_wild_hunt.desc": "Firel - The Wild Hunt", "item.ars_nouveau.music_disc_thistle_the_sound_of_glass": "Music Disc", - "item.ars_nouveau.music_disc_thistle_the_sound_of_glass.desc": "Thistle - The Sound of Glass", "item.ars_nouveau.mythical_clay": "Mythical Clay", "item.ars_nouveau.novice_spell_book": "Novice Spell Book", "item.ars_nouveau.pierce_arrow": "Augment Arrow: Pierce", @@ -1436,6 +1433,9 @@ "item.minecraft.tipped_arrow.effect.spell_damage_potion_strong": "Arrow of Spell Damage", "itemGroup.ars_glyphs": "Ars Nouveau Glyphs", "itemGroup.ars_nouveau": "Ars Nouveau", + "jukebox_song.ars_nouveau.aria_biblio": "Firel - Aria Biblio", + "jukebox_song.ars_nouveau.firel_the_wild_hunt": "Firel - The Wild Hunt", + "jukebox_song.ars_nouveau.thistle_the_sound_of_glass": "Thistle - The Sound of Glass", "key.ars_nouveau.familiar_toggle": "Summon/Dispel Familiar", "key.ars_nouveau.head_curio_hotkey": "Head Curio Menu", "key.ars_nouveau.next_slot": "(Spell Book) Next Slot", diff --git a/src/generated/resources/data/ars_nouveau/jukebox_song/aria_biblio.json b/src/generated/resources/data/ars_nouveau/jukebox_song/aria_biblio.json new file mode 100644 index 0000000000..8cb2a0ee9f --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/jukebox_song/aria_biblio.json @@ -0,0 +1,8 @@ +{ + "comparator_output": 1, + "description": { + "translate": "jukebox_song.ars_nouveau.aria_biblio" + }, + "length_in_seconds": 4800.0, + "sound_event": "ars_nouveau:aria_biblio" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/jukebox_song/firel_the_wild_hunt.json b/src/generated/resources/data/ars_nouveau/jukebox_song/firel_the_wild_hunt.json new file mode 100644 index 0000000000..0523e54823 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/jukebox_song/firel_the_wild_hunt.json @@ -0,0 +1,8 @@ +{ + "comparator_output": 2, + "description": { + "translate": "jukebox_song.ars_nouveau.firel_the_wild_hunt" + }, + "length_in_seconds": 2420.0, + "sound_event": "ars_nouveau:firel_the_wild_hunt" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/jukebox_song/thistle_the_sound_of_glass.json b/src/generated/resources/data/ars_nouveau/jukebox_song/thistle_the_sound_of_glass.json new file mode 100644 index 0000000000..c4d0e0b9dc --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/jukebox_song/thistle_the_sound_of_glass.json @@ -0,0 +1,8 @@ +{ + "comparator_output": 3, + "description": { + "translate": "jukebox_song.ars_nouveau.thistle_the_sound_of_glass" + }, + "length_in_seconds": 3640.0, + "sound_event": "ars_nouveau:thistle_the_sound_of_glass" +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 9decd0d529..3c56dad5bc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -1134,7 +1134,7 @@ protected void addTranslations() { add("block.ars_nouveau.void_prism", "Void Prism"); add("ars_nouveau.page.void_prism", "Destroys any spell projectiles that pass through it."); add("item.ars_nouveau.music_disc_aria_biblio", "Music Disc"); - add("item.ars_nouveau.music_disc_aria_biblio.desc", "Firel - Aria Biblio"); + add("jukebox_song.ars_nouveau.aria_biblio", "Firel - Aria Biblio"); add("item.ars_nouveau.starby_gift", "Starbuncle Gift"); add("ars_nouveau.present.give", "Give this to a friend and they will get bonus items, or open it for yourself!"); add("ars_nouveau.present.from", "A gift from %s"); @@ -1260,9 +1260,9 @@ protected void addTranslations() { add("ars_nouveau.scribes_table.auto_take_disabled", "Auto Take Disabled"); add("ars_nouveau.alert.turret_needs_form", "Spell must have a form."); add("item.ars_nouveau.music_disc_thistle_the_sound_of_glass", "Music Disc"); - add("item.ars_nouveau.music_disc_thistle_the_sound_of_glass.desc", "Thistle - The Sound of Glass"); + add("jukebox_song.ars_nouveau.thistle_the_sound_of_glass", "Thistle - The Sound of Glass"); add("item.ars_nouveau.music_disc_firel_the_wild_hunt", "Music Disc"); - add("item.ars_nouveau.music_disc_firel_the_wild_hunt.desc", "Firel - The Wild Hunt"); + add("jukebox_song.ars_nouveau.firel_the_wild_hunt", "Firel - The Wild Hunt"); add("ars_nouveau.sensor.set_spell", "Sensor will now trigger on this spell only."); add("ars_nouveau.sensor.on_resolve", "Mode: On Resolve"); add("ars_nouveau.sensor.on_cast", "Mode: On Cast"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java index c1aae9528e..2f24e7a701 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java @@ -52,7 +52,7 @@ public static void datagen(GatherDataEvent event) { event.getGenerator().addProvider(event.includeClient(), new AtlasProvider(output, provider, fileHelper)); event.getGenerator().addProvider(event.includeServer(), new EnchantmentProvider(output, provider)); event.getGenerator().addProvider(event.includeServer(), new EnchantmentProvider.EnchantmentTagsProvider(output, provider, fileHelper)); - + event.getGenerator().addProvider(event.includeServer(), new MusicProvider(output, provider)); event.getGenerator().addProvider(event.includeServer(), new DamageTypesProvider(output, provider)); event.getGenerator().addProvider(event.includeServer(), new DamageTypesProvider.DamageTypesTagsProvider(output, provider, fileHelper)); event.getGenerator().addProvider(event.includeServer(), new CompostablesProvider(output, provider)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/MusicProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/MusicProvider.java new file mode 100644 index 0000000000..89e45e3fd0 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/MusicProvider.java @@ -0,0 +1,55 @@ +package com.hollingsworth.arsnouveau.common.datagen; + +import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.setup.registry.JukeboxRegistry; +import com.hollingsworth.arsnouveau.setup.registry.SoundRegistry; +import net.minecraft.Util; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.RegistrySetBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.PackOutput; +import net.minecraft.data.worldgen.BootstrapContext; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.item.JukeboxSong; +import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; +import java.util.concurrent.CompletableFuture; + +public class MusicProvider extends DatapackBuiltinEntriesProvider { + private static final RegistrySetBuilder BUILDER = new RegistrySetBuilder() + .add(Registries.JUKEBOX_SONG, MusicProvider::bootstrap); + + + public static void bootstrap(BootstrapContext ctx) { + register(ctx, JukeboxRegistry.ARIA_BIBLIO, SoundRegistry.ARIA_BIBLIO, 20*240, 1); + register(ctx, JukeboxRegistry.WILD_HUNT, SoundRegistry.WILD_HUNT, 20 * 121, 2); + register(ctx, JukeboxRegistry.SOUND_OF_GLASS, SoundRegistry.SOUND_OF_GLASS, 20 * 182, 3); + } + + public static void register( + BootstrapContext p_350719_, ResourceKey p_350460_, Holder p_350456_, int p_350314_, int p_350919_ + ) { + p_350719_.register( + p_350460_, + new JukeboxSong(p_350456_, Component.translatable(Util.makeDescriptionId("jukebox_song", p_350460_.location())), (float)p_350314_, p_350919_) + ); + + + } + + public MusicProvider(PackOutput output, CompletableFuture registries) { + super(output, registries, BUILDER, Set.of(ArsNouveau.MODID)); + } + + @Override + @NotNull + public String getName() { + return "Ars Nouveau's Jukebox Data"; + } + +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java index caf30909e5..586054a7ed 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java @@ -216,10 +216,10 @@ public int getValue() { public static final ItemRegistryWrapper ALCHEMISTS_CROWN = register(LibItemNames.ALCHEMISTS_CROWN, () -> new AlchemistsCrown(defaultItemProperties().stacksTo(1))); public static final ItemRegistryWrapper SPLASH_LAUNCHER = register(LibItemNames.SPLASH_LAUNCHER, () -> new FlaskCannon.SplashLauncher(defaultItemProperties().stacksTo(1))); public static final ItemRegistryWrapper LINGERING_LAUNCHER = register(LibItemNames.LINGERING_LAUNCHER, () -> new FlaskCannon.LingeringLauncher(defaultItemProperties().stacksTo(1))); - // TODO: restore discs - public static final ItemRegistryWrapper FIREL_DISC = register(LibItemNames.FIREL_DISC, () -> new Item(defaultItemProperties().stacksTo(1).rarity(Rarity.RARE))); - public static final ItemRegistryWrapper SOUND_OF_GLASS = register(LibItemNames.SOUND_OF_GLASS, () -> new Item(defaultItemProperties().stacksTo(1).rarity(Rarity.RARE))); - public static final ItemRegistryWrapper WILD_HUNT = register(LibItemNames.FIREL_WILD_HUNT, () -> new Item(defaultItemProperties().stacksTo(1).rarity(Rarity.RARE))); + + public static final ItemRegistryWrapper FIREL_DISC = register(LibItemNames.FIREL_DISC, () -> new Item(defaultItemProperties().stacksTo(1).rarity(Rarity.RARE).jukeboxPlayable(JukeboxRegistry.ARIA_BIBLIO))); + public static final ItemRegistryWrapper SOUND_OF_GLASS = register(LibItemNames.SOUND_OF_GLASS, () -> new Item(defaultItemProperties().stacksTo(1).rarity(Rarity.RARE).jukeboxPlayable(JukeboxRegistry.SOUND_OF_GLASS))); + public static final ItemRegistryWrapper WILD_HUNT = register(LibItemNames.FIREL_WILD_HUNT, () -> new Item(defaultItemProperties().stacksTo(1).rarity(Rarity.RARE).jukeboxPlayable(JukeboxRegistry.WILD_HUNT))); public static final ItemRegistryWrapper STARBY_GIFY = register(LibItemNames.STARBY_GIFT, () -> new Present(defaultItemProperties().rarity(Rarity.EPIC).component(DataComponentRegistry.PRESENT, new PresentData()))); public static final ItemRegistryWrapper SPELL_CROSSBOW = register(LibItemNames.SPELL_CROSSBOW, () -> new SpellCrossbow(defaultItemProperties().stacksTo(1).component(DataComponentRegistry.SPELL_CASTER, new SpellCaster()))); public static final ItemRegistryWrapper STABLE_WARP_SCROLL = register(LibItemNames.STABLE_WARP_SCROLL, () -> new StableWarpScroll(defaultItemProperties().stacksTo(1))); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/JukeboxRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/JukeboxRegistry.java new file mode 100644 index 0000000000..5e040b6b35 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/JukeboxRegistry.java @@ -0,0 +1,20 @@ +package com.hollingsworth.arsnouveau.setup.registry; + +import com.hollingsworth.arsnouveau.ArsNouveau; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.JukeboxSong; + +public class JukeboxRegistry { + + public static final ResourceKey ARIA_BIBLIO = key("aria_biblio"); + public static final ResourceKey WILD_HUNT = key("firel_the_wild_hunt"); + public static final ResourceKey SOUND_OF_GLASS = key("thistle_the_sound_of_glass"); + + + private static ResourceKey key(String p_345314_) { + return ResourceKey.create(Registries.JUKEBOX_SONG, ArsNouveau.prefix(p_345314_)); + } + + +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java index 35ac077fcf..62adf1bf23 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/SoundRegistry.java @@ -31,6 +31,7 @@ public class SoundRegistry { public static DeferredHolder FIRE_FAMILY = SOUND_REG.register(FIRE_SOUND_LIB, () -> makeSound(FIRE_SOUND_LIB)); public static DeferredHolder ARIA_BIBLIO = SOUND_REG.register("aria_biblio", () -> makeSound("aria_biblio")); public static DeferredHolder WILD_HUNT = SOUND_REG.register("firel_the_wild_hunt", () -> makeSound("firel_the_wild_hunt")); + public static DeferredHolder SOUND_OF_GLASS = SOUND_REG.register("thistle_the_sound_of_glass", () -> makeSound("thistle_the_sound_of_glass")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/reward/Rewards.java b/src/main/java/com/hollingsworth/arsnouveau/setup/reward/Rewards.java index 5c82e713e1..2adf696b86 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/reward/Rewards.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/reward/Rewards.java @@ -6,6 +6,7 @@ import com.google.gson.JsonParser; import net.minecraft.world.item.DyeColor; import net.neoforged.fml.loading.FMLEnvironment; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -26,7 +27,11 @@ public static void init() { JsonArray supporters = object.getAsJsonArray("uuids"); for (JsonElement element : supporters) { String uuid = element.getAsString(); - CONTRIBUTORS.add(UUID.fromString(uuid.trim())); + try { + CONTRIBUTORS.add(UUID.fromString(uuid.trim())); + }catch (Exception e){ + e.printStackTrace(); + } } JsonArray adoptions = object.getAsJsonArray("starbuncleAdoptions"); for (JsonElement element : adoptions) { From 528c3929a2443d88febf5a94b6f435e2e63459a6 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 24 Aug 2024 11:49:39 -0500 Subject: [PATCH 151/363] Fix crash with turrets breaking blocks --- .../arsnouveau/api/util/BlockUtil.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java index 35758d434b..9b58f1376d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java @@ -321,18 +321,18 @@ public static void updateObservers(Level level, BlockPos pos ){ */ public static boolean breakExtraBlock(ServerLevel level, BlockPos pos, ItemStack mainhand, @Nullable UUID source, boolean bypassTool) { BlockState state = level.getBlockState(pos); - FakePlayer player; + FakePlayer player = ANFakePlayer.getPlayer(level); if (source != null) { - player = FakePlayerFactory.get(level, new GameProfile(source, UsernameCache.getLastKnownUsername(source))); - Player realPlayer = level.getPlayerByUUID(source); - if (realPlayer != null) { - // Move the fakeplayer to the position of the real player, if one is known - player.setPos(realPlayer.position()); + var username = UsernameCache.getLastKnownUsername(source); + if(username != null){ + player = FakePlayerFactory.get(level, new GameProfile(source, username)); + Player realPlayer = level.getPlayerByUUID(source); + if (realPlayer != null) { + // Move the fakeplayer to the position of the real player, if one is known + player.setPos(realPlayer.position()); + } } } - else { - player = FakePlayerFactory.getMinecraft(level); - } player.getInventory().items.set(player.getInventory().selected, mainhand); From d81dabbbfc92a2824a5bfe3eea7f2674a8c7aac4 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 24 Aug 2024 11:55:56 -0500 Subject: [PATCH 152/363] Respect capturing not supported #1316 --- .../resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 ++-- .../resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 | 4 ++-- src/generated/resources/assets/ars_nouveau/lang/en_us.json | 1 + .../data/ars_nouveau/tags/entity_type/jar_blacklist.json | 3 ++- .../arsnouveau/common/datagen/EntityTagProvider.java | 4 ++-- .../hollingsworth/arsnouveau/common/datagen/LangDatagen.java | 1 + .../arsnouveau/common/spell/effect/EffectBlink.java | 4 ++++ 7 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 6aaf3018d8..1df139161a 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-08-24T11:29:07.3803511 Languages: en_us for mod: ars_nouveau -4bb5aefcf36fd5eb50ef3b74225febfd4d49bd22 assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-08-24T11:55:28.4361259 Languages: en_us for mod: ars_nouveau +5394c70508e342c35c33750bd806401a7e9c66d8 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 b/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 index 533527b937..3718d86c7c 100644 --- a/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 +++ b/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 @@ -1,4 +1,4 @@ -// 1.21.1 2024-08-17T10:54:39.1833046 Tags for minecraft:entity_type mod id ars_nouveau +// 1.21.1 2024-08-24T11:55:28.4351257 Tags for minecraft:entity_type mod id ars_nouveau 4d0235b95823f5d315aae7e9f9e484cbde8294a0 data/ars_nouveau/tags/entity_type/animal_summon_blacklist.json a958530eef4b0d5ac2f1c7bd552b60e23cb66d9a data/ars_nouveau/tags/entity_type/an_hostile.json 290c285b1e334d322b8d070b2c6a071114b1d70c data/ars_nouveau/tags/entity_type/berry_blacklist.json @@ -6,7 +6,7 @@ a958530eef4b0d5ac2f1c7bd552b60e23cb66d9a data/ars_nouveau/tags/entity_type/an_ho 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_type/disintegration_whitelist.json 29671cfa11d074462c259806e9d60468451e3cdb data/ars_nouveau/tags/entity_type/drygmy_blacklist.json 37c0c70962a460e0c2d62b6dafe0ee563c8773d4 data/ars_nouveau/tags/entity_type/familiar.json -d845fe0d8c60d85668664fdf64a9c87ca2176e4c data/ars_nouveau/tags/entity_type/jar_blacklist.json +626ec463a66bcda15fd17dfe131322f296b2ff38 data/ars_nouveau/tags/entity_type/jar_blacklist.json e00f2931577049b9a4400a87ed9c249373be376c data/ars_nouveau/tags/entity_type/jar_release_blacklist.json 81129e21b3ae9fc2579ae17d4c228b76271a2b4d data/ars_nouveau/tags/entity_type/jar_whitelist.json 6ea663c420f871864a11d18e9448d602520eeff9 data/ars_nouveau/tags/entity_type/lingering_blacklist.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index b4c915f627..96d57af732 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -1226,6 +1226,7 @@ "item.ars_nouveau.caster_tome": "Caster Tome", "item.ars_nouveau.conjuration_essence": "Conjuration Essence", "item.ars_nouveau.creative_spell_book": "Creative Spell Book", + "item.ars_nouveau.debug": "Ars Nouveau Debugger", "item.ars_nouveau.deny_scroll": "Item Scroll: Deny", "item.ars_nouveau.dominion_wand": "Dominion Wand", "item.ars_nouveau.dominion_wand.strict": "Dominion Wand (Strict Mode)", diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_type/jar_blacklist.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/jar_blacklist.json index d291a4d8b4..14b604cff9 100644 --- a/src/generated/resources/data/ars_nouveau/tags/entity_type/jar_blacklist.json +++ b/src/generated/resources/data/ars_nouveau/tags/entity_type/jar_blacklist.json @@ -1,5 +1,6 @@ { "values": [ - "#ars_nouveau:familiar" + "#ars_nouveau:familiar", + "#c:capturing_not_supported" ] } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java index cebb5d9e99..86b61b2d17 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java @@ -2,8 +2,8 @@ import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import com.hollingsworth.arsnouveau.common.lib.EntityTags; +import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; import net.minecraft.data.tags.EntityTypeTagsProvider; @@ -48,7 +48,7 @@ protected void addTags(HolderLookup.Provider pProvider) { this.tag(EntityTags.FAMILIAR).add(ModEntities.ENTITY_FAMILIAR_STARBUNCLE.get(), ModEntities.ENTITY_FAMILIAR_SYLPH.get(), ModEntities.ENTITY_FAMILIAR_WIXIE.get(), ModEntities.ENTITY_FAMILIAR_DRYGMY.get(), ModEntities.ENTITY_FAMILIAR_BOOKWYRM.get()); - this.tag(EntityTags.JAR_BLACKLIST).addTag(EntityTags.FAMILIAR); + this.tag(EntityTags.JAR_BLACKLIST).addTag(EntityTags.FAMILIAR).addTag(Tags.EntityTypes.CAPTURING_NOT_SUPPORTED); this.tag(EntityTags.JAR_WHITELIST) .add(EntityType.ITEM) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 3c56dad5bc..c23ebf600e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -1258,6 +1258,7 @@ protected void addTranslations() { add("mob_jar.dummy", "A player dummy in a jar will attract nearby mobs."); add("ars_nouveau.turret.tooltip", "Can be rotated to face any direction. Use a dominion wand on the turret, and then on the target block."); add("ars_nouveau.scribes_table.auto_take_disabled", "Auto Take Disabled"); + add("item.ars_nouveau.debug", "Ars Nouveau Debugger"); add("ars_nouveau.alert.turret_needs_form", "Spell must have a form."); add("item.ars_nouveau.music_disc_thistle_the_sound_of_glass", "Music Disc"); add("jukebox_song.ars_nouveau.thistle_the_sound_of_glass", "Thistle - The Sound of Glass"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java index cf4e03e35a..b703ce448f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java @@ -27,6 +27,7 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.common.ModConfigSpec; +import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.event.EventHooks; import net.neoforged.neoforge.event.entity.EntityTeleportEvent; import org.jetbrains.annotations.NotNull; @@ -43,6 +44,9 @@ private EffectBlink() { @Override public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { Vec3 vec = safelyGetHitPos(rayTraceResult); + if(rayTraceResult.getEntity().getType().is(Tags.EntityTypes.TELEPORTING_NOT_SUPPORTED)){ + return; + } double distance = GENERIC_INT.get() + AMP_VALUE.get() * spellStats.getAmpMultiplier(); if (spellContext.getCaster() instanceof TileCaster) { From 5190a32028b916c027857863113a6bf95ad8731f Mon Sep 17 00:00:00 2001 From: Jarva <4622609+Jarva@users.noreply.github.com> Date: Sat, 24 Aug 2024 17:57:51 +0100 Subject: [PATCH 153/363] fix: change imbuement tile to use assemble instead of getResultItem (#1393) * fix: change imbuement tile to use assemble instead of getResultItem * fix: use IImbuementRecipe everywhere --- .gitignore | 2 ++ .../arsnouveau/api/imbuement_chamber/IImbuementRecipe.java | 4 ++-- .../arsnouveau/api/registry/ImbuementRecipeRegistry.java | 3 ++- .../arsnouveau/common/block/tile/ImbuementTile.java | 7 ++++--- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 8ef87c4cc3..b7bf68e734 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ server # Files from Forge MDK forge*changelog.txt + +run diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/imbuement_chamber/IImbuementRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/api/imbuement_chamber/IImbuementRecipe.java index cd746145c3..5d394aaf56 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/imbuement_chamber/IImbuementRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/imbuement_chamber/IImbuementRecipe.java @@ -9,11 +9,11 @@ public interface IImbuementRecipe extends Recipe { int getSourceCost(ImbuementTile imbuementTile); default Component getCraftingStartedText(ImbuementTile imbuementTile) { - return Component.translatable("ars_nouveau.imbuement.crafting_started", this.getResultItem(imbuementTile.getLevel().registryAccess()).getHoverName()); + return Component.translatable("ars_nouveau.imbuement.crafting_started", this.assemble(imbuementTile, imbuementTile.getLevel().registryAccess()).getHoverName()); } default Component getCraftingText(ImbuementTile imbuementTile) { - return Component.translatable("ars_nouveau.crafting", this.getResultItem(imbuementTile.getLevel().registryAccess()).getHoverName()); + return Component.translatable("ars_nouveau.crafting", this.assemble(imbuementTile, imbuementTile.getLevel().registryAccess()).getHoverName()); } default Component getCraftingProgressText(ImbuementTile imbuementTile, int progress) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/ImbuementRecipeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/ImbuementRecipeRegistry.java index b481667ba3..69d0c24b36 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/ImbuementRecipeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/ImbuementRecipeRegistry.java @@ -1,8 +1,9 @@ package com.hollingsworth.arsnouveau.api.registry; +import com.hollingsworth.arsnouveau.api.imbuement_chamber.IImbuementRecipe; import com.hollingsworth.arsnouveau.common.block.tile.ImbuementTile; import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; -public class ImbuementRecipeRegistry extends MultiRecipeRegistry { +public class ImbuementRecipeRegistry extends MultiRecipeRegistry { public static ImbuementRecipeRegistry INSTANCE = new ImbuementRecipeRegistry(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java index 4a06ded4f5..9f69bd2690 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.api.block.IPedestalMachine; import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; +import com.hollingsworth.arsnouveau.api.imbuement_chamber.IImbuementRecipe; import com.hollingsworth.arsnouveau.api.registry.ImbuementRecipeRegistry; import com.hollingsworth.arsnouveau.api.source.AbstractSourceMachine; import com.hollingsworth.arsnouveau.api.source.ISpecialSourceProvider; @@ -42,7 +43,7 @@ public class ImbuementTile extends AbstractSourceMachine implements Container, I public ItemStack stack = ItemStack.EMPTY; public ItemEntity entity; public boolean draining; - ImbuementRecipe recipe; + IImbuementRecipe recipe; int backoff; public float frames; boolean hasRecipe; @@ -150,7 +151,7 @@ public void tick() { } if (this.getSource() >= cost && craftTicks <= 0) { - this.setItem(0, recipe.getResultItem(this.level.registryAccess()).copy()); + this.setItem(0, recipe.assemble(this, this.level.registryAccess()).copy()); this.addSource(-cost); ParticleUtil.spawnTouchPacket(level, worldPosition, ParticleColor.defaultParticleColor()); updateBlock(); @@ -289,7 +290,7 @@ public List getNearbyPedestals() { return pedestalList(getBlockPos(), 1, getLevel()); } - public @Nullable RecipeHolder getRecipeNow() { + public @Nullable RecipeHolder getRecipeNow() { return ImbuementRecipeRegistry.INSTANCE.getRecipes().stream().filter(r -> r.value().matches(this, level)).findFirst().orElse(null); } From 57d19348b8f07d522b6e977d379c8d2986928af6 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 24 Aug 2024 12:07:50 -0500 Subject: [PATCH 154/363] Skip temporary tiles during build --- .../arsnouveau/common/event/timed/BuildPortalEvent.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/timed/BuildPortalEvent.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/timed/BuildPortalEvent.java index ebd75e2a4e..e07474272b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/timed/BuildPortalEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/timed/BuildPortalEvent.java @@ -85,8 +85,14 @@ public void tick(boolean serverSide) { BlockPos pos = framePos.get(0); framePos.remove(pos); BlockState bs = level.getBlockState(pos); - if (bs.is(BlockTagProvider.DECORATIVE_AN)) { + if (bs.is(BlockTagProvider.DECORATIVE_AN) || level.getBlockEntity(pos) instanceof TemporaryTile tile && tile.mimicState.is(BlockTagProvider.DECORATIVE_AN)) { tick(true); + if(level.getBlockEntity(pos) instanceof TemporaryTile tile){ + tile.mimicState = BlockRegistry.getBlock(LibBlockNames.SOURCESTONE).defaultBlockState(); + tile.tickDuration = 20 * 60; + tile.gameTime = level.getGameTime(); + tile.updateBlock(); + } return; } if(bs.canBeReplaced() || level.getBlockEntity(pos) instanceof TemporaryTile tile && tile.mimicState.is(BlockTagProvider.DECORATIVE_AN)) { From 862a6d41db4897e7024819f823adaf96300b3a7e Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 24 Aug 2024 13:20:01 -0500 Subject: [PATCH 155/363] Fix infinite glyph crash, merge infinite crafting screens --- .../client/gui/book/GuiSpellBook.java | 107 ++- .../client/gui/book/InfinityGuiSpellBook.java | 762 ------------------ .../client/gui/buttons/CraftingButton.java | 5 +- .../gui/buttons/InfinityCraftingButton.java | 14 - .../arsnouveau/common/items/SpellBook.java | 4 +- .../common/network/PacketOpenSpellBook.java | 6 +- 6 files changed, 96 insertions(+), 802 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/InfinityCraftingButton.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index cdefc52cb9..156d91c884 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -22,6 +22,7 @@ import com.hollingsworth.arsnouveau.common.network.PacketUpdateCaster; import com.hollingsworth.arsnouveau.common.spell.validation.CombinedSpellValidator; import com.hollingsworth.arsnouveau.common.spell.validation.GlyphMaxTierValidator; +import com.hollingsworth.arsnouveau.setup.config.ServerConfig; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.hollingsworth.arsnouveau.setup.registry.CreativeTabRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; @@ -48,10 +49,7 @@ import java.net.URI; import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; import static com.hollingsworth.arsnouveau.api.util.ManaUtil.getPlayerDiscounts; @@ -90,6 +88,11 @@ public class GuiSpellBook extends BaseBook { public boolean setFocusOnLoad = true; public Renderable hoveredWidget = null; + public List spell = new ArrayList<>(); + public PageButton nextGlyphButton; + public PageButton prevGlyphButton; + public int spellWindowOffset = 0; + public GuiSpellBook(InteractionHand hand){ super(); this.hand = hand; @@ -123,7 +126,7 @@ public void init() { //Crafting slots for (int i = 0; i < numLinks; i++) { int offset = i >= 5 ? 14 : 0; - CraftingButton cell = new CraftingButton(bookLeft + 19 + 24 * i + offset, bookTop + FULL_HEIGHT - 47, this::onCraftingSlotClick); + CraftingButton cell = new CraftingButton(bookLeft + 19 + 24 * i + offset, bookTop + FULL_HEIGHT - 47, this::onCraftingSlotClick, i); addRenderableWidget(cell); craftingCells.add(cell); } @@ -157,7 +160,7 @@ public void init() { addRenderableWidget(spell_name); addRenderableWidget(searchBar); // Add spell slots - for (int i = 0; i < 10; i++) { + for (int i = 0; i < numLinks; i++) { String name = caster.getSpellName(i); GuiSpellSlot slot = new GuiSpellSlot(bookLeft + 281, bookTop + 1 + 15 * (i + 1), i, name, this::onSlotChange); if (i == selectedSlot) { @@ -196,6 +199,15 @@ public void init() { previousButton.visible = false; validate(); + List recipe = SpellCasterRegistry.from(bookStack).getSpell(selectedSlot).mutable().recipe; + spell = new ArrayList<>(recipe); + + //infinite spells + if (ServerConfig.INFINITE_SPELLS.get()) { + this.nextGlyphButton = addRenderableWidget(new PageButton(bookRight - 25, bookBottom - 30, true, i -> updateWindowOffset(spellWindowOffset + 1), true)); + this.prevGlyphButton = addRenderableWidget(new PageButton(bookLeft, bookBottom - 30, false, i -> updateWindowOffset(spellWindowOffset - 1), true)); + updateWindowOffset(0); + } } public int getNumPages() { @@ -227,8 +239,7 @@ private void layoutAllGlyphs(int page) { int row_offset = page == 0 ? 2 : 0; - for (int i = 0; i < sorted.size(); i++) { - AbstractSpellPart part = sorted.get(i); + for (AbstractSpellPart part : sorted) { if (!foundForms && part instanceof AbstractCastMethod) { foundForms = true; adjustedRowsPlaced += 1; @@ -412,7 +423,17 @@ public void onFamiliarClick(Button button) { } public void onCraftingSlotClick(Button button) { - ((CraftingButton) button).clear(); + if(button instanceof CraftingButton craftingButton) { + craftingButton.clear(); + if (craftingButton.slotNum < spell.size()) { + spell.set(((CraftingButton) button).slotNum, null); + } + } + //sanitize the spell if manually cleared + if (spell.stream().allMatch(Objects::isNull)) { + spell.clear(); + } + if (nextGlyphButton != null) updateNextGlyphArrow(); validate(); } @@ -423,6 +444,18 @@ public void onGlyphClick(Button button) { for (CraftingButton b : craftingCells) { if (b.getAbstractSpellPart() == null) { b.setAbstractSpellPart(button1.abstractSpellPart); + + if (b.slotNum >= spell.size()) { + + spell.add(button1.abstractSpellPart); + + } else { + + spell.set(b.slotNum, button1.abstractSpellPart); + + } + + if (nextGlyphButton != null) updateNextGlyphArrow(); validate(); return; } @@ -430,6 +463,17 @@ public void onGlyphClick(Button button) { } } + + private void updateNextGlyphArrow() { + if (spellWindowOffset >= ServerConfig.NOT_SO_INFINITE_SPELLS.get() || spellWindowOffset >= spell.size() - 1) { + nextGlyphButton.active = false; + nextGlyphButton.visible = false; + } else { + nextGlyphButton.active = true; + nextGlyphButton.visible = true; + } + } + public void onSlotChange(Button button) { this.selected_slot.isSelected = false; this.selected_slot = (GuiSpellSlot) button; @@ -437,7 +481,8 @@ public void onSlotChange(Button button) { this.selectedSpellSlot = this.selected_slot.slotNum; updateCraftingSlots(this.selectedSpellSlot); spell_name.setValue(SpellCasterRegistry.from(bookStack).getSpellName(selectedSpellSlot)); - validate(); + this.spell = new ArrayList<>(SpellCasterRegistry.from(bookStack).getSpell(selectedSpellSlot).unsafeList()); + updateWindowOffset(0); //includes validation } @Override @@ -470,6 +515,33 @@ public void updateCraftingSlots(int bookSlot) { } } + public void updateWindowOffset(int offset) { + //do nothing if the spell is empty and nextGlyphButton is clicked + if (ServerConfig.INFINITE_SPELLS.get()) + if (spellWindowOffset != 0 || offset <= 0 || !spell.stream().allMatch(Objects::isNull)) { + this.spellWindowOffset = Mth.clamp(offset, 0, ServerConfig.NOT_SO_INFINITE_SPELLS.get()); + for (int i = 0; i < 10; i++) { + var cell = craftingCells.get(i); + cell.slotNum = spellWindowOffset + i; + if (spellWindowOffset + i >= spell.size() || spell.get(spellWindowOffset + i) == null) { + cell.clear(); + } else { + cell.setAbstractSpellPart(spell.get(spellWindowOffset + i)); + } + } + if (spellWindowOffset <= 0) { + prevGlyphButton.active = false; + prevGlyphButton.visible = false; + + } else { + prevGlyphButton.active = true; + prevGlyphButton.visible = true; + } + updateNextGlyphArrow(); + } + validate(); + } + public void clear(Button button) { boolean allWereEmpty = true; @@ -479,6 +551,7 @@ public void clear(Button button) { } slot.clear(); } + spell.clear(); if (allWereEmpty) spell_name.setValue(""); @@ -489,8 +562,7 @@ public void onCreateClick(Button button) { validate(); if (validationErrors.isEmpty()) { Spell.Mutable spell = new Spell().mutable(); - for (CraftingButton slot : craftingCells) { - AbstractSpellPart spellPart = slot.getAbstractSpellPart(); + for (AbstractSpellPart spellPart : this.spell) { if (spellPart != null) { spell.add(spellPart); } @@ -584,9 +656,10 @@ private int getCurrentManaCost() { * Validates the current spell as well as the potential for adding each glyph. */ private void validate() { - List recipe = new LinkedList<>(); int firstBlankSlot = -1; + int offset = spellWindowOffset;//craftingCells.get(0).slotNum; + List recipe = new LinkedList<>(spell.subList(0, Math.min(offset, spell.size()))); // Reset the crafting slots and build the recipe to validate for (int i = 0; i < craftingCells.size(); i++) { CraftingButton b = craftingCells.get(i); @@ -595,18 +668,20 @@ private void validate() { // The validator can cope with null. Insert it to preserve glyph indices. recipe.add(null); // Also note where we found the first blank. Used later for the glyph buttons. - if (firstBlankSlot < 0) firstBlankSlot = i; + if (firstBlankSlot < 0) firstBlankSlot = offset + i; } else { recipe.add(b.getAbstractSpellPart()); } } + //if there are more glyphs than slots, add them to the end of the recipe for validation + recipe.addAll(spell.subList(Math.min(spell.size(), craftingCells.get(craftingCells.size() - 1).slotNum), spell.size())); // Validate the crafting slots List errors = spellValidator.validate(recipe); for (SpellValidationError ve : errors) { // Attach errors to the corresponding crafting slot (when applicable) - if (ve.getPosition() >= 0 && ve.getPosition() <= craftingCells.size()) { - CraftingButton b = craftingCells.get(ve.getPosition()); + if (ve.getPosition() >= offset && ve.getPosition() - offset < craftingCells.size()) { + CraftingButton b = craftingCells.get(ve.getPosition() - offset); b.validationErrors.add(ve); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java deleted file mode 100644 index 67406f99a1..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/InfinityGuiSpellBook.java +++ /dev/null @@ -1,762 +0,0 @@ -package com.hollingsworth.arsnouveau.client.gui.book; - - -import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; -import com.hollingsworth.arsnouveau.api.registry.FamiliarRegistry; -import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; -import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; -import com.hollingsworth.arsnouveau.api.sound.ConfiguredSpellSound; -import com.hollingsworth.arsnouveau.api.spell.*; -import com.hollingsworth.arsnouveau.api.util.ManaUtil; -import com.hollingsworth.arsnouveau.client.ClientInfo; -import com.hollingsworth.arsnouveau.client.gui.Color; -import com.hollingsworth.arsnouveau.client.gui.GuiUtils; -import com.hollingsworth.arsnouveau.client.gui.NoShadowTextField; -import com.hollingsworth.arsnouveau.client.gui.buttons.*; -import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; -import com.hollingsworth.arsnouveau.client.particle.ParticleColor; -import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; -import com.hollingsworth.arsnouveau.common.compat.PatchouliHandler; -import com.hollingsworth.arsnouveau.common.items.SpellBook; -import com.hollingsworth.arsnouveau.common.network.Networking; -import com.hollingsworth.arsnouveau.common.network.PacketUpdateCaster; -import com.hollingsworth.arsnouveau.common.spell.validation.CombinedSpellValidator; -import com.hollingsworth.arsnouveau.common.spell.validation.GlyphMaxTierValidator; -import com.hollingsworth.arsnouveau.setup.config.ServerConfig; -import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; -import com.hollingsworth.arsnouveau.setup.registry.CreativeTabRegistry; -import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.ChatFormatting; -import net.minecraft.Util; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.EditBox; -import net.minecraft.client.gui.components.Renderable; -import net.minecraft.client.gui.screens.inventory.PageButton; -import net.minecraft.client.resources.sounds.SimpleSoundInstance; -import net.minecraft.client.sounds.SoundManager; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TextColor; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.util.Mth; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.item.ItemStack; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.*; -import java.util.stream.Collectors; - -import static com.hollingsworth.arsnouveau.api.util.ManaUtil.getPlayerDiscounts; - -public class InfinityGuiSpellBook extends BaseBook { - - public ArsNouveauAPI api = ArsNouveauAPI.getInstance(); - - public int numLinks = 10; - - - public int selectedSpellSlot = 0; - public EditBox spell_name; - public NoShadowTextField searchBar; - public GuiSpellSlot selected_slot; - public List craftingCells = new ArrayList<>(); - public List unlockedSpells; - public List displayedGlyphs; - public List spell = new ArrayList<>(); - - public List glyphButtons = new ArrayList<>(); - public int page = 0; - public PageButton nextButton; - public PageButton previousButton; - - public PageButton nextGlyphButton; - public PageButton prevGlyphButton; - public ISpellValidator spellValidator; - public String previousString = ""; - public ItemStack bookStack; - - public int formTextRow = 0; - public int augmentTextRow = 0; - public int effectTextRow = 0; - public int glyphsPerPage = 58; - public InteractionHand hand; - - public int maxManaCache = 0; - int currentCostCache = 0; - - - public int spellWindowOffset = 0; - - public CreateSpellButton createSpellButton; - - public boolean setFocusOnLoad = true; - public Renderable hoveredWidget = null; - - public InfinityGuiSpellBook(InteractionHand hand) { - super(); - this.hand = hand; - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(Minecraft.getInstance().player); - ItemStack heldStack = Minecraft.getInstance().player.getItemInHand(hand); - List parts = cap == null ? new ArrayList<>() : new ArrayList<>(cap.getKnownGlyphs().stream().filter(AbstractSpellPart::shouldShowInSpellBook).toList()); - maxManaCache = ManaUtil.getMaxMana(Minecraft.getInstance().player); - parts.addAll(GlyphRegistry.getDefaultStartingSpells()); - if (heldStack.getItem() == ItemsRegistry.CREATIVE_SPELLBOOK.get()) - parts = new ArrayList<>(GlyphRegistry.getSpellpartMap().values()); - int tier = 1; - if (heldStack.getItem() instanceof SpellBook book) { - tier = book.getTier().value; - } - this.bookStack = heldStack; - this.unlockedSpells = parts; - this.displayedGlyphs = new ArrayList<>(this.unlockedSpells); - this.validationErrors = new LinkedList<>(); - this.spellValidator = new CombinedSpellValidator( - ArsNouveauAPI.getInstance().getSpellCraftingSpellValidator(), - new GlyphMaxTierValidator(tier) - ); - } - - @Override - public void init() { - super.init(); - AbstractCaster caster = SpellCasterRegistry.from(bookStack); - int selectedSlot = caster.getCurrentSlot(); - //Crafting slots - for (int i = 0; i < numLinks; i++) { - int offset = i >= 5 ? 14 : 0; - - InfinityCraftingButton cell = new InfinityCraftingButton(bookLeft + 19 + 24 * i + offset, bookTop + FULL_HEIGHT - 47, this::onCraftingSlotClick); - cell.slotNum = i; - - addRenderableWidget(cell); - craftingCells.add(cell); - } - updateCraftingSlots(selectedSlot); - - layoutAllGlyphs(0); - createSpellButton = addRenderableWidget(new CreateSpellButton(bookRight - 71, bookBottom - 13, this::onCreateClick, () -> !this.validationErrors.isEmpty())); - addRenderableWidget(new GuiImageButton(bookRight - 126, bookBottom - 13, 0, 0, 41, 12, 41, 12, "textures/gui/clear_icon.png", this::clear)); - - spell_name = new NoShadowTextField(minecraft.font, bookLeft + 32, bookTop + FULL_HEIGHT - 11, - 88, 12, null, Component.translatable("ars_nouveau.spell_book_gui.spell_name")); - spell_name.setBordered(false); - spell_name.setTextColor(12694931); - - searchBar = new NoShadowTextField(minecraft.font, bookRight - 73, bookTop + 2, - 54, 12, null, Component.translatable("ars_nouveau.spell_book_gui.search")); - searchBar.setBordered(false); - searchBar.setTextColor(12694931); - searchBar.onClear = (val) -> { - this.onSearchChanged(""); - return null; - }; - - spell_name.setValue(caster.getSpellName(caster.getCurrentSlot())); - if (spell_name.getValue().isEmpty()) - spell_name.setSuggestion(Component.translatable("ars_nouveau.spell_book_gui.spell_name").getString()); - - if (searchBar.getValue().isEmpty()) - searchBar.setSuggestion(Component.translatable("ars_nouveau.spell_book_gui.search").getString()); - searchBar.setResponder(this::onSearchChanged); - addRenderableWidget(spell_name); - addRenderableWidget(searchBar); - // Add spell slots - for (int i = 0; i < numLinks; i++) { - String name = caster.getSpellName(i); - GuiSpellSlot slot = new GuiSpellSlot(bookLeft + 281, bookTop + 1 + 15 * (i + 1), i, name, this::onSlotChange); - if (i == selectedSlot) { - selected_slot = slot; - selectedSpellSlot = i; - slot.isSelected = true; - } - addRenderableWidget(slot); - } - - addRenderableWidget(new GuiImageButton(bookLeft - 15, bookTop + 22, 0, 0, 23, 20, 23, 20, "textures/gui/worn_book_bookmark.png", this::onDocumentationClick) - .withTooltip(Component.translatable("ars_nouveau.gui.notebook"))); - addRenderableWidget(new GuiImageButton(bookLeft - 15, bookTop + 46, 0, 0, 23, 20, 23, 20, "textures/gui/color_wheel_bookmark.png", this::onColorClick) - .withTooltip(Component.translatable("ars_nouveau.gui.color"))); - addRenderableWidget(new GuiImageButton(bookLeft - 15, bookTop + 70, 0, 0, 23, 20, 23, 20, "textures/gui/summon_circle_bookmark.png", this::onFamiliarClick) - .withTooltip(Component.translatable("ars_nouveau.gui.familiar"))); - addRenderableWidget(new GuiImageButton(bookLeft - 15, bookTop + 94, 0, 0, 23, 20, 23, 20, "textures/gui/sounds_tab.png", this::onSoundsClick) - .withTooltip(Component.translatable("ars_nouveau.gui.sounds"))); - addRenderableWidget(new GuiImageButton(bookLeft - 15, bookTop + 118, 0, 0, 23, 20, 23, 20, "textures/gui/settings_tab.png", (b) -> Minecraft.getInstance().setScreen(new GuiSettingsScreen(this))).withTooltip(Component.translatable("ars_nouveau.gui.settings"))); - - addRenderableWidget(new GuiImageButton(bookLeft - 15, bookTop + 142, 0, 0, 23, 20, 23, 20, "textures/gui/discord_tab.png", (b) -> { - try { - Util.getPlatform().openUri(new URI("https://discord.com/invite/y7TMXZu")); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - }).withTooltip(Component.translatable("ars_nouveau.gui.discord"))); - - this.nextButton = addRenderableWidget(new PageButton(bookRight - 20, bookBottom - 10, true, this::onPageIncrease, true)); - this.previousButton = addRenderableWidget(new PageButton(bookLeft - 5, bookBottom - 10, false, this::onPageDec, true)); - - updateNextPageButtons(); - previousButton.active = false; - previousButton.visible = false; - - validate(); - - List recipe = SpellCasterRegistry.from(bookStack).getSpell(selectedSlot).unsafeList(); - spell = new ArrayList<>(recipe); - - //infinite spells - if (ServerConfig.INFINITE_SPELLS.get()) { - this.nextGlyphButton = addRenderableWidget(new PageButton(bookRight - 25, bookBottom - 30, true, i -> updateWindowOffset(spellWindowOffset + 1), true)); - this.prevGlyphButton = addRenderableWidget(new PageButton(bookLeft, bookBottom - 30, false, i -> updateWindowOffset(spellWindowOffset - 1), true)); - updateWindowOffset(0); - } - } - - public int getNumPages() { - return (int) Math.ceil((double) displayedGlyphs.size() / 58); - } - - - private void layoutAllGlyphs(int page) { - clearButtons(glyphButtons); - formTextRow = 0; - augmentTextRow = 0; - effectTextRow = 0; - final int PER_ROW = 6; - final int MAX_ROWS = 6; - boolean nextPage = false; - int xStart = nextPage ? bookLeft + 154 : bookLeft + 20; - int adjustedRowsPlaced = 0; - int yStart = bookTop + 20; - boolean foundForms = false; - boolean foundAugments = false; - boolean foundEffects = false; - List sorted = new ArrayList<>(); - sorted.addAll(displayedGlyphs.stream().filter(s -> s instanceof AbstractCastMethod).toList()); - sorted.addAll(displayedGlyphs.stream().filter(s -> s instanceof AbstractAugment).toList()); - sorted.addAll(displayedGlyphs.stream().filter(s -> s instanceof AbstractEffect).toList()); - sorted.sort(CreativeTabRegistry.COMPARE_SPELL_TYPE_NAME); - sorted = sorted.subList(glyphsPerPage * page, Math.min(sorted.size(), glyphsPerPage * (page + 1))); - int adjustedXPlaced = 0; - int totalRowsPlaced = 0; - int row_offset = page == 0 ? 2 : 0; - - - for (AbstractSpellPart part : sorted) { - if (!foundForms && part instanceof AbstractCastMethod) { - foundForms = true; - adjustedRowsPlaced += 1; - totalRowsPlaced += 1; - formTextRow = page != 0 ? 0 : totalRowsPlaced; - adjustedXPlaced = 0; - } - - if (!foundAugments && part instanceof AbstractAugment) { - foundAugments = true; - adjustedRowsPlaced += row_offset; - totalRowsPlaced += row_offset; - augmentTextRow = page != 0 ? 0 : totalRowsPlaced - 1; - adjustedXPlaced = 0; - } else if (!foundEffects && part instanceof AbstractEffect) { - foundEffects = true; - adjustedRowsPlaced += row_offset; - totalRowsPlaced += row_offset; - effectTextRow = page != 0 ? 0 : totalRowsPlaced - 1; - adjustedXPlaced = 0; - } else { - - if (adjustedXPlaced >= PER_ROW) { - adjustedRowsPlaced++; - totalRowsPlaced++; - adjustedXPlaced = 0; - } - } - if (adjustedRowsPlaced > MAX_ROWS) { - if (nextPage) { - break; - } - nextPage = true; - adjustedXPlaced = 0; - adjustedRowsPlaced = 0; - } - int xOffset = 20 * ((adjustedXPlaced) % PER_ROW) + (nextPage ? 134 : 0); - int yPlace = adjustedRowsPlaced * 18 + yStart; - - GlyphButton cell = new GlyphButton(xStart + xOffset, yPlace, part, this::onGlyphClick); - addRenderableWidget(cell); - glyphButtons.add(cell); - adjustedXPlaced++; - } - } - - public void resetPageState() { - updateNextPageButtons(); - this.page = 0; - previousButton.active = false; - previousButton.visible = false; - layoutAllGlyphs(page); - validate(); - } - - public void onSearchChanged(String str) { - if (str.equals(previousString)) - return; - previousString = str; - - if (!str.isEmpty()) { - searchBar.setSuggestion(""); - displayedGlyphs = new ArrayList<>(); - - for (AbstractSpellPart spellPart : unlockedSpells) { - if (spellPart.getLocaleName().toLowerCase().contains(str.toLowerCase())) { - displayedGlyphs.add(spellPart); - } - } - // Set visibility of Cast Methods and Augments - for (Renderable w : renderables) { - if (w instanceof GlyphButton glyphButton) { - if (glyphButton.abstractSpellPart.getRegistryName() != null) { - AbstractSpellPart part = GlyphRegistry.getSpellpartMap().get(glyphButton.abstractSpellPart.getRegistryName()); - if (part != null) { - glyphButton.visible = part.getLocaleName().toLowerCase().contains(str.toLowerCase()); - } - } - } - } - } else { - // Reset our book on clear - searchBar.setSuggestion(Component.translatable("ars_nouveau.spell_book_gui.search").getString()); - displayedGlyphs = unlockedSpells; - for (Renderable w : renderables) { - if (w instanceof GlyphButton) { - ((GlyphButton) w).visible = true; - } - } - } - resetPageState(); - } - - public void updateNextPageButtons() { - if (displayedGlyphs.size() < glyphsPerPage) { - nextButton.visible = false; - nextButton.active = false; - } else { - nextButton.visible = true; - nextButton.active = true; - } - } - - public void onPageIncrease(Button button) { - if (page + 1 >= getNumPages()) - return; - page++; - if (displayedGlyphs.size() < glyphsPerPage * (page + 1)) { - nextButton.visible = false; - nextButton.active = false; - } - previousButton.active = true; - previousButton.visible = true; - layoutAllGlyphs(page); - validate(); - } - - public void onPageDec(Button button) { - if (page <= 0) { - page = 0; - return; - } - page--; - if (page == 0) { - previousButton.active = false; - previousButton.visible = false; - } - - if (displayedGlyphs.size() > glyphsPerPage * (page + 1)) { - nextButton.visible = true; - nextButton.active = true; - } - layoutAllGlyphs(page); - validate(); - } - - @Override - public boolean mouseScrolled(double mouseX, double mouseY, double pScrollX, double pScrollY) { - SoundManager manager = Minecraft.getInstance().getSoundManager(); - if (pScrollY < 0 && nextButton.active) { - onPageIncrease(nextButton); - manager.play(SimpleSoundInstance.forUI(SoundEvents.BOOK_PAGE_TURN, 1.0F)); - } else if (pScrollY > 0 && previousButton.active) { - onPageDec(previousButton); - manager.play(SimpleSoundInstance.forUI(SoundEvents.BOOK_PAGE_TURN, 1.0F)); - } - - return true; - } - - public void onDocumentationClick(Button button) { - if (ArsNouveau.patchouliLoaded) { - PatchouliHandler.openBookClient(); - } else { - try { - Util.getPlatform().openUri(new URI("https://www.arsnouveau.wiki/")); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - } - } - - public void onColorClick(Button button) { - ParticleColor.IntWrapper color = SpellCasterRegistry.from(bookStack).getColor(selectedSpellSlot).toWrapper(); - Minecraft.getInstance().setScreen(new GuiColorScreen(color.r, color.g, color.b, selectedSpellSlot, this.hand)); - } - - public void onSoundsClick(Button button) { - ConfiguredSpellSound spellSound = SpellCasterRegistry.from(bookStack).getSound(selectedSpellSlot); - Minecraft.getInstance().setScreen(new SoundScreen(spellSound, selectedSpellSlot, this.hand)); - } - - public void onFamiliarClick(Button button) { - Collection familiarHolders = new ArrayList<>(); - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(ArsNouveau.proxy.getPlayer()); - if (cap != null) { - familiarHolders = cap.getUnlockedFamiliars().stream().map(s -> s.familiarHolder.getRegistryName()).collect(Collectors.toList()); - } - Collection finalFamiliarHolders = familiarHolders; - Minecraft.getInstance().setScreen(new GuiFamiliarScreen(FamiliarRegistry.getFamiliarHolderMap().values().stream().filter(f -> finalFamiliarHolders.contains(f.getRegistryName())).collect(Collectors.toList()), this)); - } - - public void onCraftingSlotClick(Button button) { - ((InfinityCraftingButton) button).clear(); -// spell.add(((InfinityCraftingButton) button).slotNum, null); - if (((InfinityCraftingButton) button).slotNum < spell.size()) { - spell.set(((InfinityCraftingButton) button).slotNum, null); - } - //sanitize the spell if manually cleared - if (spell.stream().allMatch(Objects::isNull)) { - spell.clear(); - } - if (nextGlyphButton != null) updateNextGlyphArrow(); - validate(); - } - - public void onGlyphClick(Button button) { - GlyphButton button1 = (GlyphButton) button; - - if (button1.validationErrors.isEmpty()) { - for (InfinityCraftingButton b : craftingCells) { - if (b.getAbstractSpellPart() == null) { - b.setAbstractSpellPart(button1.abstractSpellPart); - b.spellTag = button1.abstractSpellPart.getRegistryName(); - if (b.slotNum >= spell.size()) { - spell.add(button1.abstractSpellPart); - } else { - spell.set(b.slotNum, button1.abstractSpellPart); - } - if (nextGlyphButton != null) updateNextGlyphArrow(); - validate(); - return; - } - } - } - - } - - private void updateNextGlyphArrow() { - if (spellWindowOffset >= ServerConfig.NOT_SO_INFINITE_SPELLS.get() || spellWindowOffset >= spell.size() - 1) { - nextGlyphButton.active = false; - nextGlyphButton.visible = false; - } else { - nextGlyphButton.active = true; - nextGlyphButton.visible = true; - } - } - - public void onSlotChange(Button button) { - this.selected_slot.isSelected = false; - this.selected_slot = (GuiSpellSlot) button; - this.selected_slot.isSelected = true; - this.selectedSpellSlot = this.selected_slot.slotNum; - updateCraftingSlots(this.selectedSpellSlot); - spell_name.setValue(SpellCasterRegistry.from(bookStack).getSpellName(selectedSpellSlot)); - this.spell = new ArrayList<>(SpellCasterRegistry.from(bookStack).getSpell(selectedSpellSlot).unsafeList()); - updateWindowOffset(0); //includes validation - } - - @Override - public boolean charTyped(char pCodePoint, int pModifiers) { - if (hoveredWidget instanceof GlyphButton glyphButton && glyphButton.validationErrors.isEmpty()) { - // check if char is a number - if (pCodePoint >= '0' && pCodePoint <= '9') { - int num = Integer.parseInt(String.valueOf(pCodePoint)); - if (num == 0) { - num = 10; - } - num -= 1; - this.craftingCells.get(num).setAbstractSpellPart(glyphButton.abstractSpellPart); - validate(); - return true; - } - } - return super.charTyped(pCodePoint, pModifiers); - } - - public void updateCraftingSlots(int bookSlot) { - //Crafting slots - var recipe = SpellCasterRegistry.from(bookStack).getSpell(bookSlot); - for (int i = 0; i < craftingCells.size(); i++) { - InfinityCraftingButton slot = craftingCells.get(i); - slot.clear(); - if (i < recipe.size()) { - slot.setAbstractSpellPart(recipe.get(i)); - } - } - } - - public void updateWindowOffset(int offset) { - //do nothing if the spell is empty and nextGlyphButton is clicked - if (ServerConfig.INFINITE_SPELLS.get()) - if (spellWindowOffset != 0 || offset <= 0 || !spell.stream().allMatch(Objects::isNull)) { - this.spellWindowOffset = Mth.clamp(offset, 0, ServerConfig.NOT_SO_INFINITE_SPELLS.get()); - for (int i = 0; i < 10; i++) { - InfinityCraftingButton InfinityCraftingButton = craftingCells.get(i); - InfinityCraftingButton.slotNum = spellWindowOffset + i; - if (spellWindowOffset + i >= spell.size() || spell.get(spellWindowOffset + i) == null) { - InfinityCraftingButton.clear(); - } else { - InfinityCraftingButton.spellTag = spell.get(spellWindowOffset + i).getRegistryName(); - InfinityCraftingButton.setAbstractSpellPart(spell.get(spellWindowOffset + i)); - } - } - if (spellWindowOffset <= 0) { - prevGlyphButton.active = false; - prevGlyphButton.visible = false; - } else { - prevGlyphButton.active = true; - prevGlyphButton.visible = true; - } - - updateNextGlyphArrow(); - } - validate(); - } - - public void clear(Button button) { - boolean allWereEmpty = true; - - for (InfinityCraftingButton slot : craftingCells) { - if (slot.getAbstractSpellPart() != null) { - allWereEmpty = false; - } - slot.clear(); - } - spell.clear(); - if (allWereEmpty) spell_name.setValue(""); - - validate(); - } - - public void onCreateClick(Button button) { - validate(); - if (validationErrors.isEmpty()) { - Spell.Mutable spell = new Spell().mutable(); - - for (AbstractSpellPart spellPart : this.spell) { - if (spellPart != null) { - spell.add(spellPart); - } - } - Networking.sendToServer(new PacketUpdateCaster(spell.immutable(), this.selectedSpellSlot, this.spell_name.getValue(), hand == InteractionHand.MAIN_HAND)); - } - } - - public static void open(InteractionHand hand) { - Minecraft.getInstance().setScreen(new InfinityGuiSpellBook(hand)); - } - - public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - super.drawBackgroundElements(graphics, mouseX, mouseY, partialTicks); - if (formTextRow >= 1) { - graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.form").getString(), formTextRow > 6 ? 154 : 20, 5 + 18 * (formTextRow + (formTextRow == 1 ? 0 : 1)), -8355712, false); - } - if (effectTextRow >= 1) { - graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.effect").getString(), effectTextRow > 6 ? 154 : 20, 5 + 18 * (effectTextRow + 1), -8355712, false); - } - if (augmentTextRow >= 1) { - graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.augment").getString(), augmentTextRow > 6 ? 154 : 20, 5 + 18 * (augmentTextRow + 1), -8355712, false); - } - graphics.blit(ArsNouveau.prefix( "textures/gui/spell_name_paper.png"), 16, 179, 0, 0, 109, 15, 109, 15); - graphics.blit(ArsNouveau.prefix( "textures/gui/search_paper.png"), 203, 0, 0, 0, 72, 15, 72, 15); - graphics.blit(ArsNouveau.prefix( "textures/gui/clear_paper.png"), 161, 179, 0, 0, 47, 15, 47, 15); - graphics.blit(ArsNouveau.prefix( "textures/gui/create_paper.png"), 216, 179, 0, 0, 56, 15, 56, 15); - if (validationErrors.isEmpty()) { - graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.create"), 233, 183, -8355712, false); - } else { - // Color code chosen to match GL11.glColor4f(1.0F, 0.7F, 0.7F, 1.0F); - Component textComponent = Component.translatable("ars_nouveau.spell_book_gui.create") - .withStyle(s -> s.withStrikethrough(true).withColor(TextColor.parseColor("#FFB2B2").getOrThrow())); - // The final argument to draw desaturates the above color from the text component - graphics.drawString(font, textComponent, 233, 183, -8355712, false); - } - graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.clear").getString(), 177, 183, -8355712, false); - - //manabar - int manaLength = 96; - if (maxManaCache > 0) { - //keep the mana bar lenght between -1 and 96 to avoid over/underflow - manaLength = (int) Mth.clamp(manaLength * ((float) (maxManaCache - currentCostCache) / maxManaCache), -1, 96); - } else manaLength = 0; - - int offsetLeft = 89; - int yOffset = 210; - - //scale the manabar to fit the gui - PoseStack poseStack = graphics.pose(); - poseStack.pushPose(); - poseStack.scale(1.2F, 1.2F, 1.2F); - poseStack.translate(-25, -30, 0); - graphics.blit(ArsNouveau.prefix( "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 18, 0, 0, 108, 18, 256, 256); - int manaOffset = (int) (((ClientInfo.ticksInGame + partialTicks) / 3 % (33))) * 6; - - // default length is 96 - // rainbow effect for perfect match is currently disabled by the >= - if (manaLength >= 0) { - graphics.blit(ArsNouveau.prefix( "textures/gui/manabar_gui_mana.png"), offsetLeft + 9, yOffset - 9, 0, manaOffset, manaLength, 6, 256, 256); - } else { - //color rainbow if mana cost = max mana, red if mana cost > max mana - RenderSystem.setShaderTexture(0, ArsNouveau.prefix( "textures/gui/manabar_gui_grayscale.png")); - RenderUtils.colorBlit(graphics.pose(), offsetLeft + 8, yOffset - 10, 0, manaOffset, 100, 8, 256, 256, manaLength < 0 ? Color.RED : Color.rainbowColor(ClientInfo.ticksInGame)); - } - if (ArsNouveauAPI.ENABLE_DEBUG_NUMBERS && minecraft != null) { - String text = currentCostCache + " / " + maxManaCache; - int maxWidth = minecraft.font.width(maxManaCache + " / " + maxManaCache); - int offset = offsetLeft - maxWidth / 2 + (maxWidth - minecraft.font.width(text)); - - graphics.drawString(minecraft.font, text, offset + 55, yOffset - 10, 0xFFFFFF, false); - } - - graphics.blit(ArsNouveau.prefix( "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 17, 0, 18, 108, 20, 256, 256); - poseStack.popPose(); - } - - private int getCurrentManaCost() { - Spell spell = new Spell(this.spell); - int cost = spell.getCost() - getPlayerDiscounts(Minecraft.getInstance().player, spell, bookStack); - return Math.max(cost, 0); - } - - /** - * Validates the current spell as well as the potential for adding each glyph. - */ - private void validate() { - int firstBlankSlot = -1; - int offset = spellWindowOffset;//craftingCells.get(0).slotNum; - - List recipe = new LinkedList<>(spell.subList(0, Math.min(offset, spell.size()))); - - // Reset the crafting slots and build the recipe to validate - for (int i = 0; i < craftingCells.size(); i++) { - InfinityCraftingButton b = craftingCells.get(i); - b.validationErrors.clear(); - if (b.getAbstractSpellPart() == null) { - // The validator can cope with null. Insert it to preserve glyph indices. - recipe.add(null); - // Also note where we found the first blank. Used later for the glyph buttons. - if (firstBlankSlot < 0) firstBlankSlot = offset + i; - } else { - recipe.add(b.getAbstractSpellPart()); - } - } - //if there are more glyphs than slots, add them to the end of the recipe for validation - recipe.addAll(spell.subList(Math.min(spell.size(), craftingCells.get(craftingCells.size() - 1).slotNum), spell.size())); - - // Validate the crafting slots - List errors = spellValidator.validate(recipe); - for (SpellValidationError ve : errors) { - // Attach errors to the corresponding crafting slot (when applicable) - if (ve.getPosition() >= offset && ve.getPosition() - offset < craftingCells.size()) { - InfinityCraftingButton b = craftingCells.get(ve.getPosition() - offset); - b.validationErrors.add(ve); - } - } - this.validationErrors = errors; - - // Validate the glyph buttons - // Trim the spell to the first gap, if there is a gap - if (firstBlankSlot >= 0) { - recipe = new ArrayList<>(recipe.subList(0, firstBlankSlot)); - } - for (GlyphButton button : glyphButtons) { - validateGlyphButton(recipe, button); - } - - //update mana cache - currentCostCache = getCurrentManaCost(); - maxManaCache = ManaUtil.getMaxMana(Minecraft.getInstance().player); - } - - private void validateGlyphButton(List recipe, GlyphButton glyphButton) { - // Start from a clean slate - glyphButton.validationErrors.clear(); - - // Simulate adding the glyph to the current spell - recipe.add(GlyphRegistry.getSpellpartMap().get(glyphButton.abstractSpellPart.getRegistryName())); - - // Filter the errors to ones referring to the simulated glyph - glyphButton.validationErrors.addAll( - spellValidator.validate(recipe).stream() - .filter(ve -> ve.getPosition() >= recipe.size() - 1).toList() - ); - - // Remove the simulated glyph to make room for the next one - recipe.remove(recipe.size() - 1); - } - - @Override - public void render(GuiGraphics ms, int mouseX, int mouseY, float partialTicks) { - super.render(ms, mouseX, mouseY, partialTicks); - if (this.setFocusOnLoad) { - this.setFocusOnLoad = false; - this.setInitialFocus(searchBar); - } - hoveredWidget = null; - for (Renderable widget : renderables) { - if (widget instanceof AbstractWidget abstractWidget && GuiUtils.isMouseInRelativeRange(mouseX, mouseY, abstractWidget)) { - hoveredWidget = widget; - break; - } - } - spell_name.setSuggestion(spell_name.getValue().isEmpty() ? Component.translatable("ars_nouveau.spell_book_gui.spell_name").getString() : ""); - } - - @Override - public void collectTooltips(GuiGraphics stack, int mouseX, int mouseY, List tooltip) { - if (GuiUtils.isMouseInRelativeRange(mouseX, mouseY, createSpellButton)) { - if (!validationErrors.isEmpty()) { - boolean foundGlyphErrors = false; - tooltip.add(Component.translatable("ars_nouveau.spell.validation.crafting.invalid").withStyle(ChatFormatting.RED)); - - // Add any spell-wide errors - for (SpellValidationError error : validationErrors) { - if (error.getPosition() < 0) { - tooltip.add(error.makeTextComponentExisting()); - } else { - foundGlyphErrors = true; - } - } - - // Show a single placeholder for all the per-glyph errors - if (foundGlyphErrors) { - tooltip.add(Component.translatable("ars_nouveau.spell.validation.crafting.invalid_glyphs")); - } - } - } else { - super.collectTooltips(stack, mouseX, mouseY, tooltip); - } - } -} - diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java index da0f395bd7..20ba01c87e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java @@ -16,12 +16,13 @@ public class CraftingButton extends GuiImageButton { private AbstractSpellPart abstractSpellPart; public List validationErrors; + public int slotNum; - public CraftingButton(int x, int y, Button.OnPress onPress) { + public CraftingButton(int x, int y, Button.OnPress onPress, int slotNum) { super(x, y, 0, 0, 22, 20, 22, 20, "textures/gui/spell_glyph_slot.png", onPress); this.validationErrors = new LinkedList<>(); abstractSpellPart = null; - + this.slotNum = slotNum; } public void clear() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/InfinityCraftingButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/InfinityCraftingButton.java deleted file mode 100644 index 4e58ee776c..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/InfinityCraftingButton.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.hollingsworth.arsnouveau.client.gui.buttons; - -import net.minecraft.client.gui.components.Button; -import net.minecraft.resources.ResourceLocation; - -public class InfinityCraftingButton extends CraftingButton { - public int slotNum; - public ResourceLocation spellTag; - - public InfinityCraftingButton(int x, int y, Button.OnPress onPress) { - super(x, y, onPress); - } - -} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java index 87723722c3..4075a87e12 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java @@ -6,7 +6,6 @@ import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.api.util.StackUtil; import com.hollingsworth.arsnouveau.client.gui.book.GuiSpellBook; -import com.hollingsworth.arsnouveau.client.gui.book.InfinityGuiSpellBook; import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenu; import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenuSlot; @@ -17,7 +16,6 @@ import com.hollingsworth.arsnouveau.common.crafting.recipes.IDyeable; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketSetCasterSlot; -import com.hollingsworth.arsnouveau.setup.config.ServerConfig; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; @@ -136,7 +134,7 @@ public void onOpenBookMenuKeyPressed(ItemStack stack, Player player) { if (hand == null) { return; } - Minecraft.getInstance().setScreen(ServerConfig.INFINITE_SPELLS.get() ? new InfinityGuiSpellBook(hand) : new GuiSpellBook(hand)); + Minecraft.getInstance().setScreen(new GuiSpellBook(hand)); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenSpellBook.java index c0a4240e3d..8b82ab3ef6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketOpenSpellBook.java @@ -2,8 +2,6 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.gui.book.GuiSpellBook; -import com.hollingsworth.arsnouveau.client.gui.book.InfinityGuiSpellBook; -import com.hollingsworth.arsnouveau.setup.config.ServerConfig; import net.minecraft.client.Minecraft; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; @@ -39,9 +37,7 @@ public PacketOpenSpellBook(InteractionHand hand) { @Override public void onClientReceived(Minecraft minecraft, Player player) { InteractionHand hand = isMainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; - if (ServerConfig.INFINITE_SPELLS.get()) - InfinityGuiSpellBook.open(hand); - else GuiSpellBook.open(hand); + GuiSpellBook.open(hand); } @Override From a1faf79c6669b8dd6acfbaf744ab467f6f066a66 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 24 Aug 2024 13:51:24 -0500 Subject: [PATCH 156/363] Fix unable to enchant armor, infinite durability #1387 --- .../common/armor/AnimatedMagicArmor.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java index 10e2838de2..660d4c5945 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java @@ -56,15 +56,30 @@ public AnimatedMagicArmor(Holder materialIn, ArmorItem.Type slot, } public static AnimatedMagicArmor light(ArmorItem.Type slot) { - return new AnimatedMagicArmor(MaterialRegistry.LIGHT, slot, new GenericModel("light_armor", "item/light_armor").withEmptyAnim()); + return new AnimatedMagicArmor(MaterialRegistry.LIGHT, slot, + ItemsRegistry.defaultItemProperties() + .stacksTo(1) + .component(DataComponentRegistry.ARMOR_PERKS, new ArmorPerkHolder()) + .durability(slot.getDurability(20)), new GenericModel("light_armor", "item/light_armor").withEmptyAnim()); } public static AnimatedMagicArmor medium(ArmorItem.Type slot) { - return new AnimatedMagicArmor(MaterialRegistry.MEDIUM, slot, new GenericModel("medium_armor", "item/medium_armor").withEmptyAnim()); + return new AnimatedMagicArmor(MaterialRegistry.MEDIUM, slot,ItemsRegistry.defaultItemProperties() + .stacksTo(1) + .component(DataComponentRegistry.ARMOR_PERKS, new ArmorPerkHolder()) + .durability(slot.getDurability(25)), new GenericModel("medium_armor", "item/medium_armor").withEmptyAnim()); } public static AnimatedMagicArmor heavy(ArmorItem.Type slot) { - return new AnimatedMagicArmor(MaterialRegistry.HEAVY, slot, new GenericModel("heavy_armor", "item/heavy_armor").withEmptyAnim()); + return new AnimatedMagicArmor(MaterialRegistry.HEAVY, slot,ItemsRegistry.defaultItemProperties() + .stacksTo(1) + .component(DataComponentRegistry.ARMOR_PERKS, new ArmorPerkHolder()) + .durability(slot.getDurability(35)), new GenericModel("heavy_armor", "item/heavy_armor").withEmptyAnim()); + } + + @Override + public boolean isEnchantable(ItemStack pStack) { + return true; } @Override From a863f99cd4071250cd8da50c90001b54d5ba874e Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 24 Aug 2024 13:51:38 -0500 Subject: [PATCH 157/363] Support shift scrolling infinite spell list --- .../arsnouveau/client/gui/book/GuiSpellBook.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index 156d91c884..fa6ed841df 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -26,6 +26,7 @@ import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.hollingsworth.arsnouveau.setup.registry.CreativeTabRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.ChatFormatting; @@ -378,6 +379,15 @@ public void onPageDec(Button button) { @Override public boolean mouseScrolled(double pMouseX, double pMouseY, double pScrollX, double pScrollY) { + boolean isShiftDown = InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), Minecraft.getInstance().options.keyShift.getKey().getValue()); + if(ServerConfig.INFINITE_SPELLS.get() && isShiftDown){ + if (pScrollY < 0 && nextGlyphButton.active) { + updateWindowOffset(spellWindowOffset + 1); + } else if (pScrollY > 0 && prevGlyphButton.active) { + updateWindowOffset(spellWindowOffset - 1); + } + return true; + } SoundManager manager = Minecraft.getInstance().getSoundManager(); if (pScrollY < 0 && nextButton.active) { onPageIncrease(nextButton); @@ -642,8 +652,7 @@ public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, private int getCurrentManaCost() { Spell spell = new Spell(); - for (CraftingButton button : craftingCells) { - AbstractSpellPart part = button.getAbstractSpellPart(); + for (AbstractSpellPart part : this.spell) { if (part != null) { spell = spell.add(part); } From 65f3c7f4e7251f4d458f7857d3f237b161c2440e Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 24 Aug 2024 14:15:25 -0500 Subject: [PATCH 158/363] 5.0.10 --- build.gradle | 6 ++++-- gradle.properties | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 5ff9761d88..b74a005cd7 100644 --- a/build.gradle +++ b/build.gradle @@ -106,8 +106,10 @@ dependencies { // } implementation "software.bernie.geckolib:geckolib-neoforge-1.21:${geckolib_version}" // - implementation "vazkii.patchouli:Patchouli:1.21-${patchouli_version}" -// + implementation(jarJar(group: 'vazkii.patchouli', name: 'Patchouli', version: '[1.21,)') { + jarJar.pin(it, patchouli_version) + }) + runtimeOnly "com.illusivesoulworks.caelus:caelus-neoforge:${caelus_version}" compileOnly "com.illusivesoulworks.caelus:caelus-neoforge:${caelus_version}:api" diff --git a/gradle.properties b/gradle.properties index fc1ca07d97..1dd2da2526 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.0.9 +mod_version=5.0.10 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 068039c1804e0de2ece9543f0c5f954ad63a0f16 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 24 Aug 2024 14:34:43 -0500 Subject: [PATCH 159/363] Fix infinity on spell bow --- .../arsnouveau/common/items/SpellBow.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java index 4e0fda5cf6..5c83a907f6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java @@ -13,15 +13,19 @@ import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Unit; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.item.*; +import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; import net.neoforged.neoforge.common.CommonHooks; @@ -142,8 +146,10 @@ public void releaseUsing(@NotNull ItemStack bowStack, @NotNull Level worldIn, @N float f = getPowerForTime(useTime); boolean didCastSpell = false; if (f >= 0.1D) { + boolean isArrowInfinite = playerentity.abilities.instabuild || (arrowStack.getItem() instanceof ArrowItem arrowItem && arrowItem.isInfinite(arrowStack, bowStack, playerentity)); if (!worldIn.isClientSide) { + int use = EnchantmentHelper.processAmmoUse((ServerLevel) worldIn, bowStack, arrowStack, 1); ArrowItem arrowitem = (ArrowItem) (arrowStack.getItem() instanceof ArrowItem ? arrowStack.getItem() : Items.ARROW); AbstractArrow abstractarrowentity = arrowitem.createArrow(worldIn, arrowStack, playerentity, bowStack); abstractarrowentity = customArrow(abstractarrowentity, arrowStack, bowStack); @@ -183,16 +189,20 @@ public void releaseUsing(@NotNull ItemStack bowStack, @NotNull Level worldIn, @N if (f >= 1.0F) { arr.setCritArrow(true); } + if(isArrowInfinite && use == 0){ + arrowStack = arrowStack.copyWithCount(1); + arrowStack.set(DataComponents.INTANGIBLE_PROJECTILE, Unit.INSTANCE); + } addArrow(arr, bowStack, arrowStack, isArrowInfinite, playerentity); } + if (!isArrowInfinite && !playerentity.abilities.instabuild) { + arrowStack.shrink(use); + } } worldIn.playSound(null, playerentity.getX(), playerentity.getY(), playerentity.getZ(), SoundEvents.ARROW_SHOOT, SoundSource.PLAYERS, 1.0F, 1.0F / (worldIn.random.nextFloat() * 0.4F + 1.2F) + f * 0.5F); if (didCastSpell) caster.playSound(playerentity.getOnPos(), playerentity.level, playerentity, caster.getCurrentSound(), SoundSource.PLAYERS); - if (!isArrowInfinite && !playerentity.abilities.instabuild) { - arrowStack.shrink(1); - } } } From 60c15218475e8a06fb1fb3a6875b68fbc67f9ab0 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 26 Aug 2024 21:44:18 -0500 Subject: [PATCH 160/363] Fix crash with lectern #1360 #1398 --- .../arsnouveau/api/recipe/PotionCraftingManager.java | 8 ++++---- .../client/container/AbstractStorageTerminalScreen.java | 2 +- .../arsnouveau/client/container/StorageTerminalMenu.java | 6 +++--- .../arsnouveau/common/block/tile/PotionDiffuserTile.java | 4 ++-- .../arsnouveau/common/block/tile/PotionJarTile.java | 4 ++-- .../arsnouveau/common/entity/EnchantedFallingBlock.java | 2 +- .../entity/goal/carbuncle/StarbyPotionBehavior.java | 2 +- .../hollingsworth/arsnouveau/common/util/ANCodecs.java | 9 +++++++++ 8 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java index c0f9cdcce5..3af72f3954 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java @@ -84,15 +84,15 @@ public boolean isCraftInvalid() { @Override public void write(HolderLookup.Provider provider, CompoundTag tag) { super.write(provider, tag); - tag.put("potionout", ANCodecs.encode(PotionContents.CODEC, potionOut)); - tag.put("potionNeeded", ANCodecs.encode(PotionContents.CODEC, getPotionNeeded())); + tag.put("potionout", ANCodecs.encode(provider, PotionContents.CODEC, potionOut)); + tag.put("potionNeeded", ANCodecs.encode(provider, PotionContents.CODEC, getPotionNeeded())); tag.putBoolean("gotPotion", hasObtainedPotion); } public void read(HolderLookup.Provider provider, CompoundTag tag){ super.read(provider, tag); - potionOut = ANCodecs.decode(PotionContents.CODEC, tag.getCompound("potionout")); - potionNeeded = ANCodecs.decode(PotionContents.CODEC, tag.getCompound("potionNeeded")); + potionOut = ANCodecs.decode(provider, PotionContents.CODEC, tag.getCompound("potionout")); + potionNeeded = ANCodecs.decode(provider, PotionContents.CODEC, tag.getCompound("potionNeeded")); hasObtainedPotion = tag.getBoolean("gotPotion"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java index 296f7496bc..0997aa52a6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java @@ -493,7 +493,7 @@ protected void storageSlotClick(StoredItemStack slotStack, StorageTerminalMenu.S interactTag.putBoolean("pullOne", pullOne); interactTag.putInt("action", act.ordinal()); if(slotStack != null){ - interactTag.put("stack", ANCodecs.encode(StoredItemStack.CODEC, slotStack)); + interactTag.put("stack", ANCodecs.encode(ArsNouveau.proxy.getMinecraft().level.registryAccess(), StoredItemStack.CODEC, slotStack)); } CompoundTag dataTag = new CompoundTag(); dataTag.put("interaction", interactTag); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java index 94bea99e1f..bf53676f74 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java @@ -215,7 +215,7 @@ public void receive(HolderLookup.Provider reg, CompoundTag message) { if(message.contains("search")) { te.setLastSearch(message.getString("search")); } - this.receiveInteract(message); + this.receiveInteract(reg, message); } public void receiveSettings(SortSettings settings, String selectedTab) { @@ -223,7 +223,7 @@ public void receiveSettings(SortSettings settings, String selectedTab) { te.setSorting(settings); } - public void receiveInteract(CompoundTag tag) { + public void receiveInteract(HolderLookup.Provider provider, CompoundTag tag) { if(!tag.contains("interaction")) return; @@ -231,7 +231,7 @@ public void receiveInteract(CompoundTag tag) { boolean pullOne = interactTag.getBoolean("pullOne"); StoredItemStack stack = null; if(interactTag.contains("stack")){ - stack = ANCodecs.decode(StoredItemStack.CODEC, interactTag.get("stack")); + stack = ANCodecs.decode(provider, StoredItemStack.CODEC, interactTag.get("stack")); } StorageTerminalMenu.SlotAction action = StorageTerminalMenu.SlotAction.values()[interactTag.getInt("action")]; onInteract(stack, action, pullOne); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java index 4bd5923a8d..69833cadcf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java @@ -106,7 +106,7 @@ protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistrie isOff = pTag.getBoolean("isOff"); ticksToConsume = pTag.getInt("ticksToConsume"); if(pTag.contains("lastConsumedPotion")){ - lastConsumedPotion = ANCodecs.decode(PotionContents.CODEC, pTag.getCompound("lastConsumedPotion")); + lastConsumedPotion = ANCodecs.decode(pRegistries, PotionContents.CODEC, pTag.getCompound("lastConsumedPotion")); } } @@ -119,7 +119,7 @@ public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { tag.putBoolean("isOff", isOff); tag.putInt("ticksToConsume", ticksToConsume); if(lastConsumedPotion != null){ - tag.put("lastConsumedPotion", ANCodecs.encode(PotionContents.CODEC, lastConsumedPotion)); + tag.put("lastConsumedPotion", ANCodecs.encode(pRegistries, PotionContents.CODEC, lastConsumedPotion)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java index eadd0f0c1d..46ce2ef2f9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionJarTile.java @@ -126,7 +126,7 @@ public void getTooltip(List tooltip) { protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.loadAdditional(tag, pRegistries); if(tag.contains("potionData")) - this.data = ANCodecs.decode(PotionContents.CODEC, tag.get("potionData")); + this.data = ANCodecs.decode(pRegistries, PotionContents.CODEC, tag.get("potionData")); this.isLocked = tag.getBoolean("locked"); this.currentFill = tag.getInt("currentFill"); } @@ -134,7 +134,7 @@ protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries @Override public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); - tag.put("potionData", ANCodecs.encode(PotionContents.CODEC, this.data)); + tag.put("potionData", ANCodecs.encode(pRegistries, PotionContents.CODEC, this.data)); tag.putBoolean("locked", this.isLocked); tag.putInt("currentFill", this.currentFill); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java index 2f17e788a2..a12e2347e0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java @@ -269,7 +269,7 @@ public BlockPos groundBlock(boolean ignoreAir) { try { blockentity.loadWithComponents(this.blockData, level.registryAccess()); if (blockentity instanceof SkullBlockEntity sk && this.blockData != null && this.blockData.contains("SkullOwner")) { - sk.setOwner(ANCodecs.decode(ResolvableProfile.CODEC, this.blockData.getCompound("SkullOwner"))); + sk.setOwner(ANCodecs.decode(level.registryAccess(), ResolvableProfile.CODEC, this.blockData.getCompound("SkullOwner"))); } } catch (Exception exception) { exception.printStackTrace(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java index f27009ab57..3a4869f2b6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyPotionBehavior.java @@ -119,7 +119,7 @@ public void getTooltip(Consumer tooltip) { @Override public CompoundTag toTag(CompoundTag tag) { if (heldPotion != null) { - tag.put("potionData", ANCodecs.encode(PotionContents.CODEC, heldPotion)); + tag.put("potionData", ANCodecs.encode(starbuncle.level.registryAccess(), PotionContents.CODEC, heldPotion)); } tag.putInt("amount", amount); return super.toTag(tag); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java index d13e2d6d37..3762c5a006 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/ANCodecs.java @@ -6,6 +6,7 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.JsonOps; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; import net.minecraft.network.codec.StreamCodec; @@ -22,6 +23,10 @@ public class ANCodecs { Codec.FLOAT.fieldOf("y").forGetter(v -> v.y) ).apply(instance, Vec2::new)); + public static Tag encode(HolderLookup.Provider provider, Codec codec, T value){ + return codec.encodeStart(provider.createSerializationContext(NbtOps.INSTANCE), value).getOrThrow(); + } + public static Tag encode(Codec codec, T value){ return codec.encodeStart(NbtOps.INSTANCE, value).getOrThrow(); } @@ -30,6 +35,10 @@ public static T decode(Codec codec, Tag tag){ return codec.parse(NbtOps.INSTANCE, tag).getOrThrow(); } + public static T decode(HolderLookup.Provider provider, Codec codec, Tag tag){ + return codec.parse(provider.createSerializationContext(NbtOps.INSTANCE), tag).getOrThrow(); + } + public static Optional decodeOptional(Codec codec, Tag tag){ return codec.parse(NbtOps.INSTANCE, tag).result(); } From 729bf278e0c73fd59a4e701a0ffb96ba06d24e9c Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 26 Aug 2024 22:28:59 -0500 Subject: [PATCH 161/363] Fix infinite flight ritual --- .../arsnouveau/common/network/PacketUpdateFlight.java | 3 +-- .../hollingsworth/arsnouveau/common/ritual/RitualFlight.java | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateFlight.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateFlight.java index cd865dd8e3..9e29eabd51 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateFlight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateFlight.java @@ -35,8 +35,7 @@ public PacketUpdateFlight(boolean canFly, boolean wasFlying) { @Override public void onClientReceived(Minecraft minecraft, Player player) { - ArsNouveau.proxy.getPlayer().getAbilities().mayfly = canFly; - ArsNouveau.proxy.getPlayer().getAbilities().flying = wasFlying; + } public static final Type TYPE = new Type<>(ArsNouveau.prefix("update_flight")); public static final StreamCodec CODEC = StreamCodec.ofMember(PacketUpdateFlight::toBytes, PacketUpdateFlight::new); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualFlight.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualFlight.java index d0bebee5fe..6e03402d73 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualFlight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualFlight.java @@ -53,8 +53,6 @@ public boolean applyEffect(ServerPlayer player) { boolean wasFlying = player.abilities.flying; boolean applied = super.applyEffect(player); if (applied) { - player.abilities.mayfly = true; - player.abilities.flying = wasFlying; Networking.sendToPlayerClient(new PacketUpdateFlight(true, wasFlying), player); } return applied; From 0b8ff53258e8ea882efe163d6eb004986b3029a7 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 26 Aug 2024 22:35:01 -0500 Subject: [PATCH 162/363] Fix crash with dispel --- gradle.properties | 2 +- .../arsnouveau/common/crafting/recipes/DispelEntityRecipe.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 1dd2da2526..c165e12529 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.0.10 +mod_version=5.0.11 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DispelEntityRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DispelEntityRecipe.java index 8b36b437e2..6f42bd5357 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DispelEntityRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DispelEntityRecipe.java @@ -28,6 +28,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Optional; public record DispelEntityRecipe(EntityType entity, ResourceLocation lootTable, LootItemCondition[] conditions) implements SpecialSingleInputRecipe { @@ -38,7 +39,7 @@ public boolean matches(LivingEntity killer, Entity victim) { LootParams params = getLootParams(killer, victim); LootContext context = new LootContext.Builder(params) - .create(null); + .create(Optional.empty()); return Arrays.stream(conditions).allMatch(condition -> condition.test(context)); } From b02a87faf84f007b11dc21c907bcfd687a7f1b9c Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 28 Aug 2024 22:29:35 -0500 Subject: [PATCH 163/363] Fix crash with amethyst golem --- .../entity/pathfinding/MinecoloniesAdvancedPathNavigate.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/MinecoloniesAdvancedPathNavigate.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/MinecoloniesAdvancedPathNavigate.java index 7cc36d8137..014b2da9f2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/MinecoloniesAdvancedPathNavigate.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/pathfinding/MinecoloniesAdvancedPathNavigate.java @@ -280,6 +280,9 @@ public PathResult moveToClosestPosition(List positions, double speedFa @Override public boolean tryMoveToBlockPos(final BlockPos pos, final double speedFactor) { + if(pos == null){ + return false; + } moveToXYZ(pos.getX(), pos.getY(), pos.getZ(), speedFactor); return true; } From ec8398ac27e3734c11045d91ede9e3b913509cb0 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 28 Aug 2024 23:25:53 -0500 Subject: [PATCH 164/363] Fix infinite loop with lecterns #1401 --- .../common/block/tile/StorageLecternTile.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java index 9ad70c4bc9..fb3ed8fe13 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java @@ -229,6 +229,10 @@ public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable Dir if (storedPos == null || level == null) { return; } + BlockEntity tile = level.getBlockEntity(storedPos); + if(tile instanceof StorageLecternTile newMasterLectern){ + return; + } IItemHandler handler = level.getCapability(Capabilities.ItemHandler.BLOCK, storedPos, side); if (handler == null) { @@ -239,6 +243,9 @@ public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable Dir PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.storage.inv_too_far")); return; } + if(this.getBlockPos().equals(storedPos)){ + return; + } if (this.connectedInventories.contains(storedPos)) { PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.storage.removed")); @@ -261,10 +268,7 @@ public void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @Nullable Di if (storedPos == null || storedPos.equals(worldPosition) || level == null) { return; } - BlockEntity tile = level.getBlockEntity(storedPos); - if (!(tile instanceof StorageLecternTile)) { - return; - } + if (BlockUtil.distanceFrom(storedPos, worldPosition) > 30) { PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.storage.lectern_too_far")); return; @@ -546,6 +550,9 @@ public void getTooltip(List tooltip) { } List modifiables = new ArrayList<>(); for (BlockPos pos : lecternTile.connectedInventories) { + if (pos.equals(this.getBlockPos())) { + continue; + } BlockEntity invTile = lecternTile.level.getBlockEntity(pos); if (invTile != null) { IItemHandler lih = level.getCapability(Capabilities.ItemHandler.BLOCK, pos, null); From fcb424d0803c5c97751e84b58efce24111f5c7f6 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 28 Aug 2024 23:26:42 -0500 Subject: [PATCH 165/363] 5.0.12 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index c165e12529..20a3691bfc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.0.11 +mod_version=5.0.12 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 39b3139bd37ea607fc0d8a2d8d8fd0c565fcf6bb Mon Sep 17 00:00:00 2001 From: Jarva <4622609+Jarva@users.noreply.github.com> Date: Sat, 7 Sep 2024 20:08:38 +0100 Subject: [PATCH 166/363] fix: update dispel entity registry access (#1405) --- .../common/crafting/recipes/DispelEntityRecipe.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DispelEntityRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DispelEntityRecipe.java index 6f42bd5357..4c53ec2506 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DispelEntityRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/DispelEntityRecipe.java @@ -7,6 +7,7 @@ import net.minecraft.core.registries.Registries; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -63,8 +64,7 @@ public List result(LivingEntity killer, Entity victim) { LootParams params = getLootParams(killer, victim); - LootTable lootTable = killer.level().registryAccess().registryOrThrow(Registries.LOOT_TABLE).get(lootTable()); - + LootTable lootTable = killer.level().getServer().reloadableRegistries().getLootTable(ResourceKey.create(Registries.LOOT_TABLE, lootTable())); return lootTable.getRandomItems(params); } From d329e699b2a0f89764e4a19bb7529a0b7fcad826 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 7 Sep 2024 14:17:22 -0500 Subject: [PATCH 167/363] Fix cosmetic item serializing as empty --- .../arsnouveau/common/items/data/StarbuncleCharmData.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java index 309777726c..132fb8264b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/StarbuncleCharmData.java @@ -38,7 +38,7 @@ public class StarbuncleCharmData implements NBTComponent, T Codec.STRING.optionalFieldOf("color", DyeColor.ORANGE.getName()).forGetter(StarbuncleCharmData::getColor), // Block.CODEC.fieldOf("path").forGetter(data -> data.pathBlock), BlockPos.CODEC.optionalFieldOf("bed").forGetter(StarbuncleCharmData::getBedPos), - ItemStack.CODEC.optionalFieldOf("cosmetic").forGetter(StarbuncleCharmData::getCosmetic), + ItemStack.OPTIONAL_CODEC.optionalFieldOf("cosmetic").forGetter(StarbuncleCharmData::getCosmetic), ResourceLocation.CODEC.optionalFieldOf("behavior", StarbyTransportBehavior.TRANSPORT_ID).forGetter(StarbuncleCharmData::getBehavior), CompoundTag.CODEC.optionalFieldOf("behaviorTag", new CompoundTag()).forGetter(StarbuncleCharmData::getBehaviorTag), Codec.STRING.optionalFieldOf("adopter", "").forGetter(StarbuncleCharmData::getAdopter), From caade90c3cdf351d90f433852defd95da73a1a49 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 7 Sep 2024 14:21:22 -0500 Subject: [PATCH 168/363] Readd storage quartz tag --- .../.cache/5c9e5647706b386caccf0aef27efaa68965030b8 | 3 ++- .../resources/data/c/tags/item/storage_blocks/quartz.json | 5 +++++ .../arsnouveau/common/datagen/ItemTagProvider.java | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 src/generated/resources/data/c/tags/item/storage_blocks/quartz.json diff --git a/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 b/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 index 1ab187d143..2811207f54 100644 --- a/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 +++ b/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 @@ -1,4 +1,4 @@ -// 1.21.1 2024-08-17T10:54:39.1951343 Tags for minecraft:item mod id ars_nouveau +// 1.21.1 2024-09-07T14:19:18.6385251 Tags for minecraft:item mod id ars_nouveau bde6ca31173d1f22d5f6fe355dc90c9faa35b239 data/ars_nouveau/tags/item/golem/shard.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/item/interact_jar_blacklist.json a0800fbffa0e00aecb2e86a1e991d42904427191 data/ars_nouveau/tags/item/magic_food.json @@ -28,6 +28,7 @@ a350e3112294fc7f7f26561673046c76017f3198 data/c/tags/item/music_discs.json f898aac12b01b598949701b1f6e45aa0cd1d9a25 data/c/tags/item/planks/archwood.json 3737e6b65e87993bd971b233c3aca5088721eb32 data/c/tags/item/seeds.json 6febc815f11d70abf442be0be941a9132ddd072d data/c/tags/item/storage_blocks.json +fbb0fe25e25b7fd86df64c2f168425efedf11710 data/c/tags/item/storage_blocks/quartz.json 6febc815f11d70abf442be0be941a9132ddd072d data/c/tags/item/storage_blocks/source.json 46865d605d1c44b2ab5023e21848213c969eec08 data/c/tags/item/tools/bow.json d856556e7a50694e4fafc11b5b85240ad831548b data/c/tags/item/tools/crossbow.json diff --git a/src/generated/resources/data/c/tags/item/storage_blocks/quartz.json b/src/generated/resources/data/c/tags/item/storage_blocks/quartz.json new file mode 100644 index 0000000000..9d2533c64a --- /dev/null +++ b/src/generated/resources/data/c/tags/item/storage_blocks/quartz.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:quartz_block" + ] +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java index 68e7b55647..a8f2503f6b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java @@ -41,6 +41,7 @@ public ItemTagProvider(PackOutput output, CompletableFuture Date: Sat, 7 Sep 2024 14:32:41 -0500 Subject: [PATCH 169/363] Add agronomic to the pickaxe tag --- .../resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 | 4 ++-- .../resources/data/minecraft/tags/block/mineable/pickaxe.json | 1 + .../arsnouveau/common/datagen/BlockTagProvider.java | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 index cd25d6bd5e..abde975aad 100644 --- a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 +++ b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 @@ -1,4 +1,4 @@ -// 1.21.1 2024-08-17T10:54:39.1926117 AN tags +// 1.21.1 2024-09-07T14:24:45.6687963 AN tags 939cde8f97e4e8d7ea8445415522f703b2b927d4 data/ars_nouveau/tags/block/an_decorative.json de95bc21249101b079255a1a00274f60d55e0602 data/ars_nouveau/tags/block/blazing_logs.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/block/break_blacklist.json @@ -45,7 +45,7 @@ da17a4d3113a940d3ad74c9d53bb9e561d800a66 data/minecraft/tags/block/logs.json da17a4d3113a940d3ad74c9d53bb9e561d800a66 data/minecraft/tags/block/logs_that_burn.json e8c6b8b119d79bc393cacf55b78f9847be95731a data/minecraft/tags/block/mineable/axe.json 09d25939216754a32aee1e0e3278aa55cc5b770c data/minecraft/tags/block/mineable/hoe.json -05a1fe2e7a67fb4d6bf6ebb18cdfc7e6353d6e8d data/minecraft/tags/block/mineable/pickaxe.json +64244edd8b8158a4fb1c4e1be3c9b10af2f36e08 data/minecraft/tags/block/mineable/pickaxe.json f898aac12b01b598949701b1f6e45aa0cd1d9a25 data/minecraft/tags/block/planks.json 5a18f153ac2947c6cea854e2fa5be21d85eb6766 data/minecraft/tags/block/portals.json ce9ccf92ade8cd330c990516ee0f8a30c35adea9 data/minecraft/tags/block/saplings.json diff --git a/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json index 6f7e97bcc2..5440f3f6dd 100644 --- a/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json @@ -38,6 +38,7 @@ "ars_nouveau:void_prism", "ars_nouveau:brazier_relay", "ars_nouveau:redstone_relay", + "ars_nouveau:agronomic_sourcelink", "ars_nouveau:sourcestone", "ars_nouveau:sourcestone_stairs", "ars_nouveau:sourcestone_slab", diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java index 0b93289136..f1efd60499 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java @@ -96,7 +96,8 @@ protected void addTags(HolderLookup.Provider pProvider) { BlockRegistry.MOB_JAR.get(), BlockRegistry.VOID_PRISM.get(), BlockRegistry.BRAZIER_RELAY.get(), - BlockRegistry.REDSTONE_RELAY.get() + BlockRegistry.REDSTONE_RELAY.get(), + BlockRegistry.AGRONOMIC_SOURCELINK.get() ); this.tag(BlockTags.MINEABLE_WITH_AXE).add( From 48efc86edaa265726326ba4cde3372648edc7c13 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 7 Sep 2024 14:33:10 -0500 Subject: [PATCH 170/363] Fix mage armor attributes not stacking --- .../arsnouveau/common/armor/AnimatedMagicArmor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java index 660d4c5945..5dc44b5da1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java @@ -116,8 +116,8 @@ public void inventoryTick(@NotNull ItemStack stack, @NotNull Level world, @NotNu modifiers = instance.getPerk().applyAttributeModifiers(modifiers, stack, instance.getSlot().value(), EquipmentSlotGroup.bySlot(this.type.getSlot())); } - modifiers = modifiers.withModifierAdded(PerkAttributes.MAX_MANA, new AttributeModifier(ArsNouveau.prefix("max_mana_armor"), 30 * (perkHolder.getTier() + 1), AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.bySlot(this.type.getSlot())); - modifiers = modifiers.withModifierAdded(PerkAttributes.MANA_REGEN_BONUS, new AttributeModifier(ArsNouveau.prefix("mana_regen_armor"), perkHolder.getTier() + 1, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.bySlot(this.type.getSlot())); + modifiers = modifiers.withModifierAdded(PerkAttributes.MAX_MANA, new AttributeModifier(ArsNouveau.prefix("max_mana_armor_" + this.type.getName()), 30 * (perkHolder.getTier() + 1), AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.bySlot(this.type.getSlot())); + modifiers = modifiers.withModifierAdded(PerkAttributes.MANA_REGEN_BONUS, new AttributeModifier(ArsNouveau.prefix("mana_regen_armor_" + this.type.getName()), perkHolder.getTier() + 1, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.bySlot(this.type.getSlot())); } return modifiers; } From fcc389221225c7559535bb31fa64c201bb8dec92 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 7 Sep 2024 14:50:07 -0500 Subject: [PATCH 171/363] Fix crash with enchanters crossbow, support potion arrows --- .../arsnouveau/common/items/SpellCrossbow.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java index 5fc796043a..f742623ea4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java @@ -111,7 +111,7 @@ private boolean tryLoadProjectiles(LivingEntity pShooter, ItemStack pCrossbowSta } ItemStack checkedAmmo = useAmmo(pCrossbowStack, ammoStack, pShooter, k > 0); if(!checkedAmmo.isEmpty()) { - stacks.add(useAmmo(pCrossbowStack, ammoStack, pShooter, k > 0)); + stacks.add(checkedAmmo); } } @@ -140,8 +140,8 @@ public void shootOne(Level worldIn, LivingEntity pShooter, InteractionHand pHand LivingCaster livingCaster = pShooter instanceof Player ? new PlayerCaster((Player)pShooter) : new LivingCaster(pShooter); AbstractCaster caster = getSpellCaster(pCrossbowStack); SpellResolver resolver = new SpellResolver(new SpellContext(worldIn, caster.modifySpellBeforeCasting(worldIn, pShooter, InteractionHand.MAIN_HAND, caster.getSpell()), pShooter, livingCaster, pCrossbowStack)); - if (pAmmoStack.getItem() == Items.ARROW && isSpell) { - projectile = buildSpellArrow(worldIn, pShooter, caster, pCrossbowStack); + if (isSpell) { + projectile = buildSpellArrow(worldIn, pShooter, caster, pCrossbowStack, pAmmoStack); ((EntitySpellArrow) projectile).pierceLeft += EnchantmentHelper.getTagEnchantmentLevel(worldIn.holderOrThrow(Enchantments.PIERCING), pCrossbowStack); }else if(pAmmoStack.getItem() instanceof SpellArrow && projectile instanceof EntitySpellArrow spellArrow){ spellArrow.pierceLeft += EnchantmentHelper.getTagEnchantmentLevel(worldIn.holderOrThrow(Enchantments.PIERCING), pCrossbowStack); @@ -206,8 +206,8 @@ public void performShooting(@NotNull Level pLevel, @NotNull LivingEntity pShoote return super.getAllSupportedProjectiles().or(i -> i.getItem() instanceof SpellArrow); } - public EntitySpellArrow buildSpellArrow(Level worldIn, LivingEntity playerentity, AbstractCaster caster, ItemStack bowStack) { - EntitySpellArrow spellArrow = new EntitySpellArrow(worldIn, playerentity, ItemStack.EMPTY, bowStack); + public EntitySpellArrow buildSpellArrow(Level worldIn, LivingEntity playerentity, AbstractCaster caster, ItemStack bowStack, ItemStack arrowStack) { + EntitySpellArrow spellArrow = new EntitySpellArrow(worldIn, playerentity, arrowStack, bowStack); spellArrow.spellResolver = new SpellResolver(new SpellContext(worldIn, caster.getSpell(), playerentity, LivingCaster.from(playerentity), playerentity.getMainHandItem())).withSilent(true); spellArrow.setColors(caster.getColor()); return spellArrow; From 1fecf27b6ba4aa2563b1f1d2be8d214a3da775cf Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 8 Sep 2024 11:40:06 -0500 Subject: [PATCH 172/363] fix category imports --- .../.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 ++-- .../client/jei/BuddingConversionRecipeCategory.java | 2 +- .../arsnouveau/client/jei/ScryRitualRecipeCategory.java | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 1df139161a..6c74024ddb 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-08-24T11:55:28.4361259 Languages: en_us for mod: ars_nouveau -5394c70508e342c35c33750bd806401a7e9c66d8 assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-09-08T11:38:02.5184971 Languages: en_us for mod: ars_nouveau +d9056e5cb3d748f4b61a4b045a3c0a00336610e6 assets/ars_nouveau/lang/en_us.json diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/BuddingConversionRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/BuddingConversionRecipeCategory.java index 69ce09bd1c..cba7d9a63d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/BuddingConversionRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/BuddingConversionRecipeCategory.java @@ -1,6 +1,6 @@ package com.hollingsworth.arsnouveau.client.jei; -import com.hollingsworth.arsnouveau.api.recipe.BuddingConversionRecipe; +import com.hollingsworth.arsnouveau.common.crafting.recipes.BuddingConversionRecipe; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ScryRitualRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ScryRitualRecipeCategory.java index b498f834d9..d927d2761a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ScryRitualRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ScryRitualRecipeCategory.java @@ -1,7 +1,8 @@ package com.hollingsworth.arsnouveau.client.jei; -import com.hollingsworth.arsnouveau.api.recipe.ScryRitualRecipe; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.registry.RitualRegistry; +import com.hollingsworth.arsnouveau.common.crafting.recipes.ScryRitualRecipe; import com.hollingsworth.arsnouveau.common.lib.RitualLib; import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; @@ -27,7 +28,7 @@ import java.util.List; public class ScryRitualRecipeCategory implements IRecipeCategory { - public static final ResourceLocation SCRY_RITUAL = new ResourceLocation("ars_nouveau", RitualLib.SCRYING); + public static final ResourceLocation SCRY_RITUAL = ArsNouveau.prefix(RitualLib.SCRYING); private final IDrawableAnimated arrow; public IDrawable background; public IDrawable icon; @@ -68,7 +69,7 @@ public void draw(ScryRitualRecipe recipe, @NotNull IRecipeSlotsView slotsView, @ public void setRecipe(IRecipeLayoutBuilder builder, ScryRitualRecipe recipe, IFocusGroup focuses) { List items = new ArrayList<>(); for (Holder blockHolder : BuiltInRegistries.BLOCK.getTagOrEmpty(recipe.highlight())) { - items.add(blockHolder.get().asItem().getDefaultInstance()); + items.add(blockHolder.value().asItem().getDefaultInstance()); } ItemStack[] stacks = items.toArray(new ItemStack[]{}); builder.addSlot(RecipeIngredientRole.OUTPUT, 120-16-6, 4).addIngredients(Ingredient.of(stacks)); From d16f0323089f3f270ae46d3316c9d248dc6c4046 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 8 Sep 2024 12:24:27 -0500 Subject: [PATCH 173/363] Fix merged inventories --- .../client/container/AbstractStorageTerminalScreen.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java index 0997aa52a6..f2f24869e9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java @@ -565,9 +565,11 @@ public void receive(CompoundTag tag) { if(tag.contains("tabs")){ ListTag tabs = tag.getList("tabs", 10); tabNames = new ArrayList<>(); - for(int i = 0;i < Math.min(tabs.size(), 12);i++){ - tabNames.add(tabs.getCompound(i).getString("name")); + Set nameSet = new HashSet<>(); + for(int i = 0; i < tabs.size(); i++){ + nameSet.add(tabs.getCompound(i).getString("name")); } + tabNames.addAll(new ArrayList<>(nameSet).subList(0, Math.min(nameSet.size(), 11))); Collections.sort(tabNames); } From 14605386b0be0aae453b3c1729d573540e8ccfe4 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 11 Sep 2024 19:04:32 -0500 Subject: [PATCH 174/363] Add item grate functionality --- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 +- .../a4c3c262a85f6a179e7e29128e8b31d4da806803 | 6 +- .../assets/ars_nouveau/lang/en_us.json | 4 + .../models/item/archwood_grate.json | 3 + .../ars_nouveau/models/item/gold_grate.json | 3 + .../models/item/smooth_sourcestone_grate.json | 3 + .../models/item/sourcestone_grate.json | 3 + .../hollingsworth/arsnouveau/ArsNouveau.java | 1 + .../container/CraftingTerminalMenu.java | 5 - .../client/container/IAutoFillTerminal.java | 3 - .../arsnouveau/common/block/ItemGrate.java | 151 ++++++++++++++++++ .../arsnouveau/common/block/RuneBlock.java | 17 +- .../common/datagen/ItemModelGenerator.java | 4 + .../common/datagen/LangDatagen.java | 4 + .../arsnouveau/common/lib/EntityTags.java | 4 +- .../arsnouveau/common/lib/LibBlockNames.java | 5 + .../common/mixin/BucketItemAccessor.java | 17 ++ .../setup/registry/BlockRegistry.java | 5 + src/main/resources/ars_nouveau.mixins.json | 1 + .../blockstates/archwood_grate.json | 29 ++++ .../ars_nouveau/blockstates/gold_grate.json | 29 ++++ .../blockstates/smooth_sourcestone_grate.json | 29 ++++ .../blockstates/sourcestone_grate.json | 29 ++++ .../models/block/archwood_grate.json | 57 +++++++ .../ars_nouveau/models/block/gold_grate.json | 57 +++++++ .../block/smooth_sourcestone_grate.json | 57 +++++++ .../models/block/sourcestone_grate.json | 57 +++++++ .../textures/block/grate_archwood.png | Bin 0 -> 600 bytes .../ars_nouveau/textures/block/grate_gold.png | Bin 0 -> 621 bytes .../block/grate_smooth_sourcestone.png | Bin 0 -> 577 bytes .../textures/block/grate_sourcestone.png | Bin 0 -> 579 bytes 31 files changed, 565 insertions(+), 22 deletions(-) create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/archwood_grate.json create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/gold_grate.json create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/smooth_sourcestone_grate.json create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/sourcestone_grate.json create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/block/ItemGrate.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/mixin/BucketItemAccessor.java create mode 100644 src/main/resources/assets/ars_nouveau/blockstates/archwood_grate.json create mode 100644 src/main/resources/assets/ars_nouveau/blockstates/gold_grate.json create mode 100644 src/main/resources/assets/ars_nouveau/blockstates/smooth_sourcestone_grate.json create mode 100644 src/main/resources/assets/ars_nouveau/blockstates/sourcestone_grate.json create mode 100644 src/main/resources/assets/ars_nouveau/models/block/archwood_grate.json create mode 100644 src/main/resources/assets/ars_nouveau/models/block/gold_grate.json create mode 100644 src/main/resources/assets/ars_nouveau/models/block/smooth_sourcestone_grate.json create mode 100644 src/main/resources/assets/ars_nouveau/models/block/sourcestone_grate.json create mode 100644 src/main/resources/assets/ars_nouveau/textures/block/grate_archwood.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/block/grate_gold.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/block/grate_smooth_sourcestone.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/block/grate_sourcestone.png diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 6c74024ddb..98f2919585 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-09-08T11:38:02.5184971 Languages: en_us for mod: ars_nouveau -d9056e5cb3d748f4b61a4b045a3c0a00336610e6 assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-09-11T19:04:10.5915771 Languages: en_us for mod: ars_nouveau +09067ef6754c05eb01a436a854e3cbd47b635afe assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 index 01c776254c..3cb2ea17ea 100644 --- a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 +++ b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 @@ -1,7 +1,8 @@ -// 1.21.1 2024-08-17T10:54:39.1793029 Ars Nouveau Item Models +// 1.21.1 2024-09-11T18:52:56.3761641 Ars Nouveau Item Models 11ee554b11a3a830e89b742762e5b754c2ecb5ee assets/ars_nouveau/models/item/agronomic_sourcelink.json 339a05323ebef7efc5c70db708a2e7a24708e9bc assets/ars_nouveau/models/item/alchemical_sourcelink.json a0214090201827dd5f954d0b33e64e4df6e53764 assets/ars_nouveau/models/item/alchemists_crown.json +8587f05b17902c512f27c3eecf7a1a6319709f51 assets/ars_nouveau/models/item/archwood_grate.json 89e2e712ca344bff16882883d45b8e62536ea0d5 assets/ars_nouveau/models/item/archwood_sconce.json f9eb0905e283cab647712716770a244a1bdb25f0 assets/ars_nouveau/models/item/bastion_pod.json 84bdd95fc8506c6d9054e5ffb87c24c20b2ae628 assets/ars_nouveau/models/item/blank_thread.json @@ -110,6 +111,7 @@ e211bc125e4638f3492319e443e345cbb07dbc41 assets/ars_nouveau/models/item/glyph_to 304273aade4aa3b0239c56b9890b898f13f6d50d assets/ars_nouveau/models/item/glyph_wall.json 60285e0e9d2f9e3c84be706235308e2c848f63ff assets/ars_nouveau/models/item/glyph_wind_shear.json 04551cfe2d701b382487417cf2ddafbc8cfb68cf assets/ars_nouveau/models/item/glyph_wither.json +b2ccbfa09498159ed4b45d3dc49963fdc5d4c1cd assets/ars_nouveau/models/item/gold_grate.json 1ea37799aba1357a8fc65398b71a5d1738e9e6af assets/ars_nouveau/models/item/greater_experience_gem.json 8a3874b48013ee67b3d362bb9b7974924c5898d0 assets/ars_nouveau/models/item/green_sbed.json 486511474b99fb4803c0781259ef5620ac0b5adf assets/ars_nouveau/models/item/item_detector.json @@ -175,6 +177,7 @@ e96426ff495c3c5a488fd0c5705848aec822ba67 assets/ars_nouveau/models/item/smooth_g 758d09c378b1bc5929654b1dca8b08b05242a3ec assets/ars_nouveau/models/item/smooth_sourcestone_basketweave.json f71ffd937f1b69765271603f84794b491d8581bc assets/ars_nouveau/models/item/smooth_sourcestone_basketweave_slab.json 7fe2c5ef8b790627896b18484c9c7c58b18d0b40 assets/ars_nouveau/models/item/smooth_sourcestone_basketweave_stairs.json +57514403cbe8466c76ddfce26d3abf6efc3e19bf assets/ars_nouveau/models/item/smooth_sourcestone_grate.json 8c50cfe4e081f82f438c0df110939a2917e13c53 assets/ars_nouveau/models/item/smooth_sourcestone_large_bricks.json 2faa92efc5a22484ed4e38fc0cace3100db61e72 assets/ars_nouveau/models/item/smooth_sourcestone_large_bricks_slab.json da9f27fe432242ef7cc20775a962af384f3c8ea4 assets/ars_nouveau/models/item/smooth_sourcestone_large_bricks_stairs.json @@ -194,6 +197,7 @@ be3360cf360f91a63f92fc91cebe45839ad54849 assets/ars_nouveau/models/item/sourcest e14755cd9537696c6c53c2a4f06e389ec24ce325 assets/ars_nouveau/models/item/sourcestone_basketweave.json bd573dd3910a1b6c42392af7c32bb56e023e483d assets/ars_nouveau/models/item/sourcestone_basketweave_slab.json 90058293228062fee79eca67d0286b8f03707478 assets/ars_nouveau/models/item/sourcestone_basketweave_stairs.json +f714074cacf3eaf5296611f7b04ef08e1c003eb4 assets/ars_nouveau/models/item/sourcestone_grate.json b889117827370fae1dad4e2ba50b488ce64cd04e assets/ars_nouveau/models/item/sourcestone_large_bricks.json 1848731d5f7e9298bfcfbe78b76cf4e346657e10 assets/ars_nouveau/models/item/sourcestone_large_bricks_slab.json a0cbe40039bd177a44c304b6f7bc183a44bd1fc3 assets/ars_nouveau/models/item/sourcestone_large_bricks_stairs.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 26afd6a9d8..6978cca537 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -953,6 +953,7 @@ "block.ars_nouveau.archwood_door": "Archwood Door", "block.ars_nouveau.archwood_fence": "Archwood Fence", "block.ars_nouveau.archwood_fence_gate": "Archwood Fence Gate", + "block.ars_nouveau.archwood_grate": "Archwood Grate", "block.ars_nouveau.archwood_planks": "Archwood Planks", "block.ars_nouveau.archwood_pressure_plate": "Archwood Pressure Plate", "block.ars_nouveau.archwood_sconce": "Archwood Sconce", @@ -990,6 +991,7 @@ "block.ars_nouveau.gilded_sourcestone_small_bricks": "Gilded Sourcestone: Small Bricks", "block.ars_nouveau.gilded_sourcestone_small_bricks_slab": "Gilded Sourcestone: Small Bricks Slab", "block.ars_nouveau.gilded_sourcestone_small_bricks_stairs": "Gilded Sourcestone: Small Bricks Stairs", + "block.ars_nouveau.gold_grate": "Gold Grate", "block.ars_nouveau.green_archwood_leaves": "Flourishing Archwood Leaves", "block.ars_nouveau.green_archwood_log": "Flourishing Archwood Log", "block.ars_nouveau.green_archwood_sapling": "Flourishing Archwood Sapling", @@ -1063,6 +1065,7 @@ "block.ars_nouveau.smooth_sourcestone_basketweave": "Smooth Sourcestone: Basketweave", "block.ars_nouveau.smooth_sourcestone_basketweave_slab": "Smooth Sourcestone: Basketweave Slab", "block.ars_nouveau.smooth_sourcestone_basketweave_stairs": "Smooth Sourcestone: Basketweave Stairs", + "block.ars_nouveau.smooth_sourcestone_grate": "Smooth Sourcestone Grate", "block.ars_nouveau.smooth_sourcestone_large_bricks": "Smooth Sourcestone: Large Bricks", "block.ars_nouveau.smooth_sourcestone_large_bricks_slab": "Smooth Sourcestone: Large Bricks Slab", "block.ars_nouveau.smooth_sourcestone_large_bricks_stairs": "Smooth Sourcestone: Large Bricks Stairs", @@ -1085,6 +1088,7 @@ "block.ars_nouveau.sourcestone_basketweave": "Sourcestone: Basketweave", "block.ars_nouveau.sourcestone_basketweave_slab": "Sourcestone: Basketweave Slab", "block.ars_nouveau.sourcestone_basketweave_stairs": "Sourcestone: Basketweave Stairs", + "block.ars_nouveau.sourcestone_grate": "Sourcestone Grate", "block.ars_nouveau.sourcestone_large_bricks": "Sourcestone: Large Bricks", "block.ars_nouveau.sourcestone_large_bricks_slab": "Sourcestone: Large Bricks Slab", "block.ars_nouveau.sourcestone_large_bricks_stairs": "Sourcestone: Large Bricks Stairs", diff --git a/src/generated/resources/assets/ars_nouveau/models/item/archwood_grate.json b/src/generated/resources/assets/ars_nouveau/models/item/archwood_grate.json new file mode 100644 index 0000000000..b25e8d9577 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/archwood_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "ars_nouveau:block/archwood_grate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/models/item/gold_grate.json b/src/generated/resources/assets/ars_nouveau/models/item/gold_grate.json new file mode 100644 index 0000000000..8af51563b1 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/gold_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "ars_nouveau:block/gold_grate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/models/item/smooth_sourcestone_grate.json b/src/generated/resources/assets/ars_nouveau/models/item/smooth_sourcestone_grate.json new file mode 100644 index 0000000000..134e827fa8 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/smooth_sourcestone_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "ars_nouveau:block/smooth_sourcestone_grate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/models/item/sourcestone_grate.json b/src/generated/resources/assets/ars_nouveau/models/item/sourcestone_grate.json new file mode 100644 index 0000000000..91d3d2d541 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/sourcestone_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "ars_nouveau:block/sourcestone_grate" +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java index 8652da60d0..e4caeca201 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java +++ b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java @@ -85,6 +85,7 @@ public ArsNouveau(IEventBus modEventBus, ModContainer modContainer){ modEventBus.addListener((RegisterTicketControllersEvent e) ->{ e.register(ticketController); }); + ANCriteriaTriggers.init(); try { Thread thread = new Thread(Rewards::init); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java index f0f27fc299..490ed61e9c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java @@ -310,11 +310,6 @@ public void receive(HolderLookup.Provider reg, CompoundTag message) { } } - @Override - public void sendMessage(CompoundTag compound) { - - } - @Override public List getStoredItems() { return itemList; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/IAutoFillTerminal.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/IAutoFillTerminal.java index d14f4c2233..9b79a62333 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/IAutoFillTerminal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/IAutoFillTerminal.java @@ -1,7 +1,5 @@ package com.hollingsworth.arsnouveau.client.container; -import net.minecraft.nbt.CompoundTag; - import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -9,7 +7,6 @@ public interface IAutoFillTerminal { List updateSearch = new ArrayList<>(); - void sendMessage(CompoundTag compound); List getStoredItems(); static boolean hasSync() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ItemGrate.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ItemGrate.java new file mode 100644 index 0000000000..e0277a9b52 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ItemGrate.java @@ -0,0 +1,151 @@ +package com.hollingsworth.arsnouveau.common.block; + +import com.hollingsworth.arsnouveau.common.lib.EntityTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.EntityCollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +import javax.annotation.Nullable; +import java.util.Optional; + +public class ItemGrate extends ModBlock implements BucketPickup{ + protected static final VoxelShape BOTTOM_AABB = Block.box(0.0, 0.0, 0.0, 16.0, 3.0, 16.0); + protected static final VoxelShape TOP_AABB = Block.box(0.0, 13.0, 0.0, 16.0, 16.0, 16.0); + protected static final VoxelShape EAST_OPEN_AABB = Block.box(0.0, 0.0, 0.0, 3.0, 16.0, 16.0); + protected static final VoxelShape WEST_OPEN_AABB = Block.box(13.0, 0.0, 0.0, 16.0, 16.0, 16.0); + protected static final VoxelShape SOUTH_OPEN_AABB = Block.box(0.0, 0.0, 0.0, 16.0, 16.0, 3.0); + protected static final VoxelShape NORTH_OPEN_AABB = Block.box(0.0, 0.0, 13.0, 16.0, 16.0, 16.0); + + public ItemGrate() { + super(defaultProperties().noOcclusion()); + registerDefaultState(defaultBlockState().setValue(BlockStateProperties.FACING, Direction.NORTH)); + } + + @Override + protected ItemInteractionResult useItemOn(ItemStack pStack, BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHitResult) { + BlockState below = pLevel.getBlockState(pPos.below()); + BlockHitResult belowRes = new BlockHitResult(pHitResult.getLocation().add(0, -1, 0), pHitResult.getDirection(), pPos.below(), pHitResult.isInside()); + return below.useItemOn(pStack, pLevel, pPlayer, pHand, belowRes); + } + + + + @Override + protected InteractionResult useWithoutItem(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, BlockHitResult pHitResult) { + BlockState below = pLevel.getBlockState(pPos.below()); + return below.useWithoutItem(pLevel, pPlayer, new BlockHitResult(pHitResult.getLocation().add(0, -1, 0), pHitResult.getDirection(), pPos.below(), pHitResult.isInside())); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return this.defaultBlockState().setValue(BlockStateProperties.FACING, context.getNearestLookingDirection().getOpposite()); + } + + @Override + protected void tick(BlockState pState, ServerLevel pLevel, BlockPos pPos, RandomSource pRandom) { + super.tick(pState, pLevel, pPos, pRandom); + BlockState stateAbove = pLevel.getBlockState(pPos.above()); + BlockState stateBelow = pLevel.getBlockState(pPos.below()); + if( stateAbove.getFluidState().isSource()) { + if (stateBelow.getBlock() instanceof LiquidBlockContainer blockContainer && blockContainer.canPlaceLiquid(null, pLevel, pPos.below(), stateBelow, stateAbove.getFluidState().getType())) { + if(blockContainer.placeLiquid(pLevel, pPos.below(), stateBelow, stateAbove.getFluidState())){ + pLevel.setBlockAndUpdate(pPos.above(), Blocks.AIR.defaultBlockState()); + } + } else if (stateBelow.canBeReplaced()) { + pLevel.setBlockAndUpdate(pPos.below(), stateAbove); + pLevel.setBlockAndUpdate(pPos.above(), Blocks.AIR.defaultBlockState()); + } + } + } + + @Override + protected void neighborChanged(BlockState pState, Level pLevel, BlockPos pPos, Block pNeighborBlock, BlockPos pNeighborPos, boolean pMovedByPiston) { + super.neighborChanged(pState, pLevel, pPos, pNeighborBlock, pNeighborPos, pMovedByPiston); + if(!pLevel.isClientSide && pLevel.getBlockState(pPos.above()).getFluidState().isSource()){ + pLevel.scheduleTick(pPos, this, 10); + } + } + + @Override + protected VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + Direction direction = pState.getValue(BlockStateProperties.FACING); + if(direction == Direction.DOWN){ + return TOP_AABB; + }else if(direction == Direction.WEST){ + return WEST_OPEN_AABB; + }else if(direction == Direction.SOUTH){ + return SOUTH_OPEN_AABB; + }else if(direction == Direction.NORTH){ + return NORTH_OPEN_AABB; + }else if(direction == Direction.EAST){ + return EAST_OPEN_AABB; + } + return BOTTOM_AABB; + } + + @Override + protected VoxelShape getCollisionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + if(pContext instanceof EntityCollisionContext entityCollisionContext){ + var entity = entityCollisionContext.getEntity(); + if(entity == null || entity.getType().is(EntityTags.ITEM_GRATE_COLLIDE)){ + return super.getCollisionShape(pState, pLevel, pPos, pContext); + } + if(entity instanceof ItemEntity || entity instanceof Projectile || entity.getType().is(EntityTags.ITEM_GRATE_PASSABLE)){ + return Shapes.empty(); + } + } + return super.getCollisionShape(pState, pLevel, pPos, pContext); + } + + @Override + public BlockState rotate(BlockState state, Rotation rot) { + return state.setValue(BlockStateProperties.FACING, rot.rotate(state.getValue(BlockStateProperties.FACING))); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirrorIn) { + return state.rotate(mirrorIn.getRotation(state.getValue(BlockStateProperties.FACING))); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(BlockStateProperties.FACING); + } + + @Override + public ItemStack pickupBlock(@Nullable Player pPlayer, LevelAccessor pLevel, BlockPos pPos, BlockState pState) { + BlockState belowState = pLevel.getBlockState(pPos.below()); + if(belowState.getBlock() instanceof BucketPickup bucketPickup){ + return bucketPickup.pickupBlock(pPlayer, pLevel, pPos.below(), belowState); + } + return ItemStack.EMPTY; + } + + @Override + public Optional getPickupSound() { + return Optional.empty(); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RuneBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RuneBlock.java index 338ed6b6af..feaf71f76a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RuneBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RuneBlock.java @@ -19,7 +19,6 @@ import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntitySelector; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; @@ -57,12 +56,6 @@ public RuneBlock(BlockBehaviour.Properties properties) { super(properties); } - @Override - public void setPlacedBy(Level worldIn, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - super.setPlacedBy(worldIn, pos, state, placer, stack); - } - - @Nullable @Override public BlockState getStateForPlacement(BlockPlaceContext context) { @@ -98,10 +91,12 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level } + @Override public BlockState rotate(BlockState state, Rotation rot) { return state.setValue(BlockStateProperties.FACING, rot.rotate(state.getValue(BlockStateProperties.FACING))); } + @Override public BlockState mirror(BlockState state, Mirror mirrorIn) { return state.rotate(mirrorIn.getRotation(state.getValue(BlockStateProperties.FACING))); } @@ -162,6 +157,11 @@ public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, return shape; } + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(POWERED).add(FACING).add(FLOOR); + } + @Override public RenderShape getRenderShape(BlockState p_149645_1_) { return RenderShape.ENTITYBLOCK_ANIMATED; @@ -175,7 +175,4 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; public static final BooleanProperty FLOOR = BooleanProperty.create("floor"); public static final DirectionProperty FACING = BlockStateProperties.FACING; - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(POWERED).add(FACING).add(FLOOR); - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java index 1ade00732b..64787be661 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java @@ -121,6 +121,10 @@ protected void registerModels() { itemUnchecked(ItemsRegistry.JUMP_RING); getBuilder(LibBlockNames.SPELL_SENSOR).parent(BlockStatesDatagen.getUncheckedModel(LibBlockNames.SPELL_SENSOR)); getBuilder(LibBlockNames.SOURCEBERRY_SACK).parent(BlockStatesDatagen.getUncheckedModel(LibBlockNames.SOURCEBERRY_SACK)); + getBuilder(LibBlockNames.SOURCESTONE_GRATE).parent(BlockStatesDatagen.getUncheckedModel(LibBlockNames.SOURCESTONE_GRATE)); + getBuilder(LibBlockNames.ARCHWOOD_GRATE).parent(BlockStatesDatagen.getUncheckedModel(LibBlockNames.ARCHWOOD_GRATE)); + getBuilder(LibBlockNames.SMOOTH_SOURCESTONE_GRATE).parent(BlockStatesDatagen.getUncheckedModel(LibBlockNames.SMOOTH_SOURCESTONE_GRATE)); + getBuilder(LibBlockNames.GOLD_GRATE).parent(BlockStatesDatagen.getUncheckedModel(LibBlockNames.GOLD_GRATE)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 8693fd801c..347a41332b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -1291,6 +1291,10 @@ protected void addTranslations() { add(key + "_slab", val + " Slab"); add(key + "_stairs", val + " Stairs"); } + add("block.ars_nouveau.sourcestone_grate","Sourcestone Grate"); + add("block.ars_nouveau.gold_grate","Gold Grate"); + add("block.ars_nouveau.archwood_grate","Archwood Grate"); + add("block.ars_nouveau.smooth_sourcestone_grate","Smooth Sourcestone Grate"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/EntityTags.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/EntityTags.java index b5cec7f8f9..1df5b83005 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/EntityTags.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/EntityTags.java @@ -2,7 +2,6 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.entity.EntityType; @@ -23,4 +22,7 @@ public class EntityTags { public static final TagKey> JAR_RELEASE_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "jar_release_blacklist")); public static final TagKey> ANIMAL_SUMMON_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "animal_summon_blacklist")); public static final TagKey> REWIND_BLACKLIST = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "rewind_blacklist")); + + public static final TagKey> ITEM_GRATE_PASSABLE = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "item_grate_passable")); + public static final TagKey> ITEM_GRATE_COLLIDE = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "item_grate_collide")); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibBlockNames.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibBlockNames.java index 3e8fc10e2b..e12cbdb1e8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibBlockNames.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibBlockNames.java @@ -80,6 +80,11 @@ public class LibBlockNames { public final static String SOURCESTONE_SCONCE = "sourcestone_sconce"; public final static String POLISHED_SCONCE = "polished_sconce"; public final static String ARCHWOOD_SCONCE = "archwood_sconce"; + public final static String SOURCESTONE_GRATE = "sourcestone_grate"; + public final static String SMOOTH_SOURCESTONE_GRATE = "smooth_sourcestone_grate"; + public final static String GOLD_GRATE = "gold_grate"; + public final static String ARCHWOOD_GRATE = "archwood_grate"; + public static final String SOURCESTONE = "sourcestone"; public static final String SOURCESTONE_MOSAIC = "sourcestone_mosaic"; public static final String SOURCESTONE_BASKET = "sourcestone_basketweave"; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/BucketItemAccessor.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/BucketItemAccessor.java new file mode 100644 index 0000000000..0f03e494f7 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/BucketItemAccessor.java @@ -0,0 +1,17 @@ +package com.hollingsworth.arsnouveau.common.mixin; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import javax.annotation.Nullable; + +@Mixin(BucketItem.class) +public interface BucketItemAccessor { + @Invoker + boolean callCanBlockContainFluid(@Nullable Player player, Level worldIn, BlockPos posIn, BlockState blockstate); +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java index e42fee8e85..eefcf0f8e2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java @@ -188,6 +188,11 @@ public Supplier getRenderer() { public static BlockRegistryWrapper SOURCESTONE_SCONCE_BLOCK = registerBlockAndItem(LibBlockNames.SOURCESTONE_SCONCE, SconceBlock::new); public static BlockRegistryWrapper POLISHED_SCONCE_BLOCK = registerBlockAndItem(LibBlockNames.POLISHED_SCONCE, SconceBlock::new); public static BlockRegistryWrapper ARCHWOOD_SCONCE_BLOCK = registerBlockAndItem(LibBlockNames.ARCHWOOD_SCONCE, SconceBlock::new); + public static BlockRegistryWrapper SOURCESTONE_GRATE = registerBlockAndItem(LibBlockNames.SOURCESTONE_GRATE, ItemGrate::new); + public static BlockRegistryWrapper SMOOTH_SOURCESTONE_GRATE = registerBlockAndItem(LibBlockNames.SMOOTH_SOURCESTONE_GRATE, ItemGrate::new); + public static BlockRegistryWrapper GOLD_GRATE = registerBlockAndItem(LibBlockNames.GOLD_GRATE, ItemGrate::new); + public static BlockRegistryWrapper ARCHWOOD_GRATE = registerBlockAndItem(LibBlockNames.ARCHWOOD_GRATE, ItemGrate::new); + public static BlockRegistryWrapper MAGIC_FIRE = registerBlockAndItem(LibBlockNames.MAGIC_FIRE, () -> new MagicFire(BlockBehaviour.Properties.of().mapColor(MapColor.FIRE).replaceable().noCollission().instabreak().lightLevel((p_152607_) -> { return 15; }).sound(SoundType.WOOL).pushReaction(PushReaction.DESTROY), 1.0f)); diff --git a/src/main/resources/ars_nouveau.mixins.json b/src/main/resources/ars_nouveau.mixins.json index c94d090f00..7e32c78084 100644 --- a/src/main/resources/ars_nouveau.mixins.json +++ b/src/main/resources/ars_nouveau.mixins.json @@ -17,6 +17,7 @@ "light.LightEntityMixin" ], "mixins": [ + "BucketItemAccessor", "DamageSourceMixin", "LivingAccessor", "MobAccessor", diff --git a/src/main/resources/assets/ars_nouveau/blockstates/archwood_grate.json b/src/main/resources/assets/ars_nouveau/blockstates/archwood_grate.json new file mode 100644 index 0000000000..bcdb86fdb3 --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/blockstates/archwood_grate.json @@ -0,0 +1,29 @@ +{ + "variants": { + "facing=north": { + "model": "ars_nouveau:block/archwood_grate", + "x": 90 + }, + "facing=east": { + "model": "ars_nouveau:block/archwood_grate", + "x": 90, + "y": 90 + }, + "facing=west": { + "model": "ars_nouveau:block/archwood_grate", + "x": 90, + "y": 270 + }, + "facing=south": { + "model": "ars_nouveau:block/archwood_grate", + "x": 90, + "y": 180 + }, + "facing=up": { + "model": "ars_nouveau:block/archwood_grate" + },"facing=down": { + "model": "ars_nouveau:block/archwood_grate", + "x": 180 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/blockstates/gold_grate.json b/src/main/resources/assets/ars_nouveau/blockstates/gold_grate.json new file mode 100644 index 0000000000..963d6fc172 --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/blockstates/gold_grate.json @@ -0,0 +1,29 @@ +{ + "variants": { + "facing=north": { + "model": "ars_nouveau:block/gold_grate", + "x": 90 + }, + "facing=east": { + "model": "ars_nouveau:block/gold_grate", + "x": 90, + "y": 90 + }, + "facing=west": { + "model": "ars_nouveau:block/gold_grate", + "x": 90, + "y": 270 + }, + "facing=south": { + "model": "ars_nouveau:block/gold_grate", + "x": 90, + "y": 180 + }, + "facing=up": { + "model": "ars_nouveau:block/gold_grate" + },"facing=down": { + "model": "ars_nouveau:block/gold_grate", + "x": 180 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/blockstates/smooth_sourcestone_grate.json b/src/main/resources/assets/ars_nouveau/blockstates/smooth_sourcestone_grate.json new file mode 100644 index 0000000000..10552c75c7 --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/blockstates/smooth_sourcestone_grate.json @@ -0,0 +1,29 @@ +{ + "variants": { + "facing=north": { + "model": "ars_nouveau:block/smooth_sourcestone_grate", + "x": 90 + }, + "facing=east": { + "model": "ars_nouveau:block/smooth_sourcestone_grate", + "x": 90, + "y": 90 + }, + "facing=west": { + "model": "ars_nouveau:block/smooth_sourcestone_grate", + "x": 90, + "y": 270 + }, + "facing=south": { + "model": "ars_nouveau:block/smooth_sourcestone_grate", + "x": 90, + "y": 180 + }, + "facing=up": { + "model": "ars_nouveau:block/smooth_sourcestone_grate" + },"facing=down": { + "model": "ars_nouveau:block/smooth_sourcestone_grate", + "x": 180 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/blockstates/sourcestone_grate.json b/src/main/resources/assets/ars_nouveau/blockstates/sourcestone_grate.json new file mode 100644 index 0000000000..08a7cf4d9d --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/blockstates/sourcestone_grate.json @@ -0,0 +1,29 @@ +{ + "variants": { + "facing=north": { + "model": "ars_nouveau:block/sourcestone_grate", + "x": 90 + }, + "facing=east": { + "model": "ars_nouveau:block/sourcestone_grate", + "x": 90, + "y": 90 + }, + "facing=west": { + "model": "ars_nouveau:block/sourcestone_grate", + "x": 90, + "y": 270 + }, + "facing=south": { + "model": "ars_nouveau:block/sourcestone_grate", + "x": 90, + "y": 180 + }, + "facing=up": { + "model": "ars_nouveau:block/sourcestone_grate" + },"facing=down": { + "model": "ars_nouveau:block/sourcestone_grate", + "x": 180 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/models/block/archwood_grate.json b/src/main/resources/assets/ars_nouveau/models/block/archwood_grate.json new file mode 100644 index 0000000000..bb727994be --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/models/block/archwood_grate.json @@ -0,0 +1,57 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "render_type": "cutout", + "textures": { + "0": "ars_nouveau:block/grate_archwood", + "particle": "ars_nouveau:block/grate_archwood" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 3, 16], + "faces": { + "north": {"uv": [8, 0, 16, 1.5], "texture": "#0"}, + "east": {"uv": [8, 0, 16, 1.5], "texture": "#0"}, + "south": {"uv": [8, 0, 16, 1.5], "texture": "#0"}, + "west": {"uv": [8, 0, 16, 1.5], "texture": "#0"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "down": {"uv": [8, 8, 0, 0], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "head": { + "translation": [0, 13.5, 0] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/models/block/gold_grate.json b/src/main/resources/assets/ars_nouveau/models/block/gold_grate.json new file mode 100644 index 0000000000..194a3f8d47 --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/models/block/gold_grate.json @@ -0,0 +1,57 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "render_type": "cutout", + "textures": { + "0": "ars_nouveau:block/grate_gold", + "particle": "ars_nouveau:block/grate_gold" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 3, 16], + "faces": { + "north": {"uv": [8, 0, 16, 1.5], "texture": "#0"}, + "east": {"uv": [8, 0, 16, 1.5], "texture": "#0"}, + "south": {"uv": [8, 0, 16, 1.5], "texture": "#0"}, + "west": {"uv": [8, 0, 16, 1.5], "texture": "#0"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "down": {"uv": [8, 8, 0, 0], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "head": { + "translation": [0, 13.5, 0] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/models/block/smooth_sourcestone_grate.json b/src/main/resources/assets/ars_nouveau/models/block/smooth_sourcestone_grate.json new file mode 100644 index 0000000000..6ebac215db --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/models/block/smooth_sourcestone_grate.json @@ -0,0 +1,57 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "render_type": "cutout", + "textures": { + "0": "ars_nouveau:block/grate_smooth_sourcestone", + "particle": "ars_nouveau:block/grate_smooth_sourcestone" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 3, 16], + "faces": { + "north": {"uv": [8, 0, 16, 1.5], "texture": "#0"}, + "east": {"uv": [8, 0, 16, 1.5], "texture": "#0"}, + "south": {"uv": [8, 0, 16, 1.5], "texture": "#0"}, + "west": {"uv": [8, 0, 16, 1.5], "texture": "#0"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "down": {"uv": [8, 8, 0, 0], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "head": { + "translation": [0, 13.5, 0] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/models/block/sourcestone_grate.json b/src/main/resources/assets/ars_nouveau/models/block/sourcestone_grate.json new file mode 100644 index 0000000000..661d00b442 --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/models/block/sourcestone_grate.json @@ -0,0 +1,57 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "render_type": "cutout", + "textures": { + "0": "ars_nouveau:block/grate_sourcestone", + "particle": "ars_nouveau:block/grate_sourcestone" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 3, 16], + "faces": { + "north": {"uv": [8, 0, 16, 1.5], "texture": "#0"}, + "east": {"uv": [8, 0, 16, 1.5], "texture": "#0"}, + "south": {"uv": [8, 0, 16, 1.5], "texture": "#0"}, + "west": {"uv": [8, 0, 16, 1.5], "texture": "#0"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "down": {"uv": [8, 8, 0, 0], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "head": { + "translation": [0, 13.5, 0] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/textures/block/grate_archwood.png b/src/main/resources/assets/ars_nouveau/textures/block/grate_archwood.png new file mode 100644 index 0000000000000000000000000000000000000000..e3393f69638681a08efdb0d23cd059247e2e3081 GIT binary patch literal 600 zcmV-e0;m0nP)5gg5Pcg`f@BF1D82NzWe?SjC1`=}c zA-53H97+io$r8de(?dJUN-;fHKI)ycyPBOhZ$4JIb)PK5fMeINj8=%#6aZiu2I4eD z@l4;}^zZ*{_}`qbz>`G37xZ-TKyKY9Xeh3E@9E-!uFfM0JV}8k)q2zafhV8cd37Gq z*U?{l;nsbcHd<&*hp-F-0N~g)bi=j?JV~QTD0*^0mT4kR5?H2*o7+1~8!hy|d{P(d z>b-vT@|l_d)LK_!-!cs4d^8CKv+l`3j(M{a2>$NL0Tpew#a^7In9aw+v1I%C7xd@S^cw#7cn!%p-_i-?m1XZ;byNmAOeBEXTyNrGao4-Q@c0J3Zi z0O*Eo(USvG%KRf=ioh~jsmt|)$?!eBZ61Rz5AosK=bTaCNs7}HJ4r#DrqE}BPJ}KG zalNo}2Ksri#kL}#SF&FDS+-V@XW2SefN_$b8@5&9mLkA1a{l!kd#%%r1<7PMePytx zFPfb|a5rpn$_jB8?5qvlx=$Ppw;?;xJ42rfTsNf&ICc&1-khQ_9U|}~Id%=~kkRY} zf~Vs$TH)sQ4kt%_eEi-iPhc6XaJ{g>??G|2{`mO|0Mx!)_vz%QkNd~n%mKktZu^|h m=HpUtL4^txDpaUYp~4?Y1!@MQYN6Bs0000Px%CrLy>R9J=WRY7awP!Rr}?dBp47(q;hvdA8UrC8A0p8Xr~(w~r@A^im&YHz*t z(qqp;q0(*%g3we-SQ`j z!oURpD5{PyaIv~4+c%y4%7@P;aygbkH1E^m;hpSmgCJpb&9=qEJ3U=a$*~M_EF)fT zI`3G;fj=HVD^~D& ze~q%z!N>7M99UK__r1ENCV+S?D{-i(I)*`%{N(gXFl%pQCYXzZbHVT4$fV(06Ns305ortKOXFwcS#_t72@El zwT7rir>F-2$d_8e8<~_ZwFI!N?M?({{v-}AZ_wg5fxdwra}c$9!pX4=3IjLMR9h1W z0~hjLAQPd-9G?3}IIB%!2YG*W#I__>r_KY`OfLiJ|{!=Sl#wSK%k13+xI zyA7JY+~AK7RQI5OU@5o#o&NZB_vy`|J@h|ubqD+JxOw{5H00000NkvXX Hu0mjf9VH=k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ars_nouveau/textures/block/grate_smooth_sourcestone.png b/src/main/resources/assets/ars_nouveau/textures/block/grate_smooth_sourcestone.png new file mode 100644 index 0000000000000000000000000000000000000000..a42a0e0edab6482ba195fbfabe9ca65767c757ab GIT binary patch literal 577 zcmV-H0>1r;P)N;c08i9;-lOl{*$s&d2Qm@i#cXr;qnb{G;z9g${pxbF-w?9C|2>`%q8&GkA;-3D$ z?Ck$+_-xLXv|Xa~fnM&OY1o$p4aGJ8d%1h2b*M<%E=k+X)@A3V?H=8^4i){L{j(Rt zzNC3D!dv+jR@(pobUQ7Kms25amx9|H;X59gRuhp*VOmW*J}JzD5k7qUmR+o?_v*qt zQWHS7)|D`Z764#2xF%L$yqpRE zFs){`$A*hlAoPe%g~9T$6Ft%*B9&q`xTZ*@l^tgUIPyrPDCW9%VFCcQn+O0fUQUJY zc*M#u`AP(K`$KlQzVZFtXBvFE1l{-Wae}j?K*b64w?HRC_dWc1uyO|a zezC<)BA{2YUisTiltsSXM7aWtREqI(niXy(0xTovU(fODFYikWlF4xTs-U4SuEL4n zZYXog3UL>ltqq5LNgNHgAv@7KLw^^zZmOcu?X)ltMo@8*y?}bYnbdB7fbV!DZI>RO z6y6LbXHfvsc4-}|(qRM~52WHSsp?;_l&6l<#VV*Y3u@G;QKLqU8a4g`77TGlb|kJ4 P00000NkvXXu0mjfB+CmW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ars_nouveau/textures/block/grate_sourcestone.png b/src/main/resources/assets/ars_nouveau/textures/block/grate_sourcestone.png new file mode 100644 index 0000000000000000000000000000000000000000..546d47638cf4f9a8bc09137ddd0e34d79f48254e GIT binary patch literal 579 zcmV-J0=)f+P)fh5f^8XDM3i7;5=_2NVIu&Um8 zXr8DEpjxX+2*>h>WqNqN6U^GwbpXINTnX3qX&bHt8@skoGCkI8&V`nh1)_K@*x~H@ zhFAf1IvN_)85>6NTBs47ix(^pJK5ad{xhN^%`m&Zp(M>ZJFW>F58FAfQBn4SnK>Z6;BJ^~H-|@?ufqLF- zv9k!MmF(Jn_25p*D)OC_wE|4i4BK#36>cX2EFI>KOytSsPI9=WzpYQCA&G0)-JJ~@_0 zdnxhb Date: Wed, 11 Sep 2024 19:18:03 -0500 Subject: [PATCH 175/363] Grate docs and recipes --- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 +-- .../9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e | 10 +++++- .../e7c243f38c2b0774b1bff1a90ede0b19a4077240 | 3 +- .../assets/ars_nouveau/lang/en_us.json | 1 + .../en_us/entries/automation/grates.json | 21 ++++++++++++ .../recipes/misc/archwood_grate.json | 32 +++++++++++++++++++ .../advancement/recipes/misc/gold_grate.json | 32 +++++++++++++++++++ .../misc/smooth_sourcestone_grate.json | 32 +++++++++++++++++++ .../recipes/misc/sourcestone_grate.json | 32 +++++++++++++++++++ .../ars_nouveau/recipe/archwood_grate.json | 21 ++++++++++++ .../data/ars_nouveau/recipe/gold_grate.json | 21 ++++++++++++ .../recipe/smooth_sourcestone_grate.json | 21 ++++++++++++ .../ars_nouveau/recipe/sourcestone_grate.json | 21 ++++++++++++ .../common/datagen/LangDatagen.java | 1 + .../common/datagen/PatchouliProvider.java | 4 +++ .../common/datagen/RecipeDatagen.java | 31 ++++++++++++++++++ .../common/mixin/BucketItemAccessor.java | 17 ---------- src/main/resources/ars_nouveau.mixins.json | 1 - 18 files changed, 283 insertions(+), 22 deletions(-) create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/grates.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_grate.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gold_grate.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_grate.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_grate.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/archwood_grate.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/gold_grate.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_grate.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/sourcestone_grate.json delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/mixin/BucketItemAccessor.java diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 98f2919585..ac1ee938ae 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-09-11T19:04:10.5915771 Languages: en_us for mod: ars_nouveau -09067ef6754c05eb01a436a854e3cbd47b635afe assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-09-11T19:17:30.025056 Languages: en_us for mod: ars_nouveau +e4ad50c28dc93800ca3e63e6f8e791c2e9579169 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index 5fa64232b1..d283de5a9d 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,4 +1,4 @@ -// 1.21.1 2024-08-17T10:54:39.2056451 Recipes +// 1.21.1 2024-09-11T19:07:59.4064081 Recipes a76e5d9eef406841f56740535ec2afdd509de507 data/ars_nouveau/advancement/recipes/building_blocks/archwood_button.json 443515bb80018fbe37a128cb6849f5e818be315d data/ars_nouveau/advancement/recipes/building_blocks/archwood_door.json 4dfc3afae271aae8423d20dedb67dc601ff71fa0 data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence.json @@ -103,6 +103,7 @@ f2dff2e9a6bfcc46831335dca3e7c9aab16d78a4 data/ars_nouveau/advancement/recipes/mi 41dffa0b4b8ae8d44847841f35db31dfbdb76109 data/ars_nouveau/advancement/recipes/misc/arcane_pedestal.json ac40320cca59dd0638b1b193d7914451f4f28039 data/ars_nouveau/advancement/recipes/misc/arcane_platform.json 184781612584160baf8103c9a056d7e4d9aece94 data/ars_nouveau/advancement/recipes/misc/archwood_chest.json +971d0c50e4a395391c1115a8fd96576ad89d6a10 data/ars_nouveau/advancement/recipes/misc/archwood_grate.json 8dbda63b9ccfeb5a9c92fdbe1200231e4e52eea2 data/ars_nouveau/advancement/recipes/misc/archwood_planks.json 2e416567343ab261eabe13203acd032ac550a3d0 data/ars_nouveau/advancement/recipes/misc/archwood_sconce.json 7a498e23b2bf3ee47abec88a833f894747134258 data/ars_nouveau/advancement/recipes/misc/archwood_stairs.json @@ -137,6 +138,7 @@ ba1b8a4c0e97363afc109a4be7effea8022519d1 data/ars_nouveau/advancement/recipes/mi 1f6485887ec84595cc337327b67521363dccafd5 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_mosaic_to_sourcestone.json 0d86f240a2082b164a10e625ce962797a48278cb data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_small_bricks_stairs.json 21a1edbc70d25bc82e638a9836727b1ba960d471 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_small_bricks_to_sourcestone.json +a4db3dfa291c9a22a82aaa409e747cd6e0399065 data/ars_nouveau/advancement/recipes/misc/gold_grate.json fb08def3440513871b80cc47607bd9c5f7f645e8 data/ars_nouveau/advancement/recipes/misc/greater_experience_gem.json 0c3e6e5c6de7eab2f5b766f1780384132ed3ae16 data/ars_nouveau/advancement/recipes/misc/green_archwood_wood.json 165804892abcc34d9c826c841312e896362c9d7f data/ars_nouveau/advancement/recipes/misc/green_sbed.json @@ -231,6 +233,7 @@ f10a0f4b647296be5469daa92e5b8b0f9c1445eb data/ars_nouveau/advancement/recipes/mi 71d5edf9dbcda39acf3bfb8a426f13b0d1cc917d data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_alternating_to_sourcestone.json 709175e4bf0c9f5f356ec5174d5aba25e3ed57af data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_basketweave_stairs.json 3b064766fc4f8eb4b694ca40d704de4fc9b4814a data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_basketweave_to_sourcestone.json +6ba7e9ee235b8cdc5285c906c161134fc657cd4c data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_grate.json 14ad843efe394c96211d275db8044cd88d23f0e5 data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_large_bricks_stairs.json b62bdc459f398a41f2dbe6a867a1165a7994f499 data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_large_bricks_to_sourcestone.json 8fba0b290f4a0f273bd6675039dd508e1838c99b data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_mosaic_stairs.json @@ -247,6 +250,7 @@ c26106da66b9864bc72422c85c8df751d6099c13 data/ars_nouveau/advancement/recipes/mi 75ec5bfd504ba4cbed8cc1b0ba32997e7222cbb7 data/ars_nouveau/advancement/recipes/misc/sourcestone_alternating_to_sourcestone.json c29a360fa70068e3c07167d5899c6242cf17029a data/ars_nouveau/advancement/recipes/misc/sourcestone_basketweave_stairs.json 4dd17377c1407da4fa499fa1495e1764fa80cda1 data/ars_nouveau/advancement/recipes/misc/sourcestone_basketweave_to_sourcestone.json +6eb159f75a1a9fcaff3e0091bb79ba552e597530 data/ars_nouveau/advancement/recipes/misc/sourcestone_grate.json e4717f22b89d122860734599e4f440959875f975 data/ars_nouveau/advancement/recipes/misc/sourcestone_large_bricks_stairs.json cf81a21d61397d5b78975991b9ad41e4830178d8 data/ars_nouveau/advancement/recipes/misc/sourcestone_large_bricks_to_sourcestone.json 7f258c667bd762ddd40f03d3fed4ccd1a6407d40 data/ars_nouveau/advancement/recipes/misc/sourcestone_mosaic_stairs.json @@ -291,6 +295,7 @@ b3b729af157d37ce8fd800f06eb9723237fa6fde data/ars_nouveau/recipe/arcane_platform 19ade102ab38051edba714910dc8f966d23d2ea2 data/ars_nouveau/recipe/archwood_door.json 145c3b2469019bda16df0cb8493ca735fbcde977 data/ars_nouveau/recipe/archwood_fence.json 035beb9e6e73ee4e88daded672e57b2d806be214 data/ars_nouveau/recipe/archwood_fence_gate.json +8eb9979d21387238fe2aff8664a014d4d5838114 data/ars_nouveau/recipe/archwood_grate.json 67f00645627dc667301f3e9a8e3b4d8808fa3994 data/ars_nouveau/recipe/archwood_planks.json 3b4decb139ef2bbc828c428eb13862980a763847 data/ars_nouveau/recipe/archwood_pressure_plate.json 2601d9a5a1a8028377d3916bdfa7b5da4657d6ce data/ars_nouveau/recipe/archwood_sconce.json @@ -342,6 +347,7 @@ bec69a8d002ea373314fc0393c84d8036d415c17 data/ars_nouveau/recipe/gilded_sourcest 077fadc7edaa58f40a873b955063b296f7c0607c data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stonecutter_stair.json c2460feccf67516df403a9abb8c832911390bf4c data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stone_cutterslab.json 29a297bd450b2f8df3a69bfe40bc0b75bee0ab55 data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_to_sourcestone.json +1003721c715ab7b1ef0925b89ba8e0db263a781f data/ars_nouveau/recipe/gold_grate.json 68145936a0efb8b3b80e5469df8cd52caf7c85d8 data/ars_nouveau/recipe/greater_experience_gem.json 47d30e1bdf7c9e8947c5fa5f0fd047567abf195d data/ars_nouveau/recipe/green_archwood_wood.json e54c68f5c220f3af8b9c996094a2ab213a05775e data/ars_nouveau/recipe/green_sbed.json @@ -457,6 +463,7 @@ de8804b81bb11ad699c118c674a5ec92e54f2e8f data/ars_nouveau/recipe/smooth_sourcest d0263bb0d14c77a757f1444371caff2686f3b335 data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stonecutter_stair.json 49d5eee984f3df841e993c5a2e9c616816a6cc8b data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stone_cutterslab.json 8a7130ffa41374909ef985ec4c1ec350d654f162 data/ars_nouveau/recipe/smooth_sourcestone_basketweave_to_sourcestone.json +e22e6c90716d11c7881b8bb53c14fb582ffef32b data/ars_nouveau/recipe/smooth_sourcestone_grate.json 400372944ed98be7d1b7cb5e1f5ae072bafbc63e data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_slab.json e18cc711473df298fe44a175b0c213098ee30c7e data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stairs.json 0f8d955c626ea38620e19169c0f1ef44efcebd7a data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stonecutter_stair.json @@ -512,6 +519,7 @@ d8987e3cd5b7933ddad2fa0f5f8eef4dc6c757af data/ars_nouveau/recipe/sourcestone_bas 75cc98a03d013ad872bad29c0e1fc2cc84de3fae data/ars_nouveau/recipe/sourcestone_basketweave_stonecutter_stair.json f7a36183332cee6b288bd113af0b38335c746e2b data/ars_nouveau/recipe/sourcestone_basketweave_stone_cutterslab.json 21e59abdf2bc5b18c2cdbcf84a7b08c00a586ead data/ars_nouveau/recipe/sourcestone_basketweave_to_sourcestone.json +e6a0d7a8e15d565b1ec0857e7805352e09b1c9f7 data/ars_nouveau/recipe/sourcestone_grate.json 4cdf9a8b4bde0f985a01d1b772323df62c5a214c data/ars_nouveau/recipe/sourcestone_large_bricks_slab.json 055ecd2a82200dbba5aae29e67953f824ae4d49a data/ars_nouveau/recipe/sourcestone_large_bricks_stairs.json 58271d6404ad2fcbf894a99c197bd5ed4f885d4c data/ars_nouveau/recipe/sourcestone_large_bricks_stonecutter_stair.json diff --git a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 index f0b0417482..940dd23467 100644 --- a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 +++ b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 @@ -1,4 +1,4 @@ -// 1.21.1 2024-08-17T10:54:39.1971324 Patchouli +// 1.21.1 2024-09-11T19:10:19.339699 Patchouli 2ec536fea831588201432d61d70af61385882054 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/alteration_table.json a82f4fc73946d228b1e3f5e03d0ecef46f33cdfb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/applying_perks.json 8ce1d8e886b45066bc5c1d9d8e87bdabbb27ae27 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor.json @@ -27,6 +27,7 @@ c365b920481cbe283c09f7b26cc070b6eb422cf9 assets/ars_nouveau/patchouli_books/worn c7d187c5baed53c4ddb63b6b6dc9ec9847c21a45 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/deny_scroll.json 7c468a3d4e1c4612edaa4f88af7704ea2d14b417 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/dominion_wand.json 6c48b4ea2dedda187ac31933c8d54e8c40744aff assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/drygmy_charm.json +f13c06f8bad4eea6dc04fe65a11e7dee635edcd7 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/grates.json 2aa6f0796e1c44db6a5f89ce86c71b51d30f55ab assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/mimic_scroll.json 8d8c1da8e10e4e6bdb2e372d9091d6520bb050ee assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/redstone_relay.json 269964459879bd2f251da0caecebfdd380dd3c77 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/spell_prism.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 6978cca537..e983880a1e 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -524,6 +524,7 @@ "ars_nouveau.page1.applying_perks": "Threads may be applied to armor using the Alteration Apparatus. Each piece of armor has a unique set of Thread Slots with their own variety of levels. Some Threads may require a Thread Slot of a minimum level, but many threads simply increase in power based on the slot they are given.", "ars_nouveau.page1.archwood": "Archwood Trees have a small chance to spawn in any biome, and come in four types. Rarely, you may stumble upon an Archwood Forest, a biome full of magical creatures, naturally spawning lights, and Archwood trees. Can be used as decoration, rituals, or for crafting wands.", "ars_nouveau.page1.archwood_forest": "The Archwood Forest is a somewhat rare biome filled with magical lights and archwood trees. It contains an increased amount of gold. Additionally, magical creatures such as Starbuncles, Whirlisprigs, Archwood Treants, and Drygmys have a much higher chance of spawning. Terrablender is required to be installed to generate this biome.", + "ars_nouveau.page1.archwood_grate": "Liquids placed on top of them will be transported below, waterlogging the below block if possible. Interacting with the grate will also act as if you are interacting with the block below it, allowing you to bucket liquids below. Additionally, items and projectiles will pass through it. Can be placed in any direction.", "ars_nouveau.page1.armor": "Magical robes will increase the wearers mana regen and can be upgraded with special abilities using Threads. The Sorceror's set provides the lowest defence, but provides the most powerful set of slots for Threads. The Arcanist's and Battlemage's sets provide increasingly more defence, but fewer and less powerful Thread Slots. For more information on Threads, see the section on Armor and Perks.", "ars_nouveau.page1.armor_upgrading": "Magical armor can be upgraded with Threads to provide additional effects. Each type of armor has a different number of slots, and those slots vary in size. Larger slots will increase the power of threads, and some threads require a slot of a certain size or larger. To apply threads, see the section on the Alteration Table.", "ars_nouveau.page1.basic_spell_turret": "Turrets can be used to cast spells when given a redstone signal, functioning like a dispenser. Turrets will accept spells that use Touch and Projectile. Spells may be set using an inscribed piece of Spell Parchment. In order to cast spells, turrets will draw source from nearby Source Jars. Turrets may use Item Pickup and Place Block as long as an inventory is placed adjacent to this block.", diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/grates.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/grates.json new file mode 100644 index 0000000000..e556c60ddf --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/grates.json @@ -0,0 +1,21 @@ +{ + "category": "ars_nouveau:automation", + "icon": "ars_nouveau:archwood_grate", + "name": "block.ars_nouveau.archwood_grate", + "pages": [ + { + "type": "patchouli:text", + "text": "ars_nouveau.page1.archwood_grate" + }, + { + "type": "patchouli:crafting", + "recipe": "ars_nouveau:archwood_grate", + "recipe2": "ars_nouveau:gold_grate" + }, + { + "type": "patchouli:crafting", + "recipe": "ars_nouveau:smooth_sourcestone_grate", + "recipe2": "ars_nouveau:sourcestone_grate" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_grate.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_grate.json new file mode 100644 index 0000000000..c077c8620c --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/archwood_grate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_journal": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ars_nouveau:archwood_grate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_journal" + ] + ], + "rewards": { + "recipes": [ + "ars_nouveau:archwood_grate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gold_grate.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gold_grate.json new file mode 100644 index 0000000000..2e089e3c37 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/gold_grate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_journal": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ars_nouveau:gold_grate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_journal" + ] + ], + "rewards": { + "recipes": [ + "ars_nouveau:gold_grate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_grate.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_grate.json new file mode 100644 index 0000000000..791536cec7 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_grate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_journal": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ars_nouveau:smooth_sourcestone_grate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_journal" + ] + ], + "rewards": { + "recipes": [ + "ars_nouveau:smooth_sourcestone_grate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_grate.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_grate.json new file mode 100644 index 0000000000..f6cbef7c39 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/sourcestone_grate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_journal": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ars_nouveau:sourcestone_grate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_journal" + ] + ], + "rewards": { + "recipes": [ + "ars_nouveau:sourcestone_grate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/archwood_grate.json b/src/generated/resources/data/ars_nouveau/recipe/archwood_grate.json new file mode 100644 index 0000000000..8a51df8c48 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/archwood_grate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "M": { + "tag": "c:logs/archwood" + }, + "g": { + "item": "minecraft:iron_bars" + } + }, + "pattern": [ + "ggg", + "gMg", + "ggg" + ], + "result": { + "count": 1, + "id": "ars_nouveau:archwood_grate" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/gold_grate.json b/src/generated/resources/data/ars_nouveau/recipe/gold_grate.json new file mode 100644 index 0000000000..98ccbbb5bf --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/gold_grate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "M": { + "tag": "c:ingots/gold" + }, + "g": { + "item": "minecraft:iron_bars" + } + }, + "pattern": [ + "ggg", + "gMg", + "ggg" + ], + "result": { + "count": 1, + "id": "ars_nouveau:gold_grate" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_grate.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_grate.json new file mode 100644 index 0000000000..a1de5b8d11 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_grate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "M": { + "item": "ars_nouveau:smooth_sourcestone" + }, + "g": { + "item": "minecraft:iron_bars" + } + }, + "pattern": [ + "ggg", + "gMg", + "ggg" + ], + "result": { + "count": 1, + "id": "ars_nouveau:smooth_sourcestone_grate" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/sourcestone_grate.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_grate.json new file mode 100644 index 0000000000..7cf47c5372 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_grate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "M": { + "item": "ars_nouveau:sourcestone" + }, + "g": { + "item": "minecraft:iron_bars" + } + }, + "pattern": [ + "ggg", + "gMg", + "ggg" + ], + "result": { + "count": 1, + "id": "ars_nouveau:sourcestone_grate" + } +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 347a41332b..7645a880b9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -1285,6 +1285,7 @@ protected void addTranslations() { add("ars_nouveau.empty","Empty"); add("ars_nouveau.melder.output_not_unique", "Output potion is not a unique mix."); add("ars_nouveau.melder.output_duplicate_effect", "Cannot mix potions with the same effect but different levels."); + add("ars_nouveau.page1.archwood_grate", "Liquids placed on top of them will be transported below, waterlogging the below block if possible. Interacting with the grate will also act as if you are interacting with the block below it, allowing you to bucket liquids below. Additionally, items and projectiles will pass through it. Can be placed in any direction."); for(String s : LibBlockNames.DECORATIVE_SOURCESTONE){ String key = "block.ars_nouveau." + s; String val = data.get(key); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java index e4ad716fd5..173a8f0c35 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java @@ -646,6 +646,10 @@ public void addEntries() { addPage(new PatchouliBuilder(AUTOMATION, BlockRegistry.SPELL_SENSOR).withLocalizedText().withPage(new ApparatusPage(BlockRegistry.SPELL_SENSOR)), getPath(AUTOMATION, "spell_sensor")); addPage(new PatchouliBuilder(EQUIPMENT, ItemsRegistry.JUMP_RING).withLocalizedText().withPage(new ApparatusPage(ItemsRegistry.JUMP_RING)), getPath(EQUIPMENT, "jump_ring")); addPage(new PatchouliBuilder(AUTOMATION, BlockRegistry.REDSTONE_RELAY).withLocalizedText().withPage(new CraftingPage(BlockRegistry.REDSTONE_RELAY)), getPath(AUTOMATION, "redstone_relay")); + + addPage(new PatchouliBuilder(AUTOMATION, BlockRegistry.ARCHWOOD_GRATE).withLocalizedText() + .withPage(new CraftingPage(BlockRegistry.ARCHWOOD_GRATE).withRecipe2(BlockRegistry.GOLD_GRATE)) + .withPage(new CraftingPage(BlockRegistry.SMOOTH_SOURCESTONE_GRATE).withRecipe2(BlockRegistry.SOURCESTONE_GRATE)), getPath(AUTOMATION, "grates")); } public String getLangPath(String name, int count) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java index ef461d0ce1..8eaad9491a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java @@ -735,6 +735,37 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .save(consumer); shapelessBuilder(BlockRegistry.SOURCEBERRY_SACK).requires(BlockRegistry.SOURCEBERRY_BUSH, 9).save(consumer); shapelessBuilder(BlockRegistry.SOURCEBERRY_BUSH, 9).requires(BlockRegistry.SOURCEBERRY_SACK).save(consumer, ArsNouveau.prefix( "sourceberry_sack_to_bush")); + + shapedBuilder(BlockRegistry.GOLD_GRATE) + .pattern("ggg") + .pattern("gMg") + .pattern("ggg") + .define('g', Items.IRON_BARS) + .define('M', Tags.Items.INGOTS_GOLD) + .save(consumer); + + shapedBuilder(BlockRegistry.ARCHWOOD_GRATE) + .pattern("ggg") + .pattern("gMg") + .pattern("ggg") + .define('g', Items.IRON_BARS) + .define('M', ARCHWOOD_LOG) + .save(consumer); + shapedBuilder(BlockRegistry.SOURCESTONE_GRATE) + .pattern("ggg") + .pattern("gMg") + .pattern("ggg") + .define('g', Items.IRON_BARS) + .define('M', SOURCESTONE) + .save(consumer); + shapedBuilder(BlockRegistry.SMOOTH_SOURCESTONE_GRATE) + .pattern("ggg") + .pattern("gMg") + .pattern("ggg") + .define('g', Items.IRON_BARS) + .define('M', BlockRegistry.getBlock(LibBlockNames.SMOOTH_SOURCESTONE)) + .save(consumer); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/BucketItemAccessor.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/BucketItemAccessor.java deleted file mode 100644 index 0f03e494f7..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/BucketItemAccessor.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.hollingsworth.arsnouveau.common.mixin; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.BucketItem; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import javax.annotation.Nullable; - -@Mixin(BucketItem.class) -public interface BucketItemAccessor { - @Invoker - boolean callCanBlockContainFluid(@Nullable Player player, Level worldIn, BlockPos posIn, BlockState blockstate); -} diff --git a/src/main/resources/ars_nouveau.mixins.json b/src/main/resources/ars_nouveau.mixins.json index 7e32c78084..c94d090f00 100644 --- a/src/main/resources/ars_nouveau.mixins.json +++ b/src/main/resources/ars_nouveau.mixins.json @@ -17,7 +17,6 @@ "light.LightEntityMixin" ], "mixins": [ - "BucketItemAccessor", "DamageSourceMixin", "LivingAccessor", "MobAccessor", From 1fa11108d891b70a38cf09f89ccf9b72dc9ae0c5 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 11 Sep 2024 20:37:25 -0500 Subject: [PATCH 176/363] Add source gem lamp --- .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 7 ++- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 +- .../9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e | 12 +++-- .../a4c3c262a85f6a179e7e29128e8b31d4da806803 | 3 +- .../e7c243f38c2b0774b1bff1a90ede0b19a4077240 | 3 +- .../assets/ars_nouveau/lang/en_us.json | 2 + .../ars_nouveau/models/item/source_lamp.json | 3 ++ .../en_us/entries/automation/source_lamp.json | 15 ++++++ .../advancement/recipes/misc/source_lamp.json | 32 +++++++++++++ .../loot_table/blocks/archwood_grate.json | 21 ++++++++ .../loot_table/blocks/gold_grate.json | 21 ++++++++ .../blocks/smooth_sourcestone_grate.json | 21 ++++++++ .../loot_table/blocks/source_lamp.json | 21 ++++++++ .../loot_table/blocks/sourcestone_grate.json | 21 ++++++++ .../ars_nouveau/recipe/archwood_grate.json | 4 +- .../data/ars_nouveau/recipe/gold_grate.json | 4 +- .../recipe/smooth_sourcestone_grate.json | 4 +- .../data/ars_nouveau/recipe/source_lamp.json | 24 ++++++++++ .../ars_nouveau/recipe/sourcestone_grate.json | 4 +- .../arsnouveau/common/block/SourceLamp.java | 45 ++++++++++++++++++ .../common/datagen/DefaultTableProvider.java | 5 ++ .../common/datagen/ItemModelGenerator.java | 1 + .../common/datagen/LangDatagen.java | 2 + .../common/datagen/PatchouliProvider.java | 1 + .../common/datagen/RecipeDatagen.java | 26 ++++++---- .../arsnouveau/common/lib/LibBlockNames.java | 1 + .../setup/registry/BlockRegistry.java | 1 + .../ars_nouveau/blockstates/source_lamp.json | 6 +++ .../ars_nouveau/models/block/source_lamp.json | 6 +++ .../models/block/source_lamp_on.json | 6 +++ .../textures/block/source_gem_lamp_off.png | Bin 0 -> 472 bytes .../textures/block/source_gem_lamp_on.png | Bin 0 -> 445 bytes 32 files changed, 300 insertions(+), 26 deletions(-) create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/source_lamp.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/source_lamp.json create mode 100644 src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_lamp.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_grate.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/gold_grate.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_grate.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/source_lamp.json create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_grate.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/source_lamp.json create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/block/SourceLamp.java create mode 100644 src/main/resources/assets/ars_nouveau/blockstates/source_lamp.json create mode 100644 src/main/resources/assets/ars_nouveau/models/block/source_lamp.json create mode 100644 src/main/resources/assets/ars_nouveau/models/block/source_lamp_on.json create mode 100644 src/main/resources/assets/ars_nouveau/textures/block/source_gem_lamp_off.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/block/source_gem_lamp_on.png diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d index eebf78b782..fa9da74b29 100644 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -1,4 +1,4 @@ -// 1.21.1 2024-08-17T10:54:39.1657699 Loot Tables +// 1.21.1 2024-09-11T20:19:28.537053 Loot Tables 4f70eae621815da8d08d3ea0b9fd479b48bad2d3 data/ars_nouveau/loot_table/blocks/agronomic_sourcelink.json 8a6d60f2b39de0408c7e4537b53e866a04236d22 data/ars_nouveau/loot_table/blocks/alchemical_sourcelink.json 8bdff8a0a49a9f3f21a822eb1d1d01a950d6ad1a data/ars_nouveau/loot_table/blocks/alteration_table.json @@ -10,6 +10,7 @@ bd02fbb12b7c0c175bd6d0e1b187d2863417639a data/ars_nouveau/loot_table/blocks/arch e8985e027de224f13721125c4b09d65713f97dc5 data/ars_nouveau/loot_table/blocks/archwood_door.json 26b9292b4a83dd617d39b696cec4135427498a63 data/ars_nouveau/loot_table/blocks/archwood_fence.json 9f049cc2f08417b7eca511cf243c4f0fd02defc4 data/ars_nouveau/loot_table/blocks/archwood_fence_gate.json +04086022de397555e18d65bfc013c90cdd422a9d data/ars_nouveau/loot_table/blocks/archwood_grate.json f9e27d9666e987dd258f4f7eae3e26e76af37a8b data/ars_nouveau/loot_table/blocks/archwood_planks.json e81dd438da4fefc94c36ba7ca66cdc96eb894fbf data/ars_nouveau/loot_table/blocks/archwood_pressure_plate.json 34474b1ab19734300b3340f1fc93b35a3f236130 data/ars_nouveau/loot_table/blocks/archwood_sconce.json @@ -45,6 +46,7 @@ c6e7419ee0480ecead75d1564f0c7f1927629975 data/ars_nouveau/loot_table/blocks/gild 8cb421ba47c458534a0b87439be3c7813e0c6b2d data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks.json 73c7f7561087045f511845e5d6674889f17c4ad5 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks_slab.json e36caa0a35b00d749d0ab30d86401b33c3ad6736 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks_stairs.json +13735344d4ecb2b7547d21c4b6b341d5b8a5324c data/ars_nouveau/loot_table/blocks/gold_grate.json cf4043c312a2753289b18489e77be41712e59242 data/ars_nouveau/loot_table/blocks/green_archwood_leaves.json 8e02847416b3fbd2f7ee102ec6091b797890f027 data/ars_nouveau/loot_table/blocks/green_archwood_log.json 624aac56531fafa0fb0b66931e54ffade954dcf0 data/ars_nouveau/loot_table/blocks/green_archwood_sapling.json @@ -115,6 +117,7 @@ a205a6b50ae311561b5d2bc29b188288141a299c data/ars_nouveau/loot_table/blocks/smoo b8733770850ea0012c67a3ec3d1e03134e6c13f9 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave.json 8a7c0327f56cc9496e18be413478f2b7983ec445 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave_slab.json d7d0b68063bdabc0e0ff1b1ae3b17ed004173540 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave_stairs.json +419b0649e2fd32b81cbd4555f43735496a049967 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_grate.json c18b70f5e59d0ae6bdca21845da7f10c8baf2b46 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks.json f5a1d6acb131a489129e1d0ab1a2c1f9de5156fd data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks_slab.json 0acf441f53f330991ef49828ff9b66e1c622b78a data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks_stairs.json @@ -135,6 +138,7 @@ b56aaf60ce3bafd66649843757a01d84d1cc8453 data/ars_nouveau/loot_table/blocks/sour 491e38b7824baac8f6ac93c90f9edccf35f77707 data/ars_nouveau/loot_table/blocks/sourcestone_basketweave.json e07e3d7b2e47f58dbe3db2575d250dd78acd1ca8 data/ars_nouveau/loot_table/blocks/sourcestone_basketweave_slab.json 00cfcfece665375c9df7bbe6f439eea43225e254 data/ars_nouveau/loot_table/blocks/sourcestone_basketweave_stairs.json +de0b37fdc7443d920177f65effd0ea150e498e2d data/ars_nouveau/loot_table/blocks/sourcestone_grate.json 4feb095b7aec7b12712b22cbc8b0c80bfde72e29 data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks.json 03d6d7899db53d9fc380e7b88b2a8c03c524d55d data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks_slab.json a9ccd94f6755cbac1a79c19bdb5a07fe1220a852 data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks_stairs.json @@ -149,6 +153,7 @@ ecf0726adda255df3ff434ce3c33c041b04ece5f data/ars_nouveau/loot_table/blocks/sour e92ecb490985aae22297d2f5cd5bcb5e625671b7 data/ars_nouveau/loot_table/blocks/sourcestone_stairs.json 5708d7c438d48789ab5d0f00a115bdebe340215b data/ars_nouveau/loot_table/blocks/source_gem_block.json d39e96455d731e5e4785fa923a056261b69d39ec data/ars_nouveau/loot_table/blocks/source_jar.json +b6b55b6623883d06b18729207a634fa1086abdaf data/ars_nouveau/loot_table/blocks/source_lamp.json 7cfca21047bb21713aaeec12060826e87c6cd4de data/ars_nouveau/loot_table/blocks/spell_prism.json 401055b950ac66d34a96e29f1666fd3c59244c0f data/ars_nouveau/loot_table/blocks/spell_sensor.json 2e038e8112b147e2a4d00e4a1d707541c89c421c data/ars_nouveau/loot_table/blocks/spell_turret.json diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index ac1ee938ae..47c0ac8085 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-09-11T19:17:30.025056 Languages: en_us for mod: ars_nouveau -e4ad50c28dc93800ca3e63e6f8e791c2e9579169 assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-09-11T20:30:24.3997318 Languages: en_us for mod: ars_nouveau +8982cb3aa100d53d4eaaa60c1c21ce2bd17dcdb5 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index d283de5a9d..beca55bcc6 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,4 +1,4 @@ -// 1.21.1 2024-09-11T19:07:59.4064081 Recipes +// 1.21.1 2024-09-11T20:33:56.464892 Recipes a76e5d9eef406841f56740535ec2afdd509de507 data/ars_nouveau/advancement/recipes/building_blocks/archwood_button.json 443515bb80018fbe37a128cb6849f5e818be315d data/ars_nouveau/advancement/recipes/building_blocks/archwood_door.json 4dfc3afae271aae8423d20dedb67dc601ff71fa0 data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence.json @@ -263,6 +263,7 @@ d8e07f32cadfef1920a3f261bb6e443a789dae7e data/ars_nouveau/advancement/recipes/mi d534fabcb40063e41e50a9e759915a449f618a96 data/ars_nouveau/advancement/recipes/misc/source_gem_block.json c6c2d1f29264f7653df4c3fa7162224c0a158e21 data/ars_nouveau/advancement/recipes/misc/source_gem_block_2.json 1a6acd884f55925ba6b37be57b56e394b2e5d08b data/ars_nouveau/advancement/recipes/misc/source_jar.json +a9566c298e757c8a2ab2781b29d862b35e3bf890 data/ars_nouveau/advancement/recipes/misc/source_lamp.json 269f32221e7761b07fda58c2d1f0e4d385be01a9 data/ars_nouveau/advancement/recipes/misc/spell_prism.json 72c1ae940c65ff0d29a11b7842b288b1227d02d1 data/ars_nouveau/advancement/recipes/misc/spike_to_arrow.json bd91063f72b718971e580b32fe3520a1f2996982 data/ars_nouveau/advancement/recipes/misc/spike_to_dye.json @@ -295,7 +296,7 @@ b3b729af157d37ce8fd800f06eb9723237fa6fde data/ars_nouveau/recipe/arcane_platform 19ade102ab38051edba714910dc8f966d23d2ea2 data/ars_nouveau/recipe/archwood_door.json 145c3b2469019bda16df0cb8493ca735fbcde977 data/ars_nouveau/recipe/archwood_fence.json 035beb9e6e73ee4e88daded672e57b2d806be214 data/ars_nouveau/recipe/archwood_fence_gate.json -8eb9979d21387238fe2aff8664a014d4d5838114 data/ars_nouveau/recipe/archwood_grate.json +4009ff6e5a1960dae901385f5909a39eba0a1289 data/ars_nouveau/recipe/archwood_grate.json 67f00645627dc667301f3e9a8e3b4d8808fa3994 data/ars_nouveau/recipe/archwood_planks.json 3b4decb139ef2bbc828c428eb13862980a763847 data/ars_nouveau/recipe/archwood_pressure_plate.json 2601d9a5a1a8028377d3916bdfa7b5da4657d6ce data/ars_nouveau/recipe/archwood_sconce.json @@ -347,7 +348,7 @@ bec69a8d002ea373314fc0393c84d8036d415c17 data/ars_nouveau/recipe/gilded_sourcest 077fadc7edaa58f40a873b955063b296f7c0607c data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stonecutter_stair.json c2460feccf67516df403a9abb8c832911390bf4c data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stone_cutterslab.json 29a297bd450b2f8df3a69bfe40bc0b75bee0ab55 data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_to_sourcestone.json -1003721c715ab7b1ef0925b89ba8e0db263a781f data/ars_nouveau/recipe/gold_grate.json +852a46a3cadfda93186f4253b3a0891be96783fd data/ars_nouveau/recipe/gold_grate.json 68145936a0efb8b3b80e5469df8cd52caf7c85d8 data/ars_nouveau/recipe/greater_experience_gem.json 47d30e1bdf7c9e8947c5fa5f0fd047567abf195d data/ars_nouveau/recipe/green_archwood_wood.json e54c68f5c220f3af8b9c996094a2ab213a05775e data/ars_nouveau/recipe/green_sbed.json @@ -463,7 +464,7 @@ de8804b81bb11ad699c118c674a5ec92e54f2e8f data/ars_nouveau/recipe/smooth_sourcest d0263bb0d14c77a757f1444371caff2686f3b335 data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stonecutter_stair.json 49d5eee984f3df841e993c5a2e9c616816a6cc8b data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stone_cutterslab.json 8a7130ffa41374909ef985ec4c1ec350d654f162 data/ars_nouveau/recipe/smooth_sourcestone_basketweave_to_sourcestone.json -e22e6c90716d11c7881b8bb53c14fb582ffef32b data/ars_nouveau/recipe/smooth_sourcestone_grate.json +59fb26e9ba04e8dc02a3501ec8173876871b430c data/ars_nouveau/recipe/smooth_sourcestone_grate.json 400372944ed98be7d1b7cb5e1f5ae072bafbc63e data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_slab.json e18cc711473df298fe44a175b0c213098ee30c7e data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stairs.json 0f8d955c626ea38620e19169c0f1ef44efcebd7a data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stonecutter_stair.json @@ -519,7 +520,7 @@ d8987e3cd5b7933ddad2fa0f5f8eef4dc6c757af data/ars_nouveau/recipe/sourcestone_bas 75cc98a03d013ad872bad29c0e1fc2cc84de3fae data/ars_nouveau/recipe/sourcestone_basketweave_stonecutter_stair.json f7a36183332cee6b288bd113af0b38335c746e2b data/ars_nouveau/recipe/sourcestone_basketweave_stone_cutterslab.json 21e59abdf2bc5b18c2cdbcf84a7b08c00a586ead data/ars_nouveau/recipe/sourcestone_basketweave_to_sourcestone.json -e6a0d7a8e15d565b1ec0857e7805352e09b1c9f7 data/ars_nouveau/recipe/sourcestone_grate.json +83c9dc96311bb25d320fb4a57da9f0a55498e715 data/ars_nouveau/recipe/sourcestone_grate.json 4cdf9a8b4bde0f985a01d1b772323df62c5a214c data/ars_nouveau/recipe/sourcestone_large_bricks_slab.json 055ecd2a82200dbba5aae29e67953f824ae4d49a data/ars_nouveau/recipe/sourcestone_large_bricks_stairs.json 58271d6404ad2fcbf894a99c197bd5ed4f885d4c data/ars_nouveau/recipe/sourcestone_large_bricks_stonecutter_stair.json @@ -541,6 +542,7 @@ afe7ecef1ee8ae08a8d3a2acc1b08327d0ef9618 data/ars_nouveau/recipe/source_berry_ro 8e73daa42d1c3b50da95e8e9b17dd378394cb5e6 data/ars_nouveau/recipe/source_gem_block.json c06a657b4454d37d6a163c4cc10704a5c8cf5065 data/ars_nouveau/recipe/source_gem_block_2.json 9f629e68870a9bcb8827301b66f253caa5731d80 data/ars_nouveau/recipe/source_jar.json +fd4f54e3b9e232813f6ee2d0dad241594674f090 data/ars_nouveau/recipe/source_lamp.json d8b09f182394f57f1695154e21df6df2de1edb3c data/ars_nouveau/recipe/spell_prism.json 2ba1f528e85a732de26d7a83a4bc4924cbfd59f8 data/ars_nouveau/recipe/spike_to_arrow.json 958a7d7aedff3bc57fdfcb14ac84ed435927e115 data/ars_nouveau/recipe/spike_to_dye.json diff --git a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 index 3cb2ea17ea..0c848bf1ca 100644 --- a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 +++ b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 @@ -1,4 +1,4 @@ -// 1.21.1 2024-09-11T18:52:56.3761641 Ars Nouveau Item Models +// 1.21.1 2024-09-11T20:19:28.5400526 Ars Nouveau Item Models 11ee554b11a3a830e89b742762e5b754c2ecb5ee assets/ars_nouveau/models/item/agronomic_sourcelink.json 339a05323ebef7efc5c70db708a2e7a24708e9bc assets/ars_nouveau/models/item/alchemical_sourcelink.json a0214090201827dd5f954d0b33e64e4df6e53764 assets/ars_nouveau/models/item/alchemists_crown.json @@ -211,6 +211,7 @@ fad002103bb7ccaea2998a2fe617fcf5fd54d416 assets/ars_nouveau/models/item/sourcest b476712880e974a70c1fadea694f0d61adb9c291 assets/ars_nouveau/models/item/sourcestone_small_bricks_stairs.json a7b3f41fce153ebc7540a0dfbe855fc724f521b1 assets/ars_nouveau/models/item/sourcestone_stairs.json f433c503db1699241353f198a0d427f708716930 assets/ars_nouveau/models/item/source_gem_block.json +456330a19a0028b82be0c6bb1ebe9486b3613a1a assets/ars_nouveau/models/item/source_lamp.json 9d2205eb9012b0585bff4adaf4c02419b2f01d9a assets/ars_nouveau/models/item/spell_sensor.json 1a921e2809c2a9588e7e8f5fbe4556f5f6729487 assets/ars_nouveau/models/item/stripped_blue_archwood_log.json 1205608f4c722986291eb4255ad2e405715515cf assets/ars_nouveau/models/item/stripped_blue_archwood_wood.json diff --git a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 index 940dd23467..d769e53dc9 100644 --- a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 +++ b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 @@ -1,4 +1,4 @@ -// 1.21.1 2024-09-11T19:10:19.339699 Patchouli +// 1.21.1 2024-09-11T20:30:24.4012426 Patchouli 2ec536fea831588201432d61d70af61385882054 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/alteration_table.json a82f4fc73946d228b1e3f5e03d0ecef46f33cdfb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/applying_perks.json 8ce1d8e886b45066bc5c1d9d8e87bdabbb27ae27 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor.json @@ -30,6 +30,7 @@ c7d187c5baed53c4ddb63b6b6dc9ec9847c21a45 assets/ars_nouveau/patchouli_books/worn f13c06f8bad4eea6dc04fe65a11e7dee635edcd7 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/grates.json 2aa6f0796e1c44db6a5f89ce86c71b51d30f55ab assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/mimic_scroll.json 8d8c1da8e10e4e6bdb2e372d9091d6520bb050ee assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/redstone_relay.json +b619a9ff2b42715a4f02335f3d16e0d38278131f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/source_lamp.json 269964459879bd2f251da0caecebfdd380dd3c77 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/spell_prism.json 756f36ebd89cd34e9beee7dc014e59ca6e651f2a assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/spell_sensor.json c5c734978c587616db905cdcdd4da1bd054ab42b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/spell_turret.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index e983880a1e..b64c6c0349 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -555,6 +555,7 @@ "ars_nouveau.page1.shapers_focus": "A focus that modifies effects that move, create, or modify blocks. Blocks that you move with effects like Launch, Gravity, Pull, Knockback, etc. will now deal damage to entities they hit. Damage is increased by Spell Damage, block hardness, and the speed of the block. Additionally, effects that target or create blocks will duplicate the rest of the spell targeting the new block or moving block.", "ars_nouveau.page1.source": "Source is a special resource that must be gathered using devices in the world. Source is used for powering devices like the Imbuement Chamber and Enchanting Apparatus. To begin gathering Source, you will need a Source Jar and a Sourcelink.", "ars_nouveau.page1.source_berry": "A Sourceberry Bush can be found in Taiga and Archwood Forest biomes, and produces Sourceberries. A Sourceberry can be used to craft a Potion of Mana Regeneration or consumed as food. Starbuncles will automatically harvest fully grown Source Berry Bushes, making them useful for early automation of the Agronomic Sourcelink. Sourceberry foods will also grant Mana Regeneration.", + "ars_nouveau.page1.source_lamp": "Behaves like a copper bulb, but the light and comparator values can be adjusted by casting Light with dampen.", "ars_nouveau.page1.spell_books": "Accessing higher tier spells will require a better spell book. While a novice spell book only has access to Tier 1 spells, the Apprentice and Archmage spell books will unlock tiers two and three. Upgrading your spell book will transfer all of the spells that you have learned into your new book. Books may be dyed by crafting them with a piece of dye.", "ars_nouveau.page1.spell_bow": "A bow that can be inscribed with a spell using the Scribes Table. If the player has enough mana, arrows will become Spell Arrows and will apply the spell on their target. If no arrows are in the inventory, a spell arrow that deals 0 damage will be cast. If there is not enough mana, regular arrows will be fired. Enchanter's Bows may use special Augment Arrows for empowering the inscribed spell.", "ars_nouveau.page1.spell_casting": "To begin spell casting, you will need to first obtain a Spellbook. A spellbook will allow you to create, store, and cast spells using Mana. A higher tier spell book will provide additional spell slots, allowing you to craft more complex spells. $(br) To craft your first spell, you must first select the $(bold)Form$() that the spell will take on. A $(bold)Form$() glyph must always be the first glyph in a spell recipe.", @@ -1080,6 +1081,7 @@ "block.ars_nouveau.smooth_sourcestone_stairs": "Smooth Sourcestone Stairs", "block.ars_nouveau.source_gem_block": "Source Gem Block", "block.ars_nouveau.source_jar": "Source Jar", + "block.ars_nouveau.source_lamp": "Source Gem Lamp", "block.ars_nouveau.sourceberry_bush": "Sourceberry", "block.ars_nouveau.sourceberry_sack": "Sourceberry Sack", "block.ars_nouveau.sourcestone": "Sourcestone", diff --git a/src/generated/resources/assets/ars_nouveau/models/item/source_lamp.json b/src/generated/resources/assets/ars_nouveau/models/item/source_lamp.json new file mode 100644 index 0000000000..a67a8bcdca --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/source_lamp.json @@ -0,0 +1,3 @@ +{ + "parent": "ars_nouveau:block/source_lamp" +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/source_lamp.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/source_lamp.json new file mode 100644 index 0000000000..ba1cab9439 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/source_lamp.json @@ -0,0 +1,15 @@ +{ + "category": "ars_nouveau:automation", + "icon": "ars_nouveau:source_lamp", + "name": "block.ars_nouveau.source_lamp", + "pages": [ + { + "type": "patchouli:text", + "text": "ars_nouveau.page1.source_lamp" + }, + { + "type": "patchouli:crafting", + "recipe": "ars_nouveau:source_lamp" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_lamp.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_lamp.json new file mode 100644 index 0000000000..5ed156b074 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/source_lamp.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_journal": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ars_nouveau:source_lamp" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_journal" + ] + ], + "rewards": { + "recipes": [ + "ars_nouveau:source_lamp" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_grate.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_grate.json new file mode 100644 index 0000000000..e287d04565 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/archwood_grate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:archwood_grate" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/archwood_grate" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/gold_grate.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gold_grate.json new file mode 100644 index 0000000000..c2f4e48e96 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/gold_grate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:gold_grate" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/gold_grate" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_grate.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_grate.json new file mode 100644 index 0000000000..0663893254 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/smooth_sourcestone_grate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:smooth_sourcestone_grate" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/smooth_sourcestone_grate" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/source_lamp.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/source_lamp.json new file mode 100644 index 0000000000..7b30dddb35 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/source_lamp.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:source_lamp" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/source_lamp" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_grate.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_grate.json new file mode 100644 index 0000000000..46f106c39e --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/sourcestone_grate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:sourcestone_grate" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/sourcestone_grate" +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/archwood_grate.json b/src/generated/resources/data/ars_nouveau/recipe/archwood_grate.json index 8a51df8c48..2cb7edcc6d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/archwood_grate.json +++ b/src/generated/resources/data/ars_nouveau/recipe/archwood_grate.json @@ -10,9 +10,9 @@ } }, "pattern": [ - "ggg", + " g ", "gMg", - "ggg" + " g " ], "result": { "count": 1, diff --git a/src/generated/resources/data/ars_nouveau/recipe/gold_grate.json b/src/generated/resources/data/ars_nouveau/recipe/gold_grate.json index 98ccbbb5bf..8c04eab8ee 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/gold_grate.json +++ b/src/generated/resources/data/ars_nouveau/recipe/gold_grate.json @@ -10,9 +10,9 @@ } }, "pattern": [ - "ggg", + " g ", "gMg", - "ggg" + " g " ], "result": { "count": 1, diff --git a/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_grate.json b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_grate.json index a1de5b8d11..e17368774a 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_grate.json +++ b/src/generated/resources/data/ars_nouveau/recipe/smooth_sourcestone_grate.json @@ -10,9 +10,9 @@ } }, "pattern": [ - "ggg", + " g ", "gMg", - "ggg" + " g " ], "result": { "count": 1, diff --git a/src/generated/resources/data/ars_nouveau/recipe/source_lamp.json b/src/generated/resources/data/ars_nouveau/recipe/source_lamp.json new file mode 100644 index 0000000000..0a54d1438a --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/source_lamp.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "b": { + "tag": "c:rods/blaze" + }, + "r": { + "tag": "c:dusts/redstone" + }, + "x": { + "tag": "c:gems/source" + } + }, + "pattern": [ + " x ", + "xbx", + " r " + ], + "result": { + "count": 1, + "id": "ars_nouveau:source_lamp" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/sourcestone_grate.json b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_grate.json index 7cf47c5372..48a3775d16 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/sourcestone_grate.json +++ b/src/generated/resources/data/ars_nouveau/recipe/sourcestone_grate.json @@ -10,9 +10,9 @@ } }, "pattern": [ - "ggg", + " g ", "gMg", - "ggg" + " g " ], "result": { "count": 1, diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceLamp.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceLamp.java new file mode 100644 index 0000000000..c99eaaefe6 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceLamp.java @@ -0,0 +1,45 @@ +package com.hollingsworth.arsnouveau.common.block; + +import com.hollingsworth.arsnouveau.api.spell.ILightable; +import com.hollingsworth.arsnouveau.api.spell.SpellContext; +import com.hollingsworth.arsnouveau.api.spell.SpellStats; +import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDampen; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.CopperBulbBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; + +public class SourceLamp extends CopperBulbBlock implements ILightable { + + public static final IntegerProperty LIGHT_LEVEL = IntegerProperty.create("light_level", 0, 15); + + public SourceLamp() { + super(BlockBehaviour.Properties.of().lightLevel((p) -> p.getValue(LIT) ? p.getValue(LIGHT_LEVEL) : 0)); + this.registerDefaultState(this.defaultBlockState().setValue(LIT, Boolean.valueOf(false)).setValue(LIGHT_LEVEL, 15).setValue(POWERED, Boolean.valueOf(false))); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder pBuilder) { + pBuilder.add(LIT, POWERED, LIGHT_LEVEL); + } + + @Override + public void onLight(HitResult rayTraceResult, Level world, LivingEntity shooter, SpellStats augments, SpellContext spellContext) { + if(rayTraceResult instanceof BlockHitResult blockHitResult){ + var state = world.getBlockState(blockHitResult.getBlockPos()).setValue(LIGHT_LEVEL, Math.min(Math.max(0, 15 - augments.getBuffCount(AugmentDampen.INSTANCE)), 15)); + world.setBlock(blockHitResult.getBlockPos(), state, 3); + } + } + + @Override + protected int getAnalogOutputSignal(BlockState pState, Level pLevel, BlockPos pPos) { + return pLevel.getBlockState(pPos).getValue(LIT) ? pState.getValue(LIGHT_LEVEL) : 0; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java index c843c6f4a4..864caa5828 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java @@ -253,6 +253,11 @@ protected void generate() { ) ) ); + registerDropSelf(BlockRegistry.ARCHWOOD_GRATE); + registerDropSelf(BlockRegistry.GOLD_GRATE); + registerDropSelf(BlockRegistry.SMOOTH_SOURCESTONE_GRATE); + registerDropSelf(BlockRegistry.SOURCESTONE_GRATE); + registerDropSelf(BlockRegistry.SOURCE_LAMP); } protected LootTable.Builder createCropDrops(Block pCropBlock, Item pGrownCropItem, Item pSeedsItem, LootItemCondition.Builder pDropGrownCropCondition, int bonus) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java index 64787be661..6b57b5aca9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java @@ -125,6 +125,7 @@ protected void registerModels() { getBuilder(LibBlockNames.ARCHWOOD_GRATE).parent(BlockStatesDatagen.getUncheckedModel(LibBlockNames.ARCHWOOD_GRATE)); getBuilder(LibBlockNames.SMOOTH_SOURCESTONE_GRATE).parent(BlockStatesDatagen.getUncheckedModel(LibBlockNames.SMOOTH_SOURCESTONE_GRATE)); getBuilder(LibBlockNames.GOLD_GRATE).parent(BlockStatesDatagen.getUncheckedModel(LibBlockNames.GOLD_GRATE)); + getBuilder(LibBlockNames.SOURCE_LAMP).parent(BlockStatesDatagen.getUncheckedModel(LibBlockNames.SOURCE_LAMP)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 7645a880b9..ea35e5c4e9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -1296,6 +1296,8 @@ protected void addTranslations() { add("block.ars_nouveau.gold_grate","Gold Grate"); add("block.ars_nouveau.archwood_grate","Archwood Grate"); add("block.ars_nouveau.smooth_sourcestone_grate","Smooth Sourcestone Grate"); + add("block.ars_nouveau.source_lamp", "Source Gem Lamp"); + add("ars_nouveau.page1.source_lamp", "Behaves like a copper bulb, but the light and comparator values can be adjusted by casting Light with dampen."); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java index 173a8f0c35..2a2727bd46 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java @@ -650,6 +650,7 @@ public void addEntries() { addPage(new PatchouliBuilder(AUTOMATION, BlockRegistry.ARCHWOOD_GRATE).withLocalizedText() .withPage(new CraftingPage(BlockRegistry.ARCHWOOD_GRATE).withRecipe2(BlockRegistry.GOLD_GRATE)) .withPage(new CraftingPage(BlockRegistry.SMOOTH_SOURCESTONE_GRATE).withRecipe2(BlockRegistry.SOURCESTONE_GRATE)), getPath(AUTOMATION, "grates")); + addPage(new PatchouliBuilder(AUTOMATION, BlockRegistry.SOURCE_LAMP).withLocalizedText().withPage(new CraftingPage(BlockRegistry.SOURCE_LAMP)), getPath(AUTOMATION, "source_lamp")); } public String getLangPath(String name, int count) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java index 8eaad9491a..ca42a618b3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java @@ -737,35 +737,45 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { shapelessBuilder(BlockRegistry.SOURCEBERRY_BUSH, 9).requires(BlockRegistry.SOURCEBERRY_SACK).save(consumer, ArsNouveau.prefix( "sourceberry_sack_to_bush")); shapedBuilder(BlockRegistry.GOLD_GRATE) - .pattern("ggg") + .pattern(" g ") .pattern("gMg") - .pattern("ggg") + .pattern(" g ") .define('g', Items.IRON_BARS) .define('M', Tags.Items.INGOTS_GOLD) .save(consumer); shapedBuilder(BlockRegistry.ARCHWOOD_GRATE) - .pattern("ggg") + .pattern(" g ") .pattern("gMg") - .pattern("ggg") + .pattern(" g ") .define('g', Items.IRON_BARS) .define('M', ARCHWOOD_LOG) .save(consumer); shapedBuilder(BlockRegistry.SOURCESTONE_GRATE) - .pattern("ggg") + .pattern(" g ") .pattern("gMg") - .pattern("ggg") + .pattern(" g ") .define('g', Items.IRON_BARS) .define('M', SOURCESTONE) .save(consumer); shapedBuilder(BlockRegistry.SMOOTH_SOURCESTONE_GRATE) - .pattern("ggg") + .pattern(" g ") .pattern("gMg") - .pattern("ggg") + .pattern(" g ") .define('g', Items.IRON_BARS) .define('M', BlockRegistry.getBlock(LibBlockNames.SMOOTH_SOURCESTONE)) .save(consumer); + shapedBuilder(BlockRegistry.SOURCE_LAMP) + .pattern(" x ") + .pattern("xbx") + .pattern(" r ") + .define('x', SOURCE_GEM) + .define('b', Tags.Items.RODS_BLAZE) + .define('r', Tags.Items.DUSTS_REDSTONE) + .save(consumer); + + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibBlockNames.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibBlockNames.java index e12cbdb1e8..08fcc68487 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibBlockNames.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibBlockNames.java @@ -84,6 +84,7 @@ public class LibBlockNames { public final static String SMOOTH_SOURCESTONE_GRATE = "smooth_sourcestone_grate"; public final static String GOLD_GRATE = "gold_grate"; public final static String ARCHWOOD_GRATE = "archwood_grate"; + public final static String SOURCE_LAMP = "source_lamp"; public static final String SOURCESTONE = "sourcestone"; public static final String SOURCESTONE_MOSAIC = "sourcestone_mosaic"; diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java index eefcf0f8e2..ec6448b19d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java @@ -192,6 +192,7 @@ public Supplier getRenderer() { public static BlockRegistryWrapper SMOOTH_SOURCESTONE_GRATE = registerBlockAndItem(LibBlockNames.SMOOTH_SOURCESTONE_GRATE, ItemGrate::new); public static BlockRegistryWrapper GOLD_GRATE = registerBlockAndItem(LibBlockNames.GOLD_GRATE, ItemGrate::new); public static BlockRegistryWrapper ARCHWOOD_GRATE = registerBlockAndItem(LibBlockNames.ARCHWOOD_GRATE, ItemGrate::new); + public static BlockRegistryWrapper SOURCE_LAMP = registerBlockAndItem(LibBlockNames.SOURCE_LAMP, SourceLamp::new); public static BlockRegistryWrapper MAGIC_FIRE = registerBlockAndItem(LibBlockNames.MAGIC_FIRE, () -> new MagicFire(BlockBehaviour.Properties.of().mapColor(MapColor.FIRE).replaceable().noCollission().instabreak().lightLevel((p_152607_) -> { return 15; diff --git a/src/main/resources/assets/ars_nouveau/blockstates/source_lamp.json b/src/main/resources/assets/ars_nouveau/blockstates/source_lamp.json new file mode 100644 index 0000000000..440ae35278 --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/blockstates/source_lamp.json @@ -0,0 +1,6 @@ +{ + "variants": { + "lit=true": { "model": "ars_nouveau:block/source_lamp_on" }, + "lit=false": { "model": "ars_nouveau:block/source_lamp" } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/models/block/source_lamp.json b/src/main/resources/assets/ars_nouveau/models/block/source_lamp.json new file mode 100644 index 0000000000..6a26ebd862 --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/models/block/source_lamp.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "ars_nouveau:block/source_gem_lamp_off" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/models/block/source_lamp_on.json b/src/main/resources/assets/ars_nouveau/models/block/source_lamp_on.json new file mode 100644 index 0000000000..ae2cac8414 --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/models/block/source_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "ars_nouveau:block/source_gem_lamp_on" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/textures/block/source_gem_lamp_off.png b/src/main/resources/assets/ars_nouveau/textures/block/source_gem_lamp_off.png new file mode 100644 index 0000000000000000000000000000000000000000..5c84749384c579881a16531c5aefbcd4ce384261 GIT binary patch literal 472 zcmV;}0Vn>6P)Px$l1W5CR5*>Lld(?YKoEvMEUz{`8K-bW;pUWrShOh-O&)*;AXK5a7l0xyU5euw zs0ckgKsrh)nuH<^a)IIkV`*b;q@&o|1s}LLF^xy^KQsUQ|IXIQ-mgCZrB+lM4S@6o zp$PaGP5*s>Tov@90gGbB{?0LJyU+aP9>C@Hd-r_B&mRXYiWzYb;gwp^iw1OBi7S{c z$IM@EUD5pYmg#a#+U^6;X(jZc0i{-W)keGGIEVlkb|;it5zB6WX)X%UJ5uL*3Y1GW6$__D$OL}LS$)pM)Crv{}~fDzGJ)C2}&qZP5#>fME} zY&_!{fZq>C0H16G%tNvaz}Pt2y+HcHF_FGtw0q$!w%BT;@uV+UtqsuHI9-kjMZo;! zp1jHkMZk19u3=W|%siw}1T2afFmT<6-AV0$((S_*4fYi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ars_nouveau/textures/block/source_gem_lamp_on.png b/src/main/resources/assets/ars_nouveau/textures/block/source_gem_lamp_on.png new file mode 100644 index 0000000000000000000000000000000000000000..773d5421eedd010b9db8470f283c70f3319d0dc1 GIT binary patch literal 445 zcmV;u0Yd(XP)Px$cS%G+R5*>Lld)>UFc5~n7z-mXfsidv&_cG%UHb%Gyad{zfkKy(3?4d_;vpe) z3Ums1(UK?VnmJpZAzKI(gD^6*gDNGa@lbk;<-7m>)7`IY-Cf>)0Tf14RtA756vRSu zYEAJFV6Q(J_Z72k!t=GFGl0X!Cc3lxzI-G+UgXTS30>JHD2!&@SIFKmA)O9ctVcd+ zu^y35hja!OBYQCJD+;3t%F6iUu51I4O>zpO=?pAkVKmt!uVG{l%E}N%q41Si+v=`Y z=PxV6QsNfZLk{;FpYmeMqNOvq{c8 zRYaliz9u@rr(;=~tzV}#2(&?~<(Yv3A6bs30n=nRs_H2^Z n7U<#Xy>@NA!!J|ozw7)B(qy}-!Voy300000NkvXXu0mjfeDKL3 literal 0 HcmV?d00001 From 89f11c9efb3a4c67e35cc4c36f7e12b41ba3ed3b Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Fri, 13 Sep 2024 04:32:08 +0200 Subject: [PATCH 177/363] Fix starby behavior not syncing correctly clientside (#1412) --- .../arsnouveau/common/entity/Starbuncle.java | 80 ++++++++++--------- 1 file changed, 44 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 0af1c96445..170cc68b2a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -74,6 +74,8 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.common.Tags; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; @@ -82,7 +84,6 @@ import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.Nullable; import java.util.*; public class Starbuncle extends PathfinderMob implements GeoEntity, IDecoratable, IDispellable, ITooltipProvider, IWandable, IDebuggerProvider, ITagSyncable, IVariantColorProvider { @@ -105,6 +106,7 @@ public enum StarbuncleGoalState { public static final EntityDataAccessor TAMED = SynchedEntityData.defineId(Starbuncle.class, EntityDataSerializers.BOOLEAN); public static final EntityDataAccessor COLOR = SynchedEntityData.defineId(Starbuncle.class, EntityDataSerializers.STRING); public static final EntityDataAccessor PATH_BLOCK = SynchedEntityData.defineId(Starbuncle.class, EntityDataSerializers.STRING); + public static final EntityDataAccessor BEHAVIOR_KEY = SynchedEntityData.defineId(Starbuncle.class, EntityDataSerializers.STRING); public static final EntityDataAccessor HEAD_COSMETIC = SynchedEntityData.defineId(Starbuncle.class, EntityDataSerializers.ITEM_STACK); public static final EntityDataAccessor BEHAVIOR_TAG = SynchedEntityData.defineId(Starbuncle.class, EntityDataSerializers.COMPOUND_TAG); private int backOff; // Used to stop inventory store/take spam when chests are full or empty. @@ -139,7 +141,7 @@ public Starbuncle(Level world, boolean tamed) { } @Override - public MinecoloniesAdvancedPathNavigate getNavigation() { + public @NotNull MinecoloniesAdvancedPathNavigate getNavigation() { if (this.pathNavigate == null) { this.pathNavigate = new MinecoloniesAdvancedPathNavigate(this, this.level); this.minecraftPathNav = this.navigation; @@ -167,6 +169,7 @@ public void setBehavior(ChangeableBehavior behavior) { this.dynamicBehavior = behavior; this.data.behaviorKey = behavior.getRegistryName(); getEntityData().set(Starbuncle.BEHAVIOR_TAG, dynamicBehavior.toTag(new CompoundTag())); + getEntityData().set(Starbuncle.BEHAVIOR_KEY, behavior.getRegistryName().toString()); reloadGoals(); syncBehavior(); } @@ -207,8 +210,8 @@ public void registerControllers(AnimatableManager.ControllerRegistrar animatable })); } - public void getNextItemFromPassengers(){ - if(getFirstPassenger() instanceof Starbuncle starbuncle && !starbuncle.getHeldStack().isEmpty()){ + public void getNextItemFromPassengers() { + if (getFirstPassenger() instanceof Starbuncle starbuncle && !starbuncle.getHeldStack().isEmpty()) { this.setHeldStack(starbuncle.getHeldStack().copyAndClear()); starbuncle.getNextItemFromPassengers(); } @@ -220,7 +223,7 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - public boolean hurt(DamageSource pSource, float pAmount) { + public boolean hurt(@NotNull DamageSource pSource, float pAmount) { return SummonUtil.canSummonTakeDamage(pSource) && super.hurt(pSource, pAmount); } @@ -274,7 +277,7 @@ public void tick() { System.out.println(this); return; } - if(this.dynamicBehavior != null){ + if (this.dynamicBehavior != null) { this.dynamicBehavior.tick(); } if (level.isClientSide && level.getGameTime() % 5 == 0) { @@ -340,7 +343,7 @@ public void syncBehavior() { @Override public void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @org.jetbrains.annotations.Nullable Direction side, @Nullable LivingEntity storedEntity, Player playerEntity) { - if(this.isPassenger() && this.getRootVehicle() instanceof Starbuncle baseStarby){ + if (this.isPassenger() && this.getRootVehicle() instanceof Starbuncle baseStarby) { baseStarby.dynamicBehavior.onFinishedConnectionFirst(storedPos, side, storedEntity, playerEntity); return; } @@ -349,7 +352,7 @@ public void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @org.jetbrai @Override public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @org.jetbrains.annotations.Nullable Direction side, @Nullable LivingEntity storedEntity, Player playerEntity) { - if(this.isPassenger() && this.getRootVehicle() instanceof Starbuncle baseStarby){ + if (this.isPassenger() && this.getRootVehicle() instanceof Starbuncle baseStarby) { baseStarby.dynamicBehavior.onFinishedConnectionLast(storedPos, side, storedEntity, playerEntity); return; } @@ -363,7 +366,7 @@ public static AttributeSupplier.Builder attributes() { @Override - public boolean canCollideWith(Entity pEntity) { + public boolean canCollideWith(@NotNull Entity pEntity) { if (pEntity instanceof Player) return false; return super.canCollideWith(pEntity); @@ -379,7 +382,7 @@ protected void pushEntities() { } @Override - public void pickUpItem(ItemEntity itemEntity) { + public void pickUpItem(@NotNull ItemEntity itemEntity) { if (!this.getHeldStack().isEmpty() && this.getStarbuncleWithSpace() == null) return; if (!this.isTamed() && itemEntity.getItem().is(Tags.Items.NUGGETS_GOLD)) { @@ -391,7 +394,7 @@ public void pickUpItem(ItemEntity itemEntity) { @OnlyIn(Dist.CLIENT) @Override - public void setRecordPlayingNearby(BlockPos pos, boolean hasSound) { + public void setRecordPlayingNearby(@NotNull BlockPos pos, boolean hasSound) { super.setRecordPlayingNearby(pos, hasSound); this.jukeboxPos = pos; this.partyCarby = hasSound; @@ -429,7 +432,7 @@ protected float getWaterSlowDown() { } @Override - public void die(DamageSource source) { + public void die(@NotNull DamageSource source) { if (!level.isClientSide && isTamed()) { dropData(); } @@ -462,12 +465,12 @@ protected void updateControlFlags() { } @Override - protected InteractionResult mobInteract(Player player, InteractionHand hand) { + protected @NotNull InteractionResult mobInteract(@NotNull Player player, @NotNull InteractionHand hand) { if (hand != InteractionHand.MAIN_HAND || player.getCommandSenderWorld().isClientSide || !isTamed()) return InteractionResult.SUCCESS; ItemStack stack = player.getItemInHand(hand); - if(player.getMainHandItem().getItem() instanceof StarbuncleCharm starbuncleCharm){ + if (player.getMainHandItem().getItem() instanceof StarbuncleCharm starbuncleCharm) { Starbuncle carbuncle = new Starbuncle(level, true); carbuncle.data = player.getMainHandItem().getOrDefault(DataComponentRegistry.STARBUNCLE_DATA, new StarbuncleCharmData()).mutable(); @@ -497,17 +500,18 @@ protected InteractionResult mobInteract(Player player, InteractionHand hand) { } @Override - public EntityType getType() { + public @NotNull EntityType getType() { return ModEntities.STARBUNCLE_TYPE.get(); } @Override - protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + protected void defineSynchedData(SynchedEntityData.@NotNull Builder pBuilder) { super.defineSynchedData(pBuilder); pBuilder.define(TAMED, false); pBuilder.define(COLOR, DyeColor.ORANGE.getName()); pBuilder.define(PATH_BLOCK, ""); pBuilder.define(HEAD_COSMETIC, ItemStack.EMPTY); + pBuilder.define(BEHAVIOR_KEY, StarbyTransportBehavior.TRANSPORT_ID.toString()); pBuilder.define(BEHAVIOR_TAG, new CompoundTag()); } @@ -527,21 +531,21 @@ public ItemStack getHeldStack() { /** * @return self if held item is empty, or the first starbuncle passenger */ - public Starbuncle getStarbuncleWithSpace(){ - if(this.getHeldStack().isEmpty()){ + public Starbuncle getStarbuncleWithSpace() { + if (this.getHeldStack().isEmpty()) { return this; } - for(Entity e : this.getIndirectPassengers()){ - if(!(e instanceof Starbuncle starbuncle)) + for (Entity e : this.getIndirectPassengers()) { + if (!(e instanceof Starbuncle starbuncle)) continue; - if(starbuncle.getHeldStack().isEmpty()){ + if (starbuncle.getHeldStack().isEmpty()) { return starbuncle; } } return null; } - public ItemStack getCosmeticItem() { + public @NotNull ItemStack getCosmeticItem() { return this.entityData.get(HEAD_COSMETIC); } @@ -568,13 +572,12 @@ public boolean onDispel(@Nullable LivingEntity caster) { private boolean setBehaviors; @Override - public void readAdditionalSaveData(CompoundTag tag) { + public void readAdditionalSaveData(@NotNull CompoundTag tag) { super.readAdditionalSaveData(tag); data = NBTComponent.fromTag(StarbuncleCharmData.CODEC.codec(), tag.contains("starbuncleData") ? tag.getCompound("starbuncleData") : new CompoundTag()).mutable(); this.dynamicBehavior = BehaviorRegistry.create(data.behaviorKey, this, data.behaviorTag); setHeldStack(ItemStack.parseOptional(level.registryAccess(), tag.getCompound("held"))); - backOff = tag.getInt("backoff"); this.entityData.set(TAMED, tag.getBoolean("tamed")); if (!setBehaviors) { @@ -589,7 +592,7 @@ public void readAdditionalSaveData(CompoundTag tag) { } @Override - public void addAdditionalSaveData(CompoundTag tag) { + public void addAdditionalSaveData(@NotNull CompoundTag tag) { super.addAdditionalSaveData(tag); data.behaviorTag = this.dynamicBehavior.toTag(new CompoundTag()); tag.put("starbuncleData", data.immutable().toTag(level)); @@ -604,13 +607,15 @@ public void addAdditionalSaveData(CompoundTag tag) { public void restoreFromTag() { if (data.color != null) this.entityData.set(COLOR, data.color); - if (data.pathBlock != null) { setPathBlockDesc(Component.translatable(data.pathBlock.getDescriptionId()).getString()); } if (data.cosmetic != null && !data.cosmetic.isEmpty()) this.entityData.set(HEAD_COSMETIC, data.cosmetic); setCustomName(data.name); + if (data.behaviorKey != null) { + this.entityData.set(BEHAVIOR_KEY, data.behaviorKey.toString()); + } if (data.behaviorTag != null) { this.dynamicBehavior = BehaviorRegistry.create(data.behaviorKey, this, data.behaviorTag); this.entityData.set(BEHAVIOR_TAG, dynamicBehavior.toTag(new CompoundTag())); @@ -626,10 +631,10 @@ public void restoreFromTag() { } @Override - public void onSyncedDataUpdated(EntityDataAccessor pKey) { + public void onSyncedDataUpdated(@NotNull EntityDataAccessor pKey) { super.onSyncedDataUpdated(pKey); if (pKey == BEHAVIOR_TAG) { - this.dynamicBehavior = BehaviorRegistry.create( data.behaviorKey,this, this.entityData.get(BEHAVIOR_TAG)); + this.dynamicBehavior = BehaviorRegistry.create(data.behaviorKey, this, this.entityData.get(BEHAVIOR_TAG)); } } @@ -651,7 +656,7 @@ public void setBedBackoff(int bedBackoff) { public void getTooltip(List tooltip) { if (!isTamed()) return; - if(this.isPassenger() && this.getRootVehicle() instanceof Starbuncle baseStarby){ + if (this.isPassenger() && this.getRootVehicle() instanceof Starbuncle baseStarby) { baseStarby.getTooltip(tooltip); return; } @@ -689,18 +694,19 @@ public String getColor() { @Override public ResourceLocation getTexture(Starbuncle entity) { - if(entity.getName().getString().equals("Gootastic")){ - return ArsNouveau.prefix( "textures/entity/starbuncle_goo.png"); + if (entity.getName().getString().equals("Gootastic")) { + return ArsNouveau.prefix("textures/entity/starbuncle_goo.png"); } String color = getColor(entity); if (color.isEmpty()) color = DyeColor.ORANGE.getName(); - return ArsNouveau.prefix( "textures/entity/starbuncle_" + color.toLowerCase() + ".png"); + return ArsNouveau.prefix("textures/entity/starbuncle_" + color.toLowerCase() + ".png"); } - @org.jetbrains.annotations.Nullable + @SuppressWarnings("all") + @Nullable @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @org.jetbrains.annotations.Nullable SpawnGroupData pSpawnData) { + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, @NotNull DifficultyInstance pDifficulty, @NotNull MobSpawnType pReason, @org.jetbrains.annotations.Nullable SpawnGroupData pSpawnData) { RandomSource randomSource = pLevel.getRandom(); if (randomSource.nextFloat() <= 0.1f && !Rewards.starbuncles.isEmpty()) { try { @@ -746,11 +752,13 @@ public void addGoalDebug(Object goal, DebugEvent debugEvent, boolean storeDuplic addDebugEvent(debugEvent, storeDuplicate); } - + /* + * Syncs the behavior tag to the client for rendering purposes. + */ @Override public void onTagSync(CompoundTag tag) { if (level.isClientSide) { - this.dynamicBehavior = BehaviorRegistry.create(data.behaviorKey, this, tag); + this.dynamicBehavior = BehaviorRegistry.create(ResourceLocation.parse(entityData.get(BEHAVIOR_KEY)), this, tag); } } From 620f26f797f3b9abd274fa956d01e45fae60fa0a Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Fri, 13 Sep 2024 20:26:31 -0500 Subject: [PATCH 178/363] 5.1.0 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 20a3691bfc..08278f33ec 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.0.12 +mod_version=5.1.0 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 149b77031c3abda4c92ce58baf6c53a93137e116 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 18 Sep 2024 19:57:39 -0500 Subject: [PATCH 179/363] Add admin starbies --- .../renderer/entity/StarbuncleModel.java | 5 +- .../arsnouveau/common/entity/Starbuncle.java | 20 + .../ars_nouveau/geo/sir_squirrely.geo.json | 406 ++++++++++++++++++ .../assets/ars_nouveau/geo/xacris.geo.json | 301 +++++++++++++ .../assets/ars_nouveau/geo/zieg.geo.json | 388 +++++++++++++++++ .../textures/entity/sir_squirrely.png | Bin 0 -> 1968 bytes .../ars_nouveau/textures/entity/xacris.png | Bin 0 -> 1299 bytes .../ars_nouveau/textures/entity/zieg.png | Bin 0 -> 1784 bytes 8 files changed, 1116 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/assets/ars_nouveau/geo/sir_squirrely.geo.json create mode 100644 src/main/resources/assets/ars_nouveau/geo/xacris.geo.json create mode 100644 src/main/resources/assets/ars_nouveau/geo/zieg.geo.json create mode 100644 src/main/resources/assets/ars_nouveau/textures/entity/sir_squirrely.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/entity/xacris.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/entity/zieg.png diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java index 8174adbd1f..837b8b7ee3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java @@ -30,10 +30,7 @@ public void setCustomAnimations(Starbuncle entity, long uniqueID, @Nullable Anim @Override public ResourceLocation getModelResource(Starbuncle carbuncle) { - if(carbuncle.getName().getString().equals("Gootastic")){ - return ArsNouveau.prefix("geo/goobuncle.geo.json"); - } - return ArsNouveau.prefix( "geo/starbuncle.geo.json"); + return carbuncle.getModel(); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 170cc68b2a..94e7f75a6a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -697,12 +697,32 @@ public ResourceLocation getTexture(Starbuncle entity) { if (entity.getName().getString().equals("Gootastic")) { return ArsNouveau.prefix("textures/entity/starbuncle_goo.png"); } + var customTexture = getCustomBuncle(); + if(customTexture != null){ + return ArsNouveau.prefix("textures/entity/" + customTexture + ".png"); + } String color = getColor(entity); if (color.isEmpty()) color = DyeColor.ORANGE.getName(); return ArsNouveau.prefix("textures/entity/starbuncle_" + color.toLowerCase() + ".png"); } + public ResourceLocation getModel(){ + var modelName = getCustomBuncle(); + return ArsNouveau.prefix( "geo/" + (modelName == null ? "starbuncle" : modelName) + ".geo.json"); + } + + public @Nullable String getCustomBuncle(){ + var nameString = getName().getString(); + return switch (nameString) { + case "Gootastic" -> "goobuncle"; + case "Sir Squirrely" -> "sir_squirrely"; + case "Zieg" -> "zieg"; + case "Xacris" -> "xacris"; + default -> null; + }; + } + @SuppressWarnings("all") @Nullable @Override diff --git a/src/main/resources/assets/ars_nouveau/geo/sir_squirrely.geo.json b/src/main/resources/assets/ars_nouveau/geo/sir_squirrely.geo.json new file mode 100644 index 0000000000..9bbd072bc2 --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/geo/sir_squirrely.geo.json @@ -0,0 +1,406 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 64, + "texture_height": 64, + "visible_bounds_width": 2, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "starbuncle", + "pivot": [0, 0, -0.5] + }, + { + "name": "body", + "parent": "starbuncle", + "pivot": [0, 2.5, -0.5], + "cubes": [ + { + "origin": [-2, 1, -2.5], + "size": [4, 3, 4], + "uv": { + "north": {"uv": [27, 12], "uv_size": [4, 3]}, + "east": {"uv": [0, 28], "uv_size": [4, 3]}, + "south": {"uv": [28, 0], "uv_size": [4, 3]}, + "west": {"uv": [28, 3], "uv_size": [4, 3]}, + "up": {"uv": [25, 23], "uv_size": [4, 4]}, + "down": {"uv": [5, 31], "uv_size": [4, -4]} + } + }, + { + "origin": [-2, 1, -2.5], + "size": [4, 3, 4], + "inflate": 0.1, + "uv": { + "north": {"uv": [17, 29], "uv_size": [4, 3]}, + "east": {"uv": [21, 29], "uv_size": [4, 3]}, + "south": {"uv": [29, 23], "uv_size": [4, 3]}, + "west": {"uv": [29, 26], "uv_size": [4, 3]}, + "up": {"uv": [13, 27], "uv_size": [4, 4]}, + "down": {"uv": [25, 31], "uv_size": [4, -4]} + } + } + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 4, -2.5], + "cubes": [ + { + "origin": [-2.5, 2, -6.5], + "size": [5, 4, 4], + "uv": { + "north": {"uv": [23, 0], "uv_size": [5, 4]}, + "east": {"uv": [27, 8], "uv_size": [4, 4]}, + "south": {"uv": [23, 4], "uv_size": [5, 4]}, + "west": {"uv": [9, 27], "uv_size": [4, 4]}, + "up": {"uv": [0, 24], "uv_size": [5, 4]}, + "down": {"uv": [25, 19], "uv_size": [5, -4]} + } + }, + { + "origin": [-2.5, 1, -6.65], + "size": [5, 4, 0], + "uv": { + "north": {"uv": [25, 19], "uv_size": [5, 4]}, + "east": {"uv": [0, 0], "uv_size": [0, 4]}, + "south": {"uv": [20, 25], "uv_size": [5, 4]}, + "west": {"uv": [0, 0], "uv_size": [0, 4]}, + "up": {"uv": [0, 0], "uv_size": [5, 0]}, + "down": {"uv": [0, 0], "uv_size": [5, 0]} + } + }, + { + "origin": [-0.5, 3, -7], + "size": [1, 1, 1], + "uv": { + "north": {"uv": [32, 21], "uv_size": [1, 1]}, + "east": {"uv": [33, 2], "uv_size": [1, 1]}, + "south": {"uv": [33, 3], "uv_size": [1, 1]}, + "west": {"uv": [33, 4], "uv_size": [1, 1]}, + "up": {"uv": [10, 33], "uv_size": [1, 1]}, + "down": {"uv": [11, 34], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "tophat", + "parent": "head", + "pivot": [0, 3, -3], + "cubes": [ + { + "origin": [-3.5, 5, -8], + "size": [7, 1, 7], + "uv": { + "north": {"uv": [28, 6], "uv_size": [7, 1]}, + "east": {"uv": [28, 7], "uv_size": [7, 1]}, + "south": {"uv": [29, 29], "uv_size": [7, 1]}, + "west": {"uv": [30, 15], "uv_size": [7, 1]}, + "up": {"uv": [0, 0], "uv_size": [7, 7]}, + "down": {"uv": [0, 14], "uv_size": [7, -7]} + } + }, + { + "origin": [-2.5, 6, -7], + "size": [5, 5, 5], + "uv": { + "north": {"uv": [20, 15], "uv_size": [5, 5]}, + "east": {"uv": [20, 20], "uv_size": [5, 5]}, + "south": {"uv": [5, 22], "uv_size": [5, 5]}, + "west": {"uv": [10, 22], "uv_size": [5, 5]}, + "up": {"uv": [22, 10], "uv_size": [5, 5]}, + "down": {"uv": [15, 27], "uv_size": [5, -5]} + } + } + ] + }, + { + "name": "ear_left", + "parent": "head", + "pivot": [1.5, 5, -4.5], + "rotation": [-20, 45, 0], + "cubes": [ + { + "origin": [1, 5, -5], + "size": [1, 6, 1], + "uv": { + "north": {"uv": [4, 28], "uv_size": [1, 6]}, + "east": {"uv": [30, 16], "uv_size": [1, 6]}, + "south": {"uv": [29, 30], "uv_size": [1, 6]}, + "west": {"uv": [30, 30], "uv_size": [1, 6]}, + "up": {"uv": [12, 33], "uv_size": [1, 1]}, + "down": {"uv": [13, 34], "uv_size": [1, -1]} + } + }, + { + "origin": [1, 7, -4], + "size": [1, 5, 1], + "uv": { + "north": {"uv": [28, 31], "uv_size": [1, 5]}, + "east": {"uv": [31, 30], "uv_size": [1, 5]}, + "south": {"uv": [32, 0], "uv_size": [1, 5]}, + "west": {"uv": [5, 32], "uv_size": [1, 5]}, + "up": {"uv": [33, 16], "uv_size": [1, 1]}, + "down": {"uv": [33, 18], "uv_size": [1, -1]} + } + }, + { + "origin": [1, 8, -3], + "size": [1, 3, 1], + "uv": { + "north": {"uv": [5, 14], "uv_size": [1, 3]}, + "east": {"uv": [6, 14], "uv_size": [1, 3]}, + "south": {"uv": [14, 32], "uv_size": [1, 3]}, + "west": {"uv": [15, 32], "uv_size": [1, 3]}, + "up": {"uv": [33, 18], "uv_size": [1, 1]}, + "down": {"uv": [33, 20], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "ear_right", + "parent": "head", + "pivot": [-1.5, 5, -4.5], + "rotation": [-20, -45, 0], + "cubes": [ + { + "origin": [-2, 5, -5], + "size": [1, 6, 1], + "uv": { + "north": {"uv": [31, 16], "uv_size": [1, 6]}, + "east": {"uv": [25, 31], "uv_size": [1, 6]}, + "south": {"uv": [26, 31], "uv_size": [1, 6]}, + "west": {"uv": [27, 31], "uv_size": [1, 6]}, + "up": {"uv": [4, 34], "uv_size": [1, 1]}, + "down": {"uv": [34, 5], "uv_size": [1, -1]} + } + }, + { + "origin": [-2, 7, -4], + "size": [1, 5, 1], + "uv": { + "north": {"uv": [6, 32], "uv_size": [1, 5]}, + "east": {"uv": [7, 32], "uv_size": [1, 5]}, + "south": {"uv": [8, 32], "uv_size": [1, 5]}, + "west": {"uv": [9, 32], "uv_size": [1, 5]}, + "up": {"uv": [10, 34], "uv_size": [1, 1]}, + "down": {"uv": [11, 35], "uv_size": [1, -1]} + } + }, + { + "origin": [-2, 8, -3], + "size": [1, 3, 1], + "uv": { + "north": {"uv": [16, 32], "uv_size": [1, 3]}, + "east": {"uv": [32, 16], "uv_size": [1, 3]}, + "south": {"uv": [17, 32], "uv_size": [1, 3]}, + "west": {"uv": [18, 32], "uv_size": [1, 3]}, + "up": {"uv": [12, 34], "uv_size": [1, 1]}, + "down": {"uv": [13, 35], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 3.5, 1.5], + "rotation": [0, 0, 0], + "cubes": [ + { + "origin": [-2.5, 3, 1.5], + "size": [5, 5, 5], + "uv": { + "north": {"uv": [7, 12], "uv_size": [5, 5]}, + "east": {"uv": [12, 12], "uv_size": [5, 5]}, + "south": {"uv": [13, 0], "uv_size": [5, 5]}, + "west": {"uv": [13, 5], "uv_size": [5, 5]}, + "up": {"uv": [0, 14], "uv_size": [5, 5]}, + "down": {"uv": [5, 22], "uv_size": [5, -5]} + } + } + ] + }, + { + "name": "item", + "parent": "tail", + "pivot": [0, 9.5, 4] + }, + { + "name": "basket", + "parent": "tail", + "pivot": [0, 8, 4], + "cubes": [ + { + "origin": [-3, 8, 1], + "size": [6, 1, 6], + "uv": { + "north": {"uv": [30, 22], "uv_size": [6, 1]}, + "east": {"uv": [5, 31], "uv_size": [6, 1]}, + "south": {"uv": [31, 8], "uv_size": [6, 1]}, + "west": {"uv": [31, 9], "uv_size": [6, 1]}, + "up": {"uv": [7, 0], "uv_size": [6, 6]}, + "down": {"uv": [7, 12], "uv_size": [6, -6]} + } + }, + { + "origin": [2, 9, 1], + "size": [1, 1, 6], + "uv": { + "north": {"uv": [33, 20], "uv_size": [1, 1]}, + "east": {"uv": [31, 10], "uv_size": [6, 1]}, + "south": {"uv": [33, 21], "uv_size": [1, 1]}, + "west": {"uv": [11, 31], "uv_size": [6, 1]}, + "up": {"uv": [0, 31], "uv_size": [1, 6]}, + "down": {"uv": [1, 37], "uv_size": [1, -6]} + } + }, + { + "origin": [-3, 9, 1], + "size": [1, 1, 6], + "uv": { + "north": {"uv": [33, 23], "uv_size": [1, 1]}, + "east": {"uv": [31, 11], "uv_size": [6, 1]}, + "south": {"uv": [33, 24], "uv_size": [1, 1]}, + "west": {"uv": [31, 12], "uv_size": [6, 1]}, + "up": {"uv": [2, 31], "uv_size": [1, 6]}, + "down": {"uv": [3, 37], "uv_size": [1, -6]} + } + }, + { + "origin": [-2, 9, 6], + "size": [4, 1, 1], + "uv": { + "north": {"uv": [13, 10], "uv_size": [4, 1]}, + "east": {"uv": [33, 25], "uv_size": [1, 1]}, + "south": {"uv": [13, 11], "uv_size": [4, 1]}, + "west": {"uv": [33, 26], "uv_size": [1, 1]}, + "up": {"uv": [23, 8], "uv_size": [4, 1]}, + "down": {"uv": [23, 10], "uv_size": [4, -1]} + } + }, + { + "origin": [-2, 9, 1], + "size": [4, 1, 1], + "uv": { + "north": {"uv": [31, 13], "uv_size": [4, 1]}, + "east": {"uv": [33, 27], "uv_size": [1, 1]}, + "south": {"uv": [31, 14], "uv_size": [4, 1]}, + "west": {"uv": [33, 28], "uv_size": [1, 1]}, + "up": {"uv": [32, 5], "uv_size": [4, 1]}, + "down": {"uv": [10, 33], "uv_size": [4, -1]} + } + }, + { + "origin": [-2.5, 3, 1.5], + "size": [5, 5, 5], + "inflate": 0.1, + "uv": { + "north": {"uv": [10, 17], "uv_size": [5, 5]}, + "east": {"uv": [17, 10], "uv_size": [5, 5]}, + "south": {"uv": [15, 17], "uv_size": [5, 5]}, + "west": {"uv": [18, 0], "uv_size": [5, 5]}, + "up": {"uv": [18, 5], "uv_size": [5, 5]}, + "down": {"uv": [0, 24], "uv_size": [5, -5]} + } + } + ] + }, + { + "name": "legs_front", + "parent": "body", + "pivot": [0, 1.5, -1.5] + }, + { + "name": "leg_front_left", + "parent": "legs_front", + "pivot": [1, 1.5, -1.5], + "cubes": [ + { + "origin": [0.5, 0, -2], + "size": [1, 2, 1], + "uv": { + "north": {"uv": [17, 15], "uv_size": [1, 2]}, + "east": {"uv": [18, 15], "uv_size": [1, 2]}, + "south": {"uv": [19, 15], "uv_size": [1, 2]}, + "west": {"uv": [17, 27], "uv_size": [1, 2]}, + "up": {"uv": [33, 30], "uv_size": [1, 1]}, + "down": {"uv": [33, 32], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "leg_front_right", + "parent": "legs_front", + "pivot": [-1, 1.5, -1.5], + "cubes": [ + { + "origin": [-1.5, 0, -2], + "size": [1, 2, 1], + "uv": { + "north": {"uv": [20, 32], "uv_size": [1, 2]}, + "east": {"uv": [21, 32], "uv_size": [1, 2]}, + "south": {"uv": [22, 32], "uv_size": [1, 2]}, + "west": {"uv": [23, 32], "uv_size": [1, 2]}, + "up": {"uv": [34, 0], "uv_size": [1, 1]}, + "down": {"uv": [34, 2], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "legs_back", + "parent": "body", + "pivot": [0, 1.5, 0.5] + }, + { + "name": "leg_back_left", + "parent": "legs_back", + "pivot": [1, 1.5, 0.5], + "cubes": [ + { + "origin": [0.5, 0, 0], + "size": [1, 2, 1], + "uv": { + "north": {"uv": [18, 27], "uv_size": [1, 2]}, + "east": {"uv": [19, 27], "uv_size": [1, 2]}, + "south": {"uv": [19, 32], "uv_size": [1, 2]}, + "west": {"uv": [32, 19], "uv_size": [1, 2]}, + "up": {"uv": [33, 32], "uv_size": [1, 1]}, + "down": {"uv": [33, 34], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "leg_back_right", + "parent": "legs_back", + "pivot": [-1, 1.5, 0.5], + "cubes": [ + { + "origin": [-1.5, 0, 0], + "size": [1, 2, 1], + "uv": { + "north": {"uv": [24, 32], "uv_size": [1, 2]}, + "east": {"uv": [32, 30], "uv_size": [1, 2]}, + "south": {"uv": [32, 32], "uv_size": [1, 2]}, + "west": {"uv": [33, 0], "uv_size": [1, 2]}, + "up": {"uv": [34, 2], "uv_size": [1, 1]}, + "down": {"uv": [34, 4], "uv_size": [1, -1]} + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/geo/xacris.geo.json b/src/main/resources/assets/ars_nouveau/geo/xacris.geo.json new file mode 100644 index 0000000000..80b6988907 --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/geo/xacris.geo.json @@ -0,0 +1,301 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 32, + "texture_height": 32, + "visible_bounds_width": 2, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "starbuncle", + "pivot": [0, 0, -0.5] + }, + { + "name": "body", + "parent": "starbuncle", + "pivot": [0, 2.5, -0.5], + "cubes": [ + { + "origin": [-2, 1, -2.5], + "size": [4, 3, 4], + "uv": { + "north": {"uv": [24, 4], "uv_size": [4, 3]}, + "east": {"uv": [24, 7], "uv_size": [4, 3]}, + "south": {"uv": [8, 24], "uv_size": [4, 3]}, + "west": {"uv": [12, 24], "uv_size": [4, 3]}, + "up": {"uv": [0, 22], "uv_size": [4, 4]}, + "down": {"uv": [20, 26], "uv_size": [4, -4]} + } + } + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 4, -2.5], + "cubes": [ + { + "origin": [-2.5, 2, -6.5], + "size": [5, 4, 4], + "uv": { + "north": {"uv": [20, 10], "uv_size": [5, 4]}, + "east": {"uv": [24, 0], "uv_size": [4, 4]}, + "south": {"uv": [20, 14], "uv_size": [5, 4]}, + "west": {"uv": [4, 24], "uv_size": [4, 4]}, + "up": {"uv": [15, 20], "uv_size": [5, 4]}, + "down": {"uv": [20, 22], "uv_size": [5, -4]} + } + }, + { + "origin": [-0.5, 3, -7], + "size": [1, 1, 1], + "uv": { + "north": {"uv": [9, 27], "uv_size": [1, 1]}, + "east": {"uv": [10, 27], "uv_size": [1, 1]}, + "south": {"uv": [11, 27], "uv_size": [1, 1]}, + "west": {"uv": [12, 27], "uv_size": [1, 1]}, + "up": {"uv": [13, 27], "uv_size": [1, 1]}, + "down": {"uv": [14, 28], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "ear_left", + "parent": "head", + "pivot": [1.5, 5, -4.5], + "rotation": [-20, 45, 0], + "cubes": [ + { + "origin": [1.5, 5, -6], + "size": [0, 7, 4], + "uv": { + "north": {"uv": [0, 0], "uv_size": [0, 7]}, + "east": {"uv": [10, 0], "uv_size": [4, 7]}, + "south": {"uv": [0, 0], "uv_size": [0, 7]}, + "west": {"uv": [10, 7], "uv_size": [4, 7]}, + "up": {"uv": [0, 0], "uv_size": [0, 4]}, + "down": {"uv": [0, 4], "uv_size": [0, -4]} + } + } + ] + }, + { + "name": "ear_right", + "parent": "head", + "pivot": [-1.5, 5, -4.5], + "rotation": [-20, -45, 0], + "cubes": [ + { + "origin": [-1.5, 5, -6], + "size": [0, 7, 4], + "uv": { + "north": {"uv": [0, 0], "uv_size": [0, 7]}, + "east": {"uv": [6, 0], "uv_size": [4, 7]}, + "south": {"uv": [0, 0], "uv_size": [0, 7]}, + "west": {"uv": [6, 7], "uv_size": [4, 7]}, + "up": {"uv": [0, 0], "uv_size": [0, 4]}, + "down": {"uv": [0, 4], "uv_size": [0, -4]} + } + } + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 3.5, 1.5], + "cubes": [ + { + "origin": [-2.5, 3, 1.5], + "size": [5, 5, 5], + "uv": { + "north": {"uv": [0, 12], "uv_size": [5, 5]}, + "east": {"uv": [14, 0], "uv_size": [5, 5]}, + "south": {"uv": [5, 14], "uv_size": [5, 5]}, + "west": {"uv": [14, 5], "uv_size": [5, 5]}, + "up": {"uv": [10, 14], "uv_size": [5, 5]}, + "down": {"uv": [15, 15], "uv_size": [5, -5]} + } + } + ] + }, + { + "name": "item", + "parent": "tail", + "pivot": [0, 9.5, 4] + }, + { + "name": "basket", + "parent": "tail", + "pivot": [0, 8, 4], + "cubes": [ + { + "origin": [-3, 8, 1], + "size": [6, 1, 6], + "uv": { + "north": {"uv": [24, 22], "uv_size": [6, 1]}, + "east": {"uv": [24, 23], "uv_size": [6, 1]}, + "south": {"uv": [24, 24], "uv_size": [6, 1]}, + "west": {"uv": [25, 10], "uv_size": [6, 1]}, + "up": {"uv": [0, 0], "uv_size": [6, 6]}, + "down": {"uv": [0, 12], "uv_size": [6, -6]} + } + }, + { + "origin": [2, 9, 1], + "size": [1, 1, 6], + "uv": { + "north": {"uv": [15, 27], "uv_size": [1, 1]}, + "east": {"uv": [25, 11], "uv_size": [6, 1]}, + "south": {"uv": [27, 26], "uv_size": [1, 1]}, + "west": {"uv": [25, 12], "uv_size": [6, 1]}, + "up": {"uv": [16, 24], "uv_size": [1, 6]}, + "down": {"uv": [17, 30], "uv_size": [1, -6]} + } + }, + { + "origin": [-3, 9, 1], + "size": [1, 1, 6], + "uv": { + "north": {"uv": [27, 27], "uv_size": [1, 1]}, + "east": {"uv": [25, 13], "uv_size": [6, 1]}, + "south": {"uv": [0, 28], "uv_size": [1, 1]}, + "west": {"uv": [25, 14], "uv_size": [6, 1]}, + "up": {"uv": [18, 24], "uv_size": [1, 6]}, + "down": {"uv": [19, 30], "uv_size": [1, -6]} + } + }, + { + "origin": [-2, 9, 6], + "size": [4, 1, 1], + "uv": { + "north": {"uv": [25, 15], "uv_size": [4, 1]}, + "east": {"uv": [28, 0], "uv_size": [1, 1]}, + "south": {"uv": [25, 16], "uv_size": [4, 1]}, + "west": {"uv": [1, 28], "uv_size": [1, 1]}, + "up": {"uv": [25, 17], "uv_size": [4, 1]}, + "down": {"uv": [25, 19], "uv_size": [4, -1]} + } + }, + { + "origin": [-2, 9, 1], + "size": [4, 1, 1], + "uv": { + "north": {"uv": [25, 19], "uv_size": [4, 1]}, + "east": {"uv": [28, 1], "uv_size": [1, 1]}, + "south": {"uv": [25, 20], "uv_size": [4, 1]}, + "west": {"uv": [2, 28], "uv_size": [1, 1]}, + "up": {"uv": [25, 21], "uv_size": [4, 1]}, + "down": {"uv": [24, 26], "uv_size": [4, -1]} + } + }, + { + "origin": [-2.5, 3, 1.5], + "size": [5, 5, 5], + "inflate": 0.1, + "uv": { + "north": {"uv": [15, 15], "uv_size": [5, 5]}, + "east": {"uv": [0, 17], "uv_size": [5, 5]}, + "south": {"uv": [19, 0], "uv_size": [5, 5]}, + "west": {"uv": [5, 19], "uv_size": [5, 5]}, + "up": {"uv": [19, 5], "uv_size": [5, 5]}, + "down": {"uv": [10, 24], "uv_size": [5, -5]} + } + } + ] + }, + { + "name": "legs_front", + "parent": "body", + "pivot": [0, 1.5, -1.5] + }, + { + "name": "leg_front_left", + "parent": "legs_front", + "pivot": [1, 1.5, -1.5], + "cubes": [ + { + "origin": [0.5, 0, -2], + "size": [1, 2, 1], + "uv": { + "north": {"uv": [5, 12], "uv_size": [1, 2]}, + "east": {"uv": [14, 10], "uv_size": [1, 2]}, + "south": {"uv": [14, 12], "uv_size": [1, 2]}, + "west": {"uv": [4, 22], "uv_size": [1, 2]}, + "up": {"uv": [28, 2], "uv_size": [1, 1]}, + "down": {"uv": [3, 29], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "leg_front_right", + "parent": "legs_front", + "pivot": [-1, 1.5, -1.5], + "cubes": [ + { + "origin": [-1.5, 0, -2], + "size": [1, 2, 1], + "uv": { + "north": {"uv": [20, 26], "uv_size": [1, 2]}, + "east": {"uv": [21, 26], "uv_size": [1, 2]}, + "south": {"uv": [22, 26], "uv_size": [1, 2]}, + "west": {"uv": [23, 26], "uv_size": [1, 2]}, + "up": {"uv": [28, 4], "uv_size": [1, 1]}, + "down": {"uv": [5, 29], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "legs_back", + "parent": "body", + "pivot": [0, 1.5, 0.5] + }, + { + "name": "leg_back_left", + "parent": "legs_back", + "pivot": [1, 1.5, 0.5], + "cubes": [ + { + "origin": [0.5, 0, 0], + "size": [1, 2, 1], + "uv": { + "north": {"uv": [0, 26], "uv_size": [1, 2]}, + "east": {"uv": [1, 26], "uv_size": [1, 2]}, + "south": {"uv": [2, 26], "uv_size": [1, 2]}, + "west": {"uv": [3, 26], "uv_size": [1, 2]}, + "up": {"uv": [28, 3], "uv_size": [1, 1]}, + "down": {"uv": [4, 29], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "leg_back_right", + "parent": "legs_back", + "pivot": [-1, 1.5, 0.5], + "cubes": [ + { + "origin": [-1.5, 0, 0], + "size": [1, 2, 1], + "uv": { + "north": {"uv": [24, 26], "uv_size": [1, 2]}, + "east": {"uv": [25, 26], "uv_size": [1, 2]}, + "south": {"uv": [26, 26], "uv_size": [1, 2]}, + "west": {"uv": [8, 27], "uv_size": [1, 2]}, + "up": {"uv": [28, 5], "uv_size": [1, 1]}, + "down": {"uv": [6, 29], "uv_size": [1, -1]} + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/geo/zieg.geo.json b/src/main/resources/assets/ars_nouveau/geo/zieg.geo.json new file mode 100644 index 0000000000..88a37d4020 --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/geo/zieg.geo.json @@ -0,0 +1,388 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 64, + "texture_height": 64, + "visible_bounds_width": 3, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "starbuncle", + "pivot": [0, 0, -0.5] + }, + { + "name": "body", + "parent": "starbuncle", + "pivot": [0, 2.5, -0.5], + "cubes": [ + { + "origin": [-2, 1, -2.5], + "size": [4, 3, 4], + "inflate": 0.1, + "uv": { + "north": {"uv": [0, 25], "uv_size": [4, 3]}, + "east": {"uv": [25, 0], "uv_size": [4, 3]}, + "south": {"uv": [25, 3], "uv_size": [4, 3]}, + "west": {"uv": [25, 6], "uv_size": [4, 3]}, + "up": {"uv": [21, 0], "uv_size": [4, 4]}, + "down": {"uv": [21, 8], "uv_size": [4, -4]} + } + }, + { + "origin": [-2, 1, -2.5], + "size": [4, 3, 4], + "uv": { + "north": {"uv": [25, 9], "uv_size": [4, 3]}, + "east": {"uv": [25, 12], "uv_size": [4, 3]}, + "south": {"uv": [25, 15], "uv_size": [4, 3]}, + "west": {"uv": [25, 18], "uv_size": [4, 3]}, + "up": {"uv": [5, 24], "uv_size": [4, 4]}, + "down": {"uv": [9, 28], "uv_size": [4, -4]} + } + }, + { + "origin": [-0.5, 0, -2.75], + "size": [1, 2, 0], + "uv": { + "north": {"uv": [17, 30], "uv_size": [1, 2]}, + "east": {"uv": [0, 0], "uv_size": [0, 2]}, + "south": {"uv": [18, 30], "uv_size": [1, 2]}, + "west": {"uv": [0, 0], "uv_size": [0, 2]}, + "up": {"uv": [0, 0], "uv_size": [1, 0]}, + "down": {"uv": [0, 0], "uv_size": [1, 0]} + } + } + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 4, -2.5], + "rotation": [0, 0, 0], + "cubes": [ + { + "origin": [-2.5, 2, -6.5], + "size": [5, 4, 4], + "uv": { + "north": {"uv": [16, 10], "uv_size": [5, 4]}, + "east": {"uv": [21, 8], "uv_size": [4, 4]}, + "south": {"uv": [0, 17], "uv_size": [5, 4]}, + "west": {"uv": [20, 22], "uv_size": [4, 4]}, + "up": {"uv": [5, 20], "uv_size": [5, 4]}, + "down": {"uv": [10, 24], "uv_size": [5, -4]} + } + }, + { + "origin": [-2.5, 2, -6.5], + "size": [5, 4, 4], + "inflate": 0.2, + "uv": { + "north": {"uv": [20, 14], "uv_size": [5, 4]}, + "east": {"uv": [13, 24], "uv_size": [4, 4]}, + "south": {"uv": [15, 20], "uv_size": [5, 4]}, + "west": {"uv": [24, 22], "uv_size": [4, 4]}, + "up": {"uv": [20, 18], "uv_size": [5, 4]}, + "down": {"uv": [0, 25], "uv_size": [5, -4]} + } + }, + { + "origin": [-0.5, 3, -7], + "size": [1, 1, 1], + "uv": { + "north": {"uv": [29, 20], "uv_size": [1, 1]}, + "east": {"uv": [30, 10], "uv_size": [1, 1]}, + "south": {"uv": [30, 18], "uv_size": [1, 1]}, + "west": {"uv": [19, 30], "uv_size": [1, 1]}, + "up": {"uv": [30, 19], "uv_size": [1, 1]}, + "down": {"uv": [30, 21], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "ear_left", + "parent": "head", + "pivot": [1.5, 5, -4.5], + "rotation": [-20, 45, 0], + "cubes": [ + { + "origin": [1, 5, -5], + "size": [1, 6, 1], + "uv": { + "north": {"uv": [17, 24], "uv_size": [1, 6]}, + "east": {"uv": [18, 24], "uv_size": [1, 6]}, + "south": {"uv": [19, 24], "uv_size": [1, 6]}, + "west": {"uv": [4, 25], "uv_size": [1, 6]}, + "up": {"uv": [30, 28], "uv_size": [1, 1]}, + "down": {"uv": [29, 31], "uv_size": [1, -1]} + } + }, + { + "origin": [1, 7, -4], + "size": [1, 5, 1], + "uv": { + "north": {"uv": [5, 29], "uv_size": [1, 5]}, + "east": {"uv": [6, 29], "uv_size": [1, 5]}, + "south": {"uv": [29, 6], "uv_size": [1, 5]}, + "west": {"uv": [7, 29], "uv_size": [1, 5]}, + "up": {"uv": [30, 29], "uv_size": [1, 1]}, + "down": {"uv": [30, 31], "uv_size": [1, -1]} + } + }, + { + "origin": [1, 8, -3], + "size": [1, 3, 1], + "uv": { + "north": {"uv": [5, 12], "uv_size": [1, 3]}, + "east": {"uv": [12, 29], "uv_size": [1, 3]}, + "south": {"uv": [29, 12], "uv_size": [1, 3]}, + "west": {"uv": [13, 29], "uv_size": [1, 3]}, + "up": {"uv": [31, 0], "uv_size": [1, 1]}, + "down": {"uv": [31, 2], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "ear_right", + "parent": "head", + "pivot": [-1.5, 5, -4.5], + "rotation": [-20, -45, 0], + "cubes": [ + { + "origin": [-2, 5, -5], + "size": [1, 6, 1], + "uv": { + "north": {"uv": [26, 28], "uv_size": [1, 6]}, + "east": {"uv": [27, 28], "uv_size": [1, 6]}, + "south": {"uv": [28, 28], "uv_size": [1, 6]}, + "west": {"uv": [29, 0], "uv_size": [1, 6]}, + "up": {"uv": [31, 18], "uv_size": [1, 1]}, + "down": {"uv": [19, 32], "uv_size": [1, -1]} + } + }, + { + "origin": [-2, 7, -4], + "size": [1, 5, 1], + "uv": { + "north": {"uv": [8, 29], "uv_size": [1, 5]}, + "east": {"uv": [9, 29], "uv_size": [1, 5]}, + "south": {"uv": [10, 29], "uv_size": [1, 5]}, + "west": {"uv": [11, 29], "uv_size": [1, 5]}, + "up": {"uv": [31, 19], "uv_size": [1, 1]}, + "down": {"uv": [20, 32], "uv_size": [1, -1]} + } + }, + { + "origin": [-2, 8, -3], + "size": [1, 3, 1], + "uv": { + "north": {"uv": [14, 29], "uv_size": [1, 3]}, + "east": {"uv": [15, 29], "uv_size": [1, 3]}, + "south": {"uv": [29, 15], "uv_size": [1, 3]}, + "west": {"uv": [16, 29], "uv_size": [1, 3]}, + "up": {"uv": [31, 20], "uv_size": [1, 1]}, + "down": {"uv": [21, 32], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 3.5, 1.5], + "cubes": [ + { + "origin": [-2.5, 3, 1.5], + "size": [5, 5, 5], + "uv": { + "north": {"uv": [6, 0], "uv_size": [5, 5]}, + "east": {"uv": [6, 5], "uv_size": [5, 5]}, + "south": {"uv": [6, 10], "uv_size": [5, 5]}, + "west": {"uv": [11, 0], "uv_size": [5, 5]}, + "up": {"uv": [11, 5], "uv_size": [5, 5]}, + "down": {"uv": [11, 15], "uv_size": [5, -5]} + } + } + ] + }, + { + "name": "item", + "parent": "tail", + "pivot": [0, 9.5, 4] + }, + { + "name": "basket", + "parent": "tail", + "pivot": [0, 8, 4], + "cubes": [ + { + "origin": [-3, 8, 1], + "size": [6, 1, 6], + "uv": { + "north": {"uv": [25, 21], "uv_size": [6, 1]}, + "east": {"uv": [20, 26], "uv_size": [6, 1]}, + "south": {"uv": [26, 26], "uv_size": [6, 1]}, + "west": {"uv": [20, 27], "uv_size": [6, 1]}, + "up": {"uv": [0, 0], "uv_size": [6, 6]}, + "down": {"uv": [0, 12], "uv_size": [6, -6]} + } + }, + { + "origin": [2, 9, 1], + "size": [1, 1, 6], + "uv": { + "north": {"uv": [31, 2], "uv_size": [1, 1]}, + "east": {"uv": [26, 27], "uv_size": [6, 1]}, + "south": {"uv": [31, 3], "uv_size": [1, 1]}, + "west": {"uv": [5, 28], "uv_size": [6, 1]}, + "up": {"uv": [0, 28], "uv_size": [1, 6]}, + "down": {"uv": [1, 34], "uv_size": [1, -6]} + } + }, + { + "origin": [-3, 9, 1], + "size": [1, 1, 6], + "uv": { + "north": {"uv": [4, 31], "uv_size": [1, 1]}, + "east": {"uv": [11, 28], "uv_size": [6, 1]}, + "south": {"uv": [31, 4], "uv_size": [1, 1]}, + "west": {"uv": [20, 28], "uv_size": [6, 1]}, + "up": {"uv": [2, 28], "uv_size": [1, 6]}, + "down": {"uv": [3, 34], "uv_size": [1, -6]} + } + }, + { + "origin": [-2, 9, 6], + "size": [4, 1, 1], + "uv": { + "north": {"uv": [16, 14], "uv_size": [4, 1]}, + "east": {"uv": [31, 5], "uv_size": [1, 1]}, + "south": {"uv": [21, 12], "uv_size": [4, 1]}, + "west": {"uv": [31, 6], "uv_size": [1, 1]}, + "up": {"uv": [21, 13], "uv_size": [4, 1]}, + "down": {"uv": [28, 23], "uv_size": [4, -1]} + } + }, + { + "origin": [-2, 9, 1], + "size": [4, 1, 1], + "uv": { + "north": {"uv": [28, 23], "uv_size": [4, 1]}, + "east": {"uv": [31, 7], "uv_size": [1, 1]}, + "south": {"uv": [28, 24], "uv_size": [4, 1]}, + "west": {"uv": [31, 8], "uv_size": [1, 1]}, + "up": {"uv": [28, 25], "uv_size": [4, 1]}, + "down": {"uv": [29, 12], "uv_size": [4, -1]} + } + }, + { + "origin": [-2.5, 3, 1.5], + "size": [5, 5, 5], + "inflate": 0.1, + "uv": { + "north": {"uv": [0, 12], "uv_size": [5, 5]}, + "east": {"uv": [5, 15], "uv_size": [5, 5]}, + "south": {"uv": [10, 15], "uv_size": [5, 5]}, + "west": {"uv": [15, 15], "uv_size": [5, 5]}, + "up": {"uv": [16, 0], "uv_size": [5, 5]}, + "down": {"uv": [16, 10], "uv_size": [5, -5]} + } + } + ] + }, + { + "name": "legs_front", + "parent": "body", + "pivot": [0, 1.5, -1.5] + }, + { + "name": "leg_front_left", + "parent": "legs_front", + "pivot": [1, 1.5, -1.5], + "cubes": [ + { + "origin": [0.5, 0, -2], + "size": [1, 2, 1], + "uv": { + "north": {"uv": [29, 18], "uv_size": [1, 2]}, + "east": {"uv": [20, 29], "uv_size": [1, 2]}, + "south": {"uv": [21, 29], "uv_size": [1, 2]}, + "west": {"uv": [22, 29], "uv_size": [1, 2]}, + "up": {"uv": [31, 9], "uv_size": [1, 1]}, + "down": {"uv": [31, 11], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "leg_front_right", + "parent": "legs_front", + "pivot": [-1, 1.5, -1.5], + "cubes": [ + { + "origin": [-1.5, 0, -2], + "size": [1, 2, 1], + "uv": { + "north": {"uv": [30, 0], "uv_size": [1, 2]}, + "east": {"uv": [30, 2], "uv_size": [1, 2]}, + "south": {"uv": [30, 4], "uv_size": [1, 2]}, + "west": {"uv": [30, 6], "uv_size": [1, 2]}, + "up": {"uv": [31, 14], "uv_size": [1, 1]}, + "down": {"uv": [31, 16], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "legs_back", + "parent": "body", + "pivot": [0, 1.5, 0.5] + }, + { + "name": "leg_back_left", + "parent": "legs_back", + "pivot": [1, 1.5, 0.5], + "cubes": [ + { + "origin": [0.5, 0, 0], + "size": [1, 2, 1], + "uv": { + "north": {"uv": [23, 29], "uv_size": [1, 2]}, + "east": {"uv": [24, 29], "uv_size": [1, 2]}, + "south": {"uv": [25, 29], "uv_size": [1, 2]}, + "west": {"uv": [29, 28], "uv_size": [1, 2]}, + "up": {"uv": [31, 12], "uv_size": [1, 1]}, + "down": {"uv": [31, 14], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "leg_back_right", + "parent": "legs_back", + "pivot": [-1, 1.5, 0.5], + "cubes": [ + { + "origin": [-1.5, 0, 0], + "size": [1, 2, 1], + "uv": { + "north": {"uv": [30, 8], "uv_size": [1, 2]}, + "east": {"uv": [30, 12], "uv_size": [1, 2]}, + "south": {"uv": [30, 14], "uv_size": [1, 2]}, + "west": {"uv": [30, 16], "uv_size": [1, 2]}, + "up": {"uv": [31, 16], "uv_size": [1, 1]}, + "down": {"uv": [31, 18], "uv_size": [1, -1]} + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/textures/entity/sir_squirrely.png b/src/main/resources/assets/ars_nouveau/textures/entity/sir_squirrely.png new file mode 100644 index 0000000000000000000000000000000000000000..630fba600e3d2f172196ba9977186eecdca16642 GIT binary patch literal 1968 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 JPDHLkV1mu`cx3

fML!f#s0vDR|2*@oaCrMl0uRo=)Q<1o9|ZtJgEHE?+xWGdnSpAg5S8NSTmFOKRo_i0 z6e8hp7yxizlZ?v`3F!D<#?j$Rv#Niqkl4w%W}#Ctk+o!gF&d=js;2X@(f%>JOa!`9 zo{fe=AyOz51oye2>rk^i11 z_4V!|Ztaw20I1x7^N9q&Wqk3)nDK5z8EEOUDmI!hR_)XW0w003AO6p^(=ejzHw z(UG7+*BEF9>}k>3sAB2}of`M{ECF!Yt6jIS*521EAhJ0>u33nPI>t2%p%(>X=cdH`T3H3DQ!%;WjB(9^rPGmav9&-o zQdk-6KsKM`_caEZ@zrnBW$yjz#1qabK=v#>A*k7`XS`8sB)9RfSA`1*pry-#=+df) zQU^F<1TS)ChU*3ZB$8`M@?(|h2EnJae4phlvh#_wDk$xX|L8kEu6 z7(`Tx;{4Yz~jUb&%}CyNCv5E_%x$L6nQJK}4y8C|h)e*zKs>KZfTgX*>}Tf1&#F zavUpz9e~{#Cr=TKtfQiM?%?k=T_VLw7nle#gDo8x=`+yYBcZ)VLQ9uL|97`xcj`$1 z!0yzOXzy;rP(FZ&s3U91=u}LoMv8~hPHk8SNYyU7Bf<6_sYDdpdnAy(BRqnPh&moU zkSrU~&D|@AirK{s3yK|&ESc5(bl#`jwulUzz0l=6CX#E(>fU8!b?-8gNUkMM-+u@H ze@hLR1r{)u^T06nAd)%S#GjCs9n33RIkTWw-Zd*jy z4*((}opUVtQfoZpfSj4Zw+HFIe|_(A{FP6YEMx9zv*Df=0swoT-Hy+2inpN}DcJD< zSO*N{1L#y(m|P{RI!{QkSd6f2jU>ysuSvF-tRx~z9U248Q03xE!8(E&R1K%VvW{?u z&0e{P`9?~o(+Gt^fStQ%A1xwEUDc!q97X|Q-Wg;s%>_Jc3*O=FD@m!Vn;6$DtP08i zYCi=;079WqpvK#xm@_kcE6j3%qD)7h1xiKZX`Y|v`YXfo4D382>Lq2hLU60{z?W0l z`gjB1&N5eJFY8s__xV4(eqv*|ozFBf8-1(n(-wyrc67McQA&4u%&_4rSIg?r z?}5O!zBlIHikpCYfLoE-3$ycu_ToN1K0ZD^K0ZD^K0ZD^K0ZD^K0ZD^K0ZD^K0ZD^ av*&->hh5kKEL+L|0000 Date: Wed, 18 Sep 2024 19:58:08 -0500 Subject: [PATCH 180/363] merge supporters from 1.19 --- supporters.json | 112 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 2 deletions(-) diff --git a/supporters.json b/supporters.json index eae9f57ae9..7a30242583 100644 --- a/supporters.json +++ b/supporters.json @@ -21,7 +21,14 @@ "2980a99e-8582-4f63-9b82-f7117bc8be2c", "674b6c55-c4f3-4ef6-9a57-b4a7455f1296","0f4c174e-26f1-43c3-81d0-88507dba6e52", "5b1c9f9b-edd0-4632-9ba3-79b6dcc9bfa8", "eb0da540-8487-4ca0-8a5f-ed4acaa0268d", "8bacc3d4-a301-429b-859d-042d47f61e4d", "3d8f61f1-7333-4c4f-b9e8-d76a3b453420", "888d2798-4fdf-4e70-89ed-1bb2ff47c6c1", "8b93ffcd-e3e8-41c7-aee9-458b03bd0b34", - "1d1b87f0-5243-4b39-926f-f7490d28954a"], + "1d1b87f0-5243-4b39-926f-f7490d28954a", "45e4cde5-5c3f-4997-8564-3ae5be9407e1", "d8a9a09f-d6da-495b-8bb8-7d56f9c5b949", + "277d0321-7fe7-4ab0-b1bc-4b00ac627231", "8bbf2330-78d1-4ea7-945f-89b7a99298c2", "b4feb5db-e845-4bc1-b72e-b4de8b646288", + "0c6a5082-d327-41ec-8722-42d942f30f5a", "728ac916-4aac-439d-af1c-d68e6a51139b", "9c5e5766-0a1c-4563-a8c4-8184994a15a6", + "92d6215b-0730-44ce-a8b2-1baf4c2cd0d5", "bfde5990-f846-4dae-90d1-0372ce45f522", "c6ad89fd-6625-4290-83b2-2665e9e39225", + "7dc1de80-c04c-4c0f-8f00-6326d770626b", "8bf034ac-313f-435a-bd2b-200a7857021b", "1dafa767-ce2f-47c4-8142-67b0b4854586", + "9eff9013-f8a6-4a1a-9142-32d94d60d8c1", "671ffc64-8b5b-4ac2-87b1-138951be701e","aac7171c-9bac-42a8-b094-2363599dae59", + "47f9c9d2-89b2-4987-af6b-31e7b1f74da2", "ec77d204-6e8b-4dac-8b66-71b2a03c5e65", "98e72ae4-10c9-4696-970b-804eb9b176ae", + "0421ad40-0881-47d4-b086-38c90c1ab62f", "a8875ecb-6e84-4c6d-ac68-3251b945d963" ], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -95,7 +102,7 @@ "bio": "Solstice likes to wander off and explore the unknown, usually leaving the task at hand unfinished. She will usually be found in someone's home relieving them of their gold and other valuables." }, { - "name": "Aofie", + "name": "Aoife", "color": "lime", "adopter": "Sarenor", "bio": "Sarenor was in desperate need of help automating his Imbuement Stills when Aoife pranced through his automation basement on the search for adventure and food. After tossing a gold nugget at her, Aoife became Sarenors first and best Still Master. Today she enjoys a good dram, friends, and nice chair." @@ -338,6 +345,107 @@ "adopter": "Lyrellion", "color": "magenta", "bio": "This brightly colored starbuncle seems to have an endless supply of energy…almost like a 6 year old child..." + },{ + "name": "Ophelia", + "color": "purple", + "adopter": "Rythian", + "bio": "A friendly little helper, always on the lookout for a treat." + }, { + "name": "Hank", + "color": "black", + "adopter": "LeUnknownNugget", + "bio": "From the void and abyss, Nuggets cute little companion Hank" + }, { + "name": "Hanabi", + "color": "white", + "adopter": "angelixen", + "bio": "From high atop the snowy peaks, this starbuncle descended onto the land in an explosion of color." + },{ + "name": "Rozeta", + "adopter": "WayOfTime", + "color": "pink", + "bio": "A curious Starbuncle that likes to build and experiment with magic." + },{ + "name": "Oreo", + "adopter": "AdamTheZenith", + "color": "black", + "bio": "The lost pet of Adam the Archmagi. Their eyes speak of countless war crimes committed in pursuit of spell perfection." + },{ + "name": "Vivian", + "color": "purple", + "adopter": "Floofi", + "bio": "After having been bullied by her brothers and sisters for so long, she seeks a quiet life of peace. She only asks that you treat her well as she helps you with your adventure." + },{ + "name": "Sprigly", + "adopter": "Parsley", + "bio": "Always loved to help in the mouse garden", + "color": "lime" + },{ + "name": "Inven", + "color": "yellow", + "adopter": "Uni", + "bio": "Curious and mischievous, this little starbuncle loves experimenting and discovering new things." + },{ + "name": "Nugget", + "adopter": "Hubnester", + "color": "cyan", + "bio": "A cute lil guy who does cute lil things." + },{ + "name": "OmegaYun", + "color": "pink", + "adopter": "Milinen", + "bio": "Is angry at a big dummy named Adashi." + },{ + "name": "Honeybun", + "adopter": "LunarisDraconis", + "bio": "sweet, soft, shy, and loving loves cuddles and snacks", + "color": "pink" + },{ + "name": "Socks", + "adopter": "GrumpyGhost", + "bio": "Sent by a powerful archmage to help you. At least thats what it said on the note she carried...", + "color": "red" + },{ + "name": "Stella", + "adopter": "Feet Wellden", + "bio": "It seems they were sent by a certain alchemist and witch. to help you. ", + "color": "orange" + },{ + "color": "cyan", + "adopter": "alissabear01", + "name": "Yuto", + "bio": "Full of RAGE!!...or maybe he just needs a snack" + },{ + "color": "orange", + "name": "Patches", + "adopter": "Mick0604", + "bio": "Friendly and carefree, this Starbuncle loves to harvest pumpkins for some reason" + },{ + "color": "pink", + "name": "Alo'ra", + "adopter": "Nep", + "bio": "This starbuncle is very well loved. She carries a note that reads \"Please take care of her like she took care of me. She'd love to stargaze with you.\" " + },{ + "name": "Gootastic", + "color": "red", + "adopter": "Gootastic", + "bio": " It's unclear why it exists, but here we are. This Goobuncle's slimy demeanor is off-putting, but that's not so bad when you realize how unbelievably squishy its cheeks are." + },{ + "name": "Tav", + "color": "white", + "adopter": "Ruka_21", + "bio": "I wouldn't try to hit it. It might just be a poor starbuncle... or it might be a wildshaped druid.." + },{ + "name": "Buttercup", + "color": "orange", + "adopter": "Kazyo", + "bio": "This tidy starbuncle loves collecting flowers and decorating its tail with them. Yet it has never seen the flower that it is named after..." + },{ + "name": "Cloud", + "color": "cyan", + "adopter": "cloud8ine", + "bio": "This starbuncle is just here for the rest of the ride" } ] } + From cfd3710851a0712f30cfb0306a587efb381c0382 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 22 Sep 2024 10:19:49 -0500 Subject: [PATCH 181/363] Fix radial menu animation --- .../arsnouveau/client/gui/radial_menu/GuiRadialMenu.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java index 7479a871ca..da1d325b50 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.client.gui.radial_menu; +import com.hollingsworth.arsnouveau.client.ClientInfo; import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; @@ -85,7 +86,7 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTi PoseStack ms = graphics.pose(); float openAnimation = closing ? 1.0f - totalTime / OPEN_ANIMATION_LENGTH : totalTime / OPEN_ANIMATION_LENGTH; - float currTick = minecraft.getFrameTimeNs(); + float currTick = ClientInfo.partialTicks; totalTime += (currTick + extraTick - prevTick)/20f; extraTick = 0; prevTick = currTick; From cb02f60a08060229d6b823a0bf1a4d5cd37e4e52 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 22 Sep 2024 10:21:13 -0500 Subject: [PATCH 182/363] Discard follow proj on leave level #1370 --- .../arsnouveau/common/entity/EntityFollowProjectile.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java index b46c583684..8afe976a6d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java @@ -78,6 +78,12 @@ protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { pBuilder.define(DESPAWN, 10); } + @Override + public void onRemovedFromLevel() { + super.onRemovedFromLevel(); + this.remove(RemovalReason.DISCARDED); + } + public boolean defaultsBurst() { return false; } From 9ca8cc7ea502eedcc277d23c8732c11870360bf0 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 22 Sep 2024 10:22:47 -0500 Subject: [PATCH 183/363] Add missing smelt docs --- .../resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 ++-- src/generated/resources/assets/ars_nouveau/lang/en_us.json | 2 +- .../arsnouveau/common/spell/effect/EffectSmelt.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 47c0ac8085..e60bf48d8f 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-09-11T20:30:24.3997318 Languages: en_us for mod: ars_nouveau -8982cb3aa100d53d4eaaa60c1c21ce2bd17dcdb5 assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-09-22T10:22:33.0106432 Languages: en_us for mod: ars_nouveau +8e5ab95c04a148effb3f1b943177896ef20e787f assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index b64c6c0349..63ebddd063 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -273,7 +273,7 @@ "ars_nouveau.glyph_desc.glyph_sense_magic": "Applies Magic Find to the target, causing magical mobs to glow within 75 blocks of them. Magic Find also reveals spells on Runes.", "ars_nouveau.glyph_desc.glyph_sensitive": "Causes forms to target blocks they normally cannot target. Projectile and Orbit will target grass, and Touch will target fluids and air. Changes targeting rules of certain effects.", "ars_nouveau.glyph_desc.glyph_slowfall": "Applies the Slow Fall buff.", - "ars_nouveau.glyph_desc.glyph_smelt": "Smelts blocks and items in the world. AOE will increase the number of items and radius of blocks that can be smelted at once, while Amplify will allow Smelt to work on blocks of higher hardness, Sensitive will make it only smelt items and not blocks.", + "ars_nouveau.glyph_desc.glyph_smelt": "Smelts blocks and items in the world. AOE will increase the number of items and radius of blocks that can be smelted at once, while Amplify will allow Smelt to work on blocks of higher hardness, Sensitive will make it only smelt items and not blocks. Dampen will cause Smelt to use smoking recipes.", "ars_nouveau.glyph_desc.glyph_snare": "Stops entities from moving and jumping. Extend Time will increase the duration of this effect. Snaring a block created from the Focus of Block Shaping will cause it to attempt to place itself immediately.", "ars_nouveau.glyph_desc.glyph_split": "Causes multiple projectiles to be cast at once. Each projectile applies a set of effects.", "ars_nouveau.glyph_desc.glyph_summon_decoy": "Summons a decoy of yourself. Upon summoning, the decoy will attract any nearby mobs to attack it.", diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java index 499e1171cf..4a9e696c48 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java @@ -123,7 +123,7 @@ public Set getCompatibleAugments() { @Override public String getBookDescription() { - return "Smelts blocks and items in the world. AOE will increase the number of items and radius of blocks that can be smelted at once, while Amplify will allow Smelt to work on blocks of higher hardness, Sensitive will make it only smelt items and not blocks."; + return "Smelts blocks and items in the world. AOE will increase the number of items and radius of blocks that can be smelted at once, while Amplify will allow Smelt to work on blocks of higher hardness, Sensitive will make it only smelt items and not blocks. Dampen will cause Smelt to use smoking recipes."; } @Override From 562fe2f02f5f97f8c614ab2b557295d7fd2c33af Mon Sep 17 00:00:00 2001 From: Qther Date: Sun, 22 Sep 2024 23:24:56 +0800 Subject: [PATCH 184/363] fix: ignore frozen ticks in EventQueue (#1416) * fix: ignore frozen ticks in event queue 1.21 adds /tick, which allows you to freeze the game. NeoForge will fire ServerTickEvent.Post regardless of whether the game is frozen. We also can not observe the effects of a one-tick tick step in ServerTickEvent.Post, so we need to hook into ServerTickEvent.Pre to find out if it was stepping. * more EventQueue changes removal of "stale" list and fixing events queued during execution ticking in the same tick (leads to EffectDelay taking 1 less tick if executed by a ITimedEvent such as DelayedSpellEvent) * revert to using a stale list instead of ListIterator just in case * restore warning suppression for ForLoopReplaceableByForEach --- .../arsnouveau/api/event/EventQueue.java | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/EventQueue.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/EventQueue.java index a4c1884bb8..b901abfaef 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/EventQueue.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/EventQueue.java @@ -1,6 +1,8 @@ package com.hollingsworth.arsnouveau.api.event; import com.hollingsworth.arsnouveau.ArsNouveau; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.minecraft.server.ServerTickRateManager; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.ClientTickEvent; @@ -8,7 +10,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.List; /** @@ -17,16 +18,17 @@ @SuppressWarnings("ForLoopReplaceableByForEach") @EventBusSubscriber(modid = ArsNouveau.MODID) public class EventQueue { - @NotNull List events = new ArrayList<>();; + @NotNull List events = new ObjectArrayList<>(); public void tick(@Nullable ServerTickEvent.Post e) { if (events.isEmpty()) { return; } - List stale = new ArrayList<>(); + List stale = new ObjectArrayList<>(); // Enhanced-for or iterator will cause a concurrent modification. - for (int i = 0; i < events.size(); i++) { + int size = events.size(); + for (int i = 0; i < size; i++) { ITimedEvent event = events.get(i); if (event.isExpired()) { stale.add(event); @@ -62,7 +64,7 @@ public void clear() { for(ITimedEvent event : events){ event.onServerStopping(); } - this.events = new ArrayList<>(); + this.events = new ObjectArrayList<>(); } // Split these because our integrated servers are CURSED and both tick. @@ -70,17 +72,29 @@ public void clear() { private static EventQueue clientQueue; private EventQueue() { - events = new ArrayList<>(); + events = new ObjectArrayList<>(); } + private static boolean tickStepping = false; + @SubscribeEvent public static void serverTick(ServerTickEvent.Post e) { + ServerTickRateManager trm = e.getServer().tickRateManager(); + + if (trm.isFrozen() && !tickStepping) { + return; + } + EventQueue.getServerInstance().tick(e); } + @SubscribeEvent + public static void serverTickPre(ServerTickEvent.Pre e) { + tickStepping = e.getServer().tickRateManager().isSteppingForward(); + } + @SubscribeEvent public static void clientTickEvent(ClientTickEvent.Post e) { EventQueue.getClientQueue().tick(null); } - } From d8e1e7d91b54b1fa34983c996379ac79e72bd0cd Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Sun, 22 Sep 2024 17:30:11 +0200 Subject: [PATCH 185/363] Source Capability + DominionWand radial menu for mode select (#1415) * Source Capability + DominionWand radial menu for mode select * Makes Capability sided instead of no-context * fix face argument if strict --------- Co-authored-by: Bailey Hollingsworth --- build.gradle | 2 + .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 1 + .../assets/ars_nouveau/lang/en_us.json | 3 + .../api/source/AbstractSourceMachine.java | 98 +++++++-- .../arsnouveau/api/source/ISourceCap.java | 42 ++++ .../arsnouveau/api/source/ISourceTile.java | 29 +++ .../client/events/ClientEvents.java | 31 ++- .../client/gui/utils/RenderUtils.java | 11 +- .../common/block/ArchwoodChest.java | 39 ---- .../block/tile/CreativeSourceJarTile.java | 28 +++ .../common/block/tile/ImbuementTile.java | 36 +++- .../common/block/tile/RelaySplitterTile.java | 39 ++-- .../common/block/tile/RelayTile.java | 46 ++++- .../common/block/tile/RelayWarpTile.java | 18 ++ .../common/block/tile/SourcelinkTile.java | 23 ++- .../common/capability/SourceStorage.java | 195 ++++++++++++++++++ .../common/datagen/LangDatagen.java | 5 +- .../arsnouveau/common/items/DominionWand.java | 73 +++++-- .../common/items/RendererBlockItem.java | 9 +- .../common/items/data/DominionWandData.java | 5 + .../arsnouveau/common/network/Networking.java | 1 + .../network/PacketUpdateDominionWand.java | 50 +++++ .../setup/registry/BlockRegistry.java | 2 +- .../setup/registry/CapabilityRegistry.java | 19 +- 24 files changed, 679 insertions(+), 126 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/source/ISourceCap.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/capability/SourceStorage.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateDominionWand.java diff --git a/build.gradle b/build.gradle index b74a005cd7..4b02f98b97 100644 --- a/build.gradle +++ b/build.gradle @@ -118,6 +118,8 @@ dependencies { implementation 'com.github.glitchfiend:TerraBlender-neoforge:1.21-4.0.0.0' implementation "curse.maven:jade-324717:5444008" implementation 'top.theillusivec4.curios:curios-neoforge:9.0.4+1.21' + + implementation "curse.maven:ars-additions-974408:5698511" } jar { diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index e60bf48d8f..fabe05542c 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,3 @@ // 1.21.1 2024-09-22T10:22:33.0106432 Languages: en_us for mod: ars_nouveau 8e5ab95c04a148effb3f1b943177896ef20e787f assets/ars_nouveau/lang/en_us.json + diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 63ebddd063..42a83f0639 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -159,13 +159,16 @@ "ars_nouveau.crafting_progress": "Crafting Progress: %s", "ars_nouveau.crush_recipe": "Crush Glyph", "ars_nouveau.discord_text": "Join Discord!", + "ars_nouveau.dominion_wand.clear": "Clear", "ars_nouveau.dominion_wand.cleared": "Dominion wand cleared.", "ars_nouveau.dominion_wand.entity_stored": "Entity stored.", "ars_nouveau.dominion_wand.no_entity": "No entity set", "ars_nouveau.dominion_wand.no_location": "No location set.", + "ars_nouveau.dominion_wand.normal": "Normal Mode", "ars_nouveau.dominion_wand.position_set": "Position set.", "ars_nouveau.dominion_wand.position_stored": "Stored: %s", "ars_nouveau.dominion_wand.stored_entity": "Stored entity", + "ars_nouveau.dominion_wand.strict": "Strict Mode", "ars_nouveau.drygmy.blacklist": "Drygmy Blacklisted", "ars_nouveau.drygmy.only_use_jars": "Only Using Containment Jars", "ars_nouveau.dynamic_lights.button_off": "Dynamic lights are turned off.", diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java b/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java index ca25740c97..4a6d8997f1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.api.util.IWololoable; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.common.block.tile.ModdedTile; +import com.hollingsworth.arsnouveau.common.capability.SourceStorage; import com.hollingsworth.arsnouveau.common.items.data.BlockFillContents; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.core.BlockPos; @@ -11,6 +12,8 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public abstract class AbstractSourceMachine extends ModdedTile implements ISourceTile, IWololoable { @@ -25,8 +28,27 @@ public AbstractSourceMachine(BlockEntityType manaTile, BlockPos pos, BlockSta super(manaTile, pos, state); } + public @Nullable SourceStorage sourceStorage; + + public @NotNull SourceStorage getSourceStorage() { + if (sourceStorage == null) { + sourceStorage = new SourceStorage(getMaxSource(), getTransferRate(), getTransferRate(), source) { + public void onContentsChanged() { + /* + * This is called when the source changes in the capability, and is used to update the tile's value. + * Opposite of the setSource method called in updateBlock. + */ + AbstractSourceMachine.this.source = this.source; + AbstractSourceMachine.this.updateBlock(); + } + }; + if (level != null) level.invalidateCapabilities(worldPosition); + } + return sourceStorage; + } + @Override - protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + protected void loadAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider pRegistries) { super.loadAdditional(tag, pRegistries); source = tag.getInt(SOURCE_TAG); maxSource = tag.getInt(MAX_SOURCE_TAG); @@ -34,7 +56,7 @@ protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries } @Override - protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + protected void saveAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider pRegistries) { super.saveAdditional(tag, pRegistries); tag.putInt(SOURCE_TAG, getSource()); tag.putInt(MAX_SOURCE_TAG, getMaxSource()); @@ -45,15 +67,28 @@ protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries public int setSource(int source) { if (this.source == source) return this.source; - this.source = source; - if (this.source > this.getMaxSource()) - this.source = this.getMaxSource(); - if (this.source < 0) - this.source = 0; + this.source = Math.clamp(source, 0, this.getMaxSource()); updateBlock(); return this.source; } + public boolean updateBlock() { + if (level != null) { + // force update the capability + getSourceStorage().setSource(this.source); + BlockState state = level.getBlockState(worldPosition); + level.sendBlockUpdated(worldPosition, state, state, 3); + setChanged(); + return true; + } + return false; + } + + @Override + public int addSource(int source, boolean simulate) { + return getSourceStorage().receiveSource(source, simulate); + } + @Override public int addSource(int source) { return this.setSource(this.getSource() + source); @@ -61,7 +96,14 @@ public int addSource(int source) { @Override public int getSource() { - return this.source; + if (this.sourceStorage == null) + return this.source; + return this.getSourceStorage().getSource(); + } + + @Override + public int removeSource(int source, boolean simulate) { + return getSourceStorage().extractSource(source, simulate); } @Override @@ -69,7 +111,7 @@ public int removeSource(int source) { if (source == 0) return this.getSource(); this.setSource(this.getSource() - source); - updateBlock(); + //updateBlock(); updateBlock is called in setSource return this.getSource(); } @@ -81,15 +123,21 @@ public void setMaxSource(int max) { @Override public int getMaxSource() { - return maxSource; + if (this.sourceStorage == null) + return this.maxSource; + return this.getSourceStorage().getSourceCapacity(); } public boolean canAcceptSource() { return this.getSource() < this.getMaxSource(); } + public boolean canProvideSource() { + return this.getSource() > 0; + } + public boolean canAcceptSource(int source) { - return this.getSource() + source <= this.getMaxSource(); + return this.getSourceStorage().canAcceptSource(source); } /** @@ -105,11 +153,28 @@ public int transferSource(ISourceTile from, ISourceTile to) { return transferRate; } + /* + * Transfers the maximum possible amount of source from one SourceStorage to another, + * checking the transfer rate of the source and destination via simulation. + */ + public int transferSource(ISourceCap from, ISourceCap to) { + int transfer = to.receiveSource(from.extractSource(from.getMaxExtract(), true), true); + if (transfer == 0) + return 0; + from.extractSource(transfer, false); + to.receiveSource(transfer, false); + return transfer; + } + /** * Gets the maximum amount of source that can be transferred from one tile to another. */ public int getTransferRate(ISourceTile from, ISourceTile to) { - return Math.min(Math.min(from.getTransferRate(), from.getSource()), to.getMaxSource() - to.getSource()); + return getTransferRate(from, to, from.getTransferRate()); + } + + public int getTransferRate(ISourceTile from, ISourceTile to, int fromTransferRate) { + return Math.min(Math.min(fromTransferRate, from.getSource()), to.getMaxSource() - to.getSource()); } public int transferSource(ISourceTile from, ISourceTile to, int fromTransferRate) { @@ -121,10 +186,6 @@ public int transferSource(ISourceTile from, ISourceTile to, int fromTransferRate return transferRate; } - public int getTransferRate(ISourceTile from, ISourceTile to, int fromTransferRate) { - return Math.min(Math.min(fromTransferRate, from.getSource()), to.getMaxSource() - to.getSource()); - } - @Override public ParticleColor getColor() { return color; @@ -136,16 +197,17 @@ public void setColor(ParticleColor color) { } @Override - protected void applyImplicitComponents(DataComponentInput pComponentInput) { + protected void applyImplicitComponents(@NotNull DataComponentInput pComponentInput) { super.applyImplicitComponents(pComponentInput); var fill = pComponentInput.getOrDefault(DataComponentRegistry.BLOCK_FILL_CONTENTS, new BlockFillContents(0)); this.source = fill.amount(); } @Override - protected void collectImplicitComponents(DataComponentMap.Builder pComponents) { + protected void collectImplicitComponents(DataComponentMap.@NotNull Builder pComponents) { super.collectImplicitComponents(pComponents); pComponents.set(DataComponentRegistry.BLOCK_FILL_CONTENTS, new BlockFillContents(this.source)); } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/source/ISourceCap.java b/src/main/java/com/hollingsworth/arsnouveau/api/source/ISourceCap.java new file mode 100644 index 0000000000..5a0d6d2b44 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/api/source/ISourceCap.java @@ -0,0 +1,42 @@ +package com.hollingsworth.arsnouveau.api.source; + +public interface ISourceCap { + + + boolean canAcceptSource(int source); + + boolean canProvideSource(int source); + + int getMaxExtract(); + + int getMaxReceive(); + + default boolean canExtract() { + return canProvideSource(1); + } + + default boolean canReceive() { + return canAcceptSource(1); + } + + int getSource(); + + int getSourceCapacity(); + + default int getMaxSource() { + return getSourceCapacity(); + } + + /** + * Force set the amount of source stored, clamped to the max source. + * Use for source generation or other use-cases without transfer rates. + */ + void setSource(int source); + + void setMaxSource(int max); + + int receiveSource(final int source, boolean simulate); + + int extractSource(final int source, boolean simulate); + +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/source/ISourceTile.java b/src/main/java/com/hollingsworth/arsnouveau/api/source/ISourceTile.java index 2745362c93..0bdf34d9e3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/source/ISourceTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/source/ISourceTile.java @@ -9,6 +9,10 @@ public interface ISourceTile { boolean canAcceptSource(); + default boolean canProvideSource() { + return this.getSource() > 0; + } + int getSource(); int getMaxSource(); @@ -17,7 +21,32 @@ public interface ISourceTile { int setSource(final int source); + /** + * Adds source to the tile, can be simulated to check the max amount that can be added. + * + * @param source The amount of source to add. + * @param simulate If the action should be simulated. + * @return The amount of source added. + * * TODO: Remove default implementation from method after addons are updated. Otherwise simulate may not be implemented by all tiles. + */ + default int addSource(final int source, boolean simulate) { + return addSource(source); + } + int addSource(final int source); int removeSource(final int source); + + /** + * Removes source from the tile, can be simulated to check the max amount that can be removed. + * + * @param source The amount of source to remove. + * @param simulate If the action should be simulated. + * @return The amount of source removed. + * TODO: Remove default implementation from method after addons are updated. Otherwise simulate will not work unless overriden. + */ + default int removeSource(final int source, boolean simulate) { + return removeSource(source); + } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java index f9da86df55..cb3ceba26d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java @@ -5,11 +5,18 @@ import com.hollingsworth.arsnouveau.client.gui.PatchouliTooltipEvent; import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; +import com.hollingsworth.arsnouveau.common.block.tile.ArchwoodChestTile; import com.hollingsworth.arsnouveau.common.block.tile.GhostWeaveTile; import com.hollingsworth.arsnouveau.common.block.tile.SkyBlockTile; +import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.contents.TranslatableContents; +import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -20,8 +27,11 @@ import net.neoforged.neoforge.client.event.RenderGuiLayerEvent; import net.neoforged.neoforge.client.event.RenderHighlightEvent; import net.neoforged.neoforge.client.event.RenderTooltipEvent; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; import net.neoforged.neoforge.client.gui.VanillaGuiLayers; import net.neoforged.neoforge.event.entity.player.ItemTooltipEvent; +import org.jetbrains.annotations.NotNull; @EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID) public class ClientEvents { @@ -32,8 +42,27 @@ static class ClientModEvents { public static void registerTooltipFactory(RegisterClientTooltipComponentFactoriesEvent event) { event.register(SpellTooltip.class, SpellTooltip.SpellTooltipRenderer::new); } - } + @SubscribeEvent + public static void registerClientExtensions(RegisterClientExtensionsEvent event) { + event.registerItem(new IClientItemExtensions() { + @Override + public @NotNull BlockEntityWithoutLevelRenderer getCustomRenderer() { + Minecraft mc = Minecraft.getInstance(); + + return new BlockEntityWithoutLevelRenderer(mc.getBlockEntityRenderDispatcher(), mc.getEntityModels()) { + private final BlockEntity tile = new ArchwoodChestTile(BlockPos.ZERO, BlockRegistry.ARCHWOOD_CHEST.get().defaultBlockState()); + + @Override + public void renderByItem(@NotNull ItemStack stack, @NotNull ItemDisplayContext transformType, @NotNull PoseStack pose, @NotNull MultiBufferSource buffer, int x, int y) { + mc.getBlockEntityRenderDispatcher().renderItem(tile, pose, buffer, x, y); + } + + }; + } + }, BlockRegistry.ARCHWOOD_CHEST.get().asItem()); + } + } @SubscribeEvent public static void TooltipEvent(RenderTooltipEvent.Pre e) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/RenderUtils.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/RenderUtils.java index fcb050fe7b..2c8094ccf8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/RenderUtils.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/utils/RenderUtils.java @@ -16,6 +16,7 @@ import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import org.joml.Matrix4f; @@ -29,14 +30,14 @@ public static void drawSpellPart(AbstractSpellPart objectToBeDrawn, GuiGraphics } public static void drawSpellPart(AbstractSpellPart objectToBeDrawn, GuiGraphics graphics, int positionX, int positionY, int size, boolean renderTransparent) { - renderFakeItemTransparent(graphics.pose(), objectToBeDrawn.glyphItem.getDefaultInstance(), positionX, positionY, size, 0, renderTransparent,150); + renderFakeItemTransparent(graphics.pose(), objectToBeDrawn.glyphItem.getDefaultInstance(), positionX, positionY, size, 0, renderTransparent, 150); } public static void drawItemAsIcon(ItemStack itemStack, GuiGraphics graphics, int positionX, int positionY, int size, boolean renderTransparent) { - renderFakeItemTransparent(graphics.pose(), itemStack, positionX, positionY, size, 0, renderTransparent,150); + renderFakeItemTransparent(graphics.pose(), itemStack, positionX, positionY, size, 0, renderTransparent, 150); } - public static void renderFakeItemTransparent(PoseStack poseStack, ItemStack stack, int x, int y,int scale, int alpha, boolean transparent, int zIndex) { + public static void renderFakeItemTransparent(PoseStack poseStack, ItemStack stack, int x, int y, int scale, int alpha, boolean transparent, int zIndex) { if (stack.isEmpty()) { return; } @@ -108,4 +109,8 @@ public static void colorBlit(PoseStack mStack, int x, int y, int uOffset, int vO RenderSystem.disableBlend(); } + public static void drawString(String string, GuiGraphics guiGraphics, int positionX, int positionY, int size, boolean renderTransparent) { + guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable(string), positionX, positionY, Color.WHITE.getRGB()); + } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ArchwoodChest.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ArchwoodChest.java index 481216f481..6ce881368f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ArchwoodChest.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ArchwoodChest.java @@ -2,25 +2,14 @@ import com.hollingsworth.arsnouveau.common.block.tile.ArchwoodChestTile; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.BlockPos; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.ItemDisplayContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.ChestBlock; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import org.jetbrains.annotations.NotNull; -import java.util.function.Consumer; - public class ArchwoodChest extends ChestBlock { public ArchwoodChest() { super(BlockBehaviour.Properties.of().strength(2.5F).sound(SoundType.WOOD), () -> BlockRegistry.ARCHWOOD_CHEST_TILE.get()); @@ -31,32 +20,4 @@ public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState sta return new ArchwoodChestTile(pos, state); } - public static class Item extends BlockItem { - - public Item(Block block, net.minecraft.world.item.Item.Properties props) { - super(block, props); - } - - @Override - public void initializeClient(@NotNull Consumer consumer) { - super.initializeClient(consumer); - consumer.accept(new IClientItemExtensions() { - @Override - public @NotNull BlockEntityWithoutLevelRenderer getCustomRenderer() { - Minecraft mc = Minecraft.getInstance(); - - return new BlockEntityWithoutLevelRenderer(mc.getBlockEntityRenderDispatcher(), mc.getEntityModels()) { - private final BlockEntity tile = new ArchwoodChestTile(BlockPos.ZERO, getBlock().defaultBlockState()); - - @Override - public void renderByItem(@NotNull ItemStack stack, @NotNull ItemDisplayContext transformType, @NotNull PoseStack pose, @NotNull MultiBufferSource buffer, int x, int y) { - mc.getBlockEntityRenderDispatcher().renderItem(tile, pose, buffer, x, y); - } - - }; - } - }); - } - } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CreativeSourceJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CreativeSourceJarTile.java index 6704af6997..c8a905880c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CreativeSourceJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CreativeSourceJarTile.java @@ -1,11 +1,34 @@ package com.hollingsworth.arsnouveau.common.block.tile; +import com.hollingsworth.arsnouveau.common.capability.SourceStorage; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; public class CreativeSourceJarTile extends SourceJarTile { + @Override + public @NotNull SourceStorage getSourceStorage() { + if (sourceStorage == null) { + sourceStorage = new SourceStorage(getMaxSource(), getTransferRate(), getTransferRate(), getMaxSource()) { + + // Acts as void or infinite source, overrides method without doing checks or changes + @Override + public int receiveSource(int toReceive, boolean simulate) { + return toReceive; + } + + @Override + public int extractSource(int toExtract, boolean simulate) { + return toExtract; + } + }; + if (level != null) level.invalidateCapabilities(worldPosition); + } + return sourceStorage; + } + public CreativeSourceJarTile(BlockPos pos, BlockState state) { super(BlockRegistry.CREATIVE_SOURCE_JAR_TILE.get(), pos, state); } @@ -14,4 +37,9 @@ public CreativeSourceJarTile(BlockPos pos, BlockState state) { public int getSource() { return this.getMaxSource(); } + + @Override + public int getMaxSource() { + return 1000000; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java index 9f69bd2690..b948ec1128 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java @@ -11,7 +11,7 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleLineData; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.block.ITickable; -import com.hollingsworth.arsnouveau.common.crafting.recipes.ImbuementRecipe; +import com.hollingsworth.arsnouveau.common.capability.SourceStorage; import com.hollingsworth.arsnouveau.common.entity.EntityFlyingItem; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.client.Minecraft; @@ -29,6 +29,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.*; @@ -53,11 +54,26 @@ public ImbuementTile(BlockPos pos, BlockState state) { super(BlockRegistry.IMBUEMENT_TILE.get(), pos, state); } + public SourceStorage jarStorage; + + @Override + public @NotNull SourceStorage getSourceStorage() { + if (jarStorage == null) { + jarStorage = new SourceStorage(this.getMaxSource(), this.getMaxSource(), 0, getSource()); + } + return jarStorage; + } + @Override public int getTransferRate() { return 0; } + @Override + public boolean canProvideSource() { + return false; + } + @Override public void lightPedestal(Level level) { if (level != null) { @@ -159,7 +175,7 @@ public void tick() { } @Override - protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + protected void loadAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider pRegistries) { super.loadAdditional(tag, pRegistries); stack = ItemStack.parseOptional(pRegistries, tag.getCompound("itemStack")); @@ -169,7 +185,7 @@ protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries } @Override - protected void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + protected void saveAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider pRegistries) { super.saveAdditional(tag, pRegistries); if (!stack.isEmpty()) { Tag reagentTag = stack.save(pRegistries); @@ -211,7 +227,7 @@ public boolean isEmpty() { } @Override - public ItemStack getItem(int index) { + public @NotNull ItemStack getItem(int index) { return stack; } @@ -221,14 +237,14 @@ public int size() { } @Override - public ItemStack removeItem(int index, int count) { + public @NotNull ItemStack removeItem(int index, int count) { ItemStack split = stack.split(count); updateBlock(); return split; } @Override - public ItemStack removeItemNoUpdate(int index) { + public @NotNull ItemStack removeItemNoUpdate(int index) { ItemStack stack = this.stack.copy(); this.stack = ItemStack.EMPTY; setChanged(); @@ -236,14 +252,14 @@ public ItemStack removeItemNoUpdate(int index) { } @Override - public void setItem(int index, ItemStack stack) { + public void setItem(int index, @NotNull ItemStack stack) { this.stack = stack; this.craftTicks = 100; updateBlock(); } @Override - public boolean stillValid(Player player) { + public boolean stillValid(@NotNull Player player) { return true; } @@ -298,10 +314,10 @@ public List getNearbyPedestals() { public void getTooltip(List tooltip) { var holder = getRecipeNow(); var recipe = holder == null ? null : holder.value(); - if(recipe != null && !recipe.getResultItem(this.level.registryAccess()).isEmpty() && stack != null && !stack.isEmpty()) { + if (recipe != null && !recipe.getResultItem(this.level.registryAccess()).isEmpty() && stack != null && !stack.isEmpty()) { int cost = recipe.getSourceCost(this); tooltip.add(recipe.getCraftingText(this)); - if(cost > 0) { + if (cost > 0) { int progress = Math.min(100, (getSource() * 100 / cost)); tooltip.add(recipe.getCraftingProgressText(this, progress)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelaySplitterTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelaySplitterTile.java index 8e12ffe0a8..6f3783419c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelaySplitterTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelaySplitterTile.java @@ -2,17 +2,20 @@ import com.hollingsworth.arsnouveau.api.source.AbstractSourceMachine; import com.hollingsworth.arsnouveau.api.source.IMultiSourceTargetProvider; +import com.hollingsworth.arsnouveau.api.source.ISourceCap; import com.hollingsworth.arsnouveau.api.util.NBTUtil; +import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; -import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -42,10 +45,10 @@ public boolean setSendTo(BlockPos pos) { @Override public List getWandHighlight(List list) { - for(BlockPos toPos : toList){ + for (BlockPos toPos : toList) { list.add(ColorPos.centered(toPos, ParticleColor.TO_HIGHLIGHT)); } - for(BlockPos fromPos : fromList){ + for (BlockPos fromPos : fromList) { list.add(ColorPos.centered(fromPos, ParticleColor.FROM_HIGHLIGHT)); } return list; @@ -64,16 +67,22 @@ public void processFromList() { ArrayList stale = new ArrayList<>(); int ratePer = getTransferRate() / fromList.size(); + getSourceStorage().setMaxReceive(ratePer); for (BlockPos fromPos : fromList) { if (!level.isLoaded(fromPos)) continue; - - if (!(level.getBlockEntity(fromPos) instanceof AbstractSourceMachine fromTile)) { + int transfer; + if (level.getCapability(CapabilityRegistry.SOURCE_CAPABILITY, fromPos, null) instanceof ISourceCap sourceHandler) { + transfer = transferSource(sourceHandler, this.getSourceStorage()); + } else if (level.getBlockEntity(fromPos) instanceof AbstractSourceMachine fromTile) { + int fromRate = Math.min(ratePer, getTransferRate(fromTile, this)); + transfer = transferSource(fromTile, this, fromRate); + } else { stale.add(fromPos); continue; } - int fromRate = Math.min(ratePer, getTransferRate(fromTile, this)); - if (transferSource(fromTile, this, fromRate) > 0) { + + if (transfer > 0) { createParticles(fromPos, worldPosition); } } @@ -93,20 +102,26 @@ public void processToList() { return; ArrayList stale = new ArrayList<>(); int ratePer = getSource() / toList.size(); + getSourceStorage().setMaxExtract(ratePer); for (BlockPos toPos : toList) { if (!level.isLoaded(toPos)) continue; - if (!(level.getBlockEntity(toPos) instanceof AbstractSourceMachine toTile)) { + int transfer; + if (level.getCapability(CapabilityRegistry.SOURCE_CAPABILITY, toPos, null) instanceof ISourceCap sourceHandler) { + transfer = transferSource(this.getSourceStorage(), sourceHandler); + } else if (level.getBlockEntity(toPos) instanceof AbstractSourceMachine toTile) { + transfer = transferSource(this, toTile, ratePer); + } else { stale.add(toPos); continue; } - int transfer = transferSource(this, toTile, ratePer); if (transfer > 0) { createParticles(worldPosition, toPos); } } - for (BlockPos s : stale) { + for ( + BlockPos s : stale) { toList.remove(s); updateBlock(); } @@ -133,7 +148,7 @@ public int getMaxSource() { } @Override - protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + protected void loadAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider pRegistries) { super.loadAdditional(tag, pRegistries); fromList = new ArrayList<>(); toList = new ArrayList<>(); @@ -157,7 +172,7 @@ protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries } @Override - public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + public void saveAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider pRegistries) { super.saveAdditional(tag, pRegistries); int counter = 0; for (BlockPos p : this.fromList) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java index 0be2831a52..fe69c23e33 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; import com.hollingsworth.arsnouveau.api.item.IWandable; import com.hollingsworth.arsnouveau.api.source.AbstractSourceMachine; +import com.hollingsworth.arsnouveau.api.source.ISourceCap; import com.hollingsworth.arsnouveau.api.util.BlockUtil; import com.hollingsworth.arsnouveau.api.util.NBTUtil; import com.hollingsworth.arsnouveau.client.particle.ColorPos; @@ -12,6 +13,7 @@ import com.hollingsworth.arsnouveau.common.items.DominionWand; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; @@ -20,6 +22,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoAnimatable; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -69,7 +72,10 @@ public boolean setTakeFrom(BlockPos pos) { } public boolean setSendTo(BlockPos pos) { - if (BlockUtil.distanceFrom(pos, this.worldPosition) > getMaxDistance() || pos.equals(getBlockPos()) || !(level.getBlockEntity(pos) instanceof AbstractSourceMachine)) { + if (BlockUtil.distanceFrom(pos, this.worldPosition) > getMaxDistance() || pos.equals(getBlockPos())) { + return false; + } + if (!(level.getBlockEntity(pos) instanceof AbstractSourceMachine) && level.getCapability(CapabilityRegistry.SOURCE_CAPABILITY, pos, null) == null) { return false; } this.toPos = pos; @@ -103,8 +109,12 @@ public boolean closeEnough(BlockPos pos) { @Override public void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @Nullable LivingEntity storedEntity, Player playerEntity) { - if (storedPos == null || level.isClientSide || storedPos.equals(getBlockPos()) || !(level.getBlockEntity(storedPos) instanceof AbstractSourceMachine)) + if (storedPos == null || level.isClientSide || storedPos.equals(getBlockPos())) { return; + } + if (!(level.getBlockEntity(storedPos) instanceof AbstractSourceMachine) && level.getCapability(CapabilityRegistry.SOURCE_CAPABILITY, storedPos, null) == null) { + return; + } // Let relays take from us, no action needed. if (this.setSendTo(storedPos.immutable())) { PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.connections.send", DominionWand.getPosString(storedPos))); @@ -116,9 +126,11 @@ public void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @Nullable Li @Override public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable LivingEntity storedEntity, Player playerEntity) { - if (storedPos == null || storedPos.equals(getBlockPos()) || level.getBlockEntity(storedPos) instanceof RelayTile || !(level.getBlockEntity(storedPos) instanceof AbstractSourceMachine)) + if (storedPos == null || storedPos.equals(getBlockPos()) || level.getBlockEntity(storedPos) instanceof RelayTile) return; - + if (!(level.getBlockEntity(storedPos) instanceof AbstractSourceMachine) && level.getCapability(CapabilityRegistry.SOURCE_CAPABILITY, storedPos, null) == null) { + return; + } if (this.setTakeFrom(storedPos.immutable())) { PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.connections.take", DominionWand.getPosString(storedPos))); } else { @@ -154,10 +166,15 @@ public void tick() { if (fromPos != null && level.isLoaded(fromPos)) { // Block has been removed - if (!(level.getBlockEntity(fromPos) instanceof AbstractSourceMachine)) { + if (!(level.getBlockEntity(fromPos) instanceof AbstractSourceMachine) && level.getCapability(CapabilityRegistry.SOURCE_CAPABILITY, fromPos, null) == null) { fromPos = null; updateBlock(); return; + } else if (level.getCapability(CapabilityRegistry.SOURCE_CAPABILITY, fromPos, null) instanceof ISourceCap sourceHandler) { + // Transfer mana fromPos to this + if (transferSource(sourceHandler, getSourceStorage()) > 0) { + ParticleUtil.spawnFollowProjectile(level, fromPos, worldPosition, this.getColor()); + } } else if (level.getBlockEntity(fromPos) instanceof AbstractSourceMachine fromTile) { // Transfer mana fromPos to this if (transferSource(fromTile, this) > 0) { @@ -168,14 +185,21 @@ public void tick() { } if (toPos != null && level.isLoaded(toPos)) { - if (!(level.getBlockEntity(toPos) instanceof AbstractSourceMachine)) { + if (!(level.getBlockEntity(toPos) instanceof AbstractSourceMachine) && level.getCapability(CapabilityRegistry.SOURCE_CAPABILITY, toPos, null) == null) { toPos = null; updateBlock(); return; } - AbstractSourceMachine toTile = (AbstractSourceMachine) this.level.getBlockEntity(toPos); - if (transferSource(this, toTile) > 0) { - ParticleUtil.spawnFollowProjectile(level, worldPosition, toPos, this.getColor()); + if (level.getCapability(CapabilityRegistry.SOURCE_CAPABILITY, toPos, null) instanceof ISourceCap sourceHandler) { + // Transfer mana from this to toPos + if (transferSource(this.getSourceStorage(), sourceHandler) > 0) { + ParticleUtil.spawnFollowProjectile(level, worldPosition, toPos, this.getColor()); + } + } else if (level.getBlockEntity(toPos) instanceof AbstractSourceMachine toTile) { + // Transfer mana from this to toPos + if (transferSource(this, toTile) > 0) { + ParticleUtil.spawnFollowProjectile(level, worldPosition, toPos, this.getColor()); + } } } } @@ -184,7 +208,7 @@ public void tick() { String FROM = "from"; @Override - protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + protected void loadAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider pRegistries) { super.loadAdditional(tag, pRegistries); this.toPos = null; this.fromPos = null; @@ -199,7 +223,7 @@ protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries } @Override - public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + public void saveAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider pRegistries) { super.saveAdditional(tag, pRegistries); if (toPos != null) { NBTUtil.storeBlockPos(tag, TO, toPos.immutable()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayWarpTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayWarpTile.java index b7aade3fb4..5fd99a3b58 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayWarpTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayWarpTile.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.common.block.tile; +import com.hollingsworth.arsnouveau.api.source.ISourceCap; import com.hollingsworth.arsnouveau.api.source.ISourceTile; import com.hollingsworth.arsnouveau.api.util.BlockUtil; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; @@ -46,6 +47,23 @@ public int transferSource(ISourceTile from, ISourceTile to, int fromTransferRate return super.transferSource(from, to, fromTransferRate); } + @Override + public int transferSource(ISourceCap from, ISourceCap to) { + if (to instanceof RelayWarpTile toWarp) { + double adjustedDist = BlockUtil.distanceFrom(toWarp.worldPosition, this.worldPosition) - 30; + double probLoss = adjustedDist / 100.0; + if (adjustedDist > 0 && level.getRandom().nextFloat() < probLoss) { + int transfer = to.receiveSource(from.getSource(), true); + if (transfer == 0) + return 0; + from.extractSource(transfer, false); + int lossyTransfer = Math.max(1, (int) (transfer * 0.7)); + to.receiveSource(lossyTransfer, false); + } + } + return super.transferSource(from, to); + } + @Override public boolean closeEnough(BlockPos pos) { return level.getBlockEntity(pos) instanceof RelayWarpTile || super.closeEnough(pos); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java index 5529fcc10a..442bd256f8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java @@ -7,6 +7,7 @@ import com.hollingsworth.arsnouveau.api.util.SourceUtil; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.block.ITickable; +import com.hollingsworth.arsnouveau.common.capability.SourceStorage; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; @@ -14,6 +15,7 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.bus.api.Event; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoAnimatable; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -34,6 +36,19 @@ public SourcelinkTile(BlockEntityType sourceLinkTile, BlockPos pos, BlockStat super(sourceLinkTile, pos, state); } + @Override + public @NotNull SourceStorage getSourceStorage() { + if (sourceStorage == null) { + sourceStorage = new SourceStorage(getMaxSource(), getTransferRate(), getTransferRate(), getSource()) { + @Override + public boolean canReceive() { + return false; + } + }; + } + return sourceStorage; + } + @Override public int getTransferRate() { return 1000; @@ -56,8 +71,8 @@ public void tick() { if (level.getGameTime() % 100 == 0 && getSource() > 0) { List providers = SourceUtil.canGiveSource(worldPosition, level, 5); if(!providers.isEmpty()){ - transferSource(this, providers.get(0).getSource()); - ParticleUtil.spawnFollowProjectile(level, this.worldPosition, providers.get(0).getCurrentPos(), this.getColor()); + transferSource(this, providers.getFirst().getSource()); + ParticleUtil.spawnFollowProjectile(level, this.worldPosition, providers.getFirst().getCurrentPos(), this.getColor()); } } } @@ -101,14 +116,14 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { } @Override - protected void loadAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + protected void loadAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider pRegistries) { super.loadAdditional(tag, pRegistries); progress = tag.getInt("progress"); isDisabled = tag.getBoolean("disabled"); } @Override - public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { + public void saveAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider pRegistries) { super.saveAdditional(tag, pRegistries); tag.putInt("progress", progress); tag.putBoolean("disabled", isDisabled); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/capability/SourceStorage.java b/src/main/java/com/hollingsworth/arsnouveau/common/capability/SourceStorage.java new file mode 100644 index 0000000000..5cdbb6c1d4 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/capability/SourceStorage.java @@ -0,0 +1,195 @@ +package com.hollingsworth.arsnouveau.common.capability; + +import com.hollingsworth.arsnouveau.api.source.ISourceCap; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.IntTag; +import net.minecraft.nbt.Tag; +import net.minecraft.util.Mth; +import net.neoforged.neoforge.common.util.INBTSerializable; +import org.jetbrains.annotations.NotNull; + +public class SourceStorage implements ISourceCap, INBTSerializable { + protected int source; + protected int capacity; + protected int maxReceive; + protected int maxExtract; + + /** + * Constructor for creating a new empty source storage, with maximum transfer rate. + * + * @param capacity The maximum amount of source that can be stored. + */ + public SourceStorage(int capacity) { + this(capacity, capacity, capacity, 0); + } + + /** + * Constructor for creating a new empty source storage, with specific transfer rates. + * + * @param capacity The maximum amount of source that can be stored. + * @param maxTransfer The maximum amount of source that can be transferred per operation. + */ + public SourceStorage(int capacity, int maxTransfer) { + this(capacity, maxTransfer, maxTransfer, 0); + } + + /** + * Constructor for creating a new empty source storage, with specific in/out transfer rates. + * + * @param capacity The maximum amount of source that can be stored. + * @param maxReceive The maximum amount of source that can be received per operation. + * @param maxExtract The maximum amount of source that can be extracted per operation. + */ + public SourceStorage(int capacity, int maxReceive, int maxExtract) { + this(capacity, maxReceive, maxExtract, 0); + } + + /** + * Constructor for creating a new source storage, use to initialize with a specific amount of source. + * + * @param capacity The maximum amount of source that can be stored. + * @param maxReceive The maximum amount of source that can be received per operation. + * @param maxExtract The maximum amount of source that can be extracted per operation. + * @param source The initial amount of source to create the storage with. + */ + public SourceStorage(int capacity, int maxReceive, int maxExtract, int source) { + this.capacity = capacity; + this.maxReceive = maxReceive; + this.maxExtract = maxExtract; + this.source = Math.max(0, Math.min(capacity, source)); + } + + /** + * Dynamically adjust the maximum amount of source that can be extracted per operation. + * + * @param maxExtract The maximum amount of source that can be extracted per operation. + */ + public void setMaxExtract(int maxExtract) { + this.maxExtract = maxExtract; + } + + /** + * Dynamically adjust the maximum amount of source that can be received per operation. + * + * @param maxReceive The maximum amount of source that can be received per operation. + */ + public void setMaxReceive(int maxReceive) { + this.maxReceive = maxReceive; + } + + public int getMaxExtract() { + return maxExtract; + } + + public int getMaxReceive() { + return maxReceive; + } + + @Override + public void setSource(int source) { + this.source = Math.clamp(source, 0, this.capacity); + } + + /** + * Adds source to the tile, can be simulated to check the max amount that can be received. + * + * @param toReceive The amount of source to receive. + * @param simulate If the action should be simulated. + * @return The amount of source received. + * Calls onContentsChanged() if source is received. + */ + @Override + public int receiveSource(int toReceive, boolean simulate) { + if (!canReceive() || toReceive <= 0) { + return 0; + } + + int sourceReceived = Mth.clamp(this.capacity - this.source, 0, Math.min(this.maxReceive, toReceive)); + if (!simulate) { + this.source += sourceReceived; + onContentsChanged(); + } + return sourceReceived; + } + + + /** + * Removes source from the tile, can be simulated to check the max amount that can be extracted. + * + * @param toExtract The amount of source to extract. + * @param simulate If the action should be simulated. + * @return The amount of source extracted. + * Calls onContentsChanged() if source is extracted. + */ + @Override + public int extractSource(int toExtract, boolean simulate) { + if (!canExtract() || toExtract <= 0) { + return 0; + } + + int sourceExtracted = Math.min(this.source, Math.min(this.maxExtract, toExtract)); + if (!simulate) { + this.source -= sourceExtracted; + onContentsChanged(); + } + + return sourceExtracted; + } + + @Override + public int getSource() { + return this.source; + } + + @Override + public void setMaxSource(int max) { + this.capacity = max; + } + + @Override + public int getSourceCapacity() { + return this.capacity; + } + + /* + * Checks if the tile can accept any source + */ + @Override + public boolean canAcceptSource(int source) { + return receiveSource(source, true) > 0; + } + + @Override + public boolean canProvideSource(int source) { + return extractSource(source, true) > 0; + } + + @Override + public boolean canReceive() { + return this.maxReceive > 0; + } + + @Override + public boolean canExtract() { + return this.maxExtract > 0; + } + + @Override + public Tag serializeNBT(HolderLookup.@NotNull Provider provider) { + return IntTag.valueOf(this.getSource()); + } + + @Override + public void deserializeNBT(HolderLookup.@NotNull Provider provider, @NotNull Tag nbt) { + if (!(nbt instanceof IntTag intNbt)) + throw new IllegalArgumentException("Can not deserialize to an instance that isn't the default implementation"); + this.source = intNbt.getAsInt(); + } + + /** + * Called when the contents of this storage have changed + */ + public void onContentsChanged() { + } + +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index ea35e5c4e9..3f8e5a8d4e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -336,6 +336,9 @@ protected void addTranslations() { add("ars_nouveau.color_gui.black", "Black"); add("ars_nouveau.color_gui.save", "Save"); add("ars_nouveau.color_gui.save_all", "Save All"); + add("ars_nouveau.dominion_wand.clear", "Clear"); + add("ars_nouveau.dominion_wand.normal", "Normal Mode"); + add("ars_nouveau.dominion_wand.strict", "Strict Mode"); add("ars_nouveau.dominion_wand.stored_entity", "Stored entity"); add("ars_nouveau.dominion_wand.position_set", "Position set."); add("ars_nouveau.dominion_wand.no_entity", "No entity set"); @@ -646,7 +649,7 @@ protected void addTranslations() { add("ars_nouveau.page4.basic_spell_turret", "Turrets can provide compact and efficient automation. Examples include: configurable redstone clocks, one block tree or crop farms, rapid smelting with fortune, or mob farms with looting."); add("ars_nouveau.page1.bookwyrm_charm", "Bookwyrm Charms can be used on a Storage Lectern to increase the number of accessible inventories. Augment a Ritual of Awakening with Book and Quills in order to obtain charms. Bookwyrms can be dyed using white, black, blue, green, red, or purple dye."); add("ars_nouveau.page2.bookwyrm_charm", "In the event that they die or are dispelled, they will drop their charm."); - add("ars_nouveau.page.dominion_wand", "A tool for configuring Source Relays and automation entities. To set a transfer path, use the wand on the object that you would like to take source from, and then use it on the block you would like to send source to. For example: Source Jar to Source Relay, Source Relay to Source Relay, or Source Relay to Source Jar. To clear connections, sneak and use this wand on a relay. If you sneak-use it on the air it will switch to Strict mode, allowing to specify the side of the blocks to use."); + add("ars_nouveau.page.dominion_wand", "A tool for configuring Source Relays and automation entities. To set a transfer path, use the wand on the object that you would like to take source from, and then use it on the block you would like to send source to. For example: Source Jar to Source Relay, Source Relay to Source Relay, or Source Relay to Source Jar. To clear connections, sneak and use this wand on a relay. You can switch into Strict mode using the radial menu, allowing to specify the side of the blocks to use."); add("ars_nouveau.page1.drygmy_charm", "Drygmys are often found following and tending to animals around it. They can be found anywhere, though somewhat rarely. Drygmys can be given a home in the world, and will produce items from nearby monsters and animals as if they were slain, without harming them. A wild drygmy may be befriended by throwing a Wilden Horn near it! You may dye a Drygmy Cyan, Orange, or Brown."); add("ars_nouveau.page2.drygmy_charm", "A Drygmy can also produce experience gems!"); add("ars_nouveau.page3.drygmy_charm", "To summon a Drygmy, use a Drymy Charm on a block of Mossy Cobblestone. After a short time, the cobblestone will transform into a Drygmy Henge and summon your Drgymy! To summon additional drygmys, use more charms on the henge. Casting dispel or killing the Drygmy will return your charm."); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java index b2a93c6acf..1d017cdce5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java @@ -1,20 +1,26 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.api.entity.IDecoratable; +import com.hollingsworth.arsnouveau.api.item.IRadialProvider; import com.hollingsworth.arsnouveau.api.item.IWandable; +import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; +import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenu; +import com.hollingsworth.arsnouveau.client.gui.radial_menu.RadialMenuSlot; +import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.hollingsworth.arsnouveau.common.items.data.DominionWandData; import com.hollingsworth.arsnouveau.common.network.HighlightAreaPacket; import com.hollingsworth.arsnouveau.common.network.Networking; +import com.hollingsworth.arsnouveau.common.network.PacketUpdateDominionWand; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -23,12 +29,14 @@ import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -public class DominionWand extends ModItem { +public class DominionWand extends ModItem implements IRadialProvider { public DominionWand() { super(ItemsRegistry.defaultItemProperties().stacksTo(1).component(DataComponentRegistry.DOMINION_WAND, new DominionWandData())); } @@ -101,22 +109,12 @@ public void clear(ItemStack stack, Player player) { stack.set(DataComponentRegistry.DOMINION_WAND, data); } - @Override - public @NotNull InteractionResultHolder use(@NotNull Level pLevel, Player pPlayer, @NotNull InteractionHand pUsedHand) { - ItemStack stack = pPlayer.getItemInHand(pUsedHand); - DominionWandData data = stack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()); - if (pPlayer.isShiftKeyDown() && !data.hasStoredData()) { - data = data.toggleMode(); - stack.set(DataComponentRegistry.DOMINION_WAND, data); - } - return super.use(pLevel, pPlayer, pUsedHand); - } - @Override public @NotNull InteractionResult useOn(UseOnContext context) { if (context.getLevel().isClientSide || context.getPlayer() == null) return super.useOn(context); BlockPos pos = context.getClickedPos(); + Direction face = context.getClickedFace(); Level world = context.getLevel(); Player playerEntity = context.getPlayer(); ItemStack stack = context.getItemInHand(); @@ -129,13 +127,13 @@ public void clear(ItemStack stack, Player player) { } if (!data.hasStoredData()) { - stack.set(DataComponentRegistry.DOMINION_WAND, data.storePos(pos.immutable())); + data = data.storePos(pos.immutable()); + if (data.strict()) data = data.setFace(face); + stack.set(DataComponentRegistry.DOMINION_WAND, data); PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.dominion_wand.position_set")); return InteractionResult.SUCCESS; } - if (data.face().isEmpty() && data.strict()){ - stack.set(DataComponentRegistry.DOMINION_WAND, data.setFace(context.getClickedFace())); - } + BlockPos storedPos = data.storedPos().orElse(null); Direction storedDirection = data.face().orElse(null); if (storedPos != null && world.getBlockEntity(storedPos) instanceof IWandable wandable) { @@ -145,7 +143,7 @@ public void clear(ItemStack stack, Player player) { wandable.onFinishedConnectionLast(storedPos, storedDirection, (LivingEntity) world.getEntity(data.storedEntityId()), playerEntity); } if (data.storedEntityId() != DominionWandData.NULL_ENTITY && world.getEntity(data.storedEntityId()) instanceof IWandable wandable) { - wandable.onFinishedConnectionFirst(pos, storedDirection, null, playerEntity); + wandable.onFinishedConnectionFirst(pos, data.strict() ? face : null, null, playerEntity); } clear(stack, playerEntity); @@ -180,4 +178,43 @@ public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext wo public static String getPosString(BlockPos pos) { return Component.translatable("ars_nouveau.position", pos.getX(), pos.getY(), pos.getZ()).getString(); } + + @OnlyIn(Dist.CLIENT) + @Override + public void onRadialKeyPressed(ItemStack stack, Player player) { + Minecraft.getInstance().setScreen(new GuiRadialMenu<>(getRadialMenuProviderForDominion(stack))); + } + + public RadialMenu getRadialMenuProviderForDominion(ItemStack stack) { + return new RadialMenu<>((int slot) -> + Networking.sendToServer(new PacketUpdateDominionWand(slot)), + getRadialMenuSlotsForDominion(stack), + RenderUtils::drawString, + 0); + } + + public enum DominionSlots { + CLEAR("ars_nouveau.dominion_wand.clear"), + NORMAL("ars_nouveau.dominion_wand.normal"), + STRICT("ars_nouveau.dominion_wand.strict"); + + public final String key; + + DominionSlots(String key) { + this.key = key; + } + + public Component translatable() { + return Component.translatable(key); + } + } + + public List> getRadialMenuSlotsForDominion(ItemStack stack) { + List> radialMenuSlots = new ArrayList<>(); + radialMenuSlots.add(new RadialMenuSlot<>(DominionSlots.CLEAR.translatable().getString(), DominionSlots.CLEAR.key)); + radialMenuSlots.add(new RadialMenuSlot<>(DominionSlots.NORMAL.translatable().getString(), DominionSlots.NORMAL.key)); + radialMenuSlots.add(new RadialMenuSlot<>(DominionSlots.STRICT.translatable().getString(), DominionSlots.STRICT.key)); + return radialMenuSlots; + } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/RendererBlockItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/RendererBlockItem.java index aa87fd029d..ac44cdcc5d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/RendererBlockItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/RendererBlockItem.java @@ -3,7 +3,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistryWrapper; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.world.level.block.Block; -import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import software.bernie.geckolib.animatable.client.GeoRenderProvider; import java.util.function.Consumer; import java.util.function.Supplier; @@ -22,11 +22,10 @@ public RendererBlockItem(BlockRegistryWrapper block, Properties public abstract Supplier getRenderer(); @Override - public void initializeClient(Consumer consumer) { - super.initializeClient(consumer); - consumer.accept(new IClientItemExtensions() { + public void createGeoRenderer(Consumer consumer) { + consumer.accept(new GeoRenderProvider() { @Override - public BlockEntityWithoutLevelRenderer getCustomRenderer() { + public BlockEntityWithoutLevelRenderer getGeoItemRenderer() { return getRenderer().get(); } }); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java index af6346d1a1..b0baacbb25 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java @@ -63,10 +63,15 @@ public DominionWandData setFace(@Nullable Direction face){ return new DominionWandData(storedPos, Optional.ofNullable(face), strict, storedEntityId); } + @Deprecated(forRemoval = true) public DominionWandData toggleMode(){ return new DominionWandData(storedPos, face, !strict, storedEntityId); } + public DominionWandData toggleMode(boolean strict) { + return new DominionWandData(storedPos, face, strict, storedEntityId); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java index 39be1672c2..407d8580cc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java @@ -71,6 +71,7 @@ public static void register(final RegisterPayloadHandlersEvent event) { reg.playToClient(ServerToClientStoragePacket.TYPE, ServerToClientStoragePacket.CODEC, Networking::handle); reg.playToClient(UpdateStorageItemsPacket.TYPE, UpdateStorageItemsPacket.CODEC, Networking::handle); reg.playToClient(PacketUpdateGlowColor.TYPE, PacketUpdateGlowColor.CODEC, Networking::handle); + reg.playToServer(PacketUpdateDominionWand.TYPE, PacketUpdateDominionWand.CODEC, Networking::handle); } private static void handle(T message, IPayloadContext ctx) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateDominionWand.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateDominionWand.java new file mode 100644 index 0000000000..59d53d4e7c --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateDominionWand.java @@ -0,0 +1,50 @@ +package com.hollingsworth.arsnouveau.common.network; + +import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.common.items.DominionWand; +import com.hollingsworth.arsnouveau.common.items.data.DominionWandData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +public class PacketUpdateDominionWand extends AbstractPacket { + public static final Type TYPE = new Type<>(ArsNouveau.prefix("set_wand_mode")); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.INT, + s -> s.slot, + PacketUpdateDominionWand::new + ); + + public int slot; + + public PacketUpdateDominionWand(int slot) { + this.slot = slot; + } + + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + + ItemStack stack = player.getMainHandItem().getItem() instanceof DominionWand ? player.getMainHandItem() : player.getOffhandItem(); + + stack.set(DataComponentRegistry.DOMINION_WAND, switch (slot) { + default -> stack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()) + .setFace(null) + .storeEntity(DominionWandData.NULL_ENTITY) + .storePos(null); + case 1 -> stack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()).toggleMode(false); + case 2 -> stack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()).toggleMode(true); + }); + } + + @Override + public @NotNull Type type() { + return TYPE; + } + +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java index ec6448b19d..126cdd2fe9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java @@ -237,7 +237,7 @@ public Supplier getRenderer() { } }); public static BlockEntityTypeRegistryWrapper TIMER_SPELL_TURRET_TILE = registerTile(LibBlockNames.TIMER_SPELL_TURRET, TimerSpellTurretTile::new, TIMER_SPELL_TURRET); - public static BlockRegistryWrapper ARCHWOOD_CHEST = registerBlockAndItem(LibBlockNames.ARCHWOOD_CHEST, ArchwoodChest::new, (reg) -> new ArchwoodChest.Item(reg.get(), defaultItemProperties())); + public static BlockRegistryWrapper ARCHWOOD_CHEST = registerBlockAndItem(LibBlockNames.ARCHWOOD_CHEST, ArchwoodChest::new); public static BlockEntityTypeRegistryWrapper ARCHWOOD_CHEST_TILE = registerTile(LibBlockNames.ARCHWOOD_CHEST, ArchwoodChestTile::new, ARCHWOOD_CHEST); public static BlockRegistryWrapper SPELL_PRISM = registerBlockAndItem(LibBlockNames.SPELL_PRISM, SpellPrismBlock::new); public static BlockRegistryWrapper WHIRLISPRIG_FLOWER = registerBlockAndItem(LibBlockNames.WHIRLISPRIG_BLOCK, WhirlisprigFlower::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java index 58fb264977..9ecb3246a9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/CapabilityRegistry.java @@ -2,15 +2,18 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.mana.IManaCap; +import com.hollingsworth.arsnouveau.api.source.ISourceCap; import com.hollingsworth.arsnouveau.common.capability.ANPlayerDataCap; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; import com.hollingsworth.arsnouveau.common.capability.ManaCap; +import net.minecraft.core.Direction; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.capabilities.BlockCapability; import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.capabilities.EntityCapability; import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; @@ -23,6 +26,7 @@ public class CapabilityRegistry { public static final EntityCapability MANA_CAPABILITY = EntityCapability.createVoid(ArsNouveau.prefix("mana"), ManaCap.class); public static final EntityCapability PLAYER_DATA_CAP = EntityCapability.createVoid(ArsNouveau.prefix("player_data"), ANPlayerDataCap.class); + public static final BlockCapability SOURCE_CAPABILITY = BlockCapability.createSided(ArsNouveau.prefix("source"), ISourceCap.class); /** * Get the {@link IManaCap} from the specified entity. @@ -57,11 +61,20 @@ public static void registerCapabilities(RegisterCapabilitiesEvent event) { BlockRegistry.ARCANE_PEDESTAL_TILE, BlockRegistry.ARCHWOOD_CHEST_TILE, BlockRegistry.REPOSITORY_TILE); - for(var container : containers){ + for (var container : containers) { event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, container.get(), (c, side) -> new InvWrapper(c)); } event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, BlockRegistry.CRAFTING_LECTERN_TILE.get(), (c, side) -> c.getCapability(c, side)); + + var sourceContainers = List.of(BlockRegistry.SOURCE_JAR_TILE, BlockRegistry.CREATIVE_SOURCE_JAR_TILE, + BlockRegistry.AGRONOMIC_SOURCELINK_TILE, BlockRegistry.ALCHEMICAL_TILE, BlockRegistry.VITALIC_TILE, BlockRegistry.MYCELIAL_TILE, BlockRegistry.VOLCANIC_TILE, + BlockRegistry.RELAY_COLLECTOR_TILE, BlockRegistry.RELAY_DEPOSIT_TILE, BlockRegistry.RELAY_WARP_TILE, BlockRegistry.ARCANE_RELAY_TILE, + BlockRegistry.IMBUEMENT_TILE); + + for (var container : sourceContainers) { + event.registerBlockEntity(SOURCE_CAPABILITY, container.get(), (sourceJar, side) -> sourceJar.getSourceStorage()); + } } @@ -99,9 +112,9 @@ public static void onPlayerDimChangedEvent(PlayerEvent.PlayerChangedDimensionEve } public static void syncPlayerCap(Player player) { - if(player instanceof ServerPlayer serverPlayer){ + if (player instanceof ServerPlayer serverPlayer) { ANPlayerDataCap playerData = getPlayerDataCap(serverPlayer); - if(playerData != null){ + if (playerData != null) { playerData.syncToClient(serverPlayer); } } From 5b2ff2aac379903ada7d986fd1285992fc0e617d Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 22 Sep 2024 10:51:27 -0500 Subject: [PATCH 186/363] Fix guardian tag #1418 --- .../ars_nouveau/worldgen/structure/guardian_wilden_den.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/data/ars_nouveau/worldgen/structure/guardian_wilden_den.json b/src/main/resources/data/ars_nouveau/worldgen/structure/guardian_wilden_den.json index f924912748..187c9cac13 100644 --- a/src/main/resources/data/ars_nouveau/worldgen/structure/guardian_wilden_den.json +++ b/src/main/resources/data/ars_nouveau/worldgen/structure/guardian_wilden_den.json @@ -3,7 +3,7 @@ "start_pool": "ars_nouveau:wilden_den_top_guardian", "size": 3, "max_distance_from_center": 80, - "biomes": "#c:is_coniferous", + "biomes": "#c:is_taiga", "step": "surface_structures", "terrain_adaptation": "beard_thin", "use_expansion_hack": false, From c7eb318488ddef0356d1f1720ffef9e2f1099d54 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 22 Sep 2024 11:11:01 -0500 Subject: [PATCH 187/363] Fix wololo destroying blockstates #1411 --- .../common/spell/effect/EffectWololo.java | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java index 7a0eb23f4a..32e09a460c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java @@ -36,9 +36,10 @@ import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import org.jetbrains.annotations.NotNull; @@ -135,17 +136,28 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull dye.tryApplyToSign(world, sign, sign.isFacingFrontText(player), player); } else { // Try block + dye - Block hitBlock = world.getBlockState(blockPos).getBlock(); - if (hitBlock == Blocks.AIR) return; - ItemStack result = getDyedResult((ServerLevel) world, makeContainer(dye, hitBlock)); + BlockState hitBlock = world.getBlockState(blockPos); + if (hitBlock.isAir()) return; + ItemStack result = getDyedResult((ServerLevel) world, makeContainer(dye, hitBlock.getBlock())); BlockItem blockItem; if (result.isEmpty() || !(result.getItem() instanceof BlockItem)) { // Try blocks surrounding the dye - result = getDyedResult((ServerLevel) world, makeContainer8(dye, hitBlock)); + result = getDyedResult((ServerLevel) world, makeContainer8(dye, hitBlock.getBlock())); if (result.isEmpty() || !(result.getItem() instanceof BlockItem)) return; } blockItem = (BlockItem) result.getItem(); - world.setBlockAndUpdate(blockPos, blockItem.getBlock().defaultBlockState()); + BlockState newState = blockItem.getBlock().defaultBlockState(); + // Extremely haunted + try { + for (Property prop : hitBlock.getProperties()) { + if (newState.hasProperty(prop)) { + newState = newState.trySetValue(prop, hitBlock.getValue(prop)); + } + } + }catch (Exception e){ + e.printStackTrace(); + } + world.setBlockAndUpdate(blockPos, newState); } } } From 685310c3f732919f60688fb62c4958c983da3b2f Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 22 Sep 2024 11:58:41 -0500 Subject: [PATCH 188/363] use vanilla state copying --- .../common/spell/effect/EffectWololo.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java index 32e09a460c..448a41f400 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java @@ -39,7 +39,6 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.SignBlockEntity; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import org.jetbrains.annotations.NotNull; @@ -146,17 +145,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull if (result.isEmpty() || !(result.getItem() instanceof BlockItem)) return; } blockItem = (BlockItem) result.getItem(); - BlockState newState = blockItem.getBlock().defaultBlockState(); - // Extremely haunted - try { - for (Property prop : hitBlock.getProperties()) { - if (newState.hasProperty(prop)) { - newState = newState.trySetValue(prop, hitBlock.getValue(prop)); - } - } - }catch (Exception e){ - e.printStackTrace(); - } + BlockState newState = blockItem.getBlock().withPropertiesOf(hitBlock); world.setBlockAndUpdate(blockPos, newState); } } From fd3e45b5294a510450db4dd586d14e6bdacceec8 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 22 Sep 2024 21:09:33 -0500 Subject: [PATCH 189/363] Update supporters.json --- supporters.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/supporters.json b/supporters.json index 7a30242583..90508dd0ba 100644 --- a/supporters.json +++ b/supporters.json @@ -28,7 +28,7 @@ "7dc1de80-c04c-4c0f-8f00-6326d770626b", "8bf034ac-313f-435a-bd2b-200a7857021b", "1dafa767-ce2f-47c4-8142-67b0b4854586", "9eff9013-f8a6-4a1a-9142-32d94d60d8c1", "671ffc64-8b5b-4ac2-87b1-138951be701e","aac7171c-9bac-42a8-b094-2363599dae59", "47f9c9d2-89b2-4987-af6b-31e7b1f74da2", "ec77d204-6e8b-4dac-8b66-71b2a03c5e65", "98e72ae4-10c9-4696-970b-804eb9b176ae", - "0421ad40-0881-47d4-b086-38c90c1ab62f", "a8875ecb-6e84-4c6d-ac68-3251b945d963" ], + "0421ad40-0881-47d4-b086-38c90c1ab62f", "a8875ecb-6e84-4c6d-ac68-3251b945d963", "cf1f7109-266d-4e5a-8a8a-d93684cf60b9" ], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -445,6 +445,11 @@ "color": "cyan", "adopter": "cloud8ine", "bio": "This starbuncle is just here for the rest of the ride" + },{ + "name": "Fen", + "color": "black", + "adopter": "Hayesx369", + "bio": "Introducing Fen, your adorable friend who thrives among berry bushes! With a warm personality, Fen is always eager to meet new friends, whether they are human or furry." } ] } From 6549689e1a76421a55a806b6528c0d58967787b5 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 24 Sep 2024 19:55:12 -0500 Subject: [PATCH 190/363] Fix removal loop --- .../arsnouveau/common/entity/EntityFollowProjectile.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java index 8afe976a6d..ff6f47de7a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java @@ -81,7 +81,9 @@ protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { @Override public void onRemovedFromLevel() { super.onRemovedFromLevel(); - this.remove(RemovalReason.DISCARDED); + if(!this.isRemoved()) { + this.remove(RemovalReason.DISCARDED); + } } public boolean defaultsBurst() { From 4568dfc0963eb2f55853c68647b642931cee2ea2 Mon Sep 17 00:00:00 2001 From: Jarva <4622609+Jarva@users.noreply.github.com> Date: Tue, 24 Sep 2024 20:48:47 -0500 Subject: [PATCH 191/363] Pantomime! (#1249) --- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 5 +- .../a4c3c262a85f6a179e7e29128e8b31d4da806803 | 3 +- .../e7c243f38c2b0774b1bff1a90ede0b19a4077240 | 3 +- .../f0f2bcace349d412215f006e6183aa56b9316c3c | 3 +- .../assets/ars_nouveau/lang/en_us.json | 4 +- .../models/item/glyph_pantomime.json | 6 ++ .../entries/glyphs_1/glyph_pantomime.json | 16 +++ .../ars_nouveau/recipe/glyph_pantomime.json | 34 +++++++ .../client/events/ClientEvents.java | 17 +++- .../renderer/world/PantomimeRenderer.java | 57 +++++++++++ .../common/datagen/GlyphRecipeProvider.java | 6 +- .../arsnouveau/common/lib/GlyphLib.java | 1 + .../common/spell/method/MethodPantomime.java | 93 ++++++++++++++++++ .../setup/registry/APIRegistry.java | 6 +- .../ars_nouveau/textures/item/pantomime.png | Bin 0 -> 852 bytes 15 files changed, 234 insertions(+), 20 deletions(-) create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/glyph_pantomime.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_pantomime.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/glyph_pantomime.json create mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/world/PantomimeRenderer.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodPantomime.java create mode 100644 src/main/resources/assets/ars_nouveau/textures/item/pantomime.png diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index fabe05542c..cbe8c7c939 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,3 +1,2 @@ -// 1.21.1 2024-09-22T10:22:33.0106432 Languages: en_us for mod: ars_nouveau -8e5ab95c04a148effb3f1b943177896ef20e787f assets/ars_nouveau/lang/en_us.json - +// 1.21.1 2024-09-24T20:41:46.115647 Languages: en_us for mod: ars_nouveau +0b7ebd4efe064f1cc6745f6a05dea6a6f50d185f assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 index 0c848bf1ca..4babd00a4a 100644 --- a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 +++ b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 @@ -1,4 +1,4 @@ -// 1.21.1 2024-09-11T20:19:28.5400526 Ars Nouveau Item Models +// 1.21.1 2024-09-24T20:09:13.9792381 Ars Nouveau Item Models 11ee554b11a3a830e89b742762e5b754c2ecb5ee assets/ars_nouveau/models/item/agronomic_sourcelink.json 339a05323ebef7efc5c70db708a2e7a24708e9bc assets/ars_nouveau/models/item/alchemical_sourcelink.json a0214090201827dd5f954d0b33e64e4df6e53764 assets/ars_nouveau/models/item/alchemists_crown.json @@ -83,6 +83,7 @@ e7f54893e02f4e74cfb8d6942c3e334e46b46cbe assets/ars_nouveau/models/item/glyph_li 01efb621125fc242e1a803e81a8bf9e219e71984 assets/ars_nouveau/models/item/glyph_linger.json fbfe10752f07a26aebd57e6484d5f00a053c4636 assets/ars_nouveau/models/item/glyph_name.json 3a292eab2d9aca2dbdc6267d346c0261d7476dce assets/ars_nouveau/models/item/glyph_orbit.json +b348998e3b6f8de7e17e910fa81ddcf3b4809476 assets/ars_nouveau/models/item/glyph_pantomime.json 65a10959b3e356b62f457e98109dfe3b06a179d1 assets/ars_nouveau/models/item/glyph_phantom_block.json 1c5bddc31dfc2beb8898de056ec11219e5fb64a1 assets/ars_nouveau/models/item/glyph_pickup.json 0b8d3bc964187373a08a2f9ca02665f5485eb410 assets/ars_nouveau/models/item/glyph_pierce.json diff --git a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 index d769e53dc9..f589a28313 100644 --- a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 +++ b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 @@ -1,4 +1,4 @@ -// 1.21.1 2024-09-11T20:30:24.4012426 Patchouli +// 1.21.1 2024-09-24T20:09:13.9852472 Patchouli 2ec536fea831588201432d61d70af61385882054 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/alteration_table.json a82f4fc73946d228b1e3f5e03d0ecef46f33cdfb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/applying_perks.json 8ce1d8e886b45066bc5c1d9d8e87bdabbb27ae27 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor.json @@ -107,6 +107,7 @@ b76616cf71ff62944c11560b2915d6600683f696 assets/ars_nouveau/patchouli_books/worn 589e170f6a45abd57d82f0a31d3153bbd92c778e assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_launch.json 64aaae029f866e7e288d3f69239e9ff9f5043d68 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_leap.json 0251ef29596c07db5958dcaf3131407c1e97eef7 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_light.json +de57d3e446040e4dd9d50dc754930c50a66041a1 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_pantomime.json 1990bd69025686c60aecee87d2c95a2c477b72fe assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_phantom_block.json 9fe654f846500785f20e623c2ce2ed95696849df assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_pickup.json e1c2bb82ba84d8b9dc8e609b4ec02d021f51832a assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_place_block.json diff --git a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c index 7dc1675e30..55a007d64c 100644 --- a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c +++ b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c @@ -1,4 +1,4 @@ -// 1.21.1 2024-08-17T10:54:39.1642564 Glyph Recipes +// 1.21.1 2024-09-24T20:47:30.7198603 Glyph Recipes 231d9f126c606465601e36e83948dda99a508834 data/ars_nouveau/recipe/glyph_accelerate.json dbad772acd31382cfcf19c7f276da5f91354dfcf data/ars_nouveau/recipe/glyph_amplify.json 1a8499b67d1ce8614ef1d420106d32d27567eeb9 data/ars_nouveau/recipe/glyph_animate_block.json @@ -49,6 +49,7 @@ b4d02e99a79be1d9f2a1f134a68a8b891e3cd46a data/ars_nouveau/recipe/glyph_lightning 2df04f2acf02666969cb91de1041ef827f009f16 data/ars_nouveau/recipe/glyph_linger.json a33daf748ab3dab2279e9a2da7c984c53f3e3e12 data/ars_nouveau/recipe/glyph_name.json 7911daac7df742c40d4fde6edc370d58c331461c data/ars_nouveau/recipe/glyph_orbit.json +1e8cfd09d0a8886145eb70a721274d477f40d500 data/ars_nouveau/recipe/glyph_pantomime.json 395c37ef2bc2ec7a1195e046f0bf2ea575a05675 data/ars_nouveau/recipe/glyph_phantom_block.json 18f917d7d13955d3fe0a7a37181e6825c0186da4 data/ars_nouveau/recipe/glyph_pickup.json 2fbf32d7c45ee4783d83e24ffc87ee8702372415 data/ars_nouveau/recipe/glyph_pierce.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 42a83f0639..771be7c336 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -262,6 +262,7 @@ "ars_nouveau.glyph_desc.glyph_linger": "Creates a lingering field that applies spells on nearby entities for a short time. Applying Sensitive will make this spell target blocks instead. AOE will expand the effective range, Accelerate will cast spells faster, Dampen will ignore gravity, and Extend Time will increase the duration.", "ars_nouveau.glyph_desc.glyph_name": "Names an entity after the set Spell Name. Targeting a block will name nearby entities or name inventory blocks directly if possible. Targeting with Self will name the held offhand item. Can be overridden with a name tag in the hotbar.", "ars_nouveau.glyph_desc.glyph_orbit": "Summons three orbiting projectiles around the target that will cast a spell on any entities it may hit. Additional projectiles, their speed, radius, and duration may be augmented. Sensitive will cause Orbit to hit blocks.", + "ars_nouveau.glyph_desc.glyph_pantomime": "Applies spells to the nearest block in your line of sight. Dampen will reduce the distance, Amplify will increase it. Sensitive will highlight the selected block.", "ars_nouveau.glyph_desc.glyph_phantom_block": "Creates a temporary block that will disappear after a short time. Amplify will cause the block to be permanent. Dispelling this block will destroy it instantly.", "ars_nouveau.glyph_desc.glyph_pickup": "Picks up nearby items in a medium radius where this spell is activated. The range may be expanded with AOE.", "ars_nouveau.glyph_desc.glyph_pierce": "When applied to the Projectile spell, projectiles may continue through their path an additional time after hitting a mob or block. Causes certain effects to also target the block behind them, like Break. Combines with AOE to provide depth.", @@ -343,6 +344,7 @@ "ars_nouveau.glyph_name.glyph_linger": "Linger", "ars_nouveau.glyph_name.glyph_name": "Name", "ars_nouveau.glyph_name.glyph_orbit": "Orbit", + "ars_nouveau.glyph_name.glyph_pantomime": "Pantomime", "ars_nouveau.glyph_name.glyph_phantom_block": "Conjure Mageblock", "ars_nouveau.glyph_name.glyph_pickup": "Item Pickup", "ars_nouveau.glyph_name.glyph_pierce": "Pierce", @@ -453,7 +455,7 @@ "ars_nouveau.page.brazier_relay": "Allows the users to bind a Ritual Brazier ritual to a new location. Multiple rituals can be connected to the same brazier relay. To connect, use the Dominion Wand on your Ritual Brazier, then the relay. Source is consumed at the original braziers location. Can be bound within 15 blocks.", "ars_nouveau.page.crystallizer1": "The crystallizer provides a renewable source of Source Gems by condensing source over time. The Crystallizer can work passively at a very slow rate, or it may be given source from adjacent jars and create Source Gems as a much faster rate. The Crystallizer may also be accessed by Hoppers and Starbuncles.", "ars_nouveau.page.decorative": "Decorative Blocks", - "ars_nouveau.page.dominion_wand": "A tool for configuring Source Relays and automation entities. To set a transfer path, use the wand on the object that you would like to take source from, and then use it on the block you would like to send source to. For example: Source Jar to Source Relay, Source Relay to Source Relay, or Source Relay to Source Jar. To clear connections, sneak and use this wand on a relay. If you sneak-use it on the air it will switch to Strict mode, allowing to specify the side of the blocks to use.", + "ars_nouveau.page.dominion_wand": "A tool for configuring Source Relays and automation entities. To set a transfer path, use the wand on the object that you would like to take source from, and then use it on the block you would like to send source to. For example: Source Jar to Source Relay, Source Relay to Source Relay, or Source Relay to Source Jar. To clear connections, sneak and use this wand on a relay. You can switch into Strict mode using the radial menu, allowing to specify the side of the blocks to use.", "ars_nouveau.page.dowsing_rod": "A Dowsing Rod provides the user a short duration of Scrying for Budding Amethyst and Magic Find, which will cause magical creatures to glow within 75 blocks of you. The Dowsing Rod has a limited number of uses.", "ars_nouveau.page.enchanters_eye": "A caster tool that can cast inscribed spells remotely through a Scry Crystal. Use the eye on a Scry Crystal to bind the location, or hold a bound Scry Parchment in the offhand. Spells will be cast through the eye similar to a Spell Turret, but you are considered the caster for all effects. Useful for remote teleportation or item movement.", "ars_nouveau.page.enchanters_mirror": "Applies a self spell to the user. Spells cast with this mirror are discounted and gain additional bonus duration to all glyphs. Apply a spell at the Scribe's table that DOES NOT contain a form such as Heal -> Amplify.", diff --git a/src/generated/resources/assets/ars_nouveau/models/item/glyph_pantomime.json b/src/generated/resources/assets/ars_nouveau/models/item/glyph_pantomime.json new file mode 100644 index 0000000000..17a4e95fdd --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/glyph_pantomime.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ars_nouveau:item/pantomime" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_pantomime.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_pantomime.json new file mode 100644 index 0000000000..ca46938f48 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_pantomime.json @@ -0,0 +1,16 @@ +{ + "category": "ars_nouveau:glyphs_1", + "icon": "ars_nouveau:glyph_pantomime", + "name": "ars_nouveau.glyph_name.glyph_pantomime", + "pages": [ + { + "type": "patchouli:text", + "text": "ars_nouveau.glyph_desc.glyph_pantomime" + }, + { + "type": "ars_nouveau:glyph_recipe", + "recipe": "ars_nouveau:glyph_pantomime" + } + ], + "sortnum": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_pantomime.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_pantomime.json new file mode 100644 index 0000000000..ab578c1d22 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_pantomime.json @@ -0,0 +1,34 @@ +{ + "type": "ars_nouveau:glyph", + "exp": 27, + "inputs": [ + { + "tag": "c:glass_blocks" + }, + { + "tag": "c:glass_blocks" + }, + { + "tag": "c:glass_blocks" + }, + { + "tag": "c:glass_blocks" + }, + { + "tag": "c:glass_blocks" + }, + { + "tag": "c:glass_blocks" + }, + { + "tag": "c:glass_blocks" + }, + { + "tag": "c:glass_blocks" + } + ], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_pantomime" + } +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java index cb3ceba26d..22225749c1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.client.gui.PatchouliTooltipEvent; import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; +import com.hollingsworth.arsnouveau.client.renderer.world.PantomimeRenderer; import com.hollingsworth.arsnouveau.common.block.tile.ArchwoodChestTile; import com.hollingsworth.arsnouveau.common.block.tile.GhostWeaveTile; import com.hollingsworth.arsnouveau.common.block.tile.SkyBlockTile; @@ -21,18 +22,17 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RegisterClientTooltipComponentFactoriesEvent; -import net.neoforged.neoforge.client.event.RenderGuiLayerEvent; -import net.neoforged.neoforge.client.event.RenderHighlightEvent; -import net.neoforged.neoforge.client.event.RenderTooltipEvent; +import net.neoforged.neoforge.client.event.*; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; import net.neoforged.neoforge.client.gui.VanillaGuiLayers; import net.neoforged.neoforge.event.entity.player.ItemTooltipEvent; import org.jetbrains.annotations.NotNull; + @EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID) public class ClientEvents { @@ -43,6 +43,7 @@ public static void registerTooltipFactory(RegisterClientTooltipComponentFactorie event.register(SpellTooltip.class, SpellTooltip.SpellTooltipRenderer::new); } + @SubscribeEvent public static void registerClientExtensions(RegisterClientExtensionsEvent event) { event.registerItem(new IClientItemExtensions() { @@ -64,6 +65,13 @@ public void renderByItem(@NotNull ItemStack stack, @NotNull ItemDisplayContext t } } + @SubscribeEvent(priority = EventPriority.LOWEST) + public static void renderWorldLastEvent(final RenderLevelStageEvent event) { + if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRIPWIRE_BLOCKS) { + PantomimeRenderer.renderOutline(event.getPoseStack()); + } + } + @SubscribeEvent public static void TooltipEvent(RenderTooltipEvent.Pre e) { try { @@ -111,5 +119,4 @@ public static Component localize(String key, Object... params) { return Component.translatable(key, params); } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/world/PantomimeRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/world/PantomimeRenderer.java new file mode 100644 index 0000000000..eb25bcce1d --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/world/PantomimeRenderer.java @@ -0,0 +1,57 @@ +package com.hollingsworth.arsnouveau.client.renderer.world; + +import com.hollingsworth.arsnouveau.api.item.ICasterTool; +import com.hollingsworth.arsnouveau.api.registry.SpellCasterRegistry; +import com.hollingsworth.arsnouveau.api.spell.Spell; +import com.hollingsworth.arsnouveau.api.spell.SpellContext; +import com.hollingsworth.arsnouveau.api.spell.SpellStats; +import com.hollingsworth.arsnouveau.common.spell.method.MethodPantomime; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.OutlineBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.BlockPos; +import net.minecraft.util.FastColor; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; + +public class PantomimeRenderer { + public static void renderOutline(PoseStack poseStack) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack heldItem = player.getItemInHand(InteractionHand.MAIN_HAND); + + if (!(player.getItemInHand(InteractionHand.MAIN_HAND).getItem() instanceof ICasterTool)) return; + + var caster = SpellCasterRegistry.from(heldItem); + if(caster == null) + return; + Spell selectedSpell = caster.getSpell(); + + if (!(selectedSpell.getCastMethod() instanceof MethodPantomime pantomime)) return; + SpellStats stats = new SpellStats.Builder() + .setAugments(selectedSpell.getAugments(0, player)) + .addItemsFromEntity(player) + .build(MethodPantomime.INSTANCE, null, player.level, player, SpellContext.fromEntity(selectedSpell, player, heldItem)); + if(!stats.isSensitive()){ + return; + } + BlockPos pos = pantomime.findPosition(player, stats).getBlockPos(); + poseStack.pushPose(); + Vec3 projectedView = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); + poseStack.translate(-projectedView.x, -projectedView.y, -projectedView.z); + poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); + + RenderType lineType = RenderType.lines(); + OutlineBufferSource buffer = Minecraft.getInstance().renderBuffers().outlineBufferSource(); + VertexConsumer lines = buffer.getBuffer(lineType); + int color = selectedSpell.color().getColor(); + LevelRenderer.renderLineBox(poseStack, lines, 0, 0, 0, 1, 1, 1, FastColor.ARGB32.red(color) / 255F, FastColor.ARGB32.green(color) / 255F, FastColor.ARGB32.blue(color) / 255F, 1); + + poseStack.popPose(); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java index 249e91535e..90806a8bb9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java @@ -4,10 +4,7 @@ import com.hollingsworth.arsnouveau.common.crafting.recipes.GlyphRecipe; import com.hollingsworth.arsnouveau.common.spell.augment.*; import com.hollingsworth.arsnouveau.common.spell.effect.*; -import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; -import com.hollingsworth.arsnouveau.common.spell.method.MethodSelf; -import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; -import com.hollingsworth.arsnouveau.common.spell.method.MethodUnderfoot; +import com.hollingsworth.arsnouveau.common.spell.method.*; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.mojang.serialization.JsonOps; @@ -127,6 +124,7 @@ public void collectJsons(CachedOutput pOutput) { add(get(EffectReset.INSTANCE).withItem(Items.TARGET, 1)); add(get(EffectWololo.INSTANCE).withItem(ItemsRegistry.ABJURATION_ESSENCE).withIngredient(Ingredient.of(Tags.Items.DYES), 3)); add(get(EffectRewind.INSTANCE).withItem(ItemsRegistry.MANIPULATION_ESSENCE).withItem(Items.CLOCK, 3)); + add(get(MethodPantomime.INSTANCE).withIngredient(Tags.Items.GLASS_BLOCKS, 8)); for (GlyphRecipe recipe : recipes) { Path path = getScribeGlyphPath(output, recipe.output.getItem()); saveStable(pOutput, GlyphRecipe.CODEC.encodeStart(JsonOps.INSTANCE, recipe).getOrThrow(), path); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/GlyphLib.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/GlyphLib.java index f24dafd94e..7734eefc6c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/GlyphLib.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/GlyphLib.java @@ -4,6 +4,7 @@ public class GlyphLib { public static final String MethodProjectileID = prependGlyph("projectile"); public static final String MethodTouchID = prependGlyph("touch"); public static final String MethodSelfID = prependGlyph("self"); + public static final String MethodPantomimeID = prependGlyph("pantomime"); public static final String EffectRuneID = prependGlyph("rune"); public static final String EffectBreakID = prependGlyph("break"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodPantomime.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodPantomime.java new file mode 100644 index 0000000000..0f44804169 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodPantomime.java @@ -0,0 +1,93 @@ +package com.hollingsworth.arsnouveau.common.spell.method; + + +import com.hollingsworth.arsnouveau.api.spell.*; +import com.hollingsworth.arsnouveau.common.lib.GlyphLib; +import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; +import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDampen; +import com.hollingsworth.arsnouveau.common.spell.augment.AugmentSensitive; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; +import java.util.Set; + +public class MethodPantomime extends AbstractCastMethod { + public static MethodPantomime INSTANCE = new MethodPantomime(); + + public MethodPantomime() { + super(GlyphLib.MethodPantomimeID, "Pantomime"); + } + + public BlockHitResult findPosition(LivingEntity shooter, SpellStats stats) { + int offset = stats.getBuffCount(AugmentDampen.INSTANCE) > 0 ? -1 : stats.getBuffCount(AugmentAmplify.INSTANCE); + Vec3 eyes = shooter.getEyePosition(1.0f); + float viewXRot = shooter.getViewXRot(1.0f); + double dist = viewXRot < 45.0f ? 2 + offset : 3 + offset; + Vec3 to = eyes.add(shooter.getViewVector(1.0f).scale(dist)); + BlockPos toPos = BlockPos.containing(to); + return new BlockHitResult(eyes, Direction.getNearest(to.x, to.y, to.z).getOpposite(), toPos, true); + } + + public CastResolveType getTarget(Level world, LivingEntity shooter, SpellResolver resolver, SpellStats stats) { + BlockHitResult res = findPosition(shooter, stats); + + if (res == null) return CastResolveType.FAILURE; + + resolver.onResolveEffect(world, res); + return CastResolveType.SUCCESS; + } + + @Override + public CastResolveType onCast(@Nullable ItemStack stack, LivingEntity playerEntity, Level world, SpellStats spellStats, SpellContext context, SpellResolver resolver) { + return getTarget(world, playerEntity, resolver, spellStats); + } + + @Override + public CastResolveType onCastOnBlock(UseOnContext context, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { + return getTarget(context.getLevel(), context.getPlayer(), resolver, spellStats); + } + + @Override + public CastResolveType onCastOnBlock(BlockHitResult blockRayTraceResult, LivingEntity caster, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { + return getTarget(caster.getCommandSenderWorld(), caster, resolver, spellStats); + } + + @Override + public CastResolveType onCastOnEntity(@Nullable ItemStack stack, LivingEntity caster, Entity target, InteractionHand hand, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { + return getTarget(caster.level(), caster, resolver, spellStats); + } + + @Override + protected int getDefaultManaCost() { + return 5; + } + + + @Override + protected @NotNull Set getCompatibleAugments() { + return Set.of(AugmentAmplify.INSTANCE, AugmentDampen.INSTANCE, AugmentSensitive.INSTANCE); + } + + @Override + protected void addDefaultAugmentLimits(Map defaults) { + super.addDefaultAugmentLimits(defaults); + defaults.put(AugmentDampen.INSTANCE.getRegistryName(), 1); + } + + @Override + public String getBookDescription() { + return "Applies spells to the nearest block in your line of sight. Dampen will reduce the distance, Amplify will increase it. Sensitive will highlight the selected block."; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java index b5968174bb..e37ea2c4e2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java @@ -19,10 +19,7 @@ import com.hollingsworth.arsnouveau.common.ritual.*; import com.hollingsworth.arsnouveau.common.spell.augment.*; import com.hollingsworth.arsnouveau.common.spell.effect.*; -import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; -import com.hollingsworth.arsnouveau.common.spell.method.MethodSelf; -import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; -import com.hollingsworth.arsnouveau.common.spell.method.MethodUnderfoot; +import com.hollingsworth.arsnouveau.common.spell.method.*; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.EntityType; @@ -43,6 +40,7 @@ public static void setup() { registerSpell(MethodProjectile.INSTANCE); registerSpell(MethodTouch.INSTANCE); registerSpell(MethodSelf.INSTANCE); + registerSpell(MethodPantomime.INSTANCE); registerSpell(EffectBreak.INSTANCE); registerSpell(EffectHarm.INSTANCE); registerSpell(EffectIgnite.INSTANCE); diff --git a/src/main/resources/assets/ars_nouveau/textures/item/pantomime.png b/src/main/resources/assets/ars_nouveau/textures/item/pantomime.png new file mode 100644 index 0000000000000000000000000000000000000000..7edbb0059d2cbad2db831de47db15c866a6cee49 GIT binary patch literal 852 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V3ziDaSW-L^LFn3><~v0x9_dj z*RZKbiK-}QB~3r1q;%s3$GTS615UvjO)Gj6RE0Jgu=u7=^}6Py+aluFo9g9wB*|J- zM6qN4QK#+3|Cql|j+y!V`60`vPv54@IIKFo^84A4wJPV&ty$;xajNewL3G6PI- z{!iZiFW~K*Dx-TZT9)0~oM;ohbcNPyzyF`&&t|VJ`TqUTj#Ygp7>qd#nxRDKwp%l8 zB;GgX+}mN-^Zw30)1LfWLj9NX)^k5rUYwj5^YQIxFNycx>)Sr+%Rk<`=6b$;%SZqC z`j(HaPb*|XWhXMG2_&#ViC1rCuUWQw?ql)1<yMpFH)NM*)tS8!&)Oc}#+b zcf|$Gt>sJhr$%!vPJsuSW5dj-xraAbXk0g48&Iv&?6lIngv;mv57QY12+{MVFRWH) z_mSBO*QGZuTP@Z4Dm5@v_7(RR$DNMO3sKDrUL9?>du?3J z{u@Q#%&y*vJauOo*MAXc$^iz#tCx$jSIYC~`n6vT{AOnqx|FAUSK`(M-==K(^33|- npUt7uZru*N+Si2a#?R7w6`y?JZf6z;<`xD|S3j3^P6 Date: Sat, 28 Sep 2024 20:54:51 +0200 Subject: [PATCH 192/363] hotfix to jar setState to account for different jar sizes (#1425) --- .../arsnouveau/common/block/tile/SourceJarTile.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java index beeaece0c9..7beeb943f6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java @@ -32,11 +32,8 @@ public boolean updateBlock() { super.updateBlock(); BlockState state = level.getBlockState(worldPosition); int fillState = 0; - if (this.getSource() > 0 && this.getSource() < 1000) - fillState = 1; - else if (this.getSource() != 0) { - fillState = (this.getSource() / 1000) + 1; - } + if (this.getSource() > 0 && getMaxSource() != 0) + fillState = 1 + 10 * (int) Math.clamp((float) this.getSource() / getMaxSource(), 0, 1); if (state.hasProperty(SourceJar.fill)) level.setBlock(worldPosition, state.setValue(SourceJar.fill, fillState), 3); return true; From d5d44b8ecfe62643624e1a8cb0343c1235e7aff7 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 29 Sep 2024 12:16:07 -0500 Subject: [PATCH 193/363] Remove excess renderer classes, interfaces --- .../api/client/IVariantColorProvider.java | 10 -- .../api/client/IVariantTextureProvider.java | 17 ---- .../client/registry/ClientHandler.java | 96 ++++++++++++++----- .../entity/AmethystGolemRenderer.java | 15 +-- .../renderer/entity/BookwyrmRenderer.java | 8 +- .../renderer/entity/GenericRenderer.java | 22 ----- .../renderer/entity/GiftStarbyRenderer.java | 19 ---- .../client/renderer/entity/LilyRenderer.java | 12 --- .../entity/TextureVariantRenderer.java | 21 ---- .../renderer/entity/WealdWalkerRenderer.java | 26 ----- .../renderer/entity/WhirlisprigRenderer.java | 12 --- .../entity/WildenChimeraRenderer.java | 25 ----- .../entity/WildenGuardianRenderer.java | 11 --- .../renderer/entity/WildenHunterRenderer.java | 11 --- .../entity/WildenStalkerRenderer.java | 11 --- .../familiar/FamiliarBookwyrmRenderer.java | 11 ++- .../entity/familiar/FamiliarStarbyModel.java | 4 +- .../familiar/FamiliarWhirlisprigRenderer.java | 10 +- .../familiar/GenericFamiliarRenderer.java | 48 ---------- ...Renderer.java => GenericTileRenderer.java} | 8 +- .../common/armor/AnimatedMagicArmor.java | 8 +- .../common/entity/AmethystGolem.java | 26 +++-- .../common/entity/EntityBookwyrm.java | 20 ++-- .../common/entity/EntityDrygmy.java | 19 ++-- .../arsnouveau/common/entity/EntityWixie.java | 15 ++- .../arsnouveau/common/entity/Starbuncle.java | 16 +--- .../arsnouveau/common/entity/Whirlisprig.java | 17 ++-- .../familiar/FamiliarAmethystGolem.java | 5 +- .../entity/familiar/FamiliarBookwyrm.java | 3 +- .../entity/familiar/FamiliarDrygmy.java | 3 +- .../entity/familiar/FamiliarEntity.java | 3 +- .../entity/familiar/FamiliarStarbuncle.java | 3 +- .../entity/familiar/FamiliarWhirlisprig.java | 3 +- .../common/entity/familiar/FamiliarWixie.java | 3 +- .../amethyst_golem/DepositAmethystGoal.java | 6 +- .../amethyst_golem/PickupAmethystGoal.java | 8 +- .../setup/registry/BlockRegistry.java | 14 +-- 37 files changed, 176 insertions(+), 393 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/client/IVariantColorProvider.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/client/IVariantTextureProvider.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GenericRenderer.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GiftStarbyRenderer.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyRenderer.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/TextureVariantRenderer.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WealdWalkerRenderer.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WhirlisprigRenderer.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenChimeraRenderer.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenGuardianRenderer.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenHunterRenderer.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenStalkerRenderer.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/GenericFamiliarRenderer.java rename src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/{GenericRenderer.java => GenericTileRenderer.java} (72%) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/client/IVariantColorProvider.java b/src/main/java/com/hollingsworth/arsnouveau/api/client/IVariantColorProvider.java deleted file mode 100644 index 74372b5c45..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/api/client/IVariantColorProvider.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.hollingsworth.arsnouveau.api.client; - -public interface IVariantColorProvider extends IVariantTextureProvider { - - void setColor(String color, T object); - - default String getColor(T object) { - return ""; - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/client/IVariantTextureProvider.java b/src/main/java/com/hollingsworth/arsnouveau/api/client/IVariantTextureProvider.java deleted file mode 100644 index 2100ede514..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/api/client/IVariantTextureProvider.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.hollingsworth.arsnouveau.api.client; - -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.LivingEntity; - -public interface IVariantTextureProvider { - - @Deprecated(forRemoval = true) - default ResourceLocation getTexture(LivingEntity entity){ - return null; - } - - default ResourceLocation getTexture(T entity){ - return getTexture((LivingEntity)entity); - } - -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index 23342aabe8..f1c47f9f44 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -11,12 +11,20 @@ import com.hollingsworth.arsnouveau.client.gui.GuiSpellHUD; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.renderer.entity.*; -import com.hollingsworth.arsnouveau.client.renderer.entity.familiar.*; -import com.hollingsworth.arsnouveau.client.renderer.tile.GenericRenderer; +import com.hollingsworth.arsnouveau.client.renderer.entity.familiar.AnimSkullRenderer; +import com.hollingsworth.arsnouveau.client.renderer.entity.familiar.FamiliarBookwyrmRenderer; +import com.hollingsworth.arsnouveau.client.renderer.entity.familiar.FamiliarStarbyModel; +import com.hollingsworth.arsnouveau.client.renderer.entity.familiar.FamiliarWhirlisprigRenderer; import com.hollingsworth.arsnouveau.client.renderer.tile.*; import com.hollingsworth.arsnouveau.common.block.tile.MageBlockTile; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; import com.hollingsworth.arsnouveau.common.block.tile.PotionMelderTile; +import com.hollingsworth.arsnouveau.common.entity.EntityDrygmy; +import com.hollingsworth.arsnouveau.common.entity.EntityWixie; +import com.hollingsworth.arsnouveau.common.entity.Whirlisprig; +import com.hollingsworth.arsnouveau.common.entity.familiar.FamiliarDrygmy; +import com.hollingsworth.arsnouveau.common.entity.familiar.FamiliarStarbuncle; +import com.hollingsworth.arsnouveau.common.entity.familiar.FamiliarWixie; import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; import com.hollingsworth.arsnouveau.common.items.data.BlockFillContents; import com.hollingsworth.arsnouveau.common.items.data.PotionJarData; @@ -35,6 +43,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.FastColor; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.DyeColor; @@ -52,7 +61,9 @@ import net.neoforged.neoforge.client.event.RegisterGuiLayersEvent; import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; import net.neoforged.neoforge.client.gui.VanillaGuiLayers; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.renderer.GeoEntityRenderer; import static com.hollingsworth.arsnouveau.client.events.ClientEvents.localize; @@ -71,10 +82,10 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerBlockEntityRenderer(BlockRegistry.INTANGIBLE_AIR_TYPE.get(), IntangibleAirRenderer::new); event.registerBlockEntityRenderer(BlockRegistry.IMBUEMENT_TILE.get(), ImbuementRenderer::new); event.registerBlockEntityRenderer(BlockRegistry.POTION_MELDER_TYPE.get(), PotionMelderRenderer::new); - event.registerBlockEntityRenderer(BlockRegistry.RELAY_DEPOSIT_TILE.get(), (t) -> new GenericRenderer(t, "source_deposit")); - event.registerBlockEntityRenderer(BlockRegistry.RELAY_WARP_TILE.get(), (t) -> new GenericRenderer(t, "source_warp")); - event.registerBlockEntityRenderer(BlockRegistry.ARCANE_RELAY_TILE.get(), (t) -> new GenericRenderer(t, "source_relay")); - event.registerBlockEntityRenderer(BlockRegistry.RELAY_SPLITTER_TILE.get(), (t) -> new GenericRenderer(t, "source_splitter")); + event.registerBlockEntityRenderer(BlockRegistry.RELAY_DEPOSIT_TILE.get(), (t) -> new GenericTileRenderer<>(t, "source_deposit")); + event.registerBlockEntityRenderer(BlockRegistry.RELAY_WARP_TILE.get(), (t) -> new GenericTileRenderer<>(t, "source_warp")); + event.registerBlockEntityRenderer(BlockRegistry.ARCANE_RELAY_TILE.get(), (t) -> new GenericTileRenderer<>(t, "source_relay")); + event.registerBlockEntityRenderer(BlockRegistry.RELAY_SPLITTER_TILE.get(), (t) -> new GenericTileRenderer<>(t, "source_splitter")); event.registerBlockEntityRenderer(BlockRegistry.BASIC_SPELL_TURRET_TILE.get(), BasicTurretRenderer::new); event.registerBlockEntityRenderer(BlockRegistry.ROTATING_TURRET_TILE.get(), RotatingTurretRenderer::new); event.registerBlockEntityRenderer(BlockRegistry.ENCHANTED_SPELL_TURRET_TYPE.get(), ReducerTurretRenderer::new); @@ -83,7 +94,7 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerBlockEntityRenderer(BlockRegistry.RUNE_TILE.get(), RuneRenderer::new); event.registerBlockEntityRenderer(BlockRegistry.WHIRLISPRIG_TILE.get(), WhirlisprigFlowerRenderer::new); event.registerBlockEntityRenderer(BlockRegistry.ARCANE_CORE_TILE.get(), ArcaneCoreRenderer::new); - event.registerBlockEntityRenderer(BlockRegistry.RELAY_COLLECTOR_TILE.get(), (t) -> new GenericRenderer(t, "source_collector")); + event.registerBlockEntityRenderer(BlockRegistry.RELAY_COLLECTOR_TILE.get(), (t) -> new GenericTileRenderer<>(t, "source_collector")); event.registerBlockEntityRenderer(BlockRegistry.SCRYERS_OCULUS_TILE.get(), (t) -> new ScryerOculusRenderer(t, new ScryersEyeModel())); event.registerBlockEntityRenderer(BlockRegistry.ARMOR_TILE.get(), AlterationTableRenderer::new); event.registerBlockEntityRenderer(BlockRegistry.MOB_JAR_TILE.get(), MobJarRenderer::new); @@ -111,11 +122,21 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerEntityRenderer(ModEntities.ALLY_VEX.get(), VexRenderer::new); event.registerEntityRenderer(ModEntities.STARBUNCLE_TYPE.get(), StarbuncleRenderer::new); - event.registerEntityRenderer(ModEntities.WHIRLISPRIG_TYPE.get(), WhirlisprigRenderer::new); - event.registerEntityRenderer(ModEntities.ENTITY_WIXIE_TYPE.get(), (t) -> new TextureVariantRenderer<>(t, new WixieModel<>())); - event.registerEntityRenderer(ModEntities.WILDEN_STALKER.get(), WildenStalkerRenderer::new); - event.registerEntityRenderer(ModEntities.WILDEN_GUARDIAN.get(), WildenGuardianRenderer::new); - event.registerEntityRenderer(ModEntities.WILDEN_HUNTER.get(), WildenHunterRenderer::new); + event.registerEntityRenderer(ModEntities.WHIRLISPRIG_TYPE.get(), (t) -> new GeoEntityRenderer<>(t, new WhirlisprigModel<>()){ + @Override + public @NotNull ResourceLocation getTextureLocation(@NotNull Whirlisprig animatable) { + return animatable.getTexture(); + } + }); + event.registerEntityRenderer(ModEntities.ENTITY_WIXIE_TYPE.get(), (t) -> new GeoEntityRenderer<>(t, new WixieModel<>()){ + @Override + public @NotNull ResourceLocation getTextureLocation(@NotNull EntityWixie animatable) { + return animatable.getTexture(); + } + }); + event.registerEntityRenderer(ModEntities.WILDEN_STALKER.get(), (t) -> new GeoEntityRenderer<>(t, new WildenStalkerModel())); + event.registerEntityRenderer(ModEntities.WILDEN_GUARDIAN.get(), (t) -> new GeoEntityRenderer<>(t, new WildenGuardianModel())); + event.registerEntityRenderer(ModEntities.WILDEN_HUNTER.get(), (t) -> new GeoEntityRenderer<>(t, new WildenHunterModel())); event.registerEntityRenderer(ModEntities.SUMMON_WOLF.get(), WolfRenderer::new); event.registerEntityRenderer(ModEntities.SUMMON_HORSE.get(), HorseRenderer::new); event.registerEntityRenderer(ModEntities.LIGHTNING_ENTITY.get(), LightningBoltRenderer::new); @@ -125,25 +146,50 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerEntityRenderer(ModEntities.ENTITY_RITUAL.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.ENTITY_SPELL_ARROW.get(), TippableArrowRenderer::new); - event.registerEntityRenderer(ModEntities.ENTITY_WIXIE_TYPE.get(), (t) -> new TextureVariantRenderer<>(t, new WixieModel<>())); + event.registerEntityRenderer(ModEntities.ENTITY_WIXIE_TYPE.get(), (t) -> new GeoEntityRenderer<>(t, new WixieModel<>()){ + @Override + public @NotNull ResourceLocation getTextureLocation(@NotNull EntityWixie animatable) { + return animatable.getTexture(); + } + }); event.registerEntityRenderer(ModEntities.ENTITY_DUMMY.get(), DummyRenderer::new); - event.registerEntityRenderer(ModEntities.ENTITY_DRYGMY.get(), (t) -> new TextureVariantRenderer<>(t, new DrygmyModel<>())); + event.registerEntityRenderer(ModEntities.ENTITY_DRYGMY.get(), (t) -> new GeoEntityRenderer<>(t, new DrygmyModel<>()){ + @Override + public @NotNull ResourceLocation getTextureLocation(@NotNull EntityDrygmy animatable) { + return animatable.getTexture(); + } + }); event.registerEntityRenderer(ModEntities.ORBIT_SPELL.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); - event.registerEntityRenderer(ModEntities.WILDEN_BOSS.get(), WildenChimeraRenderer::new); + event.registerEntityRenderer(ModEntities.WILDEN_BOSS.get(), rendermanager -> new GeoEntityRenderer<>(rendermanager, new WildenChimeraModel())); event.registerEntityRenderer(ModEntities.ENTITY_CHIMERA_SPIKE.get(), ChimeraProjectileRenderer::new); - event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_STARBUNCLE.get(), (t) -> new GenericFamiliarRenderer<>(t, new FamiliarStarbyModel<>())); - event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_DRYGMY.get(), (t) -> new GenericFamiliarRenderer<>(t, new DrygmyModel<>())); + event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_STARBUNCLE.get(), (t) -> new GeoEntityRenderer<>(t, new FamiliarStarbyModel<>()){ + @Override + public @NotNull ResourceLocation getTextureLocation(@NotNull FamiliarStarbuncle animatable) { + return animatable.getTexture(); + } + }); + event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_DRYGMY.get(), (t) -> new GeoEntityRenderer<>(t, new DrygmyModel<>()){ + @Override + public @NotNull ResourceLocation getTextureLocation(@NotNull FamiliarDrygmy animatable) { + return animatable.getTexture(); + } + }); event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_SYLPH.get(), FamiliarWhirlisprigRenderer::new); - event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_WIXIE.get(), (t) -> new GenericFamiliarRenderer<>(t, new WixieModel<>())); + event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_WIXIE.get(), (t) -> new GeoEntityRenderer<>(t, new WixieModel<>()){ + @Override + public ResourceLocation getTextureLocation(FamiliarWixie animatable) { + return animatable.getTexture(); + } + }); event.registerEntityRenderer(ModEntities.ENTITY_BOOKWYRM_TYPE.get(), BookwyrmRenderer::new); - event.registerEntityRenderer(ModEntities.FAMILIAR_AMETHYST_GOLEM.get(), (t) -> new GenericFamiliarRenderer<>(t, new AmethystGolemModel<>())); + event.registerEntityRenderer(ModEntities.FAMILIAR_AMETHYST_GOLEM.get(), AmethystGolemRenderer::new); event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_BOOKWYRM.get(), FamiliarBookwyrmRenderer::new); event.registerEntityRenderer(ModEntities.LINGER_SPELL.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); - event.registerEntityRenderer(ModEntities.ENTITY_CASCADING_WEALD.get(), (v) -> new WealdWalkerRenderer<>(v, "cascading_weald")); - event.registerEntityRenderer(ModEntities.ENTITY_BLAZING_WEALD.get(), (v) -> new WealdWalkerRenderer<>(v, "blazing_weald")); - event.registerEntityRenderer(ModEntities.ENTITY_FLOURISHING_WEALD.get(), (v) -> new WealdWalkerRenderer<>(v, "flourishing_weald")); - event.registerEntityRenderer(ModEntities.ENTITY_VEXING_WEALD.get(), (v) -> new WealdWalkerRenderer<>(v, "vexing_weald")); + event.registerEntityRenderer(ModEntities.ENTITY_CASCADING_WEALD.get(), (v) -> new GeoEntityRenderer<>(v, new WealdWalkerModel<>("cascading_weald"))); + event.registerEntityRenderer(ModEntities.ENTITY_BLAZING_WEALD.get(), (v) -> new GeoEntityRenderer<>(v, new WealdWalkerModel<>("blazing_weald"))); + event.registerEntityRenderer(ModEntities.ENTITY_FLOURISHING_WEALD.get(), (v) -> new GeoEntityRenderer<>(v, new WealdWalkerModel<>("flourishing_weald"))); + event.registerEntityRenderer(ModEntities.ENTITY_VEXING_WEALD.get(), (v) -> new GeoEntityRenderer<>(v, new WealdWalkerModel<>("vexing_weald"))); event.registerEntityRenderer(ModEntities.AMETHYST_GOLEM.get(), AmethystGolemRenderer::new); event.registerEntityRenderer(ModEntities.SCRYER_CAMERA.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); @@ -151,13 +197,13 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerEntityRenderer(ModEntities.ICE_SHARD.get(), EnchantedFallingBlockRenderer::new); event.registerEntityRenderer(ModEntities.ENCHANTED_MAGE_BLOCK.get(), MageBlockRenderer::new); event.registerEntityRenderer(ModEntities.ENCHANTED_HEAD_BLOCK.get(), EnchantedSkullRenderer::new); - event.registerEntityRenderer(ModEntities.GIFT_STARBY.get(), GiftStarbyRenderer::new); + event.registerEntityRenderer(ModEntities.GIFT_STARBY.get(),(renderer) -> new GeoEntityRenderer<>(renderer, new GiftStarbyModel())); event.registerEntityRenderer(ModEntities.ANIMATED_BLOCK.get(), AnimBlockRenderer::new); event.registerEntityRenderer(ModEntities.ANIMATED_HEAD.get(), AnimSkullRenderer::new); event.registerEntityRenderer(ModEntities.CINDER.get(), CinderRenderer::new); event.registerEntityRenderer(ModEntities.WALL_SPELL.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); - event.registerEntityRenderer(ModEntities.LILY.get(), LilyRenderer::new); + event.registerEntityRenderer(ModEntities.LILY.get(), (v) -> new GeoEntityRenderer<>(v, new LilyModel())); } public static LayeredDraw.Layer cameraOverlay = (gui, tracker) -> { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AmethystGolemRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AmethystGolemRenderer.java index d9e050e9a5..95d0d7ae98 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AmethystGolemRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AmethystGolemRenderer.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.client.renderer.entity; -import com.hollingsworth.arsnouveau.common.entity.AmethystGolem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.Minecraft; @@ -9,30 +8,32 @@ import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.renderer.GeoEntityRenderer; import software.bernie.geckolib.util.RenderUtil; -public class AmethystGolemRenderer extends GeoEntityRenderer { +public class AmethystGolemRenderer extends GeoEntityRenderer { public AmethystGolemRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new AmethystGolemModel<>()); } - AmethystGolem golem; + LivingEntity golem; MultiBufferSource buffer; ResourceLocation text; @Override - public RenderType getRenderType(AmethystGolem animatable, ResourceLocation texture, @org.jetbrains.annotations.Nullable MultiBufferSource bufferSource, float partialTick) { + public RenderType getRenderType(T animatable, ResourceLocation texture, @org.jetbrains.annotations.Nullable MultiBufferSource bufferSource, float partialTick) { return RenderType.entityCutoutNoCull(texture); } @Override - public void preRender(PoseStack poseStack, AmethystGolem animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int colour) { + public void preRender(PoseStack poseStack, T animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int colour) { this.golem = animatable; this.buffer = bufferSource; this.text = this.getTextureLocation(animatable); @@ -40,12 +41,12 @@ public void preRender(PoseStack poseStack, AmethystGolem animatable, BakedGeoMod } @Override - public void renderRecursively(PoseStack stack, AmethystGolem animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int colour) { + public void renderRecursively(PoseStack stack, T animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int colour) { if (bone.getName().equals("item")) { stack.pushPose(); RenderUtil.translateToPivotPoint(stack, bone); stack.translate(0, -0.10, 0); - ItemStack itemstack = golem.getHeldStack(); + ItemStack itemstack = golem.getMainHandItem(); Minecraft.getInstance().getItemRenderer().renderStatic(itemstack, ItemDisplayContext.GROUND, packedLight, OverlayTexture.NO_OVERLAY, stack, this.buffer, animatable.level, (int) golem.getOnPos().asLong()); stack.popPose(); bufferIn = buffer.getBuffer(RenderType.entityCutoutNoCull(text)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmRenderer.java index 66953a3d52..79493fa5d9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BookwyrmRenderer.java @@ -13,10 +13,11 @@ import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoEntityRenderer; import software.bernie.geckolib.util.RenderUtil; -public class BookwyrmRenderer extends TextureVariantRenderer { +public class BookwyrmRenderer extends GeoEntityRenderer { public static ResourceLocation BLUE = ArsNouveau.prefix( "textures/entity/book_wyrm_blue.png"); @@ -35,7 +36,6 @@ public void renderRecursively(PoseStack stack, EntityBookwyrm animatable, GeoBon ItemStack itemstack = animatable.getHeldStack(); Minecraft.getInstance().getItemRenderer().renderStatic(itemstack, ItemDisplayContext.GROUND, packedLight, OverlayTexture.NO_OVERLAY, stack, bufferIn, animatable.level, (int) animatable.getOnPos().asLong()); stack.popPose(); -// buffer = bufferIn.getBuffer(RenderType.entityCutoutNoCull(text)); } super.renderRecursively(stack, animatable, bone, renderType, bufferIn, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } @@ -48,4 +48,8 @@ public void render(EntityBookwyrm entity, float entityYaw, float partialTicks, P stack.popPose(); } + @Override + public ResourceLocation getTextureLocation(EntityBookwyrm animatable) { + return animatable.getTexture(); + } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GenericRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GenericRenderer.java deleted file mode 100644 index 612f4a378a..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GenericRenderer.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.hollingsworth.arsnouveau.client.renderer.entity; - -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.LivingEntity; -import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.model.GeoModel; -import software.bernie.geckolib.renderer.GeoEntityRenderer; - -public class GenericRenderer extends GeoEntityRenderer { - public GenericRenderer(EntityRendererProvider.Context renderManager, GeoModel model) { - super(renderManager, model); - } - - - @Override - public RenderType getRenderType(T animatable, ResourceLocation texture, @org.jetbrains.annotations.Nullable MultiBufferSource bufferSource, float partialTick) { - return RenderType.entityCutoutNoCull(texture); - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GiftStarbyRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GiftStarbyRenderer.java deleted file mode 100644 index d04e61b7c8..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/GiftStarbyRenderer.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.hollingsworth.arsnouveau.client.renderer.entity; - -import com.hollingsworth.arsnouveau.common.entity.GiftStarbuncle; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.renderer.GeoEntityRenderer; - -public class GiftStarbyRenderer extends GeoEntityRenderer { - public GiftStarbyRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new GiftStarbyModel()); - } - - @Override - public RenderType getRenderType(GiftStarbuncle animatable, ResourceLocation texture, @org.jetbrains.annotations.Nullable MultiBufferSource bufferSource, float partialTick) { - return RenderType.entityCutoutNoCull(texture); - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyRenderer.java deleted file mode 100644 index 5f49202457..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyRenderer.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.hollingsworth.arsnouveau.client.renderer.entity; - -import com.hollingsworth.arsnouveau.common.entity.Lily; -import net.minecraft.client.renderer.entity.EntityRendererProvider; - -public class LilyRenderer extends GenericRenderer { - public LilyRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new LilyModel()); - } - - -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/TextureVariantRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/TextureVariantRenderer.java deleted file mode 100644 index 21064cdb6a..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/TextureVariantRenderer.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.hollingsworth.arsnouveau.client.renderer.entity; - -import com.hollingsworth.arsnouveau.api.client.IVariantTextureProvider; -import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.LivingEntity; -import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.model.GeoModel; - -public class TextureVariantRenderer extends GenericRenderer { - - public TextureVariantRenderer(EntityRendererProvider.Context renderManager, GeoModel modelProvider) { - super(renderManager, modelProvider); - } - - @Override - public ResourceLocation getTextureLocation(T entity) { - return entity.getTexture((Object) entity); - } - -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WealdWalkerRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WealdWalkerRenderer.java deleted file mode 100644 index 0f833beb24..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WealdWalkerRenderer.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.hollingsworth.arsnouveau.client.renderer.entity; - -import com.hollingsworth.arsnouveau.common.entity.WealdWalker; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.renderer.GeoEntityRenderer; - -public class WealdWalkerRenderer extends GeoEntityRenderer { - - public WealdWalkerRenderer(EntityRendererProvider.Context manager, String type) { - super(manager, new WealdWalkerModel<>(type)); - } - - @Override - public void render(W entity, float entityYaw, float partialTicks, PoseStack stack, MultiBufferSource bufferIn, int packedLightIn) { - super.render(entity, entityYaw, partialTicks, stack, bufferIn, packedLightIn); - } - - @Override - public RenderType getRenderType(W animatable, ResourceLocation texture, @org.jetbrains.annotations.Nullable MultiBufferSource bufferSource, float partialTick) { - return RenderType.entityCutoutNoCull(texture); - } -} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WhirlisprigRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WhirlisprigRenderer.java deleted file mode 100644 index 5dd022d178..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WhirlisprigRenderer.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.hollingsworth.arsnouveau.client.renderer.entity; - -import com.hollingsworth.arsnouveau.common.entity.Whirlisprig; -import net.minecraft.client.renderer.entity.EntityRendererProvider; - -public class WhirlisprigRenderer extends TextureVariantRenderer { - - public WhirlisprigRenderer(EntityRendererProvider.Context manager) { - super(manager, new WhirlisprigModel<>()); - } - -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenChimeraRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenChimeraRenderer.java deleted file mode 100644 index c66b4c72f8..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenChimeraRenderer.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.hollingsworth.arsnouveau.client.renderer.entity; - -import com.hollingsworth.arsnouveau.common.entity.WildenChimera; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.renderer.GeoEntityRenderer; - -public class WildenChimeraRenderer extends GeoEntityRenderer { - public WildenChimeraRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new WildenChimeraModel()); - } - - @Override - public void render(WildenChimera entity, float entityYaw, float partialTicks, PoseStack stack, MultiBufferSource bufferIn, int packedLightIn) { - super.render(entity, entityYaw, partialTicks, stack, bufferIn, packedLightIn); - } - - @Override - public RenderType getRenderType(WildenChimera animatable, ResourceLocation texture, @org.jetbrains.annotations.Nullable MultiBufferSource bufferSource, float partialTick) { - return RenderType.entityCutoutNoCull(texture); - } -} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenGuardianRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenGuardianRenderer.java deleted file mode 100644 index 786c597c5f..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenGuardianRenderer.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hollingsworth.arsnouveau.client.renderer.entity; - -import com.hollingsworth.arsnouveau.common.entity.WildenGuardian; -import net.minecraft.client.renderer.entity.EntityRendererProvider; - -public class WildenGuardianRenderer extends GenericRenderer { - - public WildenGuardianRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new WildenGuardianModel()); - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenHunterRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenHunterRenderer.java deleted file mode 100644 index cc2f2f3c2b..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenHunterRenderer.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hollingsworth.arsnouveau.client.renderer.entity; - -import com.hollingsworth.arsnouveau.common.entity.WildenHunter; -import net.minecraft.client.renderer.entity.EntityRendererProvider; - -public class WildenHunterRenderer extends GenericRenderer { - public WildenHunterRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new WildenHunterModel()); - } - -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenStalkerRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenStalkerRenderer.java deleted file mode 100644 index ccd4260013..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WildenStalkerRenderer.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hollingsworth.arsnouveau.client.renderer.entity; - -import com.hollingsworth.arsnouveau.common.entity.WildenStalker; -import net.minecraft.client.renderer.entity.EntityRendererProvider; - -public class WildenStalkerRenderer extends GenericRenderer { - public WildenStalkerRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new WildenStalkerModel()); - } - -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarBookwyrmRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarBookwyrmRenderer.java index 86f324aab1..b50407e9ac 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarBookwyrmRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarBookwyrmRenderer.java @@ -5,19 +5,24 @@ import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.renderer.GeoEntityRenderer; -public class FamiliarBookwyrmRenderer extends GenericFamiliarRenderer { +public class FamiliarBookwyrmRenderer extends GeoEntityRenderer { public FamiliarBookwyrmRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new BookwyrmModel<>()); } @Override - public void render(T entity, float entityYaw, float partialTicks, PoseStack stack, MultiBufferSource bufferIn, int packedLightIn) { + public void render(FamiliarBookwyrm entity, float entityYaw, float partialTicks, PoseStack stack, MultiBufferSource bufferIn, int packedLightIn) { stack.pushPose(); stack.scale(0.5f, 0.5f, 0.5f); super.render(entity, entityYaw, partialTicks, stack, bufferIn, packedLightIn); stack.popPose(); } - + @Override + public ResourceLocation getTextureLocation(FamiliarBookwyrm entity) { + return entity.getTexture(); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarStarbyModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarStarbyModel.java index 46c8f4ce55..5a05ed46aa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarStarbyModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarStarbyModel.java @@ -3,9 +3,9 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.entity.familiar.FamiliarStarbuncle; import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.data.EntityModelData; @@ -29,7 +29,7 @@ public ResourceLocation getModelResource(FamiliarStarbuncle carbuncle) { @Override public ResourceLocation getTextureResource(FamiliarStarbuncle carbuncle) { - return carbuncle.getTexture(carbuncle); + return carbuncle.getTexture(); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java index 7fa9960613..fa0145291f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java @@ -9,20 +9,22 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoEntityRenderer; import java.util.Random; -public class FamiliarWhirlisprigRenderer extends GenericFamiliarRenderer { +public class FamiliarWhirlisprigRenderer extends GeoEntityRenderer { public FamiliarWhirlisprigRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new WhirlisprigModel<>()); } @Override - public void render(T entityIn, float entityYaw, float partialTicks, PoseStack matrixStackIn, MultiBufferSource bufferIn, int packedLightIn) { + public void render(FamiliarWhirlisprig entityIn, float entityYaw, float partialTicks, PoseStack matrixStackIn, MultiBufferSource bufferIn, int packedLightIn) { super.render(entityIn, entityYaw, partialTicks, matrixStackIn, bufferIn, packedLightIn); if (Minecraft.getInstance().isPaused()) return; @@ -46,4 +48,8 @@ public void render(T entityIn, float entityYaw, float partialTicks, PoseStack ma } } + @Override + public ResourceLocation getTextureLocation(FamiliarWhirlisprig animatable) { + return animatable.getTexture(); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/GenericFamiliarRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/GenericFamiliarRenderer.java deleted file mode 100644 index 48426224bf..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/GenericFamiliarRenderer.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.hollingsworth.arsnouveau.client.renderer.entity.familiar; - -import com.hollingsworth.arsnouveau.api.client.CosmeticRenderUtil; -import com.hollingsworth.arsnouveau.api.item.ICosmeticItem; -import com.hollingsworth.arsnouveau.client.renderer.entity.GenericRenderer; -import com.hollingsworth.arsnouveau.common.entity.familiar.FamiliarEntity; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.cache.object.BakedGeoModel; -import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.model.GeoModel; - - -public class GenericFamiliarRenderer extends GenericRenderer { - - private T familiar; - private MultiBufferSource bufferSource; - - public GenericFamiliarRenderer(EntityRendererProvider.Context renderManager, GeoModel modelProvider) { - super(renderManager, modelProvider); - } - - @Override - public void preRender(PoseStack poseStack, T animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { - this.familiar = animatable; - this.bufferSource = bufferSource; - super.preRender(poseStack, animatable, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); - - } - - @Override - public void renderRecursively(PoseStack stack, T animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { - if (this.familiar.getCosmeticItem().getItem() instanceof ICosmeticItem cosmetic && cosmetic.getBone().equals(bone.getName())) { - CosmeticRenderUtil.renderCosmetic(bone, stack, this.bufferSource, familiar, packedLight); - buffer = this.bufferSource.getBuffer(RenderType.entityCutoutNoCull(getTextureLocation(familiar))); - } - super.renderRecursively(stack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); - } - - @Override - public ResourceLocation getTextureLocation(T entity) { - return entity.getTexture(entity) == null ? super.getTextureLocation(entity) : entity.getTexture(entity); - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericTileRenderer.java similarity index 72% rename from src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericRenderer.java rename to src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericTileRenderer.java index 04290105a3..5655424207 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/GenericTileRenderer.java @@ -9,14 +9,14 @@ import java.util.function.Supplier; -public class GenericRenderer extends GeoBlockRenderer { +public class GenericTileRenderer extends GeoBlockRenderer { - public GenericRenderer(BlockEntityRendererProvider.Context rendererDispatcherIn, String loc) { - super(new GenericModel(loc)); + public GenericTileRenderer(BlockEntityRendererProvider.Context rendererDispatcherIn, String loc) { + super(new GenericModel<>(loc)); } public static Supplier getISTER(String loc) { - return () -> new GenericItemBlockRenderer(new GenericModel(loc)); + return () -> new GenericItemBlockRenderer(new GenericModel<>(loc)); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java index 5dc44b5da1..024abc71a5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/armor/AnimatedMagicArmor.java @@ -1,7 +1,6 @@ package com.hollingsworth.arsnouveau.common.armor; import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.api.client.IVariantColorProvider; import com.hollingsworth.arsnouveau.api.perk.ITickablePerk; import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import com.hollingsworth.arsnouveau.api.perk.PerkInstance; @@ -43,7 +42,7 @@ import java.util.List; import java.util.function.Consumer; -public class AnimatedMagicArmor extends ArmorItem implements IDyeable, GeoItem, IVariantColorProvider { +public class AnimatedMagicArmor extends ArmorItem implements IDyeable, GeoItem { public GeoModel model; public AnimatedMagicArmor(Holder materialIn, ArmorItem.Type slot, Properties builder, GeoModel model) { @@ -183,12 +182,7 @@ public GeoModel getArmorModel() { return ArsNouveau.prefix( "textures/" + genericModel.textPathRoot + "/" + genericModel.name + "_" + this.getColor(stack) + ".png"); } - @Override - public void setColor(String color, ItemStack armor) { - - } - @Override public String getColor(ItemStack object) { var perkHolder = PerkUtil.getPerkHolder(object); if(!(perkHolder instanceof ArmorPerkHolder data)){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java index 6d0acd72fd..2ff8992b69 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java @@ -112,11 +112,11 @@ protected void registerGoals() { this.goalSelector.addGoal(8, new WaterAvoidingRandomStrollGoal(this, 1.0D)); this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 8.0F)); this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(3, new ConvertBuddingGoal(this, () -> convertCooldown <= 0 && getHome() != null && getHeldStack().isEmpty())); - this.goalSelector.addGoal(4, new GrowClusterGoal(this, () -> growCooldown <= 0 && getHome() != null && getHeldStack().isEmpty())); - this.goalSelector.addGoal(5, new HarvestClusterGoal(this, () -> harvestCooldown <= 0 && getHome() != null && !isImbueing() && getHeldStack().isEmpty())); + this.goalSelector.addGoal(3, new ConvertBuddingGoal(this, () -> convertCooldown <= 0 && getHome() != null && getMainHandItem().isEmpty())); + this.goalSelector.addGoal(4, new GrowClusterGoal(this, () -> growCooldown <= 0 && getHome() != null && getMainHandItem().isEmpty())); + this.goalSelector.addGoal(5, new HarvestClusterGoal(this, () -> harvestCooldown <= 0 && getHome() != null && !isImbueing() && getMainHandItem().isEmpty())); this.goalSelector.addGoal(2, new PickupAmethystGoal(this, () -> getHome() != null && pickupCooldown <= 0)); - this.goalSelector.addGoal(2, new DepositAmethystGoal(this, () -> getHome() != null && !getHeldStack().isEmpty())); + this.goalSelector.addGoal(2, new DepositAmethystGoal(this, () -> getHome() != null && !getMainHandItem().isEmpty())); } @Override @@ -153,10 +153,6 @@ public void setHeldStack(ItemStack stack) { this.setItemSlot(EquipmentSlot.MAINHAND, stack); } - public ItemStack getHeldStack() { - return this.getMainHandItem(); - } - public boolean isStomping() { return this.entityData.get(STOMPING); } @@ -229,8 +225,8 @@ public void die(DamageSource source) { if (!level.isClientSide) { ItemStack stack = new ItemStack(ItemsRegistry.AMETHYST_GOLEM_CHARM.get()); level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); - if (this.getHeldStack() != null) - level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), this.getHeldStack())); + if (this.getMainHandItem() != null) + level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), this.getMainHandItem())); } super.die(source); } @@ -248,7 +244,7 @@ public boolean onDispel(@Nullable LivingEntity caster) { if (!level.isClientSide) { ItemStack stack = new ItemStack(ItemsRegistry.AMETHYST_GOLEM_CHARM.get()); level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack.copy())); - stack = getHeldStack(); + stack = getMainHandItem(); level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); ParticleUtil.spawnPoof((ServerLevel) level, blockPosition()); this.remove(RemovalReason.DISCARDED); @@ -265,8 +261,8 @@ public void addAdditionalSaveData(CompoundTag tag) { tag.putInt("harvest", harvestCooldown); tag.putInt("pickup", pickupCooldown); - if (getHeldStack() != null && !getHeldStack().isEmpty()) { - Tag itemTag = getHeldStack().save(level.registryAccess()); + if (getMainHandItem() != null && !getMainHandItem().isEmpty()) { + Tag itemTag = getMainHandItem().save(level.registryAccess()); tag.put("held", itemTag); } } @@ -299,12 +295,12 @@ public void registerControllers(AnimatableManager.ControllerRegistrar data) { return PlayState.CONTINUE; } if (e.isMoving()) { - String anim = getHeldStack().isEmpty() ? "run" : "run_carry"; + String anim = getMainHandItem().isEmpty() ? "run" : "run_carry"; controller.setAnimation(RawAnimation.begin().thenPlay(anim)); return PlayState.CONTINUE; } - if (!getHeldStack().isEmpty()) { + if (!getMainHandItem().isEmpty()) { controller.setAnimation(RawAnimation.begin().thenPlay("carry_idle")); return PlayState.CONTINUE; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java index 829de68ae6..4a8bb6e036 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java @@ -3,7 +3,6 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.ANFakePlayer; import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; -import com.hollingsworth.arsnouveau.api.client.IVariantColorProvider; import com.hollingsworth.arsnouveau.api.entity.IDispellable; import com.hollingsworth.arsnouveau.api.item.IWandable; import com.hollingsworth.arsnouveau.api.util.BlockUtil; @@ -59,7 +58,7 @@ import java.util.Arrays; import java.util.List; -public class EntityBookwyrm extends FlyingMob implements IDispellable, ITooltipProvider, IWandable, GeoEntity, IVariantColorProvider { +public class EntityBookwyrm extends FlyingMob implements IDispellable, ITooltipProvider, IWandable, GeoEntity { public static final EntityDataAccessor HELD_ITEM = SynchedEntityData.defineId(EntityBookwyrm.class, EntityDataSerializers.ITEM_STACK); public static final EntityDataAccessor COLOR = SynchedEntityData.defineId(EntityBookwyrm.class, EntityDataSerializers.STRING); @@ -93,7 +92,7 @@ protected InteractionResult mobInteract(Player player, InteractionHand hand) { DyeColor color = DyeColor.getColor(stack); if (color == null || this.entityData.get(COLOR).equals(color.getName()) || !Arrays.asList(COLORS).contains(color.getName())) return InteractionResult.SUCCESS; - setColor(color.getName(), this); + setColor(color.getName()); player.getMainHandItem().shrink(1); return InteractionResult.SUCCESS; } @@ -220,7 +219,7 @@ public EntityType getType() { public ItemStack toCharm(){ ItemStack stack = new ItemStack(ItemsRegistry.BOOKWYRM_CHARM.get()); - PersistentFamiliarData data = new PersistentFamiliarData(getCustomName(), getColor(this), getHeldStack()); + PersistentFamiliarData data = new PersistentFamiliarData(getCustomName(), getColor(), getHeldStack()); stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, data); return stack; } @@ -229,7 +228,7 @@ public void readCharm(ItemStack stack){ PersistentFamiliarData data = stack.get(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA); if(data == null) return; - setColor(data.color(), this); + setColor(data.color()); setCustomName(data.name()); } @@ -324,21 +323,18 @@ protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { public static String[] COLORS = {"purple", "green", "blue", "black", "red", "white"}; - @Override - public ResourceLocation getTexture(EntityBookwyrm entity) { - String color = getColor(entity).toLowerCase(); + public ResourceLocation getTexture() { + String color = getColor().toLowerCase(); if (color.isEmpty()) color = "blue"; return ArsNouveau.prefix( "textures/entity/book_wyrm_" + color + ".png"); } - @Override - public String getColor(EntityBookwyrm entityBookwyrm) { + public String getColor() { return getEntityData().get(EntityBookwyrm.COLOR); } - @Override - public void setColor(String color, EntityBookwyrm entityBookwyrm) { + public void setColor(String color) { getEntityData().set(EntityBookwyrm.COLOR, color); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java index 6ed6a939ad..4560bbbf4b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java @@ -3,7 +3,6 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.ANFakePlayer; import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; -import com.hollingsworth.arsnouveau.api.client.IVariantColorProvider; import com.hollingsworth.arsnouveau.api.entity.IDispellable; import com.hollingsworth.arsnouveau.api.util.NBTUtil; import com.hollingsworth.arsnouveau.api.util.SummonUtil; @@ -18,8 +17,10 @@ import com.hollingsworth.arsnouveau.common.entity.goal.drygmy.CollectEssenceGoal; import com.hollingsworth.arsnouveau.common.entity.goal.whirlisprig.FollowMobGoalBackoff; import com.hollingsworth.arsnouveau.common.entity.goal.whirlisprig.FollowPlayerGoal; +import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketANEffect; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.core.BlockPos; @@ -61,7 +62,7 @@ import java.util.LinkedHashSet; import java.util.List; -public class EntityDrygmy extends PathfinderMob implements GeoEntity, ITooltipProvider, IDispellable, IVariantColorProvider { +public class EntityDrygmy extends PathfinderMob implements GeoEntity, ITooltipProvider, IDispellable { public static final EntityDataAccessor CHANNELING = SynchedEntityData.defineId(EntityDrygmy.class, EntityDataSerializers.BOOLEAN); public static final EntityDataAccessor TAMED = SynchedEntityData.defineId(EntityDrygmy.class, EntityDataSerializers.BOOLEAN); @@ -107,6 +108,8 @@ public boolean hurt(DamageSource pSource, float pAmount) { public void die(DamageSource source) { if (!level.isClientSide && isTamed()) { ItemStack stack = new ItemStack(ItemsRegistry.DRYGMY_CHARM); + PersistentFamiliarData familiarData = new PersistentFamiliarData().setName(this.getCustomName()).setColor(getColor()); + stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, familiarData); level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); } super.die(source); @@ -349,21 +352,19 @@ public void tryResetGoals() { this.addGoalsAfterConstructor(); } - @Override - public ResourceLocation getTexture(EntityDrygmy entity) { - String color = getColor(entity).toLowerCase(); + + public ResourceLocation getTexture() { + String color = getColor().toLowerCase(); if (color.isEmpty()) color = "brown"; return ArsNouveau.prefix( "textures/entity/drygmy_" + color + ".png"); } - @Override - public String getColor(EntityDrygmy entity) { + public String getColor() { return getEntityData().get(COLOR); } - @Override - public void setColor(String color, EntityDrygmy entity) { + public void setColor(String color) { getEntityData().set(COLOR, color); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java index 68f0ace5f2..2ebc283654 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java @@ -2,7 +2,6 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.ANFakePlayer; -import com.hollingsworth.arsnouveau.api.client.IVariantColorProvider; import com.hollingsworth.arsnouveau.api.entity.IDispellable; import com.hollingsworth.arsnouveau.api.util.SummonUtil; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; @@ -47,7 +46,7 @@ import javax.annotation.Nullable; import java.util.Arrays; -public class EntityWixie extends AbstractFlyingCreature implements GeoEntity, IAnimationListener, IDispellable, IVariantColorProvider { +public class EntityWixie extends AbstractFlyingCreature implements GeoEntity, IAnimationListener, IDispellable { AnimatableInstanceCache manager = GeckoLibUtil.createInstanceCache(this); public static final EntityDataAccessor COLOR = SynchedEntityData.defineId(EntityWixie.class, EntityDataSerializers.STRING); @@ -227,21 +226,19 @@ public boolean onDispel(@Nullable LivingEntity caster) { return true; } - @Override - public ResourceLocation getTexture(EntityWixie entity) { - String color = getColor(entity).toLowerCase(); + public ResourceLocation getTexture() { + String color = getColor().toLowerCase(); if (color.isEmpty()) color = "blue"; return ArsNouveau.prefix( "textures/entity/wixie_" + color + ".png"); } - @Override - public String getColor(EntityWixie entityWixie) { + public String getColor() { return this.getEntityData().get(COLOR); } - @Override - public void setColor(String color, EntityWixie entityWixie) { + + public void setColor(String color) { this.getEntityData().set(COLOR, color); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 94e7f75a6a..0b84b541c0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -2,7 +2,6 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; -import com.hollingsworth.arsnouveau.api.client.IVariantColorProvider; import com.hollingsworth.arsnouveau.api.entity.ChangeableBehavior; import com.hollingsworth.arsnouveau.api.entity.IDecoratable; import com.hollingsworth.arsnouveau.api.entity.IDispellable; @@ -86,7 +85,7 @@ import java.util.*; -public class Starbuncle extends PathfinderMob implements GeoEntity, IDecoratable, IDispellable, ITooltipProvider, IWandable, IDebuggerProvider, ITagSyncable, IVariantColorProvider { +public class Starbuncle extends PathfinderMob implements GeoEntity, IDecoratable, IDispellable, ITooltipProvider, IWandable, IDebuggerProvider, ITagSyncable { @Deprecated @@ -678,21 +677,10 @@ public void setColor(String color) { this.entityData.set(COLOR, data.color); } - @Override - public void setColor(String color, Starbuncle object) { - setColor(color); - } - - @Override - public String getColor(Starbuncle object) { - return this.entityData.get(COLOR); - } - public String getColor() { return this.entityData.get(COLOR); } - @Override public ResourceLocation getTexture(Starbuncle entity) { if (entity.getName().getString().equals("Gootastic")) { return ArsNouveau.prefix("textures/entity/starbuncle_goo.png"); @@ -701,7 +689,7 @@ public ResourceLocation getTexture(Starbuncle entity) { if(customTexture != null){ return ArsNouveau.prefix("textures/entity/" + customTexture + ".png"); } - String color = getColor(entity); + String color = getColor(); if (color.isEmpty()) color = DyeColor.ORANGE.getName(); return ArsNouveau.prefix("textures/entity/starbuncle_" + color.toLowerCase() + ".png"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java index af74d55d9d..9fbd991d2a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java @@ -3,7 +3,6 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.ANFakePlayer; import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; -import com.hollingsworth.arsnouveau.api.client.IVariantColorProvider; import com.hollingsworth.arsnouveau.api.entity.IDispellable; import com.hollingsworth.arsnouveau.api.util.LevelEntityMap; import com.hollingsworth.arsnouveau.api.util.SummonUtil; @@ -16,6 +15,7 @@ import com.hollingsworth.arsnouveau.common.entity.goal.whirlisprig.FollowPlayerGoal; import com.hollingsworth.arsnouveau.common.entity.goal.whirlisprig.InspectPlantGoal; import com.hollingsworth.arsnouveau.common.items.data.ItemScrollData; +import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketANEffect; import com.hollingsworth.arsnouveau.common.util.PortUtil; @@ -67,7 +67,7 @@ import java.util.LinkedHashSet; import java.util.List; -public class Whirlisprig extends AbstractFlyingCreature implements GeoEntity, ITooltipProvider, IDispellable, IVariantColorProvider { +public class Whirlisprig extends AbstractFlyingCreature implements GeoEntity, ITooltipProvider, IDispellable { AnimatableInstanceCache manager = GeckoLibUtil.createInstanceCache(this); public static LevelEntityMap WHIRLI_MAP = new LevelEntityMap(); @@ -121,11 +121,11 @@ protected InteractionResult mobInteract(Player player, InteractionHand hand) { return super.mobInteract(player, hand); } - public String getColor(Whirlisprig entity) { + public String getColor() { return this.entityData.get(COLOR); } - public void setColor(String color, Whirlisprig entity) { + public void setColor(String color) { this.entityData.set(COLOR, color); } @@ -151,7 +151,7 @@ public InteractionResult interactAt(Player player, Vec3 vec, InteractionHand han ItemStack stack = player.getItemInHand(hand); String color = getColorFromStack(stack); - if (color != null && !getColor(this).equals(color)) { + if (color != null && !getColor().equals(color)) { this.entityData.set(COLOR, color); stack.shrink(1); return InteractionResult.SUCCESS; @@ -308,6 +308,8 @@ public boolean hurt(DamageSource pSource, float pAmount) { public void die(DamageSource source) { if (!level.isClientSide && isTamed()) { ItemStack stack = new ItemStack(ItemsRegistry.WHIRLISPRIG_CHARM); + PersistentFamiliarData familiarData = new PersistentFamiliarData().setName(this.getCustomName()).setColor(getColor()); + stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, familiarData); level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); } super.die(source); @@ -443,8 +445,7 @@ public boolean onDispel(@Nullable LivingEntity caster) { return this.isTamed(); } - @Override - public ResourceLocation getTexture(Whirlisprig entity) { - return ArsNouveau.prefix( "textures/entity/whirlisprig_" + (getColor(entity).isEmpty() ? "summer" : getColor(entity)) + ".png"); + public ResourceLocation getTexture() { + return ArsNouveau.prefix( "textures/entity/whirlisprig_" + (getColor().isEmpty() ? "summer" : getColor()) + ".png"); } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java index ef62ad15b9..6f98e6dfbe 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarAmethystGolem.java @@ -57,9 +57,8 @@ public PlayState walkPredicate(AnimationState event) { Variants.put("default", ArsNouveau.prefix( "textures/entity/amethyst_golem.png")); } - @Override - public ResourceLocation getTexture(FamiliarEntity entity) { - return Variants.getOrDefault(entity.getColor(), Variants.get("default")); + public ResourceLocation getTexture() { + return Variants.getOrDefault(getColor(), Variants.get("default")); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java index 0861a5917a..bf736ba012 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarBookwyrm.java @@ -101,8 +101,7 @@ public PlayState walkPredicate(AnimationState event) { return ModEntities.ENTITY_FAMILIAR_BOOKWYRM.get(); } - @Override - public ResourceLocation getTexture(FamiliarEntity entity) { + public ResourceLocation getTexture() { String color = getColor().toLowerCase(); if (color.isEmpty()) color = "blue"; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java index dbf0b1f6fe..eb908f65e9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java @@ -74,8 +74,7 @@ public PlayState walkPredicate(AnimationState event) { return ModEntities.ENTITY_FAMILIAR_DRYGMY.get(); } - @Override - public ResourceLocation getTexture(FamiliarEntity entity) { + public ResourceLocation getTexture() { String color = getColor().toLowerCase(); if (color.isEmpty()) color = "brown"; return ArsNouveau.prefix("textures/entity/drygmy_" + color + ".png"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java index ecc27537c1..34f598ace5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.common.entity.familiar; -import com.hollingsworth.arsnouveau.api.client.IVariantTextureProvider; import com.hollingsworth.arsnouveau.api.entity.IDecoratable; import com.hollingsworth.arsnouveau.api.entity.IDispellable; import com.hollingsworth.arsnouveau.api.event.FamiliarSummonEvent; @@ -48,7 +47,7 @@ import javax.annotation.Nullable; import java.util.*; -public class FamiliarEntity extends PathfinderMob implements GeoEntity, IFamiliar, IDispellable, IDecoratable, IVariantTextureProvider { +public class FamiliarEntity extends PathfinderMob implements GeoEntity, IFamiliar, IDispellable, IDecoratable { public double manaReserveModifier = 0.15; private static final EntityDataAccessor> OWNER_UUID = SynchedEntityData.defineId(FamiliarEntity.class, EntityDataSerializers.OPTIONAL_UUID); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java index 4a49fe352d..a2d8b2464a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java @@ -78,8 +78,7 @@ protected void defineSynchedData(SynchedEntityData.@NotNull Builder pBuilder) { super.defineSynchedData(pBuilder); } - @Override - public ResourceLocation getTexture(FamiliarEntity entity) { + public ResourceLocation getTexture() { String color = getColor(); if (color.isEmpty()) color = DyeColor.ORANGE.getName(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java index 038c3c4491..82ed27dcf7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java @@ -95,8 +95,7 @@ public EntityType getType() { return ModEntities.ENTITY_FAMILIAR_SYLPH.get(); } - @Override - public ResourceLocation getTexture(FamiliarEntity entity) { + public ResourceLocation getTexture() { return ArsNouveau.prefix( "textures/entity/whirlisprig_" + (getColor().isEmpty() ? "summer" : getColor().toLowerCase()) + ".png"); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java index baded77228..8276406ad6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWixie.java @@ -129,8 +129,7 @@ public void startAnimation(int arg) { } } - @Override - public ResourceLocation getTexture(FamiliarEntity entity) { + public ResourceLocation getTexture() { String color = getColor().toLowerCase(); if (color.isEmpty()) color = "blue"; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/DepositAmethystGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/DepositAmethystGoal.java index 8d0e260a65..94f69b9698 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/DepositAmethystGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/DepositAmethystGoal.java @@ -49,9 +49,9 @@ public void tick() { public void deposit() { IItemHandler iItemHandler = golem.level.getCapability(Capabilities.ItemHandler.BLOCK, golem.getHome(), null); if (iItemHandler != null) { - ItemStack oldStack = new ItemStack(golem.getHeldStack().getItem(), golem.getHeldStack().getCount()); + ItemStack oldStack = new ItemStack(golem.getMainHandItem().getItem(), golem.getMainHandItem().getCount()); - ItemStack left = ItemHandlerHelper.insertItemStacked(iItemHandler, golem.getHeldStack(), false); + ItemStack left = ItemHandlerHelper.insertItemStacked(iItemHandler, golem.getMainHandItem(), false); if (left.equals(oldStack)) { return; } @@ -79,7 +79,7 @@ public boolean isInterruptable() { @Override public boolean canUse() { - if (golem.getHome() == null || golem.getHeldStack().isEmpty()) + if (golem.getHome() == null || golem.getMainHandItem().isEmpty()) return false; return canUse.get() && golem.level.getCapability(Capabilities.ItemHandler.BLOCK, golem.getHome(), null) != null; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/PickupAmethystGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/PickupAmethystGoal.java index 9f4c50922b..90a39b6550 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/PickupAmethystGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/amethyst_golem/PickupAmethystGoal.java @@ -57,10 +57,10 @@ public void tick() { public void collectStacks() { if (golem.getHome() == null) return; for (ItemEntity i : golem.level.getEntitiesOfClass(ItemEntity.class, new AABB(golem.getHome()).inflate(10), i -> i.getItem().is(SHARD_TAG))) { - if (!golem.getHeldStack().isEmpty() && i.getItem().getItem() != golem.getHeldStack().getItem()) + if (!golem.getMainHandItem().isEmpty() && i.getItem().getItem() != golem.getMainHandItem().getItem()) continue; - int maxTake = golem.getHeldStack().getMaxStackSize() - golem.getHeldStack().getCount(); - if (golem.getHeldStack().isEmpty()) { + int maxTake = golem.getMainHandItem().getMaxStackSize() - golem.getMainHandItem().getCount(); + if (golem.getMainHandItem().isEmpty()) { golem.setHeldStack(i.getItem().copy()); i.getItem().setCount(0); continue; @@ -68,7 +68,7 @@ public void collectStacks() { int toTake = Math.min(i.getItem().getCount(), maxTake); i.getItem().shrink(toTake); - golem.getHeldStack().grow(toTake); + golem.getMainHandItem().grow(toTake); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java index 126cdd2fe9..0d17ac8cd4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java @@ -71,7 +71,7 @@ public class BlockRegistry { public static BlockRegistryWrapper ENCHANTING_APP_BLOCK = registerBlockAndItem(LibBlockNames.ENCHANTING_APPARATUS, EnchantingApparatusBlock::new, (reg) -> new RendererBlockItem(reg.get(), defaultItemProperties()) { @Override public Supplier getRenderer() { - return GenericRenderer.getISTER("enchanting_apparatus"); + return GenericTileRenderer.getISTER("enchanting_apparatus"); } }); @@ -83,7 +83,7 @@ public Supplier getRenderer() { public static BlockRegistryWrapper RELAY = registerBlockAndItem(LibBlockNames.RELAY, Relay::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { - return GenericRenderer.getISTER("source_relay"); + return GenericTileRenderer.getISTER("source_relay"); } }); public static BlockEntityTypeRegistryWrapper ARCANE_RELAY_TILE = registerTile(LibBlockNames.RELAY, RelayTile::new, RELAY); @@ -109,14 +109,14 @@ public Supplier getRenderer() { public static BlockRegistryWrapper IMBUEMENT_BLOCK = registerBlockAndItem(LibBlockNames.IMBUEMENT_CHAMBER, ImbuementBlock::new, (reg) -> new RendererBlockItem(BlockRegistry.IMBUEMENT_BLOCK, defaultItemProperties()) { @Override public Supplier getRenderer() { - return GenericRenderer.getISTER("imbuement_chamber"); + return GenericTileRenderer.getISTER("imbuement_chamber"); } }); public static BlockEntityTypeRegistryWrapper IMBUEMENT_TILE = registerTile(LibBlockNames.IMBUEMENT_CHAMBER, ImbuementTile::new, IMBUEMENT_BLOCK); public static BlockRegistryWrapper RELAY_SPLITTER = registerBlockAndItem(LibBlockNames.RELAY_SPLITTER, RelaySplitter::new, (reg) -> new RendererBlockItem(BlockRegistry.RELAY_SPLITTER, defaultItemProperties()) { @Override public Supplier getRenderer() { - return GenericRenderer.getISTER("source_splitter"); + return GenericTileRenderer.getISTER("source_splitter"); } }); public static BlockEntityTypeRegistryWrapper RELAY_SPLITTER_TILE = registerTile(LibBlockNames.RELAY_SPLITTER, RelaySplitterTile::new, RELAY_SPLITTER); @@ -210,14 +210,14 @@ public Supplier getRenderer() { public static BlockRegistryWrapper RELAY_DEPOSIT = registerBlockAndItem(LibBlockNames.RELAY_DEPOSIT, RelayDepositBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { - return GenericRenderer.getISTER("source_deposit"); + return GenericTileRenderer.getISTER("source_deposit"); } }); public static BlockEntityTypeRegistryWrapper RELAY_DEPOSIT_TILE = registerTile(LibBlockNames.RELAY_DEPOSIT, RelayDepositTile::new, RELAY_DEPOSIT); public static BlockRegistryWrapper RELAY_WARP = registerBlockAndItem(LibBlockNames.RELAY_WARP, RelayWarpBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { - return GenericRenderer.getISTER("source_warp"); + return GenericTileRenderer.getISTER("source_warp"); } }); public static BlockEntityTypeRegistryWrapper RELAY_WARP_TILE = registerTile(LibBlockNames.RELAY_WARP, RelayWarpTile::new, RELAY_WARP); @@ -250,7 +250,7 @@ public Supplier getRenderer() { public static BlockRegistryWrapper RELAY_COLLECTOR = registerBlockAndItem(LibBlockNames.RELAY_COLLECTOR, RelayCollectorBlock::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override public Supplier getRenderer() { - return GenericRenderer.getISTER("source_collector"); + return GenericTileRenderer.getISTER("source_collector"); } }); public static BlockEntityTypeRegistryWrapper RELAY_COLLECTOR_TILE = registerTile(LibBlockNames.RELAY_COLLECTOR, RelayCollectorTile::new, RELAY_COLLECTOR); From 7a59405691712c46cd8f1affab866325477213fd Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 29 Sep 2024 15:56:43 -0500 Subject: [PATCH 194/363] Fix summons losing name and color, cache texture locations --- .../common/entity/AmethystGolem.java | 12 ++++- .../common/entity/EntityBookwyrm.java | 42 ++++++++-------- .../common/entity/EntityDrygmy.java | 30 ++++++------ .../arsnouveau/common/entity/EntityWixie.java | 28 +++++++---- .../arsnouveau/common/entity/Starbuncle.java | 49 +++++++++++-------- .../arsnouveau/common/entity/Whirlisprig.java | 31 +++++++----- .../common/items/data/ICharmSerializable.java | 26 ++++++++++ .../summon_charms/AmethystGolemCharm.java | 3 ++ .../items/summon_charms/BookwyrmCharm.java | 2 +- .../items/summon_charms/DrygmyCharm.java | 3 ++ .../items/summon_charms/WhirlisprigCharm.java | 3 ++ .../items/summon_charms/WixieCharm.java | 3 ++ 12 files changed, 151 insertions(+), 81 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/data/ICharmSerializable.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java index 2ff8992b69..4b9a00844f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/AmethystGolem.java @@ -16,7 +16,10 @@ import com.hollingsworth.arsnouveau.common.entity.goal.amethyst_golem.*; import com.hollingsworth.arsnouveau.common.entity.pathfinding.MinecoloniesAdvancedPathNavigate; import com.hollingsworth.arsnouveau.common.entity.pathfinding.PathingStuckHandler; +import com.hollingsworth.arsnouveau.common.items.data.ICharmSerializable; +import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -58,7 +61,7 @@ import static com.hollingsworth.arsnouveau.common.datagen.BlockTagProvider.BUDDING_BLOCKS; -public class AmethystGolem extends PathfinderMob implements GeoEntity, IDispellable, ITooltipProvider, IWandable { +public class AmethystGolem extends PathfinderMob implements GeoEntity, IDispellable, ITooltipProvider, IWandable, ICharmSerializable { public static final EntityDataAccessor> HOME = SynchedEntityData.defineId(AmethystGolem.class, EntityDataSerializers.OPTIONAL_BLOCK_POS); public static final EntityDataAccessor IMBUEING = SynchedEntityData.defineId(AmethystGolem.class, EntityDataSerializers.BOOLEAN); public static final EntityDataAccessor STOMPING = SynchedEntityData.defineId(AmethystGolem.class, EntityDataSerializers.BOOLEAN); @@ -76,6 +79,11 @@ public class AmethystGolem extends PathfinderMob implements GeoEntity, IDispella public PathNavigation minecraftPathNav; public AmethystGolemGoalState goalState; + @Override + public void fromCharmData(PersistentFamiliarData data) { + this.setCustomName(data.name()); + } + public enum AmethystGolemGoalState { NONE, CONVERT, @@ -224,6 +232,7 @@ public void getTooltip(List tooltip) { public void die(DamageSource source) { if (!level.isClientSide) { ItemStack stack = new ItemStack(ItemsRegistry.AMETHYST_GOLEM_CHARM.get()); + stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, createCharmData()); level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); if (this.getMainHandItem() != null) level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), this.getMainHandItem())); @@ -243,6 +252,7 @@ public boolean onDispel(@Nullable LivingEntity caster) { if (!level.isClientSide) { ItemStack stack = new ItemStack(ItemsRegistry.AMETHYST_GOLEM_CHARM.get()); + stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, createCharmData()); level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack.copy())); stack = getMainHandItem(); level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java index 4a8bb6e036..0a422d67bc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityBookwyrm.java @@ -12,6 +12,7 @@ import com.hollingsworth.arsnouveau.common.entity.goal.bookwyrm.RandomStorageVisitGoal; import com.hollingsworth.arsnouveau.common.entity.goal.bookwyrm.TransferGoal; import com.hollingsworth.arsnouveau.common.entity.goal.bookwyrm.TransferTask; +import com.hollingsworth.arsnouveau.common.items.data.ICharmSerializable; import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; @@ -54,11 +55,9 @@ import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; -public class EntityBookwyrm extends FlyingMob implements IDispellable, ITooltipProvider, IWandable, GeoEntity { +public class EntityBookwyrm extends FlyingMob implements IDispellable, ITooltipProvider, IWandable, GeoEntity, ICharmSerializable { public static final EntityDataAccessor HELD_ITEM = SynchedEntityData.defineId(EntityBookwyrm.class, EntityDataSerializers.ITEM_STACK); public static final EntityDataAccessor COLOR = SynchedEntityData.defineId(EntityBookwyrm.class, EntityDataSerializers.STRING); @@ -196,7 +195,9 @@ public boolean onDispel(@Nullable LivingEntity caster) { return false; if (!level.isClientSide) { - level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), toCharm())); + ItemStack stack = new ItemStack(ItemsRegistry.BOOKWYRM_CHARM.get()); + stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, createCharmData()); + level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); ParticleUtil.spawnPoof((ServerLevel) level, blockPosition()); this.remove(RemovalReason.DISCARDED); } @@ -217,21 +218,6 @@ public EntityType getType() { return ModEntities.ENTITY_BOOKWYRM_TYPE.get(); } - public ItemStack toCharm(){ - ItemStack stack = new ItemStack(ItemsRegistry.BOOKWYRM_CHARM.get()); - PersistentFamiliarData data = new PersistentFamiliarData(getCustomName(), getColor(), getHeldStack()); - stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, data); - return stack; - } - - public void readCharm(ItemStack stack){ - PersistentFamiliarData data = stack.get(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA); - if(data == null) - return; - setColor(data.color()); - setCustomName(data.name()); - } - @Override public void addAdditionalSaveData(CompoundTag tag) { super.addAdditionalSaveData(tag); @@ -302,7 +288,9 @@ public void setHeldStack(ItemStack stack) { @Override public void die(DamageSource source) { if (!level.isClientSide) { - level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), toCharm())); + ItemStack stack = new ItemStack(ItemsRegistry.BOOKWYRM_CHARM.get()); + stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, createCharmData()); + level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); } super.die(source); @@ -323,13 +311,23 @@ protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { public static String[] COLORS = {"purple", "green", "blue", "black", "red", "white"}; + public static final Map TEXTURES = new HashMap<>(); + public ResourceLocation getTexture() { String color = getColor().toLowerCase(); if (color.isEmpty()) color = "blue"; - return ArsNouveau.prefix( "textures/entity/book_wyrm_" + color + ".png"); + String finalColor = color; + return TEXTURES.computeIfAbsent(color, (key) -> ArsNouveau.prefix( "textures/entity/book_wyrm_" + finalColor + ".png")); } + @Override + public void fromCharmData(PersistentFamiliarData data) { + setColor(data.color()); + setCustomName(data.name()); + } + + @Override public String getColor() { return getEntityData().get(EntityBookwyrm.COLOR); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java index 4560bbbf4b..4919b19588 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java @@ -17,6 +17,7 @@ import com.hollingsworth.arsnouveau.common.entity.goal.drygmy.CollectEssenceGoal; import com.hollingsworth.arsnouveau.common.entity.goal.whirlisprig.FollowMobGoalBackoff; import com.hollingsworth.arsnouveau.common.entity.goal.whirlisprig.FollowPlayerGoal; +import com.hollingsworth.arsnouveau.common.items.data.ICharmSerializable; import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketANEffect; @@ -57,12 +58,9 @@ import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedHashSet; -import java.util.List; +import java.util.*; -public class EntityDrygmy extends PathfinderMob implements GeoEntity, ITooltipProvider, IDispellable { +public class EntityDrygmy extends PathfinderMob implements GeoEntity, ITooltipProvider, IDispellable, ICharmSerializable { public static final EntityDataAccessor CHANNELING = SynchedEntityData.defineId(EntityDrygmy.class, EntityDataSerializers.BOOLEAN); public static final EntityDataAccessor TAMED = SynchedEntityData.defineId(EntityDrygmy.class, EntityDataSerializers.BOOLEAN); @@ -108,8 +106,7 @@ public boolean hurt(DamageSource pSource, float pAmount) { public void die(DamageSource source) { if (!level.isClientSide && isTamed()) { ItemStack stack = new ItemStack(ItemsRegistry.DRYGMY_CHARM); - PersistentFamiliarData familiarData = new PersistentFamiliarData().setName(this.getCustomName()).setColor(getColor()); - stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, familiarData); + stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, createCharmData()); level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); } super.die(source); @@ -217,10 +214,6 @@ protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { pBuilder.define(COLOR, "brown"); } - public boolean holdingEssence() { - return this.entityData.get(HOLDING_ESSENCE); - } - public void setHoldingEssence(boolean holdingEssence) { this.entityData.set(HOLDING_ESSENCE, holdingEssence); } @@ -300,6 +293,7 @@ public boolean onDispel(@Nullable LivingEntity caster) { if (!level.isClientSide && isTamed()) { ItemStack stack = new ItemStack(ItemsRegistry.DRYGMY_CHARM); + stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, createCharmData()); level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); ParticleUtil.spawnPoof((ServerLevel) level, blockPosition()); this.remove(RemovalReason.DISCARDED); @@ -352,19 +346,23 @@ public void tryResetGoals() { this.addGoalsAfterConstructor(); } + public static Map TEXTURES = new HashMap<>(); public ResourceLocation getTexture() { String color = getColor().toLowerCase(); if (color.isEmpty()) color = "brown"; - return ArsNouveau.prefix( "textures/entity/drygmy_" + color + ".png"); + return TEXTURES.computeIfAbsent(color, c -> ArsNouveau.prefix("textures/entity/drygmy_" + c + ".png")); } - public String getColor() { - return getEntityData().get(COLOR); + @Override + public void fromCharmData(PersistentFamiliarData data) { + getEntityData().set(COLOR, data.color()); + this.setCustomName(data.name()); } - public void setColor(String color) { - getEntityData().set(COLOR, color); + @Override + public String getColor() { + return getEntityData().get(COLOR); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java index 2ebc283654..94e203c5f5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java @@ -10,6 +10,9 @@ import com.hollingsworth.arsnouveau.common.entity.goal.wixie.CompleteCraftingGoal; import com.hollingsworth.arsnouveau.common.entity.goal.wixie.FindNextItemGoal; import com.hollingsworth.arsnouveau.common.entity.goal.wixie.FindPotionGoal; +import com.hollingsworth.arsnouveau.common.items.data.ICharmSerializable; +import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.core.BlockPos; @@ -45,8 +48,10 @@ import javax.annotation.Nullable; import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; -public class EntityWixie extends AbstractFlyingCreature implements GeoEntity, IAnimationListener, IDispellable { +public class EntityWixie extends AbstractFlyingCreature implements GeoEntity, IAnimationListener, IDispellable, ICharmSerializable { AnimatableInstanceCache manager = GeckoLibUtil.createInstanceCache(this); public static final EntityDataAccessor COLOR = SynchedEntityData.defineId(EntityWixie.class, EntityDataSerializers.STRING); @@ -206,8 +211,8 @@ public void startAnimation(int arg) { public void die(DamageSource source) { if (!level.isClientSide) { ItemStack stack = new ItemStack(ItemsRegistry.WIXIE_CHARM); + stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, createCharmData()); level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); - } super.die(source); } @@ -219,6 +224,7 @@ public boolean onDispel(@Nullable LivingEntity caster) { if (!level.isClientSide) { ItemStack stack = new ItemStack(ItemsRegistry.WIXIE_CHARM); + stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, this.createCharmData()); level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack.copy())); ParticleUtil.spawnPoof((ServerLevel) level, blockPosition()); this.remove(RemovalReason.DISCARDED); @@ -226,23 +232,27 @@ public boolean onDispel(@Nullable LivingEntity caster) { return true; } + public static Map TEXTURES = new HashMap<>(); + public ResourceLocation getTexture() { String color = getColor().toLowerCase(); if (color.isEmpty()) color = "blue"; - return ArsNouveau.prefix( "textures/entity/wixie_" + color + ".png"); + String finalColor = color; + return TEXTURES.computeIfAbsent(color, (k) -> ArsNouveau.prefix( "textures/entity/wixie_" + finalColor + ".png")); } - public String getColor() { - return this.getEntityData().get(COLOR); + @Override + public void fromCharmData(PersistentFamiliarData data) { + this.entityData.set(COLOR, data.color()); + setCustomName(data.name()); } - - public void setColor(String color) { - this.getEntityData().set(COLOR, color); + @Override + public String getColor() { + return this.getEntityData().get(COLOR); } - public enum Animations { CAST, SUMMON_ITEM diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 0b84b541c0..13b72a5358 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -681,34 +681,41 @@ public String getColor() { return this.entityData.get(COLOR); } - public ResourceLocation getTexture(Starbuncle entity) { - if (entity.getName().getString().equals("Gootastic")) { - return ArsNouveau.prefix("textures/entity/starbuncle_goo.png"); + public static Map TEXTURES = new HashMap<>(){ + { + put("Gootastic", ArsNouveau.prefix("textures/entity/starbuncle_goo.png")); + put("Sir Squirrely", ArsNouveau.prefix("textures/entity/sir_squirrely.png")); + put("Zieg", ArsNouveau.prefix("textures/entity/zieg.png")); + put("Xacris", ArsNouveau.prefix("textures/entity/xacris.png")); + for(DyeColor color : DyeColor.values()) { + put(color.getName(), ArsNouveau.prefix("textures/entity/starbuncle_" + color.getName().toLowerCase() + ".png")); + } } - var customTexture = getCustomBuncle(); - if(customTexture != null){ - return ArsNouveau.prefix("textures/entity/" + customTexture + ".png"); + }; + + public static Map MODELS = new HashMap<>(){ + { + put("Gootastic", ArsNouveau.prefix("geo/goobuncle.geo.json")); + put("Sir Squirrely", ArsNouveau.prefix("geo/sir_squirrely.geo.json")); + put("Zieg", ArsNouveau.prefix("geo/zieg.geo.json")); + put("Xacris", ArsNouveau.prefix("geo/xacris.geo.json")); + put("starbuncle", ArsNouveau.prefix("geo/starbuncle.geo.json")); + } + }; + + public ResourceLocation getTexture(Starbuncle entity) { + var nameTexture = TEXTURES.get(entity.getName().getString()); + if(nameTexture != null){ + return nameTexture; } String color = getColor(); if (color.isEmpty()) color = DyeColor.ORANGE.getName(); - - return ArsNouveau.prefix("textures/entity/starbuncle_" + color.toLowerCase() + ".png"); + return TEXTURES.get(color); } public ResourceLocation getModel(){ - var modelName = getCustomBuncle(); - return ArsNouveau.prefix( "geo/" + (modelName == null ? "starbuncle" : modelName) + ".geo.json"); - } - - public @Nullable String getCustomBuncle(){ - var nameString = getName().getString(); - return switch (nameString) { - case "Gootastic" -> "goobuncle"; - case "Sir Squirrely" -> "sir_squirrely"; - case "Zieg" -> "zieg"; - case "Xacris" -> "xacris"; - default -> null; - }; + String key = getName().getString(); + return MODELS.getOrDefault(key, MODELS.get("starbuncle")); } @SuppressWarnings("all") diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java index 9fbd991d2a..8fbb697277 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java @@ -14,6 +14,7 @@ import com.hollingsworth.arsnouveau.common.entity.goal.whirlisprig.FollowMobGoalBackoff; import com.hollingsworth.arsnouveau.common.entity.goal.whirlisprig.FollowPlayerGoal; import com.hollingsworth.arsnouveau.common.entity.goal.whirlisprig.InspectPlantGoal; +import com.hollingsworth.arsnouveau.common.items.data.ICharmSerializable; import com.hollingsworth.arsnouveau.common.items.data.ItemScrollData; import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; import com.hollingsworth.arsnouveau.common.network.Networking; @@ -63,11 +64,9 @@ import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; +import java.util.*; -public class Whirlisprig extends AbstractFlyingCreature implements GeoEntity, ITooltipProvider, IDispellable { +public class Whirlisprig extends AbstractFlyingCreature implements GeoEntity, ITooltipProvider, IDispellable, ICharmSerializable { AnimatableInstanceCache manager = GeckoLibUtil.createInstanceCache(this); public static LevelEntityMap WHIRLI_MAP = new LevelEntityMap(); @@ -121,12 +120,15 @@ protected InteractionResult mobInteract(Player player, InteractionHand hand) { return super.mobInteract(player, hand); } - public String getColor() { - return this.entityData.get(COLOR); + @Override + public void fromCharmData(PersistentFamiliarData data) { + this.setCustomName(data.name()); + this.entityData.set(COLOR, data.color()); } - public void setColor(String color) { - this.entityData.set(COLOR, color); + @Override + public String getColor() { + return this.entityData.get(COLOR); } public static String getColorFromStack(ItemStack stack) { @@ -308,8 +310,7 @@ public boolean hurt(DamageSource pSource, float pAmount) { public void die(DamageSource source) { if (!level.isClientSide && isTamed()) { ItemStack stack = new ItemStack(ItemsRegistry.WHIRLISPRIG_CHARM); - PersistentFamiliarData familiarData = new PersistentFamiliarData().setName(this.getCustomName()).setColor(getColor()); - stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, familiarData); + stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, this.createCharmData()); level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); } super.die(source); @@ -438,6 +439,7 @@ public boolean onDispel(@Nullable LivingEntity caster) { if (!level.isClientSide && isTamed()) { ItemStack stack = new ItemStack(ItemsRegistry.WHIRLISPRIG_CHARM); + stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, this.createCharmData()); level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); ParticleUtil.spawnPoof((ServerLevel) level, blockPosition()); this.remove(RemovalReason.DISCARDED); @@ -445,7 +447,14 @@ public boolean onDispel(@Nullable LivingEntity caster) { return this.isTamed(); } + public static Map TEXTURES = new HashMap<>(); + public ResourceLocation getTexture() { - return ArsNouveau.prefix( "textures/entity/whirlisprig_" + (getColor().isEmpty() ? "summer" : getColor()) + ".png"); + var color = getColor(); + if(color.isEmpty()){ + color = "summer"; + } + String finalColor = color; + return TEXTURES.computeIfAbsent(color, (key) -> ArsNouveau.prefix( "textures/entity/whirlisprig_" + finalColor + ".png")); } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ICharmSerializable.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ICharmSerializable.java new file mode 100644 index 0000000000..ca94ee82ba --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ICharmSerializable.java @@ -0,0 +1,26 @@ +package com.hollingsworth.arsnouveau.common.items.data; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; + +public interface ICharmSerializable { + + private LivingEntity asEntity(){ + return (LivingEntity) this; + } + + default PersistentFamiliarData createCharmData(){ + LivingEntity entity = asEntity(); + return new PersistentFamiliarData(entity.getCustomName(), getColor(), getCosmetic()); + } + + void fromCharmData(PersistentFamiliarData data); + + default String getColor(){ + return ""; + } + + default ItemStack getCosmetic(){ + return ItemStack.EMPTY; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/AmethystGolemCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/AmethystGolemCharm.java index f833e74d25..50ddd62caf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/AmethystGolemCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/AmethystGolemCharm.java @@ -3,6 +3,8 @@ import com.hollingsworth.arsnouveau.api.item.AbstractSummonCharm; import com.hollingsworth.arsnouveau.common.block.tile.SummoningTile; import com.hollingsworth.arsnouveau.common.entity.AmethystGolem; +import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; @@ -20,6 +22,7 @@ public AmethystGolemCharm() { @Override public InteractionResult useOnBlock(UseOnContext context, Level world, BlockPos pos) { AmethystGolem amy = new AmethystGolem(ModEntities.AMETHYST_GOLEM.get(), world); + amy.fromCharmData(context.getItemInHand().getOrDefault(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, new PersistentFamiliarData())); amy.setPos(pos.getX(), pos.above().getY(), pos.getZ()); world.addFreshEntity(amy); return InteractionResult.SUCCESS; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/BookwyrmCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/BookwyrmCharm.java index 0488685455..24c3a404c7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/BookwyrmCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/BookwyrmCharm.java @@ -30,7 +30,7 @@ public InteractionResult useOn(UseOnContext pContext) { if (world.getBlockEntity(pos) instanceof StorageLecternTile tile) { EntityBookwyrm bookwyrm = tile.addBookwyrm(); if(bookwyrm != null){ - bookwyrm.readCharm(pContext.getItemInHand()); + bookwyrm.fromCharmData(pContext.getItemInHand().getOrDefault(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, new PersistentFamiliarData())); pContext.getItemInHand().shrink(1); return InteractionResult.SUCCESS; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/DrygmyCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/DrygmyCharm.java index 1e9111c8e8..9e5a01c606 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/DrygmyCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/DrygmyCharm.java @@ -4,7 +4,9 @@ import com.hollingsworth.arsnouveau.common.block.tile.DrygmyTile; import com.hollingsworth.arsnouveau.common.block.tile.SummoningTile; import com.hollingsworth.arsnouveau.common.entity.EntityDrygmy; +import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.context.UseOnContext; @@ -31,6 +33,7 @@ public InteractionResult useOnSummonTile(UseOnContext context, Level world, Summ if (tile instanceof DrygmyTile) { EntityDrygmy drygmy = new EntityDrygmy(world, true); drygmy.setPos(pos.getX() + 0.5, pos.getY() + 1.0, pos.getZ() + 0.5); + drygmy.fromCharmData(context.getItemInHand().getOrDefault(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, new PersistentFamiliarData())); world.addFreshEntity(drygmy); drygmy.homePos = new BlockPos(pos); return InteractionResult.SUCCESS; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WhirlisprigCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WhirlisprigCharm.java index 81c31561a6..3d3bb23b2e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WhirlisprigCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WhirlisprigCharm.java @@ -5,7 +5,9 @@ import com.hollingsworth.arsnouveau.common.block.tile.SummoningTile; import com.hollingsworth.arsnouveau.common.block.tile.WhirlisprigTile; import com.hollingsworth.arsnouveau.common.entity.Whirlisprig; +import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.core.BlockPos; import net.minecraft.tags.BlockTags; import net.minecraft.world.InteractionResult; @@ -32,6 +34,7 @@ public InteractionResult useOnSummonTile(UseOnContext context, Level world, Summ if (tile instanceof WhirlisprigTile) { Whirlisprig whirlisprig = new Whirlisprig(world, true, pos); whirlisprig.setPos(pos.getX() + 0.5, pos.getY() + 1.0, pos.getZ() + 0.5); + whirlisprig.fromCharmData(context.getItemInHand().getOrDefault(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, new PersistentFamiliarData())); world.addFreshEntity(whirlisprig); whirlisprig.flowerPos = new BlockPos(pos); return InteractionResult.SUCCESS; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WixieCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WixieCharm.java index 799a0f5c07..909abd08d1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WixieCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WixieCharm.java @@ -4,8 +4,10 @@ import com.hollingsworth.arsnouveau.common.block.tile.SummoningTile; import com.hollingsworth.arsnouveau.common.block.tile.WixieCauldronTile; import com.hollingsworth.arsnouveau.common.entity.EntityWixie; +import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; @@ -42,6 +44,7 @@ public InteractionResult useOnSummonTile(UseOnContext context, Level world, Summ } else { EntityWixie wixie = new EntityWixie(world, pos); wixie.setPos(pos.getX() + 0.5, pos.getY() + 1.0, pos.getZ() + 0.5); + wixie.fromCharmData(context.getItemInHand().getOrDefault(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, new PersistentFamiliarData())); world.addFreshEntity(wixie); cauldronTile.entityID = wixie.getId(); return InteractionResult.SUCCESS; From fa9dcc6598ee547691120fbeabed493d8f7aa04c Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 29 Sep 2024 17:23:42 -0500 Subject: [PATCH 195/363] Update supporters.json --- supporters.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/supporters.json b/supporters.json index 90508dd0ba..285ca2382e 100644 --- a/supporters.json +++ b/supporters.json @@ -28,7 +28,8 @@ "7dc1de80-c04c-4c0f-8f00-6326d770626b", "8bf034ac-313f-435a-bd2b-200a7857021b", "1dafa767-ce2f-47c4-8142-67b0b4854586", "9eff9013-f8a6-4a1a-9142-32d94d60d8c1", "671ffc64-8b5b-4ac2-87b1-138951be701e","aac7171c-9bac-42a8-b094-2363599dae59", "47f9c9d2-89b2-4987-af6b-31e7b1f74da2", "ec77d204-6e8b-4dac-8b66-71b2a03c5e65", "98e72ae4-10c9-4696-970b-804eb9b176ae", - "0421ad40-0881-47d4-b086-38c90c1ab62f", "a8875ecb-6e84-4c6d-ac68-3251b945d963", "cf1f7109-266d-4e5a-8a8a-d93684cf60b9" ], + "0421ad40-0881-47d4-b086-38c90c1ab62f", "a8875ecb-6e84-4c6d-ac68-3251b945d963", "cf1f7109-266d-4e5a-8a8a-d93684cf60b9", + "e7976ce2-3344-4499-8b15-91adddc5ed0f", "d29025d7-cf5d-4976-8a65-fc3bdcc991b5"], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -450,6 +451,11 @@ "color": "black", "adopter": "Hayesx369", "bio": "Introducing Fen, your adorable friend who thrives among berry bushes! With a warm personality, Fen is always eager to meet new friends, whether they are human or furry." + },{ + "name": "Cookie", + "adopter": "zeroregard", + "bio": "A timid yet playful starbuncle, soft as clouds to the touch, with a lingering, soothing fragrance of old books and vanilla. Though shy at first, its eyes eventually widen as it bursts to life in play, darting about with boundless energy and joy.", + "color": "yellow" } ] } From 8a449ec73d052643f4a7acc852d9f9c67e30b6b4 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 5 Oct 2024 16:35:27 -0500 Subject: [PATCH 196/363] Update supporters.json --- supporters.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/supporters.json b/supporters.json index 285ca2382e..4d523b57fd 100644 --- a/supporters.json +++ b/supporters.json @@ -29,7 +29,7 @@ "9eff9013-f8a6-4a1a-9142-32d94d60d8c1", "671ffc64-8b5b-4ac2-87b1-138951be701e","aac7171c-9bac-42a8-b094-2363599dae59", "47f9c9d2-89b2-4987-af6b-31e7b1f74da2", "ec77d204-6e8b-4dac-8b66-71b2a03c5e65", "98e72ae4-10c9-4696-970b-804eb9b176ae", "0421ad40-0881-47d4-b086-38c90c1ab62f", "a8875ecb-6e84-4c6d-ac68-3251b945d963", "cf1f7109-266d-4e5a-8a8a-d93684cf60b9", - "e7976ce2-3344-4499-8b15-91adddc5ed0f", "d29025d7-cf5d-4976-8a65-fc3bdcc991b5"], + "e7976ce2-3344-4499-8b15-91adddc5ed0f", "d29025d7-cf5d-4976-8a65-fc3bdcc991b5", "8ced638c-eac7-433e-b794-54c0f23807a4"], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -456,6 +456,11 @@ "adopter": "zeroregard", "bio": "A timid yet playful starbuncle, soft as clouds to the touch, with a lingering, soothing fragrance of old books and vanilla. Though shy at first, its eyes eventually widen as it bursts to life in play, darting about with boundless energy and joy.", "color": "yellow" + },{ + "name": "Brandy", + "adopter": "mluosed", + "color": "brown", + "bio": "This Starbuncle likes to walk in the cool forest in the fall,staying at home in the winter and watching others stew meat" } ] } From 16638b043affc5829a830d06b52ef7c2d83829b1 Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Sun, 6 Oct 2024 18:54:40 +0200 Subject: [PATCH 197/363] Hats Off! Cosmetic system for familiars restored and upgraded (#1432) * Restores GenericFamiliarRenderer for rendering Cosmetic Accessories on familiars. Make ICosmeticItem#getBone entity-sensitive to switch pivot based on entity for multiple support. Allow hiding wixie hat if the familiar has an hat cosmetic. Allow Starbuncle Shades on all familiars. * Bump Ars indev deps --- build.gradle | 10 ++-- gradle.properties | 21 ++++---- gradle/wrapper/gradle-wrapper.properties | 2 +- .../arsnouveau/api/item/ICosmeticItem.java | 22 +++++--- .../client/registry/ClientHandler.java | 51 +++++++------------ .../renderer/entity/StarbuncleModel.java | 9 ++-- .../renderer/entity/StarbuncleRenderer.java | 36 +++++++------ .../client/renderer/entity/WixieModel.java | 7 +++ .../familiar/FamiliarBookwyrmRenderer.java | 8 +-- .../entity/familiar/FamiliarStarbyModel.java | 6 +-- .../familiar/FamiliarWhirlisprigRenderer.java | 8 +-- .../familiar/GenericFamiliarRenderer.java | 40 +++++++++++++++ .../arsnouveau/common/entity/Starbuncle.java | 4 +- .../entity/familiar/FamiliarEntity.java | 10 +++- .../entity/familiar/FamiliarJabberwog.java | 13 +++-- .../entity/familiar/FamiliarStarbuncle.java | 16 ++++-- .../entity/familiar/FamiliarWhirlisprig.java | 10 ++-- .../entity/familiar/FlyingFamiliarEntity.java | 7 +-- .../common/items/StarbuncleShades.java | 27 +++++++--- 19 files changed, 193 insertions(+), 114 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/GenericFamiliarRenderer.java diff --git a/build.gradle b/build.gradle index 4b02f98b97..bc9171dcf2 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { id 'eclipse' id 'idea' id 'maven-publish' - id 'net.neoforged.gradle.userdev' version '7.0.145' + id 'net.neoforged.gradle.userdev' version '7.0.+' } version = mod_version @@ -24,7 +24,7 @@ java.withSourcesJar() subsystems { parchment { - minecraftVersion = "1.20.6" + minecraftVersion = "1.21" mappingsVersion = project.parchment_version } } @@ -43,7 +43,7 @@ runs { } data { - programArguments.addAll '--mod', mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() + getArguments().addAll '--mod', mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() } } @@ -104,7 +104,7 @@ dependencies { // jarJar(group: 'software.bernie.geckolib', name: "geckolib-neoforge-${minecraft_version}", version: "[4.5,)") { // jarJar.pin(it, "${geckolib_version}") // } - implementation "software.bernie.geckolib:geckolib-neoforge-1.21:${geckolib_version}" + implementation "software.bernie.geckolib:geckolib-neoforge-1.21.1:${geckolib_version}" // implementation(jarJar(group: 'vazkii.patchouli', name: 'Patchouli', version: '[1.21,)') { jarJar.pin(it, patchouli_version) @@ -117,7 +117,7 @@ dependencies { implementation "mezz.jei:jei-1.21-neoforge:${jei_version}" implementation 'com.github.glitchfiend:TerraBlender-neoforge:1.21-4.0.0.0' implementation "curse.maven:jade-324717:5444008" - implementation 'top.theillusivec4.curios:curios-neoforge:9.0.4+1.21' + implementation "top.theillusivec4.curios:curios-neoforge:${curios_version}+1.21" implementation "curse.maven:ars-additions-974408:5698511" } diff --git a/gradle.properties b/gradle.properties index 08278f33ec..2f59c14415 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,15 +3,16 @@ org.gradle.jvmargs=-Xmx4G org.gradle.daemon=false org.gradle.debug=false - -neogradle.subsystems.parchment.minecraftVersion=1.20.6 -neogradle.subsystems.parchment.mappingsVersion=2024.05.01 +neogradle.subsystems.decompiler.maxMemory=4G +neogradle.subsystems.recompiler.maxMemory=4G +neogradle.subsystems.parchment.minecraftVersion=1.21.0 +neogradle.subsystems.parchment.mappingsVersion=2024.07.28 minecraft_version=1.21.0 -parchment_version=2024.05.01 -minecraft_version_range=[1.20.6,1.21) -neo_version=21.1.13 -neo_version_range=[20.6,) +parchment_version=2024.07.28 +minecraft_version_range=[1.20.6,1.21.2) +neo_version=21.1.66 +neo_version_range=[21,) loader_version_range=[2,) mod_id=ars_nouveau @@ -23,7 +24,7 @@ mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! jei_version=19.5.0.44 -curios_version=8.0.0-beta -geckolib_version=4.5.7 -patchouli_version=87-NEOFORGE-SNAPSHOT +curios_version=9.0.12 +geckolib_version=4.6.6 +patchouli_version=88-NEOFORGE-SNAPSHOT caelus_version=7.0.0+1.21 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b82aa23a4f..a4413138c9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICosmeticItem.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICosmeticItem.java index 69e2747a2d..7e5d945ca2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/ICosmeticItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/ICosmeticItem.java @@ -8,18 +8,28 @@ public interface ICosmeticItem { + Vec3 defaultScaling = new Vec3(1.0, 1.0, 1.0); + //bone model where the item is renderer, all animations that include the bone will be synced with the item - default String getBone() { + default String getBone(LivingEntity entity) { return "head"; } - //translate relative to bone pivot - Vec3 getTranslations(); + /** + * translate relative to bone pivot specified by {@link ICosmeticItem#getBone} + */ + default Vec3 getTranslations() { + return Vec3.ZERO; + } - Vec3 getScaling(); + default Vec3 getScaling() { + return defaultScaling; + } - //Entity Sensitive - //translate relative to bone pivot + /** + * Entity Sensitive + * translate relative to bone pivot specified by {@link ICosmeticItem#getBone} + */ default Vec3 getTranslations(LivingEntity entity) { return getTranslations(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index f1c47f9f44..cfb300a522 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -11,10 +11,7 @@ import com.hollingsworth.arsnouveau.client.gui.GuiSpellHUD; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.renderer.entity.*; -import com.hollingsworth.arsnouveau.client.renderer.entity.familiar.AnimSkullRenderer; -import com.hollingsworth.arsnouveau.client.renderer.entity.familiar.FamiliarBookwyrmRenderer; -import com.hollingsworth.arsnouveau.client.renderer.entity.familiar.FamiliarStarbyModel; -import com.hollingsworth.arsnouveau.client.renderer.entity.familiar.FamiliarWhirlisprigRenderer; +import com.hollingsworth.arsnouveau.client.renderer.entity.familiar.*; import com.hollingsworth.arsnouveau.client.renderer.tile.*; import com.hollingsworth.arsnouveau.common.block.tile.MageBlockTile; import com.hollingsworth.arsnouveau.common.block.tile.PotionJarTile; @@ -22,9 +19,7 @@ import com.hollingsworth.arsnouveau.common.entity.EntityDrygmy; import com.hollingsworth.arsnouveau.common.entity.EntityWixie; import com.hollingsworth.arsnouveau.common.entity.Whirlisprig; -import com.hollingsworth.arsnouveau.common.entity.familiar.FamiliarDrygmy; import com.hollingsworth.arsnouveau.common.entity.familiar.FamiliarStarbuncle; -import com.hollingsworth.arsnouveau.common.entity.familiar.FamiliarWixie; import com.hollingsworth.arsnouveau.common.items.data.ArmorPerkHolder; import com.hollingsworth.arsnouveau.common.items.data.BlockFillContents; import com.hollingsworth.arsnouveau.common.items.data.PotionJarData; @@ -37,6 +32,8 @@ import net.minecraft.client.gui.Font; import net.minecraft.client.gui.LayeredDraw; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.*; import net.minecraft.client.renderer.item.ClampedItemPropertyFunction; import net.minecraft.client.renderer.item.ItemProperties; @@ -122,13 +119,13 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerEntityRenderer(ModEntities.ALLY_VEX.get(), VexRenderer::new); event.registerEntityRenderer(ModEntities.STARBUNCLE_TYPE.get(), StarbuncleRenderer::new); - event.registerEntityRenderer(ModEntities.WHIRLISPRIG_TYPE.get(), (t) -> new GeoEntityRenderer<>(t, new WhirlisprigModel<>()){ + event.registerEntityRenderer(ModEntities.WHIRLISPRIG_TYPE.get(), (t) -> new GeoEntityRenderer<>(t, new WhirlisprigModel<>()) { @Override public @NotNull ResourceLocation getTextureLocation(@NotNull Whirlisprig animatable) { return animatable.getTexture(); } }); - event.registerEntityRenderer(ModEntities.ENTITY_WIXIE_TYPE.get(), (t) -> new GeoEntityRenderer<>(t, new WixieModel<>()){ + event.registerEntityRenderer(ModEntities.ENTITY_WIXIE_TYPE.get(), (t) -> new GeoEntityRenderer<>(t, new WixieModel<>()) { @Override public @NotNull ResourceLocation getTextureLocation(@NotNull EntityWixie animatable) { return animatable.getTexture(); @@ -146,14 +143,14 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerEntityRenderer(ModEntities.ENTITY_RITUAL.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.ENTITY_SPELL_ARROW.get(), TippableArrowRenderer::new); - event.registerEntityRenderer(ModEntities.ENTITY_WIXIE_TYPE.get(), (t) -> new GeoEntityRenderer<>(t, new WixieModel<>()){ + event.registerEntityRenderer(ModEntities.ENTITY_WIXIE_TYPE.get(), (t) -> new GeoEntityRenderer<>(t, new WixieModel<>()) { @Override public @NotNull ResourceLocation getTextureLocation(@NotNull EntityWixie animatable) { return animatable.getTexture(); } }); event.registerEntityRenderer(ModEntities.ENTITY_DUMMY.get(), DummyRenderer::new); - event.registerEntityRenderer(ModEntities.ENTITY_DRYGMY.get(), (t) -> new GeoEntityRenderer<>(t, new DrygmyModel<>()){ + event.registerEntityRenderer(ModEntities.ENTITY_DRYGMY.get(), (t) -> new GeoEntityRenderer<>(t, new DrygmyModel<>()) { @Override public @NotNull ResourceLocation getTextureLocation(@NotNull EntityDrygmy animatable) { return animatable.getTexture(); @@ -162,34 +159,24 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerEntityRenderer(ModEntities.ORBIT_SPELL.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.WILDEN_BOSS.get(), rendermanager -> new GeoEntityRenderer<>(rendermanager, new WildenChimeraModel())); event.registerEntityRenderer(ModEntities.ENTITY_CHIMERA_SPIKE.get(), ChimeraProjectileRenderer::new); - event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_STARBUNCLE.get(), (t) -> new GeoEntityRenderer<>(t, new FamiliarStarbyModel<>()){ + event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_STARBUNCLE.get(), (t) -> new GenericFamiliarRenderer<>(t, new FamiliarStarbyModel<>()) { @Override - public @NotNull ResourceLocation getTextureLocation(@NotNull FamiliarStarbuncle animatable) { - return animatable.getTexture(); - } - }); - event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_DRYGMY.get(), (t) -> new GeoEntityRenderer<>(t, new DrygmyModel<>()){ - @Override - public @NotNull ResourceLocation getTextureLocation(@NotNull FamiliarDrygmy animatable) { - return animatable.getTexture(); + public @Nullable RenderType getRenderType(FamiliarStarbuncle animatable, ResourceLocation texture, @Nullable MultiBufferSource bufferSource, float partialTick) { + return StarbuncleRenderer.specialShaders.getOrDefault(animatable.getName().getString(), RenderType::entityCutoutNoCull).apply(texture); } }); + event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_DRYGMY.get(), (t) -> new GenericFamiliarRenderer<>(t, new DrygmyModel<>())); event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_SYLPH.get(), FamiliarWhirlisprigRenderer::new); - event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_WIXIE.get(), (t) -> new GeoEntityRenderer<>(t, new WixieModel<>()){ - @Override - public ResourceLocation getTextureLocation(FamiliarWixie animatable) { - return animatable.getTexture(); - } - }); + event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_WIXIE.get(), (t) -> new GenericFamiliarRenderer<>(t, new WixieModel<>())); event.registerEntityRenderer(ModEntities.ENTITY_BOOKWYRM_TYPE.get(), BookwyrmRenderer::new); event.registerEntityRenderer(ModEntities.FAMILIAR_AMETHYST_GOLEM.get(), AmethystGolemRenderer::new); event.registerEntityRenderer(ModEntities.ENTITY_FAMILIAR_BOOKWYRM.get(), FamiliarBookwyrmRenderer::new); event.registerEntityRenderer(ModEntities.LINGER_SPELL.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.ENTITY_CASCADING_WEALD.get(), (v) -> new GeoEntityRenderer<>(v, new WealdWalkerModel<>("cascading_weald"))); - event.registerEntityRenderer(ModEntities.ENTITY_BLAZING_WEALD.get(), (v) -> new GeoEntityRenderer<>(v, new WealdWalkerModel<>("blazing_weald"))); - event.registerEntityRenderer(ModEntities.ENTITY_FLOURISHING_WEALD.get(), (v) -> new GeoEntityRenderer<>(v, new WealdWalkerModel<>("flourishing_weald"))); - event.registerEntityRenderer(ModEntities.ENTITY_VEXING_WEALD.get(), (v) -> new GeoEntityRenderer<>(v, new WealdWalkerModel<>("vexing_weald"))); + event.registerEntityRenderer(ModEntities.ENTITY_BLAZING_WEALD.get(), (v) -> new GeoEntityRenderer<>(v, new WealdWalkerModel<>("blazing_weald"))); + event.registerEntityRenderer(ModEntities.ENTITY_FLOURISHING_WEALD.get(), (v) -> new GeoEntityRenderer<>(v, new WealdWalkerModel<>("flourishing_weald"))); + event.registerEntityRenderer(ModEntities.ENTITY_VEXING_WEALD.get(), (v) -> new GeoEntityRenderer<>(v, new WealdWalkerModel<>("vexing_weald"))); event.registerEntityRenderer(ModEntities.AMETHYST_GOLEM.get(), AmethystGolemRenderer::new); event.registerEntityRenderer(ModEntities.SCRYER_CAMERA.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); @@ -197,13 +184,13 @@ public ResourceLocation getTextureLocation(FamiliarWixie animatable) { event.registerEntityRenderer(ModEntities.ICE_SHARD.get(), EnchantedFallingBlockRenderer::new); event.registerEntityRenderer(ModEntities.ENCHANTED_MAGE_BLOCK.get(), MageBlockRenderer::new); event.registerEntityRenderer(ModEntities.ENCHANTED_HEAD_BLOCK.get(), EnchantedSkullRenderer::new); - event.registerEntityRenderer(ModEntities.GIFT_STARBY.get(),(renderer) -> new GeoEntityRenderer<>(renderer, new GiftStarbyModel())); + event.registerEntityRenderer(ModEntities.GIFT_STARBY.get(), (renderer) -> new GeoEntityRenderer<>(renderer, new GiftStarbyModel())); event.registerEntityRenderer(ModEntities.ANIMATED_BLOCK.get(), AnimBlockRenderer::new); event.registerEntityRenderer(ModEntities.ANIMATED_HEAD.get(), AnimSkullRenderer::new); event.registerEntityRenderer(ModEntities.CINDER.get(), CinderRenderer::new); event.registerEntityRenderer(ModEntities.WALL_SPELL.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); - event.registerEntityRenderer(ModEntities.LILY.get(), (v) -> new GeoEntityRenderer<>(v, new LilyModel())); + event.registerEntityRenderer(ModEntities.LILY.get(), (v) -> new GeoEntityRenderer<>(v, new LilyModel())); } public static LayeredDraw.Layer cameraOverlay = (gui, tracker) -> { @@ -249,7 +236,7 @@ public static void init(final FMLClientSetupEvent evt) { }); ItemProperties.register(ItemsRegistry.DOWSING_ROD.get(), ArsNouveau.prefix("uses"), new ClampedItemPropertyFunction() { @Override - public float unclampedCall(ItemStack pStack, @Nullable ClientLevel pLevel, @Nullable LivingEntity pEntity, int pSeed) { + public float unclampedCall(@NotNull ItemStack pStack, @Nullable ClientLevel pLevel, @Nullable LivingEntity pEntity, int pSeed) { return switch (pStack.getDamageValue()) { case 1 -> 0.75f; case 2 -> 0.50f; @@ -379,7 +366,7 @@ public static int colorFromArmor(ItemStack stack) { public static int colorFromFlask(ItemStack stack) { PotionContents contents = PotionUtil.getContents(stack); var provider = PotionProviderRegistry.from(stack); - if(provider != null){ + if (provider != null) { return provider.usesRemaining(stack) <= 0 ? 0 : provider.getPotionData(stack).getColor(); } return contents == PotionContents.EMPTY ? -1 : contents.getColor(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java index 837b8b7ee3..0dc21edf82 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java @@ -14,13 +14,14 @@ public class StarbuncleModel extends GeoModel { @Override - public void setCustomAnimations(Starbuncle entity, long uniqueID, @Nullable AnimationState customPredicate) { + public void setCustomAnimations(Starbuncle entity, long uniqueID, @Nullable AnimationState customPredicate) { super.setCustomAnimations(entity, uniqueID, customPredicate); if (entity.partyCarby) return; if (customPredicate == null) return; - this.getBone("basket").get().setHidden(!entity.isTamed()); + if (this.getBone("basket").isPresent()) + this.getBone("basket").get().setHidden(!entity.isTamed()); GeoBone head = this.getAnimationProcessor().getBone("head"); EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); @@ -35,11 +36,11 @@ public ResourceLocation getModelResource(Starbuncle carbuncle) { @Override public ResourceLocation getTextureResource(Starbuncle carbuncle) { - return carbuncle.getTexture(carbuncle); + return carbuncle.getTexture(); } @Override public ResourceLocation getAnimationResource(Starbuncle carbuncle) { - return ArsNouveau.prefix( "animations/starbuncle_animations.json"); + return ArsNouveau.prefix("animations/starbuncle_animations.json"); } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleRenderer.java index 25f605485e..e61a5a4055 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleRenderer.java @@ -16,12 +16,26 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.renderer.GeoEntityRenderer; import software.bernie.geckolib.util.RenderUtil; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + public class StarbuncleRenderer extends GeoEntityRenderer { public static MultiBufferSource.BufferSource cosmeticBuffer = MultiBufferSource.immediate(new ByteBufferBuilder(1536)); + public static Map> specialShaders = new HashMap<>(); + + static { + // Jared's special shader, because adopter details aren't synced. + specialShaders.put("Splonk", (texture) -> ShaderRegistry.blamed(texture, true)); + specialShaders.put("Bailey", (texture) -> ShaderRegistry.rainbowEntity(texture, ArsNouveau.prefix("textures/entity/starbuncle_mask.png"), true)); + specialShaders.put("Gootastic", RenderType::entityTranslucent); + } public StarbuncleRenderer(EntityRendererProvider.Context manager) { super(manager, new StarbuncleModel()); @@ -39,34 +53,24 @@ public void renderRecursively(PoseStack stack, Starbuncle animatable, GeoBone bo if (animatable.dynamicBehavior != null) { itemstack = animatable.dynamicBehavior.getStackForRender(); } - if(!itemstack.isEmpty()) { + if (!itemstack.isEmpty()) { Minecraft.getInstance().getItemRenderer().renderStatic(itemstack, ItemDisplayContext.GROUND, packedLight, OverlayTexture.NO_OVERLAY, stack, bufferSource, animatable.level, (int) animatable.getOnPos().asLong()); } stack.popPose(); } - if (animatable.getCosmeticItem().getItem() instanceof ICosmeticItem cosmetic && cosmetic.getBone().equals(bone.getName())) { + if (animatable.getCosmeticItem().getItem() instanceof ICosmeticItem cosmetic && cosmetic.getBone(animatable).equals(bone.getName())) { CosmeticRenderUtil.renderCosmetic(bone, stack, cosmeticBuffer, animatable, packedLight); cosmeticBuffer.endBatch(); } } @Override - public ResourceLocation getTextureLocation(Starbuncle entity) { - return entity.getTexture(entity); + public @NotNull ResourceLocation getTextureLocation(Starbuncle entity) { + return entity.getTexture(); } @Override - public RenderType getRenderType(Starbuncle animatable, ResourceLocation textureLocation, @org.jetbrains.annotations.Nullable MultiBufferSource bufferSource, float partialTick) { - // Jared's special shader, because adopter details aren't synced. - if(animatable.getName().getString().equals("Splonk")) { - return ShaderRegistry.blamed(textureLocation, true); - }else if(animatable.getName().getString().equals("Bailey")){ - return ShaderRegistry.rainbowEntity(textureLocation, ArsNouveau.prefix( "textures/entity/starbuncle_mask.png"),true); - } - - if(animatable.getName().getString().equals("Gootastic")){ - return RenderType.entityTranslucent(textureLocation); - } - return RenderType.entityCutoutNoCull(textureLocation); + public RenderType getRenderType(Starbuncle animatable, ResourceLocation textureLocation, @Nullable MultiBufferSource bufferSource, float partialTick) { + return specialShaders.getOrDefault(animatable.getName().getString(), RenderType::entityCutoutNoCull).apply(textureLocation); } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WixieModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WixieModel.java index 52dd96bfdb..b8e6272487 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WixieModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/WixieModel.java @@ -1,6 +1,8 @@ package com.hollingsworth.arsnouveau.client.renderer.entity; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.item.ICosmeticItem; +import com.hollingsworth.arsnouveau.common.entity.familiar.FamiliarWixie; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; import software.bernie.geckolib.animatable.GeoAnimatable; @@ -23,6 +25,11 @@ public void setCustomAnimations(T entity, long uniqueID, @Nullable AnimationStat EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); head.setRotX(extraData.headPitch() * 0.010453292F); head.setRotY(extraData.netHeadYaw() * 0.015453292F); + if (entity instanceof FamiliarWixie w) { + // hides the hat bone if the cosmetic item is a hat + this.getAnimationProcessor().getBone("hat") + .setHidden(w.getCosmeticItem().getItem() instanceof ICosmeticItem cosmetic && cosmetic.getBone(w).equals("hat")); + } } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarBookwyrmRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarBookwyrmRenderer.java index b50407e9ac..9bea2e48ef 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarBookwyrmRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarBookwyrmRenderer.java @@ -5,10 +5,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.renderer.GeoEntityRenderer; -public class FamiliarBookwyrmRenderer extends GeoEntityRenderer { +public class FamiliarBookwyrmRenderer extends GenericFamiliarRenderer { public FamiliarBookwyrmRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new BookwyrmModel<>()); } @@ -21,8 +19,4 @@ public void render(FamiliarBookwyrm entity, float entityYaw, float partialTicks, stack.popPose(); } - @Override - public ResourceLocation getTextureLocation(FamiliarBookwyrm entity) { - return entity.getTexture(); - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarStarbyModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarStarbyModel.java index 5a05ed46aa..7e66c51309 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarStarbyModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarStarbyModel.java @@ -23,12 +23,12 @@ public void setCustomAnimations(T entity, long uniqueID, @Nullable AnimationStat } @Override - public ResourceLocation getModelResource(FamiliarStarbuncle carbuncle) { - return ArsNouveau.prefix( "geo/starbuncle.geo.json"); + public ResourceLocation getModelResource(T carbuncle) { + return carbuncle.getModel(); } @Override - public ResourceLocation getTextureResource(FamiliarStarbuncle carbuncle) { + public ResourceLocation getTextureResource(T carbuncle) { return carbuncle.getTexture(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java index fa0145291f..01e3455102 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/FamiliarWhirlisprigRenderer.java @@ -9,15 +9,13 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.renderer.GeoEntityRenderer; import java.util.Random; -public class FamiliarWhirlisprigRenderer extends GeoEntityRenderer { +public class FamiliarWhirlisprigRenderer extends GenericFamiliarRenderer { public FamiliarWhirlisprigRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new WhirlisprigModel<>()); @@ -48,8 +46,4 @@ public void render(FamiliarWhirlisprig entityIn, float entityYaw, float partialT } } - @Override - public ResourceLocation getTextureLocation(FamiliarWhirlisprig animatable) { - return animatable.getTexture(); - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/GenericFamiliarRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/GenericFamiliarRenderer.java new file mode 100644 index 0000000000..487c393e6c --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/familiar/GenericFamiliarRenderer.java @@ -0,0 +1,40 @@ +package com.hollingsworth.arsnouveau.client.renderer.entity.familiar; + +import com.hollingsworth.arsnouveau.api.client.CosmeticRenderUtil; +import com.hollingsworth.arsnouveau.api.item.ICosmeticItem; +import com.hollingsworth.arsnouveau.common.entity.familiar.FamiliarEntity; +import com.mojang.blaze3d.vertex.ByteBufferBuilder; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; +import software.bernie.geckolib.renderer.GeoEntityRenderer; + +public class GenericFamiliarRenderer extends GeoEntityRenderer { + + public GenericFamiliarRenderer(EntityRendererProvider.Context renderManager, GeoModel model) { + super(renderManager, model); + } + + public static MultiBufferSource.BufferSource cosmeticBuffer = MultiBufferSource.immediate(new ByteBufferBuilder(1536)); + + @Override + public void renderRecursively(PoseStack stack, T familiar, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { + if (familiar.getCosmeticItem().getItem() instanceof ICosmeticItem cosmetic && cosmetic.getBone(familiar).equals(bone.getName())) { + CosmeticRenderUtil.renderCosmetic(bone, stack, cosmeticBuffer, familiar, packedLight); + cosmeticBuffer.endBatch(); + } + super.renderRecursively(stack, familiar, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); + } + + @Override + public @NotNull ResourceLocation getTextureLocation(T entity) { + return entity.getTexture() == null ? super.getTextureLocation(entity) : entity.getTexture(); + } + +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 13b72a5358..7de4afc35a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -703,8 +703,8 @@ public String getColor() { } }; - public ResourceLocation getTexture(Starbuncle entity) { - var nameTexture = TEXTURES.get(entity.getName().getString()); + public ResourceLocation getTexture() { + var nameTexture = TEXTURES.get(this.getName().getString()); if(nameTexture != null){ return nameTexture; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java index 34f598ace5..49337f8ce1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarEntity.java @@ -36,6 +36,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; @@ -44,10 +45,9 @@ import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.Nullable; import java.util.*; -public class FamiliarEntity extends PathfinderMob implements GeoEntity, IFamiliar, IDispellable, IDecoratable { +public abstract class FamiliarEntity extends PathfinderMob implements GeoEntity, IFamiliar, IDispellable, IDecoratable { public double manaReserveModifier = 0.15; private static final EntityDataAccessor> OWNER_UUID = SynchedEntityData.defineId(FamiliarEntity.class, EntityDataSerializers.OPTIONAL_UUID); @@ -328,4 +328,10 @@ public void syncAfterPersistentFamiliarInit() { setCosmeticItem(persistentData.cosmetic(), false); } } + + /** + * Use this to return custom texture, return null for default model. + */ + public abstract @Nullable ResourceLocation getTexture(); + } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarJabberwog.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarJabberwog.java index 26c5510a35..b3fb07b34d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarJabberwog.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarJabberwog.java @@ -1,12 +1,14 @@ package com.hollingsworth.arsnouveau.common.entity.familiar; import com.hollingsworth.arsnouveau.api.event.SpellModifierEvent; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.PathfinderMob; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; public class FamiliarJabberwog extends FlyingFamiliarEntity { @@ -24,7 +26,7 @@ public void spellResolveEvent(SpellModifierEvent event) { } @Override - public PlayState walkPredicate(AnimationState event) { + public PlayState walkPredicate(AnimationState event) { if (event.isMoving()) { event.getController().setAnimation(RawAnimation.begin().thenPlay("hop")); return PlayState.CONTINUE; @@ -35,8 +37,13 @@ public PlayState walkPredicate(AnimationState event) { @Override - public EntityType getType() { + public @NotNull EntityType getType() { return null; // return ModEntities.ENTITY_FAMILIAR_JABBERWOG.get(); } + + @Override + public ResourceLocation getTexture() { + return null; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java index a2d8b2464a..b2231ffec2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarStarbuncle.java @@ -1,6 +1,5 @@ package com.hollingsworth.arsnouveau.common.entity.familiar; -import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.scrying.CompoundScryer; import com.hollingsworth.arsnouveau.api.scrying.TagScryer; import com.hollingsworth.arsnouveau.common.entity.Starbuncle; @@ -28,6 +27,9 @@ import java.util.Arrays; +import static com.hollingsworth.arsnouveau.common.entity.Starbuncle.MODELS; +import static com.hollingsworth.arsnouveau.common.entity.Starbuncle.TEXTURES; + public class FamiliarStarbuncle extends FamiliarEntity { public FamiliarStarbuncle(EntityType ent, Level world) { @@ -65,7 +67,7 @@ public void tick() { } @Override - public PlayState walkPredicate(AnimationState event) { + public PlayState walkPredicate(AnimationState event) { if (event.isMoving()) { event.getController().setAnimation(RawAnimation.begin().thenPlay("run")); return PlayState.CONTINUE; @@ -79,10 +81,18 @@ protected void defineSynchedData(SynchedEntityData.@NotNull Builder pBuilder) { } public ResourceLocation getTexture() { + var nameTexture = TEXTURES.get(this.getName().getString()); + if (nameTexture != null) { + return nameTexture; + } String color = getColor(); if (color.isEmpty()) color = DyeColor.ORANGE.getName(); + return TEXTURES.get(color); + } - return ArsNouveau.prefix( "textures/entity/starbuncle_" + color.toLowerCase() + ".png"); + public ResourceLocation getModel() { + String key = getName().getString(); + return MODELS.getOrDefault(key, MODELS.get("starbuncle")); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java index 82ed27dcf7..a60c8a1d08 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarWhirlisprig.java @@ -19,6 +19,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.event.entity.living.LivingEntityUseItemEvent; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.animation.RawAnimation; @@ -31,7 +32,7 @@ public FamiliarWhirlisprig(EntityType ent, Level world) @Override - public InteractionResult interactAt(Player pPlayer, Vec3 pVec, InteractionHand hand) { + public @NotNull InteractionResult interactAt(@NotNull Player pPlayer, @NotNull Vec3 pVec, @NotNull InteractionHand hand) { if (hand != InteractionHand.MAIN_HAND || pPlayer.getCommandSenderWorld().isClientSide) return InteractionResult.PASS; @@ -55,7 +56,7 @@ public void onCostCalc(SpellCostCalcEvent event) { Spell spell = event.context.getSpell(); for (AbstractSpellPart part : spell.recipe()) { if (SpellSchools.ELEMENTAL_EARTH.isPartOfSchool(part)) { - discount += part.getCastingCost() * .5; + discount += (int) (part.getCastingCost() * .5); } } event.currentCost -= discount; @@ -81,7 +82,7 @@ public void eatEvent(LivingEntityUseItemEvent.Finish event) { } @Override - public PlayState walkPredicate(AnimationState event) { + public PlayState walkPredicate(AnimationState event) { if (event.isMoving()) { event.getController().setAnimation(RawAnimation.begin().thenPlay("fly")); } else { @@ -91,11 +92,12 @@ public PlayState walkPredicate(AnimationState event) { } @Override - public EntityType getType() { + public @NotNull EntityType getType() { return ModEntities.ENTITY_FAMILIAR_SYLPH.get(); } public ResourceLocation getTexture() { return ArsNouveau.prefix( "textures/entity/whirlisprig_" + (getColor().isEmpty() ? "summer" : getColor().toLowerCase()) + ".png"); } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FlyingFamiliarEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FlyingFamiliarEntity.java index 4c8e5ec482..ad1995511a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FlyingFamiliarEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FlyingFamiliarEntity.java @@ -7,15 +7,16 @@ import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; -public class FlyingFamiliarEntity extends FamiliarEntity { +public abstract class FlyingFamiliarEntity extends FamiliarEntity { public FlyingFamiliarEntity(EntityType p_i48575_1_, Level p_i48575_2_) { super(p_i48575_1_, p_i48575_2_); this.moveControl = new FlyingMoveControl(this, 10, true); } @Override - protected PathNavigation createNavigation(Level world) { + protected @NotNull PathNavigation createNavigation(@NotNull Level world) { FlyingPathNavigation flyingpathnavigator = new FlyingPathNavigation(this, world); flyingpathnavigator.setCanOpenDoors(false); flyingpathnavigator.setCanFloat(true); @@ -34,7 +35,7 @@ protected int calculateFallDamage(float p_225508_1_, float p_225508_2_) { } @Override - public boolean causeFallDamage(float p_147187_, float p_147188_, DamageSource p_147189_) { + public boolean causeFallDamage(float p_147187_, float p_147188_, @NotNull DamageSource p_147189_) { return false; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShades.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShades.java index abf3073ccc..88fd64e534 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShades.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShades.java @@ -5,7 +5,7 @@ import com.hollingsworth.arsnouveau.client.renderer.item.GenericItemRenderer; import com.hollingsworth.arsnouveau.client.renderer.tile.GenericModel; import com.hollingsworth.arsnouveau.common.entity.Starbuncle; -import com.hollingsworth.arsnouveau.common.entity.familiar.FamiliarStarbuncle; +import com.hollingsworth.arsnouveau.common.entity.familiar.*; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; @@ -21,6 +21,9 @@ public class StarbuncleShades extends AnimModItem implements ICosmeticItem { + public static final Vec3 starbyTrans = new Vec3(0, -.259, .165); + public static final Vec3 starbyScale = new Vec3(1.0, 1.0, 1.0); + public StarbuncleShades() { super(); withTooltip(Component.translatable("tooltip.starbuncle_shades")); @@ -38,19 +41,31 @@ public StarbuncleShades() { @Override public boolean canWear(LivingEntity entity) { - return entity instanceof Starbuncle || entity instanceof FamiliarStarbuncle; + return entity instanceof Starbuncle || entity instanceof FamiliarEntity; } //translation applied to the renderer @Override - public Vec3 getTranslations() { - return new Vec3(0, -.259, .165); + public Vec3 getTranslations(LivingEntity entity) { + return switch (entity) { + case FamiliarBookwyrm ignored -> new Vec3(0, -.235, .095); + case FamiliarWixie ignored -> new Vec3(0, -.15, .26); + case FamiliarDrygmy ignored -> new Vec3(0, -.13, .275); + case FamiliarWhirlisprig ignored -> new Vec3(0, -.175, .275); + case null, default -> starbyTrans; + }; } //scaling applied to the renderer @Override - public Vec3 getScaling() { - return new Vec3(1.0, 1.0, 1.0); + public Vec3 getScaling(LivingEntity entity) { + return switch (entity) { + case FamiliarBookwyrm ignored -> defaultScaling; + case FamiliarWixie ignored -> new Vec3(1.0, 1.0, 1.0); + case FamiliarDrygmy ignored -> defaultScaling.scale(1.125); + case FamiliarWhirlisprig ignored -> defaultScaling.scale(1.125); + case null, default -> starbyScale; + }; } @Override From a0ee3723c957b46f0928dd4f069f0522426603ab Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Sun, 6 Oct 2024 18:57:44 +0200 Subject: [PATCH 198/363] Fix Luck not applying Looting correctly, restore Drygmy familiar buff (#1427) * Fix Loot rolls with Luck * Convert hardcoded DygmyPerk and Familiar to attribute-based Perk, add related attribute and mob effect, now attribute for LootBoost Mixin * better docs, move set luck to before dealing damage --- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 +- .../assets/ars_nouveau/lang/en_us.json | 4 ++ .../arsnouveau/api/perk/PerkAttributes.java | 1 + .../arsnouveau/api/spell/IDamageEffect.java | 26 ++++------- .../arsnouveau/api/util/DamageUtil.java | 43 ++++++++++++++++-- .../arsnouveau/api/util/LootUtil.java | 22 +++++---- .../common/datagen/LangDatagen.java | 4 ++ .../common/entity/EnchantedFallingBlock.java | 22 +++++---- .../entity/familiar/FamiliarDrygmy.java | 11 +++++ .../arsnouveau/common/lib/LibPotions.java | 1 + .../EnchantedCountIncreaseFunctionMixin.java | 13 +++--- ...hanceWithEnchantedBonusConditionMixin.java | 13 +++--- .../arsnouveau/common/perk/LootingPerk.java | 13 +++++- .../arsnouveau/setup/registry/ModPotions.java | 1 + .../textures/mob_effect/looting.png | Bin 0 -> 456 bytes 15 files changed, 126 insertions(+), 52 deletions(-) create mode 100644 src/main/resources/assets/ars_nouveau/textures/mob_effect/looting.png diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index cbe8c7c939..0227e3a484 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-09-24T20:41:46.115647 Languages: en_us for mod: ars_nouveau -0b7ebd4efe064f1cc6745f6a05dea6a6f50d185f assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-09-30T16:56:16.5301547 Languages: en_us for mod: ars_nouveau +f0332c5cfbeb12762996145f066199f54adb0bd9 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 771be7c336..b14d00d7a1 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -655,6 +655,8 @@ "ars_nouveau.pathing": "Pathing", "ars_nouveau.patreon": "Join the Ars Nouveau patreon and get a special Discord role, contribute a custom Tome, receive merchandise, summon a Lily dog, and more!", "ars_nouveau.patreon_text": "Patreon", + "ars_nouveau.perk.drygmy": "Extra Looting", + "ars_nouveau.perk.drygmy.desc": "Increases the amount of loot dropped by mobs.", "ars_nouveau.perk.feather": "Fall Damage Reduction", "ars_nouveau.perk.feather.desc": "Reduces the amount of fall damage taken.", "ars_nouveau.perk.invalid_for_slot": "This perk requires a level %s or higher slot.", @@ -1144,6 +1146,8 @@ "effect.ars_nouveau.hex": "Hex", "effect.ars_nouveau.immolate": "Immolate", "effect.ars_nouveau.immolate.desc": "Enhances fire spells.", + "effect.ars_nouveau.looting": "Drygmy's Blessing", + "effect.ars_nouveau.looting.desc": "Increases the amount of loot dropped by mobs", "effect.ars_nouveau.magic_find": "Magic Find", "effect.ars_nouveau.mana_regen": "Mana Regeneration", "effect.ars_nouveau.mana_regen.desc": "Improves mana regeneration", diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkAttributes.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkAttributes.java index bcf2ca8c57..bc6e65a645 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkAttributes.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/PerkAttributes.java @@ -28,6 +28,7 @@ public class PerkAttributes { public static final DeferredHolder SPELL_DAMAGE_BONUS = registerAttribute("ars_nouveau.perk.spell_damage", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 10000.0D).setSyncable(true), "50b50137-9c92-4e64-b350-6044e9e609de"); public static final DeferredHolder WHIRLIESPRIG = registerAttribute("ars_nouveau.perk.saturation", (id) -> new RangedAttribute(id, 1.0, 0.0D, 10000.0D).setSyncable(true), "152810f7-0d01-484e-a512-73fe70af3db7"); public static final DeferredHolder WIXIE = registerAttribute("ars_nouveau.perk.wixie", (id) -> new RangedAttribute(id, 1.0D, 0.0D, 1024.0D).setSyncable(true), "bae5d566-c9f6-4abf-9fe0-6ac140a34db1"); + public static final DeferredHolder DRYGMY = registerAttribute("ars_nouveau.perk.drygmy", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 1024.0D).setSyncable(true), "bae5d566-9fe0-c9f6-4abf-6ac140a34db1"); public static final DeferredHolder FEATHER = registerAttribute("ars_nouveau.perk.feather", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 1.0D).setSyncable(true), "ee3a4090-c5f5-4a26-a9c2-69837237b35f"); //public static final DeferredHolder TOUGHNESS = registerAttribute("ars_nouveau.perk.toughness", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 1024.0D).setSyncable(true), "eb1ccdaf-38e3-4a1a-a5fb-b0dc698157ff"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/IDamageEffect.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/IDamageEffect.java index 2a76f9ddf3..d6e4d88102 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/IDamageEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/IDamageEffect.java @@ -4,25 +4,21 @@ import com.hollingsworth.arsnouveau.api.event.SpellDamageEvent; import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import com.hollingsworth.arsnouveau.api.util.DamageUtil; -import com.hollingsworth.arsnouveau.api.util.LootUtil; +import com.hollingsworth.arsnouveau.common.mixin.looting.*; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentFortune; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentRandomize; import com.hollingsworth.arsnouveau.setup.registry.DamageTypesRegistry; +import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraft.world.level.storage.loot.LootParams; -import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.level.LevelAccessor; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.NotNull; -import java.util.List; - public interface IDamageEffect { default boolean canDamage(LivingEntity shooter, SpellStats stats, SpellContext spellContext, SpellResolver resolver, @NotNull Entity entity) { @@ -51,6 +47,12 @@ default boolean attemptDamage(Level world, @NotNull LivingEntity shooter, SpellS if (stats.isRandomized()) totalDamage += randomRolls(stats, server); + ///Make sure your DamageSource is an instance of SpellDamageSource,made with [#source(LevelAccessor,ResourceKey)] or manually, + ///The luck augment will be used during loot generation [LootItemRandomChanceWithEnchantedBonusConditionMixin] and [EnchantedCountIncreaseFunctionMixin] + if (source instanceof DamageUtil.SpellDamageSource spellSource) { + spellSource.setLuckLevel(stats.getBuffCount(AugmentFortune.INSTANCE)); + } + SpellDamageEvent.Pre preDamage = new SpellDamageEvent.Pre(source, shooter, entity, totalDamage, spellContext); NeoForge.EVENT_BUS.post(preDamage); @@ -68,16 +70,6 @@ default boolean attemptDamage(Level world, @NotNull LivingEntity shooter, SpellS SpellDamageEvent.Post postDamage = new SpellDamageEvent.Post(source, shooter, entity, totalDamage, spellContext); NeoForge.EVENT_BUS.post(postDamage); - if (entity instanceof - LivingEntity mob && mob.getHealth() <= 0 && !mob.isRemoved() && stats.hasBuff(AugmentFortune.INSTANCE)) { - Player playerContext = shooter instanceof Player player ? player : ANFakePlayer.getPlayer(server); - int looting = stats.getBuffCount(AugmentFortune.INSTANCE); - LootParams lootContext = LootUtil.getLootingContext(server, shooter, mob, looting, world.damageSources().playerAttack(playerContext)).create(LootContextParamSets.ENTITY); - LootTable loottable = server.getServer().reloadableRegistries().getLootTable( mob.getLootTable()); - List items = loottable.getRandomItems(lootContext); - items.forEach(mob::spawnAtLocation); - } - return true; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/DamageUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/DamageUtil.java index 5a373da71f..6df167ab0d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/DamageUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/DamageUtil.java @@ -8,6 +8,7 @@ import net.minecraft.world.damagesource.DamageType; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; public class DamageUtil { @@ -26,12 +27,48 @@ static public DamageSource source(LevelAccessor level, ResourceKey k static public DamageSource source(LevelAccessor level, ResourceKey key, @Nullable Entity entity, @Nullable Entity direct) { Holder.Reference type = level.registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(key); if (entity != null && direct != null) - return new DamageSource(type, entity, direct); + return new SpellDamageSource(type, entity, direct); else if (entity != null) - return new DamageSource(type, entity); + return new SpellDamageSource(type, entity); else - return new DamageSource(type); + return new SpellDamageSource(type); } + /** + * Custom DamageSource that holds the luck augments of the spell damage to apply during drop generation + */ + public static class SpellDamageSource extends DamageSource { + + public int getLuckLevel() { + return luckLevel; + } + + public void setLuckLevel(int luckLevel) { + this.luckLevel = luckLevel; + } + + public int luckLevel = 0; + + public SpellDamageSource(Holder pType, @Nullable Entity pDirectEntity, @Nullable Entity pCausingEntity, @Nullable Vec3 pDamageSourcePosition) { + super(pType, pDirectEntity, pCausingEntity, pDamageSourcePosition); + } + + public SpellDamageSource(Holder pType, @Nullable Entity pDirectEntity, @Nullable Entity pCausingEntity) { + this(pType, pDirectEntity, pCausingEntity, null); + } + + public SpellDamageSource(Holder pType, Vec3 pDamageSourcePosition) { + this(pType, null, null, pDamageSourcePosition); + } + + public SpellDamageSource(Holder pType, @Nullable Entity pEntity) { + this(pType, pEntity, pEntity); + } + + public SpellDamageSource(Holder pType) { + this(pType, null, null, null); + } + } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/LootUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/LootUtil.java index f4c97a723b..595ad3d2b2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/LootUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/LootUtil.java @@ -4,16 +4,17 @@ import com.hollingsworth.arsnouveau.common.util.HolderHelper; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.storage.loot.LootParams; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.common.util.FakePlayer; public class LootUtil { @@ -43,18 +44,21 @@ public static LootParams.Builder getFortuneContext(ServerLevel world, BlockPos p return getDefaultContext(world, pos, shooter).withParameter(LootContextParams.TOOL, stack); } - public static LootParams.Builder getLootingContext(ServerLevel world, LivingEntity player, LivingEntity slainEntity, int looting, DamageSource source) { + public static LootParams.Builder getLootingContext(ServerLevel world, LivingEntity attacker, LivingEntity slainEntity, int looting, DamageSource source) { ItemStack stack = getDefaultFakeWeapon(); + FakePlayer player = attacker instanceof Player p ? new FakePlayer(world, p.getGameProfile()) : ANFakePlayer.getPlayer(world); stack.enchant(HolderHelper.unwrap(world, Enchantments.LOOTING), looting); + player.setItemInHand(InteractionHand.MAIN_HAND, stack); return new LootParams.Builder(world) .withParameter(LootContextParams.THIS_ENTITY, slainEntity) .withParameter(LootContextParams.ORIGIN, new Vec3(slainEntity.getX(), slainEntity.getY(), slainEntity.getZ())) - .withParameter(LootContextParams.LAST_DAMAGE_PLAYER, ANFakePlayer.getPlayer(world)) - .withParameter(LootContextParams.DAMAGE_SOURCE, source).withOptionalParameter(LootContextParams.ATTACKING_ENTITY, source.getEntity()) - .withOptionalParameter(LootContextParams.DIRECT_ATTACKING_ENTITY, source.getDirectEntity()) - .withParameter(LootContextParams.ATTACKING_ENTITY, player).withLuck(player instanceof Player ? ((Player) player).getLuck() : 1.0f) - .withParameter(LootContextParams.TOOL, stack).withParameter(LootContextParams.EXPLOSION_RADIUS, 0.0f) - .withParameter(LootContextParams.BLOCK_STATE, Blocks.AIR.defaultBlockState()) - .withOptionalParameter(LootContextParams.BLOCK_ENTITY, null); + .withParameter(LootContextParams.LAST_DAMAGE_PLAYER, player) + .withParameter(LootContextParams.DAMAGE_SOURCE, source) + .withOptionalParameter(LootContextParams.DIRECT_ATTACKING_ENTITY, player) + .withParameter(LootContextParams.ATTACKING_ENTITY, player) + .withLuck(player.getLuck()) + .withParameter(LootContextParams.TOOL, stack) + .withParameter(LootContextParams.ENCHANTMENT_ACTIVE, looting > 0) + .withParameter(LootContextParams.ENCHANTMENT_LEVEL, looting); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 3f8e5a8d4e..f8a6e918bc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -210,6 +210,8 @@ protected void addTranslations() { add("item.minecraft.tipped_arrow.effect.mana_regen_potion_long", "Arrow of Mana Regeneration"); add("effect.ars_nouveau.mana_regen", "Mana Regeneration"); add("effect.ars_nouveau.mana_regen.desc", "Improves mana regeneration"); + add("effect.ars_nouveau.looting", "Drygmy's Blessing"); + add("effect.ars_nouveau.looting.desc", "Increases the amount of loot dropped by mobs"); add("ars_nouveau.on", "Active: Yes"); add("ars_nouveau.off", "Active: No"); add("item.ars_nouveau.void_jar", "Jar of Voiding"); @@ -1032,6 +1034,8 @@ protected void addTranslations() { add("ars_nouveau.perk.saturation.desc", "Increases the saturation of the food"); add("ars_nouveau.perk.wixie", "Potion Duration"); add("ars_nouveau.perk.wixie.desc", "Increases the duration of potion effects."); + add("ars_nouveau.perk.drygmy", "Extra Looting"); + add("ars_nouveau.perk.drygmy.desc", "Increases the amount of loot dropped by mobs."); add("ars_nouveau.perk.jump_height", "Jump Power"); add("ars_nouveau.perk.jump_height.desc", "Increases the height of your jumps."); add("ars_nouveau.perk.feather", "Fall Damage Reduction"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java index a12e2347e0..fc528e4768 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java @@ -338,14 +338,7 @@ protected void onHitEntity(@NotNull EntityHitResult pResult) { Entity owner = this.getOwner(); DamageSource damagesource; // TODO: check falling block sources - if (owner == null) { - damagesource = level.damageSources().thrown(this, owner); - } else { - damagesource = level.damageSources().thrown(this, owner); - if (owner instanceof LivingEntity livingOwner) { - livingOwner.setLastHurtMob(entity); - } - } + damagesource = getDamageSource(owner, entity); boolean isEnderman = entity.getType() == EntityType.ENDERMAN; int k = entity.getRemainingFireTicks(); @@ -377,6 +370,19 @@ protected void onHitEntity(@NotNull EntityHitResult pResult) { } } + public @NotNull DamageSource getDamageSource(Entity owner, Entity entity) { + DamageSource damagesource; + if (owner == null) { + damagesource = level.damageSources().thrown(this, owner); + } else { + damagesource = level.damageSources().thrown(this, owner); + if (owner instanceof LivingEntity livingOwner) { + livingOwner.setLastHurtMob(entity); + } + } + return damagesource; + } + public void doPostHurtEffects(LivingEntity livingentity) { } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java index eb908f65e9..abfb943bbe 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/familiar/FamiliarDrygmy.java @@ -5,9 +5,11 @@ import com.hollingsworth.arsnouveau.api.spell.SpellSchools; import com.hollingsworth.arsnouveau.common.entity.EntityDrygmy; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; +import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.PathfinderMob; import net.minecraft.world.entity.player.Player; @@ -51,6 +53,15 @@ public void onModifier(SpellModifierEvent event) { event.builder.addDamageModifier(2.0f); } } + + @Override + public void tick() { + super.tick(); + if (!level.isClientSide && level.getGameTime() % 60 == 0 && getOwner() != null) { + getOwner().addEffect(new MobEffectInstance(ModPotions.LOOTING_EFFECT, 600, 0, false, false, true)); + } + } + // TODO: restore looting event // public void onLootingEvent(LootingLevelEvent event) { // if (event.getDamageSource() != null && isAlive() && getOwner() != null && event.getDamageSource().getEntity() != null && getOwner().equals(event.getDamageSource().getEntity())) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibPotions.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibPotions.java index 29e6548c51..6eccf92f4d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibPotions.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibPotions.java @@ -2,6 +2,7 @@ public class LibPotions { + public static final String LOOTING = "looting"; public static final String SHOCKED = "shocked"; public static final String HEX = "hex"; public static final String MAGIC_FIND = "magic_find"; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/EnchantedCountIncreaseFunctionMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/EnchantedCountIncreaseFunctionMixin.java index f5c506f558..4df5b2df82 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/EnchantedCountIncreaseFunctionMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/EnchantedCountIncreaseFunctionMixin.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.mixin.looting; -import com.hollingsworth.arsnouveau.api.util.PerkUtil; -import com.hollingsworth.arsnouveau.common.perk.LootingPerk; +import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; +import com.hollingsworth.arsnouveau.api.util.DamageUtil; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; @@ -10,6 +10,7 @@ import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.functions.EnchantedCountIncreaseFunction; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -23,9 +24,9 @@ public class EnchantedCountIncreaseFunctionMixin { target = "Lnet/minecraft/world/item/enchantment/EnchantmentHelper;getEnchantmentLevel(Lnet/minecraft/core/Holder;Lnet/minecraft/world/entity/LivingEntity;)I" ) ) - private int ars_nouveau$lootingPerk(Holder enchantment, LivingEntity attacker, Operation original, @Local(argsOnly = true) LootContext context) { - int add = PerkUtil.countForPerk(LootingPerk.INSTANCE, attacker); - // TODO: add FamilarEntity check - return original.call(enchantment, attacker) + add; + private int ars_nouveau$adjustLooting(Holder enchantment, LivingEntity attacker, Operation original, @Local(argsOnly = true) LootContext context) { + int perkLooting = (int) attacker.getAttributeValue(PerkAttributes.DRYGMY); + int spellLuck = context.getParamOrNull(LootContextParams.DAMAGE_SOURCE) instanceof DamageUtil.SpellDamageSource spellDamageSource ? spellDamageSource.getLuckLevel() : 0; + return Math.max(spellLuck, original.call(enchantment, attacker)) + perkLooting; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/LootItemRandomChanceWithEnchantedBonusConditionMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/LootItemRandomChanceWithEnchantedBonusConditionMixin.java index 569fab5365..d61b4119e0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/LootItemRandomChanceWithEnchantedBonusConditionMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/LootItemRandomChanceWithEnchantedBonusConditionMixin.java @@ -1,7 +1,7 @@ package com.hollingsworth.arsnouveau.common.mixin.looting; -import com.hollingsworth.arsnouveau.api.util.PerkUtil; -import com.hollingsworth.arsnouveau.common.perk.LootingPerk; +import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; +import com.hollingsworth.arsnouveau.api.util.DamageUtil; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; @@ -9,6 +9,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceWithEnchantedBonusCondition; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -23,10 +24,10 @@ public class LootItemRandomChanceWithEnchantedBonusConditionMixin { target = "Lnet/minecraft/world/item/enchantment/EnchantmentHelper;getEnchantmentLevel(Lnet/minecraft/core/Holder;Lnet/minecraft/world/entity/LivingEntity;)I" ) ) - private int ars_nouveau$lootingOnGoldSnowball(Holder enchantment, LivingEntity attacker, Operation original, @Local(argsOnly = true) LootContext context) { - int add = PerkUtil.countForPerk(LootingPerk.INSTANCE, attacker); - // TODO: add FamilarEntity check - return original.call(enchantment, attacker) + add; + private int ars_nouveau$adjustLooting(Holder enchantment, LivingEntity attacker, Operation original, @Local(argsOnly = true) LootContext context) { + int perkLooting = (int) attacker.getAttributeValue(PerkAttributes.DRYGMY); + int spellLuck = context.getParam(LootContextParams.DAMAGE_SOURCE) instanceof DamageUtil.SpellDamageSource spellDamageSource ? spellDamageSource.getLuckLevel() : 0; + return Math.max(spellLuck, original.call(enchantment, attacker)) + perkLooting; } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/perk/LootingPerk.java b/src/main/java/com/hollingsworth/arsnouveau/common/perk/LootingPerk.java index 888be39c4c..0839a74a34 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/perk/LootingPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/perk/LootingPerk.java @@ -2,16 +2,27 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.perk.Perk; +import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlotGroup; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import org.jetbrains.annotations.NotNull; public class LootingPerk extends Perk { - public static final LootingPerk INSTANCE = new LootingPerk(ArsNouveau.prefix( "thread_drygmy")); + public static final LootingPerk INSTANCE = new LootingPerk(ArsNouveau.prefix("thread_drygmy")); public LootingPerk(ResourceLocation key) { super(key); } + @Override + public @NotNull ItemAttributeModifiers applyAttributeModifiers(ItemAttributeModifiers modifiers, ItemStack stack, int slotValue, EquipmentSlotGroup equipmentSlotGroup) { + return modifiers.withModifierAdded(PerkAttributes.DRYGMY, new AttributeModifier(INSTANCE.getRegistryName(), slotValue, AttributeModifier.Operation.ADD_VALUE), equipmentSlotGroup); + } + @Override public String getLangName() { return "The Drygmy"; diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java index d8c56888ba..2c37f650d3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java @@ -38,6 +38,7 @@ public class ModPotions { public static final DeferredHolder HEX_EFFECT = EFFECTS.register(HEX, () -> new PublicEffect(MobEffectCategory.HARMFUL, 8080895) .addAttributeModifier(PerkAttributes.MANA_REGEN_BONUS, ArsNouveau.prefix("hex_regen_penalty"), -0.5, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); + public static final DeferredHolder LOOTING_EFFECT = EFFECTS.register(LOOTING, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 7158556).addAttributeModifier(PerkAttributes.DRYGMY, ArsNouveau.prefix("looting_bonus"), 1.0, AttributeModifier.Operation.ADD_VALUE)); public static final DeferredHolder SCRYING_EFFECT = EFFECTS.register(SCRYING, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 2039587)); public static final DeferredHolder GLIDE_EFFECT = EFFECTS.register(GLIDE, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 8080895)); public static final DeferredHolder SNARE_EFFECT = EFFECTS.register(SNARE, SnareEffect::new); diff --git a/src/main/resources/assets/ars_nouveau/textures/mob_effect/looting.png b/src/main/resources/assets/ars_nouveau/textures/mob_effect/looting.png new file mode 100644 index 0000000000000000000000000000000000000000..96327a4f97f7441db6d5602658841d961c604622 GIT binary patch literal 456 zcmV;(0XP1MP)Px$f=NU{R5*>Lld(zzK@f(&Thm;Mz?z_-rvX7yiC9>~Mi6TWgakrTih_ly()$Xr z@ChPK(`y(R%u#&5 zk(Xldba6zqXmN0Ur4zM!fsO1k0Jh`PYToPIBPhMJf@vm^ z84Ca_>$1DML$~8$J3gZ4PC6JrF%Bz*flI&tt&1o}LiIck29OyG(@c_HTG6e&hLIuE zhI#O`B1%HpH_ap`#l}on>7>}eG?Uco1%TltZe*AB$))`Ych5JJ_A3+McuZz2-G*R_ z;_$4Pc3?X`R@UY2`9>#Jx614-E&%Y-`{DELR_DUN#diFWgI4pNe*c>=7|mC~@wFPK z8e>8wx*czLyMc?$SQBpIaJS>>m{1SNc6_=W?~jvdu(F?*Vjut>syU8jG_yz?K9&)W ymuI6EKD>Z6pmp8W(7ex7uI5N>4%fzizw<8#2*8W@vjzA70000 Date: Sun, 6 Oct 2024 18:19:27 -0500 Subject: [PATCH 199/363] Update supporters.json --- supporters.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/supporters.json b/supporters.json index 4d523b57fd..7fc78c3797 100644 --- a/supporters.json +++ b/supporters.json @@ -29,7 +29,8 @@ "9eff9013-f8a6-4a1a-9142-32d94d60d8c1", "671ffc64-8b5b-4ac2-87b1-138951be701e","aac7171c-9bac-42a8-b094-2363599dae59", "47f9c9d2-89b2-4987-af6b-31e7b1f74da2", "ec77d204-6e8b-4dac-8b66-71b2a03c5e65", "98e72ae4-10c9-4696-970b-804eb9b176ae", "0421ad40-0881-47d4-b086-38c90c1ab62f", "a8875ecb-6e84-4c6d-ac68-3251b945d963", "cf1f7109-266d-4e5a-8a8a-d93684cf60b9", - "e7976ce2-3344-4499-8b15-91adddc5ed0f", "d29025d7-cf5d-4976-8a65-fc3bdcc991b5", "8ced638c-eac7-433e-b794-54c0f23807a4"], + "e7976ce2-3344-4499-8b15-91adddc5ed0f", "d29025d7-cf5d-4976-8a65-fc3bdcc991b5", "8ced638c-eac7-433e-b794-54c0f23807a4", + "db489a87-6509-4d75-917d-9c426b519c64"], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -461,6 +462,11 @@ "adopter": "mluosed", "color": "brown", "bio": "This Starbuncle likes to walk in the cool forest in the fall,staying at home in the winter and watching others stew meat" + },{ + "name": "Smokey Sugar", + "color": "black", + "adopter": "Vicorus", + "bio": "A hard working fellow. Very sweet and happy all around. They are eager to work for you." } ] } From d3c9c32be967e5876772ce0dc670b5071e3fa5c0 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 12 Oct 2024 20:22:03 -0500 Subject: [PATCH 200/363] Update supporters --- .../cdae075e2d4d58384fe4d2075f6d5323fe5baa69 | 3 ++- .../recipe/tomes/crowdrone_tome.json | 25 +++++++++++++++++++ .../common/datagen/CasterTomeProvider.java | 1 + supporters.json | 7 +++++- 4 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/crowdrone_tome.json diff --git a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 index 0f143279e2..a1c9b3b6c7 100644 --- a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 +++ b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 @@ -1,9 +1,10 @@ -// 1.21.1 2024-08-17T10:54:39.1697774 Ars Nouveau Caster Tomes Datagen +// 1.21.1 2024-10-12T20:11:48.8307642 Ars Nouveau Caster Tomes Datagen ab9cf50e4958592dcee6f5dae6d6bad2e7fe08ab data/ars_nouveau/recipe/tomes/alex_tome.json dae41a867bde9258624fe4676128e8140f2e7fe4 data/ars_nouveau/recipe/tomes/arachne_tome.json 71e004bfa5837d293c6ee00dd9fd99493b9b9aba data/ars_nouveau/recipe/tomes/aurellia_tome.json 2027d79f560de6a1a7829a478f64ccd8f1723bc2 data/ars_nouveau/recipe/tomes/bailey_tome.json 0be05276a18b4cac328dc05898e560b28f7e3a31 data/ars_nouveau/recipe/tomes/chems_tome.json +19564f80b5f660f4e472b2fab542e98a71c9b108 data/ars_nouveau/recipe/tomes/crowdrone_tome.json e9b37b1592c51345f27cd0571a12a373a469be73 data/ars_nouveau/recipe/tomes/darkfira_tome.json 3c4d9ad61832042e38046f7763047126dbc320a0 data/ars_nouveau/recipe/tomes/farfalla_tome.json f64772fb96f68b7865f64ee40a8718e1a2412fce data/ars_nouveau/recipe/tomes/fireball_tome.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/crowdrone_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/crowdrone_tome.json new file mode 100644 index 0000000000..d44a2c1fc2 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/crowdrone_tome.json @@ -0,0 +1,25 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 1, + "g": 1, + "id": "ars_nouveau:constant", + "r": 1 + }, + "flavour_text": "Crows are known to collect shiny things, even in the darkest of places.", + "name": "Crow's Gluttonous Gaze", + "sound": {}, + "spell": [ + "ars_nouveau:glyph_self", + "ars_nouveau:glyph_sense_magic", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_light", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java index 9b852f369a..ebc424e57a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java @@ -255,6 +255,7 @@ public void collectJsons(CachedOutput pOutput) { tomes.add(buildTome("uni","Uni's Windshield", new Spell(MethodSelf.INSTANCE, EffectOrbit.INSTANCE, EffectKnockback.INSTANCE).add(AugmentAmplify.INSTANCE, 8), "Stay away!")); + tomes.add(buildTome("crowdrone", "Crow's Gluttonous Gaze", new Spell(MethodSelf.INSTANCE, EffectSenseMagic.INSTANCE, AugmentExtendTime.INSTANCE, EffectLight.INSTANCE).add(AugmentExtendTime.INSTANCE, 6), "Crows are known to collect shiny things, even in the darkest of places.", new ParticleColor(0,0,0))); for (CasterRecipeWrapper g : tomes) { Path path = getRecipePath(output, g.id().getPath()); saveStable(pOutput, CasterTomeData.CODEC.encodeStart(JsonOps.INSTANCE, g.toData()).getOrThrow(), path); diff --git a/supporters.json b/supporters.json index 7fc78c3797..f0a98e842d 100644 --- a/supporters.json +++ b/supporters.json @@ -30,7 +30,7 @@ "47f9c9d2-89b2-4987-af6b-31e7b1f74da2", "ec77d204-6e8b-4dac-8b66-71b2a03c5e65", "98e72ae4-10c9-4696-970b-804eb9b176ae", "0421ad40-0881-47d4-b086-38c90c1ab62f", "a8875ecb-6e84-4c6d-ac68-3251b945d963", "cf1f7109-266d-4e5a-8a8a-d93684cf60b9", "e7976ce2-3344-4499-8b15-91adddc5ed0f", "d29025d7-cf5d-4976-8a65-fc3bdcc991b5", "8ced638c-eac7-433e-b794-54c0f23807a4", - "db489a87-6509-4d75-917d-9c426b519c64"], + "db489a87-6509-4d75-917d-9c426b519c64", "eb079f27-e266-4b3c-beba-b34d34bef268"], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -467,6 +467,11 @@ "color": "black", "adopter": "Vicorus", "bio": "A hard working fellow. Very sweet and happy all around. They are eager to work for you." + },{ + "name": "Corone", + "color": "black", + "adopter": "CrowDrone", + "bio": "A vain little creature, known for her beautiful voice. Aesop warned her about foxes and flattery. " } ] } From fa95caf1243fbbe6477441b83d14be3491ede31b Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 13 Oct 2024 12:07:52 -0500 Subject: [PATCH 201/363] Fix looting mixin crashes --- .../mixin/looting/EnchantedCountIncreaseFunctionMixin.java | 3 +++ .../LootItemRandomChanceWithEnchantedBonusConditionMixin.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/EnchantedCountIncreaseFunctionMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/EnchantedCountIncreaseFunctionMixin.java index 4df5b2df82..ac80e1dba7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/EnchantedCountIncreaseFunctionMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/EnchantedCountIncreaseFunctionMixin.java @@ -25,6 +25,9 @@ public class EnchantedCountIncreaseFunctionMixin { ) ) private int ars_nouveau$adjustLooting(Holder enchantment, LivingEntity attacker, Operation original, @Local(argsOnly = true) LootContext context) { + if (!attacker.getAttributes().hasAttribute(PerkAttributes.DRYGMY)) { + return original.call(enchantment, attacker); + } int perkLooting = (int) attacker.getAttributeValue(PerkAttributes.DRYGMY); int spellLuck = context.getParamOrNull(LootContextParams.DAMAGE_SOURCE) instanceof DamageUtil.SpellDamageSource spellDamageSource ? spellDamageSource.getLuckLevel() : 0; return Math.max(spellLuck, original.call(enchantment, attacker)) + perkLooting; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/LootItemRandomChanceWithEnchantedBonusConditionMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/LootItemRandomChanceWithEnchantedBonusConditionMixin.java index d61b4119e0..c728c1f40b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/LootItemRandomChanceWithEnchantedBonusConditionMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/LootItemRandomChanceWithEnchantedBonusConditionMixin.java @@ -25,6 +25,9 @@ public class LootItemRandomChanceWithEnchantedBonusConditionMixin { ) ) private int ars_nouveau$adjustLooting(Holder enchantment, LivingEntity attacker, Operation original, @Local(argsOnly = true) LootContext context) { + if (!attacker.getAttributes().hasAttribute(PerkAttributes.DRYGMY)) { + return original.call(enchantment, attacker); + } int perkLooting = (int) attacker.getAttributeValue(PerkAttributes.DRYGMY); int spellLuck = context.getParam(LootContextParams.DAMAGE_SOURCE) instanceof DamageUtil.SpellDamageSource spellDamageSource ? spellDamageSource.getLuckLevel() : 0; return Math.max(spellLuck, original.call(enchantment, attacker)) + perkLooting; From 886a34d7171dbf817b8becafe3979a66379f3d24 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 13 Oct 2024 12:53:56 -0500 Subject: [PATCH 202/363] Check if attribute is null --- .../mixin/looting/EnchantedCountIncreaseFunctionMixin.java | 2 +- .../LootItemRandomChanceWithEnchantedBonusConditionMixin.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/EnchantedCountIncreaseFunctionMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/EnchantedCountIncreaseFunctionMixin.java index ac80e1dba7..99b2dbe3d5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/EnchantedCountIncreaseFunctionMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/EnchantedCountIncreaseFunctionMixin.java @@ -25,7 +25,7 @@ public class EnchantedCountIncreaseFunctionMixin { ) ) private int ars_nouveau$adjustLooting(Holder enchantment, LivingEntity attacker, Operation original, @Local(argsOnly = true) LootContext context) { - if (!attacker.getAttributes().hasAttribute(PerkAttributes.DRYGMY)) { + if (attacker.getAttribute(PerkAttributes.DRYGMY) == null) { return original.call(enchantment, attacker); } int perkLooting = (int) attacker.getAttributeValue(PerkAttributes.DRYGMY); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/LootItemRandomChanceWithEnchantedBonusConditionMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/LootItemRandomChanceWithEnchantedBonusConditionMixin.java index c728c1f40b..fd1cf5d029 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/LootItemRandomChanceWithEnchantedBonusConditionMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/looting/LootItemRandomChanceWithEnchantedBonusConditionMixin.java @@ -25,7 +25,7 @@ public class LootItemRandomChanceWithEnchantedBonusConditionMixin { ) ) private int ars_nouveau$adjustLooting(Holder enchantment, LivingEntity attacker, Operation original, @Local(argsOnly = true) LootContext context) { - if (!attacker.getAttributes().hasAttribute(PerkAttributes.DRYGMY)) { + if (attacker.getAttribute(PerkAttributes.DRYGMY) == null) { return original.call(enchantment, attacker); } int perkLooting = (int) attacker.getAttributeValue(PerkAttributes.DRYGMY); From ec1c37f3b67e6313f9805156735e1b834aa8b594 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Tue, 15 Oct 2024 09:27:53 -0500 Subject: [PATCH 203/363] Update supporters.json --- supporters.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/supporters.json b/supporters.json index f0a98e842d..eb1b2bdc5e 100644 --- a/supporters.json +++ b/supporters.json @@ -472,6 +472,16 @@ "color": "black", "adopter": "CrowDrone", "bio": "A vain little creature, known for her beautiful voice. Aesop warned her about foxes and flattery. " + },{ + "name": "Astrael", + "color": "black", + "adopter": "Kientcy", + "bio": "A mysterious but curious starbuncle, once loved by an archmage who got lost in time. Rumor says she was born among the stars, therefore her name." + },{ + "name": "Xollus", + "adopter": "Jarva", + "color": "orange", + "bio": "This poor Starbuncle was originally a Bookwyrm, polymorphed into a Starbuncle as part of an experiment gone wrong." } ] } From 3f0eced461fc11a5567fce35c2c2daeb615dc1f3 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 16 Oct 2024 21:06:23 -0500 Subject: [PATCH 204/363] Fix imbuement chamber rendering in book --- .../af617d50f86666f21b24a8919c1c50aad8faa4f8 | 28 +++++++++---------- ...json => imbuement_abjuration_essence.json} | 0 ...ssence.json => imbuement_air_essence.json} | 0 ...{amethyst.json => imbuement_amethyst.json} | 0 ...ock.json => imbuement_amethyst_block.json} | 0 ...rrow.json => imbuement_amplify_arrow.json} | 0 ...son => imbuement_conjuration_essence.json} | 0 ...ence.json => imbuement_earth_essence.json} | 0 ...sence.json => imbuement_fire_essence.json} | 0 .../{lapis.json => imbuement_lapis.json} | 0 ...on => imbuement_manipulation_essence.json} | 0 ...arrow.json => imbuement_pierce_arrow.json} | 0 ..._arrow.json => imbuement_split_arrow.json} | 0 ...ence.json => imbuement_water_essence.json} | 0 .../client/patchouli/ImbuementProcessor.java | 3 -- .../datagen/ImbuementRecipeProvider.java | 2 +- 16 files changed, 15 insertions(+), 18 deletions(-) rename src/generated/resources/data/ars_nouveau/recipe/{abjuration_essence.json => imbuement_abjuration_essence.json} (100%) rename src/generated/resources/data/ars_nouveau/recipe/{air_essence.json => imbuement_air_essence.json} (100%) rename src/generated/resources/data/ars_nouveau/recipe/{amethyst.json => imbuement_amethyst.json} (100%) rename src/generated/resources/data/ars_nouveau/recipe/{amethyst_block.json => imbuement_amethyst_block.json} (100%) rename src/generated/resources/data/ars_nouveau/recipe/{amplify_arrow.json => imbuement_amplify_arrow.json} (100%) rename src/generated/resources/data/ars_nouveau/recipe/{conjuration_essence.json => imbuement_conjuration_essence.json} (100%) rename src/generated/resources/data/ars_nouveau/recipe/{earth_essence.json => imbuement_earth_essence.json} (100%) rename src/generated/resources/data/ars_nouveau/recipe/{fire_essence.json => imbuement_fire_essence.json} (100%) rename src/generated/resources/data/ars_nouveau/recipe/{lapis.json => imbuement_lapis.json} (100%) rename src/generated/resources/data/ars_nouveau/recipe/{manipulation_essence.json => imbuement_manipulation_essence.json} (100%) rename src/generated/resources/data/ars_nouveau/recipe/{pierce_arrow.json => imbuement_pierce_arrow.json} (100%) rename src/generated/resources/data/ars_nouveau/recipe/{split_arrow.json => imbuement_split_arrow.json} (100%) rename src/generated/resources/data/ars_nouveau/recipe/{water_essence.json => imbuement_water_essence.json} (100%) diff --git a/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 b/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 index 5c7b024f23..2f3b077dac 100644 --- a/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 +++ b/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 @@ -1,14 +1,14 @@ -// 1.21.1 2024-08-17T10:54:39.1916083 Imbuement -d8ef9562f603943cf768422fb009c9ec77d7dc65 data/ars_nouveau/recipe/abjuration_essence.json -98efa28dfca47cd27a0e31e89208825c7e320e61 data/ars_nouveau/recipe/air_essence.json -6d57a8685026b987a6012bb592cf26c3dba0e89c data/ars_nouveau/recipe/amethyst.json -5bce1f0b9b92a9acdf9b856dfccd8ff4fb933c67 data/ars_nouveau/recipe/amethyst_block.json -82af4f7ca94590a4c01cbc4e7ab7524f6b603ed9 data/ars_nouveau/recipe/amplify_arrow.json -4b3e5edb67c9661e999ef3aa56b07330d78052c0 data/ars_nouveau/recipe/conjuration_essence.json -71640142f8e3f340f1b4078e7a3e8fcbbbe232a9 data/ars_nouveau/recipe/earth_essence.json -bb798f4b25b7a191edb246e9122dd5756c83fa7c data/ars_nouveau/recipe/fire_essence.json -6ba22e7cf702e9be5ff66d6b28f62a61639679ce data/ars_nouveau/recipe/lapis.json -7823618d4052b659f3cbb2036a28e098d263d5ae data/ars_nouveau/recipe/manipulation_essence.json -4c1e38069e88502d94768dae302127da9f8efbfd data/ars_nouveau/recipe/pierce_arrow.json -7103454e5168ee74e4e2363a76d8c94733b90433 data/ars_nouveau/recipe/split_arrow.json -adbed7df2e908a20415400f5e5d86a20d4f2fe42 data/ars_nouveau/recipe/water_essence.json +// 1.21.1 2024-10-16T21:01:35.2873963 Imbuement +d8ef9562f603943cf768422fb009c9ec77d7dc65 data/ars_nouveau/recipe/imbuement_abjuration_essence.json +98efa28dfca47cd27a0e31e89208825c7e320e61 data/ars_nouveau/recipe/imbuement_air_essence.json +6d57a8685026b987a6012bb592cf26c3dba0e89c data/ars_nouveau/recipe/imbuement_amethyst.json +5bce1f0b9b92a9acdf9b856dfccd8ff4fb933c67 data/ars_nouveau/recipe/imbuement_amethyst_block.json +82af4f7ca94590a4c01cbc4e7ab7524f6b603ed9 data/ars_nouveau/recipe/imbuement_amplify_arrow.json +4b3e5edb67c9661e999ef3aa56b07330d78052c0 data/ars_nouveau/recipe/imbuement_conjuration_essence.json +71640142f8e3f340f1b4078e7a3e8fcbbbe232a9 data/ars_nouveau/recipe/imbuement_earth_essence.json +bb798f4b25b7a191edb246e9122dd5756c83fa7c data/ars_nouveau/recipe/imbuement_fire_essence.json +6ba22e7cf702e9be5ff66d6b28f62a61639679ce data/ars_nouveau/recipe/imbuement_lapis.json +7823618d4052b659f3cbb2036a28e098d263d5ae data/ars_nouveau/recipe/imbuement_manipulation_essence.json +4c1e38069e88502d94768dae302127da9f8efbfd data/ars_nouveau/recipe/imbuement_pierce_arrow.json +7103454e5168ee74e4e2363a76d8c94733b90433 data/ars_nouveau/recipe/imbuement_split_arrow.json +adbed7df2e908a20415400f5e5d86a20d4f2fe42 data/ars_nouveau/recipe/imbuement_water_essence.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/abjuration_essence.json b/src/generated/resources/data/ars_nouveau/recipe/imbuement_abjuration_essence.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipe/abjuration_essence.json rename to src/generated/resources/data/ars_nouveau/recipe/imbuement_abjuration_essence.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/air_essence.json b/src/generated/resources/data/ars_nouveau/recipe/imbuement_air_essence.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipe/air_essence.json rename to src/generated/resources/data/ars_nouveau/recipe/imbuement_air_essence.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/amethyst.json b/src/generated/resources/data/ars_nouveau/recipe/imbuement_amethyst.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipe/amethyst.json rename to src/generated/resources/data/ars_nouveau/recipe/imbuement_amethyst.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/amethyst_block.json b/src/generated/resources/data/ars_nouveau/recipe/imbuement_amethyst_block.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipe/amethyst_block.json rename to src/generated/resources/data/ars_nouveau/recipe/imbuement_amethyst_block.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/amplify_arrow.json b/src/generated/resources/data/ars_nouveau/recipe/imbuement_amplify_arrow.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipe/amplify_arrow.json rename to src/generated/resources/data/ars_nouveau/recipe/imbuement_amplify_arrow.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/conjuration_essence.json b/src/generated/resources/data/ars_nouveau/recipe/imbuement_conjuration_essence.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipe/conjuration_essence.json rename to src/generated/resources/data/ars_nouveau/recipe/imbuement_conjuration_essence.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/earth_essence.json b/src/generated/resources/data/ars_nouveau/recipe/imbuement_earth_essence.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipe/earth_essence.json rename to src/generated/resources/data/ars_nouveau/recipe/imbuement_earth_essence.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/fire_essence.json b/src/generated/resources/data/ars_nouveau/recipe/imbuement_fire_essence.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipe/fire_essence.json rename to src/generated/resources/data/ars_nouveau/recipe/imbuement_fire_essence.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/lapis.json b/src/generated/resources/data/ars_nouveau/recipe/imbuement_lapis.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipe/lapis.json rename to src/generated/resources/data/ars_nouveau/recipe/imbuement_lapis.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/manipulation_essence.json b/src/generated/resources/data/ars_nouveau/recipe/imbuement_manipulation_essence.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipe/manipulation_essence.json rename to src/generated/resources/data/ars_nouveau/recipe/imbuement_manipulation_essence.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/pierce_arrow.json b/src/generated/resources/data/ars_nouveau/recipe/imbuement_pierce_arrow.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipe/pierce_arrow.json rename to src/generated/resources/data/ars_nouveau/recipe/imbuement_pierce_arrow.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/split_arrow.json b/src/generated/resources/data/ars_nouveau/recipe/imbuement_split_arrow.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipe/split_arrow.json rename to src/generated/resources/data/ars_nouveau/recipe/imbuement_split_arrow.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/water_essence.json b/src/generated/resources/data/ars_nouveau/recipe/imbuement_water_essence.json similarity index 100% rename from src/generated/resources/data/ars_nouveau/recipe/water_essence.json rename to src/generated/resources/data/ars_nouveau/recipe/imbuement_water_essence.json diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ImbuementProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ImbuementProcessor.java index e7f411dd7f..f8f344c8d9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ImbuementProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/ImbuementProcessor.java @@ -31,9 +31,6 @@ public IVariable process(Level level, String key) { if (key.equals("reagent")) return IVariable.wrapList(Arrays.stream(recipe.input.getItems()).map(i -> IVariable.from(i, level.registryAccess())).collect(Collectors.toList()), level.registryAccess()); - if (key.equals("recipe")) { - return IVariable.wrap(recipe.id.toString(), level.registryAccess()); - } if (key.equals("output")) { return IVariable.from(recipe.output, level.registryAccess()); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java index f97ddefab0..5ddeafe10f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ImbuementRecipeProvider.java @@ -92,7 +92,7 @@ public void collectJsons(CachedOutput pOutput) { } private static Path getRecipePath(Path pathIn, String str) { - return pathIn.resolve("data/ars_nouveau/recipe/" + str + ".json"); + return pathIn.resolve("data/ars_nouveau/recipe/imbuement_" + str + ".json"); } @Override From 7bf1fc7d2ccf506ccc0784718d43dfd64e04adae Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 16 Oct 2024 21:06:28 -0500 Subject: [PATCH 205/363] Update supporters.json --- supporters.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/supporters.json b/supporters.json index eb1b2bdc5e..2fe5d2575e 100644 --- a/supporters.json +++ b/supporters.json @@ -475,7 +475,7 @@ },{ "name": "Astrael", "color": "black", - "adopter": "Kientcy", + "adopter": "Keintcy", "bio": "A mysterious but curious starbuncle, once loved by an archmage who got lost in time. Rumor says she was born among the stars, therefore her name." },{ "name": "Xollus", From be85c5af71499c8ac3a19a4a9102b4ca797976cf Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 16 Oct 2024 21:41:55 -0500 Subject: [PATCH 206/363] Add shard lore --- .../.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 ++-- .../resources/assets/ars_nouveau/lang/en_us.json | 4 ++++ .../arsnouveau/common/datagen/LangDatagen.java | 4 ++++ .../arsnouveau/common/items/StarbuncleShard.java | 2 ++ .../arsnouveau/setup/registry/ItemsRegistry.java | 8 +++++--- 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 0227e3a484..59c97e0730 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-09-30T16:56:16.5301547 Languages: en_us for mod: ars_nouveau -f0332c5cfbeb12762996145f066199f54adb0bd9 assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-10-16T21:39:22.7281395 Languages: en_us for mod: ars_nouveau +4ad3f78fda00732b90350580c4b85188a52f389f assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index b14d00d7a1..b2b1d216ad 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -1524,6 +1524,7 @@ "tooltip.ars_nouveau.wilden_tribute": "Obtained by defeating the Wilden Chimera. See Ritual of Summon Wilden.", "tooltip.ars_nouveau.wixie_hat": "Give to a Starbuncle to make them transport potions.", "tooltip.discount_item": "Reduce the cost of all spells by %d.", + "tooltip.drygmy_shard2": "A tribute to what once was.", "tooltip.item_scroll": "Use with an item in the offhand to add to the scroll, or scribe on the Scribes table.", "tooltip.magebloom": "Crafted using the Enchanting Apparatus", "tooltip.potion_flask": "Holds 8 charges of potion.", @@ -1532,11 +1533,14 @@ "tooltip.source_gem": "Obtained by placing lapis or amethyst in an Imbuement Chamber.", "tooltip.starbuncle_shades": "Using these on a Starbuncle will increase their coolness, but disable their ability to pickup items off the ground or pick Sourceberries.", "tooltip.starbuncle_shard": "Obtained by giving a wild Starbuncle a Gold Nugget.", + "tooltip.starbuncle_shard2": "Made with love.", "tooltip.whirlisprig_shard": "Obtained by growing a tree near a wild Whirlisprig.", + "tooltip.whirlisprig_shard2": "A natural portrait.", "tooltip.wilden_horn": "Drops from Wilden Pack Hunters found in Wilden Dens, or by using a Tablet of Summon Wilden.", "tooltip.wilden_spike": "Drops from Wilden Defenders, found in Wilden Dens in cold biomes, or by using a Tablet of Summon Wilden.", "tooltip.wilden_wing": "Drops from Wilden Stalkers found in Wilden Dens, or by using a Tablet of Summon Wilden.", "tooltip.wixie_shard": "Obtained by using Dispel on a witch while it is less than half health.", + "tooltip.wixie_shard2": "Let me out.", "tooltip.worn_notebook": "Documentation for Ars Nouveau", "whirlisprig.content": "The Whirlisprig seems content, but could be better.", "whirlisprig.diverse_enough": "There is some diversity, but could be better.", diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index f8a6e918bc..18d5e9d847 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -1305,6 +1305,10 @@ protected void addTranslations() { add("block.ars_nouveau.smooth_sourcestone_grate","Smooth Sourcestone Grate"); add("block.ars_nouveau.source_lamp", "Source Gem Lamp"); add("ars_nouveau.page1.source_lamp", "Behaves like a copper bulb, but the light and comparator values can be adjusted by casting Light with dampen."); + add("tooltip.starbuncle_shard2", "Made with love."); + add("tooltip.whirlisprig_shard2","A natural portrait."); + add("tooltip.drygmy_shard2","A tribute to what once was."); + add("tooltip.wixie_shard2", "Let me out."); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java index b7ccbe9857..c26ba2eb1c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StarbuncleShard.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.common.items.data.StarbuncleCharmData; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; @@ -16,6 +17,7 @@ public class StarbuncleShard extends ModItem{ public StarbuncleShard(){ super(); withTooltip(Component.translatable("tooltip.starbuncle_shard")); + withTooltip(Component.translatable("tooltip.starbuncle_shard2").withStyle(ItemsRegistry.LORE_STYLE)); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java index 586054a7ed..b9e4e7b102 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java @@ -46,6 +46,8 @@ import static com.hollingsworth.arsnouveau.ArsNouveau.MODID; public class ItemsRegistry { + + public static Style LORE_STYLE = Style.EMPTY.withColor(ChatFormatting.GRAY).withItalic(true); public static PerkItem BLANK_THREAD; public static FoodProperties SOURCE_BERRY_FOOD = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).effect(() -> new MobEffectInstance(ModPotions.MANA_REGEN_EFFECT, 100), 1.0f).alwaysEdible().build(); @@ -110,7 +112,7 @@ public int getManaRegenBonus(ItemStack i) { public static final ItemRegistryWrapper STARBUNCLE_SHARD = register(LibItemNames.STARBUNCLE_SHARDS, StarbuncleShard::new); public static final ItemRegistryWrapper STARBUNCLE_SHADES = register(LibItemNames.STARBUNCLE_SHADES, StarbuncleShades::new); public static final ItemRegistryWrapper WHIRLISPRIG_CHARM = register(LibItemNames.WHIRLISPRIG_CHARM, WhirlisprigCharm::new); - public static final ItemRegistryWrapper WHIRLISPRIG_SHARDS = register(LibItemNames.WHIRLISPRIG_SHARDS, () -> new ModItem().withTooltip(Component.translatable("tooltip.whirlisprig_shard"))); + public static final ItemRegistryWrapper WHIRLISPRIG_SHARDS = register(LibItemNames.WHIRLISPRIG_SHARDS, () -> new ModItem().withTooltip("tooltip.whirlisprig_shard").withTooltip(Component.translatable("tooltip.whirlisprig_shard2").withStyle(LORE_STYLE))); public static final ItemRegistryWrapper SOURCE_GEM = register(LibItemNames.SOURCE_GEM, () -> new ModItem().withTooltip(Component.translatable("tooltip.source_gem"))); public static final ItemRegistryWrapper ALLOW_ITEM_SCROLL = register(LibItemNames.ALLOW_ITEM_SCROLL, AllowItemScroll::new); public static final ItemRegistryWrapper DENY_ITEM_SCROLL = register(LibItemNames.DENY_ITEM_SCROLL, DenyItemScroll::new); @@ -119,7 +121,7 @@ public int getManaRegenBonus(ItemStack i) { public static final ItemRegistryWrapper WAND = register(LibItemNames.WAND, Wand::new); public static final ItemRegistryWrapper VOID_JAR = register(LibItemNames.VOID_JAR, VoidJar::new); public static final ItemRegistryWrapper WIXIE_CHARM = register(LibItemNames.WIXIE_CHARM, WixieCharm::new); - public static final ItemRegistryWrapper WIXIE_SHARD = register(LibItemNames.WIXIE_SHARD, () -> new ModItem().withTooltip(Component.translatable("tooltip.wixie_shard"))); + public static final ItemRegistryWrapper WIXIE_SHARD = register(LibItemNames.WIXIE_SHARD, () -> new ModItem().withTooltip(Component.translatable("tooltip.wixie_shard")).withTooltip(Component.translatable("tooltip.wixie_shard2").withStyle(ItemsRegistry.LORE_STYLE))); public static final ItemRegistryWrapper SPELL_BOW = register(LibItemNames.SPELL_BOW, SpellBow::new); public static final ItemRegistryWrapper AMPLIFY_ARROW = register(LibItemNames.AMPLIFY_ARROW, () -> new SpellArrow(AugmentAmplify.INSTANCE, 2)); public static final ItemRegistryWrapper SPLIT_ARROW = register(LibItemNames.SPLIT_ARROW, () -> new FormSpellArrow(AugmentSplit.INSTANCE, 2)); @@ -182,7 +184,7 @@ public int getValue() { public static final ItemRegistryWrapper ENCHANTERS_SHIELD = register(LibItemNames.ENCHANTERS_SHIELD, EnchantersShield::new); public static final ItemRegistryWrapper CASTER_TOME = register(LibItemNames.CASTER_TOME, CasterTome::new); public static final ItemRegistryWrapper DRYGMY_CHARM = register(LibItemNames.DRYGMY_CHARM, DrygmyCharm::new); - public static final ItemRegistryWrapper DRYGMY_SHARD = register(LibItemNames.DRYGMY_SHARD, () -> new ModItem().withTooltip(Component.translatable("tooltip.ars_nouveau.drygmy_shard"))); + public static final ItemRegistryWrapper DRYGMY_SHARD = register(LibItemNames.DRYGMY_SHARD, () -> new ModItem().withTooltip(Component.translatable("tooltip.ars_nouveau.drygmy_shard")). withTooltip(Component.translatable("tooltip.drygmy_shard2").withStyle(ItemsRegistry.LORE_STYLE))); public static final ItemRegistryWrapper WILDEN_TRIBUTE = register(LibItemNames.WILDEN_TRIBUTE, () -> new ModItem(defaultItemProperties().fireResistant()).withTooltip(Component.translatable("tooltip.ars_nouveau.wilden_tribute").withStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.BLUE))).withRarity(Rarity.EPIC)); public static final ItemRegistryWrapper SUMMONING_FOCUS = register(LibItemNames.SUMMON_FOCUS, SummoningFocus::new); public static final ItemRegistryWrapper SHAPERS_FOCUS = register(LibItemNames.SHAPERS_FOCUS, () -> new ShapersFocus(defaultItemProperties().stacksTo(1))); From ce59b77bc41c96a2a2f10c14289a6b09ea12e050 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 19 Oct 2024 11:42:09 -0500 Subject: [PATCH 207/363] feat: alakarkinos (#1389) crab --- .../103d9f3f36b01595f1aa5172191e60eff02e6924 | 3 +- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 +- .../5c9e5647706b386caccf0aef27efaa68965030b8 | 4 +- .../a4c3c262a85f6a179e7e29128e8b31d4da806803 | 6 +- .../a5922da861c7ee259705eec42cf3df986f0db576 | 3 +- .../d0c924a870929ce1baf161c329e85242236b3530 | 4 +- .../d784f732a4c9f307e882d11a0eb56178c990bc6f | 7 + .../e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 | 3 +- .../e7c243f38c2b0774b1bff1a90ede0b19a4077240 | 4 +- .../eac00f78ae0d33a31d4f208cb05939a004e6cb91 | 2 +- .../f0f2bcace349d412215f006e6183aa56b9316c3c | 3 +- .../blockstates/alakarkinos_hat.json | 7 + .../assets/ars_nouveau/lang/en_us.json | 17 +- .../models/item/alakarkinos_charm.json | 6 + .../models/item/alakarkinos_hat.json | 3 + .../models/item/alakarkinos_token.json | 6 + .../ars_nouveau/models/item/bubble.json | 6 + .../en_us/entries/automation/alakarkinos.json | 31 + .../en_us/entries/glyphs_1/bubble.json | 16 + .../biome_modifier/alakarkinos_spawn.json | 10 + .../recipe/alakarkinos/desert_pyramid.json | 6 + .../recipe/alakarkinos/desert_well.json | 6 + .../recipe/alakarkinos/ocean_ruins_cold.json | 6 + .../recipe/alakarkinos/ocean_ruins_warm.json | 6 + .../alakarkinos/trail_ruins_common.json | 6 + .../recipe/alakarkinos/trail_ruins_rare.json | 6 + .../ars_nouveau/recipe/alakarkinos_charm.json | 26 + .../data/ars_nouveau/recipe/bubble.json | 28 + .../tags/entity_type/magic_find.json | 3 +- .../ars_nouveau/tags/item/magic_shards.json | 3 +- .../hollingsworth/arsnouveau/ArsNouveau.java | 4 +- .../api/loot/DungeonLootTables.java | 7 +- .../AlakarkinosConversionRegistry.java | 54 ++ .../arsnouveau/api/util/SourceUtil.java | 7 +- .../client/particle/BubbleParticle.java | 51 ++ .../client/registry/ClientHandler.java | 4 + .../client/registry/ModParticles.java | 3 + .../client/registry/ShaderRegistry.java | 44 ++ .../renderer/entity/AlakarkinosModel.java | 36 ++ .../renderer/entity/BubbleRenderer.java | 78 +++ .../renderer/entity/RenderFlyingItem.java | 7 + .../arsnouveau/common/block/CrabHat.java | 35 ++ .../common/block/tile/WhirlisprigTile.java | 2 +- .../crafting/recipes/AlakarkinosRecipe.java | 63 ++ .../datagen/AlakarkinosRecipeProvider.java | 63 ++ .../datagen/ApparatusRecipeProvider.java | 2 + .../common/datagen/BlockStatesDatagen.java | 1 + .../common/datagen/EntityTagProvider.java | 3 +- .../common/datagen/GlyphRecipeProvider.java | 1 + .../common/datagen/ItemModelGenerator.java | 4 +- .../common/datagen/ItemTagProvider.java | 3 +- .../common/datagen/LangDatagen.java | 16 +- .../arsnouveau/common/datagen/ModDatagen.java | 1 + .../common/datagen/PatchouliProvider.java | 8 + .../common/datagen/WorldgenProvider.java | 4 + .../arsnouveau/common/entity/Alakarkinos.java | 444 +++++++++++++ .../common/entity/BubbleEntity.java | 192 ++++++ .../common/entity/EntityFlyingItem.java | 4 +- .../entity/goal/ConditionalLookAtMob.java | 35 ++ .../common/entity/goal/LookAtTarget.java | 39 ++ .../entity/goal/carbuncle/NonHoggingLook.java | 15 - .../entity/goal/carbuncle/StarbyBehavior.java | 2 +- .../alakarkinos/ConvertBlockState.java | 80 +++ .../statemachine/alakarkinos/CrabState.java | 38 ++ .../alakarkinos/DecideCrabActionState.java | 37 ++ .../alakarkinos/FindBlockState.java | 36 ++ .../statemachine/alakarkinos/GetHatState.java | 53 ++ .../alakarkinos/PlaceHatState.java | 82 +++ .../alakarkinos/SpawnLootState.java | 86 +++ .../arsnouveau/common/event/EventHandler.java | 1 + .../common/items/AlakarkinosCharm.java | 44 ++ .../arsnouveau/common/lib/LibBlockNames.java | 3 + .../arsnouveau/common/lib/LibEntityNames.java | 2 + .../arsnouveau/common/lib/LibItemNames.java | 2 + .../mixin/BrushableBlockEntityAccessor.java | 22 + .../common/spell/effect/EffectBubble.java | 50 ++ .../arsnouveau/setup/config/Config.java | 11 +- .../setup/registry/APIRegistry.java | 1 + .../setup/registry/BlockRegistry.java | 2 +- .../setup/registry/ItemsRegistry.java | 2 + .../setup/registry/ModEntities.java | 31 +- .../setup/registry/RecipeRegistry.java | 3 + src/main/resources/ars_nouveau.mixins.json | 1 + .../animations/alakarkinos.animation.json | 592 ++++++++++++++++++ .../ars_nouveau/geo/alakarkinos.geo.json | 381 +++++++++++ .../models/block/alakarkinos_hat.json | 87 +++ .../assets/ars_nouveau/particles/bubble.json | 5 + .../textures/block/alakarkinos_tophat.png | Bin 0 -> 979 bytes .../textures/entity/alakarkinos.png | Bin 0 -> 2755 bytes .../ars_nouveau/textures/entity/bubble.png | Bin 0 -> 167 bytes .../textures/entity/bubble_pop1.png | Bin 0 -> 148 bytes .../textures/entity/bubble_pop2.png | Bin 0 -> 117 bytes .../textures/entity/bubble_pop3.png | Bin 0 -> 138 bytes .../textures/entity/bubble_pop4.png | Bin 0 -> 103 bytes .../textures/entity/bubble_pop5.png | Bin 0 -> 104 bytes .../textures/item/alakarkinos_charm.png | Bin 0 -> 381 bytes .../textures/item/alakarkinos_token.png | Bin 0 -> 317 bytes .../ars_nouveau/textures/item/bubble.png | Bin 0 -> 480 bytes 98 files changed, 3063 insertions(+), 62 deletions(-) create mode 100644 src/generated/resources/.cache/d784f732a4c9f307e882d11a0eb56178c990bc6f create mode 100644 src/generated/resources/assets/ars_nouveau/blockstates/alakarkinos_hat.json create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/alakarkinos_charm.json create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/alakarkinos_hat.json create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/alakarkinos_token.json create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/bubble.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/alakarkinos.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/bubble.json create mode 100644 src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/alakarkinos_spawn.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/alakarkinos/desert_pyramid.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/alakarkinos/desert_well.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/alakarkinos/ocean_ruins_cold.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/alakarkinos/ocean_ruins_warm.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/alakarkinos/trail_ruins_common.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/alakarkinos/trail_ruins_rare.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/alakarkinos_charm.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/bubble.json create mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/registry/AlakarkinosConversionRegistry.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/particle/BubbleParticle.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AlakarkinosModel.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BubbleRenderer.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/block/CrabHat.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/AlakarkinosRecipe.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/datagen/AlakarkinosRecipeProvider.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/Alakarkinos.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/BubbleEntity.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/ConditionalLookAtMob.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/LookAtTarget.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/NonHoggingLook.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/ConvertBlockState.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/CrabState.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/DecideCrabActionState.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/FindBlockState.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/GetHatState.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/PlaceHatState.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/SpawnLootState.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/items/AlakarkinosCharm.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/mixin/BrushableBlockEntityAccessor.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java create mode 100644 src/main/resources/assets/ars_nouveau/animations/alakarkinos.animation.json create mode 100644 src/main/resources/assets/ars_nouveau/geo/alakarkinos.geo.json create mode 100644 src/main/resources/assets/ars_nouveau/models/block/alakarkinos_hat.json create mode 100644 src/main/resources/assets/ars_nouveau/particles/bubble.json create mode 100644 src/main/resources/assets/ars_nouveau/textures/block/alakarkinos_tophat.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/entity/alakarkinos.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/entity/bubble.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/entity/bubble_pop1.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/entity/bubble_pop2.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/entity/bubble_pop3.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/entity/bubble_pop4.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/entity/bubble_pop5.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/item/alakarkinos_charm.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/item/alakarkinos_token.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/item/bubble.png diff --git a/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 index 208ae85368..b0dcf1a939 100644 --- a/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 +++ b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 @@ -1,4 +1,5 @@ -// 1.21.1 2024-08-17T10:54:39.1843046 Registries +// 1.21.1 2024-10-13T12:06:56.1313344 Registries +e2ace9cd4c3d79ee5d08d9962a5852b61c97cbe7 data/ars_nouveau/neoforge/biome_modifier/alakarkinos_spawn.json 32a6b3988ea60702ed982c1c98ce98d780914ee6 data/ars_nouveau/neoforge/biome_modifier/common_source_berry.json 48f1ed52be8710f33085755655620cd53a9a6705 data/ars_nouveau/neoforge/biome_modifier/drygmy_spawn.json e91a5b67459e7010b9d1a4352ce270b6d1c14d24 data/ars_nouveau/neoforge/biome_modifier/gift_starbuncle_spawn.json diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 59c97e0730..873003be35 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-10-16T21:39:22.7281395 Languages: en_us for mod: ars_nouveau -4ad3f78fda00732b90350580c4b85188a52f389f assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-10-19T11:29:05.7106388 Languages: en_us for mod: ars_nouveau +1f7d257f71563f0101788e6091ba2aca24204ee5 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 b/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 index 2811207f54..b6ef7d04b4 100644 --- a/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 +++ b/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 @@ -1,8 +1,8 @@ -// 1.21.1 2024-09-07T14:19:18.6385251 Tags for minecraft:item mod id ars_nouveau +// 1.21.1 2024-10-19T10:39:38.2477422 Tags for minecraft:item mod id ars_nouveau bde6ca31173d1f22d5f6fe355dc90c9faa35b239 data/ars_nouveau/tags/item/golem/shard.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/item/interact_jar_blacklist.json a0800fbffa0e00aecb2e86a1e991d42904427191 data/ars_nouveau/tags/item/magic_food.json -1781e2e03328482696e713943d129953a77de05c data/ars_nouveau/tags/item/magic_shards.json +779589c2173e840c19bb1975f746a3e6a407e968 data/ars_nouveau/tags/item/magic_shards.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/item/ritual_loot_blacklist.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/item/ritual_trade_blacklist.json 2bea9b95ffd91ffd3ad204aab2644fae06731943 data/ars_nouveau/tags/item/shady_wizard_fruits.json diff --git a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 index 4babd00a4a..5fe7e485b8 100644 --- a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 +++ b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 @@ -1,5 +1,8 @@ -// 1.21.1 2024-09-24T20:09:13.9792381 Ars Nouveau Item Models +// 1.21.1 2024-09-28T20:07:13.4881389 Ars Nouveau Item Models 11ee554b11a3a830e89b742762e5b754c2ecb5ee assets/ars_nouveau/models/item/agronomic_sourcelink.json +20a434b964b88bc010c17e0616f2c2601b53479d assets/ars_nouveau/models/item/alakarkinos_charm.json +533b61aabca43719a266cddda3b7ec426135e5e6 assets/ars_nouveau/models/item/alakarkinos_hat.json +cf5f914263c22eabc17be749ade10e9d64736851 assets/ars_nouveau/models/item/alakarkinos_token.json 339a05323ebef7efc5c70db708a2e7a24708e9bc assets/ars_nouveau/models/item/alchemical_sourcelink.json a0214090201827dd5f954d0b33e64e4df6e53764 assets/ars_nouveau/models/item/alchemists_crown.json 8587f05b17902c512f27c3eecf7a1a6319709f51 assets/ars_nouveau/models/item/archwood_grate.json @@ -8,6 +11,7 @@ f9eb0905e283cab647712716770a244a1bdb25f0 assets/ars_nouveau/models/item/bastion_ 84bdd95fc8506c6d9054e5ffb87c24c20b2ae628 assets/ars_nouveau/models/item/blank_thread.json a81ea25c1312389ff436100c29d1ae20d35b0a40 assets/ars_nouveau/models/item/blue_sbed.json 3b7dc3023a667efe5ff64cb937ee25047a853697 assets/ars_nouveau/models/item/bombegranate_pod.json +86e2436793db61ff59fd3404138dc41d98dd94f3 assets/ars_nouveau/models/item/bubble.json 23781f068b9b788d0077a478b0470af583d759f5 assets/ars_nouveau/models/item/experience_gem.json 70d392c53a05ad554f3f3b1d3faa5fd1445e2a77 assets/ars_nouveau/models/item/falseweave.json 5f620c31cc6d4f1a569dbd943e5a45e75217303a assets/ars_nouveau/models/item/familiar_amethyst_golem.json diff --git a/src/generated/resources/.cache/a5922da861c7ee259705eec42cf3df986f0db576 b/src/generated/resources/.cache/a5922da861c7ee259705eec42cf3df986f0db576 index 4d53dd3c60..e344cec387 100644 --- a/src/generated/resources/.cache/a5922da861c7ee259705eec42cf3df986f0db576 +++ b/src/generated/resources/.cache/a5922da861c7ee259705eec42cf3df986f0db576 @@ -1,5 +1,6 @@ -// 1.21.1 2024-08-17T10:54:39.1753084 Block States: ars_nouveau +// 1.21.1 2024-09-27T19:20:30.6753948 Block States: ars_nouveau 1b2e60c29cbc9cba57df1e1d0fd9b6f5394b7980 assets/ars_nouveau/blockstates/agronomic_sourcelink.json +d445d0443f46e8aade3134187d121e73d66b8568 assets/ars_nouveau/blockstates/alakarkinos_hat.json ca9e60aa92a8af0ebf19eb2abd29e68574574b75 assets/ars_nouveau/blockstates/alchemical_sourcelink.json 638796836b1f117aedad8d79ecec507b605c60d3 assets/ars_nouveau/blockstates/archwood_door.json 09093623f66766be51fb83bf905f5fe9328245bd assets/ars_nouveau/blockstates/blue_sbed.json diff --git a/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 b/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 index 3718d86c7c..45c272e905 100644 --- a/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 +++ b/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 @@ -1,4 +1,4 @@ -// 1.21.1 2024-08-24T11:55:28.4351257 Tags for minecraft:entity_type mod id ars_nouveau +// 1.21.1 2024-10-13T12:06:56.1303326 Tags for minecraft:entity_type mod id ars_nouveau 4d0235b95823f5d315aae7e9f9e484cbde8294a0 data/ars_nouveau/tags/entity_type/animal_summon_blacklist.json a958530eef4b0d5ac2f1c7bd552b60e23cb66d9a data/ars_nouveau/tags/entity_type/an_hostile.json 290c285b1e334d322b8d070b2c6a071114b1d70c data/ars_nouveau/tags/entity_type/berry_blacklist.json @@ -10,7 +10,7 @@ a958530eef4b0d5ac2f1c7bd552b60e23cb66d9a data/ars_nouveau/tags/entity_type/an_ho e00f2931577049b9a4400a87ed9c249373be376c data/ars_nouveau/tags/entity_type/jar_release_blacklist.json 81129e21b3ae9fc2579ae17d4c228b76271a2b4d data/ars_nouveau/tags/entity_type/jar_whitelist.json 6ea663c420f871864a11d18e9448d602520eeff9 data/ars_nouveau/tags/entity_type/lingering_blacklist.json -84573a969de7731afa84f6a69831eb283c565ba5 data/ars_nouveau/tags/entity_type/magic_find.json +a8425355e51f2ea7ed823f1214e5f785f5f4ebc4 data/ars_nouveau/tags/entity_type/magic_find.json 86a469d8e9ee317a1ca5b93bfed0be34ff5b0d89 data/ars_nouveau/tags/entity_type/rewind_blacklist.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_type/spell_can_hit.json ac003d93bbb50df3d9d0d7bf1561a9b274c4e65b data/c/tags/entity_type/bosses.json diff --git a/src/generated/resources/.cache/d784f732a4c9f307e882d11a0eb56178c990bc6f b/src/generated/resources/.cache/d784f732a4c9f307e882d11a0eb56178c990bc6f new file mode 100644 index 0000000000..4ceb8c8f24 --- /dev/null +++ b/src/generated/resources/.cache/d784f732a4c9f307e882d11a0eb56178c990bc6f @@ -0,0 +1,7 @@ +// 1.21.1 2024-09-28T13:26:15.7514484 Alakarkinos Recipe Datagen +c9b4aad4995335ec8b522c2c100de2e2fa349ca1 data/ars_nouveau/recipe/alakarkinos/desert_pyramid.json +f4f6bc699a6ece68a4258f1debce219b4c214c3a data/ars_nouveau/recipe/alakarkinos/desert_well.json +30b79d6af39f4d9ab774eda8ccb9e760e6f6a01f data/ars_nouveau/recipe/alakarkinos/ocean_ruins_cold.json +9e727c69faf9cb5269b27d461c7297ec4f20b2f2 data/ars_nouveau/recipe/alakarkinos/ocean_ruins_warm.json +94a24483e65ad4cf60804e547e63315f010c5654 data/ars_nouveau/recipe/alakarkinos/trail_ruins_common.json +d09af4789c436c1146b80db150a4172b63bfd57f data/ars_nouveau/recipe/alakarkinos/trail_ruins_rare.json diff --git a/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 b/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 index 9b39f844f2..8d96951aae 100644 --- a/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 +++ b/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 @@ -1,4 +1,5 @@ -// 1.21.1 2024-08-17T10:54:39.185609 Apparatus +// 1.21.1 2024-10-15T18:07:37.2635734 Apparatus +54b2918a0b959ae3e055dae2681322a8800177a2 data/ars_nouveau/recipe/alakarkinos_charm.json adc3e3b582ab4d1fd6f29537bddaaecb9eaa0c2d data/ars_nouveau/recipe/alchemists_crown.json 9a7fefa487b159935c1f620dc9516a6600fb0d4b data/ars_nouveau/recipe/amulet_of_mana_boost.json a653f866167b0fd7d0f7ded2166d45a2ff104d0d data/ars_nouveau/recipe/amulet_of_mana_regen.json diff --git a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 index f589a28313..3e13c3f6a2 100644 --- a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 +++ b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 @@ -1,4 +1,4 @@ -// 1.21.1 2024-09-24T20:09:13.9852472 Patchouli +// 1.21.1 2024-10-15T16:00:11.9296346 Patchouli 2ec536fea831588201432d61d70af61385882054 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/alteration_table.json a82f4fc73946d228b1e3f5e03d0ecef46f33cdfb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/applying_perks.json 8ce1d8e886b45066bc5c1d9d8e87bdabbb27ae27 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor.json @@ -22,6 +22,7 @@ d18984196578c97c968118f1fe6398cb683c292e assets/ars_nouveau/patchouli_books/worn d9e621409981d50547758d2106d4d1d368823389 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_warding.json 9eb1a48929505b0957ea3192aeb875d716e30510 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_whirlisprig.json 8a65d3abee43b8131b8c43d46caa1f5f66123045 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_wixie.json +fb9740b10cd620065f1dcd9792cb664d57d237a2 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/alakarkinos.json c365b920481cbe283c09f7b26cc070b6eb422cf9 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/allow_scroll.json 4cd0f67b4702dff32f62ee6f45270a62985674ae assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/amethyst_golem_charm.json c7d187c5baed53c4ddb63b6b6dc9ec9847c21a45 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/deny_scroll.json @@ -89,6 +90,7 @@ a09f89d0ec927fce49d1736c39305bcfeac052cf assets/ars_nouveau/patchouli_books/worn 81fcf49cd2e09ae38f0105066a60dd0c996a8146 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/trinkets.json 877210c24dbbaf4e365c30c8ba571cf2708e7d03 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/upgrades.json 521277fbf32424a30a8be24b137c786dc0b89cdc assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/world_generation.json +32d9a6742c501ca01e1869196a915199b74b153d assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/bubble.json a80d0aabd3eff91451b0e80fb34514c5ce57eadf assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_amplify.json e6a01dcd171d462c0eb988478f64f994c63180f0 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_bounce.json 7d579e642d5c9a7c5dba516e1eadca7d87f9ad56 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_break.json diff --git a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 index 0d2ce3f9ae..000c86593f 100644 --- a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 +++ b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 @@ -1,4 +1,4 @@ -// 1.21.1 2024-09-08T11:38:02.5194984 AN tags +// 1.21.1 2024-09-28T13:26:15.7534788 AN tags 939cde8f97e4e8d7ea8445415522f703b2b927d4 data/ars_nouveau/tags/block/an_decorative.json de95bc21249101b079255a1a00274f60d55e0602 data/ars_nouveau/tags/block/blazing_logs.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/block/break_blacklist.json diff --git a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c index 55a007d64c..327bf8cd24 100644 --- a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c +++ b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c @@ -1,4 +1,5 @@ -// 1.21.1 2024-09-24T20:47:30.7198603 Glyph Recipes +// 1.21.1 2024-10-15T18:07:37.2585715 Glyph Recipes +6c563826d1fe155941d93be36f12ec651e3043f0 data/ars_nouveau/recipe/bubble.json 231d9f126c606465601e36e83948dda99a508834 data/ars_nouveau/recipe/glyph_accelerate.json dbad772acd31382cfcf19c7f276da5f91354dfcf data/ars_nouveau/recipe/glyph_amplify.json 1a8499b67d1ce8614ef1d420106d32d27567eeb9 data/ars_nouveau/recipe/glyph_animate_block.json diff --git a/src/generated/resources/assets/ars_nouveau/blockstates/alakarkinos_hat.json b/src/generated/resources/assets/ars_nouveau/blockstates/alakarkinos_hat.json new file mode 100644 index 0000000000..1079cb4591 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/blockstates/alakarkinos_hat.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "ars_nouveau:block/alakarkinos_hat" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index b2b1d216ad..e3ea8acf98 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -212,6 +212,7 @@ "ars_nouveau.getting_started": "Getting Started", "ars_nouveau.getting_started_desc": "An introduction to Ars Nouveau. It is recommended to follow each section in order.", "ars_nouveau.glyph_crafting": "Glyph Crafting", + "ars_nouveau.glyph_desc.bubble": "", "ars_nouveau.glyph_desc.glyph_accelerate": "Increases the speed of projectile spells.", "ars_nouveau.glyph_desc.glyph_amplify": "Additively increases the power of most spell effects. Can increase the harvest level of Break and increases the damage of spells.", "ars_nouveau.glyph_desc.glyph_animate_block": "Animates a block to fight for you. The animated block will convert to a falling block when it dies. Costs a large amount of mana, but does not grant Summoning Sickness", @@ -294,6 +295,7 @@ "ars_nouveau.glyph_desc.reset": "Resets the spell chain to the original target if it was changed by a previous effect. For example, Burst -> Place Block -> Reset -> Break will cause Burst to place blocks, but only Break will apply to the original location. As a result, using Reset will allow you to bypass combination and duplicate limits on glyphs.", "ars_nouveau.glyph_desc.rewind": "Rewinds an entity back in time to its previous locations and health. Can revert blocks that were moved with spells back into solid blocks. Glyphs that come after Rewind will be cast at the end of the rewind, as if they were Delayed.", "ars_nouveau.glyph_desc.wololo": "Changes the color of an entity or compatible block to the color of the spell.", + "ars_nouveau.glyph_name.bubble": "Captures mobs and entities it touches, causing them to float upwards. If the bubble has been alive for at least one tick, damaging the entity trapped in the bubble will cause it to pop, dealing bonus damage to the entity inside. Extend time and amplify can be used to increase the duration and damage of the bubble.", "ars_nouveau.glyph_name.glyph_accelerate": "Accelerate", "ars_nouveau.glyph_name.glyph_amplify": "Amplify", "ars_nouveau.glyph_name.glyph_animate_block": "Animate Block", @@ -522,6 +524,7 @@ "ars_nouveau.page.wilden": "Wilden", "ars_nouveau.page.wixie_hat": "Allows starbuncles to transport potions. Once wearing a Wixie Hat, use the Dominion Wand to connect them between Potion Jars.", "ars_nouveau.page.world_generation": "World Generation", + "ars_nouveau.page1.alakarkinos_charm": "Alakarkinos can sift sand and gravel to find items found in archaeology sites. They can be found on beaches and will give you a token if they receive a Pottery Sherd of any kind.", "ars_nouveau.page1.allow_scroll": "Provides a list of items to automation related entities. To inscribe an item, place on the Scribes Table and use blocks and items on the table while sneaking. When given to a Starbuncle, the Starbuncle will only pickup and take items on the scroll.", "ars_nouveau.page1.alteration_table": "Used to inscribe Threads onto magical armors. To use the table, place armor onto the stand of the table. The tablet will display the available Thread Slots on the armor. To add or remove a Thread, use the thread on the tablet of the table. Removing the armor will apply the threads to the armor. To remove a thread, place the armor on the table and interact with the display with an empty hand.", "ars_nouveau.page1.amethyst_golem_charm": "Amethyst Golems will harvest, grow, and collect Amethyst near its home. To obtain an Amethyst Golem, perform the Ritual of Awakening near Budding Amethyst to obtain the Amethyst Golem Charm.", @@ -582,6 +585,7 @@ "ars_nouveau.page1.wilden": "Wilden are hostile creatures that can be commonly found at night around Wilden Dens. While Wilden Defenders may only be found in cold biomes, Stalker and Hunter Dens can be found in any forest biome.", "ars_nouveau.page1.wixie_charm": "A Wixie can automatically craft items for you at the expense of source. To obtain a Wixie Token, cast Dispel on a Witch while it is half health or less. Once you have obtained a Wixie Charm, use it on a Cauldron to summon your Wixie. A Wixie can be dyed Red, White, Black, Blue, or Green.", "ars_nouveau.page1.world_generation": "Several resources can spawn in the world, each with their own magical properties. Archwood trees come in several decorative variants and may be used to craft Casting Wands. Source Berries, found in Taigas, are essential for crafting Mana Regeneration potions.", + "ars_nouveau.page2.alakarkinos_charm": "Loves to dance to nearby jukeboxes.", "ars_nouveau.page2.amethyst_golem_charm": "", "ars_nouveau.page2.applying_perks": "Threads only apply a single time on an entire armor set, and they do not stack. For more information on applying threads, see the Alteration Table.", "ars_nouveau.page2.armor_upgrading": "Armor also has three tiers, and these tiers may be increased using the Enchanting Apparatus and the upgrade recipes found in this section. Each tier will increase the amount of mana regen the armor grants, and increases the number and size of the slots of the armor.", @@ -608,6 +612,7 @@ "ars_nouveau.page2.weald_walker": "Casts Flare at nearby enemies, careful not to ignite any blocks in the process.", "ars_nouveau.page2.whirlisprig_charm": "Whirlisprigs will follow animals, players, and monsters! They will also grow grass around them every once and a while.", "ars_nouveau.page2.wixie_charm": "To select an item for crafting, use your item or block on the Wixie Cauldron.", + "ars_nouveau.page3.alakarkinos_charm": "Alakarkinos can be summoned anywhere by using a charm on a block. To set its home, use the Dominion Wand to bind Alakarkinos to a chest or inventory.", "ars_nouveau.page3.amethyst_golem_charm": "Summon the Amethyst Golem by using a charm on a block. Before an Amethyst Golem will perform tasks, they must first have a home. Set their home by using the Dominion Wand on the golem, and then on a block. The golem's home is considered to be 10 blocks in any direction from the set position.", "ars_nouveau.page3.basic_spell_turret": "Timer Spell Turrets will automatically fire on a timer. Defaulted to 1 second, the time may be increased by right-clicking the block. Punching will decrease the time. Sneaking will allow you to configure it in 10 second intervals. To prevent further changes, lock and unlock the turret using the dominion wand. Setting the turret to 0 seconds or providing a redstone signal will disable it. Casts Projectile, Touch, and Redstone for free.", "ars_nouveau.page3.drygmy_charm": "To summon a Drygmy, use a Drymy Charm on a block of Mossy Cobblestone. After a short time, the cobblestone will transform into a Drygmy Henge and summon your Drgymy! To summon additional drygmys, use more charms on the henge. Casting dispel or killing the Drygmy will return your charm.", @@ -625,6 +630,7 @@ "ars_nouveau.page3.whirlisprig_charm": "To summon a Whirlisprig, use a Whirlisprig charm on any flower. Whirlisprigs consider their home to be 10 blocks in any direction from the flower. Whirlisprigs require source nearby to operate, and will only generate items if there is a chest placed next to the flower. You can get your charm back by using Dispel on a Whirlisprig. They may be given orange, yellow, white, or green dye.", "ars_nouveau.page3.wilden": "An aggressive and fast hunter that can summon allied wolves.", "ars_nouveau.page3.wixie_charm": "The Wixie will select the recipe for crafting based on the inventories nearby, you need not specify the exact materials for the recipe. For example, if you want to craft Sticks, the Wixie will mix and match planks from nearby chests in order to fulfill the recipe. Each craft requires a small amount of source and will be drained from nearby Source Jars. A redstone signal on the cauldron will stop crafting.", + "ars_nouveau.page4.alakarkinos_charm": "Alakarkinos will seek out gravel or sand that is placed within 3 blocks horizontal and one block vertical around its bound inventory. In order to convert blocks into items, Source must be provided near its chest. After some time and a few magic tricks, Alakarkinos will destroy the sand or gravel and insert items into the inventory.", "ars_nouveau.page4.amethyst_golem_charm": "Once a home has been set, the golem will begin performing tasks over time. They will convert Amethyst Blocks into Budding Amethyst, harvest Amethyst Clusters, speed up Budding Amethyst growth, and pick up and store Amethyst Shards.", "ars_nouveau.page4.basic_spell_turret": "Turrets can provide compact and efficient automation. Examples include: configurable redstone clocks, one block tree or crop farms, rapid smelting with fortune, or mob farms with looting.", "ars_nouveau.page4.drygmy_charm": "A Drygmy considers its home to be 10 blocks in every direction from its home. The drygmy will use this area to produce items from any entities nearby. Your drgymy's efficiency is dependent on its happiness. This may be increased for each entity nearby, with a bonus for each unique type in its home. Nearby Containment Jars will also count as an entity.", @@ -785,6 +791,7 @@ "ars_nouveau.shapers_focus.entities": "Entity Targeting", "ars_nouveau.shapers_focus.examples": "Spell Examples", "ars_nouveau.shapers_focus.tooltip": "Can be used to create a block.", + "ars_nouveau.sifting": "Sifting", "ars_nouveau.sound.default_family": "Default", "ars_nouveau.sound.empty": "No Sound", "ars_nouveau.sound.fire_family": "Fire Family", @@ -947,11 +954,13 @@ "ars_nouveau.wixie_cauldron.cleared": "Bound inventories cleared.", "ars_nouveau.wixie_cauldron.removed": "Inventory removed.", "ars_nouveau.wixie_familiar.applied": "Wixie applies %s", + "ars_novueau.alakarkinos.set_home": "Home set. Place source and gravel or sand within 3 blocks.", "arsnouveau.debug.log_created": "Log file created: %s", "attribute.name.ars_nouveau.mana_regen": "Mana Regeneration", "attribute.name.ars_nouveau.max_mana": "Max Mana", "biome.ars_nouveau.archwood_forest": "Archwood Forest", "block.ars_nouveau.agronomic_sourcelink": "Agronomic Sourcelink", + "block.ars_nouveau.alakarkinos_hat": "Alakarkinos Hat", "block.ars_nouveau.alchemical_sourcelink": "Alchemical Sourcelink", "block.ars_nouveau.alteration_table": "Alteration Table", "block.ars_nouveau.arcane_core": "Arcane Core", @@ -1165,6 +1174,7 @@ "enchantment.ars_nouveau.mana_regen.desc": "Increases the mana regeneration of the player.", "enchantment.ars_nouveau.reactive": "Reactive", "enchantment.ars_nouveau.reactive.desc": "Has a chance to cast the inscribed spell on tool use or player hurt.", + "entity.ars_nouveau.alakarkinos": "Alakarkinos", "entity.ars_nouveau.ally_vex": "Summoned Vex", "entity.ars_nouveau.amethyst_golem": "Amethyst Golem", "entity.ars_nouveau.an_lightning": "Lightning", @@ -1173,6 +1183,7 @@ "entity.ars_nouveau.arcing_spell_proj": "Arc Spell Projectile", "entity.ars_nouveau.blazing_weald_walker": "Blazing Weald Walker", "entity.ars_nouveau.bookwyrm": "Bookwyrm", + "entity.ars_nouveau.bubble": "Bubble", "entity.ars_nouveau.cascading_weald_walker": "Cascading Weald Walker", "entity.ars_nouveau.drygmy": "Drygmy", "entity.ars_nouveau.dummy": "Dummy", @@ -1215,6 +1226,8 @@ "entity.minecraft.villager.shady_wizard": "Shady Wizard", "item.ars_nouveau.abjuration_essence": "Abjuration Essence", "item.ars_nouveau.air_essence": "Air Essence", + "item.ars_nouveau.alakarkinos_charm": "Alakarkinos Charm", + "item.ars_nouveau.alakarkinos_token": "Alakarkinos Token", "item.ars_nouveau.alchemists_crown": "Alchemist's Crown", "item.ars_nouveau.allow_scroll": "Item Scroll: Allow", "item.ars_nouveau.amethyst_golem_charm": "Amethyst Golem Charm", @@ -1489,6 +1502,8 @@ "overworld.minecraft.name": "Overworld", "the_end.minecraft.name": "The End", "the_nether.minecraft.name": "The Nether", + "tooltip.alakarkinos_shard1": "Found by giving an Alakarkinos a Sherd.", + "tooltip.alakarkinos_shard2": "What's that behind your ear?", "tooltip.ars_nouveau.alchemists_crown": "", "tooltip.ars_nouveau.amethyst_charm": "Obtained by performing the Ritual of Awakening near Budding Amethyst", "tooltip.ars_nouveau.amount": "Total: %s", @@ -1540,7 +1555,7 @@ "tooltip.wilden_spike": "Drops from Wilden Defenders, found in Wilden Dens in cold biomes, or by using a Tablet of Summon Wilden.", "tooltip.wilden_wing": "Drops from Wilden Stalkers found in Wilden Dens, or by using a Tablet of Summon Wilden.", "tooltip.wixie_shard": "Obtained by using Dispel on a witch while it is less than half health.", - "tooltip.wixie_shard2": "Let me out.", + "tooltip.wixie_shard2": "Knowledge for freedom.", "tooltip.worn_notebook": "Documentation for Ars Nouveau", "whirlisprig.content": "The Whirlisprig seems content, but could be better.", "whirlisprig.diverse_enough": "There is some diversity, but could be better.", diff --git a/src/generated/resources/assets/ars_nouveau/models/item/alakarkinos_charm.json b/src/generated/resources/assets/ars_nouveau/models/item/alakarkinos_charm.json new file mode 100644 index 0000000000..da4b8f6b03 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/alakarkinos_charm.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ars_nouveau:item/alakarkinos_charm" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/models/item/alakarkinos_hat.json b/src/generated/resources/assets/ars_nouveau/models/item/alakarkinos_hat.json new file mode 100644 index 0000000000..70248c184c --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/alakarkinos_hat.json @@ -0,0 +1,3 @@ +{ + "parent": "ars_nouveau:block/alakarkinos_hat" +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/models/item/alakarkinos_token.json b/src/generated/resources/assets/ars_nouveau/models/item/alakarkinos_token.json new file mode 100644 index 0000000000..aba87c8df2 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/alakarkinos_token.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ars_nouveau:item/alakarkinos_token" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/models/item/bubble.json b/src/generated/resources/assets/ars_nouveau/models/item/bubble.json new file mode 100644 index 0000000000..9a0ab8a7d1 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/bubble.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ars_nouveau:item/bubble" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/alakarkinos.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/alakarkinos.json new file mode 100644 index 0000000000..692d4bd4ec --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/alakarkinos.json @@ -0,0 +1,31 @@ +{ + "category": "ars_nouveau:automation", + "icon": "ars_nouveau:alakarkinos_charm", + "name": "item.ars_nouveau.alakarkinos_charm", + "pages": [ + { + "type": "patchouli:text", + "text": "ars_nouveau.page1.alakarkinos_charm" + }, + { + "type": "ars_nouveau:apparatus_recipe", + "recipe": "ars_nouveau:alakarkinos_charm" + }, + { + "type": "patchouli:entity", + "entity": "ars_nouveau:alakarkinos", + "scale": 0.25, + "text": "ars_nouveau.page2.alakarkinos_charm" + }, + { + "type": "patchouli:text", + "text": "ars_nouveau.page3.alakarkinos_charm", + "title": "ars_nouveau.summoning" + }, + { + "type": "patchouli:text", + "text": "ars_nouveau.page4.alakarkinos_charm", + "title": "ars_nouveau.sifting" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/bubble.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/bubble.json new file mode 100644 index 0000000000..9838325ec2 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/bubble.json @@ -0,0 +1,16 @@ +{ + "category": "ars_nouveau:glyphs_1", + "icon": "ars_nouveau:bubble", + "name": "ars_nouveau.glyph_name.bubble", + "pages": [ + { + "type": "patchouli:text", + "text": "ars_nouveau.glyph_desc.bubble" + }, + { + "type": "ars_nouveau:glyph_recipe", + "recipe": "ars_nouveau:bubble" + } + ], + "sortnum": 2 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/alakarkinos_spawn.json b/src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/alakarkinos_spawn.json new file mode 100644 index 0000000000..fa1e0fc288 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/neoforge/biome_modifier/alakarkinos_spawn.json @@ -0,0 +1,10 @@ +{ + "type": "neoforge:add_spawns", + "biomes": "#minecraft:is_beach", + "spawners": { + "type": "ars_nouveau:alakarkinos", + "maxCount": 1, + "minCount": 1, + "weight": 5 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/desert_pyramid.json b/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/desert_pyramid.json new file mode 100644 index 0000000000..757f681735 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/desert_pyramid.json @@ -0,0 +1,6 @@ +{ + "type": "ars_nouveau:alakarkinos_conversion", + "input": "minecraft:sand", + "table": "minecraft:archaeology/desert_pyramid", + "weight": 25 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/desert_well.json b/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/desert_well.json new file mode 100644 index 0000000000..d666a772fc --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/desert_well.json @@ -0,0 +1,6 @@ +{ + "type": "ars_nouveau:alakarkinos_conversion", + "input": "minecraft:sand", + "table": "minecraft:archaeology/desert_well", + "weight": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/ocean_ruins_cold.json b/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/ocean_ruins_cold.json new file mode 100644 index 0000000000..969602fbb0 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/ocean_ruins_cold.json @@ -0,0 +1,6 @@ +{ + "type": "ars_nouveau:alakarkinos_conversion", + "input": "minecraft:gravel", + "table": "minecraft:archaeology/ocean_ruin_warm", + "weight": 25 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/ocean_ruins_warm.json b/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/ocean_ruins_warm.json new file mode 100644 index 0000000000..24ed9a8a07 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/ocean_ruins_warm.json @@ -0,0 +1,6 @@ +{ + "type": "ars_nouveau:alakarkinos_conversion", + "input": "minecraft:sand", + "table": "minecraft:archaeology/ocean_ruin_warm", + "weight": 25 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/trail_ruins_common.json b/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/trail_ruins_common.json new file mode 100644 index 0000000000..1373671032 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/trail_ruins_common.json @@ -0,0 +1,6 @@ +{ + "type": "ars_nouveau:alakarkinos_conversion", + "input": "minecraft:gravel", + "table": "minecraft:archaeology/trail_ruins_common", + "weight": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/trail_ruins_rare.json b/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/trail_ruins_rare.json new file mode 100644 index 0000000000..70e0f431cf --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/trail_ruins_rare.json @@ -0,0 +1,6 @@ +{ + "type": "ars_nouveau:alakarkinos_conversion", + "input": "minecraft:gravel", + "table": "minecraft:archaeology/trail_ruins_rare", + "weight": 25 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/alakarkinos_charm.json b/src/generated/resources/data/ars_nouveau/recipe/alakarkinos_charm.json new file mode 100644 index 0000000000..9a8da0b7d2 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/alakarkinos_charm.json @@ -0,0 +1,26 @@ +{ + "type": "ars_nouveau:enchanting_apparatus", + "keepNbtOfReagent": false, + "pedestalItems": [ + { + "item": "minecraft:brush" + }, + { + "tag": "minecraft:decorated_pot_sherds" + }, + { + "tag": "minecraft:decorated_pot_sherds" + }, + { + "tag": "minecraft:decorated_pot_sherds" + } + ], + "reagent": { + "item": "ars_nouveau:alakarkinos_token" + }, + "result": { + "count": 1, + "id": "ars_nouveau:alakarkinos_charm" + }, + "sourceCost": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/bubble.json b/src/generated/resources/data/ars_nouveau/recipe/bubble.json new file mode 100644 index 0000000000..4b4c14dad6 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/bubble.json @@ -0,0 +1,28 @@ +{ + "type": "ars_nouveau:glyph", + "exp": 27, + "inputs": [ + { + "tag": "c:feathers" + }, + { + "tag": "c:feathers" + }, + { + "tag": "c:feathers" + }, + { + "item": "minecraft:water_bucket" + }, + { + "tag": "minecraft:boats" + }, + { + "item": "ars_nouveau:water_essence" + } + ], + "output": { + "count": 1, + "id": "ars_nouveau:bubble" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_type/magic_find.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/magic_find.json index ab7ae1f8f3..0fe906b9ae 100644 --- a/src/generated/resources/data/ars_nouveau/tags/entity_type/magic_find.json +++ b/src/generated/resources/data/ars_nouveau/tags/entity_type/magic_find.json @@ -9,6 +9,7 @@ "ars_nouveau:wilden_guardian", "ars_nouveau:wilden_boss", "ars_nouveau:wilden_stalker", - "ars_nouveau:wilden_hunter" + "ars_nouveau:wilden_hunter", + "ars_nouveau:alakarkinos" ] } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/tags/item/magic_shards.json b/src/generated/resources/data/ars_nouveau/tags/item/magic_shards.json index ec61f73fb1..390aa2039e 100644 --- a/src/generated/resources/data/ars_nouveau/tags/item/magic_shards.json +++ b/src/generated/resources/data/ars_nouveau/tags/item/magic_shards.json @@ -3,6 +3,7 @@ "ars_nouveau:drygmy_shard", "ars_nouveau:starbuncle_shards", "ars_nouveau:wixie_shards", - "ars_nouveau:whirlisprig_shards" + "ars_nouveau:whirlisprig_shards", + "ars_nouveau:alakarkinos_token" ] } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java index e4caeca201..ed8f3333eb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java +++ b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.api.ritual.DispenserRitualBehavior; import com.hollingsworth.arsnouveau.client.registry.ClientHandler; import com.hollingsworth.arsnouveau.common.advancement.ANCriteriaTriggers; +import com.hollingsworth.arsnouveau.common.entity.BubbleEntity; import com.hollingsworth.arsnouveau.common.entity.pathfinding.ClientEventHandler; import com.hollingsworth.arsnouveau.common.entity.pathfinding.FMLEventHandler; import com.hollingsworth.arsnouveau.common.items.RitualTablet; @@ -85,7 +86,8 @@ public ArsNouveau(IEventBus modEventBus, ModContainer modContainer){ modEventBus.addListener((RegisterTicketControllersEvent e) ->{ e.register(ticketController); }); - + NeoForge.EVENT_BUS.addListener(BubbleEntity::onAttacked); + NeoForge.EVENT_BUS.addListener(BubbleEntity::entityHurt); ANCriteriaTriggers.init(); try { Thread thread = new Thread(Rewards::init); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/loot/DungeonLootTables.java b/src/main/java/com/hollingsworth/arsnouveau/api/loot/DungeonLootTables.java index 30d4ec1dd2..348016c59a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/loot/DungeonLootTables.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/loot/DungeonLootTables.java @@ -6,16 +6,12 @@ import com.hollingsworth.arsnouveau.setup.config.Config; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; - +import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.PotionContents; -import com.hollingsworth.arsnouveau.setup.registry.ModPotions; - - - import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -76,6 +72,7 @@ public class DungeonLootTables { RARE_LOOT.add(() -> new ItemStack(ItemsRegistry.FIREL_DISC.get())); RARE_LOOT.add(() -> new ItemStack(ItemsRegistry.SOUND_OF_GLASS.get())); RARE_LOOT.add(() -> new ItemStack(ItemsRegistry.WILD_HUNT.get())); + RARE_LOOT.add(() -> new ItemStack(ItemsRegistry.ALAKARKINOS_SHARD.get())); } public static ItemStack getRandomItem(List> pool) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/AlakarkinosConversionRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/AlakarkinosConversionRegistry.java new file mode 100644 index 0000000000..0e94c00231 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/AlakarkinosConversionRegistry.java @@ -0,0 +1,54 @@ +package com.hollingsworth.arsnouveau.api.registry; + +import com.hollingsworth.arsnouveau.common.crafting.recipes.AlakarkinosRecipe; +import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import net.minecraft.util.RandomSource; +import net.minecraft.util.random.WeightedEntry; +import net.minecraft.util.random.WeightedRandomList; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.level.block.Block; + +import javax.annotation.Nullable; +import java.util.*; + +public class AlakarkinosConversionRegistry { + + private static List RECIPES = new ArrayList<>(); + private static Set CONVERTABLE_BLOCKS = Set.of(); + private static Map>> CONVERTABLE_BLOCKS_MAP = new HashMap<>(); + + public static List getRecipes(){ + return Collections.unmodifiableList(RECIPES); + } + + public static void reloadAlakarkinosRecipes(RecipeManager recipeManager){ + RECIPES = new ArrayList<>(); + List recipes = recipeManager.getAllRecipesFor(RecipeRegistry.ALAKARKINOS_RECIPE_TYPE.get()).stream().map(RecipeHolder::value).toList(); + RECIPES.addAll(recipes); + CONVERTABLE_BLOCKS = new HashSet<>(); + for (AlakarkinosRecipe recipe : RECIPES) { + CONVERTABLE_BLOCKS.add(recipe.input()); + } + CONVERTABLE_BLOCKS_MAP = new HashMap<>(); + for (AlakarkinosRecipe recipe : RECIPES) { + var list = CONVERTABLE_BLOCKS_MAP.getOrDefault(recipe.input(), WeightedRandomList.create()); + var modifiedList = new ArrayList<>(list.unwrap()); + modifiedList.add(WeightedEntry.wrap(recipe, recipe.weight())); + CONVERTABLE_BLOCKS_MAP.put(recipe.input(), WeightedRandomList.create(modifiedList)); + } + } + + public static boolean isConvertable(Block block) { + return CONVERTABLE_BLOCKS.contains(block); + } + + public static @Nullable AlakarkinosRecipe getConversionResult(Block block, RandomSource random) { + if (!isConvertable(block)) { + return null; + } + var list = CONVERTABLE_BLOCKS_MAP.get(block); + var entry = list.getRandom(random); + return entry.map(WeightedEntry.Wrapper::data).orElse(null); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java index 29b4f85b5e..fee4f5b41e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java @@ -53,14 +53,19 @@ public static List canTakeSource(BlockPos pos, Level wor } public static @Nullable ISpecialSourceProvider takeSourceWithParticles(BlockPos pos, Level level, int range, int source){ + return takeSourceWithParticles(pos, pos, level, range, source); + } + + public static @Nullable ISpecialSourceProvider takeSourceWithParticles(BlockPos pos, BlockPos particlesTo, Level level, int range, int source){ ISpecialSourceProvider result = takeSource(pos, level, range, source); if(result != null){ - EntityFollowProjectile aoeProjectile = new EntityFollowProjectile(level, result.getCurrentPos(), pos); + EntityFollowProjectile aoeProjectile = new EntityFollowProjectile(level, result.getCurrentPos(), particlesTo); level.addFreshEntity(aoeProjectile); } return result; } + /** * Searches for nearby mana jars that have enough mana. * Returns the position where the source was taken, or null if none were found. diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/BubbleParticle.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/BubbleParticle.java new file mode 100644 index 0000000000..36aace2e1b --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/BubbleParticle.java @@ -0,0 +1,51 @@ +package com.hollingsworth.arsnouveau.client.particle; + + +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.*; +import net.minecraft.core.particles.SimpleParticleType; + +public class BubbleParticle extends TextureSheetParticle { + + protected BubbleParticle(ClientLevel pLevel, double pX, double pY, double pZ, double pXSpeed, double pYSpeed, double pZSpeed) { + super(pLevel, pX, pY, pZ); + this.friction = 0.85F; + this.setSize(0.02F, 0.02F); + this.quadSize = this.quadSize * (this.random.nextFloat() * 0.6F + 0.2F); + this.xd = pXSpeed;// * 0.2F + (Math.random() * 2.0 - 1.0) * 0.02F; + this.yd = pYSpeed;// * 0.2F + (Math.random() * 2.0 - 1.0) * 0.02F; + this.zd = pZSpeed;// * 0.2F + (Math.random() * 2.0 - 1.0) * 0.02F; + this.lifetime = 35; + this.hasPhysics = false; + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_OPAQUE; + } + + public static class Provider implements ParticleProvider { + private final SpriteSet sprite; + + public Provider(SpriteSet pSprites) { + this.sprite = pSprites; + } + + public Particle createParticle( + SimpleParticleType pType, + ClientLevel pLevel, + double pX, + double pY, + double pZ, + double pXSpeed, + double pYSpeed, + double pZSpeed + ) { + BubbleParticle bubblecolumnupparticle = new BubbleParticle( + pLevel, pX, pY, pZ, pXSpeed, pYSpeed, pZSpeed + ); + bubblecolumnupparticle.pickSprite(this.sprite); + return bubblecolumnupparticle; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index cfb300a522..7cde85bff1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -190,7 +190,11 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer event.registerEntityRenderer(ModEntities.CINDER.get(), CinderRenderer::new); event.registerEntityRenderer(ModEntities.WALL_SPELL.get(), renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); + event.registerEntityRenderer(ModEntities.LILY.get(), (v) -> new GeoEntityRenderer<>(v, new LilyModel())); + event.registerEntityRenderer(ModEntities.ALAKARKINOS_TYPE.get(), (v) -> new GeoEntityRenderer<>(v, new AlakarkinosModel())); + event.registerEntityRenderer(ModEntities.BUBBLE.get(), BubbleRenderer::new); + } public static LayeredDraw.Layer cameraOverlay = (gui, tracker) -> { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java index 592e9ddaf5..4b09553ba8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ModParticles.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.client.particle.*; import net.minecraft.client.Minecraft; import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.particles.SimpleParticleType; import net.minecraft.core.registries.BuiltInRegistries; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; @@ -23,6 +24,7 @@ public class ModParticles { public static final DeferredHolder, ParticleType> LINE_TYPE = PARTICLES.register("line", LineParticleType::new); public static final DeferredHolder, ParticleType> SPARKLE_TYPE = PARTICLES.register("sparkle", SparkleParticleType::new); public static final DeferredHolder, ParticleType> HELIX_TYPE = PARTICLES.register(HelixParticleData.NAME, HelixParticleType::new); + public static final DeferredHolder, SimpleParticleType> BUBBLE_TYPE = PARTICLES.register("bubble", () -> new SimpleParticleType(false)); @SubscribeEvent public static void registerFactories(RegisterParticleProvidersEvent evt) { @@ -30,5 +32,6 @@ public static void registerFactories(RegisterParticleProvidersEvent evt) { Minecraft.getInstance().particleEngine.register(LINE_TYPE.get(), LineParticleProvider::new); Minecraft.getInstance().particleEngine.register(SPARKLE_TYPE.get(), SparkleParticleProvider::new); Minecraft.getInstance().particleEngine.register(HELIX_TYPE.get(), HelixParticleData::new); + Minecraft.getInstance().particleEngine.register(BUBBLE_TYPE.get(), BubbleParticle.Provider::new); } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ShaderRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ShaderRegistry.java index 12e56bcfc3..de9a6c17e6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ShaderRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ShaderRegistry.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.function.BiFunction; +import java.util.function.Function; @EventBusSubscriber(value = Dist.CLIENT, modid = ArsNouveau.MODID, bus = EventBusSubscriber.Bus.MOD) public class ShaderRegistry extends RenderType { @@ -94,4 +95,47 @@ public String toString() { } }; } + + /** + * Usable for rendering simple flat textures + * + * @param resLoc texture location + * @return render type + */ + public static RenderType worldEntityIcon(final ResourceLocation resLoc) + { + return InnerRenderTypes.WORLD_ENTITY_ICON.apply(resLoc); + } + + public static final class InnerRenderTypes extends RenderType + { + + private InnerRenderTypes(final String nameIn, + final VertexFormat formatIn, + final VertexFormat.Mode drawModeIn, + final int bufferSizeIn, + final boolean useDelegateIn, + final boolean needsSortingIn, + final Runnable setupTaskIn, + final Runnable clearTaskIn) + { + super(nameIn, formatIn, drawModeIn, bufferSizeIn, useDelegateIn, needsSortingIn, setupTaskIn, clearTaskIn); + throw new IllegalStateException(); + } + + private static final Function WORLD_ENTITY_ICON = Util.memoize((p_173202_) -> { + return create("ars_nouveau_entity_icon", + DefaultVertexFormat.POSITION_TEX, + VertexFormat.Mode.QUADS, + 1024, + false, + true, + CompositeState.builder() + .setShaderState(POSITION_TEX_SHADER) + .setTextureState(new TextureStateShard(p_173202_, false, false)) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setDepthTestState(RenderStateShard.LEQUAL_DEPTH_TEST) + .createCompositeState(false)); + }); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AlakarkinosModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AlakarkinosModel.java new file mode 100644 index 0000000000..2e2e5aaa78 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/AlakarkinosModel.java @@ -0,0 +1,36 @@ +package com.hollingsworth.arsnouveau.client.renderer.entity; + +import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.common.entity.Alakarkinos; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.model.GeoModel; + +public class AlakarkinosModel extends GeoModel { + public static ResourceLocation MODEL = ArsNouveau.prefix("geo/alakarkinos.geo.json"); + public static ResourceLocation TEXTURE = ArsNouveau.prefix("textures/entity/alakarkinos.png"); + public static ResourceLocation ANIMATION = ArsNouveau.prefix("animations/alakarkinos.animation.json"); + + + @Override + public void setCustomAnimations(Alakarkinos animatable, long instanceId, AnimationState animationState) { + super.setCustomAnimations(animatable, instanceId, animationState); + this.getBone("sea_bunny").get().setHidden(animatable.getEntityData().get(Alakarkinos.HAS_HAT)); + this.getBone("hat").get().setHidden(!animatable.getEntityData().get(Alakarkinos.HAS_HAT)); + } + + @Override + public ResourceLocation getModelResource(Alakarkinos animatable) { + return MODEL; + } + + @Override + public ResourceLocation getTextureResource(Alakarkinos animatable) { + return TEXTURE; + } + + @Override + public ResourceLocation getAnimationResource(Alakarkinos animatable) { + return ANIMATION; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BubbleRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BubbleRenderer.java new file mode 100644 index 0000000000..4f6dd8d7fe --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BubbleRenderer.java @@ -0,0 +1,78 @@ +package com.hollingsworth.arsnouveau.client.renderer.entity; + +import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.client.registry.ShaderRegistry; +import com.hollingsworth.arsnouveau.common.entity.BubbleEntity; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import org.joml.Matrix4f; + +public class BubbleRenderer extends EntityRenderer { + public static ResourceLocation TEXTURE = ArsNouveau.prefix("textures/entity/bubble.png"); + public static ResourceLocation POP_1 = ArsNouveau.prefix("textures/entity/bubble_pop1.png"); + public static ResourceLocation POP_2 = ArsNouveau.prefix("textures/entity/bubble_pop2.png"); + public static ResourceLocation POP_3 = ArsNouveau.prefix("textures/entity/bubble_pop3.png"); + public static ResourceLocation POP_4 = ArsNouveau.prefix("textures/entity/bubble_pop4.png"); + public static ResourceLocation POP_5 = ArsNouveau.prefix("textures/entity/bubble_pop5.png"); + + public BubbleRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager); + } + + @Override + public ResourceLocation getTextureLocation(BubbleEntity pEntity) { + return TEXTURE; + } + + @Override + public void render(BubbleEntity entityIn, float pEntityYaw, float pPartialTick, PoseStack matrixStack, MultiBufferSource buffer, int pPackedLight) { + renderBubble(entityIn, this.entityRenderDispatcher, matrixStack, buffer); + } + + public static void renderBubble(Entity entityIn, EntityRenderDispatcher entityRenderDispatcher, PoseStack matrixStack, MultiBufferSource buffer){ + double y = entityIn.getBbHeight(); + matrixStack.pushPose(); + matrixStack.translate(0, y, 0); + matrixStack.mulPose(entityRenderDispatcher.cameraOrientation()); + + matrixStack.scale(0.025F, -0.025F, 0.025F); + float base = 2.0f; + var passenger = entityIn.getFirstPassenger(); + if(passenger != null){ + base += 1f; + // Compare the size difference between the bubble hitbox and the passenger + base *= passenger.getBbWidth() / entityIn.getBbWidth(); + } + matrixStack.scale(base, base, base); + final Matrix4f pose = matrixStack.last().pose(); + ResourceLocation texture = TEXTURE; + + if(entityIn instanceof BubbleEntity bubbleEntity && bubbleEntity.poppingTicks > 0){ + int popTicks = bubbleEntity.poppingTicks; + if(popTicks < 2){ + texture = POP_1; + }else if(popTicks < 3) { + texture = POP_2; + }else if(popTicks < 4) { + texture = POP_3; + }else if(popTicks < 5) { + texture = POP_4; + }else{ + texture = POP_5; + } + } + VertexConsumer r = buffer.getBuffer(ShaderRegistry.worldEntityIcon(texture)); + r.addVertex(pose, -8, -8, 0).setUv(0, 0); + r.addVertex(pose, -8, 8, 0).setUv(0, 1); + r.addVertex(pose, 8, 8, 0).setUv(1, 1); + r.addVertex(pose, 8, -8, 0).setUv(1, 0); + + matrixStack.popPose(); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/RenderFlyingItem.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/RenderFlyingItem.java index 95c3833127..f74770c604 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/RenderFlyingItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/RenderFlyingItem.java @@ -20,7 +20,14 @@ public RenderFlyingItem(EntityRendererProvider.Context renderManager) { @Override public void render(EntityFlyingItem entityIn, float entityYaw, float partialTicks, PoseStack matrixStack, MultiBufferSource bufferIn, int packedLightIn) { super.render(entityIn, entityYaw, partialTicks, matrixStack, bufferIn, packedLightIn); + var isBubble = entityIn.getEntityData().get(EntityFlyingItem.IS_BUBBLE); + if(isBubble){ + BubbleRenderer.renderBubble(entityIn, this.entityRenderDispatcher, matrixStack, bufferIn); + } matrixStack.pushPose(); + if(isBubble){ + matrixStack.translate(0, 0.5, 0); + } matrixStack.scale(0.35f, 0.35f, 0.35F); Minecraft.getInstance().getItemRenderer().renderStatic(entityIn.getStack(), ItemDisplayContext.FIXED, 15728880, OverlayTexture.NO_OVERLAY, matrixStack, bufferIn, entityIn.level, (int) entityIn.blockPosition().asLong()); matrixStack.popPose(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/CrabHat.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/CrabHat.java new file mode 100644 index 0000000000..057796cbdc --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/CrabHat.java @@ -0,0 +1,35 @@ +package com.hollingsworth.arsnouveau.common.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.pathfinder.PathComputationType; +import net.minecraft.world.phys.shapes.BooleanOp; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +import java.util.stream.Stream; + +public class CrabHat extends ModBlock { + public CrabHat() { + super(Properties.of().strength(0.8F).sound(SoundType.WOOL).noOcclusion().noLootTable()); + } + + public static VoxelShape shape = Stream.of( + Block.box(0, 13, 0, 16, 17, 16), + Block.box(2, 0, 2, 14, 13, 14) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + + @Override + protected VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return shape; + } + + @Override + protected boolean isPathfindable(BlockState pState, PathComputationType pPathComputationType) { + return false; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java index 6b09a5469f..f79162b509 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java @@ -78,7 +78,7 @@ public void tick() { if (ticksToNextEval <= 0) evaluateGrove(); - if (level.getGameTime() % 60 == 0 && progress >= Config.WHIRLISPRIG_MAX_PROGRESS.get() && SourceUtil.takeSourceWithParticles(worldPosition, level, 5, Config.SYLPH_MANA_COST.get()) != null) { + if (level.getGameTime() % 60 == 0 && progress >= Config.WHIRLISPRIG_MAX_PROGRESS.get() && SourceUtil.takeSourceWithParticles(worldPosition, level, 5, Config.WHIRLISPRIG_SOURCE_COST.get()) != null) { this.progress = 0; DropDistribution blockDropDistribution = new DropDistribution<>(genTable); int numDrops = getDropsByDiversity() + 3; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/AlakarkinosRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/AlakarkinosRecipe.java new file mode 100644 index 0000000000..83197de7f0 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/AlakarkinosRecipe.java @@ -0,0 +1,63 @@ +package com.hollingsworth.arsnouveau.common.crafting.recipes; + +import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SingleRecipeInput; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootTable; + +public record AlakarkinosRecipe(Block input, ResourceKey table, int weight) implements SpecialSingleInputRecipe { + + public boolean matches(BlockState block) { + return block.is(input); + } + + @Override + public boolean matches(SingleRecipeInput p_346065_, Level p_345375_) { + return false; + } + + + @Override + public RecipeSerializer getSerializer() { + return RecipeRegistry.ALAKARKINOS_RECIPE_SERIALIZER.get(); + } + + @Override + public RecipeType getType() { + return RecipeRegistry.ALAKARKINOS_RECIPE_TYPE.get(); + } + + + public static class Serializer implements RecipeSerializer { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + BuiltInRegistries.BLOCK.byNameCodec().fieldOf("input").forGetter(AlakarkinosRecipe::input), + ResourceKey.codec(Registries.LOOT_TABLE).fieldOf("table").forGetter(AlakarkinosRecipe::table), + Codec.INT.fieldOf("weight").forGetter(AlakarkinosRecipe::weight) + ).apply(instance, AlakarkinosRecipe::new)); + + public static final StreamCodec STREAM = CheatSerializer.create(CODEC); + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public StreamCodec streamCodec() { + return STREAM; + } + } + +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AlakarkinosRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AlakarkinosRecipeProvider.java new file mode 100644 index 0000000000..4df8ce772e --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AlakarkinosRecipeProvider.java @@ -0,0 +1,63 @@ +package com.hollingsworth.arsnouveau.common.datagen; + + +import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.common.crafting.recipes.AlakarkinosRecipe; +import com.hollingsworth.arsnouveau.common.util.ANCodecs; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.storage.loot.BuiltInLootTables; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +public class AlakarkinosRecipeProvider extends SimpleDataProvider{ + + public List recipes = new ArrayList<>(); + + public AlakarkinosRecipeProvider(DataGenerator generatorIn) { + super(generatorIn); + } + + @Override + public void collectJsons(CachedOutput pOutput) { + addEntries(); + for (Wrapper recipe : recipes) { + Path path = getRecipePath(output, recipe.location().getPath()); + saveStable(pOutput, ANCodecs.toJson(AlakarkinosRecipe.CODEC, recipe.recipe), path); + } + } + + protected void addEntries() { + recipes.add(new Wrapper(ArsNouveau.prefix( "desert_well"), new AlakarkinosRecipe(Blocks.SAND, BuiltInLootTables.DESERT_WELL_ARCHAEOLOGY, 100))); + recipes.add(new Wrapper(ArsNouveau.prefix( "desert_pyramid"), new AlakarkinosRecipe(Blocks.SAND, BuiltInLootTables.DESERT_PYRAMID_ARCHAEOLOGY, 25))); + + recipes.add(new Wrapper(ArsNouveau.prefix( "ocean_ruins_warm"), new AlakarkinosRecipe(Blocks.SAND, BuiltInLootTables.OCEAN_RUIN_WARM_ARCHAEOLOGY, 25))); + + + recipes.add(new Wrapper(ArsNouveau.prefix( "ocean_ruins_cold"), new AlakarkinosRecipe(Blocks.GRAVEL, BuiltInLootTables.OCEAN_RUIN_WARM_ARCHAEOLOGY, 25))); + + recipes.add(new Wrapper(ArsNouveau.prefix( "trail_ruins_common"), new AlakarkinosRecipe(Blocks.GRAVEL, BuiltInLootTables.TRAIL_RUINS_ARCHAEOLOGY_COMMON, 100))); + + recipes.add(new Wrapper(ArsNouveau.prefix( "trail_ruins_rare"), new AlakarkinosRecipe(Blocks.GRAVEL, BuiltInLootTables.TRAIL_RUINS_ARCHAEOLOGY_RARE, 25))); + } + + public record Wrapper(ResourceLocation location, AlakarkinosRecipe recipe){ + + } + + protected static Path getRecipePath(Path path, String id) { + return path.resolve("data/ars_nouveau/recipe/alakarkinos/" + id + ".json"); + } + + /** + * Gets a name for this provider, to use in logging. + */ + @Override + public String getName() { + return "Alakarkinos Recipe Datagen"; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java index c9f408e9f3..b90ee333d0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ApparatusRecipeProvider.java @@ -1095,6 +1095,8 @@ public void addEntries() { .withPedestalItem(3, Ingredient.of(Tags.Items.OBSIDIANS)) .build()); + addRecipe(builder().withResult(ItemsRegistry.ALAKARKINOS_CHARM).withReagent(ItemsRegistry.ALAKARKINOS_SHARD).withPedestalItem(Items.BRUSH).withPedestalItem(3, Ingredient.of(ItemTags.DECORATED_POT_SHERDS)).build()); + } public void makeArmor(ItemLike outputItem, ItemLike armorItem) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java index e425266253..55d9b625df 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockStatesDatagen.java @@ -37,6 +37,7 @@ protected void registerStatesAndModels() { registerOnlyState(BlockRegistry.MYCELIAL_BLOCK.get(), LibBlockNames.MYCELIAL_SOURCELINK); registerOnlyState(BlockRegistry.VITALIC_BLOCK.get(), LibBlockNames.VITALIC_SOURCELINK); registerOnlyState(BlockRegistry.VOLCANIC_BLOCK.get(), LibBlockNames.VOLCANIC_SOURCELINK); + registerOnlyState(BlockRegistry.CRAB_HAT.get(), LibBlockNames.CRAB_HAT); for (var pot : BlockRegistry.flowerPots.entrySet()){ registerOnlyState(pot.getValue(), "pots/" + LibBlockNames.Pot(pot.getKey().get().getPath())); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java index 86b61b2d17..2961ded275 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java @@ -38,7 +38,8 @@ protected void addTags(HolderLookup.Provider pProvider) { ModEntities.WILDEN_GUARDIAN.get(), ModEntities.WILDEN_BOSS.get(), ModEntities.WILDEN_STALKER.get(), - ModEntities.WILDEN_HUNTER.get() + ModEntities.WILDEN_HUNTER.get(), + ModEntities.ALAKARKINOS_TYPE.get() ); this.tag(EntityTags.SPELL_CAN_HIT); this.tag(EntityTags.HOSTILE_MOBS) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java index 90806a8bb9..30680d5056 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/GlyphRecipeProvider.java @@ -125,6 +125,7 @@ public void collectJsons(CachedOutput pOutput) { add(get(EffectWololo.INSTANCE).withItem(ItemsRegistry.ABJURATION_ESSENCE).withIngredient(Ingredient.of(Tags.Items.DYES), 3)); add(get(EffectRewind.INSTANCE).withItem(ItemsRegistry.MANIPULATION_ESSENCE).withItem(Items.CLOCK, 3)); add(get(MethodPantomime.INSTANCE).withIngredient(Tags.Items.GLASS_BLOCKS, 8)); + add(get(EffectBubble.INSTANCE).withIngredient(Tags.Items.FEATHERS, 3).withItem(Items.WATER_BUCKET).withIngredient(ItemTags.BOATS, 1).withItem(ItemsRegistry.WATER_ESSENCE)); for (GlyphRecipe recipe : recipes) { Path path = getScribeGlyphPath(output, recipe.output.getItem()); saveStable(pOutput, GlyphRecipe.CODEC.encodeStart(JsonOps.INSTANCE, recipe).getOrThrow(), path); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java index 6b57b5aca9..5fa3a863b9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java @@ -126,7 +126,9 @@ protected void registerModels() { getBuilder(LibBlockNames.SMOOTH_SOURCESTONE_GRATE).parent(BlockStatesDatagen.getUncheckedModel(LibBlockNames.SMOOTH_SOURCESTONE_GRATE)); getBuilder(LibBlockNames.GOLD_GRATE).parent(BlockStatesDatagen.getUncheckedModel(LibBlockNames.GOLD_GRATE)); getBuilder(LibBlockNames.SOURCE_LAMP).parent(BlockStatesDatagen.getUncheckedModel(LibBlockNames.SOURCE_LAMP)); - + getBuilder(LibBlockNames.CRAB_HAT).parent(BlockStatesDatagen.getUncheckedModel(LibBlockNames.CRAB_HAT)); + itemUnchecked(ItemsRegistry.ALAKARKINOS_CHARM); + itemUnchecked(ItemsRegistry.ALAKARKINOS_SHARD); } public void blockAsItem(String s){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java index a8f2503f6b..29bdba74a9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemTagProvider.java @@ -46,7 +46,8 @@ protected void addTags(HolderLookup.@NotNull Provider pProvider) { .add(ItemsRegistry.DRYGMY_SHARD.get(), ItemsRegistry.STARBUNCLE_SHARD.get(), ItemsRegistry.WIXIE_SHARD.get(), - ItemsRegistry.WHIRLISPRIG_SHARDS.get()); + ItemsRegistry.WHIRLISPRIG_SHARDS.get(), + ItemsRegistry.ALAKARKINOS_SHARD.get()); this.tag(BERRY_TAG).add(BlockRegistry.SOURCEBERRY_BUSH.asItem()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 18d5e9d847..8aaaea5d8e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -1308,7 +1308,21 @@ protected void addTranslations() { add("tooltip.starbuncle_shard2", "Made with love."); add("tooltip.whirlisprig_shard2","A natural portrait."); add("tooltip.drygmy_shard2","A tribute to what once was."); - add("tooltip.wixie_shard2", "Let me out."); + add("tooltip.wixie_shard2", "Knowledge for freedom."); + add("block.ars_nouveau.alakarkinos_hat", "Alakarkinos Hat"); + add("entity.ars_nouveau.bubble", "Bubble"); + add("entity.ars_nouveau.alakarkinos", "Alakarkinos"); + add("item.ars_nouveau.alakarkinos_charm", "Alakarkinos Charm"); + add("item.ars_nouveau.alakarkinos_token", "Alakarkinos Token"); + add("ars_nouveau.page1.alakarkinos_charm","Alakarkinos can sift sand and gravel to find items found in archaeology sites. They can be found on beaches and will give you a token if they receive a Pottery Sherd of any kind."); + add("ars_nouveau.page2.alakarkinos_charm","Loves to dance to nearby jukeboxes."); + add("ars_nouveau.page3.alakarkinos_charm","Alakarkinos can be summoned anywhere by using a charm on a block. To set its home, use the Dominion Wand to bind Alakarkinos to a chest or inventory."); + add("ars_nouveau.page4.alakarkinos_charm","Alakarkinos will seek out gravel or sand that is placed within 3 blocks horizontal and one block vertical around its bound inventory. In order to convert blocks into items, Source must be provided near its chest. After some time and a few magic tricks, Alakarkinos will destroy the sand or gravel and insert items into the inventory."); + add("ars_novueau.alakarkinos.set_home", "Home set. Place source and gravel or sand within 3 blocks."); + add("ars_nouveau.sifting", "Sifting"); + add("tooltip.alakarkinos_shard1", "Found by giving an Alakarkinos a Sherd."); + add("tooltip.alakarkinos_shard2", "What's that behind your ear?"); + } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java index 2f24e7a701..e4741ca5ab 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java @@ -45,6 +45,7 @@ public static void datagen(GatherDataEvent event) { event.getGenerator().addProvider(event.includeServer(), new CasterTomeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new SummonRitualProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new BuddingConversionProvider(event.getGenerator())); + event.getGenerator().addProvider(event.includeServer(), new AlakarkinosRecipeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new ScryRitualProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new OneOffRecipesProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new DispelEntityProvider(event.getGenerator())); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java index 2a2727bd46..01f00d0363 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java @@ -651,6 +651,14 @@ public void addEntries() { .withPage(new CraftingPage(BlockRegistry.ARCHWOOD_GRATE).withRecipe2(BlockRegistry.GOLD_GRATE)) .withPage(new CraftingPage(BlockRegistry.SMOOTH_SOURCESTONE_GRATE).withRecipe2(BlockRegistry.SOURCESTONE_GRATE)), getPath(AUTOMATION, "grates")); addPage(new PatchouliBuilder(AUTOMATION, BlockRegistry.SOURCE_LAMP).withLocalizedText().withPage(new CraftingPage(BlockRegistry.SOURCE_LAMP)), getPath(AUTOMATION, "source_lamp")); + + addPage(new PatchouliBuilder(AUTOMATION, ItemsRegistry.ALAKARKINOS_CHARM) + .withLocalizedText() + .withPage(new ApparatusPage(ItemsRegistry.ALAKARKINOS_CHARM)) + .withPage(new EntityPage(getRegistryName(ModEntities.ALAKARKINOS_TYPE.get()).toString()).withScale(0.25f) + .withText(getLangPath("alakarkinos_charm", 2))) + .withPage(new TextPage(getLangPath("alakarkinos_charm", 3)).withTitle("ars_nouveau.summoning")) + .withPage(new TextPage(getLangPath("alakarkinos_charm", 4)).withTitle("ars_nouveau.sifting")), getPath(AUTOMATION, "alakarkinos")); } public String getLangPath(String name, int count) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java index 56a37c5d3d..bcff99fd17 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/WorldgenProvider.java @@ -43,12 +43,14 @@ public static class BiomeModifierRegistry { public static final ResourceKey STARBUNCLE_SPAWN = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, prefix("starbuncle_spawn")); public static final ResourceKey GIFT_STARBUNCLE_SPAWN = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, prefix("gift_starbuncle_spawn")); public static final ResourceKey DRYGMY_SPAWN = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, prefix("drygmy_spawn")); + public static final ResourceKey ALARKINOS_SPAWN = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, prefix("alakarkinos_spawn")); public static final ResourceKey WHIRLISPRIG_SPAWN = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, prefix("whirlisprig_spawn")); public static final ResourceKey ARCHWOOD_MIX_RARE = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, prefix("rare_archwood_mix")); public static final ResourceKey BERRY_COMMON = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, prefix("common_source_berry")); public static void bootstrap(BootstrapContext context) { HolderSet OVERWORLD_TAG = context.lookup(Registries.BIOME).getOrThrow(BiomeTags.IS_OVERWORLD); + HolderSet BEACH_TAG = context.lookup(Registries.BIOME).getOrThrow(BiomeTags.IS_BEACH); HolderSet.Named BERRY_BIOMES = context.lookup(Registries.BIOME).getOrThrow(BiomeTagProvider.BERRY_SPAWN); Holder.Reference BERRY_SET = context.lookup(Registries.PLACED_FEATURE).get(WorldgenRegistry.PLACED_BERRY_BUSH).get(); Holder.Reference TREE_SET = context.lookup(Registries.PLACED_FEATURE).get(WorldgenRegistry.PLACED_MIX_ARCHWOODS).get(); @@ -64,6 +66,8 @@ public static void bootstrap(BootstrapContext context) { context.register(BERRY_COMMON, new BiomeModifiers.AddFeaturesBiomeModifier(BERRY_BIOMES, HolderSet.direct(BERRY_SET), GenerationStep.Decoration.VEGETAL_DECORATION)); context.register(ARCHWOOD_MIX_RARE, new BiomeModifiers.AddFeaturesBiomeModifier(OVERWORLD_TAG, HolderSet.direct(TREE_SET), GenerationStep.Decoration.VEGETAL_DECORATION)); + context.register(ALARKINOS_SPAWN, BiomeModifiers.AddSpawnsBiomeModifier.singleSpawn(BEACH_TAG, new MobSpawnSettings.SpawnerData(ModEntities.ALAKARKINOS_TYPE.get(), + 5, 1, 1))); } @NotNull diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Alakarkinos.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Alakarkinos.java new file mode 100644 index 0000000000..91928bfb5a --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Alakarkinos.java @@ -0,0 +1,444 @@ +package com.hollingsworth.arsnouveau.common.entity; + +import com.hollingsworth.arsnouveau.api.client.ITooltipProvider; +import com.hollingsworth.arsnouveau.api.entity.IDispellable; +import com.hollingsworth.arsnouveau.api.item.IWandable; +import com.hollingsworth.arsnouveau.api.util.BlockUtil; +import com.hollingsworth.arsnouveau.api.util.SummonUtil; +import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; +import com.hollingsworth.arsnouveau.client.registry.ModParticles; +import com.hollingsworth.arsnouveau.common.block.tile.IAnimationListener; +import com.hollingsworth.arsnouveau.common.compat.PatchouliHandler; +import com.hollingsworth.arsnouveau.common.entity.debug.IDebugger; +import com.hollingsworth.arsnouveau.common.entity.debug.IDebuggerProvider; +import com.hollingsworth.arsnouveau.common.entity.goal.ConditionalLookAtMob; +import com.hollingsworth.arsnouveau.common.entity.goal.LookAtTarget; +import com.hollingsworth.arsnouveau.common.entity.goal.UntamedFindItemGoal; +import com.hollingsworth.arsnouveau.common.entity.statemachine.SimpleStateMachine; +import com.hollingsworth.arsnouveau.common.entity.statemachine.alakarkinos.DecideCrabActionState; +import com.hollingsworth.arsnouveau.common.items.data.ICharmSerializable; +import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; +import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ModEntities; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.ai.goal.WrappedGoal; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.capabilities.Capabilities; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.animatable.GeoEntity; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Optional; + +public class Alakarkinos extends PathfinderMob implements GeoEntity, IDispellable, ITooltipProvider, IWandable, IDebuggerProvider, IAnimationListener, ICharmSerializable { + + public boolean tamed; + public static final EntityDataAccessor> HOME = SynchedEntityData.defineId(Alakarkinos.class, EntityDataSerializers.OPTIONAL_BLOCK_POS); + public static final EntityDataAccessor HAS_HAT = SynchedEntityData.defineId(Alakarkinos.class, EntityDataSerializers.BOOLEAN); + public static final EntityDataAccessor BLOWING_BUBBLES = SynchedEntityData.defineId(Alakarkinos.class, EntityDataSerializers.BOOLEAN); + public static final EntityDataAccessor> BLOWING_AT = SynchedEntityData.defineId(Alakarkinos.class, EntityDataSerializers.OPTIONAL_BLOCK_POS); + public int findBlockCooldown; + + public boolean partyCrab = false; + public BlockPos jukeboxPos = null; + public BlockPos hatPos = null; + public Vec3 lookAt = null; + public static final EntityDataAccessor NEED_SOURCE = SynchedEntityData.defineId(Alakarkinos.class, EntityDataSerializers.BOOLEAN); + + boolean beingTamed = false; + + public SimpleStateMachine stateMachine = new SimpleStateMachine(new DecideCrabActionState(this)); + int ticksBlowingAnim; + int tamedTicks; + public Alakarkinos(EntityType pEntityType, Level pLevel) { + super(pEntityType, pLevel); + reloadGoals(); + } + + public Alakarkinos(Level pLevel, BlockPos pos, boolean tamed) { + this(ModEntities.ALAKARKINOS_TYPE.get(), pLevel); + this.setPos(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); + this.tamed = tamed; + reloadGoals(); + } + + @Override + public void setRecordPlayingNearby(BlockPos pos, boolean hasSound) { + super.setRecordPlayingNearby(pos, hasSound); + this.partyCrab = hasSound; + this.jukeboxPos = pos; + } + + @Override + public void tick() { + super.tick(); + if (!tamed && !beingTamed && level.getGameTime() % 40 == 0) { + for (ItemEntity itementity : this.level.getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate(1))) { + pickUpItem(itementity); + } + } + if (!tamed && this.getMainHandItem().is(ItemTags.DECORATED_POT_SHERDS)) { + tamedTicks++; + } + if(tamedTicks > 60 && !level.isClientSide && !isRemoved() && !isDeadOrDying()){ + ParticleUtil.spawnPoof((ServerLevel) level, blockPosition()); + ItemStack stack = new ItemStack(ItemsRegistry.ALAKARKINOS_SHARD); + level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); + this.remove(RemovalReason.DISCARDED); + } + if (!level.isClientSide) { + stateMachine.tick(); + SummonUtil.healOverTime(this); + if (findBlockCooldown > 0) { + findBlockCooldown--; + } + } else { + + if (blowingBubbles()) { + ticksBlowingAnim++; + if(ticksBlowingAnim < 10){ + return; + } + var optPos = this.entityData.get(BLOWING_AT); + if (optPos.isEmpty()) { + return; + } + BlockPos to = optPos.get(); + Vec3 towards = new Vec3(to.getX() + 0.5, to.getY() + 0.5, to.getZ() + 0.5); + // Spawn particles from this mob to the target + float randScale = 0.2f; + Vec3 from = new Vec3(this.getX() + ParticleUtil.inRange(-randScale, randScale), this.getY() + 0.75 + ParticleUtil.inRange(-randScale, randScale), this.getZ() + ParticleUtil.inRange(-randScale, randScale)); + Vec3 dir = towards.subtract(from).normalize(); + Vec3 pos = from.add(dir.scale(0.5)); + Vec3 motion = dir.scale(0.2); + level.addAlwaysVisibleParticle( + ModParticles.BUBBLE_TYPE.get(), + pos.x, pos.y, pos.z,motion.x, motion.y * 0.05, motion.z + ); + if (getRandom().nextInt(20) == 0) { + level.playLocalSound( + getX(), + getY(), + getZ(), + SoundEvents.BUBBLE_COLUMN_WHIRLPOOL_AMBIENT, + SoundSource.NEUTRAL, + 0.8F + getRandom().nextFloat() * 0.2F, + 0.9F + getRandom().nextFloat() * 0.15F, + false + ); + } + }else{ + ticksBlowingAnim = 0; + } + } + } + @Override + protected void pickUpItem(ItemEntity itemEntity) { + if (!tamed && !beingTamed && itemEntity.getItem().is(ItemTags.DECORATED_POT_SHERDS)) { + beingTamed = true; + ItemStack stack = itemEntity.getItem().copy(); + stack.setCount(1); + this.setItemInHand(InteractionHand.MAIN_HAND, stack); + itemEntity.getItem().shrink(1); + this.level.playSound(null, this.getX(), this.getY(), this.getZ(), SoundEvents.ITEM_PICKUP, this.getSoundSource(), 1.0F, 1.0F); + } + } + + + @Override + public void die(DamageSource source) { + if (!level.isClientSide && tamed) { + ItemStack stack = new ItemStack(ItemsRegistry.ALAKARKINOS_CHARM); + stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, createCharmData()); + level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); + } + super.die(source); + } + + @Override + public void fromCharmData(PersistentFamiliarData data) { + setCustomName(data.name()); + } + + public String getColor(){ + return "red"; + } + + + // Cannot add conditional goals in RegisterGoals as it is final and called during the MobEntity super. + protected void reloadGoals() { + if (this.level.isClientSide()) + return; + this.goalSelector.availableGoals.clear(); + for (WrappedGoal goal : getGoals()) { + this.goalSelector.addGoal(goal.getPriority(), goal.getGoal()); + } + } + + public List getGoals() { + List list = new ArrayList<>(); + list.add(new WrappedGoal(0, new FloatGoal(this))); + if (tamed) { + list.add(new WrappedGoal(4, new ConditionalLookAtMob(this, Player.class, 3.0F, 0.02F, () -> this.lookAt == null))); + list.add(new WrappedGoal(4, new ConditionalLookAtMob(this, Mob.class, 8.0F, () -> this.lookAt == null))); +// list.add(new WrappedGoal(3, new WaterAvoidingRandomStrollGoal(this, 1.2D))); + list.add(new WrappedGoal(0, new FloatGoal(this))); + list.add(new WrappedGoal(4, new LookAtTarget(this, 8.0f, () -> this.lookAt))); + }else{ + list.add(new WrappedGoal(1, new UntamedFindItemGoal(this, () -> this.getMainHandItem().isEmpty(), (e) -> e.getItem().is(ItemTags.DECORATED_POT_SHERDS)))); + list.add(new WrappedGoal(4, new LookAtPlayerGoal(this, Player.class, 3.0F, 0.02F))); + list.add(new WrappedGoal(4, new LookAtPlayerGoal(this, Mob.class, 8.0F))); + list.add(new WrappedGoal(3, new WaterAvoidingRandomStrollGoal(this, 1.2D))); + list.add(new WrappedGoal(0, new FloatGoal(this))); + } + return list; + } + + @Override + public EntityType getType() { + return ModEntities.ALAKARKINOS_TYPE.get(); + } + + @Override + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(HOME, Optional.empty()); + pBuilder.define(HAS_HAT, true); + pBuilder.define(BLOWING_BUBBLES, false); + pBuilder.define(BLOWING_AT, Optional.empty()); + pBuilder.define(NEED_SOURCE, false); + } + + public void setNeedSource(boolean needSource) { + this.entityData.set(NEED_SOURCE, needSource); + } + + public boolean needSource() { + return this.entityData.get(NEED_SOURCE); + } + + public boolean hasHat() { + return this.entityData.get(HAS_HAT); + } + + public void setHat(boolean hasHat) { + this.entityData.set(HAS_HAT, hasHat); + } + + public void setBlowingBubbles(boolean blowingBubbles) { + this.entityData.set(BLOWING_BUBBLES, blowingBubbles); + } + + public boolean blowingBubbles() { + return this.entityData.get(BLOWING_BUBBLES); + } + + public @Nullable BlockPos getHome() { + return this.entityData.get(HOME).orElse(null); + } + + @Override + public void getTooltip(List tooltip) { + if(this.tamed && this.needSource()){ + tooltip.add(Component.translatable("ars_nouveau.wixie.need_mana")); + } + } + + @Override + public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable LivingEntity storedEntity, Player playerEntity) { + if (playerEntity.level.getCapability(Capabilities.ItemHandler.BLOCK, storedPos, null) != null) { + this.entityData.set(HOME, Optional.ofNullable(storedPos)); + PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.alakarkinos.set_home")); + } + } + + @Override + public boolean onDispel(@NotNull LivingEntity caster) { + if (this.isRemoved()) + return false; + if(!level.isClientSide && tamed){ + ItemStack stack = new ItemStack(ItemsRegistry.ALAKARKINOS_CHARM); + stack.set(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, createCharmData()); + level.addFreshEntity(new ItemEntity(level, getX(), getY(), getZ(), stack)); + ParticleUtil.spawnPoof((ServerLevel) level, blockPosition()); + this.remove(RemovalReason.DISCARDED); + } + return true; + } + + @Override + public IDebugger getDebugger() { + return null; + } + + AnimationController placeHat; + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { + controllers.add(new AnimationController<>(this, "walkController", 1, (event) -> { + if (blowingBubbles()) { + return PlayState.STOP; + } + if (event.isMoving() || (level.isClientSide && PatchouliHandler.isPatchouliWorld())) { + event.getController().setAnimation(RawAnimation.begin().thenPlay("run")); + return PlayState.CONTINUE; + } + return PlayState.STOP; + })); + + controllers.add(new AnimationController<>(this, "idleController", 1, (event) -> { + if (blowingBubbles()) { + return PlayState.STOP; + } + if (!event.isMoving()) { + event.getController().setAnimation(RawAnimation.begin().thenPlay("idle")); + return PlayState.CONTINUE; + } + return PlayState.STOP; + })); + + controllers.add(new AnimationController<>(this, "danceController", 1, (event) -> { + if (blowingBubbles()) { + return PlayState.STOP; + } + if (this.getMainHandItem().is(ItemTags.DECORATED_POT_SHERDS) || (this.partyCrab && this.jukeboxPos != null && BlockUtil.distanceFrom(position, jukeboxPos) <= 8)) { + event.getController().setAnimation(RawAnimation.begin().thenPlay("dance")); + return PlayState.CONTINUE; + } + return PlayState.STOP; + })); + + controllers.add(new AnimationController<>(this, "blowBubbles", 1, (event) -> { + if (blowingBubbles()) { + event.getController().setAnimation(RawAnimation.begin().thenPlay("bubble_blow")); + return PlayState.CONTINUE; + } + return PlayState.STOP; + })); + + placeHat = new AnimationController<>(this, "placeHatController", 1, (event) -> PlayState.CONTINUE); + controllers.add(placeHat); + } + + + AnimatableInstanceCache manager = GeckoLibUtil.createInstanceCache(this); + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return manager; + } + + @Override + public boolean save(CompoundTag pCompound) { + if (this.entityData.get(HOME).isPresent()) { + pCompound.putLong("home", this.entityData.get(HOME).get().asLong()); + } + pCompound.putInt("findBlockCooldown", findBlockCooldown); + if (this.hatPos != null) { + pCompound.putLong("hatPos", this.hatPos.asLong()); + } + pCompound.putBoolean("needSource", this.needSource()); + pCompound.putBoolean("tamed", this.tamed); + pCompound.putBoolean("beingTamed", this.beingTamed); + return super.save(pCompound); + } + + boolean setBehaviors = false; + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + if (!setBehaviors) { + this.goalSelector.availableGoals = new LinkedHashSet<>(); + this.reloadGoals(); + setBehaviors = true; + } + } + + @Override + public void load(CompoundTag pCompound) { + super.load(pCompound); + if (pCompound.contains("home")) { + this.entityData.set(HOME, Optional.of(BlockPos.of(pCompound.getLong("home")))); + } + findBlockCooldown = pCompound.getInt("findBlockCooldown"); + if (pCompound.contains("hatPos")) { + this.hatPos = BlockPos.of(pCompound.getLong("hatPos")); + } + this.tamed = pCompound.getBoolean("tamed"); + this.setNeedSource(pCompound.getBoolean("needSource")); + this.beingTamed = pCompound.getBoolean("beingTamed"); + } + + public enum Animations { + PLACE_HAT, + BUBBLE_BLOW, + PICKUP_HAT + } + + @Override + public void startAnimation(int arg) { + if (arg == Animations.PLACE_HAT.ordinal()) { + if (placeHat == null) { + return; + } + placeHat.forceAnimationReset(); + placeHat.setAnimation(RawAnimation.begin().thenPlay("place_hat")); + } else if (arg == Animations.BUBBLE_BLOW.ordinal()) { + if (placeHat == null) { + return; + } + placeHat.forceAnimationReset(); + placeHat.setAnimation(RawAnimation.begin().thenPlay("bubble_blow")); + }else if(arg == Animations.PICKUP_HAT.ordinal()){ + if (placeHat == null) { + return; + } + placeHat.forceAnimationReset(); + placeHat.setAnimation(RawAnimation.begin().thenPlay("pickup_hat")); + } + } + + @Override + public boolean removeWhenFarAway(double distanceToClosestPlayer) { + return false; + } + + @Override + public boolean hurt(@NotNull DamageSource pSource, float pAmount) { + return SummonUtil.canSummonTakeDamage(pSource) && super.hurt(pSource, pAmount); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/BubbleEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/BubbleEntity.java new file mode 100644 index 0000000000..879de54207 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/BubbleEntity.java @@ -0,0 +1,192 @@ +package com.hollingsworth.arsnouveau.common.entity; + +import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; +import com.hollingsworth.arsnouveau.setup.registry.ModEntities; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.event.entity.living.LivingDamageEvent; +import net.neoforged.neoforge.event.entity.player.AttackEntityEvent; +import software.bernie.geckolib.animatable.GeoEntity; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.util.GeckoLibUtil; + +public class BubbleEntity extends Projectile implements GeoEntity { + int maxAge; + int age; + float damage; + public int poppingTicks; + public boolean hasPopped; + public static final EntityDataAccessor HAS_POPPED = SynchedEntityData.defineId(BubbleEntity.class, EntityDataSerializers.BOOLEAN); + public BubbleEntity(EntityType pEntityType, Level pLevel) { + super(pEntityType, pLevel); + } + + public BubbleEntity(Level pLevel, int maxAge, float damage) { + super(ModEntities.BUBBLE.get(), pLevel); + this.maxAge = maxAge; + this.damage = damage; + } + + @Override + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + pBuilder.define(HAS_POPPED, false); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { + + } + + @Override + public void tick() { + super.tick(); + if(!level.isClientSide){ + age++; + if(age > maxAge) { + this.pop(); + } + if(this.getPassengers().isEmpty()) { + for (Entity entity1 : level.getEntities(this, this.getBoundingBox().inflate(0.5f), this::canHitEntity)) { + entity1.startRiding(this); + } + } + } + + if(entityData.get(HAS_POPPED)){ + poppingTicks++; + } + if(poppingTicks > 5 && !level.isClientSide){ + this.remove(RemovalReason.DISCARDED); + } + + this.xOld = this.getX(); + this.yOld = this.getY(); + this.zOld = this.getZ(); + this.setDeltaMovement(ParticleUtil.inRange(-0.01, 0.01), 0.1, ParticleUtil.inRange(-0.01, 0.01)); + this.setPos(getNextHitPosition()); + + } + + public Vec3 getNextHitPosition() { + return this.position().add(this.getDeltaMovement()); + } + + public void pop(){ + if(this.level.isClientSide) + return; + if(this.entityData.get(HAS_POPPED)){ + return; + } + this.entityData.set(HAS_POPPED, true); + level.playSound(null, this.getX(), this.getY(), this.getZ(), SoundEvents.BUBBLE_COLUMN_BUBBLE_POP, this.getSoundSource(), 3.0F, 1.0F); + } + + // The only purpose of this is to prevent the default attack noise that occurs. + public static void onAttacked(AttackEntityEvent event){ + if(event.getTarget() instanceof BubbleEntity bubble){ + if(bubble.getPassengers().isEmpty() || bubble.getFirstPassenger() instanceof ItemEntity) { + bubble.pop(); + event.setCanceled(true); + }else if(bubble.getFirstPassenger() instanceof LivingEntity passenger){ + event.getEntity().attack(passenger); + } + } + } + + public static void entityHurt(LivingDamageEvent.Pre e) { + if(e.getEntity().getVehicle() instanceof BubbleEntity bubble){ + if(bubble.age > 1 && !bubble.hasPopped) { + e.setNewDamage(e.getNewDamage() + bubble.damage); + } + bubble.pop(); + } + } + + @Override + protected void onHitEntity(EntityHitResult pResult) { + super.onHitEntity(pResult); + if(this.getPassengers().isEmpty() && this.canHitEntity(pResult.getEntity())){ + pResult.getEntity().startRiding(this); + } + } + + @Override + public boolean hurt(DamageSource pSource, float pAmount) { + if(this.getPassengers().isEmpty() || this.getFirstPassenger() instanceof ItemEntity){ + this.pop(); + } + return true; + } + + @Override + public boolean isAttackable() { + return true; + } + + @Override + public boolean isPickable() { + return true; + } + + @Override + protected boolean canHitEntity(Entity pTarget) { + return !(pTarget instanceof BubbleEntity); + } + + @Override + public Vec3 getPassengerRidingPosition(Entity pEntity) { + return pEntity instanceof ItemEntity ? this.position.add(0, 0.5, 0) : this.position; + } + + @Override + protected boolean canRide(Entity pVehicle) { + return !(pVehicle instanceof BubbleEntity) && super.canRide(pVehicle); + } + + public AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } + + @Override + public boolean save(CompoundTag pCompound) { + pCompound.putInt("maxAge", this.maxAge); + pCompound.putFloat("damage", this.damage); + pCompound.putInt("age", this.age); + return super.save(pCompound); + } + + @Override + public void load(CompoundTag pCompound) { + super.load(pCompound); + this.maxAge = pCompound.getInt("maxAge"); + this.damage = pCompound.getFloat("damage"); + this.age = pCompound.getInt("age"); + } + + @Override + public boolean canBeHitByProjectile() { + return this.getPassengers().isEmpty() || this.getFirstPassenger() instanceof ItemEntity && (this.isAlive() && age > 1); + } + + @Override + public boolean mayInteract(Level pLevel, BlockPos pPos) { + return true; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java index 3dfc8bd93e..cc212c7aa3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java @@ -33,6 +33,7 @@ public class EntityFlyingItem extends ColoredProjectile { public static final EntityDataAccessor HELD_ITEM = SynchedEntityData.defineId(EntityFlyingItem.class, EntityDataSerializers.ITEM_STACK); public static final EntityDataAccessor OFFSET = SynchedEntityData.defineId(EntityFlyingItem.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor DIDOFFSET = SynchedEntityData.defineId(EntityFlyingItem.class, EntityDataSerializers.BOOLEAN); + public static final EntityDataAccessor IS_BUBBLE = SynchedEntityData.defineId(EntityFlyingItem.class, EntityDataSerializers.BOOLEAN); public EntityFlyingItem(Level worldIn, Vec3 from, Vec3 to) { this(worldIn, from, to, 255, 25, 180); @@ -139,7 +140,7 @@ public void tick() { this.setPos(lerpX, lerpY, lerpZ); } - if (level.isClientSide && this.age > 1) { + if (level.isClientSide && this.age > 1 && !this.getEntityData().get(IS_BUBBLE)) { double deltaX = getX() - xOld; double deltaY = getY() - yOld; double deltaZ = getZ() - zOld; @@ -220,6 +221,7 @@ protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { pBuilder.define(to, new Vec3(0, 0, 0)); pBuilder.define(from, new Vec3(0, 0, 0)); pBuilder.define(SPAWN_TOUCH, true); + pBuilder.define(IS_BUBBLE, false); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/ConditionalLookAtMob.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/ConditionalLookAtMob.java new file mode 100644 index 0000000000..597f7c129c --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/ConditionalLookAtMob.java @@ -0,0 +1,35 @@ +package com.hollingsworth.arsnouveau.common.entity.goal; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; + +import java.util.function.Supplier; + +public class ConditionalLookAtMob extends LookAtPlayerGoal { + Supplier canContinue; + public ConditionalLookAtMob(Mob pMob, Class pLookAtType, float pLookDistance, Supplier canContinue) { + super(pMob, pLookAtType, pLookDistance); + this.canContinue = canContinue; + } + + public ConditionalLookAtMob(Mob pMob, Class pLookAtType, float pLookDistance, float pProbability, Supplier canContinue) { + super(pMob, pLookAtType, pLookDistance, pProbability); + this.canContinue = canContinue; + } + + public ConditionalLookAtMob(Mob pMob, Class pLookAtType, float pLookDistance, float pProbability, boolean pOnlyHorizontal, Supplier canContinue) { + super(pMob, pLookAtType, pLookDistance, pProbability, pOnlyHorizontal); + this.canContinue = canContinue; + } + + @Override + public boolean canUse() { + return this.canContinue.get() && super.canUse(); + } + + @Override + public boolean canContinueToUse() { + return this.canContinue.get() && super.canContinueToUse(); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/LookAtTarget.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/LookAtTarget.java new file mode 100644 index 0000000000..3fdf34ed8e --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/LookAtTarget.java @@ -0,0 +1,39 @@ +package com.hollingsworth.arsnouveau.common.entity.goal; + +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.phys.Vec3; + +import java.util.EnumSet; +import java.util.function.Supplier; + +public class LookAtTarget extends Goal { + + protected final Mob mob; + protected final float lookDistance; + Supplier lookAtPosition; + + + public LookAtTarget(Mob pMob, float pLookDistance, Supplier pLookAtPosition) { + this.mob = pMob; + this.lookDistance = pLookDistance; + this.lookAtPosition = pLookAtPosition; + this.setFlags(EnumSet.of(Goal.Flag.LOOK)); + } + + @Override + public void tick() { + super.tick(); + mob.getLookControl().setLookAt(lookAtPosition.get()); + } + + @Override + public boolean canUse() { + return this.lookAtPosition.get() != null; + } + + @Override + public boolean canContinueToUse() { + return this.lookAtPosition.get() != null && !(this.mob.distanceToSqr(this.lookAtPosition.get()) > (double) (this.lookDistance * this.lookDistance)); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/NonHoggingLook.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/NonHoggingLook.java deleted file mode 100644 index 8d520c057d..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/NonHoggingLook.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.hollingsworth.arsnouveau.common.entity.goal.carbuncle; - -import com.hollingsworth.arsnouveau.common.entity.Starbuncle; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; - -public class NonHoggingLook extends LookAtPlayerGoal { - Starbuncle carbuncle; - - public NonHoggingLook(Starbuncle entityIn, Class watchTargetClass, float maxDistance, float chanceIn) { - super(entityIn, watchTargetClass, maxDistance, chanceIn); - carbuncle = entityIn; - } - -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyBehavior.java index 4bc27df6e4..ee5ea6309d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/carbuncle/StarbyBehavior.java @@ -28,7 +28,7 @@ public StarbyBehavior(Starbuncle entity, CompoundTag tag) { super(entity, tag); this.starbuncle = entity; goals.add(new WrappedGoal(8, new LookAtPlayerGoal(starbuncle, Player.class, 3.0F, 0.01F))); - goals.add(new WrappedGoal(8, new NonHoggingLook(starbuncle, Mob.class, 3.0F, 0.01f))); + goals.add(new WrappedGoal(8, new LookAtPlayerGoal(starbuncle, Mob.class, 3.0F, 0.01f))); goals.add(new WrappedGoal(1, new OpenDoorGoal(starbuncle, true))); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/ConvertBlockState.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/ConvertBlockState.java new file mode 100644 index 0000000000..78c315ec68 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/ConvertBlockState.java @@ -0,0 +1,80 @@ +package com.hollingsworth.arsnouveau.common.entity.statemachine.alakarkinos; + +import com.hollingsworth.arsnouveau.api.registry.AlakarkinosConversionRegistry; +import com.hollingsworth.arsnouveau.api.util.BlockUtil; +import com.hollingsworth.arsnouveau.common.crafting.recipes.AlakarkinosRecipe; +import com.hollingsworth.arsnouveau.common.entity.Alakarkinos; +import com.hollingsworth.arsnouveau.common.entity.EntityFlyingItem; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class ConvertBlockState extends CrabState { + BlockPos target; + int waitTicks; + boolean didBubbles; + + boolean spawnedFlyingItem; + AlakarkinosRecipe recipe; + public ConvertBlockState(Alakarkinos alakarkinos, BlockPos target) { + super(alakarkinos); + this.target = target; + } + + @Override + public void onEnd() { + super.onEnd(); + alakarkinos.lookAt = null; + } + + @Override + public @Nullable CrabState tick() { + super.tick(); + if (waitTicks > 0) { + waitTicks--; + return null; + } + + if (BlockUtil.distanceFrom(alakarkinos.blockPosition(), target) > 2 && ticksRunning < 200) { + alakarkinos.getNavigation().moveTo(target.getX() + 0.5, target.getY() + 0.5, target.getZ() + 0.5, 2, 1.0); + return null; + } + if (!didBubbles) { + + alakarkinos.getNavigation().stop(); + alakarkinos.lookAt = Vec3.atCenterOf(target); + didBubbles = true; + waitTicks = 60; + alakarkinos.setBlowingBubbles(true); + alakarkinos.getEntityData().set(Alakarkinos.BLOWING_AT, Optional.of(target)); + return null; + } + var hatPos = alakarkinos.hatPos; + if(hatPos == null){ + return new DecideCrabActionState(alakarkinos); + } + if (!spawnedFlyingItem) { + Block lootBlock = alakarkinos.level.getBlockState(target).getBlock(); + var res = AlakarkinosConversionRegistry.getConversionResult(lootBlock, alakarkinos.level.random); + if(res == null){ + return new DecideCrabActionState(alakarkinos); + } + this.recipe = res; + spawnedFlyingItem = true; + alakarkinos.setBlowingBubbles(false); + EntityFlyingItem flyingItem = new EntityFlyingItem(alakarkinos.level, target, hatPos.above()); + flyingItem.getEntityData().set(EntityFlyingItem.IS_BUBBLE, true); + alakarkinos.level.addFreshEntity(flyingItem); + flyingItem.setStack(alakarkinos.level.getBlockState(target).getBlock().asItem().getDefaultInstance()); + alakarkinos.level.setBlockAndUpdate(target, Blocks.AIR.defaultBlockState()); + waitTicks = 60; + alakarkinos.setNeedSource(true); + return null; + } + return new SpawnLootState(alakarkinos, recipe); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/CrabState.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/CrabState.java new file mode 100644 index 0000000000..4133afdf01 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/CrabState.java @@ -0,0 +1,38 @@ +package com.hollingsworth.arsnouveau.common.entity.statemachine.alakarkinos; + +import com.hollingsworth.arsnouveau.common.entity.Alakarkinos; +import com.hollingsworth.arsnouveau.common.entity.statemachine.IState; +import com.hollingsworth.arsnouveau.common.entity.statemachine.IStateEvent; +import org.jetbrains.annotations.Nullable; + +public class CrabState implements IState { + + public Alakarkinos alakarkinos; + public int ticksRunning; + public CrabState(Alakarkinos alakarkinos) { + this.alakarkinos = alakarkinos; + } + + @Override + public void onStart() { + + } + + @Override + public void onEnd() { + + } + + @Nullable + @Override + public CrabState tick() { + ticksRunning++; + return null; + } + + @Nullable + @Override + public CrabState onEvent(IStateEvent event) { + return null; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/DecideCrabActionState.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/DecideCrabActionState.java new file mode 100644 index 0000000000..7f885886ba --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/DecideCrabActionState.java @@ -0,0 +1,37 @@ +package com.hollingsworth.arsnouveau.common.entity.statemachine.alakarkinos; + +import com.hollingsworth.arsnouveau.api.util.SourceUtil; +import com.hollingsworth.arsnouveau.common.entity.Alakarkinos; +import com.hollingsworth.arsnouveau.setup.config.Config; +import org.jetbrains.annotations.Nullable; + +public class DecideCrabActionState extends CrabState { + public DecideCrabActionState(Alakarkinos alakarkinos) { + super(alakarkinos); + } + + @Override + public @Nullable CrabState tick() { + if(!alakarkinos.tamed || alakarkinos.getEntityData().get(Alakarkinos.HOME).isEmpty()){ + return null; + } + + if(!alakarkinos.getEntityData().get(Alakarkinos.HAS_HAT)){ + return new GetHatState(alakarkinos); + } + + if(alakarkinos.needSource() && alakarkinos.level.getGameTime() % 20 == 0){ + var result = SourceUtil.takeSourceWithParticles(alakarkinos.getHome(), alakarkinos.blockPosition().above(), alakarkinos.level, 5, Config.ALAKARKINOS_SOURCE_COST.get()); + + if(result != null ){ + alakarkinos.setNeedSource(false); + } + } + + if(!alakarkinos.needSource() && alakarkinos.findBlockCooldown <= 0){ + return new FindBlockState(alakarkinos); + } + + return super.tick(); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/FindBlockState.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/FindBlockState.java new file mode 100644 index 0000000000..c08567b221 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/FindBlockState.java @@ -0,0 +1,36 @@ +package com.hollingsworth.arsnouveau.common.entity.statemachine.alakarkinos; + +import com.hollingsworth.arsnouveau.api.registry.AlakarkinosConversionRegistry; +import com.hollingsworth.arsnouveau.common.entity.Alakarkinos; +import net.minecraft.core.BlockPos; +import org.jetbrains.annotations.Nullable; + +public class FindBlockState extends CrabState{ + public FindBlockState(Alakarkinos alakarkinos) { + super(alakarkinos); + } + + @Override + public @Nullable CrabState tick() { + + var pos = alakarkinos.getHome(); + if(pos == null){ + return new DecideCrabActionState(alakarkinos); + } + + var radius = 5; + for(BlockPos pos1 : BlockPos.withinManhattan(pos, radius, 3, radius)){ + var state = alakarkinos.level.getBlockState(pos1); + var consumable = AlakarkinosConversionRegistry.isConvertable(state.getBlock()); + if(!consumable) + continue; + var path = alakarkinos.getNavigation().createPath(pos1, 2); + if(path == null || !path.canReach()){ + continue; + } + return new PlaceHatState(alakarkinos, PlaceHatState.findHatPos(alakarkinos), pos1); + } + + return new DecideCrabActionState(alakarkinos); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/GetHatState.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/GetHatState.java new file mode 100644 index 0000000000..3def40642e --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/GetHatState.java @@ -0,0 +1,53 @@ +package com.hollingsworth.arsnouveau.common.entity.statemachine.alakarkinos; + +import com.hollingsworth.arsnouveau.api.util.BlockUtil; +import com.hollingsworth.arsnouveau.common.entity.Alakarkinos; +import com.hollingsworth.arsnouveau.common.network.Networking; +import com.hollingsworth.arsnouveau.common.network.PacketAnimEntity; +import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; + +public class GetHatState extends CrabState{ + BlockPos target; + int ticks; + boolean animHat; + public GetHatState(Alakarkinos alakarkinos) { + super(alakarkinos); + target = alakarkinos.hatPos; + } + + @Override + public @Nullable CrabState tick() { + if(target == null){ + alakarkinos.hatPos = null; + alakarkinos.getEntityData().set(Alakarkinos.HAS_HAT, true); + return new DecideCrabActionState(alakarkinos); + } + BlockState hatState = alakarkinos.level.getBlockState(alakarkinos.hatPos); + if(hatState.getBlock() != BlockRegistry.CRAB_HAT.get()){ + alakarkinos.hatPos = null; + alakarkinos.getEntityData().set(Alakarkinos.HAS_HAT, true); + return new DecideCrabActionState(alakarkinos); + }else{ + if(BlockUtil.distanceFrom(alakarkinos.blockPosition(), alakarkinos.hatPos) <= 1.5) { + if(!animHat) { + animHat = true; + Networking.sendToNearbyClient(alakarkinos.level, alakarkinos, new PacketAnimEntity(alakarkinos.getId(), Alakarkinos.Animations.PICKUP_HAT.ordinal())); + } + ticks++; + if(ticks >= 18){ + alakarkinos.hatPos = null; + alakarkinos.getEntityData().set(Alakarkinos.HAS_HAT, true); + alakarkinos.level.setBlockAndUpdate(target, Blocks.AIR.defaultBlockState()); + return new DecideCrabActionState(alakarkinos); + } + }else{ + alakarkinos.getNavigation().moveTo(alakarkinos.hatPos.getX(), alakarkinos.hatPos.getY(), alakarkinos.hatPos.getZ(), 1.0); + } + } + return super.tick(); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/PlaceHatState.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/PlaceHatState.java new file mode 100644 index 0000000000..fb037ab166 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/PlaceHatState.java @@ -0,0 +1,82 @@ +package com.hollingsworth.arsnouveau.common.entity.statemachine.alakarkinos; + +import com.hollingsworth.arsnouveau.api.util.BlockUtil; +import com.hollingsworth.arsnouveau.common.entity.Alakarkinos; +import com.hollingsworth.arsnouveau.common.network.Networking; +import com.hollingsworth.arsnouveau.common.network.PacketAnimEntity; +import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; + +public class PlaceHatState extends CrabState{ + BlockPos placeHatPos; + int placeTries; + boolean didHatAnimate; + + int waitTicks; + boolean placedHat; + BlockPos convertStatePos; + + public PlaceHatState(Alakarkinos alakarkinos, BlockPos placeHatPos, BlockPos convertStatePos) { + super(alakarkinos); + this.placeHatPos = placeHatPos; + this.convertStatePos = convertStatePos; + } + + public static BlockPos findHatPos(Alakarkinos alakarkinos){ + + for(BlockPos b : BlockPos.withinManhattan(alakarkinos.getHome(), 3, 1, 3)) { + if(alakarkinos.level.getBlockState(b).canBeReplaced() && !alakarkinos.isColliding(b, BlockRegistry.CRAB_HAT.defaultBlockState())){ + return b.immutable(); + } + } + return null; + } + + @Override + public void onEnd() { + alakarkinos.lookAt = null; + } + + @Override + public @Nullable CrabState tick() { + super.tick(); + if(placeHatPos == null){ + if(placeTries > 4){ + return new DecideCrabActionState(alakarkinos); + } + placeHatPos = findHatPos(alakarkinos); + return null; + } + alakarkinos.lookAt = Vec3.atCenterOf(placeHatPos); + if(!didHatAnimate){ + alakarkinos.getNavigation().moveTo(placeHatPos.getX() + 0.5, placeHatPos.getY() + 0.5, placeHatPos.getZ(), 1.0); + if(BlockUtil.distanceFrom(alakarkinos.blockPosition(), placeHatPos) <= 2 || ticksRunning > 200){ + didHatAnimate = true; + alakarkinos.getNavigation().stop(); + waitTicks = 20; + Networking.sendToNearbyClient(alakarkinos.level, alakarkinos, new PacketAnimEntity(alakarkinos.getId(), 0)); + } + return null; + } + if(waitTicks > 0){ + waitTicks--; + return null; + } + + if(!placedHat){ + if(alakarkinos.level.getBlockState(placeHatPos).canBeReplaced()) { + alakarkinos.level.setBlock(placeHatPos, BlockRegistry.CRAB_HAT.defaultBlockState(), 3); + placedHat = true; + alakarkinos.hatPos = placeHatPos.immutable(); + alakarkinos.getEntityData().set(Alakarkinos.HAS_HAT, Boolean.FALSE); + }else{ + placeHatPos = null; + return null; + } + } + + return new ConvertBlockState(alakarkinos, this.convertStatePos); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/SpawnLootState.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/SpawnLootState.java new file mode 100644 index 0000000000..9bf2fb5060 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/SpawnLootState.java @@ -0,0 +1,86 @@ +package com.hollingsworth.arsnouveau.common.entity.statemachine.alakarkinos; + +import com.hollingsworth.arsnouveau.api.ANFakePlayer; +import com.hollingsworth.arsnouveau.api.util.BlockUtil; +import com.hollingsworth.arsnouveau.common.crafting.recipes.AlakarkinosRecipe; +import com.hollingsworth.arsnouveau.common.entity.Alakarkinos; +import com.hollingsworth.arsnouveau.common.entity.EntityFlyingItem; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.ItemHandlerHelper; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class SpawnLootState extends CrabState{ + boolean backToHat; + int waitTicks; + AlakarkinosRecipe recipe; + + public SpawnLootState(Alakarkinos alakarkinos, AlakarkinosRecipe recipe) { + super(alakarkinos); + this.recipe = recipe; + } + + @Override + public void onEnd() { + super.onEnd(); + alakarkinos.lookAt = null; + } + + @Override + public @Nullable CrabState tick() { + var hatPos = alakarkinos.hatPos; + if(hatPos == null || alakarkinos.getHome() == null){ + return new DecideCrabActionState(alakarkinos); + } + if(waitTicks > 0){ + waitTicks--; + return null; + } + alakarkinos.lookAt = Vec3.atCenterOf(hatPos); + if (BlockUtil.distanceFrom(alakarkinos.blockPosition(), hatPos) > 2) { + alakarkinos.getNavigation().moveTo(hatPos.getX() + 0.5, hatPos.getY() + 0.5, hatPos.getZ() + 0.5, 1.0); + return null; + } + if (!backToHat) { + backToHat = true; + waitTicks = 60; + alakarkinos.getEntityData().set(Alakarkinos.BLOWING_AT, Optional.of(hatPos)); + alakarkinos.setBlowingBubbles(true); + alakarkinos.getNavigation().stop(); + return null; + } + alakarkinos.setBlowingBubbles(false); + alakarkinos.findBlockCooldown = 60 * 20; + ItemStack loot = getLoot(); + EntityFlyingItem flyingItem = new EntityFlyingItem(alakarkinos.level, hatPos, alakarkinos.getHome().above()); + flyingItem.getEntityData().set(EntityFlyingItem.IS_BUBBLE, true); + alakarkinos.level.addFreshEntity(flyingItem); + flyingItem.setStack(loot); + IItemHandler handler = alakarkinos.level.getCapability(Capabilities.ItemHandler.BLOCK, alakarkinos.getHome(), null); + ItemHandlerHelper.insertItemStacked(handler, loot, false); + return new DecideCrabActionState(alakarkinos); + } + + + public ItemStack getLoot() { + var level = this.alakarkinos.level; + LootTable loottable = alakarkinos.level.getServer().reloadableRegistries().getLootTable(this.recipe.table()); + var player = ANFakePlayer.getPlayer((ServerLevel) level); + LootParams lootparams = new LootParams.Builder((ServerLevel) level) + .withParameter(LootContextParams.ORIGIN, alakarkinos.position()) + .withParameter(LootContextParams.THIS_ENTITY, player) + .create(LootContextParamSets.CHEST); + ObjectArrayList objectarraylist = loottable.getRandomItems(lootparams, alakarkinos.level.random); + return objectarraylist.isEmpty() ? ItemStack.EMPTY : objectarraylist.getFirst(); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index 0715f089f1..701f541227 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -111,6 +111,7 @@ public void tick(ServerTickEvent serverTickEvent) { GenericRecipeRegistry.reloadAll(serverTickEvent.getServer().getRecipeManager()); CasterTomeRegistry.reloadTomeData(serverTickEvent.getServer().getRecipeManager(), serverTickEvent.getServer().getLevel(Level.OVERWORLD)); BuddingConversionRegistry.reloadBuddingConversionRecipes(serverTickEvent.getServer().getRecipeManager()); + AlakarkinosConversionRegistry.reloadAlakarkinosRecipes(serverTickEvent.getServer().getRecipeManager()); ScryRitualRegistry.reloadScryRitualRecipes(serverTickEvent.getServer().getRecipeManager()); expired = true; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlakarkinosCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlakarkinosCharm.java new file mode 100644 index 0000000000..39e6de6c8c --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlakarkinosCharm.java @@ -0,0 +1,44 @@ +package com.hollingsworth.arsnouveau.common.items; + +import com.hollingsworth.arsnouveau.common.entity.Alakarkinos; +import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class AlakarkinosCharm extends ModItem { + + public AlakarkinosCharm() { + super(defaultProps().component(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, new PersistentFamiliarData().setColor("red"))); + } + + + @Override + public InteractionResult useOn(UseOnContext pContext) { + Level world = pContext.getLevel(); + BlockPos pos = pContext.getClickedPos(); + if (world.isClientSide) return InteractionResult.SUCCESS; + pos = pos.relative(pContext.getClickedFace()); + Alakarkinos alakarkinos = new Alakarkinos(world, pos, true); + PersistentFamiliarData data = pContext.getItemInHand().get(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA); + if(data != null) { + alakarkinos.fromCharmData(data); + } + world.addFreshEntity(alakarkinos); + return super.useOn(pContext); + } + + @Override + public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { + super.appendHoverText(stack, context, tooltip2, flagIn); + stack.addToTooltip(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, context, tooltip2::add, flagIn); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibBlockNames.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibBlockNames.java index 08fcc68487..63368a4828 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibBlockNames.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibBlockNames.java @@ -171,6 +171,9 @@ public class LibBlockNames { public static final String REDSTONE_RELAY = "redstone_relay"; public static final String MAGIC_FIRE = "magic_fire"; public static final String SOURCEBERRY_SACK = "sourceberry_sack"; + + public static final String CRAB_HAT = "alakarkinos_hat"; + public static final String[] DECORATIVE_SOURCESTONE = new String[]{ SOURCESTONE, SOURCESTONE_MOSAIC, SOURCESTONE_BASKET, SOURCESTONE_ALTERNATING, SOURCESTONE_LARGE_BRICKS, SOURCESTONE_SMALL_BRICKS, SMOOTH_SOURCESTONE_BASKET, SMOOTH_SOURCESTONE_MOSAIC, SMOOTH_SOURCESTONE_ALTERNATING, SMOOTH_SOURCESTONE_LARGE_BRICKS, SMOOTH_SOURCESTONE, SMOOTH_SOURCESTONE_SMALL_BRICKS, diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibEntityNames.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibEntityNames.java index af5256ef74..2ff474102b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibEntityNames.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibEntityNames.java @@ -21,11 +21,13 @@ public class LibEntityNames { public static final String DUMMY = "dummy"; public static final String AN_LIGHTNING = "an_lightning"; public static final String LILY = "lily"; + public static final String BUBBLE = "bubble"; public static final String ORBIT_PROJECTILE = "orbit"; public static final String CHIMERA_SPIKE = "spike"; public static final String STARBUNCLE = "starbuncle"; + public static final String ALAKARKINOS = "alakarkinos"; public static final String WHIRLISPRIG = "whirlisprig"; public static final String WIXIE = "wixie"; public static final String DRYGMY = "drygmy"; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibItemNames.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibItemNames.java index b1401b8639..4867f1fa18 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibItemNames.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibItemNames.java @@ -129,4 +129,6 @@ public class LibItemNames { public static final String SOUND_OF_GLASS = "music_disc_thistle_the_sound_of_glass"; public static final String FIREL_WILD_HUNT = "music_disc_firel_the_wild_hunt"; public static final String JUMP_RING = "jump_ring"; + public static final String ALAKARKINOS_CHARM = "alakarkinos_charm"; + public static final String ALAKARKINOS_SHARD = "alakarkinos_token"; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/BrushableBlockEntityAccessor.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/BrushableBlockEntityAccessor.java new file mode 100644 index 0000000000..f8d6935206 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/BrushableBlockEntityAccessor.java @@ -0,0 +1,22 @@ +package com.hollingsworth.arsnouveau.common.mixin; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.block.entity.BrushableBlockEntity; +import net.minecraft.world.level.storage.loot.LootTable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(BrushableBlockEntity.class) +public interface BrushableBlockEntityAccessor { + @Accessor + long getLootTableSeed(); + + @Accessor + void setLootTableSeed(long lootTableSeed); + + @Accessor + ResourceKey getLootTable(); + + @Accessor + void setLootTable(ResourceKey lootTable); +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java new file mode 100644 index 0000000000..89542b4abd --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java @@ -0,0 +1,50 @@ +package com.hollingsworth.arsnouveau.common.spell.effect; + +import com.hollingsworth.arsnouveau.api.spell.*; +import com.hollingsworth.arsnouveau.common.entity.BubbleEntity; +import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; +import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDampen; +import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDurationDown; +import com.hollingsworth.arsnouveau.common.spell.augment.AugmentExtendTime; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.HitResult; +import net.neoforged.neoforge.common.ModConfigSpec; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; + +public class EffectBubble extends AbstractEffect { + + public static final EffectBubble INSTANCE = new EffectBubble(); + + public EffectBubble() { + super("bubble", "Captures mobs and entities it touches, causing them to float upwards. If the bubble has been alive for at least one tick, damaging the entity trapped in the bubble will cause it to pop, dealing bonus damage to the entity inside. Extend time and amplify can be used to increase the duration and damage of the bubble."); + } + + @Override + public void onResolve(HitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { + super.onResolve(rayTraceResult, world, shooter, spellStats, spellContext, resolver); + var bubble = new BubbleEntity(world, (int) (100 + spellStats.getDurationMultiplier() * EXTEND_TIME.getAsInt()), (float) (DAMAGE.getAsDouble() + spellStats.getAmpMultiplier() * AMP_VALUE.getAsDouble())); + bubble.setPos(rayTraceResult.getLocation().x, rayTraceResult.getLocation().y, rayTraceResult.getLocation().z); + world.addFreshEntity(bubble); + } + + @Override + protected int getDefaultManaCost() { + return 20; + } + + @Override + public void buildConfig(ModConfigSpec.Builder builder) { + super.buildConfig(builder); + addDamageConfig(builder, 5.0); + addAmpConfig(builder, 2.0); + addExtendTimeConfig(builder, 3); + } + + @Override + protected @NotNull Set getCompatibleAugments() { + return Set.of(AugmentExtendTime.INSTANCE, AugmentAmplify.INSTANCE, AugmentDampen.INSTANCE, AugmentDurationDown.INSTANCE); + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java b/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java index 24d3393188..404b826190 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java @@ -7,9 +7,9 @@ import net.minecraft.resources.ResourceLocation; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.fml.common.Mod; import net.neoforged.fml.event.config.ModConfigEvent; import net.neoforged.neoforge.common.ModConfigSpec; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -31,7 +31,8 @@ public class Config { public static ModConfigSpec.IntValue DRYGMY_MANA_COST; - public static ModConfigSpec.IntValue SYLPH_MANA_COST; + public static ModConfigSpec.IntValue WHIRLISPRIG_SOURCE_COST; + public static ModConfigSpec.IntValue ALAKARKINOS_SOURCE_COST; public static ModConfigSpec.IntValue WHIRLISPRIG_MAX_PROGRESS; public static ModConfigSpec.IntValue DRYGMY_MAX_PROGRESS; public static ModConfigSpec.IntValue DRYGMY_BASE_ITEM; @@ -122,7 +123,7 @@ public static boolean isGlyphEnabled(AbstractSpellPart tag) { SERVER_BUILDER.comment("General settings").push(CATEGORY_GENERAL); DIMENSION_BLACKLIST = SERVER_BUILDER.comment("Dimensions where hostile mobs will not spawn. Ex: [\"minecraft:overworld\", \"undergarden:undergarden\"]. . Run /forge dimensions for a list.").defineList("dimensionBlacklist", new ArrayList<>(), (o) -> true); SPAWN_BOOK = SERVER_BUILDER.comment("Spawn a book in the players inventory on login").define("spawnBook", true); - SYLPH_MANA_COST = SERVER_BUILDER.comment("How much mana whirlisprigs consume per generation").defineInRange("sylphManaCost", 250, 0, 10000); + WHIRLISPRIG_SOURCE_COST = SERVER_BUILDER.comment("How much mana whirlisprigs consume per generation").defineInRange("sylphManaCost", 250, 0, 10000); WHIRLISPRIG_MAX_PROGRESS = SERVER_BUILDER.comment("How much progress whirlisprigs must accumulate before creating resources") .defineInRange("whirlisprigProgress", 250, 0, 10000); HUNTER_ATTACK_ANIMALS = SERVER_BUILDER.comment("Should the Wilden Hunter attack animals?").define("hunterHuntsAnimals", false); @@ -141,6 +142,10 @@ public static boolean isGlyphEnabled(AbstractSpellPart tag) { DRYGMY_QUANTITY_CAP = SERVER_BUILDER.comment("Max Bonus number of items a drygmy produces from nearby entities. Each entity equals 1 item.").defineInRange("drygmyQuantityCap", 5, 0, 300); SERVER_BUILDER.pop(); + SERVER_BUILDER.push("alakarkinos"); + ALAKARKINOS_SOURCE_COST = SERVER_BUILDER.comment("How much mana alakarkinos consume per generation").defineInRange("alakarkinosSourceCost", 1000, 0, 10000); + SERVER_BUILDER.pop(); + SERVER_BUILDER.comment("Items").push("item"); SPAWN_TOMES = SERVER_BUILDER.comment("Spawn Caster Tomes in Dungeon Loot?").define("spawnTomes", true); JUMP_RING_COST = SERVER_BUILDER.comment("How much mana the Ring of Jumping consumes per jump").defineInRange("jumpRingCost", 30, 0, 10000); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java index e37ea2c4e2..2ae6330853 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/APIRegistry.java @@ -119,6 +119,7 @@ public static void setup() { registerSpell(EffectReset.INSTANCE); registerSpell(EffectWololo.INSTANCE); registerSpell(EffectRewind.INSTANCE); + registerSpell(EffectBubble.INSTANCE); registerRitual(new RitualDig()); registerRitual(new RitualMoonfall()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java index 0d17ac8cd4..5807e305bb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/BlockRegistry.java @@ -261,7 +261,7 @@ public Supplier getRenderer() { public static BlockRegistryWrapper ORANGE_SBED = registerBlockAndItem(LibBlockNames.ORANGE_SBED, SummonBed::new); public static BlockRegistryWrapper YELLOW_SBED = registerBlockAndItem(LibBlockNames.YELLOW_SBED, SummonBed::new); public static BlockRegistryWrapper PURPLE_SBED = registerBlockAndItem(LibBlockNames.PURPLE_SBED, SummonBed::new); - + public static BlockRegistryWrapper CRAB_HAT = registerBlockAndItem(LibBlockNames.CRAB_HAT, CrabHat::new); public static BlockRegistryWrapper SCRYERS_OCULUS = registerBlockAndItem(LibBlockNames.SCRYERS_OCULUS, ScryersOculus::new, (reg) -> new RendererBlockItem(reg, defaultItemProperties()) { @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java index b9e4e7b102..cbb7327034 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java @@ -227,6 +227,8 @@ public int getValue() { public static final ItemRegistryWrapper STABLE_WARP_SCROLL = register(LibItemNames.STABLE_WARP_SCROLL, () -> new StableWarpScroll(defaultItemProperties().stacksTo(1))); public static final ItemRegistryWrapper SCRY_CASTER = register(LibItemNames.SCRY_CASTER, () -> new ScryCaster(defaultItemProperties().stacksTo(1).component(DataComponentRegistry.SCRY_CASTER, new ScryCasterData()).component(DataComponentRegistry.SCRY_DATA, new ScryPosData(Optional.empty())))); public static final ItemRegistryWrapper JUMP_RING = register(LibItemNames.JUMP_RING, JumpingRing::new); + public static final ItemRegistryWrapper ALAKARKINOS_CHARM = register(LibItemNames.ALAKARKINOS_CHARM, AlakarkinosCharm::new); + public static final ItemRegistryWrapper ALAKARKINOS_SHARD = register(LibItemNames.ALAKARKINOS_SHARD, () -> new ModItem().withTooltip("tooltip.alakarkinos_shard1").withTooltip(Component.translatable("tooltip.alakarkinos_shard2").withStyle(LORE_STYLE))); public static ItemRegistryWrapper register(String name, Supplier item) { return new ItemRegistryWrapper<>(ITEMS.register(name, item)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java index 68f6d251fd..c21e507274 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java @@ -13,14 +13,12 @@ import com.hollingsworth.arsnouveau.setup.config.Config; import net.minecraft.core.BlockPos; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.tags.FluidTags; import net.minecraft.util.RandomSource; import net.minecraft.world.Difficulty; import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.animal.Wolf; import net.minecraft.world.entity.animal.horse.AbstractHorse; -import net.minecraft.world.entity.monster.Drowned; import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.monster.Vex; import net.minecraft.world.level.LevelAccessor; @@ -87,6 +85,11 @@ public boolean isNoGravity() { public static final DeferredHolder, EntityType> STARBUNCLE_TYPE = registerEntity(LibEntityNames.STARBUNCLE, EntityType.Builder.of(Starbuncle::new, MobCategory.CREATURE) .sized(0.6F, 0.63F).setTrackingRange(10) .setShouldReceiveVelocityUpdates(true)); + + public static final DeferredHolder, EntityType> ALAKARKINOS_TYPE = registerEntity(LibEntityNames.ALAKARKINOS, EntityType.Builder.of(Alakarkinos::new, MobCategory.CREATURE) + .sized(0.6F, 0.63F).setTrackingRange(10) + .setShouldReceiveVelocityUpdates(true)); + public static final DeferredHolder, EntityType> ENTITY_FOLLOW_PROJ = registerEntity( LibEntityNames.FOLLOW_PROJ, EntityType.Builder.of(EntityFollowProjectile::new, MobCategory.MISC) @@ -286,6 +289,13 @@ public boolean isNoGravity() { .sized(0.5F, 0.75F) .setTrackingRange(10)); + public static final DeferredHolder, EntityType> BUBBLE = registerEntity( + LibEntityNames.BUBBLE, + EntityType.Builder.of(BubbleEntity::new, MobCategory.MISC) + .sized(0.5F, 0.75F) + .setTrackingRange(10)); + + @SubscribeEvent public static void registerPlacements(RegisterSpawnPlacementsEvent event) { event.register(STARBUNCLE_TYPE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, RegisterSpawnPlacementsEvent.Operation.AND); @@ -301,25 +311,15 @@ public static void registerPlacements(RegisterSpawnPlacementsEvent event) { event.register(ENTITY_CASCADING_WEALD.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, RegisterSpawnPlacementsEvent.Operation.AND); event.register(ENTITY_FLOURISHING_WEALD.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, RegisterSpawnPlacementsEvent.Operation.AND); event.register(ENTITY_VEXING_WEALD.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::genericGroundSpawn, RegisterSpawnPlacementsEvent.Operation.AND); - + event.register(ALAKARKINOS_TYPE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::beachSpawn, RegisterSpawnPlacementsEvent.Operation.AND); LightManager.init(); } - public static boolean canMonsterSpawnInLight(EntityType type, ServerLevelAccessor worldIn, MobSpawnType reason, BlockPos pos, RandomSource randomIn) { - return Monster.checkMonsterSpawnRules(type, worldIn, reason, pos, randomIn) - && !Config.DIMENSION_BLACKLIST.get().contains(worldIn.getLevel().dimension().location().toString()); - } - public static boolean wildenSpawnRules(EntityType type, ServerLevelAccessor worldIn, MobSpawnType reason, BlockPos pos, RandomSource randomIn) { return worldIn.getDifficulty() != Difficulty.PEACEFUL && Monster.checkMonsterSpawnRules(type, worldIn, reason, pos, randomIn) && !Config.DIMENSION_BLACKLIST.get().contains(worldIn.getLevel().dimension().location().toString()); } - public static boolean guardianSpawnRules(EntityType pDrowned, ServerLevelAccessor pServerLevel, MobSpawnType pMobSpawnType, BlockPos pPos, RandomSource pRandom) { - boolean flag = pServerLevel.getDifficulty() != Difficulty.PEACEFUL && (pMobSpawnType != MobSpawnType.SPAWNER || pServerLevel.getFluidState(pPos).is(FluidTags.WATER)); - return flag; - } - @EventBusSubscriber(modid = MODID, bus = EventBusSubscriber.Bus.MOD) public static class RegistrationHandler { @@ -357,6 +357,7 @@ public static void registerEntityAttributes(final EntityAttributeCreationEvent e event.put(ANIMATED_BLOCK.get(), AnimBlockSummon.createAttributes().build()); event.put(ANIMATED_HEAD.get(), AnimBlockSummon.createAttributes().build()); event.put(LILY.get(), Lily.createAttributes().build()); + event.put(ALAKARKINOS_TYPE.get(), Starbuncle.attributes().build()); } } @@ -364,4 +365,8 @@ public static boolean genericGroundSpawn(EntityType animal, Le return worldIn.getBlockState(pos.below()).is(Blocks.GRASS_BLOCK) && worldIn.getRawBrightness(pos, 0) > 8; } + public static boolean beachSpawn(EntityType animal, LevelAccessor worldIn, MobSpawnType reason, BlockPos pos, RandomSource random) { + return (worldIn.getBlockState(pos.below()).is(Blocks.GRASS_BLOCK) || worldIn.getBlockState(pos.below()).is(Blocks.SAND) || worldIn.getBlockState(pos.below()).is(Blocks.SANDSTONE)) && worldIn.getRawBrightness(pos, 0) > 8; + } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java index 2b585aeab7..22c4d45442 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/RecipeRegistry.java @@ -29,6 +29,7 @@ public class RecipeRegistry { public static final String TOME_DATAPACK = "caster_tome"; public static final String SUMMON_RITUAL_DATAPACK = "summon_ritual"; public static final String BUDDING_CONVERSION_RECIPE_ID = "budding_conversion"; + public static final String ALAKARKINOS_RECIPE_ID = "alakarkinos_conversion"; public static final String DISPEL_ENTITY_RECIPE_ID = "dispel_entity"; public static final String SCRY_RITUAL_RECIPE_ID = "scry_ritual"; public static final String BOOK_UPGRADE_RECIPE_ID = "book_upgrade"; @@ -80,6 +81,8 @@ public class RecipeRegistry { public static final DeferredHolder, ModRecipeType> BUDDING_CONVERSION_TYPE = RECIPE_TYPES.register(BUDDING_CONVERSION_RECIPE_ID, () -> new ModRecipeType<>()); public static final DeferredHolder, BuddingConversionRecipe.Serializer> BUDDING_CONVERSION_SERIALIZER = RECIPE_SERIALIZERS.register(BUDDING_CONVERSION_RECIPE_ID, () -> new BuddingConversionRecipe.Serializer()); + public static final DeferredHolder, ModRecipeType> ALAKARKINOS_RECIPE_TYPE = RECIPE_TYPES.register(ALAKARKINOS_RECIPE_ID, () -> new ModRecipeType<>()); + public static final DeferredHolder, AlakarkinosRecipe.Serializer> ALAKARKINOS_RECIPE_SERIALIZER = RECIPE_SERIALIZERS.register(ALAKARKINOS_RECIPE_ID, () -> new AlakarkinosRecipe.Serializer()); public static final DeferredHolder, ModRecipeType> DISPEL_ENTITY_TYPE = RECIPE_TYPES.register(DISPEL_ENTITY_RECIPE_ID, () -> new ModRecipeType<>()); public static final DeferredHolder, DispelEntityRecipe.Serializer> DISPEL_ENTITY_SERIALIZER = RECIPE_SERIALIZERS.register(DISPEL_ENTITY_RECIPE_ID, () -> new DispelEntityRecipe.Serializer()); public static final DeferredHolder, ModRecipeType> SCRY_RITUAL_TYPE = RECIPE_TYPES.register(SCRY_RITUAL_RECIPE_ID, () -> new ModRecipeType<>()); diff --git a/src/main/resources/ars_nouveau.mixins.json b/src/main/resources/ars_nouveau.mixins.json index c94d090f00..7af9c0e809 100644 --- a/src/main/resources/ars_nouveau.mixins.json +++ b/src/main/resources/ars_nouveau.mixins.json @@ -17,6 +17,7 @@ "light.LightEntityMixin" ], "mixins": [ + "BrushableBlockEntityAccessor", "DamageSourceMixin", "LivingAccessor", "MobAccessor", diff --git a/src/main/resources/assets/ars_nouveau/animations/alakarkinos.animation.json b/src/main/resources/assets/ars_nouveau/animations/alakarkinos.animation.json new file mode 100644 index 0000000000..cce55b14ee --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/animations/alakarkinos.animation.json @@ -0,0 +1,592 @@ +{ + "format_version": "1.8.0", + "animations": { + "idle": { + "loop": true, + "bones": { + "claw_right": { + "rotation": { + "vector": ["-math.sin(query.anim_time * 200 + 100) * 6 -10", 0, 0] + } + }, + "claw_left": { + "rotation": { + "vector": ["-math.sin(query.anim_time * 200 + 100) * 3 -10", 0, 0] + } + }, + "legs_right2": { + "rotation": { + "vector": [0, 0, "math.sin(query.anim_time * 200) * 1 +1"] + } + }, + "legs_left2": { + "rotation": { + "vector": [0, 0, "-math.sin(query.anim_time * 200) * 1 +1"] + } + }, + "body2": { + "position": { + "vector": [0, "-math.sin(query.anim_time * 200) * 0.25 -0.25", 0] + } + } + } + }, + "run": { + "loop": true, + "bones": { + "body": { + "rotation": { + "vector": ["math.cos(query.anim_time * 500) * 2", 0, "-math.sin(query.anim_time * 500) * 1"] + }, + "position": { + "vector": [0, "-math.cos(query.anim_time * 500) * 0.5", 0] + } + }, + "leg_front_right": { + "rotation": { + "vector": [0, "-math.cos(query.anim_time * 500) * 10", "-math.sin(query.anim_time * 500) * 8 + 8"] + } + }, + "leg_front_left": { + "rotation": { + "vector": [0, "-math.cos(query.anim_time * 500) * 10", "-math.sin(query.anim_time * 500) * 8 - 8"] + } + }, + "leg_back_right": { + "rotation": { + "vector": [0, "math.cos(query.anim_time * 500) * 10", "math.sin(query.anim_time * 500) * 8 + 8"] + } + }, + "leg_back_left": { + "rotation": { + "vector": [0, "math.cos(query.anim_time * 500) * 10", "math.sin(query.anim_time * 500) * 8 - 8"] + } + }, + "claw_right": { + "rotation": { + "vector": ["math.sin(query.anim_time * 500) * 4 -20", 0, 0] + } + }, + "claw_left": { + "rotation": { + "vector": ["math.sin(query.anim_time * 500 + 40) * 3 -20", 0, 0] + } + } + } + }, + "place_hat": { + "animation_length": 1.375, + "bones": { + "body": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0417": { + "vector": [12.5, 0, 0], + "easing": "easeInSine" + }, + "0.25": { + "vector": [-35.98124, -9.84655, -17.49524], + "easing": "easeInSine" + }, + "0.5": { + "vector": [0, 0, 0], + "easing": "easeInSine" + }, + "0.625": { + "vector": [10, 0, 0] + }, + "0.75": { + "vector": [0, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.25": { + "vector": [0, 2, 0] + }, + "0.6667": { + "vector": [0, 0, 0] + } + } + }, + "legs_right": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2083": { + "vector": [22.5, 0, -15] + }, + "0.625": { + "vector": [0, 0, 0] + } + } + }, + "legs_left": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.25": { + "vector": [27.5, 0, 35] + }, + "0.625": { + "vector": [0, 0, 0] + } + } + }, + "claw_right": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.375": { + "vector": [41.5844, -112.31545, -54.87198], + "easing": "easeInSine" + }, + "0.7917": { + "vector": [0, 35, 30], + "easing": "easeInSine" + }, + "1.125": { + "vector": [0, 0, 0], + "easing": "easeInSine" + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.375": { + "vector": [-3, 0, -4], + "easing": "easeInSine" + }, + "0.75": { + "vector": [0, 0, 0], + "easing": "easeInSine" + } + } + }, + "claw_left": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "vector": [33.75, 0, 0], + "easing": "linear" + }, + "0.3333": { + "vector": [-67.5, 0, 0], + "easing": "easeInSine" + }, + "0.6667": { + "vector": [2.5, 52.5, 0] + }, + "0.8333": { + "vector": [-44.34174, 22.81391, 6.23278] + }, + "1.0": { + "vector": [0, 0, 0] + } + } + }, + "hat": { + "rotation": { + "0.3333": { + "vector": [0, 0, 0] + }, + "0.625": { + "vector": [140, 0, 0] + } + }, + "position": { + "0.3333": { + "vector": [0, 0, 0] + }, + "0.625": { + "vector": [0, 0, -10] + } + }, + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "0.625": { + "vector": [1, 1, 1] + }, + "0.6667": { + "vector": [0, 0, 0] + } + } + }, + "body2": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.75": { + "vector": [0, 0, 0], + "easing": "easeInSine" + }, + "0.875": { + "vector": [-12.5, 0, 0], + "easing": "linear" + }, + "1.0": { + "vector": [0, 0, 0], + "easing": "linear" + } + } + }, + "sea_bunny": { + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.1667": { + "vector": [0, 0, 0] + }, + "0.5833": { + "vector": [1, 0.6, 1], + "easing": "easeInSine" + }, + "0.8333": { + "vector": [1, 1.1, 1] + }, + "0.9583": { + "vector": [1, 1.3, 1] + }, + "1.125": { + "vector": [1, 1, 1], + "easing": "easeInSine" + }, + "1.1667": { + "vector": [1, 0.9, 1], + "easing": "easeInSine" + }, + "1.25": { + "vector": [1, 1, 1], + "easing": "easeInSine" + } + } + } + } + }, + "pickup_hat": { + "animation_length": 1.625, + "bones": { + "body": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "vector": [-5, 0, 0], + "easing": "easeInSine" + }, + "0.2083": { + "vector": [15, 0, 0], + "easing": "easeInSine" + }, + "0.5": { + "vector": [-17.5, 0, 0], + "easing": "easeInSine" + }, + "0.9167": { + "vector": [0, 0, 0], + "easing": "easeInSine" + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "vector": [0, 0, -1], + "easing": "easeInSine" + }, + "0.2083": { + "vector": [0, 0, 1], + "easing": "easeInSine" + }, + "0.5": { + "vector": [0, 0, -2], + "easing": "easeInSine" + }, + "0.9167": { + "vector": [0, 0, 0], + "easing": "easeInSine" + } + } + }, + "legs_right": { + "relative_to": { + "rotation": "entity" + }, + "rotation": [0, 0, 0.01] + }, + "claw_right": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "vector": [0, 27.5, 0], + "easing": "easeInSine" + }, + "0.375": { + "vector": [0, -35, 0], + "easing": "easeInSine" + }, + "0.625": { + "vector": [-52.5, -35, 0], + "easing": "easeInSine" + }, + "0.8333": { + "vector": [12.5, 0, 0], + "easing": "easeInSine" + }, + "0.9167": { + "vector": [0, 0, 0], + "easing": "easeInSine" + } + } + }, + "claw_left": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "vector": [0, -27.5, 0], + "easing": "easeInSine" + }, + "0.375": { + "vector": [0, 35, 0], + "easing": "easeInSine" + }, + "0.625": { + "vector": [-57.5, 35, 0], + "easing": "easeInSine" + }, + "0.8333": { + "vector": [15, 0, 0], + "easing": "easeInSine" + }, + "0.9167": { + "vector": [0, 0, 0], + "easing": "easeInSine" + } + } + }, + "hat": { + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.5833": { + "vector": [0, 0, 0] + }, + "0.625": { + "vector": [1, 1, 1] + } + } + }, + "sea_bunny": { + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "0.125": { + "vector": [1, 1, 1] + }, + "0.2083": { + "vector": [0.85, 1.15, 1] + }, + "0.2917": { + "vector": [1.25, 0.75, 1] + }, + "0.4583": { + "vector": [1, 1, 1] + }, + "0.6667": { + "vector": [0, 0, 0] + } + } + }, + "legs_right2": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "vector": [5, 0, 0], + "easing": "easeInSine" + }, + "0.25": { + "vector": [-15, 0, 0], + "easing": "easeInSine" + }, + "0.5": { + "vector": [15, 0, 0], + "easing": "easeInSine" + }, + "0.9167": { + "vector": [0, 0, 0], + "easing": "easeInSine" + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "vector": [0, 0, 0], + "easing": "easeInSine" + }, + "0.25": { + "vector": [0, 0, -2], + "easing": "easeInSine" + }, + "0.5": { + "vector": [0, 0, 1], + "easing": "easeInSine" + }, + "0.9167": { + "vector": [0, 0, 0], + "easing": "easeInSine" + } + } + }, + "legs_left2": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "vector": [5, 0, 0], + "easing": "easeInSine" + }, + "0.25": { + "vector": [-15, 0, 0], + "easing": "easeInSine" + }, + "0.5": { + "vector": [15, 0, 0], + "easing": "easeInSine" + }, + "0.9167": { + "vector": [0, 0, 0], + "easing": "easeInSine" + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "vector": [0, 0, 0], + "easing": "easeInSine" + }, + "0.25": { + "vector": [0, 0, -2], + "easing": "easeInSine" + }, + "0.5": { + "vector": [0, 0, 1], + "easing": "easeInSine" + }, + "0.9167": { + "vector": [0, 0, 0], + "easing": "easeInSine" + } + } + } + } + }, + "bubble_blow": { + "loop": true, + "bones": { + "claw_right": { + "rotation": { + "vector": ["-math.sin(query.anim_time * 300) * 2.25 ", -122.5, 0] + }, + "position": { + "vector": [-3, 0, -3] + } + }, + "claw_left": { + "rotation": { + "vector": ["math.cos(query.anim_time * 300 + 50) * 6 -15", 0, 0] + } + }, + "legs_right2": { + "rotation": { + "vector": [0, "math.cos(query.anim_time * 300) * 3", "-math.cos(query.anim_time * 300) * 2 +1"] + } + }, + "legs_left2": { + "rotation": { + "vector": [0, "-math.cos(query.anim_time * 300) * 3", "math.cos(query.anim_time * 300) * 2 +1"] + } + }, + "body2": { + "rotation": { + "vector": ["math.sin(query.anim_time * 300 - 100) * 6 ", 0, 0] + }, + "position": { + "vector": [0, "math.sin(query.anim_time * 300) * 0.25", "-math.cos(query.anim_time * 300) * 0.25 "] + } + }, + "sea_bunny": { + "scale": { + "vector": [1, "math.sin(query.anim_time * 300 +20) * 0.1 + 1 ", 1] + } + } + } + }, + "dance": { + "loop": true, + "bones": { + "claw_right": { + "rotation": { + "vector": ["-math.cos(query.anim_time * 670/2 + 50) * 15 -30", 0, "-math.cos(query.anim_time * 670/2 + 50) * 25"] + } + }, + "claw_left": { + "rotation": { + "vector": ["-math.cos(query.anim_time * 670/2 + 75) * 30 - 40", 0, 0] + } + }, + "body2": { + "rotation": { + "vector": [ + "-math.sin(query.anim_time * 670 + 50 ) * 10", + "-math.cos(query.anim_time * 670/2 + 50 ) * 12", + "-math.cos(query.anim_time * 670/2 + 75) * 10" + ] + }, + "position": { + "vector": ["math.sin(query.anim_time * 670/2) * 2", "math.cos(query.anim_time * 670) * 2", 0] + } + }, + "legs_left2": { + "rotation": { + "vector": [0, 0, "math.sin(query.anim_time * 670/2) * 15"] + } + }, + "legs_right2": { + "rotation": { + "vector": [0, 0, "math.sin(query.anim_time * 670/2) * 15"] + } + } + } + } + }, + "geckolib_format_version": 2 +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/geo/alakarkinos.geo.json b/src/main/resources/assets/ars_nouveau/geo/alakarkinos.geo.json new file mode 100644 index 0000000000..026209a4f0 --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/geo/alakarkinos.geo.json @@ -0,0 +1,381 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 128, + "texture_height": 128, + "visible_bounds_width": 4, + "visible_bounds_height": 3.5, + "visible_bounds_offset": [0, 1.25, 0] + }, + "bones": [ + { + "name": "crab", + "pivot": [0, 0, 3] + }, + { + "name": "body", + "parent": "crab", + "pivot": [0, 8, 3] + }, + { + "name": "legs", + "parent": "body", + "pivot": [0, 7, 5] + }, + { + "name": "legs_right", + "parent": "legs", + "pivot": [-6, 7, 4] + }, + { + "name": "legs_right2", + "parent": "legs_right", + "pivot": [-11.5, 0, 5.5] + }, + { + "name": "leg_front_right", + "parent": "legs_right2", + "pivot": [-6, 7, 4], + "cubes": [ + { + "origin": [-12, 0, 4], + "size": [6, 9, 0], + "uv": { + "north": {"uv": [12, 43], "uv_size": [6, 9]}, + "east": {"uv": [0, 0], "uv_size": [0, 9]}, + "south": {"uv": [18, 43], "uv_size": [6, 9]}, + "west": {"uv": [0, 0], "uv_size": [0, 9]}, + "up": {"uv": [0, 0], "uv_size": [6, 0]}, + "down": {"uv": [0, 0], "uv_size": [6, 0]} + } + } + ] + }, + { + "name": "leg_back_right", + "parent": "legs_right2", + "pivot": [-6, 6, 7], + "cubes": [ + { + "origin": [-12, 0, 7], + "size": [6, 8, 0], + "uv": { + "north": {"uv": [36, 46], "uv_size": [6, 8]}, + "east": {"uv": [0, 0], "uv_size": [0, 8]}, + "south": {"uv": [42, 46], "uv_size": [6, 8]}, + "west": {"uv": [0, 0], "uv_size": [0, 8]}, + "up": {"uv": [0, 0], "uv_size": [6, 0]}, + "down": {"uv": [0, 0], "uv_size": [6, 0]} + } + } + ] + }, + { + "name": "legs_left", + "parent": "legs", + "pivot": [6, 7, 4] + }, + { + "name": "legs_left2", + "parent": "legs_left", + "pivot": [11.5, 0, 5.5] + }, + { + "name": "leg_front_left", + "parent": "legs_left2", + "pivot": [6, 7, 4], + "cubes": [ + { + "origin": [6, 0, 4], + "size": [6, 9, 0], + "uv": { + "north": {"uv": [0, 44], "uv_size": [6, 9]}, + "east": {"uv": [0, 0], "uv_size": [0, 9]}, + "south": {"uv": [6, 44], "uv_size": [6, 9]}, + "west": {"uv": [0, 0], "uv_size": [0, 9]}, + "up": {"uv": [0, 0], "uv_size": [6, 0]}, + "down": {"uv": [0, 0], "uv_size": [6, 0]} + } + } + ] + }, + { + "name": "leg_back_left", + "parent": "legs_left2", + "pivot": [6, 6, 7], + "cubes": [ + { + "origin": [6, 0, 7], + "size": [6, 8, 0], + "uv": { + "north": {"uv": [52, 16], "uv_size": [6, 8]}, + "east": {"uv": [0, 0], "uv_size": [0, 8]}, + "south": {"uv": [18, 52], "uv_size": [6, 8]}, + "west": {"uv": [0, 0], "uv_size": [0, 8]}, + "up": {"uv": [0, 0], "uv_size": [6, 0]}, + "down": {"uv": [0, 0], "uv_size": [6, 0]} + } + } + ] + }, + { + "name": "body2", + "parent": "legs", + "pivot": [0, 8, 3], + "cubes": [ + { + "origin": [-6, 4, -3], + "size": [12, 7, 12], + "uv": { + "north": {"uv": [35, 0], "uv_size": [12, 7]}, + "east": {"uv": [35, 7], "uv_size": [12, 7]}, + "south": {"uv": [40, 14], "uv_size": [12, 7]}, + "west": {"uv": [40, 21], "uv_size": [12, 7]}, + "up": {"uv": [28, 18], "uv_size": [12, 12]}, + "down": {"uv": [28, 42], "uv_size": [12, -12]} + } + }, + { + "origin": [-9.5, 1, -5], + "size": [19, 9, 0], + "uv": { + "north": {"uv": [16, 0], "uv_size": [19, 9]}, + "east": {"uv": [0, 0], "uv_size": [0, 9]}, + "south": {"uv": [16, 9], "uv_size": [19, 9]}, + "west": {"uv": [0, 0], "uv_size": [0, 9]}, + "up": {"uv": [0, 0], "uv_size": [19, 0]}, + "down": {"uv": [0, 0], "uv_size": [19, 0]} + } + } + ] + }, + { + "name": "eyes", + "parent": "body2", + "pivot": [19, -2, 0], + "cubes": [ + { + "origin": [-5, 6, -4], + "size": [3, 8, 0], + "uv": { + "north": {"uv": [32, 55], "uv_size": [3, 8]}, + "east": {"uv": [0, 0], "uv_size": [0, 8]}, + "south": {"uv": [56, 37], "uv_size": [3, 8]}, + "west": {"uv": [0, 0], "uv_size": [0, 8]}, + "up": {"uv": [0, 0], "uv_size": [3, 0]}, + "down": {"uv": [0, 0], "uv_size": [3, 0]} + } + }, + { + "origin": [2, 6, -4], + "size": [3, 8, 0], + "uv": { + "north": {"uv": [12, 32], "uv_size": [3, 8]}, + "east": {"uv": [0, 0], "uv_size": [0, 8]}, + "south": {"uv": [29, 55], "uv_size": [3, 8]}, + "west": {"uv": [0, 0], "uv_size": [0, 8]}, + "up": {"uv": [0, 0], "uv_size": [3, 0]}, + "down": {"uv": [0, 0], "uv_size": [3, 0]} + } + } + ] + }, + { + "name": "claw_right", + "parent": "body2", + "pivot": [-6, 6, 0], + "rotation": [0, 55, 0], + "cubes": [ + { + "origin": [-8, 3, -14], + "size": [2, 4, 14], + "uv": { + "north": {"uv": [38, 14], "uv_size": [2, 4]}, + "east": {"uv": [28, 42], "uv_size": [14, 4]}, + "south": {"uv": [52, 24], "uv_size": [2, 4]}, + "west": {"uv": [42, 42], "uv_size": [14, 4]}, + "up": {"uv": [50, 54], "uv_size": [2, 14]}, + "down": {"uv": [54, 65], "uv_size": [2, -14]} + } + } + ] + }, + { + "name": "claw_right_top", + "parent": "claw_right", + "pivot": [-9, 7, 0], + "cubes": [ + { + "origin": [-8, 5, -14], + "size": [2, 5, 14], + "inflate": 0.25, + "uv": { + "north": {"uv": [52, 54], "uv_size": [2, 5]}, + "east": {"uv": [40, 28], "uv_size": [14, 5]}, + "south": {"uv": [3, 58], "uv_size": [2, 5]}, + "west": {"uv": [40, 33], "uv_size": [14, 5]}, + "up": {"uv": [9, 53], "uv_size": [2, 14]}, + "down": {"uv": [48, 68], "uv_size": [2, -14]} + } + } + ] + }, + { + "name": "bubblefilm", + "parent": "claw_right", + "pivot": [-3, 7, 0], + "cubes": [ + { + "origin": [-8, 4, -12], + "size": [2, 5, 5], + "uv": { + "north": {"uv": [5, 58], "uv_size": [2, 5]}, + "east": {"uv": [47, 8], "uv_size": [5, 5]}, + "south": {"uv": [58, 5], "uv_size": [2, 5]}, + "west": {"uv": [24, 55], "uv_size": [5, 5]}, + "up": {"uv": [7, 58], "uv_size": [2, 5]}, + "down": {"uv": [58, 15], "uv_size": [2, -5]} + } + } + ] + }, + { + "name": "claw_left", + "parent": "body2", + "pivot": [6, 6, -2], + "rotation": [0, -57.5, 0], + "cubes": [ + { + "origin": [6, 3, -10], + "size": [6, 4, 8], + "uv": { + "north": {"uv": [56, 51], "uv_size": [6, 4]}, + "east": {"uv": [54, 29], "uv_size": [8, 4]}, + "south": {"uv": [56, 55], "uv_size": [6, 4]}, + "west": {"uv": [54, 33], "uv_size": [8, 4]}, + "up": {"uv": [52, 8], "uv_size": [6, 8]}, + "down": {"uv": [12, 60], "uv_size": [6, -8]} + } + } + ] + }, + { + "name": "claw_left_top", + "parent": "claw_left", + "pivot": [9, 7, -2], + "cubes": [ + { + "origin": [6, 5, -10], + "size": [6, 5, 8], + "inflate": 0.25, + "uv": { + "north": {"uv": [36, 54], "uv_size": [6, 5]}, + "east": {"uv": [53, 0], "uv_size": [8, 5]}, + "south": {"uv": [42, 54], "uv_size": [6, 5]}, + "west": {"uv": [54, 24], "uv_size": [8, 5]}, + "up": {"uv": [47, 0], "uv_size": [6, 8]}, + "down": {"uv": [48, 54], "uv_size": [6, -8]} + } + } + ] + }, + { + "name": "hat", + "parent": "body2", + "pivot": [0, 10, 3], + "rotation": [-30, 0, 0], + "cubes": [ + { + "origin": [-8, 10, -6], + "size": [16, 4, 16], + "uv": { + "north": {"uv": [40, 38], "uv_size": [16, 4]}, + "east": {"uv": [40, 38], "uv_size": [16, 4]}, + "south": {"uv": [40, 38], "uv_size": [16, 4]}, + "west": {"uv": [40, 38], "uv_size": [16, 4]}, + "up": {"uv": [0, 0], "uv_size": [16, 16]}, + "down": {"uv": [0, 32], "uv_size": [16, -16]} + } + }, + { + "origin": [-6, 14, -4], + "size": [12, 13, 12], + "uv": { + "north": {"uv": [16, 18], "uv_size": [12, 13]}, + "east": {"uv": [16, 18], "uv_size": [12, 13]}, + "south": {"uv": [16, 18], "uv_size": [12, 13]}, + "west": {"uv": [16, 18], "uv_size": [12, 13]}, + "up": {"uv": [16, 31], "uv_size": [12, 12]}, + "down": {"uv": [0, 44], "uv_size": [12, -12]} + } + } + ] + }, + { + "name": "sea_bunny", + "parent": "body2", + "pivot": [0, 11, 3.5], + "cubes": [ + { + "origin": [-3, 11, -1], + "size": [6, 5, 9], + "uv": { + "north": {"uv": [54, 46], "uv_size": [6, 5]}, + "east": {"uv": [0, 53], "uv_size": [9, 5]}, + "south": {"uv": [54, 46], "uv_size": [6, 5]}, + "west": {"uv": [0, 53], "uv_size": [9, 5]}, + "up": {"uv": [24, 46], "uv_size": [6, 9]}, + "down": {"uv": [30, 55], "uv_size": [6, -9]} + } + }, + { + "origin": [-1, 17, 7], + "size": [2, 2, 2], + "pivot": [0, 17, 8], + "rotation": [90, 0, 0], + "uv": { + "north": {"uv": [12, 40], "uv_size": [2, 2]}, + "east": {"uv": [14, 40], "uv_size": [2, 2]}, + "south": {"uv": [12, 40], "uv_size": [2, 2]}, + "west": {"uv": [24, 43], "uv_size": [2, 2]}, + "up": {"uv": [14, 40], "uv_size": [2, 2]}, + "down": {"uv": [24, 45], "uv_size": [2, -2]} + } + }, + { + "origin": [-3, 15, 0], + "size": [3, 4, 0], + "pivot": [-1.5, 16, 0], + "rotation": [12.5, 0, -20], + "uv": { + "north": {"uv": [35, 14], "uv_size": [3, 4]}, + "east": {"uv": [0, 53], "uv_size": [9, 5]}, + "south": {"uv": [0, 58], "uv_size": [3, 4]}, + "west": {"uv": [0, 53], "uv_size": [9, 5]}, + "up": {"uv": [24, 46], "uv_size": [6, 9]}, + "down": {"uv": [30, 55], "uv_size": [6, -9]} + } + }, + { + "origin": [0, 15, 0], + "size": [3, 4, 0], + "pivot": [1.5, 16, 0], + "rotation": [12.5, 0, 20], + "uv": { + "north": {"uv": [35, 14], "uv_size": [3, 4]}, + "east": {"uv": [0, 53], "uv_size": [9, 5]}, + "south": {"uv": [0, 58], "uv_size": [3, 4]}, + "west": {"uv": [0, 53], "uv_size": [9, 5]}, + "up": {"uv": [24, 46], "uv_size": [6, 9]}, + "down": {"uv": [30, 55], "uv_size": [6, -9]} + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/models/block/alakarkinos_hat.json b/src/main/resources/assets/ars_nouveau/models/block/alakarkinos_hat.json new file mode 100644 index 0000000000..2083193cbd --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/models/block/alakarkinos_hat.json @@ -0,0 +1,87 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "2": "ars_nouveau:block/alakarkinos_tophat", + "particle": "ars_nouveau:block/alakarkinos_tophat" + }, + "render_type": "cutout", + "elements": [ + { + "name": "hat_bottom", + "from": [0, 13, 0], + "to": [16, 17, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 17, 4.5]}, + "faces": { + "north": {"uv": [7, 0, 11, 1], "texture": "#2"}, + "east": {"uv": [7, 0, 11, 1], "texture": "#2"}, + "south": {"uv": [7, 0, 11, 1], "texture": "#2"}, + "west": {"uv": [7, 0, 11, 1], "texture": "#2"}, + "up": {"uv": [4, 4, 0, 0], "texture": "#2"}, + "down": {"uv": [4, 4, 0, 8], "texture": "#2"} + } + }, + { + "name": "hat_top", + "from": [2, 0, 2], + "to": [14, 13, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [-2, 15, 7]}, + "faces": { + "north": {"uv": [4, 0, 7, 3.25], "texture": "#2"}, + "east": {"uv": [4, 0, 7, 3.25], "texture": "#2"}, + "south": {"uv": [4, 0, 7, 3.25], "texture": "#2"}, + "west": {"uv": [4, 0, 7, 3.25], "texture": "#2"}, + "up": {"uv": [7, 6.25, 4, 3.25], "texture": "#2"}, + "down": {"uv": [7, 6.25, 4, 9.25], "texture": "#2"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "VoxelShapes", + "origin": [8, 17, 7], + "color": 0, + "children": [ + 0, + 1, + { + "name": "group", + "origin": [8, 17, 7], + "color": 0, + "children": [] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/particles/bubble.json b/src/main/resources/assets/ars_nouveau/particles/bubble.json new file mode 100644 index 0000000000..c9ad64490f --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/particles/bubble.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "minecraft:bubble" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/textures/block/alakarkinos_tophat.png b/src/main/resources/assets/ars_nouveau/textures/block/alakarkinos_tophat.png new file mode 100644 index 0000000000000000000000000000000000000000..0c7ea2e2bfa156b3f6c5c0ad42a7084f18d1e61b GIT binary patch literal 979 zcmV;^11$WBP)Px&jY&j7RCt{2nL%q4K@@;r>zJ@@5<(NhF0_ZhqCu##1uue>UObC81&?056~UV) z&*IICN1@(||DcpYFG2$fl1iWlBfCTcCE3lQjl{!dCNq=CHrd^_(>UKHvu|gTd2io) z^WJ8z_48970H9^pKt#c)2<4c=y)80sI*xEoN!Q8v#=Xa(-}mSDu~42$=Y#!RyE7O1 z1yh1RpuF$cWZa;}nr<-j3Py!dnpTtt&npgo>!jUb?qAJi$(X;#-%k>R2fky2=i0(a zi zUcY(@8U#iunri?6plMn7{$+Qp7p$zVgYS13@51!DE-^-!>?}aMpxy3;F39EBCE2Aw z;Z!=$7{m8FplQP===&YWF6nUn){{hII4%eV?vLFZ0KjYi6;58vT_I!Nv0>TTfJSwP z$d;`QXxTOJ{lH!ECk*lhJy#acxa>a(ExX1f#>2fW#*j3J^#kG|GJy(41sWj>6a3bV#N1 zOzdO$xG&wb64-LGkPwIht>Ch?!BlanbRHVj9VWDzUlZ7I!XTW;y!vpXbha1axi(2? zNA)U^@z4n|D3HWO(nT_o1Nd`(Qg8)W(simD9Li*6?%U`0ec(!A{N%z)V@)@pU{n%s zPR<)tFe>Cc$K@?9SNSuYZ-!<81frIAU=%FJWBSB6txdixps@0^F{UjRU0+t1Zg3o; zo_}1)d)YuRQ2y@2H&Z3E{q4>EEEr+_qBn5SC<8#qYpgJ$tdWt(9w2jdHx2VJL&`+q zzs~`&Ux<8s`=}2iO;CVH_TbqEsd|UV2534ClufqXo%BBfnLv=xM$4u}-VM-{bR8Bm z1{~F^Qs$b-9>6Q(xi(RjZmT`lCd$j`5wTAJyte5$MB%36K+|!+b8YE+1_XmAwZFaD zr*H5L5Pyvo!?BMQrsoCs&P9*NkPzUX6rJEi*Ruk;eg8$QV+kLFFfd|CXWtJ7hINFe zgbc*4188u}W4FgS0f&f;NiennuySS7A{l>3pm5o=qRa$Z0)kXDzEF>BN zFhxnMP$(1%g+ifFC=?2XLZMJ76bgkxp-?E!m4A2nmiY2y+`#|<002ovPDHLkV1o7@ B&dmS- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ars_nouveau/textures/entity/alakarkinos.png b/src/main/resources/assets/ars_nouveau/textures/entity/alakarkinos.png new file mode 100644 index 0000000000000000000000000000000000000000..8bd00d9cbb46741a7d3ade8de49bbd8020214938 GIT binary patch literal 2755 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ars_nouveau/textures/entity/bubble.png b/src/main/resources/assets/ars_nouveau/textures/entity/bubble.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa4ca7b9a9f66e1408b3648761685391151c7c6 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|594iy{|2;- N!PC{xWt~$(69AQvJ|_SG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ars_nouveau/textures/entity/bubble_pop1.png b/src/main/resources/assets/ars_nouveau/textures/entity/bubble_pop1.png new file mode 100644 index 0000000000000000000000000000000000000000..19d1a982d36b416baa1ca826534e3db6191f98d5 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|{5)M8Lo9le z6C_x-uy#fN|DT?akZ|Hg*-v{tQ=cCu_rIs5v`9KlJ8Q7(&$IvkpPFx!Zn@6-t|wf= vXj|;R`zz0#@YtsP;ijL!gtdht6WAD@^6DCHJ;~DoG?~HE)z4*}Q$iB}rOr0x literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ars_nouveau/textures/entity/bubble_pop2.png b/src/main/resources/assets/ars_nouveau/textures/entity/bubble_pop2.png new file mode 100644 index 0000000000000000000000000000000000000000..9ae3542456639ece780d3d94e64ec6201d5d5f06 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|^gUf1Lo9le z6C_wG9Dknu|NnIUzyJQC%^9m3BhKDvD&r2SwWD2=HtW>zopr01}`uPXGV_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ars_nouveau/textures/entity/bubble_pop4.png b/src/main/resources/assets/ars_nouveau/textures/entity/bubble_pop4.png new file mode 100644 index 0000000000000000000000000000000000000000..b47c51ee0cfdffd94b7ef6d276d063ce585ce6be GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|6g^!WLo9le z6C{Kd{CW2O|BV}4HYSSn`4LT*3YNs?ymKVQX)FkFOGp1!191Ys>|M%YI1}h@ox4m}u z^eEcZEg>J9_GA8D8;PT0F|!O~7?{iZcKy@8Gpkvt&DYqEIiXGA^Ty0&z~DWXWoqeFOnoxy*I2%J-FB0|8MXl9$GpRB=)g6 zyI@;>fsk{0DNEbw2W$sS{{Q_r`{BXfZl3!3KW)32j`e$b9yVy`D<#+xF85qzn4$P0>4pivFayKOg7mPhu~JWfLBQbY>gTe~ HDWM4fdD@QA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ars_nouveau/textures/item/bubble.png b/src/main/resources/assets/ars_nouveau/textures/item/bubble.png new file mode 100644 index 0000000000000000000000000000000000000000..82056e922838055acf99bf5259a752900647646f GIT binary patch literal 480 zcmV<60U!Q}P)Px$nn^@KR5*>DlfO#>Q5?WO?{KlBz#kbN2Pfj{+TP$GAqZ`{IJY#kRnnle`yaGq z5CnllgF}0(OOS{MhoW{l#Ccmb*t^cNB>HZT_dcKZeee7I3cf6GZKB7gbJa)z@R8i)PVI`_{VGDjvDyXxuyO??;Fx{%c57+huAXqGc7>4e!Jfu; zR3&Zf5KCx;!y826IsnsG3)h`tj|cS35tBEE+s6TR^@Na2I|!GKE|+d>HY&st+Sh6X zfHHh1Bo74PhpV$CLB3oMNM05a$Ls^F!1;2We7Wuk96s%`BjtUVKjoh!0Fk)vRY>vI+JDn;a4;14mg%eYCjb^@m4By1 zk5A`%yM^n{Xf`TK9~TT+3D=#Ww_B7tk+~w@Vvh%FC4Sf*4**b&)OR2B%tdp=655Xv zKP=Azgg%m+08HK-WQR$~x>kn8P>HAe8bv4b|6zK%uK`eWGArYpHg-Iq)QPN&Gr%VS W-{Y{@)+wm~0000 Date: Sat, 19 Oct 2024 19:33:21 +0100 Subject: [PATCH 208/363] feat: add command to summon adopted starbuncles (#1438) * Update supporters.json * feat: add command to summon adopted starbuncles --------- Co-authored-by: Bailey Hollingsworth --- .../common/command/AdoptCommand.java | 82 +++++++++++++++++++ .../arsnouveau/common/event/EventHandler.java | 1 + 2 files changed, 83 insertions(+) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/command/AdoptCommand.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/command/AdoptCommand.java b/src/main/java/com/hollingsworth/arsnouveau/common/command/AdoptCommand.java new file mode 100644 index 0000000000..91ea4d2b08 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/command/AdoptCommand.java @@ -0,0 +1,82 @@ +package com.hollingsworth.arsnouveau.common.command; + +import com.hollingsworth.arsnouveau.common.entity.Starbuncle; +import com.hollingsworth.arsnouveau.setup.registry.ModEntities; +import com.hollingsworth.arsnouveau.setup.reward.Rewards; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.suggestion.SuggestionProvider; +import net.minecraft.commands.CommandSource; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; + +import java.util.List; +import java.util.function.Function; + +public class AdoptCommand { + private static SuggestionProvider getSuggestions(Function fn) { + return (ctx, builder) -> { + List suggestions = Rewards.starbuncles.stream().map(fn).toList(); + return SharedSuggestionProvider.suggest(suggestions, builder); + }; + } + + private static final SuggestionProvider BY_NAME = getSuggestions(starby -> starby.name); + private static final SuggestionProvider BY_ADOPTER = getSuggestions(starby -> starby.adopter); + + public static void register(CommandDispatcher dispatcher) { + dispatcher.register(Commands.literal("ars-adopted") + .requires(sender -> sender.hasPermission(2)) + .then( + Commands.literal("by-name") + .then( + Commands.argument("name", StringArgumentType.greedyString()) + .suggests(BY_NAME) + .executes(ctx -> { + Rewards.ContributorStarby starby = getStarbuncle(starbuncle -> starbuncle.name, StringArgumentType.getString(ctx, "name")); + return spawnStarbuncle(ctx.getSource(), starby); + }) + ) + ) + .then( + Commands.literal("by-adopter") + .then( + Commands.argument("adopter", StringArgumentType.greedyString()) + .suggests(BY_ADOPTER) + .executes(ctx -> { + Rewards.ContributorStarby starby = getStarbuncle(starbuncle -> starbuncle.adopter, StringArgumentType.getString(ctx, "adopter")); + return spawnStarbuncle(ctx.getSource(), starby); + }) + ) + ) + ); + } + + private static Rewards.ContributorStarby getStarbuncle(Function selector, String match) { + return Rewards.starbuncles.stream().filter(starbuncle -> selector.apply(starbuncle).equals(match)).findFirst().orElse(null); + } + + private static int spawnStarbuncle(CommandSourceStack source, Rewards.ContributorStarby starbuncle) { + if (starbuncle == null) { + return 0; + } + + Player player = source.getPlayer(); + if (player == null) return 0; + + Starbuncle starby = new Starbuncle(ModEntities.STARBUNCLE_TYPE.get(), player.level()); + starby.setPos(player.position()); + + starby.setColor(starbuncle.color); + starby.setCustomName(Component.literal(starbuncle.name)); + starby.data.bio = starbuncle.bio; + starby.data.adopter = starbuncle.adopter; + + source.getLevel().addFreshEntity(starby); + + return 1; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index 701f541227..25545c5ea5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -343,6 +343,7 @@ public static void commandRegister(RegisterCommandsEvent event) { AddTomeCommand.register(event.getDispatcher()); SummonAnimHeadCommand.register(event.getDispatcher()); LearnGlyphCommand.register(event.getDispatcher()); + AdoptCommand.register(event.getDispatcher()); } @SubscribeEvent From cc2bec5cf3734c5d63300d1f20568fa8ea6783cb Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Sat, 19 Oct 2024 20:45:06 +0200 Subject: [PATCH 209/363] Cwater++ 21 (#1379) * First Prototype * change names * Update to 1.21 * Updated lang --- .../73a0c150702b0db33c4f7a4031c7885e3223a862 | 2 +- .../assets/ars_nouveau/lang/en_us.json | 4 +- .../ars_nouveau/tags/mob_effect/to_sync.json | 4 +- .../common/datagen/LangDatagen.java | 7 +- .../datagen/PotionEffectTagProvider.java | 2 +- .../arsnouveau/common/lib/LibPotions.java | 1 + .../arsnouveau/common/mixin/EntityMixin.java | 31 ++++++++ .../common/potions/ParticleMobEffect.java | 33 --------- .../common/potions/SoakedEffect.java | 24 ++++++ .../spell/effect/EffectConjureWater.java | 74 ++++++++++++++----- .../common/spell/effect/EffectCrush.java | 2 +- .../arsnouveau/setup/registry/ModPotions.java | 2 + src/main/resources/ars_nouveau.mixins.json | 1 + 13 files changed, 127 insertions(+), 60 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/mixin/EntityMixin.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/potions/ParticleMobEffect.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/potions/SoakedEffect.java diff --git a/src/generated/resources/.cache/73a0c150702b0db33c4f7a4031c7885e3223a862 b/src/generated/resources/.cache/73a0c150702b0db33c4f7a4031c7885e3223a862 index c933f43056..103af981fc 100644 --- a/src/generated/resources/.cache/73a0c150702b0db33c4f7a4031c7885e3223a862 +++ b/src/generated/resources/.cache/73a0c150702b0db33c4f7a4031c7885e3223a862 @@ -1,4 +1,4 @@ // 1.21.1 2024-08-17T10:54:39.1783109 Tags for minecraft:mob_effect mod id ars_nouveau 08d652bf70406a53ea8f4c794d20f054284765b9 data/ars_nouveau/tags/mob_effect/deny_dispel.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/mob_effect/to_sync.json +84bb5fad029e44f32f49e09611492a3f0cede482 data/ars_nouveau/tags/mob_effect/to_sync.json 0315b9264874191953c091e06cf2d340f81d6d67 data/ars_nouveau/tags/mob_effect/unstable_gifts.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index e3ea8acf98..366d18d18c 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -222,7 +222,7 @@ "ars_nouveau.glyph_desc.glyph_break": "A spell you start with. Breaks blocks of an average hardness. Can be amplified to increase the harvest level. Sensitive will simulate breaking blocks with Shears instead of a pickaxe.", "ars_nouveau.glyph_desc.glyph_burst": "Resolves the spell in a spherical area around the target. Augment with Sensitive to target blocks instead of entities and Dampen to make an empty sphere. Augment with AOE to increase the radius. ", "ars_nouveau.glyph_desc.glyph_cold_snap": "Causes wet, slowed, or freezing entities to take a burst of damage and erupt into falling ice. Falling ice will slow and damage nearby entities. Can also be used to erupt a block of ice instead. Falling blocks of ice can be manipulated with the Focus of Block Shaping. Entities afflicted with Freezing will be set to the maximum freeze level immediately.", - "ars_nouveau.glyph_desc.glyph_conjure_water": "Places water at a location or extinguishes entities on fire.", + "ars_nouveau.glyph_desc.glyph_conjure_water": "Places water at a location or extinguishes entities on fire. If augmented with extend time, it will keep entities wet for a longer period of time.", "ars_nouveau.glyph_desc.glyph_craft": "Opens the crafting menu.", "ars_nouveau.glyph_desc.glyph_crush": "Turns stone into gravel, and gravel into sand. Will also crush flowers into bonus dye. Need Sensitive to work on items. For full recipe support, see JEI. Will also harm entities and deals bonus damage to entities that are swimming.", "ars_nouveau.glyph_desc.glyph_cut": "Simulates using shears on entities and blocks, or damages non-shearable entities for a small amount. Amplify will simulate using an Axe instead of Shears. For simulating breaking with shears, see Break and Sensitive. Costs nothing.", @@ -1166,6 +1166,8 @@ "effect.ars_nouveau.shielding": "Shielding", "effect.ars_nouveau.shocked": "Shocked", "effect.ars_nouveau.snared": "Snared", + "effect.ars_nouveau.soaked": "Soaked", + "effect.ars_nouveau.soaked.desc": "Wets the target, protecting from fire and triggering effects as if under the rain.", "effect.ars_nouveau.spell_damage": "Spell Damage", "effect.ars_nouveau.summoning_sickness": "Summoning Sickness", "enchantment.ars_nouveau.mana_boost": "Mana Boost", diff --git a/src/generated/resources/data/ars_nouveau/tags/mob_effect/to_sync.json b/src/generated/resources/data/ars_nouveau/tags/mob_effect/to_sync.json index f72d209df7..a5fb4779b3 100644 --- a/src/generated/resources/data/ars_nouveau/tags/mob_effect/to_sync.json +++ b/src/generated/resources/data/ars_nouveau/tags/mob_effect/to_sync.json @@ -1,3 +1,5 @@ { - "values": [] + "values": [ + "ars_nouveau:soaked" + ] } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 8aaaea5d8e..2e4628bb14 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -15,6 +15,7 @@ import net.minecraft.data.PackOutput; import net.minecraft.world.item.Item; import net.neoforged.neoforge.common.data.LanguageProvider; +import org.jetbrains.annotations.NotNull; import java.util.Map; import java.util.TreeMap; @@ -1288,6 +1289,8 @@ protected void addTranslations() { add("block.ars_nouveau.magic_fire", "Mage Fire"); add("effect.ars_nouveau.immolate", "Immolate"); add("effect.ars_nouveau.immolate.desc", "Enhances fire spells."); + add("effect.ars_nouveau.soaked", "Soaked"); + add("effect.ars_nouveau.soaked.desc", "Wets the target, protecting from fire and triggering effects as if under the rain."); add("block.ars_nouveau.sourceberry_sack", "Sourceberry Sack"); add("ars_nouveau.empty","Empty"); add("ars_nouveau.melder.output_not_unique", "Output potion is not a unique mix."); @@ -1326,12 +1329,12 @@ protected void addTranslations() { } @Override - public void add(Item key, String name) { + public void add(@NotNull Item key, @NotNull String name) { super.add(key, name); } @Override - public void add(String key, String value) { + public void add(@NotNull String key, @NotNull String value) { super.add(key, value); data.put(key, value); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PotionEffectTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PotionEffectTagProvider.java index 0ec04b51e8..0953484767 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PotionEffectTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PotionEffectTagProvider.java @@ -31,6 +31,6 @@ protected void addTags(HolderLookup.Provider pProvider) { ); //placeholder to not leave the tag empty this.tag(PotionEffectTags.DISPEL_DENY).add(ModPotions.SUMMONING_SICKNESS_EFFECT.get()); - this.tag(PotionEffectTags.TO_SYNC); + this.tag(PotionEffectTags.TO_SYNC).add(ModPotions.SOAKED_EFFECT.get()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibPotions.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibPotions.java index 6eccf92f4d..d70ef78c56 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibPotions.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibPotions.java @@ -23,6 +23,7 @@ public class LibPotions { public static final String BLAST = "blasting"; public static final String FREEZING = "freezing"; public static final String DEFENCE = "shielding"; + public static final String SOAKED = "soaked"; public static String potion(String base) { return base + "_potion"; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/EntityMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/EntityMixin.java new file mode 100644 index 0000000000..45a5c67806 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/EntityMixin.java @@ -0,0 +1,31 @@ +package com.hollingsworth.arsnouveau.common.mixin; + +import com.hollingsworth.arsnouveau.setup.registry.ModPotions; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Entity.class) +public class EntityMixin { + + @ModifyReturnValue(method = "isInWaterOrRain", at = @At("RETURN")) + private boolean ars_nouveau$isInWaterOrRain(boolean original) { + if (((Entity) (Object) this) instanceof LivingEntity livingEntity && livingEntity.hasEffect(ModPotions.SOAKED_EFFECT)) { + return true; + } + return original; + } + + @Inject(method = "setRemainingFireTicks", at = @At("HEAD"), cancellable = true) + private void ars_nouveau$setSecondsOnFire(int pRemainingFireTicks, CallbackInfo ci) { + if (((Entity) (Object) this) instanceof LivingEntity livingEntity && livingEntity.hasEffect(ModPotions.SOAKED_EFFECT) && pRemainingFireTicks > 0) { + livingEntity.clearFire(); + ci.cancel(); + } + } + +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/ParticleMobEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/ParticleMobEffect.java deleted file mode 100644 index c78824a18d..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/ParticleMobEffect.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.hollingsworth.arsnouveau.common.potions; - -import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.world.effect.MobEffectCategory; -import net.minecraft.world.entity.LivingEntity; - -public abstract class ParticleMobEffect extends PublicEffect { - - protected ParticleMobEffect(MobEffectCategory pCategory, int pColor) { - super(pCategory, pColor); - } - - @Override - public boolean applyEffectTick(LivingEntity living, int amplifier) { - if (living.level.isClientSide) - if (living.level.random.nextInt(getChance()) == 0) { - living.level.addParticle(getParticle(), living.getRandomX(1.0D), living.getRandomY(), living.getRandomZ(1.0D), 0.0D, 0.0D, 0.0D); - } - return true; - } - - @Override - public boolean shouldApplyEffectTickThisTick(int pDuration, int pAmplifier) { - return true; - } - - public abstract ParticleOptions getParticle(); - - public int getChance() { - return 3; - } - -} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/SoakedEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/SoakedEffect.java new file mode 100644 index 0000000000..4ccf8339e2 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/SoakedEffect.java @@ -0,0 +1,24 @@ +package com.hollingsworth.arsnouveau.common.potions; + +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.entity.LivingEntity; +import org.jetbrains.annotations.NotNull; + +public class SoakedEffect extends MobEffect { + + public SoakedEffect() { + super(MobEffectCategory.NEUTRAL, 0x0000FF, ParticleTypes.DRIPPING_WATER); + } + + @Override + public boolean applyEffectTick(@NotNull LivingEntity living, int amplifier) { + super.applyEffectTick(living, amplifier); + if (living.isOnFire()) { + living.clearFire(); + } + return true; + } + +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectConjureWater.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectConjureWater.java index e6796aecad..74cffcdebe 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectConjureWater.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectConjureWater.java @@ -6,8 +6,12 @@ import com.hollingsworth.arsnouveau.common.items.curios.ShapersFocus; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAOE; +import com.hollingsworth.arsnouveau.common.spell.augment.AugmentExtendTime; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentPierce; +import com.hollingsworth.arsnouveau.common.spell.augment.AugmentSensitive; +import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; @@ -19,12 +23,13 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.Set; -public class EffectConjureWater extends AbstractEffect { +public class EffectConjureWater extends AbstractEffect implements IPotionEffect { public static EffectConjureWater INSTANCE = new EffectConjureWater(); @@ -38,6 +43,13 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul if (entity.isOnFire()) { entity.clearFire(); } + if (entity instanceof LivingEntity livingEntity && spellStats.getDurationMultiplier() > 0) { + applyConfigPotion(livingEntity, ModPotions.SOAKED_EFFECT, spellStats); + } + if (spellStats.isSensitive() && !world.dimensionType().ultraWarm()) { + placeWater((ServerLevel) world, shooter, spellContext, resolver, entity.blockPosition(), Direction.UP); + } + } @Override @@ -47,23 +59,27 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull if (world.dimensionType().ultraWarm()) return; for (BlockPos pos1 : posList) { - if (!BlockUtil.destroyRespectsClaim(getPlayer(shooter, (ServerLevel) world), world, pos1)) - continue; - if(!world.isInWorldBounds(pos1)) - continue; - BlockState hitState = world.getBlockState(pos1); - if (hitState.getBlock() instanceof LiquidBlockContainer liquidBlockContainer && liquidBlockContainer.canPlaceLiquid(getPlayer(shooter, (ServerLevel) world), world, pos1, world.getBlockState(pos1), Fluids.WATER)) { - liquidBlockContainer.placeLiquid(world, pos1, hitState, Fluids.WATER.getSource(true)); - ShapersFocus.tryPropagateBlockSpell(new BlockHitResult( - new Vec3(pos1.getX(), pos1.getY(), pos1.getZ()), rayTraceResult.getDirection(), pos1, false - ), world, shooter, spellContext, resolver); - } else if (world.getBlockState(pos1.relative(rayTraceResult.getDirection())).canBeReplaced(Fluids.WATER)) { - pos1 = pos1.relative(rayTraceResult.getDirection()); - world.setBlockAndUpdate(pos1, Blocks.WATER.defaultBlockState()); - ShapersFocus.tryPropagateBlockSpell(new BlockHitResult( - new Vec3(pos1.getX(), pos1.getY(), pos1.getZ()), rayTraceResult.getDirection(), pos1, false - ), world, shooter, spellContext, resolver); - } + placeWater((ServerLevel) world, shooter, spellContext, resolver, pos1, rayTraceResult.getDirection()); + } + } + + private void placeWater(ServerLevel world, @NotNull LivingEntity shooter, SpellContext spellContext, SpellResolver resolver, BlockPos pos1, Direction direction) { + if (!BlockUtil.destroyRespectsClaim(getPlayer(shooter, world), world, pos1)) + return; + if (!world.isInWorldBounds(pos1)) + return; + BlockState hitState = world.getBlockState(pos1); + if (hitState.getBlock() instanceof LiquidBlockContainer liquidBlockContainer && liquidBlockContainer.canPlaceLiquid(getPlayer(shooter, world), world, pos1, world.getBlockState(pos1), Fluids.WATER)) { + liquidBlockContainer.placeLiquid(world, pos1, hitState, Fluids.WATER.getSource(true)); + ShapersFocus.tryPropagateBlockSpell(new BlockHitResult( + new Vec3(pos1.getX(), pos1.getY(), pos1.getZ()), direction, pos1, false + ), world, shooter, spellContext, resolver); + } else if (world.getBlockState(pos1.relative(direction)).canBeReplaced(Fluids.WATER)) { + pos1 = pos1.relative(direction); + world.setBlockAndUpdate(pos1, Blocks.WATER.defaultBlockState()); + ShapersFocus.tryPropagateBlockSpell(new BlockHitResult( + new Vec3(pos1.getX(), pos1.getY(), pos1.getZ()), direction, pos1, false + ), world, shooter, spellContext, resolver); } } @@ -75,12 +91,12 @@ public int getDefaultManaCost() { @NotNull @Override public Set getCompatibleAugments() { - return augmentSetOf(AugmentAOE.INSTANCE, AugmentPierce.INSTANCE); + return augmentSetOf(AugmentAOE.INSTANCE, AugmentPierce.INSTANCE, AugmentExtendTime.INSTANCE, AugmentSensitive.INSTANCE); } @Override public String getBookDescription() { - return "Places water at a location or extinguishes entities on fire."; + return "Places water at a location or extinguishes entities on fire. If augmented with extend time, it will keep entities wet for a longer period of time."; } @Override @@ -93,4 +109,22 @@ public SpellTier defaultTier() { public Set getSchools() { return setOf(SpellSchools.ELEMENTAL_WATER); } + + + @Override + public int getBaseDuration() { + return POTION_TIME == null ? 30 : POTION_TIME.get(); + } + + @Override + public int getExtendTimeDuration() { + return EXTEND_TIME == null ? 10 : EXTEND_TIME.get(); + } + + @Override + public void buildConfig(ModConfigSpec.Builder builder) { + super.buildConfig(builder); + addPotionConfig(builder, 20); + addExtendTimeConfig(builder, 10); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java index 15f845adb6..a4743efc9f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java @@ -54,7 +54,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @NotNull LivingEnti @Override public void onResolveEntity(EntityHitResult rayTraceResult, Level level,@NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { - float damage = (float) ((rayTraceResult.getEntity().isSwimming() ? DAMAGE.get() * 3.0 : DAMAGE.get()) + AMP_VALUE.get() * spellStats.getAmpMultiplier()); + float damage = (float) ((rayTraceResult.getEntity().isUnderWater() ? DAMAGE.get() * 3.0 : DAMAGE.get()) + AMP_VALUE.get() * spellStats.getAmpMultiplier()); attemptDamage(level, shooter, spellStats, spellContext, resolver, rayTraceResult.getEntity(), buildDamageSource(level, shooter), damage); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java index 2c37f650d3..40840b3f83 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java @@ -48,6 +48,8 @@ public class ModPotions { public static final DeferredHolder IMMOLATE_EFFECT = EFFECTS.register(IMMOLATE, ImmolateEffect::new); public static final DeferredHolder BOUNCE_EFFECT = EFFECTS.register(BOUNCE, BounceEffect::new); public static final DeferredHolder MAGIC_FIND_EFFECT = EFFECTS.register(MAGIC_FIND, MagicFindEffect::new); + public static final DeferredHolder SOAKED_EFFECT = EFFECTS.register(SOAKED, SoakedEffect::new); + public static final DeferredHolder RECOVERY_EFFECT = EFFECTS.register(RECOVERY, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, new ParticleColor(0, 200, 40).getColor())); public static final DeferredHolder BLAST_EFFECT = EFFECTS.register(BLAST, BlastEffect::new); diff --git a/src/main/resources/ars_nouveau.mixins.json b/src/main/resources/ars_nouveau.mixins.json index 7af9c0e809..592507633f 100644 --- a/src/main/resources/ars_nouveau.mixins.json +++ b/src/main/resources/ars_nouveau.mixins.json @@ -19,6 +19,7 @@ "mixins": [ "BrushableBlockEntityAccessor", "DamageSourceMixin", + "EntityMixin", "LivingAccessor", "MobAccessor", "PufferfishAccessor", From a7bd55c964da8fef3fec7ccbb1f229bfa802dcf8 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 19 Oct 2024 13:58:08 -0500 Subject: [PATCH 210/363] add wet support for bubble vehicle --- .../arsnouveau/common/mixin/EntityMixin.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/EntityMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/EntityMixin.java index 45a5c67806..4c16c008b8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/EntityMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/EntityMixin.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.common.mixin; +import com.hollingsworth.arsnouveau.common.entity.BubbleEntity; import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import net.minecraft.world.entity.Entity; @@ -14,7 +15,7 @@ public class EntityMixin { @ModifyReturnValue(method = "isInWaterOrRain", at = @At("RETURN")) private boolean ars_nouveau$isInWaterOrRain(boolean original) { - if (((Entity) (Object) this) instanceof LivingEntity livingEntity && livingEntity.hasEffect(ModPotions.SOAKED_EFFECT)) { + if (((Entity) (Object) this) instanceof LivingEntity livingEntity && isWet(livingEntity)) { return true; } return original; @@ -22,10 +23,14 @@ public class EntityMixin { @Inject(method = "setRemainingFireTicks", at = @At("HEAD"), cancellable = true) private void ars_nouveau$setSecondsOnFire(int pRemainingFireTicks, CallbackInfo ci) { - if (((Entity) (Object) this) instanceof LivingEntity livingEntity && livingEntity.hasEffect(ModPotions.SOAKED_EFFECT) && pRemainingFireTicks > 0) { + if (((Entity) (Object) this) instanceof LivingEntity livingEntity && isWet(livingEntity) && pRemainingFireTicks > 0) { livingEntity.clearFire(); ci.cancel(); } } + + private static boolean isWet(LivingEntity livingEntity){ + return livingEntity.hasEffect(ModPotions.SOAKED_EFFECT) || livingEntity.getVehicle() instanceof BubbleEntity; + } } From 58ee7cd9bc03be53778fc77b0f755d0d9232bc80 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 19 Oct 2024 14:56:40 -0500 Subject: [PATCH 211/363] Rename duration down to reduce time --- .../resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 ++-- src/generated/resources/assets/ars_nouveau/lang/en_us.json | 2 +- .../com/hollingsworth/arsnouveau/common/lib/GlyphLib.java | 2 +- .../arsnouveau/common/spell/augment/AugmentDurationDown.java | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 873003be35..f1421aabbf 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-10-19T11:29:05.7106388 Languages: en_us for mod: ars_nouveau -1f7d257f71563f0101788e6091ba2aca24204ee5 assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-10-19T14:01:35.9295968 Languages: en_us for mod: ars_nouveau +7b809bfd6414aa8c9dfb843b6fe4319abeb4c2ed assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 366d18d18c..f9a847bb40 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -313,7 +313,7 @@ "ars_nouveau.glyph_name.glyph_decelerate": "Decelerate", "ars_nouveau.glyph_name.glyph_delay": "Delay", "ars_nouveau.glyph_name.glyph_dispel": "Dispel", - "ars_nouveau.glyph_name.glyph_duration_down": "Duration Down", + "ars_nouveau.glyph_name.glyph_duration_down": "Reduce Time", "ars_nouveau.glyph_name.glyph_ender_inventory": "Access Ender Inventory", "ars_nouveau.glyph_name.glyph_evaporate": "Evaporate", "ars_nouveau.glyph_name.glyph_exchange": "Exchange", diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/GlyphLib.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/GlyphLib.java index 7734eefc6c..e1a4a8e5ec 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/GlyphLib.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/GlyphLib.java @@ -33,7 +33,7 @@ public class GlyphLib { public static final String AugmentAccelerateID = prependGlyph("accelerate"); public static final String AugmentDecelerateID = prependGlyph("decelerate"); public static final String AugmentExtendTimeID = prependGlyph("extend_time"); - public static final String AugmentDurationDown = prependGlyph("duration_down"); + public static final String AugmentReduceTime = prependGlyph("duration_down"); //TODO: 1.22 change key to reduce_time public static final String AugmentSensitiveID = prependGlyph("sensitive"); public static final String AugmentRandomizeID = prependGlyph("randomize"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/augment/AugmentDurationDown.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/augment/AugmentDurationDown.java index 9b26a76d4d..c27dfeab68 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/augment/AugmentDurationDown.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/augment/AugmentDurationDown.java @@ -10,7 +10,7 @@ public class AugmentDurationDown extends AbstractAugment { public static AugmentDurationDown INSTANCE = new AugmentDurationDown(); private AugmentDurationDown() { - super(GlyphLib.AugmentDurationDown, "Duration Down"); + super(GlyphLib.AugmentReduceTime, "Reduce Time"); } @Override From 6e032a75ffa218f6803744718adb8cbc3128c44a Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 19 Oct 2024 15:23:39 -0500 Subject: [PATCH 212/363] Increase alakarkinos size, update bubble glyph --- .../arsnouveau/setup/registry/ModEntities.java | 2 +- .../assets/ars_nouveau/textures/item/bubble.png | Bin 480 -> 481 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java index c21e507274..aebad8384f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java @@ -87,7 +87,7 @@ public boolean isNoGravity() { .setShouldReceiveVelocityUpdates(true)); public static final DeferredHolder, EntityType> ALAKARKINOS_TYPE = registerEntity(LibEntityNames.ALAKARKINOS, EntityType.Builder.of(Alakarkinos::new, MobCategory.CREATURE) - .sized(0.6F, 0.63F).setTrackingRange(10) + .sized(0.75f, 0.8f).setTrackingRange(10) .setShouldReceiveVelocityUpdates(true)); public static final DeferredHolder, EntityType> ENTITY_FOLLOW_PROJ = registerEntity( diff --git a/src/main/resources/assets/ars_nouveau/textures/item/bubble.png b/src/main/resources/assets/ars_nouveau/textures/item/bubble.png index 82056e922838055acf99bf5259a752900647646f..6d59b987199d8b39c7f1f8996475c332b61d8515 100644 GIT binary patch delta 442 zcmV;r0Y(1c1K|UZF@Kv$L_t(Ijh&OROT$nQhrbuP)S!??D~3RdxVkzD4h}^H!7W`} zb#ZW0i$jaMe}OJm5Cox0hYo_HYZpN&4U|f2V+TpI8Hf5}lS&bP+vDB$dw2Kl1m7~Q zE(7KD0|3uyP@H-ayT{k^n$-SbpjsIKKIbO6QD4N;S{@-`y?=1Ru$rqINWgO%nALLR z-pwCyqrM0s;jI;enUu=BHH)4$NG2!HrcD5P-6p=@$L+MJJ8j$O)4s<3s3;$oH$GZXmo8H36 kI?r3PAz;_Ek#z?60!k*}YBw~g-v9sr07*qoM6N<$f=Rm4MgRZ+ delta 441 zcmV;q0Y?7e1KOLc6)1 zE5mmH9J5b->scJ0-^y*G$ES1ENCEJX+~iK}irxJxLc+1y1%Ljqas?#dn0@qiYiZxE zo^Ypjg^=*Up2l`mC2i~wOK60{8${wd0Ml0s*PUUH2lUJllQ)Ok#{qWrgpf=-2$zm7 zmu_q}D#Q}n*J=cSGJGc_4+P;tU8`Es3nx$X%buFfbOT@ns& zcoN6#qcpQqVSnWcD{wG_pv1}*XlAEE>6s%`BjtUVKjoh!0Fk)vRY>vI+JDn;a4;14 zmg%eYCjb^@m4By1k5A`%yM^n{Xf`TK9~TT+3D=#Ww_B7tk+~w@Vvh%FC4Sf*4**b& z)OR2B%tdp=655XvKP=Azgg%m+08HK-WQR$~x>kn8P%??9`x-?j^Z#Lbx~~CHbTTXB joHlkmpwx-1j5EL|0pH`W*w!hj00000NkvXXu0mjfvS!jV From 15f2cb9120ec1416abed94c9d3890e985bda351d Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 19 Oct 2024 15:27:28 -0500 Subject: [PATCH 213/363] Fix infuse always giving caster the effect --- .../arsnouveau/common/spell/effect/EffectInfuse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java index f4d00b0fd0..8f534e5d25 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java @@ -68,7 +68,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul if(potionData == null){ return; } - PotionUtil.applyContents(potionData, shooter, shooter, livingEntity); + PotionUtil.applyContents(potionData, livingEntity, shooter, shooter); } public @Nullable PotionContents getPotionData(Level world, @NotNull LivingEntity shooter, SpellContext spellContext){ From 6f45094a32ad29c5091ea34c46b1adce2267f03c Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 19 Oct 2024 19:01:32 -0500 Subject: [PATCH 214/363] Fix bubble namespace --- .../assets/ars_nouveau/lang/en_us.json | 4 +-- .../ars_nouveau/models/item/glyph_bubble.json | 6 ++++ .../en_us/entries/glyphs_1/glyph_bubble.json | 16 +++++++++++ .../data/ars_nouveau/recipe/glyph_bubble.json | 28 +++++++++++++++++++ .../arsnouveau/common/lib/GlyphLib.java | 1 + .../common/spell/effect/EffectBubble.java | 3 +- 6 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/glyph_bubble.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_bubble.json create mode 100644 src/generated/resources/data/ars_nouveau/recipe/glyph_bubble.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index f9a847bb40..093655397d 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -212,7 +212,6 @@ "ars_nouveau.getting_started": "Getting Started", "ars_nouveau.getting_started_desc": "An introduction to Ars Nouveau. It is recommended to follow each section in order.", "ars_nouveau.glyph_crafting": "Glyph Crafting", - "ars_nouveau.glyph_desc.bubble": "", "ars_nouveau.glyph_desc.glyph_accelerate": "Increases the speed of projectile spells.", "ars_nouveau.glyph_desc.glyph_amplify": "Additively increases the power of most spell effects. Can increase the harvest level of Break and increases the damage of spells.", "ars_nouveau.glyph_desc.glyph_animate_block": "Animates a block to fight for you. The animated block will convert to a falling block when it dies. Costs a large amount of mana, but does not grant Summoning Sickness", @@ -220,6 +219,7 @@ "ars_nouveau.glyph_desc.glyph_blink": "Teleports the caster to a location. If an entity is hit and the caster is holding a Warp Scroll in the offhand, the entity will be warped to the location on the Warp Scroll. When used on Self, the caster blinks forward. Spell Turrets and Runes can warp entities using Warp Scrolls from adjacent inventories without consuming the scroll.", "ars_nouveau.glyph_desc.glyph_bounce": "Gives players the Bounce effect, causing them to bounce upwards upon falling. Amplification of Bounce will preserve additional forward facing motion per bounce.", "ars_nouveau.glyph_desc.glyph_break": "A spell you start with. Breaks blocks of an average hardness. Can be amplified to increase the harvest level. Sensitive will simulate breaking blocks with Shears instead of a pickaxe.", + "ars_nouveau.glyph_desc.glyph_bubble": "", "ars_nouveau.glyph_desc.glyph_burst": "Resolves the spell in a spherical area around the target. Augment with Sensitive to target blocks instead of entities and Dampen to make an empty sphere. Augment with AOE to increase the radius. ", "ars_nouveau.glyph_desc.glyph_cold_snap": "Causes wet, slowed, or freezing entities to take a burst of damage and erupt into falling ice. Falling ice will slow and damage nearby entities. Can also be used to erupt a block of ice instead. Falling blocks of ice can be manipulated with the Focus of Block Shaping. Entities afflicted with Freezing will be set to the maximum freeze level immediately.", "ars_nouveau.glyph_desc.glyph_conjure_water": "Places water at a location or extinguishes entities on fire. If augmented with extend time, it will keep entities wet for a longer period of time.", @@ -295,7 +295,6 @@ "ars_nouveau.glyph_desc.reset": "Resets the spell chain to the original target if it was changed by a previous effect. For example, Burst -> Place Block -> Reset -> Break will cause Burst to place blocks, but only Break will apply to the original location. As a result, using Reset will allow you to bypass combination and duplicate limits on glyphs.", "ars_nouveau.glyph_desc.rewind": "Rewinds an entity back in time to its previous locations and health. Can revert blocks that were moved with spells back into solid blocks. Glyphs that come after Rewind will be cast at the end of the rewind, as if they were Delayed.", "ars_nouveau.glyph_desc.wololo": "Changes the color of an entity or compatible block to the color of the spell.", - "ars_nouveau.glyph_name.bubble": "Captures mobs and entities it touches, causing them to float upwards. If the bubble has been alive for at least one tick, damaging the entity trapped in the bubble will cause it to pop, dealing bonus damage to the entity inside. Extend time and amplify can be used to increase the duration and damage of the bubble.", "ars_nouveau.glyph_name.glyph_accelerate": "Accelerate", "ars_nouveau.glyph_name.glyph_amplify": "Amplify", "ars_nouveau.glyph_name.glyph_animate_block": "Animate Block", @@ -303,6 +302,7 @@ "ars_nouveau.glyph_name.glyph_blink": "Blink", "ars_nouveau.glyph_name.glyph_bounce": "Bounce", "ars_nouveau.glyph_name.glyph_break": "Break", + "ars_nouveau.glyph_name.glyph_bubble": "Captures mobs and entities it touches, causing them to float upwards. If the bubble has been alive for at least one tick, damaging the entity trapped in the bubble will cause it to pop, dealing bonus damage to the entity inside. Extend time and amplify can be used to increase the duration and damage of the bubble.", "ars_nouveau.glyph_name.glyph_burst": "Burst", "ars_nouveau.glyph_name.glyph_cold_snap": "Cold Snap", "ars_nouveau.glyph_name.glyph_conjure_water": "Conjure Water", diff --git a/src/generated/resources/assets/ars_nouveau/models/item/glyph_bubble.json b/src/generated/resources/assets/ars_nouveau/models/item/glyph_bubble.json new file mode 100644 index 0000000000..9a0ab8a7d1 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/glyph_bubble.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ars_nouveau:item/bubble" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_bubble.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_bubble.json new file mode 100644 index 0000000000..1a6d5a7a31 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_bubble.json @@ -0,0 +1,16 @@ +{ + "category": "ars_nouveau:glyphs_1", + "icon": "ars_nouveau:glyph_bubble", + "name": "ars_nouveau.glyph_name.glyph_bubble", + "pages": [ + { + "type": "patchouli:text", + "text": "ars_nouveau.glyph_desc.glyph_bubble" + }, + { + "type": "ars_nouveau:glyph_recipe", + "recipe": "ars_nouveau:glyph_bubble" + } + ], + "sortnum": 2 +} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/glyph_bubble.json b/src/generated/resources/data/ars_nouveau/recipe/glyph_bubble.json new file mode 100644 index 0000000000..3fed355e55 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/glyph_bubble.json @@ -0,0 +1,28 @@ +{ + "type": "ars_nouveau:glyph", + "exp": 27, + "inputs": [ + { + "tag": "c:feathers" + }, + { + "tag": "c:feathers" + }, + { + "tag": "c:feathers" + }, + { + "item": "minecraft:water_bucket" + }, + { + "tag": "minecraft:boats" + }, + { + "item": "ars_nouveau:water_essence" + } + ], + "output": { + "count": 1, + "id": "ars_nouveau:glyph_bubble" + } +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/GlyphLib.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/GlyphLib.java index e1a4a8e5ec..4630122c04 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/GlyphLib.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/GlyphLib.java @@ -20,6 +20,7 @@ public class GlyphLib { public static final String EffectLaunchID = prependGlyph("launch"); public static final String EffectPullID = prependGlyph("pull"); public static final String EffectBlinkID = prependGlyph("blink"); + public static final String EffectBubbleID = prependGlyph("bubble"); public static final String EffectNameID = prependGlyph("name"); public static final String EffectAnimateID = prependGlyph("animate_block"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java index 89542b4abd..a1709acf96 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.common.entity.BubbleEntity; +import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDampen; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDurationDown; @@ -19,7 +20,7 @@ public class EffectBubble extends AbstractEffect { public static final EffectBubble INSTANCE = new EffectBubble(); public EffectBubble() { - super("bubble", "Captures mobs and entities it touches, causing them to float upwards. If the bubble has been alive for at least one tick, damaging the entity trapped in the bubble will cause it to pop, dealing bonus damage to the entity inside. Extend time and amplify can be used to increase the duration and damage of the bubble."); + super(GlyphLib.EffectBubbleID, "Captures mobs and entities it touches, causing them to float upwards. If the bubble has been alive for at least one tick, damaging the entity trapped in the bubble will cause it to pop, dealing bonus damage to the entity inside. Extend time and amplify can be used to increase the duration and damage of the bubble."); } @Override From cc524eaa91434d7c1d050d9a78c1ce16be450af8 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 19 Oct 2024 19:03:25 -0500 Subject: [PATCH 215/363] Remove old bubble files --- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 +-- .../a4c3c262a85f6a179e7e29128e8b31d4da806803 | 4 +-- .../e7c243f38c2b0774b1bff1a90ede0b19a4077240 | 4 +-- .../f0f2bcace349d412215f006e6183aa56b9316c3c | 4 +-- .../ars_nouveau/models/item/bubble.json | 6 ---- .../en_us/entries/glyphs_1/bubble.json | 16 ----------- .../data/ars_nouveau/recipe/bubble.json | 28 ------------------- 7 files changed, 8 insertions(+), 58 deletions(-) delete mode 100644 src/generated/resources/assets/ars_nouveau/models/item/bubble.json delete mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/bubble.json delete mode 100644 src/generated/resources/data/ars_nouveau/recipe/bubble.json diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index f1421aabbf..e6b1c35830 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-10-19T14:01:35.9295968 Languages: en_us for mod: ars_nouveau -7b809bfd6414aa8c9dfb843b6fe4319abeb4c2ed assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-10-19T19:02:13.834883 Languages: en_us for mod: ars_nouveau +ab6d8e29f813b8353aa0acd1bfda0b35be65a3e6 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 index 5fe7e485b8..f7f7bdb035 100644 --- a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 +++ b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 @@ -1,4 +1,4 @@ -// 1.21.1 2024-09-28T20:07:13.4881389 Ars Nouveau Item Models +// 1.21.1 2024-10-19T19:02:13.8318776 Ars Nouveau Item Models 11ee554b11a3a830e89b742762e5b754c2ecb5ee assets/ars_nouveau/models/item/agronomic_sourcelink.json 20a434b964b88bc010c17e0616f2c2601b53479d assets/ars_nouveau/models/item/alakarkinos_charm.json 533b61aabca43719a266cddda3b7ec426135e5e6 assets/ars_nouveau/models/item/alakarkinos_hat.json @@ -11,7 +11,6 @@ f9eb0905e283cab647712716770a244a1bdb25f0 assets/ars_nouveau/models/item/bastion_ 84bdd95fc8506c6d9054e5ffb87c24c20b2ae628 assets/ars_nouveau/models/item/blank_thread.json a81ea25c1312389ff436100c29d1ae20d35b0a40 assets/ars_nouveau/models/item/blue_sbed.json 3b7dc3023a667efe5ff64cb937ee25047a853697 assets/ars_nouveau/models/item/bombegranate_pod.json -86e2436793db61ff59fd3404138dc41d98dd94f3 assets/ars_nouveau/models/item/bubble.json 23781f068b9b788d0077a478b0470af583d759f5 assets/ars_nouveau/models/item/experience_gem.json 70d392c53a05ad554f3f3b1d3faa5fd1445e2a77 assets/ars_nouveau/models/item/falseweave.json 5f620c31cc6d4f1a569dbd943e5a45e75217303a assets/ars_nouveau/models/item/familiar_amethyst_golem.json @@ -44,6 +43,7 @@ e90b0d3b7816c04c63969ee51f69f521d44d5444 assets/ars_nouveau/models/item/glyph_an 8ad4f1e52ce9f588136032f323a0d76fc4849101 assets/ars_nouveau/models/item/glyph_blink.json 7441fa49080a68e1d9dfdaeb277d9b17229aac87 assets/ars_nouveau/models/item/glyph_bounce.json c3de1abdd00608d7f5b4b71953119d218787f318 assets/ars_nouveau/models/item/glyph_break.json +86e2436793db61ff59fd3404138dc41d98dd94f3 assets/ars_nouveau/models/item/glyph_bubble.json 57a68c0d674b3622478b1b83f8543be58f6e3018 assets/ars_nouveau/models/item/glyph_burst.json 25e3368d3a84c449ff2d6c7ca27f76377fa2b3a7 assets/ars_nouveau/models/item/glyph_cold_snap.json 715f6e40e53b95cd4c4bd566ab43e226872ed02b assets/ars_nouveau/models/item/glyph_conjure_water.json diff --git a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 index 3e13c3f6a2..cf0dd735f2 100644 --- a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 +++ b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 @@ -1,4 +1,4 @@ -// 1.21.1 2024-10-15T16:00:11.9296346 Patchouli +// 1.21.1 2024-10-19T19:02:13.8358828 Patchouli 2ec536fea831588201432d61d70af61385882054 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/alteration_table.json a82f4fc73946d228b1e3f5e03d0ecef46f33cdfb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/applying_perks.json 8ce1d8e886b45066bc5c1d9d8e87bdabbb27ae27 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor.json @@ -90,10 +90,10 @@ a09f89d0ec927fce49d1736c39305bcfeac052cf assets/ars_nouveau/patchouli_books/worn 81fcf49cd2e09ae38f0105066a60dd0c996a8146 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/trinkets.json 877210c24dbbaf4e365c30c8ba571cf2708e7d03 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/upgrades.json 521277fbf32424a30a8be24b137c786dc0b89cdc assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/world_generation.json -32d9a6742c501ca01e1869196a915199b74b153d assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/bubble.json a80d0aabd3eff91451b0e80fb34514c5ce57eadf assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_amplify.json e6a01dcd171d462c0eb988478f64f994c63180f0 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_bounce.json 7d579e642d5c9a7c5dba516e1eadca7d87f9ad56 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_break.json +eb15f2f9c76d93709c34b433813730699ed7936b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_bubble.json 82768fc93e42445de3bc7bb16615dc28f7f11533 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_craft.json 399cd02e6fb2950c465d058cdc470ca0082c58e1 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_cut.json 13799a3efaff17fa0a56d7de80276bd9a43aa278 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_delay.json diff --git a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c index 327bf8cd24..9a6b6bca83 100644 --- a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c +++ b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c @@ -1,5 +1,4 @@ -// 1.21.1 2024-10-15T18:07:37.2585715 Glyph Recipes -6c563826d1fe155941d93be36f12ec651e3043f0 data/ars_nouveau/recipe/bubble.json +// 1.21.1 2024-10-19T19:02:13.8288799 Glyph Recipes 231d9f126c606465601e36e83948dda99a508834 data/ars_nouveau/recipe/glyph_accelerate.json dbad772acd31382cfcf19c7f276da5f91354dfcf data/ars_nouveau/recipe/glyph_amplify.json 1a8499b67d1ce8614ef1d420106d32d27567eeb9 data/ars_nouveau/recipe/glyph_animate_block.json @@ -7,6 +6,7 @@ dbad772acd31382cfcf19c7f276da5f91354dfcf data/ars_nouveau/recipe/glyph_amplify.j c827180b8f5111736c1641e4683e63b3f764a80a data/ars_nouveau/recipe/glyph_blink.json e7d1836f1f0438e05c86aee27c2de1d32742f217 data/ars_nouveau/recipe/glyph_bounce.json 6989360984c711d43b4e9175efbec3a23608db8e data/ars_nouveau/recipe/glyph_break.json +9af644833096edb37284b038a00e101269cd1893 data/ars_nouveau/recipe/glyph_bubble.json c5d245630add4160c2ea36ef8df4add7a45f7616 data/ars_nouveau/recipe/glyph_burst.json 5a951b64a1a102d1e71ee5ba85524cf1877378d5 data/ars_nouveau/recipe/glyph_cold_snap.json 72ba14e65f67b1d570b69ec9ad7b99e59cd3f4b4 data/ars_nouveau/recipe/glyph_conjure_water.json diff --git a/src/generated/resources/assets/ars_nouveau/models/item/bubble.json b/src/generated/resources/assets/ars_nouveau/models/item/bubble.json deleted file mode 100644 index 9a0ab8a7d1..0000000000 --- a/src/generated/resources/assets/ars_nouveau/models/item/bubble.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "ars_nouveau:item/bubble" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/bubble.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/bubble.json deleted file mode 100644 index 9838325ec2..0000000000 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/bubble.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "category": "ars_nouveau:glyphs_1", - "icon": "ars_nouveau:bubble", - "name": "ars_nouveau.glyph_name.bubble", - "pages": [ - { - "type": "patchouli:text", - "text": "ars_nouveau.glyph_desc.bubble" - }, - { - "type": "ars_nouveau:glyph_recipe", - "recipe": "ars_nouveau:bubble" - } - ], - "sortnum": 2 -} \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/bubble.json b/src/generated/resources/data/ars_nouveau/recipe/bubble.json deleted file mode 100644 index 4b4c14dad6..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipe/bubble.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "type": "ars_nouveau:glyph", - "exp": 27, - "inputs": [ - { - "tag": "c:feathers" - }, - { - "tag": "c:feathers" - }, - { - "tag": "c:feathers" - }, - { - "item": "minecraft:water_bucket" - }, - { - "tag": "minecraft:boats" - }, - { - "item": "ars_nouveau:water_essence" - } - ], - "output": { - "count": 1, - "id": "ars_nouveau:bubble" - } -} \ No newline at end of file From 81940bda0067b896c7d57ee85424490aaae0d9d2 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 19 Oct 2024 23:08:20 -0500 Subject: [PATCH 216/363] Fix spell damage potion #1404 --- .../com/hollingsworth/arsnouveau/setup/registry/ModPotions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java index 40840b3f83..3df824acf9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModPotions.java @@ -44,7 +44,7 @@ public class ModPotions { public static final DeferredHolder SNARE_EFFECT = EFFECTS.register(SNARE, SnareEffect::new); public static final DeferredHolder FLIGHT_EFFECT = EFFECTS.register(FLIGHT, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, 2039587).addAttributeModifier(NeoForgeMod.CREATIVE_FLIGHT, ArsNouveau.prefix("flight"), 1.0, AttributeModifier.Operation.ADD_VALUE)); public static final DeferredHolder GRAVITY_EFFECT = EFFECTS.register(GRAVITY, GravityEffect::new); - public static final DeferredHolder SPELL_DAMAGE_EFFECT = EFFECTS.register(SPELL_DAMAGE, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, new ParticleColor(30, 200, 200).getColor())); + public static final DeferredHolder SPELL_DAMAGE_EFFECT = EFFECTS.register(SPELL_DAMAGE, () -> new PublicEffect(MobEffectCategory.BENEFICIAL, new ParticleColor(30, 200, 200).getColor()).addAttributeModifier(PerkAttributes.SPELL_DAMAGE_BONUS, ArsNouveau.prefix("spell_damage_bonus"), 1.0, AttributeModifier.Operation.ADD_VALUE)); public static final DeferredHolder IMMOLATE_EFFECT = EFFECTS.register(IMMOLATE, ImmolateEffect::new); public static final DeferredHolder BOUNCE_EFFECT = EFFECTS.register(BOUNCE, BounceEffect::new); public static final DeferredHolder MAGIC_FIND_EFFECT = EFFECTS.register(MAGIC_FIND, MagicFindEffect::new); From 067a0358d512dc81801134c10f6c9b0d8ad87ed2 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 20 Oct 2024 08:56:46 -0500 Subject: [PATCH 217/363] 5.2.0 --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 2f59c14415..9e6dc69768 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ neogradle.subsystems.recompiler.maxMemory=4G neogradle.subsystems.parchment.minecraftVersion=1.21.0 neogradle.subsystems.parchment.mappingsVersion=2024.07.28 -minecraft_version=1.21.0 +minecraft_version=1.21.1 parchment_version=2024.07.28 minecraft_version_range=[1.20.6,1.21.2) neo_version=21.1.66 @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.1.0 +mod_version=5.2.0 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 535017f8c39d1bee775b1a730372c3af81d54704 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 20 Oct 2024 14:05:28 -0500 Subject: [PATCH 218/363] Fix bubble lang #1448 --- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 ++-- .../e7c243f38c2b0774b1bff1a90ede0b19a4077240 | 4 ++-- .../resources/assets/ars_nouveau/lang/en_us.json | 15 ++++++++------- .../arsnouveau/common/datagen/LangDatagen.java | 11 ++++++----- .../common/spell/effect/EffectBubble.java | 7 ++++++- 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index e6b1c35830..74e3da8eb0 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-10-19T19:02:13.834883 Languages: en_us for mod: ars_nouveau -ab6d8e29f813b8353aa0acd1bfda0b35be65a3e6 assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-10-20T13:23:57.3527592 Languages: en_us for mod: ars_nouveau +fc53acf5bc787081dc3d403020476dc488a534f7 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 index cf0dd735f2..28c846d2e7 100644 --- a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 +++ b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 @@ -1,4 +1,4 @@ -// 1.21.1 2024-10-19T19:02:13.8358828 Patchouli +// 1.21.1 2024-10-20T13:23:57.3547595 Patchouli 2ec536fea831588201432d61d70af61385882054 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/alteration_table.json a82f4fc73946d228b1e3f5e03d0ecef46f33cdfb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/applying_perks.json 8ce1d8e886b45066bc5c1d9d8e87bdabbb27ae27 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor.json @@ -191,7 +191,7 @@ eb9ec934fad69de9859f3ea369e0b425e5f49a8e assets/ars_nouveau/patchouli_books/worn 7be64662ebd5e76cdc477b564d6554127f1f41a0 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/storage_lectern.json e797ff6d4a79504b65178376196d5442fed62f42 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/warp_portal.json 71b1f74e7cc2ad20e3a61b777a7b46ea53f93a02 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mod_news/mod_news.json -ef537c19f4d82731675ea19c6b24223bc44f97a1 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mod_news/support_mod.json +21aed4a27c6c0ad3be1f054f3fc1d3317aa0a03b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mod_news/support_mod.json c0133d1f6bc4d504f978862421be5322cce9a8f2 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/archwood.json be9750fac4d703ce1091a78ddd1e68afe7d07c57 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/archwood_forest.json a8873366db454ebb1a2b3bc4b4a1e231c1149368 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/decorative.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 093655397d..05c1fa8b6f 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -219,7 +219,7 @@ "ars_nouveau.glyph_desc.glyph_blink": "Teleports the caster to a location. If an entity is hit and the caster is holding a Warp Scroll in the offhand, the entity will be warped to the location on the Warp Scroll. When used on Self, the caster blinks forward. Spell Turrets and Runes can warp entities using Warp Scrolls from adjacent inventories without consuming the scroll.", "ars_nouveau.glyph_desc.glyph_bounce": "Gives players the Bounce effect, causing them to bounce upwards upon falling. Amplification of Bounce will preserve additional forward facing motion per bounce.", "ars_nouveau.glyph_desc.glyph_break": "A spell you start with. Breaks blocks of an average hardness. Can be amplified to increase the harvest level. Sensitive will simulate breaking blocks with Shears instead of a pickaxe.", - "ars_nouveau.glyph_desc.glyph_bubble": "", + "ars_nouveau.glyph_desc.glyph_bubble": "Captures mobs and entities it touches, causing them to float upwards. If the bubble has been alive for at least one tick, damaging the entity trapped in the bubble will cause it to pop, dealing bonus damage to the entity inside. Extend time and amplify can be used to increase the duration and damage of the bubble.", "ars_nouveau.glyph_desc.glyph_burst": "Resolves the spell in a spherical area around the target. Augment with Sensitive to target blocks instead of entities and Dampen to make an empty sphere. Augment with AOE to increase the radius. ", "ars_nouveau.glyph_desc.glyph_cold_snap": "Causes wet, slowed, or freezing entities to take a burst of damage and erupt into falling ice. Falling ice will slow and damage nearby entities. Can also be used to erupt a block of ice instead. Falling blocks of ice can be manipulated with the Focus of Block Shaping. Entities afflicted with Freezing will be set to the maximum freeze level immediately.", "ars_nouveau.glyph_desc.glyph_conjure_water": "Places water at a location or extinguishes entities on fire. If augmented with extend time, it will keep entities wet for a longer period of time.", @@ -302,7 +302,7 @@ "ars_nouveau.glyph_name.glyph_blink": "Blink", "ars_nouveau.glyph_name.glyph_bounce": "Bounce", "ars_nouveau.glyph_name.glyph_break": "Break", - "ars_nouveau.glyph_name.glyph_bubble": "Captures mobs and entities it touches, causing them to float upwards. If the bubble has been alive for at least one tick, damaging the entity trapped in the bubble will cause it to pop, dealing bonus damage to the entity inside. Extend time and amplify can be used to increase the duration and damage of the bubble.", + "ars_nouveau.glyph_name.glyph_bubble": "Bubble", "ars_nouveau.glyph_name.glyph_burst": "Burst", "ars_nouveau.glyph_name.glyph_cold_snap": "Cold Snap", "ars_nouveau.glyph_name.glyph_conjure_water": "Conjure Water", @@ -430,6 +430,7 @@ "ars_nouveau.mod_news": "Mod News", "ars_nouveau.mod_news_desc": "The latest releases and news", "ars_nouveau.no_stack_crafting": "No valid craft nearby.", + "ars_nouveau.nook": "Patrons may summon Nook, a faithfulish tail wagging companion.", "ars_nouveau.norecipe": "No recipe found.", "ars_nouveau.not_enough_exp": "Not enough EXP for this glyph.", "ars_nouveau.nothing": "Nothing", @@ -548,7 +549,6 @@ "ars_nouveau.page1.imbuement_chamber": "Imbues certain items with Source to create new items. The primary way to obtain Source Gems, amethyst and lapis may be used to create Source Gems. The Imbuement Chamber will passively accumulate source for recipes, or will draw from Source Jars 2 block away. Some recipes require additional items placed in pedestals within 1 block of the Imbuement Chamber, such as Essences. Items in pedestals will not be consumed.", "ars_nouveau.page1.item_detector": "A Display Case can be configured to output a redstone signal when a certain level of inventory is reached. To set the item for tracking, use an item on the case. Interact with the block to increase the count, and punch to decrease. To link to an inventory, Dominion Wand an inventory to the display case. Wanding while sneaking will invert if the signal outputs below or greater than the set count.", "ars_nouveau.page1.jump_ring": "Allows the user to continue jumping in the air. Each jump will expend mana.", - "ars_nouveau.page1.lava_lily": "A decorative block that can be placed on any liquid or block. The texture of this block varies if it is placed on Lava, a Magma Block, or any other block.", "ars_nouveau.page1.magelight_torch": "Decorative lights. To ignite, cast Light on the sconce. The color of the flame corresponds with your spell color. The Magelight Torch on a wall can change the direction of its flames by interacting. Use Touch or Projectile Sensitive to target the sconce.", "ars_nouveau.page1.mimic_scroll": "Provides a list of items to automation related entities. When this scroll is attached to an inventory, entities will only insert items that already exist in the inventory. To attach the scroll, place an item frame on the inventory, and place a Mimic Scroll in it.", "ars_nouveau.page1.mob_jar": "Allows you to capture and store mobs for transportation or decoration. To capture a mob, you must perform a Ritual of Containment. See the Ritual of Containment for more info. To release a mob, cast Dispel on the jar and the mob will be released above the jar. Note Blocks placed above a jar will play an ambient sound of the mob inside.", @@ -624,7 +624,7 @@ "ars_nouveau.page3.starbuncle_charm": "To summon a Starbuncle, use a Starbuncle charm on the ground. Summoned Starbuncles will pickup nearby items and can move items between inventories such as chests. Starbuncles will harvest fully grown Source Berry bushes around it. A Starbuncle will drop its charm when Dispelled or when killed. You may dye them any color.", "ars_nouveau.page3.storage": "Linked inventories that are named will create a tab in the Storage Lectern, allowing you to view and manipulate all inventories that share that name. Unlike normal chests, Repositories will preserve their name when dropped. The Name Effect can also name inventories placed in the world.", "ars_nouveau.page3.summoning_familiars": "Typically only one familiar may be out at a time, and summoning another familiar will remove others bound to you. You may dismiss your own familiar by casting Dispel on it. In exchange for empowering the owner, familiars will reserve a portion of max mana from their owner for as long as they persist in the world.", - "ars_nouveau.page3.volcanic_sourcelink": "The Volcanic Sourcelink will occasionally convert Stone into Magma Blocks, and Magma Blocks into Lava, given that these blocks exist beneath it in its 3x3 area. This conversion is dependent on the amount of $(item)heat$() it has produced over time. The Volcanic Sourcelink will also spawn a Lava Lily adjacent to it given that there is nothing covering the lava. Lava Lilys may be harvested and used for decoration.", + "ars_nouveau.page3.volcanic_sourcelink": "The Volcanic Sourcelink will occasionally convert Stone into Magma Blocks, and Magma Blocks into Lava, given that these blocks exist beneath it in its 3x3 area. This conversion is dependent on the amount of $(item)heat$() it has produced over time.", "ars_nouveau.page3.warp_portal": "Warp Portal", "ars_nouveau.page3.weald_walker": "Casts Freeze and Cold Snap at nearby enemies.", "ars_nouveau.page3.whirlisprig_charm": "To summon a Whirlisprig, use a Whirlisprig charm on any flower. Whirlisprigs consider their home to be 10 blocks in any direction from the flower. Whirlisprigs require source nearby to operate, and will only generate items if there is a chest placed next to the flower. You can get your charm back by using Dispel on a Whirlisprig. They may be given orange, yellow, white, or green dye.", @@ -637,7 +637,6 @@ "ars_nouveau.page4.illusion_blocks": "Skyweave will display the skybox of the dimension it is placed in. To toggle the skybox and show the facade, cast Dispel on it. The facade may be set to another block like Mirrorweave.", "ars_nouveau.page4.shapers_focus": "$(bold)Throw Ice:$() Conjure Water -> Freeze -> Launch -> Delay -> Knockback. $(bold)Damage and ignite hit targets:$() Conjure Mageblock -> Launch -> Ignite -> Delay -> Knockback. $(bold)Ignite TNT:$() Place Block (TNT) -> Ignite. $(bold)Throw Exploding Terrain:$() Launch -> Delay -> Knockback -> Delay -> Explosion. $(bold)Throw many blocks:$() Launch -> AOE x2 -> Delay -> Knockback. $(bold)Pull blocks:$() Pull -> AOE x2 -> Delay -> Duration Down -> Launch -> Delay -> Knockback. $(bold)Harvest Sand:$() Crush (on stone) -> Aoe -> Break", "ars_nouveau.page4.starbuncle_charm": "To bind a Starbuncle to place items into a chest, use the dominion wand on the Starbuncle and then the inventory. To take items from an inventory, use the wand on the inventory and then the Starbuncle. Starbuncles will move items between as many inventories as you desire. Looking at a Starbuncle will tell you how many chests are being taken from, and input to. Using the Dominion Wand on a Starbuncle while sneaking will reset them.", - "ars_nouveau.page4.volcanic_sourcelink": "The color of a Lava Lily changes if it is placed above lava, magma, or other blocks.", "ars_nouveau.page4.warp_portal": "A magical portal that can send players, mobs, spells, and items to any location in the same dimension.", "ars_nouveau.page4.weald_walker": "Casts an amplified Harm with a Snare effect at nearby enemies.", "ars_nouveau.page4.whirlisprig_charm": "Summoned Whirlisprigs must be happy in order to produce materials, and their mood is determined by the number and diversity of natural materials in their home. You may use blocks on the Whirlisprig to gain additional info if a Whirlisprig would enjoy that block in their home. Interacting with the Whirlisprig with an empty hand will give you additional info on the Whirlisprig's happiness.", @@ -659,7 +658,7 @@ "ars_nouveau.page7.wixie_charm": "You can select specific inventories for the wixie by using a dominion wand on an inventory, and then the cauldron. If any inventories are selected, only these inventories can be used and the Wixie will no longer pull from all nearby inventories by default.", "ars_nouveau.page8.starbuncle_charm": "Using a charm on an existing Starbuncle will stack them. Stacked starbuncles will transport multiple stacks at a time, depositing them in the order that they are taken. Wanding a stackbuncle will wand the main starbuncle and will always display the main starbuncles tooltip. Note: multiple itemstacks are not simulated at a time, which can result in several items being taken, but only able to deposit one while holding the rest.", "ars_nouveau.pathing": "Pathing", - "ars_nouveau.patreon": "Join the Ars Nouveau patreon and get a special Discord role, contribute a custom Tome, receive merchandise, summon a Lily dog, and more!", + "ars_nouveau.patreon": "Join the Ars Nouveau patreon and get a special Discord role, contribute a custom Tome, receive merchandise, summon a Lily and Nook dog, and more!", "ars_nouveau.patreon_text": "Patreon", "ars_nouveau.perk.drygmy": "Extra Looting", "ars_nouveau.perk.drygmy.desc": "Increases the amount of loot dropped by mobs.", @@ -785,8 +784,10 @@ "ars_nouveau.sensor.set_spell": "Sensor will now trigger on this spell only.", "ars_nouveau.set_spell": "Set spell.", "ars_nouveau.settings.summon_lily": "Summon Lily", + "ars_nouveau.settings.summon_nook": "Summon Nook", "ars_nouveau.settings.title": "Settings", "ars_nouveau.settings.unsummon_lily": "Unsummon Lily", + "ars_nouveau.settings.unsummon_nook": "Unsummon Nook", "ars_nouveau.shapers_focus.blocks": "Block Targeting", "ars_nouveau.shapers_focus.entities": "Entity Targeting", "ars_nouveau.shapers_focus.examples": "Spell Examples", @@ -1018,7 +1019,6 @@ "block.ars_nouveau.imbuement_chamber": "Imbuement Chamber", "block.ars_nouveau.intangible_air": "Intangible Air", "block.ars_nouveau.item_detector": "Display Case", - "block.ars_nouveau.lava_lily": "Lava Lily", "block.ars_nouveau.light_block": "Magelight", "block.ars_nouveau.mage_block": "Mage Block", "block.ars_nouveau.magebloom_block": "Magebloom Block", @@ -1207,6 +1207,7 @@ "entity.ars_nouveau.homing_spell_proj": "Homing Spell Projectile", "entity.ars_nouveau.lily": "Lily", "entity.ars_nouveau.linger": "Linger", + "entity.ars_nouveau.nook": "Nook", "entity.ars_nouveau.orbit": "Orbit", "entity.ars_nouveau.ritual": "Ritual", "entity.ars_nouveau.scryer_camera": "Scryer Camera", diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 2e4628bb14..d1faba431c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -190,7 +190,6 @@ protected void addTranslations() { add("ars_nouveau.scribe.item_removed", "Item removed."); add("ars_nouveau.allow_set", "Starbuncle will only take these items."); add("ars_nouveau.ignore_set", "Starbuncle will ignore these items."); - add("block.ars_nouveau.lava_lily", "Lava Lily"); add("block.ars_nouveau.volcanic_sourcelink", "Volcanic Sourcelink"); add("ars_nouveau.spell.disabled", "This spell has been disabled in the config."); add("block.ars_nouveau.sourceberry_bush", "Sourceberry"); @@ -497,7 +496,6 @@ protected void addTranslations() { add("ars_nouveau.glyph_crafting", "Glyph Crafting"); add("ars_nouveau.page1.scribes_table", "To craft new glyphs, use a spell book on the table to open the codex. Each glyph requires a set of items and experience points to unlock. Select a glyph by clicking on it in the menu, and hit select. Throw the items onto the table as rendered above, and the table will scribe a new glyph. The table will also pull items from nearby inventories. Using the dominion wand on the table will disable auto-pull."); add("ars_nouveau.page2.scribes_table", "You may also inscribe a spell onto Spell Parchment or Enchanters Items. To do this, place a Blank Parchment on the table. Then, with your spell book in hand, change your spell book to your desired spell as if you were going to cast it. Then, use the book on the table while sneaking. Your item will now contain that spell. Using Manipulation Essence will permanently hide the scribed spell."); - add("ars_nouveau.page1.lava_lily", "A decorative block that can be placed on any liquid or block. The texture of this block varies if it is placed on Lava, a Magma Block, or any other block."); add("ars_nouveau.page1.wilden", "Wilden are hostile creatures that can be commonly found at night around Wilden Dens. While Wilden Defenders may only be found in cold biomes, Stalker and Hunter Dens can be found in any forest biome."); add("ars_nouveau.page3.wilden", "An aggressive and fast hunter that can summon allied wolves."); add("ars_nouveau.page4.wilden", "Generally spawning in small groups, Stalkers have ground and aerial attacks."); @@ -625,8 +623,7 @@ protected void addTranslations() { add("ars_nouveau.page.source_jar", "Source Jars store source gathered from nearby Sourcelinks. Source is used in glyphs and rituals by powering devices like the Imbuement Chamber and Enchanting Apparatus. Source may be moved using a Source Relay or by breaking and moving it. To use Source in a jar, simply place the jar near your desired device. Source Jars will provide a signal to Redstone Comparators based on their fill level."); add("ars_nouveau.page1.volcanic_sourcelink", "The Volcanic Sourcelink generates Source by consuming burnable items. Archwood logs will generate bonus Source, with Blazing Archwood generating the most. As the Volcanic Sourcelink produces Source, it also produces $(item)heat$(), used for spawning Lava Lilies and converting stone into lava. The Volcanic Sourcelink automatically outputs to nearby jars, starting with the one closest to it."); add("ars_nouveau.page2.volcanic_sourcelink", "Nearby Blazing Archwood items will be burned up in exchange for a chunk of Source and a moderate amount of $(item)heat$(). The Volcanic Sourcelink will also take items from surrounding pedestals."); - add("ars_nouveau.page3.volcanic_sourcelink", "The Volcanic Sourcelink will occasionally convert Stone into Magma Blocks, and Magma Blocks into Lava, given that these blocks exist beneath it in its 3x3 area. This conversion is dependent on the amount of $(item)heat$() it has produced over time. The Volcanic Sourcelink will also spawn a Lava Lily adjacent to it given that there is nothing covering the lava. Lava Lilys may be harvested and used for decoration."); - add("ars_nouveau.page4.volcanic_sourcelink", "The color of a Lava Lily changes if it is placed above lava, magma, or other blocks."); + add("ars_nouveau.page3.volcanic_sourcelink", "The Volcanic Sourcelink will occasionally convert Stone into Magma Blocks, and Magma Blocks into Lava, given that these blocks exist beneath it in its 3x3 area. This conversion is dependent on the amount of $(item)heat$() it has produced over time."); add("ars_nouveau.active_generation", "Active Generation"); add("ars_nouveau.heat", "Heat"); add("ars_nouveau.page.alchemical_sourcelink", "Generates source by consuming potions from adjacent potion jars. The amount of source varies per potion and is dependent on the complexity of the potion. Bonus source is given for the length and level of the potion with multipliers for each effect a potion contains. Utilizing Wixies and Potion Melders is recommended for creating highly complex potions."); @@ -836,7 +833,7 @@ protected void addTranslations() { add("ars_nouveau.scryers_eye.no_scrolls", "Place a Scryer's Scroll on a nearby pedestal."); add("ars_nouveau.camera.not_loaded", "The block has been removed or is not chunk loaded."); add("ars_nouveau.page.support_mod", "Support Ars Nouveau!"); - add("ars_nouveau.patreon", "Join the Ars Nouveau patreon and get a special Discord role, contribute a custom Tome, receive merchandise, summon a Lily dog, and more!"); + add("ars_nouveau.patreon", "Join the Ars Nouveau patreon and get a special Discord role, contribute a custom Tome, receive merchandise, summon a Lily and Nook dog, and more!"); add("ars_nouveau.patreon_text", "Patreon"); add("entity.ars_nouveau.summon_skeleton", "Summoned Skeleton"); add("item.ars_nouveau.shapers_focus", "Focus of Block Shaping"); @@ -1262,8 +1259,12 @@ protected void addTranslations() { add("ars_nouveau.adopter", "Adopted by %s"); add("entity.ars_nouveau.lily", "Lily"); add("ars_nouveau.lily", "Patrons may summon Lily, a faithful tail wagging companion."); + add("ars_nouveau.nook", "Patrons may summon Nook, a faithfulish tail wagging companion."); add("ars_nouveau.settings.summon_lily", "Summon Lily"); add("ars_nouveau.settings.unsummon_lily", "Unsummon Lily"); + add("entity.ars_nouveau.nook", "Nook"); + add("ars_nouveau.settings.summon_nook", "Summon Nook"); + add("ars_nouveau.settings.unsummon_nook", "Unsummon Nook"); add("ars_nouveau.rewards.enabled", "Ars Nouveau supporter rewards enabled, thank you! Rewards can be accessed in the Settings page of the spell book."); add("mob_jar.dummy", "A player dummy in a jar will attract nearby mobs."); add("ars_nouveau.turret.tooltip", "Can be rotated to face any direction. Use a dominion wand on the turret, and then on the target block."); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java index a1709acf96..3fe34feb19 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java @@ -20,7 +20,7 @@ public class EffectBubble extends AbstractEffect { public static final EffectBubble INSTANCE = new EffectBubble(); public EffectBubble() { - super(GlyphLib.EffectBubbleID, "Captures mobs and entities it touches, causing them to float upwards. If the bubble has been alive for at least one tick, damaging the entity trapped in the bubble will cause it to pop, dealing bonus damage to the entity inside. Extend time and amplify can be used to increase the duration and damage of the bubble."); + super(GlyphLib.EffectBubbleID, "Bubble"); } @Override @@ -48,4 +48,9 @@ public void buildConfig(ModConfigSpec.Builder builder) { protected @NotNull Set getCompatibleAugments() { return Set.of(AugmentExtendTime.INSTANCE, AugmentAmplify.INSTANCE, AugmentDampen.INSTANCE, AugmentDurationDown.INSTANCE); } + + @Override + public String getBookDescription() { + return "Captures mobs and entities it touches, causing them to float upwards. If the bubble has been alive for at least one tick, damaging the entity trapped in the bubble will cause it to pop, dealing bonus damage to the entity inside. Extend time and amplify can be used to increase the duration and damage of the bubble."; + } } From 2741c76288195748c43f19774bb5fe7d63d474e7 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 20 Oct 2024 14:05:41 -0500 Subject: [PATCH 219/363] Add Nook --- .../en_us/entries/mod_news/support_mod.json | 5 + .../hollingsworth/arsnouveau/ArsNouveau.java | 2 +- .../client/gui/book/GuiSettingsScreen.java | 24 +- .../client/registry/ClientHandler.java | 1 + .../client/renderer/entity/LilyModel.java | 10 +- .../client/renderer/entity/NookModel.java | 49 ++++ .../renderer/entity/StarbuncleModel.java | 3 +- .../common/datagen/PatchouliProvider.java | 1 + .../arsnouveau/common/entity/Lily.java | 20 +- .../arsnouveau/common/entity/Nook.java | 244 ++++++++++++++++++ .../common/entity/goal/lily/IAdorable.java | 26 ++ .../common/entity/goal/lily/WagGoal.java | 10 +- .../arsnouveau/common/lib/LibEntityNames.java | 1 + .../arsnouveau/common/network/Networking.java | 4 +- .../common/network/PacketSummonDog.java | 59 +++++ .../common/network/PacketSummonLily.java | 43 --- .../common/network/PacketUnsummonDog.java | 64 +++++ .../common/network/PacketUnsummonLily.java | 51 ---- .../setup/registry/ModEntities.java | 8 + .../animations/nook_animation.json | 131 ++++++++++ .../assets/ars_nouveau/geo/nook.geo.json | 235 +++++++++++++++++ .../ars_nouveau/textures/entity/nook.png | Bin 0 -> 1540 bytes .../textures/gui/settings_summon_nook.png | Bin 0 -> 202 bytes .../textures/gui/settings_unsummon_nook.png | Bin 0 -> 203 bytes 24 files changed, 866 insertions(+), 125 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/NookModel.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/Nook.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/lily/IAdorable.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonDog.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonLily.java create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUnsummonDog.java delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUnsummonLily.java create mode 100644 src/main/resources/assets/ars_nouveau/animations/nook_animation.json create mode 100644 src/main/resources/assets/ars_nouveau/geo/nook.geo.json create mode 100644 src/main/resources/assets/ars_nouveau/textures/entity/nook.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/gui/settings_summon_nook.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/gui/settings_unsummon_nook.png diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mod_news/support_mod.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mod_news/support_mod.json index 18cdfadce7..3bd96cf9e5 100644 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mod_news/support_mod.json +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mod_news/support_mod.json @@ -14,6 +14,11 @@ "entity": "ars_nouveau:lily", "text": "ars_nouveau.lily" }, + { + "type": "patchouli:entity", + "entity": "ars_nouveau:nook", + "text": "ars_nouveau.nook" + }, { "type": "patchouli:link", "link_text": "ars_nouveau.store_text", diff --git a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java index ed8f3333eb..1c39979797 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java +++ b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java @@ -60,7 +60,7 @@ public class ArsNouveau { ticketHelper.removeAllTickets(uuid); })); }); - public static boolean isDebug = !FMLEnvironment.production; + public static boolean isDebug = false && !FMLEnvironment.production; public ArsNouveau(IEventBus modEventBus, ModContainer modContainer){ NeoForge.EVENT_BUS.addListener(FMLEventHandler::onServerStopped); caelusLoaded = ModList.get().isLoaded("caelus"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSettingsScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSettingsScreen.java index cb98c5ae9f..210a700552 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSettingsScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSettingsScreen.java @@ -6,14 +6,13 @@ import com.hollingsworth.arsnouveau.client.gui.buttons.SelectableButton; import com.hollingsworth.arsnouveau.common.light.LightManager; import com.hollingsworth.arsnouveau.common.network.Networking; -import com.hollingsworth.arsnouveau.common.network.PacketSummonLily; -import com.hollingsworth.arsnouveau.common.network.PacketUnsummonLily; +import com.hollingsworth.arsnouveau.common.network.PacketSummonDog; +import com.hollingsworth.arsnouveau.common.network.PacketUnsummonDog; import com.hollingsworth.arsnouveau.setup.config.Config; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import javax.annotation.Nullable; @@ -45,19 +44,32 @@ public void init() { addRenderableWidget(dynamicButton); if(ClientInfo.isSupporter) { GuiImageButton lilyButton = new GuiImageButton(bookLeft + 40, bookTop + 34, 0, 0, 16, 16, 16, 16, ArsNouveau.prefix( "textures/gui/settings_summon_lily.png"), (b) -> { - Networking.sendToServer(new PacketSummonLily()); + Networking.sendToServer(new PacketSummonDog(PacketSummonDog.DogType.LILY)); }); lilyButton.withTooltip(Component.translatable("ars_nouveau.settings.summon_lily")); GuiImageButton unsummonLily = new GuiImageButton(bookLeft + 60, bookTop + 34, 0, 0, 16, 16, 16, 16, ArsNouveau.prefix( "textures/gui/settings_unsummon_lily.png"), (b) -> { - Networking.sendToServer(new PacketUnsummonLily()); - + Networking.sendToServer(new PacketUnsummonDog(PacketSummonDog.DogType.LILY)); }); unsummonLily.withTooltip(Component.translatable("ars_nouveau.settings.unsummon_lily")); addRenderableWidget(lilyButton); addRenderableWidget(unsummonLily); + + GuiImageButton nookButton = new GuiImageButton(bookLeft + 80, bookTop + 34, 0, 0, 16, 16, 16, 16, ArsNouveau.prefix( "textures/gui/settings_summon_nook.png"), (b) -> { + Networking.sendToServer(new PacketSummonDog(PacketSummonDog.DogType.NOOK)); + }); + nookButton.withTooltip(Component.translatable("ars_nouveau.settings.summon_nook")); + + GuiImageButton unsummonNook = new GuiImageButton(bookLeft + 100, bookTop + 34, 0, 0, 16, 16, 16, 16, ArsNouveau.prefix( "textures/gui/settings_unsummon_nook.png"), (b) -> { + Networking.sendToServer(new PacketUnsummonDog(PacketSummonDog.DogType.NOOK)); + }); + unsummonNook.withTooltip(Component.translatable("ars_nouveau.settings.unsummon_nook")); + + addRenderableWidget(nookButton); + addRenderableWidget(unsummonNook); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java index 7cde85bff1..2c0555fa21 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/registry/ClientHandler.java @@ -192,6 +192,7 @@ public static void registerRenderers(final EntityRenderersEvent.RegisterRenderer renderManager -> new RenderBlank(renderManager, ArsNouveau.prefix("textures/entity/spell_proj.png"))); event.registerEntityRenderer(ModEntities.LILY.get(), (v) -> new GeoEntityRenderer<>(v, new LilyModel())); + event.registerEntityRenderer(ModEntities.NOOK.get(), (v) -> new GeoEntityRenderer<>(v, new NookModel())); event.registerEntityRenderer(ModEntities.ALAKARKINOS_TYPE.get(), (v) -> new GeoEntityRenderer<>(v, new AlakarkinosModel())); event.registerEntityRenderer(ModEntities.BUBBLE.get(), BubbleRenderer::new); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyModel.java index ad217174db..fbe4e562aa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/LilyModel.java @@ -12,7 +12,9 @@ import javax.annotation.Nullable; public class LilyModel extends GeoModel { - + public static ResourceLocation TEXTURE = ArsNouveau.prefix("textures/entity/lily.png"); + public static ResourceLocation MODEL = ArsNouveau.prefix("geo/lily.geo.json"); + public static ResourceLocation ANIMATION = ArsNouveau.prefix("animations/lily_animations.json"); @Override public void setCustomAnimations(Lily entity, long uniqueID, @Nullable AnimationState customPredicate) { super.setCustomAnimations(entity, uniqueID, customPredicate); @@ -24,16 +26,16 @@ public void setCustomAnimations(Lily entity, long uniqueID, @Nullable AnimationS @Override public ResourceLocation getModelResource(Lily whirlisprig) { - return ArsNouveau.prefix( "geo/lily.geo.json"); + return MODEL; } @Override public ResourceLocation getTextureResource(Lily whirlisprig) { - return ArsNouveau.prefix( "textures/entity/lily.png"); + return TEXTURE; } @Override public ResourceLocation getAnimationResource(Lily whirlisprig) { - return ArsNouveau.prefix( "animations/lily_animations.json"); + return ANIMATION; } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/NookModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/NookModel.java new file mode 100644 index 0000000000..d3bb22867b --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/NookModel.java @@ -0,0 +1,49 @@ +package com.hollingsworth.arsnouveau.client.renderer.entity; + +import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.common.entity.Nook; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.constant.DataTickets; +import software.bernie.geckolib.model.GeoModel; +import software.bernie.geckolib.model.data.EntityModelData; + +import javax.annotation.Nullable; + +public class NookModel extends GeoModel { + + public static ResourceLocation TEXTURE = ArsNouveau.prefix("textures/entity/nook.png"); + public static ResourceLocation MODEL = ArsNouveau.prefix("geo/nook.geo.json"); + public static ResourceLocation ANIMATION = ArsNouveau.prefix("animations/nook_animation.json"); + + + @Override + public void setCustomAnimations(Nook entity, long uniqueID, @Nullable AnimationState customPredicate) { + super.setCustomAnimations(entity, uniqueID, customPredicate); + GeoBone head = this.getAnimationProcessor().getBone("head"); + EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); + if(entity.isOrderedToSit()){ + head.setRotX(extraData.headPitch() * 0.017453292F); + head.setRotY(extraData.netHeadYaw() * 0.013453292F); + }else { + head.setRotX(extraData.headPitch() * 0.017453292F); + head.setRotY(extraData.netHeadYaw() * 0.017453292F); + } + } + + @Override + public ResourceLocation getModelResource(Nook nook) { + return MODEL; + } + + @Override + public ResourceLocation getTextureResource(Nook nook) { + return TEXTURE; + } + + @Override + public ResourceLocation getAnimationResource(Nook nook) { + return ANIMATION; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java index 0dc21edf82..cf3def213f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/StarbuncleModel.java @@ -13,6 +13,7 @@ public class StarbuncleModel extends GeoModel { + public static ResourceLocation ANIMATION = ArsNouveau.prefix("animations/starbuncle_animations.json"); @Override public void setCustomAnimations(Starbuncle entity, long uniqueID, @Nullable AnimationState customPredicate) { super.setCustomAnimations(entity, uniqueID, customPredicate); @@ -41,6 +42,6 @@ public ResourceLocation getTextureResource(Starbuncle carbuncle) { @Override public ResourceLocation getAnimationResource(Starbuncle carbuncle) { - return ArsNouveau.prefix("animations/starbuncle_animations.json"); + return ANIMATION; } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java index 01f00d0363..d26ae792ba 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java @@ -478,6 +478,7 @@ public void addEntries() { .withIcon(ItemsRegistry.STARBUNCLE_CHARM) .withPage(new LinkPage("https://www.patreon.com/arsnouveau", "ars_nouveau.patreon_text", "ars_nouveau.patreon")) .withPage(new EntityPage(ModEntities.LILY.get()).withText("ars_nouveau.lily")) + .withPage(new EntityPage(ModEntities.NOOK.get()).withText("ars_nouveau.nook")) .withPage(new LinkPage("https://www.redbubble.com/people/Gootastic/explore?page=1&sortOrder=recent", "ars_nouveau.store_text", "ars_nouveau.store")), getPath(MOD_NEWS, "support_mod")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Lily.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Lily.java index 3ebe20a333..b8a8d6fec1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Lily.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Lily.java @@ -4,6 +4,7 @@ import com.google.common.collect.HashBiMap; import com.hollingsworth.arsnouveau.api.entity.IDispellable; import com.hollingsworth.arsnouveau.api.util.SummonUtil; +import com.hollingsworth.arsnouveau.common.entity.goal.lily.IAdorable; import com.hollingsworth.arsnouveau.common.entity.goal.lily.WagGoal; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.core.BlockPos; @@ -26,7 +27,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoEntity; @@ -39,7 +39,7 @@ import java.util.UUID; -public class Lily extends TamableAnimal implements GeoEntity, IDispellable { +public class Lily extends TamableAnimal implements GeoEntity, IDispellable, IAdorable { // Owner UUID to Lily UUID public static BiMap ownerLilyMap = HashBiMap.create(); @@ -61,7 +61,7 @@ protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); this.goalSelector.addGoal(6, new FollowOwnerGoal(this, 1.0D, 10.0F, 2.0F)); - this.goalSelector.addGoal(7, new WagGoal(this)); + this.goalSelector.addGoal(7, new WagGoal<>(this)); this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D)); this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Player.class, 8.0F)); this.goalSelector.addGoal(10, new RandomLookAroundGoal(this)); @@ -129,6 +129,11 @@ public void setWagging(boolean pWagging) { this.entityData.set(WAG, pWagging); } + @Override + public void setWagTicks(int ticks) { + wagTicks = ticks; + } + protected void playStepSound(BlockPos pPos, BlockState pBlock) { this.playSound(SoundEvents.WOLF_STEP, 0.15F, 1.0F); } @@ -182,15 +187,6 @@ public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) return null; } - public boolean isLookingAtMe(Player pPlayer) { - Vec3 vec3 = pPlayer.getViewVector(1.0F).normalize(); - Vec3 vec31 = new Vec3(this.getX() - pPlayer.getX(), this.getEyeY() - pPlayer.getEyeY(), this.getZ() - pPlayer.getZ()); - double d0 = vec31.length(); - vec31 = vec31.normalize(); - double d1 = vec3.dot(vec31); - return d1 > 1.0D - 0.025D / d0 && pPlayer.hasLineOfSight(this); - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar data) { data.add(new AnimationController(this, "walk", 1, (event) -> { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Nook.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Nook.java new file mode 100644 index 0000000000..8d46dad1cd --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Nook.java @@ -0,0 +1,244 @@ +package com.hollingsworth.arsnouveau.common.entity; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.hollingsworth.arsnouveau.api.entity.IDispellable; +import com.hollingsworth.arsnouveau.api.util.SummonUtil; +import com.hollingsworth.arsnouveau.common.entity.goal.lily.IAdorable; +import com.hollingsworth.arsnouveau.common.entity.goal.lily.WagGoal; +import com.hollingsworth.arsnouveau.setup.registry.ModEntities; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.animatable.GeoEntity; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.UUID; + +public class Nook extends TamableAnimal implements GeoEntity, IDispellable, IAdorable { + // Owner UUID to Nook UUID + public static BiMap ownerNookMap = HashBiMap.create(); + + private static final EntityDataAccessor SIT = SynchedEntityData.defineId(Nook.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor WAG = SynchedEntityData.defineId(Nook.class, EntityDataSerializers.BOOLEAN); + public int wagTicks; + + public Nook(EntityType pEntityType, Level pLevel) { + super(pEntityType, pLevel); + } + + public Nook(Level level){ + this(ModEntities.NOOK.get(), level); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(1, new FloatGoal(this)); + this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); + this.goalSelector.addGoal(6, new FollowOwnerGoal(this, 1.0D, 10.0F, 2.0F)); + this.goalSelector.addGoal(7, new WagGoal<>(this)); + this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(10, new RandomLookAroundGoal(this)); + } + + @Override + public InteractionResult mobInteract(Player pPlayer, InteractionHand pHand) { + if (this.level.isClientSide) { + return InteractionResult.CONSUME; + } + if (this.isOwnedBy(pPlayer)) { + this.setOrderedToSit(!this.isOrderedToSit()); + this.jumping = false; + this.navigation.stop(); + this.setTarget(null); + return InteractionResult.SUCCESS; + } + return super.mobInteract(pPlayer, pHand); + } + + @Override + public void tick() { + super.tick(); + SummonUtil.healOverTime(this); + if(!level.isClientSide){ + if(level.getGameTime() % 20 == 0 && !ownerNookMap.containsValue(this.getUUID())){ + this.remove(RemovalReason.DISCARDED); + } + if( wagTicks > 0 && isWagging()){ + wagTicks--; + if(wagTicks <= 0){ + setWagging(false); + } + } + } + } + + @Override + protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { + super.defineSynchedData(pBuilder); + pBuilder.define(SIT, false); + pBuilder.define(WAG, false); + } + + @Override + public boolean isOrderedToSit() { + return this.entityData.get(SIT); + } + + @Override + public boolean isTame() { + return true; + } + + @Override + public void setOrderedToSit(boolean pOrderedToSit) { + this.entityData.set(SIT, pOrderedToSit); + } + + public boolean isWagging() { + return this.entityData.get(WAG); + } + + public void setWagging(boolean pWagging) { + this.entityData.set(WAG, pWagging); + } + + @Override + public void setWagTicks(int ticks) { + wagTicks = ticks; + } + + protected void playStepSound(BlockPos pPos, BlockState pBlock) { + this.playSound(SoundEvents.WOLF_STEP, 0.15F, 1.0F); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MOVEMENT_SPEED, 0.3F).add(Attributes.MAX_HEALTH, 40f).add(Attributes.ATTACK_DAMAGE, 2.0D); + } + + protected SoundEvent getAmbientSound() { + if (this.random.nextInt(3) == 0) { + return this.isTame() && this.getHealth() < 10.0F ? SoundEvents.WOLF_WHINE : SoundEvents.WOLF_PANT; + } else { + return SoundEvents.WOLF_AMBIENT; + } + } + + protected SoundEvent getHurtSound(DamageSource pDamageSource) { + return SoundEvents.WOLF_HURT; + } + + protected SoundEvent getDeathSound() { + return SoundEvents.WOLF_DEATH; + } + + @Override + public boolean hurt(DamageSource pSource, float pAmount) { + if(!(pSource.getEntity() instanceof Player)){ + return false; + } + return super.hurt(pSource, pAmount); + } + + /** + * Returns the volume for the sounds this mob makes. + */ + protected float getSoundVolume() { + return 0.4F; + } + + /** + * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on + * the animal type) + */ + public boolean isFood(ItemStack pStack) { + return pStack.is(ItemTags.WOLF_FOOD); + } + + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + return null; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + data.add(new AnimationController(this, "walk", 1, (event) -> { + if(event.isMoving()){ + event.getController().setAnimation(RawAnimation.begin().thenPlay("run")); + return PlayState.CONTINUE; + } + return PlayState.STOP; + })); + data.add(new AnimationController(this, "idle", 1, (event) -> { + if(!event.isMoving() && !this.isWagging()){ + event.getController().setAnimation(RawAnimation.begin().thenPlay("idle")); + return PlayState.CONTINUE; + } + return PlayState.STOP; + })); + data.add(new AnimationController(this, "idle_wag", 1, (event) -> { + if(!event.isMoving() && this.isWagging()){ + event.getController().setAnimation(RawAnimation.begin().thenPlay("idle_wag")); + return PlayState.CONTINUE; + } + return PlayState.STOP; + })); + + data.add(new AnimationController(this, "rest", 1, (event) -> { + if(!event.isMoving() && this.isOrderedToSit()){ + event.getController().setAnimation(RawAnimation.begin().thenPlay("sit")); + return PlayState.CONTINUE; + } + return PlayState.STOP; + })); + } + AnimatableInstanceCache factory = GeckoLibUtil.createInstanceCache(this); + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return factory; + } + + @Override + public boolean onDispel(@NotNull LivingEntity caster) { + if(caster.getUUID().equals(this.getOwnerUUID())) { + this.remove(RemovalReason.DISCARDED); + return true; + } + return false; + } + + @Override + public void load(CompoundTag pCompound) { + super.load(pCompound); + if(!ownerNookMap.containsKey(this.getOwnerUUID())) { + Nook.ownerNookMap.put(this.getOwnerUUID(), this.getUUID()); + } + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/lily/IAdorable.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/lily/IAdorable.java new file mode 100644 index 0000000000..da94d035f2 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/lily/IAdorable.java @@ -0,0 +1,26 @@ +package com.hollingsworth.arsnouveau.common.entity.goal.lily; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; + +public interface IAdorable { + + private LivingEntity getThis(){ + return (LivingEntity)this; + } + + default boolean isLookingAtMe(Player pPlayer){ + Vec3 vec3 = pPlayer.getViewVector(1.0F).normalize(); + Vec3 vec31 = new Vec3(getThis().getX() - pPlayer.getX(), getThis().getEyeY() - pPlayer.getEyeY(), getThis().getZ() - pPlayer.getZ()); + double d0 = vec31.length(); + vec31 = vec31.normalize(); + double d1 = vec3.dot(vec31); + return d1 > 1.0D - 0.025D / d0 && pPlayer.hasLineOfSight(getThis()); + } + + + void setWagging(boolean wagging); + + void setWagTicks(int ticks); +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/lily/WagGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/lily/WagGoal.java index 826baaf4d6..1503e3a180 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/lily/WagGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/lily/WagGoal.java @@ -1,19 +1,19 @@ package com.hollingsworth.arsnouveau.common.entity.goal.lily; -import com.hollingsworth.arsnouveau.common.entity.Lily; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.player.Player; import java.util.EnumSet; -public class WagGoal extends Goal { - Lily lily; +public class WagGoal extends Goal { + T lily; public LivingEntity target; public int wagAtTicks; - public WagGoal(Lily lily) { + public WagGoal(T lily) { this.lily = lily; setFlags(EnumSet.of(Goal.Flag.LOOK)); } @@ -39,7 +39,7 @@ public boolean canUse() { target = player; wagAtTicks = 100; lily.setWagging(true); - lily.wagTicks = 100; + lily.setWagTicks(100); return true; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibEntityNames.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibEntityNames.java index 2ff474102b..8de253eae8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibEntityNames.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibEntityNames.java @@ -21,6 +21,7 @@ public class LibEntityNames { public static final String DUMMY = "dummy"; public static final String AN_LIGHTNING = "an_lightning"; public static final String LILY = "lily"; + public static final String NOOK = "nook"; public static final String BUBBLE = "bubble"; public static final String ORBIT_PROJECTILE = "orbit"; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java index 407d8580cc..6af3c1d586 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/Networking.java @@ -51,14 +51,14 @@ public static void register(final RegisterPayloadHandlersEvent event) { reg.playToServer(PacketSetScribeRecipe.TYPE, PacketSetScribeRecipe.CODEC, Networking::handle); reg.playToServer(PacketSetSound.TYPE, PacketSetSound.CODEC, Networking::handle); reg.playToServer(PacketSummonFamiliar.TYPE, PacketSummonFamiliar.CODEC, Networking::handle); - reg.playToServer(PacketSummonLily.TYPE, PacketSummonLily.CODEC, Networking::handle); + reg.playToServer(PacketSummonDog.TYPE, PacketSummonDog.CODEC, Networking::handle); reg.playToClient(PacketSyncLitEntities.TYPE, PacketSyncLitEntities.CODEC, Networking::handle); reg.playToClient(PacketSyncPlayerCap.TYPE, PacketSyncPlayerCap.CODEC, Networking::handle); reg.playToClient(PacketSyncTag.TYPE , PacketSyncTag.CODEC, Networking::handle); reg.playToClient(PacketTimedEvent.TYPE, PacketTimedEvent.CODEC, Networking::handle); reg.playToServer(PacketToggleFamiliar.TYPE, PacketToggleFamiliar.CODEC, Networking::handle); reg.playToClient(PacketToggleLight.TYPE, PacketToggleLight.CODEC, Networking::handle); - reg.playToServer(PacketUnsummonLily.TYPE, PacketUnsummonLily.CODEC, Networking::handle); + reg.playToServer(PacketUnsummonDog.TYPE, PacketUnsummonDog.CODEC, Networking::handle); reg.playToClient(PacketUpdateBookGUI.TYPE, PacketUpdateBookGUI.CODEC, Networking::handle); reg.playToServer(PacketUpdateCaster.TYPE, PacketUpdateCaster.CODEC, Networking::handle); reg.playToClient(PacketUpdateFlight.TYPE, PacketUpdateFlight.CODEC, Networking::handle); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonDog.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonDog.java new file mode 100644 index 0000000000..362ac688b7 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonDog.java @@ -0,0 +1,59 @@ +package com.hollingsworth.arsnouveau.common.network; + +import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.common.entity.Lily; +import com.hollingsworth.arsnouveau.common.entity.Nook; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; + +public class PacketSummonDog extends AbstractPacket{ + + public enum DogType{ + NOOK, + LILY + } + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("summon_dog")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketSummonDog::toBytes, PacketSummonDog::new); + + public DogType dogType; + + public PacketSummonDog(DogType summonNook) { + this.dogType = summonNook; + } + + //Decoder + public PacketSummonDog(RegistryFriendlyByteBuf buf) { + this.dogType = buf.readEnum(DogType.class); + } + + //Encoder + public void toBytes(RegistryFriendlyByteBuf buf) { + buf.writeEnum(dogType); + } + + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + if(dogType == DogType.NOOK){ + Nook nook = new Nook(player.level); + nook.setPos(player.getX(), player.getY(), player.getZ()); + nook.setOwnerUUID(player.getUUID()); + player.level.addFreshEntity(nook); + Nook.ownerNookMap.put(player.getUUID(), nook.getUUID()); + }else { + Lily lily = new Lily(player.level); + lily.setPos(player.getX(), player.getY(), player.getZ()); + lily.setOwnerUUID(player.getUUID()); + player.level.addFreshEntity(lily); + Lily.ownerLilyMap.put(player.getUUID(), lily.getUUID()); + } + } + + @Override + public Type type() { + return TYPE; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonLily.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonLily.java deleted file mode 100644 index 18aba729aa..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketSummonLily.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.hollingsworth.arsnouveau.common.network; - -import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.common.entity.Lily; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; - -public class PacketSummonLily extends AbstractPacket{ - public static final Type TYPE = new Type<>(ArsNouveau.prefix("summon_lily")); - public static final StreamCodec CODEC = StreamCodec.ofMember(PacketSummonLily::toBytes, PacketSummonLily::new); - - - public PacketSummonLily() { - - } - - //Decoder - public PacketSummonLily(RegistryFriendlyByteBuf buf) { - - } - - //Encoder - public void toBytes(RegistryFriendlyByteBuf buf) { - - } - - @Override - public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { - Lily lily = new Lily(player.level); - lily.setPos(player.getX(), player.getY(), player.getZ()); - lily.setOwnerUUID(player.getUUID()); - player.level.addFreshEntity(lily); - Lily.ownerLilyMap.put(player.getUUID(), lily.getUUID()); - } - - @Override - public Type type() { - return TYPE; - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUnsummonDog.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUnsummonDog.java new file mode 100644 index 0000000000..bf55977f1f --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUnsummonDog.java @@ -0,0 +1,64 @@ +package com.hollingsworth.arsnouveau.common.network; + +import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.common.entity.Lily; +import com.hollingsworth.arsnouveau.common.entity.Nook; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; + +import java.util.UUID; + +public class PacketUnsummonDog extends AbstractPacket { + + public PacketSummonDog.DogType dogType; + + public PacketUnsummonDog(PacketSummonDog.DogType dogType) { + this.dogType = dogType; + } + + //Decoder + public PacketUnsummonDog(RegistryFriendlyByteBuf buf) { + this.dogType = buf.readEnum(PacketSummonDog.DogType.class); + } + + //Encoder + public void toBytes(RegistryFriendlyByteBuf buf) { + buf.writeEnum(dogType); + } + + @Override + public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { + if(dogType == PacketSummonDog.DogType.NOOK){ + ServerLevel level = (ServerLevel) player.level(); + UUID nookUuid = Nook.ownerNookMap.get(player.getUUID()); + if (nookUuid != null) { + Nook nook = (Nook) level.getEntity(nookUuid); + if (nook != null) { + nook.remove(Entity.RemovalReason.DISCARDED); + } + } + }else { + ServerLevel level = (ServerLevel) player.level(); + UUID lilyUuid = Lily.ownerLilyMap.get(player.getUUID()); + if (lilyUuid != null) { + Lily lily = (Lily) level.getEntity(lilyUuid); + if (lily != null) { + lily.remove(Entity.RemovalReason.DISCARDED); + } + } + } + } + + public static final Type TYPE = new Type<>(ArsNouveau.prefix("unsummon_dog")); + public static final StreamCodec CODEC = StreamCodec.ofMember(PacketUnsummonDog::toBytes, PacketUnsummonDog::new); + + @Override + public Type type() { + return TYPE; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUnsummonLily.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUnsummonLily.java deleted file mode 100644 index b18977cd71..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUnsummonLily.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.hollingsworth.arsnouveau.common.network; - -import com.hollingsworth.arsnouveau.ArsNouveau; -import com.hollingsworth.arsnouveau.common.entity.Lily; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.Entity; - -import java.util.UUID; - -public class PacketUnsummonLily extends AbstractPacket { - - - public PacketUnsummonLily() { - - } - - //Decoder - public PacketUnsummonLily(RegistryFriendlyByteBuf buf) { - - } - - //Encoder - public void toBytes(RegistryFriendlyByteBuf buf) { - - } - - @Override - public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer player) { - ServerLevel level = (ServerLevel) player.level(); - UUID lilyUuid = Lily.ownerLilyMap.get(player.getUUID()); - if (lilyUuid != null) { - Lily lily = (Lily) level.getEntity(lilyUuid); - if (lily != null) { - lily.remove(Entity.RemovalReason.DISCARDED); - } - } - } - - public static final Type TYPE = new Type<>(ArsNouveau.prefix("unsummon_lily")); - public static final StreamCodec CODEC = StreamCodec.ofMember(PacketUnsummonLily::toBytes, PacketUnsummonLily::new); - - @Override - public Type type() { - return TYPE; - } -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java index aebad8384f..90bceeb9f9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java @@ -289,6 +289,13 @@ public boolean isNoGravity() { .sized(0.5F, 0.75F) .setTrackingRange(10)); + public static final DeferredHolder, EntityType> NOOK = registerEntity( + LibEntityNames.NOOK, + EntityType.Builder.of(Nook::new, MobCategory.MISC) + .sized(0.5F, 0.75F) + .setTrackingRange(10)); + + public static final DeferredHolder, EntityType> BUBBLE = registerEntity( LibEntityNames.BUBBLE, EntityType.Builder.of(BubbleEntity::new, MobCategory.MISC) @@ -357,6 +364,7 @@ public static void registerEntityAttributes(final EntityAttributeCreationEvent e event.put(ANIMATED_BLOCK.get(), AnimBlockSummon.createAttributes().build()); event.put(ANIMATED_HEAD.get(), AnimBlockSummon.createAttributes().build()); event.put(LILY.get(), Lily.createAttributes().build()); + event.put(NOOK.get(), Nook.createAttributes().build()); event.put(ALAKARKINOS_TYPE.get(), Starbuncle.attributes().build()); } } diff --git a/src/main/resources/assets/ars_nouveau/animations/nook_animation.json b/src/main/resources/assets/ars_nouveau/animations/nook_animation.json new file mode 100644 index 0000000000..402315f1f4 --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/animations/nook_animation.json @@ -0,0 +1,131 @@ +{ + "format_version": "1.8.0", + "animations": { + "run": { + "animation_length": 59.125, + "bones": { + "body": { + "rotation": { + "vector": ["-Math.sin(query.anim_time * 650+45) * 6", 0, "Math.sin(query.anim_time * 650+45) * 1"] + }, + "position": { + "vector": [0, "Math.sin(query.anim_time * 650 - 35) * 0.25", 0] + } + }, + "head": { + "rotation": { + "vector": ["Math.sin(query.anim_time * 650-50) * 4", 0, "Math.sin(query.anim_time * 650-25) * 2"] + } + }, + "leg_front_right": { + "rotation": { + "vector": ["Math.cos(query.anim_time * 650) * 50", 0, 0] + } + }, + "leg_front_left": { + "rotation": { + "vector": ["Math.cos(query.anim_time * 650-50) * 50", 0, 0] + } + }, + "leg_back_right": { + "rotation": { + "vector": ["-Math.cos(query.anim_time * 650-45) * 50", 0, 0] + } + }, + "leg_back_left": { + "rotation": { + "vector": ["-Math.cos(query.anim_time * 650-90) * 50", 0, 0] + } + }, + "tail": { + "rotation": { + "vector": ["Math.cos(query.anim_time * 650+35) * 15", 0, "Math.sin(query.anim_time * 650-5) * 6"] + } + } + } + }, + "sit": { + "loop": true, + "bones": { + "body": { + "rotation": { + "vector": [-32.5, 0, 0] + }, + "position": { + "vector": [0, -2.4, 0] + } + }, + "head": { + "position": { + "vector": [0, -0.5373, -0.84339] + } + }, + "leg_front_right": { + "rotation": { + "vector": [32.5, 0, 0] + }, + "position": { + "vector": [0, 0, 0] + } + }, + "leg_front_left": { + "rotation": { + "vector": [32.5, 0, 0] + } + }, + "leg_back_right": { + "rotation": { + "vector": [-51.23521, 30.89218, 22.40559] + }, + "position": { + "vector": [0, -0.06825, -1.24814] + } + }, + "leg_back_left": { + "rotation": { + "vector": [-55.41141, 18.82943, 12.54707] + }, + "position": { + "vector": [0, -0.06825, -1.24814] + } + }, + "tail": { + "rotation": { + "vector": [35, 0, 0] + } + } + } + }, + "idle": { + "loop": true, + "bones": { + "head": { + "position": { + "vector": [0, "Math.cos(query.anim_time * 100) * 0.10", 0] + } + }, + "tail": { + "rotation": { + "vector": ["Math.cos(query.anim_time * 100+80) *2", 0, 0] + } + } + } + }, + "idle_wag": { + "loop": true, + "bones": { + "head": { + "position": { + "vector": [0, "Math.cos(query.anim_time * 100) * 0.10", 0] + } + }, + "tail": { + "rotation": { + "vector": [0, "Math.cos(query.anim_time * 700+100) *15", 0] + } + } + } + } + }, + "geckolib_format_version": 2 +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/geo/nook.geo.json b/src/main/resources/assets/ars_nouveau/geo/nook.geo.json new file mode 100644 index 0000000000..79cd72344b --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/geo/nook.geo.json @@ -0,0 +1,235 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 64, + "texture_height": 64, + "visible_bounds_width": 3, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "nook", + "pivot": [0, 0, -4] + }, + { + "name": "body", + "parent": "nook", + "pivot": [0, 7, 1.5], + "cubes": [ + { + "origin": [-3, 4, -3], + "size": [6, 5, 9], + "inflate": 0.01, + "uv": { + "north": {"uv": [24, 23], "uv_size": [6, 5]}, + "east": {"uv": [0, 9], "uv_size": [9, 5]}, + "south": {"uv": [0, 26], "uv_size": [6, 5]}, + "west": {"uv": [9, 9], "uv_size": [9, 5]}, + "up": {"uv": [0, 0], "uv_size": [6, 9]}, + "down": {"uv": [6, 9], "uv_size": [6, -9]} + } + }, + { + "origin": [-3, 6, -3], + "size": [6, 3, 6], + "inflate": 0.3, + "uv": { + "north": {"uv": [12, 6], "uv_size": [6, 3]}, + "east": {"uv": [16, 29], "uv_size": [6, 3]}, + "south": {"uv": [30, 0], "uv_size": [6, 3]}, + "west": {"uv": [30, 3], "uv_size": [6, 3]}, + "up": {"uv": [0, 20], "uv_size": [6, 6]}, + "down": {"uv": [6, 26], "uv_size": [6, -6]} + } + } + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 10, -2], + "rotation": [0, 0, 0], + "cubes": [ + { + "origin": [-3, 7, -5], + "size": [6, 6, 2], + "inflate": 0.5, + "uv": { + "north": {"uv": [12, 20], "uv_size": [6, 6]}, + "east": {"uv": [38, 3], "uv_size": [0, 6]}, + "south": {"uv": [24, 0], "uv_size": [6, 6]}, + "west": {"uv": [37, 5], "uv_size": [0, 6]}, + "up": {"uv": [25, 0], "uv_size": [6, 0]}, + "down": {"uv": [29, 1], "uv_size": [6, 0]} + } + }, + { + "origin": [-3, 7, -6], + "size": [6, 6, 5], + "inflate": 0.5, + "uv": { + "north": {"uv": [12, 0], "uv_size": [6, 6]}, + "east": {"uv": [24, 6], "uv_size": [5, 6]}, + "south": {"uv": [0, 14], "uv_size": [6, 6]}, + "west": {"uv": [24, 12], "uv_size": [5, 6]}, + "up": {"uv": [18, 24], "uv_size": [6, 5]}, + "down": {"uv": [24, 23], "uv_size": [6, -5]} + } + }, + { + "origin": [-3, 7, -7], + "size": [6, 6, 6], + "inflate": 0.02, + "uv": { + "north": {"uv": [6, 14], "uv_size": [6, 6]}, + "east": {"uv": [12, 14], "uv_size": [6, 6]}, + "south": {"uv": [18, 0], "uv_size": [6, 6]}, + "west": {"uv": [18, 6], "uv_size": [6, 6]}, + "up": {"uv": [18, 12], "uv_size": [6, 6]}, + "down": {"uv": [18, 24], "uv_size": [6, -6]} + } + }, + { + "origin": [-3, 13, -5], + "size": [2, 2, 1], + "inflate": 0.02, + "uv": { + "north": {"uv": [33, 10], "uv_size": [2, 2]}, + "east": {"uv": [29, 16], "uv_size": [1, 2]}, + "south": {"uv": [33, 12], "uv_size": [2, 2]}, + "west": {"uv": [34, 16], "uv_size": [1, 2]}, + "up": {"uv": [16, 28], "uv_size": [2, 1]}, + "down": {"uv": [34, 19], "uv_size": [2, -1]} + } + }, + { + "origin": [1, 13, -5], + "size": [2, 2, 1], + "inflate": 0.02, + "uv": { + "north": {"uv": [33, 14], "uv_size": [2, 2]}, + "east": {"uv": [34, 19], "uv_size": [1, 2]}, + "south": {"uv": [22, 33], "uv_size": [2, 2]}, + "west": {"uv": [34, 21], "uv_size": [1, 2]}, + "up": {"uv": [34, 23], "uv_size": [2, 1]}, + "down": {"uv": [34, 25], "uv_size": [2, -1]} + } + }, + { + "origin": [-1, 7, -9], + "size": [2, 2, 2], + "inflate": 0.02, + "uv": { + "north": {"uv": [16, 26], "uv_size": [2, 2]}, + "east": {"uv": [32, 20], "uv_size": [2, 2]}, + "south": {"uv": [32, 22], "uv_size": [2, 2]}, + "west": {"uv": [32, 24], "uv_size": [2, 2]}, + "up": {"uv": [32, 26], "uv_size": [2, 2]}, + "down": {"uv": [32, 30], "uv_size": [2, -2]} + } + } + ] + }, + { + "name": "leg_front_right", + "parent": "body", + "pivot": [-2, 4, -2], + "cubes": [ + { + "origin": [-3, 0, -3], + "size": [2, 4, 2], + "uv": { + "north": {"uv": [22, 29], "uv_size": [2, 4]}, + "east": {"uv": [30, 16], "uv_size": [2, 4]}, + "south": {"uv": [30, 20], "uv_size": [2, 4]}, + "west": {"uv": [30, 24], "uv_size": [2, 4]}, + "up": {"uv": [32, 30], "uv_size": [2, 2]}, + "down": {"uv": [32, 34], "uv_size": [2, -2]} + } + } + ] + }, + { + "name": "leg_front_left", + "parent": "body", + "pivot": [2, 4, -2], + "cubes": [ + { + "origin": [1, 0, -3], + "size": [2, 4, 2], + "uv": { + "north": {"uv": [8, 31], "uv_size": [2, 4]}, + "east": {"uv": [10, 31], "uv_size": [2, 4]}, + "south": {"uv": [12, 31], "uv_size": [2, 4]}, + "west": {"uv": [14, 31], "uv_size": [2, 4]}, + "up": {"uv": [24, 33], "uv_size": [2, 2]}, + "down": {"uv": [26, 35], "uv_size": [2, -2]} + } + } + ] + }, + { + "name": "leg_back_right", + "parent": "body", + "pivot": [-2, 4, 5], + "cubes": [ + { + "origin": [-3, 0, 4], + "size": [2, 4, 2], + "uv": { + "north": {"uv": [0, 31], "uv_size": [2, 4]}, + "east": {"uv": [2, 31], "uv_size": [2, 4]}, + "south": {"uv": [4, 31], "uv_size": [2, 4]}, + "west": {"uv": [6, 31], "uv_size": [2, 4]}, + "up": {"uv": [33, 6], "uv_size": [2, 2]}, + "down": {"uv": [33, 10], "uv_size": [2, -2]} + } + } + ] + }, + { + "name": "leg_back_left", + "parent": "body", + "pivot": [2, 4, 5], + "cubes": [ + { + "origin": [1, 0, 4], + "size": [2, 4, 2], + "uv": { + "north": {"uv": [16, 32], "uv_size": [2, 4]}, + "east": {"uv": [32, 16], "uv_size": [2, 4]}, + "south": {"uv": [18, 32], "uv_size": [2, 4]}, + "west": {"uv": [20, 32], "uv_size": [2, 4]}, + "up": {"uv": [28, 33], "uv_size": [2, 2]}, + "down": {"uv": [30, 35], "uv_size": [2, -2]} + } + } + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 9, 6], + "cubes": [ + { + "origin": [-2, 7, 4], + "size": [4, 5, 5], + "uv": { + "north": {"uv": [24, 28], "uv_size": [4, 5]}, + "east": {"uv": [6, 26], "uv_size": [5, 5]}, + "south": {"uv": [28, 28], "uv_size": [4, 5]}, + "west": {"uv": [11, 26], "uv_size": [5, 5]}, + "up": {"uv": [29, 6], "uv_size": [4, 5]}, + "down": {"uv": [29, 16], "uv_size": [4, -5]} + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/textures/entity/nook.png b/src/main/resources/assets/ars_nouveau/textures/entity/nook.png new file mode 100644 index 0000000000000000000000000000000000000000..2e7f43f713149b72755b60d7940d5c254c53311e GIT binary patch literal 1540 zcmV+f2K)JmP)Px)zDYzuRCt{2nomd^R~*N`+L4{z+F2uR#ndg>P(gywilR9?duxpLcEh@jcH{i(U76dj*>(?uQcASj~2f?&i5(t^#^_?}x}KTNKSm7GUc#@bf28x)8Fi|P~U)Rsy0 zeU$;c$f>UVP|LQh-!zSy`cE&;Vyr)jnlHlHt8RzD5)5_SLpT)}E0$aZqhJrCMU&vG z3_y>r1E|ScDd$Pa$BS2Zc_X!ETRu+m+#uo6vgScFejZJ+Ra0tXy1_q$(>~uwt)X12 z001N#FW~Xa)ZrvKAdXu=^?MPY7~u66xi$)%V6pm4H_#9o=k>X8Cse-|)ny*UUZzo9 z<}uy4T&r+x)kR8?6P%1+A+C)2(RBdO5E?fL)DRj6(+#cxq9(8e<9%6zp{b=6O)ag( zm#zR509ac{0=X5ou5O^C9{{*Eh`)>1kwElK>Mas`nTCOF9%CS9IiXKBnQON z4FW)2_mFM*pxAi>y;m{|)*|y)f--gI&FY3C7Od4?9 z86?N!FbPD0TLmme98Y7HYZZvQAUpsl(b&B055Y6NP7jl@v)0jtM|nvTF`Hy%BejP4 z@D=!juK_M@0fmAT(Fg*-ibC>z_|KM3g&O zX9#XGGTMtkM?V@PKOROPD{w`ksA!2dDoQ}D9TXR zGJg;VeqXKn(i9)qB~1X})9Zhl>igB6xp3z}p1WvdGeVZ5Ek$UN2mkQ)Q*UJ5)$-pv z?xC*bP5d$SD*)iz5AWLEAUe`#`-)8rrrd-Z!IfuEOh3?yli&o^lh4<|5{zri^kR*z zwQtW&CaL{)mCA)*z8ylaXE57&_}&qSw>JvC1SNbugFFX-oS;rH-9YHpTWGF5i{{#$ z_UXl0gui;q&ke{WSD9|`Ep!s{fe-cU*41~y?u;)UbVMUa`M`3m0`UX`n;76} zH#aDytj=7x6EjyY^N9%d45A@4&IJkf3_|sLkxp%KjY+4rFu5{T5{=D6{D`S@QG=4t z*THlHL{WJ2zSLaRys*jlzCroX8yp6#hj#xdA4i1@@nR?zn@p{b=6kBrkw_#Gi9{li qNF)-8L?V$$Boc{4B9Tb`U;GOPZVKp5l!(y)0000E;1KPr}OV?1HDDErtmDY2YokG>ikvOOp=GixqvW8BEFobklAho6PQ^bHIY zk{FMv-SYgAb6Ac2yu=ZSrguWCQqr=jmX^rSwxjXG;VTQaEoFPp&h&QoHqVvQ?p(`V{*R|^-;rNS z0)xDKcU2eV3+T=iP5-q*b$iB6W(9_n(2q<71`LnP_jxaHE#BTO&rtPUFk)_F_%i|B z^l3MoIMSsrIka!Ovt)m^q0NMJ)%`lcXV-mZ Date: Sun, 20 Oct 2024 14:16:47 -0500 Subject: [PATCH 220/363] Fix binding order, lang, behavior on world load #1447 --- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 +-- .../e7c243f38c2b0774b1bff1a90ede0b19a4077240 | 4 +-- .../assets/ars_nouveau/lang/en_us.json | 2 +- .../en_us/entries/automation/alakarkinos.json | 2 +- .../common/datagen/LangDatagen.java | 2 +- .../common/datagen/PatchouliProvider.java | 2 +- .../arsnouveau/common/entity/Alakarkinos.java | 25 ++++++------------- 7 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 74e3da8eb0..cc7ab492da 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-10-20T13:23:57.3527592 Languages: en_us for mod: ars_nouveau -fc53acf5bc787081dc3d403020476dc488a534f7 assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-10-20T14:14:06.2420782 Languages: en_us for mod: ars_nouveau +d57af878416b6442c789ec5eb02622787c003fe0 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 index 28c846d2e7..524cd0b021 100644 --- a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 +++ b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 @@ -1,4 +1,4 @@ -// 1.21.1 2024-10-20T13:23:57.3547595 Patchouli +// 1.21.1 2024-10-20T14:14:58.4144629 Patchouli 2ec536fea831588201432d61d70af61385882054 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/alteration_table.json a82f4fc73946d228b1e3f5e03d0ecef46f33cdfb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/applying_perks.json 8ce1d8e886b45066bc5c1d9d8e87bdabbb27ae27 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor.json @@ -22,7 +22,7 @@ d18984196578c97c968118f1fe6398cb683c292e assets/ars_nouveau/patchouli_books/worn d9e621409981d50547758d2106d4d1d368823389 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_warding.json 9eb1a48929505b0957ea3192aeb875d716e30510 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_whirlisprig.json 8a65d3abee43b8131b8c43d46caa1f5f66123045 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_wixie.json -fb9740b10cd620065f1dcd9792cb664d57d237a2 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/alakarkinos.json +12f3206810699b1c8ee94ff9ddeb5330b52749b6 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/alakarkinos.json c365b920481cbe283c09f7b26cc070b6eb422cf9 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/allow_scroll.json 4cd0f67b4702dff32f62ee6f45270a62985674ae assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/amethyst_golem_charm.json c7d187c5baed53c4ddb63b6b6dc9ec9847c21a45 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/deny_scroll.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 05c1fa8b6f..8b2cd2277a 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -82,6 +82,7 @@ "ars_nouveau.adv.title.wixie_hat": "Potion Transport", "ars_nouveau.advancement.desc.root": "Acquire a Worn Notebook", "ars_nouveau.advancement.title.root": "Ars Nouveau", + "ars_nouveau.alakarkinos.set_home": "Home set. Place source and gravel or sand within 3 blocks.", "ars_nouveau.alchemists_crown.no_flasks": "No flasks or potions equipped.", "ars_nouveau.alert.duplicate_method": "No duplicate cast methods are allowed.", "ars_nouveau.alert.spell_set": "Spell set.", @@ -955,7 +956,6 @@ "ars_nouveau.wixie_cauldron.cleared": "Bound inventories cleared.", "ars_nouveau.wixie_cauldron.removed": "Inventory removed.", "ars_nouveau.wixie_familiar.applied": "Wixie applies %s", - "ars_novueau.alakarkinos.set_home": "Home set. Place source and gravel or sand within 3 blocks.", "arsnouveau.debug.log_created": "Log file created: %s", "attribute.name.ars_nouveau.mana_regen": "Mana Regeneration", "attribute.name.ars_nouveau.max_mana": "Max Mana", diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/alakarkinos.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/alakarkinos.json index 692d4bd4ec..b48bee5c97 100644 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/alakarkinos.json +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/alakarkinos.json @@ -14,7 +14,7 @@ { "type": "patchouli:entity", "entity": "ars_nouveau:alakarkinos", - "scale": 0.25, + "scale": 0.5, "text": "ars_nouveau.page2.alakarkinos_charm" }, { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index d1faba431c..10817f063d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -1322,7 +1322,7 @@ protected void addTranslations() { add("ars_nouveau.page2.alakarkinos_charm","Loves to dance to nearby jukeboxes."); add("ars_nouveau.page3.alakarkinos_charm","Alakarkinos can be summoned anywhere by using a charm on a block. To set its home, use the Dominion Wand to bind Alakarkinos to a chest or inventory."); add("ars_nouveau.page4.alakarkinos_charm","Alakarkinos will seek out gravel or sand that is placed within 3 blocks horizontal and one block vertical around its bound inventory. In order to convert blocks into items, Source must be provided near its chest. After some time and a few magic tricks, Alakarkinos will destroy the sand or gravel and insert items into the inventory."); - add("ars_novueau.alakarkinos.set_home", "Home set. Place source and gravel or sand within 3 blocks."); + add("ars_nouveau.alakarkinos.set_home", "Home set. Place source and gravel or sand within 3 blocks."); add("ars_nouveau.sifting", "Sifting"); add("tooltip.alakarkinos_shard1", "Found by giving an Alakarkinos a Sherd."); add("tooltip.alakarkinos_shard2", "What's that behind your ear?"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java index d26ae792ba..512b5d7e15 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java @@ -656,7 +656,7 @@ public void addEntries() { addPage(new PatchouliBuilder(AUTOMATION, ItemsRegistry.ALAKARKINOS_CHARM) .withLocalizedText() .withPage(new ApparatusPage(ItemsRegistry.ALAKARKINOS_CHARM)) - .withPage(new EntityPage(getRegistryName(ModEntities.ALAKARKINOS_TYPE.get()).toString()).withScale(0.25f) + .withPage(new EntityPage(getRegistryName(ModEntities.ALAKARKINOS_TYPE.get()).toString()).withScale(0.5f) .withText(getLangPath("alakarkinos_charm", 2))) .withPage(new TextPage(getLangPath("alakarkinos_charm", 3)).withTitle("ars_nouveau.summoning")) .withPage(new TextPage(getLangPath("alakarkinos_charm", 4)).withTitle("ars_nouveau.sifting")), getPath(AUTOMATION, "alakarkinos")); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Alakarkinos.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Alakarkinos.java index 91928bfb5a..11601fe2e5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Alakarkinos.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Alakarkinos.java @@ -40,7 +40,6 @@ import net.minecraft.world.entity.PathfinderMob; import net.minecraft.world.entity.ai.goal.FloatGoal; import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; -import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; import net.minecraft.world.entity.ai.goal.WrappedGoal; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; @@ -214,14 +213,11 @@ public List getGoals() { if (tamed) { list.add(new WrappedGoal(4, new ConditionalLookAtMob(this, Player.class, 3.0F, 0.02F, () -> this.lookAt == null))); list.add(new WrappedGoal(4, new ConditionalLookAtMob(this, Mob.class, 8.0F, () -> this.lookAt == null))); -// list.add(new WrappedGoal(3, new WaterAvoidingRandomStrollGoal(this, 1.2D))); - list.add(new WrappedGoal(0, new FloatGoal(this))); list.add(new WrappedGoal(4, new LookAtTarget(this, 8.0f, () -> this.lookAt))); }else{ list.add(new WrappedGoal(1, new UntamedFindItemGoal(this, () -> this.getMainHandItem().isEmpty(), (e) -> e.getItem().is(ItemTags.DECORATED_POT_SHERDS)))); list.add(new WrappedGoal(4, new LookAtPlayerGoal(this, Player.class, 3.0F, 0.02F))); list.add(new WrappedGoal(4, new LookAtPlayerGoal(this, Mob.class, 8.0F))); - list.add(new WrappedGoal(3, new WaterAvoidingRandomStrollGoal(this, 1.2D))); list.add(new WrappedGoal(0, new FloatGoal(this))); } return list; @@ -278,7 +274,7 @@ public void getTooltip(List tooltip) { } @Override - public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable LivingEntity storedEntity, Player playerEntity) { + public void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @Nullable LivingEntity storedEntity, Player playerEntity) { if (playerEntity.level.getCapability(Capabilities.ItemHandler.BLOCK, storedPos, null) != null) { this.entityData.set(HOME, Optional.ofNullable(storedPos)); PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.alakarkinos.set_home")); @@ -379,18 +375,8 @@ public boolean save(CompoundTag pCompound) { boolean setBehaviors = false; @Override - public void readAdditionalSaveData(CompoundTag compound) { - super.readAdditionalSaveData(compound); - if (!setBehaviors) { - this.goalSelector.availableGoals = new LinkedHashSet<>(); - this.reloadGoals(); - setBehaviors = true; - } - } - - @Override - public void load(CompoundTag pCompound) { - super.load(pCompound); + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); if (pCompound.contains("home")) { this.entityData.set(HOME, Optional.of(BlockPos.of(pCompound.getLong("home")))); } @@ -401,6 +387,11 @@ public void load(CompoundTag pCompound) { this.tamed = pCompound.getBoolean("tamed"); this.setNeedSource(pCompound.getBoolean("needSource")); this.beingTamed = pCompound.getBoolean("beingTamed"); + if (!setBehaviors) { + this.goalSelector.availableGoals = new LinkedHashSet<>(); + this.reloadGoals(); + setBehaviors = true; + } } public enum Animations { From de1e870ba58bfe1905125e625f563d59d1c03f7c Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 20 Oct 2024 14:43:56 -0500 Subject: [PATCH 221/363] Add alakarkinos spawn egg #1446 --- .../.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 ++-- .../.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 | 9 ++++++++- .../resources/assets/ars_nouveau/lang/en_us.json | 1 + .../ars_nouveau/models/item/alakarkinos_se.json | 3 +++ .../assets/ars_nouveau/models/item/drygmy_se.json | 3 +++ .../ars_nouveau/models/item/starbuncle_se.json | 3 +++ .../ars_nouveau/models/item/whirlisprig_se.json | 3 +++ .../ars_nouveau/models/item/wilden_guardian_se.json | 3 +++ .../ars_nouveau/models/item/wilden_hunter_se.json | 3 +++ .../ars_nouveau/models/item/wilden_stalker_se.json | 3 +++ .../common/datagen/ItemModelGenerator.java | 13 +++++++++++++ .../arsnouveau/common/datagen/LangDatagen.java | 1 + .../arsnouveau/common/lib/LibItemNames.java | 1 + .../arsnouveau/setup/registry/ItemsRegistry.java | 1 + .../assets/ars_nouveau/models/item/drygmy_se.json | 3 --- .../ars_nouveau/models/item/starbuncle_se.json | 1 - .../ars_nouveau/models/item/whirlisprig_se.json | 1 - .../ars_nouveau/models/item/wilden_guardian_se.json | 1 - .../ars_nouveau/models/item/wilden_hunter_se.json | 1 - .../ars_nouveau/models/item/wilden_stalker_se.json | 1 - 20 files changed, 48 insertions(+), 11 deletions(-) create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/alakarkinos_se.json create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/drygmy_se.json create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/starbuncle_se.json create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/whirlisprig_se.json create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/wilden_guardian_se.json create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/wilden_hunter_se.json create mode 100644 src/generated/resources/assets/ars_nouveau/models/item/wilden_stalker_se.json delete mode 100644 src/main/resources/assets/ars_nouveau/models/item/drygmy_se.json delete mode 100644 src/main/resources/assets/ars_nouveau/models/item/starbuncle_se.json delete mode 100644 src/main/resources/assets/ars_nouveau/models/item/whirlisprig_se.json delete mode 100644 src/main/resources/assets/ars_nouveau/models/item/wilden_guardian_se.json delete mode 100644 src/main/resources/assets/ars_nouveau/models/item/wilden_hunter_se.json delete mode 100644 src/main/resources/assets/ars_nouveau/models/item/wilden_stalker_se.json diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index cc7ab492da..d978a21222 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-10-20T14:14:06.2420782 Languages: en_us for mod: ars_nouveau -d57af878416b6442c789ec5eb02622787c003fe0 assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-10-20T14:38:31.3652392 Languages: en_us for mod: ars_nouveau +8adc5bdc2d4dbdbb860566359d908f0de766f2d8 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 index f7f7bdb035..8e0b4ce7e4 100644 --- a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 +++ b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 @@ -1,7 +1,8 @@ -// 1.21.1 2024-10-19T19:02:13.8318776 Ars Nouveau Item Models +// 1.21.1 2024-10-20T14:26:18.8460366 Ars Nouveau Item Models 11ee554b11a3a830e89b742762e5b754c2ecb5ee assets/ars_nouveau/models/item/agronomic_sourcelink.json 20a434b964b88bc010c17e0616f2c2601b53479d assets/ars_nouveau/models/item/alakarkinos_charm.json 533b61aabca43719a266cddda3b7ec426135e5e6 assets/ars_nouveau/models/item/alakarkinos_hat.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/ars_nouveau/models/item/alakarkinos_se.json cf5f914263c22eabc17be749ade10e9d64736851 assets/ars_nouveau/models/item/alakarkinos_token.json 339a05323ebef7efc5c70db708a2e7a24708e9bc assets/ars_nouveau/models/item/alchemical_sourcelink.json a0214090201827dd5f954d0b33e64e4df6e53764 assets/ars_nouveau/models/item/alchemists_crown.json @@ -11,6 +12,7 @@ f9eb0905e283cab647712716770a244a1bdb25f0 assets/ars_nouveau/models/item/bastion_ 84bdd95fc8506c6d9054e5ffb87c24c20b2ae628 assets/ars_nouveau/models/item/blank_thread.json a81ea25c1312389ff436100c29d1ae20d35b0a40 assets/ars_nouveau/models/item/blue_sbed.json 3b7dc3023a667efe5ff64cb937ee25047a853697 assets/ars_nouveau/models/item/bombegranate_pod.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/ars_nouveau/models/item/drygmy_se.json 23781f068b9b788d0077a478b0470af583d759f5 assets/ars_nouveau/models/item/experience_gem.json 70d392c53a05ad554f3f3b1d3faa5fd1445e2a77 assets/ars_nouveau/models/item/falseweave.json 5f620c31cc6d4f1a569dbd943e5a45e75217303a assets/ars_nouveau/models/item/familiar_amethyst_golem.json @@ -218,6 +220,7 @@ a7b3f41fce153ebc7540a0dfbe855fc724f521b1 assets/ars_nouveau/models/item/sourcest f433c503db1699241353f198a0d427f708716930 assets/ars_nouveau/models/item/source_gem_block.json 456330a19a0028b82be0c6bb1ebe9486b3613a1a assets/ars_nouveau/models/item/source_lamp.json 9d2205eb9012b0585bff4adaf4c02419b2f01d9a assets/ars_nouveau/models/item/spell_sensor.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/ars_nouveau/models/item/starbuncle_se.json 1a921e2809c2a9588e7e8f5fbe4556f5f6729487 assets/ars_nouveau/models/item/stripped_blue_archwood_log.json 1205608f4c722986291eb4255ad2e405715515cf assets/ars_nouveau/models/item/stripped_blue_archwood_wood.json 8cf33c617e9b25c0fe978d8e517ff8f7d03f266f assets/ars_nouveau/models/item/stripped_green_archwood_log.json @@ -248,5 +251,9 @@ b79310281aae70a7aa6af5e3270c5034106dc2a1 assets/ars_nouveau/models/item/thread_w 51225dd289572d53a0ed0f767380081712411813 assets/ars_nouveau/models/item/vitalic_sourcelink.json 7137ce0392d01860ba8bd7d15c962d4a44d2b390 assets/ars_nouveau/models/item/void_prism.json 49086385023fb8590e80567ae57e7104543ceb0c assets/ars_nouveau/models/item/volcanic_sourcelink.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/ars_nouveau/models/item/whirlisprig_se.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/ars_nouveau/models/item/wilden_guardian_se.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/ars_nouveau/models/item/wilden_hunter_se.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/ars_nouveau/models/item/wilden_stalker_se.json 15996959ddfb148e5e775a865eddb46d16177866 assets/ars_nouveau/models/item/wololo.json 1a84ca1f514d9cf90ecf8384a579b0ea43cb71f8 assets/ars_nouveau/models/item/yellow_sbed.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 8b2cd2277a..fd1b7d9ce2 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -1230,6 +1230,7 @@ "item.ars_nouveau.abjuration_essence": "Abjuration Essence", "item.ars_nouveau.air_essence": "Air Essence", "item.ars_nouveau.alakarkinos_charm": "Alakarkinos Charm", + "item.ars_nouveau.alakarkinos_se": "Alakarkinos Spawn Egg", "item.ars_nouveau.alakarkinos_token": "Alakarkinos Token", "item.ars_nouveau.alchemists_crown": "Alchemist's Crown", "item.ars_nouveau.allow_scroll": "Item Scroll: Allow", diff --git a/src/generated/resources/assets/ars_nouveau/models/item/alakarkinos_se.json b/src/generated/resources/assets/ars_nouveau/models/item/alakarkinos_se.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/alakarkinos_se.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/models/item/drygmy_se.json b/src/generated/resources/assets/ars_nouveau/models/item/drygmy_se.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/drygmy_se.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/models/item/starbuncle_se.json b/src/generated/resources/assets/ars_nouveau/models/item/starbuncle_se.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/starbuncle_se.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/models/item/whirlisprig_se.json b/src/generated/resources/assets/ars_nouveau/models/item/whirlisprig_se.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/whirlisprig_se.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/models/item/wilden_guardian_se.json b/src/generated/resources/assets/ars_nouveau/models/item/wilden_guardian_se.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/wilden_guardian_se.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/models/item/wilden_hunter_se.json b/src/generated/resources/assets/ars_nouveau/models/item/wilden_hunter_se.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/wilden_hunter_se.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/models/item/wilden_stalker_se.json b/src/generated/resources/assets/ars_nouveau/models/item/wilden_stalker_se.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/models/item/wilden_stalker_se.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java index 5fa3a863b9..6bf2b1b79b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ItemModelGenerator.java @@ -11,6 +11,7 @@ import com.hollingsworth.arsnouveau.common.items.PerkItem; import com.hollingsworth.arsnouveau.common.items.RitualTablet; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; +import com.hollingsworth.arsnouveau.common.lib.LibItemNames; import com.hollingsworth.arsnouveau.setup.registry.ItemRegistryWrapper; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.data.PackOutput; @@ -129,6 +130,18 @@ protected void registerModels() { getBuilder(LibBlockNames.CRAB_HAT).parent(BlockStatesDatagen.getUncheckedModel(LibBlockNames.CRAB_HAT)); itemUnchecked(ItemsRegistry.ALAKARKINOS_CHARM); itemUnchecked(ItemsRegistry.ALAKARKINOS_SHARD); + spawnEgg(LibItemNames.ALAKARKINOS_SE); + spawnEgg(LibItemNames.SYLPH_SE); + spawnEgg(LibItemNames.DRYGMY_SE); + spawnEgg(LibItemNames.STARBUNCLE_SE); + spawnEgg(LibItemNames.WILDEN_GUARDIAN_SE); + spawnEgg(LibItemNames.WILDEN_STALKER_SE); + spawnEgg(LibItemNames.WILDEN_HUNTER_SE); + } + + + public void spawnEgg(String s){ + getBuilder("ars_nouveau:" + s).parent(new ModelFile.UncheckedModelFile("item/template_spawn_egg")); } public void blockAsItem(String s){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 10817f063d..8fe68c9615 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -453,6 +453,7 @@ protected void addTranslations() { add("item.ars_nouveau.wilden_hunter_se", "Wilden Hunter Spawn Egg"); add("item.ars_nouveau.wilden_guardian_se", "Wilden Guardian Spawn Egg"); add("item.ars_nouveau.wilden_stalker_se", "Wilden Stalker Spawn Egg"); + add("item.ars_nouveau.alakarkinos_se", "Alakarkinos Spawn Egg"); add("tooltip.ars_nouveau.caster_tome", "Casts a spell at half the cost or the users entire mana bar, whichever is smaller."); add("item.ars_nouveau.caster_tome", "Caster Tome"); add("tooltip.ars_nouveau.glyph_disabled", "Disabled. Cannot be used."); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibItemNames.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibItemNames.java index 4867f1fa18..8b8887fb33 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibItemNames.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibItemNames.java @@ -73,6 +73,7 @@ public class LibItemNames { public static final String WILDEN_HUNTER_SE = "wilden_hunter_se"; public static final String WILDEN_STALKER_SE = "wilden_stalker_se"; public static final String WILDEN_GUARDIAN_SE = "wilden_guardian_se"; + public static final String ALAKARKINOS_SE = "alakarkinos_se"; public static final String CASTER_TOME = "caster_tome"; diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java index cbb7327034..a126c1fade 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ItemsRegistry.java @@ -273,6 +273,7 @@ public static void onItemRegistry(RegisterEvent.RegisterHelper helper) { ITEMS.register(LibItemNames.WILDEN_HUNTER_SE, () -> new DeferredSpawnEggItem(ModEntities.WILDEN_HUNTER, 0xFDFDFD, 0xCAA97F, defaultItemProperties())); ITEMS.register(LibItemNames.WILDEN_GUARDIAN_SE, () -> new DeferredSpawnEggItem(ModEntities.WILDEN_GUARDIAN, 0xFFFFFF, 0xFF9E00, defaultItemProperties())); ITEMS.register(LibItemNames.WILDEN_STALKER_SE, () -> new DeferredSpawnEggItem(ModEntities.WILDEN_STALKER, 0x9B650C, 0xEF1818, defaultItemProperties())); + ITEMS.register(LibItemNames.ALAKARKINOS_SE, () -> new DeferredSpawnEggItem(ModEntities.ALAKARKINOS_TYPE, 16724530, 3289855, defaultItemProperties())); } diff --git a/src/main/resources/assets/ars_nouveau/models/item/drygmy_se.json b/src/main/resources/assets/ars_nouveau/models/item/drygmy_se.json deleted file mode 100644 index 7a2c6da81b..0000000000 --- a/src/main/resources/assets/ars_nouveau/models/item/drygmy_se.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_spawn_egg" -} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/models/item/starbuncle_se.json b/src/main/resources/assets/ars_nouveau/models/item/starbuncle_se.json deleted file mode 100644 index bea5cbe52a..0000000000 --- a/src/main/resources/assets/ars_nouveau/models/item/starbuncle_se.json +++ /dev/null @@ -1 +0,0 @@ -{ "parent": "item/template_spawn_egg" } \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/models/item/whirlisprig_se.json b/src/main/resources/assets/ars_nouveau/models/item/whirlisprig_se.json deleted file mode 100644 index bea5cbe52a..0000000000 --- a/src/main/resources/assets/ars_nouveau/models/item/whirlisprig_se.json +++ /dev/null @@ -1 +0,0 @@ -{ "parent": "item/template_spawn_egg" } \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/models/item/wilden_guardian_se.json b/src/main/resources/assets/ars_nouveau/models/item/wilden_guardian_se.json deleted file mode 100644 index bea5cbe52a..0000000000 --- a/src/main/resources/assets/ars_nouveau/models/item/wilden_guardian_se.json +++ /dev/null @@ -1 +0,0 @@ -{ "parent": "item/template_spawn_egg" } \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/models/item/wilden_hunter_se.json b/src/main/resources/assets/ars_nouveau/models/item/wilden_hunter_se.json deleted file mode 100644 index bea5cbe52a..0000000000 --- a/src/main/resources/assets/ars_nouveau/models/item/wilden_hunter_se.json +++ /dev/null @@ -1 +0,0 @@ -{ "parent": "item/template_spawn_egg" } \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/models/item/wilden_stalker_se.json b/src/main/resources/assets/ars_nouveau/models/item/wilden_stalker_se.json deleted file mode 100644 index bea5cbe52a..0000000000 --- a/src/main/resources/assets/ars_nouveau/models/item/wilden_stalker_se.json +++ /dev/null @@ -1 +0,0 @@ -{ "parent": "item/template_spawn_egg" } \ No newline at end of file From 5d9891695fd47e6dd465e2eb5743e7ede866cced Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 20 Oct 2024 19:50:29 -0500 Subject: [PATCH 222/363] Fix nook head rotation --- .../client/renderer/entity/NookModel.java | 15 ++++++++------- .../arsnouveau/common/entity/Nook.java | 7 ++++++- .../ars_nouveau/animations/nook_animation.json | 6 ++++++ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/NookModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/NookModel.java index d3bb22867b..b57cf272fa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/NookModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/NookModel.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.common.entity.Nook; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.constant.DataTickets; @@ -17,18 +18,18 @@ public class NookModel extends GeoModel { public static ResourceLocation MODEL = ArsNouveau.prefix("geo/nook.geo.json"); public static ResourceLocation ANIMATION = ArsNouveau.prefix("animations/nook_animation.json"); - @Override public void setCustomAnimations(Nook entity, long uniqueID, @Nullable AnimationState customPredicate) { super.setCustomAnimations(entity, uniqueID, customPredicate); GeoBone head = this.getAnimationProcessor().getBone("head"); EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); - if(entity.isOrderedToSit()){ - head.setRotX(extraData.headPitch() * 0.017453292F); - head.setRotY(extraData.netHeadYaw() * 0.013453292F); - }else { - head.setRotX(extraData.headPitch() * 0.017453292F); - head.setRotY(extraData.netHeadYaw() * 0.017453292F); + + if(entity.isOrderedToSit()) { + head.setRotX(extraData.headPitch() * 0.017453292F - 32.5f * Mth.DEG_TO_RAD); + head.setRotY(extraData.netHeadYaw() * 0.010453292F); + }else{ + head.setRotX(extraData.headPitch() * Mth.DEG_TO_RAD); + head.setRotY(extraData.netHeadYaw() * Mth.DEG_TO_RAD); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Nook.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Nook.java index 8d46dad1cd..e728b23050 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Nook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Nook.java @@ -99,6 +99,11 @@ public void tick() { } } + @Override + public double getEyeY() { + return super.getEyeY(); + } + @Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { super.defineSynchedData(pBuilder); @@ -197,7 +202,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar data) { return PlayState.STOP; })); data.add(new AnimationController(this, "idle", 1, (event) -> { - if(!event.isMoving() && !this.isWagging()){ + if(!event.isMoving() && !this.isWagging() && !this.isOrderedToSit()){ event.getController().setAnimation(RawAnimation.begin().thenPlay("idle")); return PlayState.CONTINUE; } diff --git a/src/main/resources/assets/ars_nouveau/animations/nook_animation.json b/src/main/resources/assets/ars_nouveau/animations/nook_animation.json index 402315f1f4..fefd86b650 100644 --- a/src/main/resources/assets/ars_nouveau/animations/nook_animation.json +++ b/src/main/resources/assets/ars_nouveau/animations/nook_animation.json @@ -56,6 +56,12 @@ } }, "head": { + "relative_to": { + "rotation": "entity" + }, + "rotation": { + "vector": [0, 0, 0] + }, "position": { "vector": [0, -0.5373, -0.84339] } From 6d23acb06a4e69d3f6ae5e850cc98f3fade2d5bb Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 20 Oct 2024 19:53:05 -0500 Subject: [PATCH 223/363] 5.1.1 --- gradle.properties | 2 +- .../arsnouveau/client/renderer/entity/NookModel.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 9e6dc69768..7d0457c7ce 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.2.0 +mod_version=5.2.1 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/NookModel.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/NookModel.java index b57cf272fa..b2420e1ec7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/NookModel.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/NookModel.java @@ -23,7 +23,7 @@ public void setCustomAnimations(Nook entity, long uniqueID, @Nullable AnimationS super.setCustomAnimations(entity, uniqueID, customPredicate); GeoBone head = this.getAnimationProcessor().getBone("head"); EntityModelData extraData = (EntityModelData) customPredicate.getExtraData().get(DataTickets.ENTITY_MODEL_DATA); - + if(entity.isOrderedToSit()) { head.setRotX(extraData.headPitch() * 0.017453292F - 32.5f * Mth.DEG_TO_RAD); head.setRotY(extraData.netHeadYaw() * 0.010453292F); From e0e483fb3607effc7c6439900631c18f27c58378 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 21 Oct 2024 11:25:02 -0500 Subject: [PATCH 224/363] Update supporters --- .../cdae075e2d4d58384fe4d2075f6d5323fe5baa69 | 3 +- .../recipe/tomes/chosenarchitect_tome.json | 31 +++++++++++++++++++ .../api/sound/ConfiguredSpellSound.java | 6 ++-- .../common/datagen/CasterTomeProvider.java | 8 +++++ supporters.json | 8 ++++- 5 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/chosenarchitect_tome.json diff --git a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 index a1c9b3b6c7..701489dc2e 100644 --- a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 +++ b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 @@ -1,9 +1,10 @@ -// 1.21.1 2024-10-12T20:11:48.8307642 Ars Nouveau Caster Tomes Datagen +// 1.21.1 2024-10-21T11:24:04.7862855 Ars Nouveau Caster Tomes Datagen ab9cf50e4958592dcee6f5dae6d6bad2e7fe08ab data/ars_nouveau/recipe/tomes/alex_tome.json dae41a867bde9258624fe4676128e8140f2e7fe4 data/ars_nouveau/recipe/tomes/arachne_tome.json 71e004bfa5837d293c6ee00dd9fd99493b9b9aba data/ars_nouveau/recipe/tomes/aurellia_tome.json 2027d79f560de6a1a7829a478f64ccd8f1723bc2 data/ars_nouveau/recipe/tomes/bailey_tome.json 0be05276a18b4cac328dc05898e560b28f7e3a31 data/ars_nouveau/recipe/tomes/chems_tome.json +d975f667f8c7de86a8fc5dcc4cc2d07e4ff38096 data/ars_nouveau/recipe/tomes/chosenarchitect_tome.json 19564f80b5f660f4e472b2fab542e98a71c9b108 data/ars_nouveau/recipe/tomes/crowdrone_tome.json e9b37b1592c51345f27cd0571a12a373a469be73 data/ars_nouveau/recipe/tomes/darkfira_tome.json 3c4d9ad61832042e38046f7763047126dbc320a0 data/ars_nouveau/recipe/tomes/farfalla_tome.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/chosenarchitect_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/chosenarchitect_tome.json new file mode 100644 index 0000000000..a344688177 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/chosenarchitect_tome.json @@ -0,0 +1,31 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 32, + "g": 114, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "In a flash of magic, the world twists, and what was once here is now there.", + "name": "Chosen's Chaotic Shift", + "sound": { + "pitch": 2.0, + "sound": { + "id": "ars_nouveau:gaia_family" + }, + "volume": 0.55 + }, + "spell": [ + "ars_nouveau:glyph_projectile", + "ars_nouveau:glyph_accelerate", + "ars_nouveau:glyph_accelerate", + "ars_nouveau:glyph_accelerate", + "ars_nouveau:glyph_accelerate", + "ars_nouveau:glyph_accelerate", + "ars_nouveau:glyph_exchange", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_randomize", + "ars_nouveau:glyph_pickup" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/sound/ConfiguredSpellSound.java b/src/main/java/com/hollingsworth/arsnouveau/api/sound/ConfiguredSpellSound.java index 4b80aafa4d..b3bca02d21 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/sound/ConfiguredSpellSound.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/sound/ConfiguredSpellSound.java @@ -43,10 +43,10 @@ public ConfiguredSpellSound(SpellSound sound) { this(sound, 1, 1); } - public ConfiguredSpellSound(@Nullable SpellSound spellSound, float aFloat, float aFloat1) { + public ConfiguredSpellSound(@Nullable SpellSound spellSound, float volume, float pitch) { this.sound = spellSound ; - this.volume = aFloat; - this.pitch = aFloat1; + this.volume = volume; + this.pitch = pitch; } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java index ebc424e57a..fc956e23e2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java @@ -256,6 +256,14 @@ public void collectJsons(CachedOutput pOutput) { tomes.add(buildTome("uni","Uni's Windshield", new Spell(MethodSelf.INSTANCE, EffectOrbit.INSTANCE, EffectKnockback.INSTANCE).add(AugmentAmplify.INSTANCE, 8), "Stay away!")); tomes.add(buildTome("crowdrone", "Crow's Gluttonous Gaze", new Spell(MethodSelf.INSTANCE, EffectSenseMagic.INSTANCE, AugmentExtendTime.INSTANCE, EffectLight.INSTANCE).add(AugmentExtendTime.INSTANCE, 6), "Crows are known to collect shiny things, even in the darkest of places.", new ParticleColor(0,0,0))); + + tomes.add(buildTome("chosenarchitect","Chosen's Chaotic Shift", new Spell(MethodProjectile.INSTANCE) + .add(AugmentAccelerate.INSTANCE, 5) + .add(EffectExchange.INSTANCE) + .add(AugmentAmplify.INSTANCE) + .add(AugmentRandomize.INSTANCE) + .add(EffectPickup.INSTANCE) + .withSound(new ConfiguredSpellSound(SoundRegistry.GAIA_SPELL_SOUND, 0.55f, 2.0f)), "In a flash of magic, the world twists, and what was once here is now there.", new ParticleColor(255, 114, 32))); for (CasterRecipeWrapper g : tomes) { Path path = getRecipePath(output, g.id().getPath()); saveStable(pOutput, CasterTomeData.CODEC.encodeStart(JsonOps.INSTANCE, g.toData()).getOrThrow(), path); diff --git a/supporters.json b/supporters.json index 2fe5d2575e..e43de97dff 100644 --- a/supporters.json +++ b/supporters.json @@ -30,7 +30,8 @@ "47f9c9d2-89b2-4987-af6b-31e7b1f74da2", "ec77d204-6e8b-4dac-8b66-71b2a03c5e65", "98e72ae4-10c9-4696-970b-804eb9b176ae", "0421ad40-0881-47d4-b086-38c90c1ab62f", "a8875ecb-6e84-4c6d-ac68-3251b945d963", "cf1f7109-266d-4e5a-8a8a-d93684cf60b9", "e7976ce2-3344-4499-8b15-91adddc5ed0f", "d29025d7-cf5d-4976-8a65-fc3bdcc991b5", "8ced638c-eac7-433e-b794-54c0f23807a4", - "db489a87-6509-4d75-917d-9c426b519c64", "eb079f27-e266-4b3c-beba-b34d34bef268"], + "db489a87-6509-4d75-917d-9c426b519c64", "eb079f27-e266-4b3c-beba-b34d34bef268", "831086b8-d566-4f25-aa09-ecb505e54885", + "e3298bd7-61bf-427f-af89-4e418a20bf57"], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -482,6 +483,11 @@ "adopter": "Jarva", "color": "orange", "bio": "This poor Starbuncle was originally a Bookwyrm, polymorphed into a Starbuncle as part of an experiment gone wrong." + },{ + "name": "Archi", + "adopter": "ChosenArchitect", + "color": "blue", + "bio": "Archi was found tinkering with magical gadgets in an enchanted forest. It's a curious creature, always trying to automate everything around it. With a love for shiny items and complex machinery, it enjoys watching builds come to life and adds a touch of creativity wherever it goes." } ] } From 887cf8717f0e95f17c5a02519d87f67c78892b7f Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 24 Oct 2024 09:34:52 -0500 Subject: [PATCH 225/363] Update supporters.json --- supporters.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/supporters.json b/supporters.json index e43de97dff..9d6c44315a 100644 --- a/supporters.json +++ b/supporters.json @@ -31,7 +31,7 @@ "0421ad40-0881-47d4-b086-38c90c1ab62f", "a8875ecb-6e84-4c6d-ac68-3251b945d963", "cf1f7109-266d-4e5a-8a8a-d93684cf60b9", "e7976ce2-3344-4499-8b15-91adddc5ed0f", "d29025d7-cf5d-4976-8a65-fc3bdcc991b5", "8ced638c-eac7-433e-b794-54c0f23807a4", "db489a87-6509-4d75-917d-9c426b519c64", "eb079f27-e266-4b3c-beba-b34d34bef268", "831086b8-d566-4f25-aa09-ecb505e54885", - "e3298bd7-61bf-427f-af89-4e418a20bf57"], + "e3298bd7-61bf-427f-af89-4e418a20bf57", "01b53c7e-c7f4-4465-88df-f8b6c645b6b9"], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -488,6 +488,11 @@ "adopter": "ChosenArchitect", "color": "blue", "bio": "Archi was found tinkering with magical gadgets in an enchanted forest. It's a curious creature, always trying to automate everything around it. With a love for shiny items and complex machinery, it enjoys watching builds come to life and adds a touch of creativity wherever it goes." + },{ + "name": "Floki", + "color": "red", + "adopter": "Tevaino", + "bio": "The mage's favorite little creature." } ] } From 4e1d2d4765304eb10733b0864980ab83ede55050 Mon Sep 17 00:00:00 2001 From: sciwhiz12 Date: Fri, 25 Oct 2024 09:42:35 +0800 Subject: [PATCH 226/363] Fix item scroll data using List#remove for ItemStacks (#1455) As ItemStacks do not implement Object#equals properly, no two instances of an ItemStack will ever satisfy Objects#equal, even if their contents are identical. To work around this limitation, we manually iterate the list and use ItemStack#isSameItem to compare against the target stack (mirroring the same method used in ItemScrollData#contains). Fixes #1429 --- .../arsnouveau/common/items/data/ItemScrollData.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java index f1548e8feb..9bfdb95036 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ItemScrollData.java @@ -86,7 +86,17 @@ public boolean add(ItemStack stack) { } public boolean remove(ItemStack stack) { - return list.remove(stack.copy()); + // ItemStacks do not have a proper "equals" implementation, so List#remove doesn't work + // (as it relies on Object#equals being properly implemented) + list.removeIf(stored -> ItemStack.isSameItem(stored, stack)); + for (int i = 0; i < list.size(); i++) { + // Use the same check as ItemScrollData#contains + if (ItemStack.isSameItem(stack, list.get(i))) { + list.remove(i); // Will always succeed + return true; + } + } + return false; } public List getItems() { From 8fc9d7dcee675efae31df8142a3d2ffe56e476ab Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 24 Oct 2024 22:12:32 -0500 Subject: [PATCH 227/363] Fix drygmy crash --- .../hollingsworth/arsnouveau/common/entity/EntityDrygmy.java | 4 +++- .../arsnouveau/common/items/summon_charms/DrygmyCharm.java | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java index 4919b19588..4a5ae37dd2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityDrygmy.java @@ -320,7 +320,9 @@ public void addAdditionalSaveData(CompoundTag tag) { tag.putInt("cooldown", channelCooldown); tag.putInt("taming", tamingTime); tag.putBoolean("beingTamed", this.entityData.get(BEING_TAMED)); - tag.putString("color", this.entityData.get(COLOR)); + if(this.entityData.get(COLOR) != null) { + tag.putString("color", this.entityData.get(COLOR)); + } } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/DrygmyCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/DrygmyCharm.java index 9e5a01c606..9cb7b9d7ec 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/DrygmyCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/DrygmyCharm.java @@ -7,6 +7,7 @@ import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.context.UseOnContext; @@ -16,7 +17,7 @@ public class DrygmyCharm extends AbstractSummonCharm { public DrygmyCharm() { - super(); + super(ItemsRegistry.defaultItemProperties().component(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, new PersistentFamiliarData().setColor("brown"))); } @Override From af43205e3577e9bd9b09dcc83d4b8ad96072c9b4 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 24 Oct 2024 22:13:29 -0500 Subject: [PATCH 228/363] Fix alakarkinos hat duping --- .../hollingsworth/arsnouveau/common/entity/Alakarkinos.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Alakarkinos.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Alakarkinos.java index 11601fe2e5..78d465a35b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Alakarkinos.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Alakarkinos.java @@ -369,6 +369,7 @@ public boolean save(CompoundTag pCompound) { pCompound.putBoolean("needSource", this.needSource()); pCompound.putBoolean("tamed", this.tamed); pCompound.putBoolean("beingTamed", this.beingTamed); + pCompound.putBoolean("hasHat", this.hasHat()); return super.save(pCompound); } @@ -392,6 +393,9 @@ public void readAdditionalSaveData(CompoundTag pCompound) { this.reloadGoals(); setBehaviors = true; } + if(pCompound.contains("hasHat")){ + this.setHat(pCompound.getBoolean("hasHat")); + } } public enum Animations { From e1abcb1be8c35284424b992dd96d952cb1a1580d Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 24 Oct 2024 22:18:35 -0500 Subject: [PATCH 229/363] Fix crash with whirlisprig --- .../hollingsworth/arsnouveau/common/entity/Whirlisprig.java | 4 +++- .../common/items/summon_charms/WhirlisprigCharm.java | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java index 8fbb697277..e74f5fe948 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Whirlisprig.java @@ -419,7 +419,9 @@ public void addAdditionalSaveData(CompoundTag tag) { tag.putInt("bonemeal", timeSinceBonemeal); tag.putBoolean("tamed", this.entityData.get(TAMED)); tag.putInt("score", this.entityData.get(Whirlisprig.MOOD_SCORE)); - tag.putString("color", this.entityData.get(COLOR)); + if(this.entityData.get(COLOR) != null) { + tag.putString("color", this.entityData.get(COLOR)); + } tag.putInt("genTime", timeSinceGen); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WhirlisprigCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WhirlisprigCharm.java index 3d3bb23b2e..8665bcc8f2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WhirlisprigCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WhirlisprigCharm.java @@ -8,6 +8,7 @@ import com.hollingsworth.arsnouveau.common.items.data.PersistentFamiliarData; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; import net.minecraft.tags.BlockTags; import net.minecraft.world.InteractionResult; @@ -17,7 +18,7 @@ public class WhirlisprigCharm extends AbstractSummonCharm { public WhirlisprigCharm() { - super(); + super(ItemsRegistry.defaultItemProperties().component(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, new PersistentFamiliarData().setColor("summer"))); } @Override From d543e6439e2c1339b409e03c6eadd8801a3ea163 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 24 Oct 2024 22:27:27 -0500 Subject: [PATCH 230/363] Fix crash with wixie --- build.gradle | 4 ---- .../hollingsworth/arsnouveau/common/entity/EntityWixie.java | 4 +++- .../arsnouveau/common/items/summon_charms/WixieCharm.java | 3 ++- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index bc9171dcf2..8336441f4e 100644 --- a/build.gradle +++ b/build.gradle @@ -101,9 +101,6 @@ tasks.named('jarJar') {} dependencies { implementation "net.neoforged:neoforge:${neo_version}" -// jarJar(group: 'software.bernie.geckolib', name: "geckolib-neoforge-${minecraft_version}", version: "[4.5,)") { -// jarJar.pin(it, "${geckolib_version}") -// } implementation "software.bernie.geckolib:geckolib-neoforge-1.21.1:${geckolib_version}" // implementation(jarJar(group: 'vazkii.patchouli', name: 'Patchouli', version: '[1.21,)') { @@ -119,7 +116,6 @@ dependencies { implementation "curse.maven:jade-324717:5444008" implementation "top.theillusivec4.curios:curios-neoforge:${curios_version}+1.21" - implementation "curse.maven:ars-additions-974408:5698511" } jar { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java index 94e203c5f5..9ab6b7de0f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWixie.java @@ -193,7 +193,9 @@ public void addAdditionalSaveData(CompoundTag tag) { tag.putInt("summoner_y", cauldronPos.getY()); tag.putInt("summoner_z", cauldronPos.getZ()); } - tag.putString("color", this.entityData.get(COLOR)); + if(this.entityData.get(COLOR) != null) { + tag.putString("color", this.entityData.get(COLOR)); + } } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WixieCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WixieCharm.java index 909abd08d1..6785ce10ec 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WixieCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WixieCharm.java @@ -8,6 +8,7 @@ import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; @@ -17,7 +18,7 @@ public class WixieCharm extends AbstractSummonCharm { public WixieCharm() { - super(); + super(ItemsRegistry.defaultItemProperties().component(DataComponentRegistry.PERSISTENT_FAMILIAR_DATA, new PersistentFamiliarData().setColor("black"))); } /** From aa42041c2d6f3ae73276f9b924a68dc96a3eac54 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 24 Oct 2024 22:39:33 -0500 Subject: [PATCH 231/363] Fix jar not updating --- .../arsnouveau/common/block/tile/SourceJarTile.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java index 7beeb943f6..6ab67fe3f9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java @@ -32,10 +32,13 @@ public boolean updateBlock() { super.updateBlock(); BlockState state = level.getBlockState(worldPosition); int fillState = 0; - if (this.getSource() > 0 && getMaxSource() != 0) - fillState = 1 + 10 * (int) Math.clamp((float) this.getSource() / getMaxSource(), 0, 1); + if (this.getSource() > 0 && this.getSource() < 1000) + fillState = 1; + else if (this.getSource() != 0) { + fillState = (this.getSource() / 1000) + 1; + } if (state.hasProperty(SourceJar.fill)) - level.setBlock(worldPosition, state.setValue(SourceJar.fill, fillState), 3); + level.setBlock(worldPosition, state.setValue(SourceJar.fill, Math.min(fillState, 11)), 3); return true; } From 5133633386148144c2d19e2190c11208f826775d Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 24 Oct 2024 22:41:23 -0500 Subject: [PATCH 232/363] 5.2.2 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 7d0457c7ce..6e12bdeeb9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.2.1 +mod_version=5.2.2 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From a5ed3977793c3905998dbcea92a7b7cb8208463c Mon Sep 17 00:00:00 2001 From: Jarva <4622609+Jarva@users.noreply.github.com> Date: Mon, 28 Oct 2024 23:56:14 +0000 Subject: [PATCH 233/363] fix: update scry ritual to use c tags (#1468) --- .../457d401e850e914fe39c053c4aa175787ef49774 | 26 +++++++++---------- .../recipe/scry_ritual/amethyst_blocks.json | 4 +-- .../recipe/scry_ritual/amethyst_gems.json | 4 +-- .../recipe/scry_ritual/coal_ores.json | 4 +-- .../recipe/scry_ritual/copper_ores.json | 4 +-- .../recipe/scry_ritual/diamond_ores.json | 4 +-- .../recipe/scry_ritual/emerald_ores.json | 4 +-- .../recipe/scry_ritual/gold_ores.json | 4 +-- .../recipe/scry_ritual/iron_ores.json | 4 +-- .../recipe/scry_ritual/lapis_ores.json | 4 +-- .../scry_ritual/netherite_scrap_ores.json | 4 +-- .../recipe/scry_ritual/quartz_ores.json | 4 +-- .../recipe/scry_ritual/redstone_ores.json | 4 +-- .../common/datagen/ScryRitualProvider.java | 2 +- 14 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 b/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 index 0d6212eaf3..e8d6813e9d 100644 --- a/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 +++ b/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 @@ -1,13 +1,13 @@ -// 1.21.1 2024-08-17T10:54:39.2126506 Scry Ritual Datagen -232f269b1fff184deb77cb619f1cfef3dbb29d1d data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json -b32750a842adeae968d1a3aee9cf1765d896245f data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json -8841bb51fbd86c8fdfd0a8b4ef5a2b6cdf8193a0 data/ars_nouveau/recipe/scry_ritual/coal_ores.json -f298efed24031a5c3e76cc7aa3bf12780e7ced44 data/ars_nouveau/recipe/scry_ritual/copper_ores.json -6e4838ee784bded813559cd2763915defa728d03 data/ars_nouveau/recipe/scry_ritual/diamond_ores.json -602741f50cdf86ba4ba7d2f0085fb35074428d90 data/ars_nouveau/recipe/scry_ritual/emerald_ores.json -a27d99ff76851390a38678f486ce0cc7aa6fb2e4 data/ars_nouveau/recipe/scry_ritual/gold_ores.json -38be1715642ea1e154f86070da87e8d306aa90e1 data/ars_nouveau/recipe/scry_ritual/iron_ores.json -29109a5f9c441d248b187a85e39088d556efa30b data/ars_nouveau/recipe/scry_ritual/lapis_ores.json -816125ded36044cff815e0ef33bb954bb113857e data/ars_nouveau/recipe/scry_ritual/netherite_scrap_ores.json -7eaec9c24128a2b446429d9b0d9114809684a727 data/ars_nouveau/recipe/scry_ritual/quartz_ores.json -9d1e8391c936d3ba734a903b4f68199fd2cb7c52 data/ars_nouveau/recipe/scry_ritual/redstone_ores.json +// 1.21.1 2024-10-28T14:22:45.355925757 Scry Ritual Datagen +bd426f52e2cdaf860c0fc270cb1746d8b7596501 data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json +539354bf11e8ce41a4db4ce41044247b8389aff4 data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json +26baa828b81ffa33bb56b9ec47bb3d49fa2a0106 data/ars_nouveau/recipe/scry_ritual/coal_ores.json +d2dcdf8259d2bc6d29830a4f81b19f5d009cd062 data/ars_nouveau/recipe/scry_ritual/copper_ores.json +a6665e46a3e3d697fa16e1d7ec8f9a814fb11a0c data/ars_nouveau/recipe/scry_ritual/diamond_ores.json +1d97b836c7b01e4dd8bcbbdd164ad38f4f604dca data/ars_nouveau/recipe/scry_ritual/emerald_ores.json +5e3d38a9453f93eb12675393abffdf1392d35829 data/ars_nouveau/recipe/scry_ritual/gold_ores.json +411400d36c537e7ebe66b75ba53972d2bf519dca data/ars_nouveau/recipe/scry_ritual/iron_ores.json +bb0d58f05959e4958d7da998ac49662a1ac5245a data/ars_nouveau/recipe/scry_ritual/lapis_ores.json +40146eb7d6b66d4901cf356834424b8b88eb5fee data/ars_nouveau/recipe/scry_ritual/netherite_scrap_ores.json +5e8c407e166dcc51cb5d8e592ca85c0f30341440 data/ars_nouveau/recipe/scry_ritual/quartz_ores.json +e066e530226b8de300ef93e2ab9bbc1b804766b8 data/ars_nouveau/recipe/scry_ritual/redstone_ores.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json index 223ad31e06..da2d135b75 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json @@ -1,5 +1,5 @@ { "type": "ars_nouveau:scry_ritual", - "augment": "neoforge:storage_blocks/amethyst", - "highlight": "neoforge:storage_blocks/amethyst" + "augment": "c:storage_blocks/amethyst", + "highlight": "c:storage_blocks/amethyst" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json index e83a9ca337..a1c05458e3 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json @@ -1,5 +1,5 @@ { "type": "ars_nouveau:scry_ritual", - "augment": "neoforge:gems/amethyst", - "highlight": "neoforge:storage_blocks/amethyst" + "augment": "c:gems/amethyst", + "highlight": "c:storage_blocks/amethyst" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/coal_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/coal_ores.json index ff307d2ff3..56d568b2c9 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/coal_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/coal_ores.json @@ -1,5 +1,5 @@ { "type": "ars_nouveau:scry_ritual", - "augment": "neoforge:ores/coal", - "highlight": "neoforge:ores/coal" + "augment": "c:ores/coal", + "highlight": "c:ores/coal" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/copper_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/copper_ores.json index 4477e26e3e..4be245b6a9 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/copper_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/copper_ores.json @@ -1,5 +1,5 @@ { "type": "ars_nouveau:scry_ritual", - "augment": "neoforge:ores/copper", - "highlight": "neoforge:ores/copper" + "augment": "c:ores/copper", + "highlight": "c:ores/copper" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/diamond_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/diamond_ores.json index 6e751c177a..feea832b6d 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/diamond_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/diamond_ores.json @@ -1,5 +1,5 @@ { "type": "ars_nouveau:scry_ritual", - "augment": "neoforge:ores/diamond", - "highlight": "neoforge:ores/diamond" + "augment": "c:ores/diamond", + "highlight": "c:ores/diamond" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/emerald_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/emerald_ores.json index ec315d7027..782b008c6f 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/emerald_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/emerald_ores.json @@ -1,5 +1,5 @@ { "type": "ars_nouveau:scry_ritual", - "augment": "neoforge:ores/emerald", - "highlight": "neoforge:ores/emerald" + "augment": "c:ores/emerald", + "highlight": "c:ores/emerald" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/gold_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/gold_ores.json index 65dd56861f..1f6a786445 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/gold_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/gold_ores.json @@ -1,5 +1,5 @@ { "type": "ars_nouveau:scry_ritual", - "augment": "neoforge:ores/gold", - "highlight": "neoforge:ores/gold" + "augment": "c:ores/gold", + "highlight": "c:ores/gold" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/iron_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/iron_ores.json index 2e6e859fba..aa1d4ec6ee 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/iron_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/iron_ores.json @@ -1,5 +1,5 @@ { "type": "ars_nouveau:scry_ritual", - "augment": "neoforge:ores/iron", - "highlight": "neoforge:ores/iron" + "augment": "c:ores/iron", + "highlight": "c:ores/iron" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/lapis_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/lapis_ores.json index 3f2eea4a8d..313d5bed32 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/lapis_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/lapis_ores.json @@ -1,5 +1,5 @@ { "type": "ars_nouveau:scry_ritual", - "augment": "neoforge:ores/lapis", - "highlight": "neoforge:ores/lapis" + "augment": "c:ores/lapis", + "highlight": "c:ores/lapis" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/netherite_scrap_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/netherite_scrap_ores.json index 91a8b3de4f..3cc1fb60a4 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/netherite_scrap_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/netherite_scrap_ores.json @@ -1,5 +1,5 @@ { "type": "ars_nouveau:scry_ritual", - "augment": "neoforge:ores/netherite_scrap", - "highlight": "neoforge:ores/netherite_scrap" + "augment": "c:ores/netherite_scrap", + "highlight": "c:ores/netherite_scrap" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/quartz_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/quartz_ores.json index f693060bc4..f80e8d820e 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/quartz_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/quartz_ores.json @@ -1,5 +1,5 @@ { "type": "ars_nouveau:scry_ritual", - "augment": "neoforge:ores/quartz", - "highlight": "neoforge:ores/quartz" + "augment": "c:ores/quartz", + "highlight": "c:ores/quartz" } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/redstone_ores.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/redstone_ores.json index 86f9121d87..f57e3781a9 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/redstone_ores.json +++ b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/redstone_ores.json @@ -1,5 +1,5 @@ { "type": "ars_nouveau:scry_ritual", - "augment": "neoforge:ores/redstone", - "highlight": "neoforge:ores/redstone" + "augment": "c:ores/redstone", + "highlight": "c:ores/redstone" } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java index 4af86106a0..1a79dc8567 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java @@ -56,7 +56,7 @@ private TagKey forgeItemTag(String path) { } private ResourceLocation forgeTag(String path) { - return ResourceLocation.fromNamespaceAndPath("neoforge", path); + return ResourceLocation.fromNamespaceAndPath("c", path); } protected static Path getRecipePath(Path path, String id) { From 7a53e229230e2459154ec3ed921e5e8773dddbbf Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Tue, 29 Oct 2024 01:04:39 +0100 Subject: [PATCH 234/363] swap IER with direct item entity in imbuement chamber. example localRuntime swap (#1467) --- build.gradle | 6 ++- .../renderer/tile/ImbuementRenderer.java | 38 +++++++++---------- .../common/block/tile/ImbuementTile.java | 4 ++ 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/build.gradle b/build.gradle index 8336441f4e..a0134c981d 100644 --- a/build.gradle +++ b/build.gradle @@ -107,7 +107,7 @@ dependencies { jarJar.pin(it, patchouli_version) }) - runtimeOnly "com.illusivesoulworks.caelus:caelus-neoforge:${caelus_version}" + localRuntime "com.illusivesoulworks.caelus:caelus-neoforge:${caelus_version}" compileOnly "com.illusivesoulworks.caelus:caelus-neoforge:${caelus_version}:api" compileOnly "mezz.jei:jei-1.21-neoforge-api:${jei_version}" @@ -116,6 +116,10 @@ dependencies { implementation "curse.maven:jade-324717:5444008" implementation "top.theillusivec4.curios:curios-neoforge:${curios_version}+1.21" + // use localRuntime for adding mods to env that won't be listed as dependencies in the manifest + + // localRuntime "com.alexthw.ars_elemental:ars_elemental-${minecraft_version}:0.7.0.8.9" + // localRuntime "curse.maven:ars-additions-974408:5852361" } jar { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ImbuementRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ImbuementRenderer.java index 5fa4a68791..c39a1a3f5e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ImbuementRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/ImbuementRenderer.java @@ -1,14 +1,15 @@ package com.hollingsworth.arsnouveau.client.renderer.tile; +import com.hollingsworth.arsnouveau.client.ClientInfo; import com.hollingsworth.arsnouveau.common.block.tile.ImbuementTile; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ItemDisplayContext; import software.bernie.geckolib.cache.object.BakedGeoModel; public class ImbuementRenderer extends ArsGeoBlockRenderer { @@ -20,25 +21,22 @@ public ImbuementRenderer(BlockEntityRendererProvider.Context p_i226006_1_) { @Override public void actuallyRender(PoseStack matrixStack, ImbuementTile tileEntityIn, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { super.actuallyRender(matrixStack, tileEntityIn, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); - double x = tileEntityIn.getBlockPos().getX(); - double y = tileEntityIn.getBlockPos().getY(); - double z = tileEntityIn.getBlockPos().getZ(); - if (tileEntityIn.entity == null || !ItemStack.matches(tileEntityIn.entity.getItem(), tileEntityIn.stack)) { - tileEntityIn.entity = new ItemEntity(tileEntityIn.getLevel(), x, y, z, tileEntityIn.stack); + if (tileEntityIn.getStack() == null || tileEntityIn.getStack().isEmpty()) return; + + matrixStack.pushPose(); + matrixStack.translate(0.f, 0.5f, 0.f); + matrixStack.scale(0.5f, 0.5f, 0.5f); + matrixStack.mulPose(Axis.YP.rotationDegrees((partialTick + (float) ClientInfo.ticksInGame) * 3f)); + Minecraft.getInstance().getItemRenderer().renderStatic(tileEntityIn.getStack(), + ItemDisplayContext.FIXED, + packedLight, + packedOverlay, + matrixStack, + bufferSource, + tileEntityIn.getLevel(), + (int) tileEntityIn.getBlockPos().asLong()); + matrixStack.popPose(); - } - if (tileEntityIn.entity != null) { - ItemEntity entityItem = tileEntityIn.entity; - tileEntityIn.frames += 1.5f * partialTick; - entityItem.setYHeadRot(tileEntityIn.frames); - entityItem.age = (int) tileEntityIn.frames; - matrixStack.pushPose(); - matrixStack.translate(-0.5, 0, -0.5); - matrixStack.scale(0.75f, 0.75f, 0.75f); - float offset = 0.5f * 0.75f + 0.31f; - Minecraft.getInstance().getEntityRenderDispatcher().render(entityItem, offset, 0.3, offset, entityItem.yRot, partialTick, matrixStack, bufferSource, packedLight); - matrixStack.popPose(); - } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java index b948ec1128..b16a3600bc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java @@ -323,4 +323,8 @@ public void getTooltip(List tooltip) { } } } + + public ItemStack getStack() { + return stack; + } } From 303ae18dd31b168799d461d58f17cdcd85ed3983 Mon Sep 17 00:00:00 2001 From: Jarva <4622609+Jarva@users.noreply.github.com> Date: Tue, 29 Oct 2024 00:07:25 +0000 Subject: [PATCH 235/363] fix: memory leaks from ATM10 (#1471) --- .../arsnouveau/api/registry/CasterTomeRegistry.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java index 6116b0ceed..5360b8395e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/registry/CasterTomeRegistry.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.api.loot.DungeonLootTables; import com.hollingsworth.arsnouveau.common.crafting.recipes.CasterTomeData; import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; +import net.minecraft.core.RegistryAccess; import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.level.Level; @@ -24,7 +25,8 @@ public static List> reloadTomeData(RecipeManager re DungeonLootTables.CASTER_TOMES = new ArrayList<>(); TOME_DATA = new ArrayList<>(); TOME_DATA.addAll(recipes); - recipes.forEach(tome -> DungeonLootTables.CASTER_TOMES.add(() -> tome.value().getResultItem(level.registryAccess()))); + RegistryAccess access = level.registryAccess(); + recipes.forEach(tome -> DungeonLootTables.CASTER_TOMES.add(() -> tome.value().getResultItem(access))); return TOME_DATA; } From 928f4838d463ee902f290772abe844f240ad5483 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Fri, 1 Nov 2024 18:30:13 -0500 Subject: [PATCH 236/363] Make breeze orbit the spell back at the caster (#1474) --- .../hollingsworth/arsnouveau/ArsNouveau.java | 2 + .../api/spell/EntitySpellResolver.java | 1 - .../arsnouveau/common/event/BreezeEvent.java | 66 +++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/event/BreezeEvent.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java index 1c39979797..cd2ee1ef17 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java +++ b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java @@ -8,6 +8,7 @@ import com.hollingsworth.arsnouveau.common.entity.BubbleEntity; import com.hollingsworth.arsnouveau.common.entity.pathfinding.ClientEventHandler; import com.hollingsworth.arsnouveau.common.entity.pathfinding.FMLEventHandler; +import com.hollingsworth.arsnouveau.common.event.BreezeEvent; import com.hollingsworth.arsnouveau.common.items.RitualTablet; import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.world.Terrablender; @@ -88,6 +89,7 @@ public ArsNouveau(IEventBus modEventBus, ModContainer modContainer){ }); NeoForge.EVENT_BUS.addListener(BubbleEntity::onAttacked); NeoForge.EVENT_BUS.addListener(BubbleEntity::entityHurt); + NeoForge.EVENT_BUS.addListener(BreezeEvent::onSpellResolve); ANCriteriaTriggers.init(); try { Thread thread = new Thread(Rewards::init); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/EntitySpellResolver.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/EntitySpellResolver.java index 7efb24e6b2..ebf4f85f14 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/EntitySpellResolver.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/EntitySpellResolver.java @@ -13,7 +13,6 @@ public EntitySpellResolver(SpellContext context) { super(context); } - public void onCastOnEntity(LivingEntity target) { super.onCastOnEntity(ItemStack.EMPTY, target, InteractionHand.MAIN_HAND); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/BreezeEvent.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/BreezeEvent.java new file mode 100644 index 0000000000..5a9de896e4 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/BreezeEvent.java @@ -0,0 +1,66 @@ +package com.hollingsworth.arsnouveau.common.event; + +import com.hollingsworth.arsnouveau.api.event.EventQueue; +import com.hollingsworth.arsnouveau.api.event.ITimedEvent; +import com.hollingsworth.arsnouveau.api.event.SpellResolveEvent; +import com.hollingsworth.arsnouveau.api.spell.SpellContext; +import com.hollingsworth.arsnouveau.api.spell.SpellResolver; +import com.hollingsworth.arsnouveau.common.entity.EntityOrbitProjectile; +import com.hollingsworth.arsnouveau.common.entity.EntityProjectileSpell; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.monster.breeze.Breeze; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.neoforged.neoforge.common.util.FakePlayer; + +public class BreezeEvent implements ITimedEvent { + + public Breeze breeze; + int age; + EntityOrbitProjectile orbitProjectile; + Entity target; + + public BreezeEvent(Breeze breeze, EntityOrbitProjectile orbitProjectile, Entity target) { + this.breeze = breeze; + this.orbitProjectile = orbitProjectile; + this.target = target; + } + + + @Override + public void tick(boolean serverSide) { + age++; + if(age % 8 == 0) { + this.orbitProjectile.setAccelerates(this.orbitProjectile.getAccelerates() + 1); + } + + if(age == 45){ + this.orbitProjectile.remove(Entity.RemovalReason.DISCARDED); + EntityProjectileSpell projectileSpell = new EntityProjectileSpell(breeze.level, new SpellResolver(SpellContext.fromEntity(orbitProjectile.spellResolver.spell, breeze, ItemStack.EMPTY))); + // Aim the projectile at the player + projectileSpell.shoot(target.getX() - breeze.getX(), target.getY() - breeze.getY(), target.getZ() - breeze.getZ(), 1.0F, 0.0F); + breeze.level.addFreshEntity(projectileSpell); + } + } + + @Override + public boolean isExpired() { + return age > 45 || breeze.isRemoved() || breeze.isDeadOrDying() || this.orbitProjectile.isRemoved() || target.isRemoved(); + } + + public static void onSpellResolve(SpellResolveEvent.Pre pre){ + HitResult hitResult = pre.rayTraceResult; + if(pre.context.getUnwrappedCaster() instanceof Breeze){ + return; + } + if(hitResult instanceof EntityHitResult entityHitResult + && !(pre.shooter instanceof FakePlayer fakePlayer) + && entityHitResult.getEntity() instanceof Breeze breeze){ + pre.setCanceled(true); + EntityOrbitProjectile orbitProjectile = new EntityOrbitProjectile(breeze.level, new SpellResolver(SpellContext.fromEntity(pre.spell, breeze, ItemStack.EMPTY)), entityHitResult.getEntity()); + breeze.level.addFreshEntity(orbitProjectile); + EventQueue.getServerInstance().addEvent(new BreezeEvent(breeze, orbitProjectile, pre.shooter)); + } + } +} From a88d56160ef924756b6aab9982b789f6cc2efa46 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 2 Nov 2024 13:02:26 -0500 Subject: [PATCH 237/363] Update supporters.json --- supporters.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/supporters.json b/supporters.json index 9d6c44315a..b8b040b5a3 100644 --- a/supporters.json +++ b/supporters.json @@ -493,6 +493,16 @@ "color": "red", "adopter": "Tevaino", "bio": "The mage's favorite little creature." + },{ + "name": "Jaime", + "color": "purple", + "adopter": "Frantastic", + "bio": "His staggering, wobbly gait does nothing to dampen his infectiously rambunctious and carefree spirit. Smells strongly of grapes." + },{ + "name": "Eru", + "color": "gray", + "adopter": "ImPaw", + "bio": "Not to be left unsupervised." } ] } From 6811a0db4888fc12c0af501901da3bab1276866a Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 2 Nov 2024 13:31:09 -0500 Subject: [PATCH 238/363] jarvabuncle --- .../arsnouveau/common/entity/Starbuncle.java | 2 + .../ars_nouveau/geo/starbuncle_jarva.geo.json | 404 ++++++++++++++++++ .../textures/entity/starbuncle_jarva.png | Bin 0 -> 1495 bytes 3 files changed, 406 insertions(+) create mode 100644 src/main/resources/assets/ars_nouveau/geo/starbuncle_jarva.geo.json create mode 100644 src/main/resources/assets/ars_nouveau/textures/entity/starbuncle_jarva.png diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 7de4afc35a..c83eb13b32 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -687,6 +687,7 @@ public String getColor() { put("Sir Squirrely", ArsNouveau.prefix("textures/entity/sir_squirrely.png")); put("Zieg", ArsNouveau.prefix("textures/entity/zieg.png")); put("Xacris", ArsNouveau.prefix("textures/entity/xacris.png")); + put("Xollus", ArsNouveau.prefix("textures/entity/starbuncle_jarva.png")); for(DyeColor color : DyeColor.values()) { put(color.getName(), ArsNouveau.prefix("textures/entity/starbuncle_" + color.getName().toLowerCase() + ".png")); } @@ -700,6 +701,7 @@ public String getColor() { put("Zieg", ArsNouveau.prefix("geo/zieg.geo.json")); put("Xacris", ArsNouveau.prefix("geo/xacris.geo.json")); put("starbuncle", ArsNouveau.prefix("geo/starbuncle.geo.json")); + put("Xollus", ArsNouveau.prefix("geo/starbuncle_jarva.geo.json")); } }; diff --git a/src/main/resources/assets/ars_nouveau/geo/starbuncle_jarva.geo.json b/src/main/resources/assets/ars_nouveau/geo/starbuncle_jarva.geo.json new file mode 100644 index 0000000000..891fe3c903 --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/geo/starbuncle_jarva.geo.json @@ -0,0 +1,404 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 32, + "texture_height": 32, + "visible_bounds_width": 2, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "starbuncle", + "pivot": [0, 0, -0.5] + }, + { + "name": "body", + "parent": "starbuncle", + "pivot": [0, 2.5, -0.5], + "cubes": [ + { + "origin": [-2, 1, -2.5], + "size": [4, 3, 4], + "uv": { + "north": {"uv": [21, 12], "uv_size": [4, 3]}, + "east": {"uv": [15, 24], "uv_size": [4, 3]}, + "south": {"uv": [24, 23], "uv_size": [4, 3]}, + "west": {"uv": [4, 25], "uv_size": [4, 3]}, + "up": {"uv": [21, 4], "uv_size": [4, 4]}, + "down": {"uv": [21, 12], "uv_size": [4, -4]} + } + } + ] + }, + { + "name": "wing_right", + "parent": "body", + "pivot": [-1.5, 4, -1], + "rotation": [0, 0, 60], + "cubes": [ + { + "origin": [-6.5, 4, -3], + "size": [5, 1, 5], + "uv": { + "north": {"uv": [25, 21], "uv_size": [5, 1]}, + "east": {"uv": [25, 22], "uv_size": [5, 1]}, + "south": {"uv": [26, 0], "uv_size": [5, 1]}, + "west": {"uv": [26, 1], "uv_size": [5, 1]}, + "up": {"uv": [16, 10], "uv_size": [5, 5]}, + "down": {"uv": [0, 22], "uv_size": [5, -5]} + } + }, + { + "origin": [-5.5, 3, -2], + "size": [4, 1, 3], + "uv": { + "north": {"uv": [20, 28], "uv_size": [4, 1]}, + "east": {"uv": [29, 4], "uv_size": [3, 1]}, + "south": {"uv": [28, 23], "uv_size": [4, 1]}, + "west": {"uv": [29, 5], "uv_size": [3, 1]}, + "up": {"uv": [25, 4], "uv_size": [4, 3]}, + "down": {"uv": [25, 10], "uv_size": [4, -3]} + } + } + ] + }, + { + "name": "wing_left", + "parent": "body", + "pivot": [1.5, 4, -1], + "rotation": [0, 0, -60], + "cubes": [ + { + "origin": [1.5, 4, -3], + "size": [5, 1, 5], + "uv": { + "north": {"uv": [26, 2], "uv_size": [5, 1]}, + "east": {"uv": [26, 3], "uv_size": [5, 1]}, + "south": {"uv": [24, 26], "uv_size": [5, 1]}, + "west": {"uv": [20, 27], "uv_size": [5, 1]}, + "up": {"uv": [5, 20], "uv_size": [5, 5]}, + "down": {"uv": [10, 25], "uv_size": [5, -5]} + } + }, + { + "origin": [1.5, 3, -2], + "size": [4, 1, 3], + "uv": { + "north": {"uv": [0, 29], "uv_size": [4, 1]}, + "east": {"uv": [29, 12], "uv_size": [3, 1]}, + "south": {"uv": [4, 29], "uv_size": [4, 1]}, + "west": {"uv": [15, 29], "uv_size": [3, 1]}, + "up": {"uv": [8, 25], "uv_size": [4, 3]}, + "down": {"uv": [25, 13], "uv_size": [4, -3]} + } + } + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 4, -2.5], + "cubes": [ + { + "origin": [-2.5, 2, -6.5], + "size": [5, 4, 4], + "uv": { + "north": {"uv": [15, 20], "uv_size": [5, 4]}, + "east": {"uv": [0, 22], "uv_size": [4, 4]}, + "south": {"uv": [20, 15], "uv_size": [5, 4]}, + "west": {"uv": [20, 23], "uv_size": [4, 4]}, + "up": {"uv": [20, 19], "uv_size": [5, 4]}, + "down": {"uv": [21, 4], "uv_size": [5, -4]} + } + }, + { + "origin": [-0.5, 6, -5.5], + "size": [1, 1, 3], + "uv": { + "north": {"uv": [21, 31], "uv_size": [1, 1]}, + "east": {"uv": [20, 29], "uv_size": [3, 1]}, + "south": {"uv": [22, 31], "uv_size": [1, 1]}, + "west": {"uv": [29, 26], "uv_size": [3, 1]}, + "up": {"uv": [18, 29], "uv_size": [1, 3]}, + "down": {"uv": [23, 32], "uv_size": [1, -3]} + } + }, + { + "origin": [-0.5, 3, -7], + "size": [1, 1, 1], + "uv": { + "north": {"uv": [22, 30], "uv_size": [1, 1]}, + "east": {"uv": [26, 30], "uv_size": [1, 1]}, + "south": {"uv": [27, 30], "uv_size": [1, 1]}, + "west": {"uv": [28, 30], "uv_size": [1, 1]}, + "up": {"uv": [30, 28], "uv_size": [1, 1]}, + "down": {"uv": [29, 31], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "horns", + "parent": "head", + "pivot": [0, -4, -3] + }, + { + "name": "horn_right", + "parent": "horns", + "pivot": [0, -4, -3], + "cubes": [ + { + "origin": [-4.5, 5, -5.5], + "size": [2, 1, 2], + "uv": { + "north": {"uv": [29, 27], "uv_size": [2, 1]}, + "east": {"uv": [30, 11], "uv_size": [2, 1]}, + "south": {"uv": [20, 30], "uv_size": [2, 1]}, + "west": {"uv": [30, 21], "uv_size": [2, 1]}, + "up": {"uv": [24, 28], "uv_size": [2, 2]}, + "down": {"uv": [28, 26], "uv_size": [2, -2]} + } + }, + { + "origin": [-4.5, 6, -5.5], + "size": [1, 1, 3], + "uv": { + "north": {"uv": [31, 18], "uv_size": [1, 1]}, + "east": {"uv": [29, 6], "uv_size": [3, 1]}, + "south": {"uv": [31, 19], "uv_size": [1, 1]}, + "west": {"uv": [29, 7], "uv_size": [3, 1]}, + "up": {"uv": [5, 12], "uv_size": [1, 3]}, + "down": {"uv": [4, 25], "uv_size": [1, -3]} + } + } + ] + }, + { + "name": "horn_left", + "parent": "horns", + "pivot": [0, -4, -3], + "cubes": [ + { + "origin": [2.5, 5, -5.5], + "size": [2, 1, 2], + "uv": { + "north": {"uv": [30, 22], "uv_size": [2, 1]}, + "east": {"uv": [24, 30], "uv_size": [2, 1]}, + "south": {"uv": [30, 24], "uv_size": [2, 1]}, + "west": {"uv": [30, 25], "uv_size": [2, 1]}, + "up": {"uv": [26, 28], "uv_size": [2, 2]}, + "down": {"uv": [28, 30], "uv_size": [2, -2]} + } + }, + { + "origin": [3.5, 6, -5.5], + "size": [1, 1, 3], + "uv": { + "north": {"uv": [20, 31], "uv_size": [1, 1]}, + "east": {"uv": [8, 29], "uv_size": [3, 1]}, + "south": {"uv": [31, 20], "uv_size": [1, 1]}, + "west": {"uv": [29, 8], "uv_size": [3, 1]}, + "up": {"uv": [29, 9], "uv_size": [1, 3]}, + "down": {"uv": [11, 32], "uv_size": [1, -3]} + } + } + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 3.5, 1.5], + "cubes": [ + { + "origin": [-2.5, 3, 1.5], + "size": [5, 5, 5], + "uv": { + "north": {"uv": [6, 0], "uv_size": [5, 5]}, + "east": {"uv": [6, 5], "uv_size": [5, 5]}, + "south": {"uv": [6, 10], "uv_size": [5, 5]}, + "west": {"uv": [11, 0], "uv_size": [5, 5]}, + "up": {"uv": [11, 5], "uv_size": [5, 5]}, + "down": {"uv": [11, 15], "uv_size": [5, -5]} + } + } + ] + }, + { + "name": "item", + "parent": "tail", + "pivot": [0, 9.5, 4] + }, + { + "name": "basket", + "parent": "tail", + "pivot": [0, 8, 4], + "cubes": [ + { + "origin": [-3, 8, 1], + "size": [6, 1, 6], + "uv": { + "north": {"uv": [25, 13], "uv_size": [6, 1]}, + "east": {"uv": [25, 14], "uv_size": [6, 1]}, + "south": {"uv": [25, 15], "uv_size": [6, 1]}, + "west": {"uv": [25, 16], "uv_size": [6, 1]}, + "up": {"uv": [0, 0], "uv_size": [6, 6]}, + "down": {"uv": [0, 12], "uv_size": [6, -6]} + } + }, + { + "origin": [2, 9, 1], + "size": [1, 1, 6], + "uv": { + "north": {"uv": [30, 29], "uv_size": [1, 1]}, + "east": {"uv": [25, 17], "uv_size": [6, 1]}, + "south": {"uv": [30, 30], "uv_size": [1, 1]}, + "west": {"uv": [25, 18], "uv_size": [6, 1]}, + "up": {"uv": [19, 24], "uv_size": [1, 6]}, + "down": {"uv": [12, 31], "uv_size": [1, -6]} + } + }, + { + "origin": [-3, 9, 1], + "size": [1, 1, 6], + "uv": { + "north": {"uv": [31, 0], "uv_size": [1, 1]}, + "east": {"uv": [25, 19], "uv_size": [6, 1]}, + "south": {"uv": [31, 1], "uv_size": [1, 1]}, + "west": {"uv": [25, 20], "uv_size": [6, 1]}, + "up": {"uv": [13, 25], "uv_size": [1, 6]}, + "down": {"uv": [14, 31], "uv_size": [1, -6]} + } + }, + { + "origin": [-2, 9, 6], + "size": [4, 1, 1], + "uv": { + "north": {"uv": [0, 26], "uv_size": [4, 1]}, + "east": {"uv": [31, 2], "uv_size": [1, 1]}, + "south": {"uv": [0, 27], "uv_size": [4, 1]}, + "west": {"uv": [31, 3], "uv_size": [1, 1]}, + "up": {"uv": [15, 27], "uv_size": [4, 1]}, + "down": {"uv": [25, 28], "uv_size": [4, -1]} + } + }, + { + "origin": [-2, 9, 1], + "size": [4, 1, 1], + "uv": { + "north": {"uv": [0, 28], "uv_size": [4, 1]}, + "east": {"uv": [31, 9], "uv_size": [1, 1]}, + "south": {"uv": [4, 28], "uv_size": [4, 1]}, + "west": {"uv": [31, 10], "uv_size": [1, 1]}, + "up": {"uv": [8, 28], "uv_size": [4, 1]}, + "down": {"uv": [15, 29], "uv_size": [4, -1]} + } + }, + { + "origin": [-2.5, 3, 1.5], + "size": [5, 5, 5], + "inflate": 0.1, + "uv": { + "north": {"uv": [0, 12], "uv_size": [5, 5]}, + "east": {"uv": [5, 15], "uv_size": [5, 5]}, + "south": {"uv": [10, 15], "uv_size": [5, 5]}, + "west": {"uv": [15, 15], "uv_size": [5, 5]}, + "up": {"uv": [16, 0], "uv_size": [5, 5]}, + "down": {"uv": [16, 10], "uv_size": [5, -5]} + } + } + ] + }, + { + "name": "legs_front", + "parent": "body", + "pivot": [0, 1.5, -1.5] + }, + { + "name": "leg_front_left", + "parent": "legs_front", + "pivot": [1, 1.5, -1.5], + "cubes": [ + { + "origin": [0.5, 0, -2], + "size": [1, 2, 1], + "uv": { + "north": {"uv": [0, 30], "uv_size": [1, 2]}, + "east": {"uv": [1, 30], "uv_size": [1, 2]}, + "south": {"uv": [2, 30], "uv_size": [1, 2]}, + "west": {"uv": [3, 30], "uv_size": [1, 2]}, + "up": {"uv": [12, 31], "uv_size": [1, 1]}, + "down": {"uv": [13, 32], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "leg_front_right", + "parent": "legs_front", + "pivot": [-1, 1.5, -1.5], + "cubes": [ + { + "origin": [-1.5, 0, -2], + "size": [1, 2, 1], + "uv": { + "north": {"uv": [8, 30], "uv_size": [1, 2]}, + "east": {"uv": [9, 30], "uv_size": [1, 2]}, + "south": {"uv": [30, 9], "uv_size": [1, 2]}, + "west": {"uv": [10, 30], "uv_size": [1, 2]}, + "up": {"uv": [31, 14], "uv_size": [1, 1]}, + "down": {"uv": [31, 16], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "legs_back", + "parent": "body", + "pivot": [0, 1.5, 0.5] + }, + { + "name": "leg_back_left", + "parent": "legs_back", + "pivot": [1, 1.5, 0.5], + "cubes": [ + { + "origin": [0.5, 0, 0], + "size": [1, 2, 1], + "uv": { + "north": {"uv": [4, 30], "uv_size": [1, 2]}, + "east": {"uv": [5, 30], "uv_size": [1, 2]}, + "south": {"uv": [6, 30], "uv_size": [1, 2]}, + "west": {"uv": [7, 30], "uv_size": [1, 2]}, + "up": {"uv": [31, 13], "uv_size": [1, 1]}, + "down": {"uv": [14, 32], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "leg_back_right", + "parent": "legs_back", + "pivot": [-1, 1.5, 0.5], + "cubes": [ + { + "origin": [-1.5, 0, 0], + "size": [1, 2, 1], + "uv": { + "north": {"uv": [15, 30], "uv_size": [1, 2]}, + "east": {"uv": [16, 30], "uv_size": [1, 2]}, + "south": {"uv": [17, 30], "uv_size": [1, 2]}, + "west": {"uv": [19, 30], "uv_size": [1, 2]}, + "up": {"uv": [31, 16], "uv_size": [1, 1]}, + "down": {"uv": [31, 18], "uv_size": [1, -1]} + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/textures/entity/starbuncle_jarva.png b/src/main/resources/assets/ars_nouveau/textures/entity/starbuncle_jarva.png new file mode 100644 index 0000000000000000000000000000000000000000..da8faa8701d122966696def7033c8d895064e200 GIT binary patch literal 1495 zcmV;|1t|K7P)Px)kx4{BR9J=J((Ay_CzO zGjgnW6uf>Pv#}X!ni@$&q6F$fJo@zx4l!wBHA~pNPAcmJAW#<~5s6AAfw~Y&b4j*t zdlrDDxg@aJsbVr4n*m_z{zJpvVKzRonx(;IXK5};pe`g82;*X5MX<7{u{?4MhOyU= z1p2ioWz#OiJH?}vL_nZqMc&9{e8T||bAiC zP7iG{5}FY(%h}!`R8>XOv<(sh(s+Yw0|^nUnx;ko>5!1{-aVVr*o=VN>mxE5r||SSCXIMCrh(rw`&^x0SJy$a63>SObIrZ^X09-B?0Gg)J*^- zW^Cl!w{jw{r|v(bB3Nn262+qsnT)f#x=MFP8+El+biV%$nx^GLaIPzq6T2Q=DU*cU zrB)lVK(EleQxO`0jy{7j=?p{Tm2`KsQC;cb^rzR*68S7pRh3Qgqd=^WPF6`KQ(&`x zEX2wIvt0hsC7&;RaLky7Rtr>BH87b1o6WheN28Q92FCLnbFcH&*W(i9Tfc9&c0kiK zGHHh)&x?gXU)u!-&=sI!sFXxtbnLF}_!t~MbTIeBwPDLJZOBM|UUxnne;PQP(}&9I zFTL7c?8CrtU#{zXJL3~KEc*o^;}bV>UFX{w81BoVBcQmfc%v7`l?$)rQn48RV35S4 z$M^!wJ4j1*wHuzWi{A@QG&m&U{AbQ@z1u$8TSw!R6!@U{A$j zc}1}p&MgjB=9lEc@QG$(@h2r6h{c~6jGKum#^R*)+t<(+KT8e(yw~1q3-8^N8y&k_ zk^^ra>^98v`h8^5dJgzloG!lJ(g8uFJi|RX(T>)6eb?1_AH~gRK4i6nFVnC=?#OAyEf}Lh)_i(E$MV9UUN07sBiJF?Ii; zyu5xN_4`}d{ah{neQmhP11LM2x%f-|RJB)?XQ{2;N>zE5`p`B8ucu2PZYko(rjY+N zO^x!>HzbKj6vd;+BVAQh9J8?*S!VOlJ^0Ut6Okx42aiw@tmNk45ov5`E-Cv$frvnL z%l0;Q)K>BNxn}BWtBRA*9B(TQ=nXBW7Fe8~qJDp?tcX@^UC*T75b=#dlFkg%f6E znqU8dmE{GdXY$!}ws&aLJb+UN931Z%u{nILr||*Rl^&W4KMaw{IL)4mh}Q x{i$KBm(}?MZ}k6V``-=}6TJia=YKm({sG(FH!|j5&zJxJ002ovPDHLkV1l#e-o*d_ literal 0 HcmV?d00001 From 3a1f9182fad5a073b1de3fb665fa91acefb7065b Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 2 Nov 2024 13:36:39 -0500 Subject: [PATCH 239/363] Reduce number of rendered faces on portal #1466 --- .../client/renderer/tile/PortalTileRenderer.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PortalTileRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PortalTileRenderer.java index 24e77fb629..bd4e2b5f8b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PortalTileRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PortalTileRenderer.java @@ -56,13 +56,16 @@ private void renderCube(PortalTile tileEntityIn, float p_228883_2_, float p_2288 } private void renderFace(PortalTile tileEntityIn, Matrix4f matrix, VertexConsumer iBuilder, float p_228884_4_, float p_228884_5_, float p_228884_6_, float p_228884_7_, float p_228884_8_, float p_228884_9_, float p_228884_10_, float p_228884_11_, float p_228884_12_, float p_228884_13_, float p_228884_14_, Direction direction) { - if (!tileEntityIn.isHorizontal && (direction == Direction.EAST || direction == Direction.WEST || direction == Direction.SOUTH || direction == Direction.NORTH)) { + var beAxis = tileEntityIn.getBlockState().getValue(PortalBlock.AXIS); + var directionAxis = direction.getAxis(); + // what have I done... + if (!tileEntityIn.isHorizontal && (beAxis == Direction.Axis.X && directionAxis == Direction.Axis.Z) || (beAxis == Direction.Axis.Z && directionAxis == Direction.Axis.X)) { iBuilder.addVertex(matrix, p_228884_4_, p_228884_6_, p_228884_8_).setColor(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F); iBuilder.addVertex(matrix, p_228884_5_, p_228884_6_, p_228884_9_).setColor(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F); iBuilder.addVertex(matrix, p_228884_5_, p_228884_7_, p_228884_10_).setColor(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F); iBuilder.addVertex(matrix, p_228884_4_, p_228884_7_, p_228884_11_).setColor(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F); - } else if (tileEntityIn.isHorizontal && (direction == Direction.UP || direction == Direction.DOWN)) { + } else if (tileEntityIn.isHorizontal && direction.getAxis() == Direction.Axis.Y) { iBuilder.addVertex(matrix, p_228884_4_, p_228884_6_, p_228884_8_).setColor(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F); iBuilder.addVertex(matrix, p_228884_5_, p_228884_6_, p_228884_9_).setColor(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F); iBuilder.addVertex(matrix, p_228884_5_, p_228884_7_, p_228884_10_).setColor(p_228884_12_, p_228884_13_, p_228884_14_, 1.0F); From 41243a7201d1a136d89e2db69710a58e97c9403e Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 2 Nov 2024 17:31:49 -0500 Subject: [PATCH 240/363] rename namespace, include original license (#1481) --- license.txt | 4 +- .../api/event/FadeLightTimedEvent.java | 8 +-- .../common/light/LambDynamicLight.java | 6 +- .../arsnouveau/common/light/LightManager.java | 6 +- .../common/mixin/light/ClientMixin.java | 2 +- .../mixin/light/EntityRendererMixin.java | 2 +- .../mixin/light/LevelRendererMixin.java | 2 +- .../common/mixin/light/LightEntityMixin.java | 65 +++++++++---------- .../light/lamb_dynamic_lights_license.txt | 19 ++++++ 9 files changed, 67 insertions(+), 47 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/lamb_dynamic_lights_license.txt diff --git a/license.txt b/license.txt index 153d416dc8..53b9a2c120 100644 --- a/license.txt +++ b/license.txt @@ -162,4 +162,6 @@ General Public License ever published by the Free Software Foundation. whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the -Library. \ No newline at end of file +Library. + +Work related to LambDynamicLights was licensed under the MIT License, included in the relevant packages. \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/FadeLightTimedEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/FadeLightTimedEvent.java index 0bfafd3adc..d8bab9a31e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/FadeLightTimedEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/FadeLightTimedEvent.java @@ -95,12 +95,12 @@ public void dynamicLightTick() { } @Override - public boolean shouldUpdateDynamicLight() { + public boolean ars_nouveau$shouldUpdateDynamicLight() { return LightManager.shouldUpdateDynamicLight(); } @Override - public boolean lambdynlights$updateDynamicLight(LevelRenderer renderer) { + public boolean ars_nouveau$updateDynamicLight(LevelRenderer renderer) { int luminance = this.getLuminance(); if (luminance != this.lambdynlights$lastLuminance) { @@ -135,7 +135,7 @@ public boolean shouldUpdateDynamicLight() { } } // Schedules the rebuild of removed chunks. - this.lambdynlights$scheduleTrackedChunksRebuild(renderer); + this.ars_nouveau$scheduleTrackedChunksRebuild(renderer); // Update tracked lit chunks. this.lambdynlights$trackedLitChunkPos = newPos; return true; @@ -144,7 +144,7 @@ public boolean shouldUpdateDynamicLight() { } @Override - public void lambdynlights$scheduleTrackedChunksRebuild(LevelRenderer renderer) { + public void ars_nouveau$scheduleTrackedChunksRebuild(LevelRenderer renderer) { if (Minecraft.getInstance().level == this.level) for (long pos : this.lambdynlights$trackedLitChunkPos) { LightManager.scheduleChunkRebuild(renderer, pos); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/light/LambDynamicLight.java b/src/main/java/com/hollingsworth/arsnouveau/common/light/LambDynamicLight.java index 48ba6758f6..375c76e8fa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/light/LambDynamicLight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/light/LambDynamicLight.java @@ -77,9 +77,9 @@ default void setDynamicLightEnabled(boolean enabled) { * * @return {@code true} if this dynamic light source should update, else {@code false} */ - boolean shouldUpdateDynamicLight(); + boolean ars_nouveau$shouldUpdateDynamicLight(); - boolean lambdynlights$updateDynamicLight(LevelRenderer renderer); + boolean ars_nouveau$updateDynamicLight(LevelRenderer renderer); - void lambdynlights$scheduleTrackedChunksRebuild(LevelRenderer renderer); + void ars_nouveau$scheduleTrackedChunksRebuild(LevelRenderer renderer); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java b/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java index 207d1bafc3..4bcef2ef3b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/light/LightManager.java @@ -189,7 +189,7 @@ public static void removeLightSource(LambDynamicLight lightSource) { if (it.equals(lightSource)) { sourceIterator.remove(); if (ArsNouveau.proxy.getMinecraft().level != null) - lightSource.lambdynlights$scheduleTrackedChunksRebuild(ArsNouveau.proxy.getMinecraft().levelRenderer); + lightSource.ars_nouveau$scheduleTrackedChunksRebuild(ArsNouveau.proxy.getMinecraft().levelRenderer); break; } } @@ -211,7 +211,7 @@ public static void clearLightSources() { if (ArsNouveau.proxy.getMinecraft().levelRenderer != null) { if (it.getLuminance() > 0) it.resetDynamicLight(); - it.lambdynlights$scheduleTrackedChunksRebuild(ArsNouveau.proxy.getMinecraft().levelRenderer); + it.ars_nouveau$scheduleTrackedChunksRebuild(ArsNouveau.proxy.getMinecraft().levelRenderer); } } LightManager.jarHoldingEntityList = new ArrayList<>(); @@ -259,7 +259,7 @@ public static void updateAll(LevelRenderer renderer) { lightSourcesLock.readLock().lock(); for (var lightSource : dynamicLightSources) { - if (lightSource.lambdynlights$updateDynamicLight(renderer)) { + if (lightSource.ars_nouveau$updateDynamicLight(renderer)) { lastUpdateCount++; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/ClientMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/ClientMixin.java index 521dee2b9d..a4659f5d51 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/ClientMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/ClientMixin.java @@ -11,7 +11,7 @@ @Mixin(Minecraft.class) public class ClientMixin { @Inject(method = "updateLevelInEngines", at = @At("HEAD")) - private void onSetWorld(ClientLevel world, CallbackInfo ci) { + private void ars_nouveau$onSetWorld(ClientLevel world, CallbackInfo ci) { LightManager.clearLightSources(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/EntityRendererMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/EntityRendererMixin.java index 80431e8567..995d84e140 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/EntityRendererMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/EntityRendererMixin.java @@ -14,7 +14,7 @@ public class EntityRendererMixin { @Inject(method = "getBlockLightLevel", at = @At("RETURN"), cancellable = true) - private void onGetBlockLight(T entity, BlockPos pos, CallbackInfoReturnable cir) { + private void ars_nouveau$onGetBlockLight(T entity, BlockPos pos, CallbackInfoReturnable cir) { if (!LightManager.shouldUpdateDynamicLight()) return; // Do not touch to the value. diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/LevelRendererMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/LevelRendererMixin.java index 183671f9c4..b90ad48c19 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/LevelRendererMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/LevelRendererMixin.java @@ -19,7 +19,7 @@ public abstract class LevelRendererMixin { at = @At("TAIL"), cancellable = true ) - private static void onGetLightmapCoordinates(BlockAndTintGetter world, BlockState state, BlockPos pos, CallbackInfoReturnable cir) { + private static void ars_nouveau$onGetLightmapCoordinates(BlockAndTintGetter world, BlockState state, BlockPos pos, CallbackInfoReturnable cir) { if (!LightManager.shouldUpdateDynamicLight()) return; // Do not touch to the value. if (!world.getBlockState(pos).isSolidRender(world, pos)) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/LightEntityMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/LightEntityMixin.java index b0ebbe6190..aa566f6c9f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/LightEntityMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/LightEntityMixin.java @@ -67,25 +67,24 @@ public abstract class LightEntityMixin implements LambDynamicLight { public abstract Vec3 position(); @Unique - protected int lambdynlights$luminance = 0; + protected int ars_nouveau$luminance = 0; @Unique - private int lambdynlights$lastLuminance = 0; - @Unique - private long lambdynlights$lastUpdate = 0; + private int ars_nouveau$lastLuminance = 0; + @Unique - private double lambdynlights$prevX; + private double ars_nouveau$prevX; @Unique - private double lambdynlights$prevY; + private double ars_nouveau$prevY; @Unique - private double lambdynlights$prevZ; + private double ars_nouveau$prevZ; @Unique - private LongOpenHashSet lambdynlights$trackedLitChunkPos = new LongOpenHashSet(); + private LongOpenHashSet ars_nouveau$trackedLitChunkPos = new LongOpenHashSet(); @Inject(method = "tick", at = @At("TAIL")) public void onTick(CallbackInfo ci) { // We do not want to update the entity on the server. if (level.isClientSide && !LightManager.shouldUpdateDynamicLight()) { - lambdynlights$luminance = 0; + ars_nouveau$luminance = 0; } if (this.level.isClientSide() && LightManager.shouldUpdateDynamicLight()) { if (this.isRemoved()) { @@ -108,8 +107,8 @@ public void onRemove(CallbackInfo ci) { public void removed(CallbackInfo ci) { if (this.level.isClientSide()) { this.setDynamicLightEnabled(false); - if (lambdynlights$luminance > 0) - EventQueue.getClientQueue().addEvent(new FadeLightTimedEvent(this.level(), this.position(), 8, lambdynlights$luminance)); + if (ars_nouveau$luminance > 0) + EventQueue.getClientQueue().addEvent(new FadeLightTimedEvent(this.level(), this.position(), 8, ars_nouveau$luminance)); } } @@ -135,42 +134,42 @@ public Level getDynamicLightWorld() { @Override public void resetDynamicLight() { - this.lambdynlights$lastLuminance = 0; + this.ars_nouveau$lastLuminance = 0; } @Override - public boolean shouldUpdateDynamicLight() { + public boolean ars_nouveau$shouldUpdateDynamicLight() { return LightManager.shouldUpdateDynamicLight() && DynamLightUtil.couldGiveLight((Entity) (Object) this); } @Override public void dynamicLightTick() { - lambdynlights$luminance = 0; + ars_nouveau$luminance = 0; int luminance = DynamLightUtil.lightForEntity((Entity) (Object) this); - if (luminance > this.lambdynlights$luminance) - this.lambdynlights$luminance = luminance; + if (luminance > this.ars_nouveau$luminance) + this.ars_nouveau$luminance = luminance; } @Override public int getLuminance() { - return this.lambdynlights$luminance; + return this.ars_nouveau$luminance; } @Override - public boolean lambdynlights$updateDynamicLight(LevelRenderer renderer) { - if (!this.shouldUpdateDynamicLight()) + public boolean ars_nouveau$updateDynamicLight(LevelRenderer renderer) { + if (!this.ars_nouveau$shouldUpdateDynamicLight()) return false; - double deltaX = this.getX() - this.lambdynlights$prevX; - double deltaY = this.getY() - this.lambdynlights$prevY; - double deltaZ = this.getZ() - this.lambdynlights$prevZ; + double deltaX = this.getX() - this.ars_nouveau$prevX; + double deltaY = this.getY() - this.ars_nouveau$prevY; + double deltaZ = this.getZ() - this.ars_nouveau$prevZ; int luminance = this.getLuminance(); - if (Math.abs(deltaX) > 0.1D || Math.abs(deltaY) > 0.1D || Math.abs(deltaZ) > 0.1D || luminance != this.lambdynlights$lastLuminance) { - this.lambdynlights$prevX = this.getX(); - this.lambdynlights$prevY = this.getY(); - this.lambdynlights$prevZ = this.getZ(); - this.lambdynlights$lastLuminance = luminance; + if (Math.abs(deltaX) > 0.1D || Math.abs(deltaY) > 0.1D || Math.abs(deltaZ) > 0.1D || luminance != this.ars_nouveau$lastLuminance) { + this.ars_nouveau$prevX = this.getX(); + this.ars_nouveau$prevY = this.getY(); + this.ars_nouveau$prevZ = this.getZ(); + this.ars_nouveau$lastLuminance = luminance; var newPos = new LongOpenHashSet(); @@ -179,7 +178,7 @@ public int getLuminance() { var chunkPos = new BlockPos.MutableBlockPos(entityChunkPos.x, DynamLightUtil.getSectionCoord(this.getEyeY()), entityChunkPos.z); LightManager.scheduleChunkRebuild(renderer, chunkPos); - LightManager.updateTrackedChunks(chunkPos, this.lambdynlights$trackedLitChunkPos, newPos); + LightManager.updateTrackedChunks(chunkPos, this.ars_nouveau$trackedLitChunkPos, newPos); var directionX = (this.blockPosition().getX() & 15) >= 8 ? Direction.EAST : Direction.WEST; var directionY = (Mth.floor(this.getEyeY()) & 15) >= 8 ? Direction.UP : Direction.DOWN; @@ -197,22 +196,22 @@ public int getLuminance() { chunkPos.move(directionY); // Y } LightManager.scheduleChunkRebuild(renderer, chunkPos); - LightManager.updateTrackedChunks(chunkPos, this.lambdynlights$trackedLitChunkPos, newPos); + LightManager.updateTrackedChunks(chunkPos, this.ars_nouveau$trackedLitChunkPos, newPos); } } // Schedules the rebuild of removed chunks. - this.lambdynlights$scheduleTrackedChunksRebuild(renderer); + this.ars_nouveau$scheduleTrackedChunksRebuild(renderer); // Update tracked lit chunks. - this.lambdynlights$trackedLitChunkPos = newPos; + this.ars_nouveau$trackedLitChunkPos = newPos; return true; } return false; } @Override - public void lambdynlights$scheduleTrackedChunksRebuild(LevelRenderer renderer) { + public void ars_nouveau$scheduleTrackedChunksRebuild(LevelRenderer renderer) { if (Minecraft.getInstance().level == this.level) - for (long pos : this.lambdynlights$trackedLitChunkPos) { + for (long pos : this.ars_nouveau$trackedLitChunkPos) { LightManager.scheduleChunkRebuild(renderer, pos); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/lamb_dynamic_lights_license.txt b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/lamb_dynamic_lights_license.txt new file mode 100644 index 0000000000..529cb9726e --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/light/lamb_dynamic_lights_license.txt @@ -0,0 +1,19 @@ +https://github.com/LambdAurora/LambDynamicLights + +MIT License +Copyright © 2020 LambdAurora +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file From 29cb04910adf380c202db93b59b622ecd8a2a8fa Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 2 Nov 2024 21:23:44 -0500 Subject: [PATCH 241/363] Fix JEI arrows --- build.gradle | 4 +-- gradle.properties | 2 +- .../jei/BuddingConversionRecipeCategory.java | 3 +- .../client/jei/CrushRecipeCategory.java | 30 +++++++------------ .../arsnouveau/client/jei/JEIConstants.java | 14 --------- .../client/jei/ScryRitualRecipeCategory.java | 6 ++-- 6 files changed, 18 insertions(+), 41 deletions(-) delete mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIConstants.java diff --git a/build.gradle b/build.gradle index a0134c981d..30720d9596 100644 --- a/build.gradle +++ b/build.gradle @@ -110,8 +110,8 @@ dependencies { localRuntime "com.illusivesoulworks.caelus:caelus-neoforge:${caelus_version}" compileOnly "com.illusivesoulworks.caelus:caelus-neoforge:${caelus_version}:api" - compileOnly "mezz.jei:jei-1.21-neoforge-api:${jei_version}" - implementation "mezz.jei:jei-1.21-neoforge:${jei_version}" + compileOnly "mezz.jei:jei-1.21.1-neoforge-api:${jei_version}" + implementation "mezz.jei:jei-1.21.1-neoforge:${jei_version}" implementation 'com.github.glitchfiend:TerraBlender-neoforge:1.21-4.0.0.0' implementation "curse.maven:jade-324717:5444008" implementation "top.theillusivec4.curios:curios-neoforge:${curios_version}+1.21" diff --git a/gradle.properties b/gradle.properties index 6e12bdeeb9..8be62803b1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! -jei_version=19.5.0.44 +jei_version=19.21.0.247 curios_version=9.0.12 geckolib_version=4.6.6 patchouli_version=88-NEOFORGE-SNAPSHOT diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/BuddingConversionRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/BuddingConversionRecipeCategory.java index cba7d9a63d..c7d6ff8da3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/BuddingConversionRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/BuddingConversionRecipeCategory.java @@ -24,8 +24,7 @@ public class BuddingConversionRecipeCategory implements IRecipeCategory { public IDrawable background; public IDrawable icon; - private final LoadingCache cachedArrows; + private final IDrawable cachedArrows; public CrushRecipeCategory(IGuiHelper helper) { - background = helper.createBlankDrawable(120, 8 + 16 * 3); + background = helper.createBlankDrawable(getWidth(), getHeight()); icon = helper.createDrawableIngredient(VanillaTypes.ITEM_STACK, EffectCrush.INSTANCE.glyphItem.getDefaultInstance()); - this.cachedArrows = CacheBuilder.newBuilder() - .maximumSize(25) - .build(new CacheLoader<>() { - @Override - public IDrawableAnimated load(Integer cookTime) { - return helper.drawableBuilder(JEIConstants.RECIPE_GUI_VANILLA, 82, 128, 24, 17) - .buildAnimated(cookTime, IDrawableAnimated.StartDirection.LEFT, false); - } - }); + this.cachedArrows = helper.createAnimatedRecipeArrow(40); } @Override @@ -52,8 +40,13 @@ public Component getTitle() { } @Override - public IDrawable getBackground() { - return background; + public int getWidth() { + return 120; + } + + @Override + public int getHeight() { + return 56; } @Override @@ -63,8 +56,7 @@ public IDrawable getIcon() { @Override public void draw(CrushRecipe recipe, @NotNull IRecipeSlotsView slotsView, @NotNull GuiGraphics matrixStack, double mouseX, double mouseY) { - IDrawableAnimated arrow = this.cachedArrows.getUnchecked(40); - arrow.draw(matrixStack, 22, 6); + cachedArrows.draw(matrixStack, 22, 6); Font renderer = Minecraft.getInstance().font; for (int i = 0; i < recipe.outputs().size(); i++) { CrushRecipe.CrushOutput output = recipe.outputs().get(i); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIConstants.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIConstants.java deleted file mode 100644 index faf070a594..0000000000 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIConstants.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.hollingsworth.arsnouveau.client.jei; - -import net.minecraft.resources.ResourceLocation; - -public class JEIConstants { - public static final String TEXTURE_GUI_PATH = "textures/jei/gui/"; - public static final String TEXTURE_GUI_VANILLA = TEXTURE_GUI_PATH + "gui_vanilla.png"; - public static final ResourceLocation RECIPE_GUI_VANILLA = ResourceLocation.fromNamespaceAndPath("jei", TEXTURE_GUI_VANILLA); - -// public static final int MAX_TOOLTIP_WIDTH = 150; -// public static final ResourceLocation UNIVERSAL_RECIPE_TRANSFER_UID = new ResourceLocation("jei", "universal_recipe_transfer_handler"); -// public static final ResourceLocation LOCATION_JEI_GUI_TEXTURE_ATLAS = new ResourceLocation("jei", "textures/atlas/gui.png"); - -} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ScryRitualRecipeCategory.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ScryRitualRecipeCategory.java index d927d2761a..315eb4ca04 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/ScryRitualRecipeCategory.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/ScryRitualRecipeCategory.java @@ -36,8 +36,7 @@ public class ScryRitualRecipeCategory implements IRecipeCategory Date: Sat, 2 Nov 2024 21:25:07 -0500 Subject: [PATCH 242/363] Readd melons and pumpkins to whirli tag --- .../.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 | 4 ++-- .../ars_nouveau/tags/block/whirlisprig/greatly_likes.json | 8 +++++++- .../arsnouveau/common/datagen/BlockTagProvider.java | 8 +++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 index 000c86593f..0897b9f1c1 100644 --- a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 +++ b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 @@ -1,4 +1,4 @@ -// 1.21.1 2024-09-28T13:26:15.7534788 AN tags +// 1.21.1 2024-11-02T21:24:07.8371802 AN tags 939cde8f97e4e8d7ea8445415522f703b2b927d4 data/ars_nouveau/tags/block/an_decorative.json de95bc21249101b079255a1a00274f60d55e0602 data/ars_nouveau/tags/block/blazing_logs.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/block/break_blacklist.json @@ -22,7 +22,7 @@ b0d3df2afba9d4095985b91440f57652d9217d04 data/ars_nouveau/tags/block/storage/aut f5e3f6895ab28e98f84db162bb5a7ec0d8484aae data/ars_nouveau/tags/block/summon_bed.json 449d2dab531ac4032acb37910e9a380d07431391 data/ars_nouveau/tags/block/summon_sleepable.json 47f1f23357a86b9184362224b5c7095555f6846d data/ars_nouveau/tags/block/vexing_logs.json -a8499e798f3d96d8569c7b06e1c9b83d05da3caf data/ars_nouveau/tags/block/whirlisprig/greatly_likes.json +981d908724ea5e1adc2db78de0da831bd18cdb1b data/ars_nouveau/tags/block/whirlisprig/greatly_likes.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/block/whirlisprig/kinda_likes.json f36268e9375442e51cbf98f2c4d573082aa56378 data/c/tags/block/bushes.json 2f9b7e099208b0e404e0f81c89f2a368e5d909da data/c/tags/block/chests.json diff --git a/src/generated/resources/data/ars_nouveau/tags/block/whirlisprig/greatly_likes.json b/src/generated/resources/data/ars_nouveau/tags/block/whirlisprig/greatly_likes.json index 32d873b756..d6f0b9487c 100644 --- a/src/generated/resources/data/ars_nouveau/tags/block/whirlisprig/greatly_likes.json +++ b/src/generated/resources/data/ars_nouveau/tags/block/whirlisprig/greatly_likes.json @@ -9,6 +9,12 @@ "minecraft:cactus", "minecraft:sugar_cane", "minecraft:chorus_flower", - "minecraft:chorus_plant" + "minecraft:chorus_plant", + "minecraft:melon", + "minecraft:pumpkin", + "minecraft:melon_stem", + "minecraft:pumpkin_stem", + "minecraft:attached_pumpkin_stem", + "minecraft:attached_melon_stem" ] } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java index 24ba8bf50a..02260b98d4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java @@ -185,7 +185,13 @@ protected void addTags(HolderLookup.Provider pProvider) { Blocks.CACTUS, Blocks.SUGAR_CANE, Blocks.CHORUS_FLOWER, - Blocks.CHORUS_PLANT); + Blocks.CHORUS_PLANT, + Blocks.MELON, + Blocks.PUMPKIN, + Blocks.MELON_STEM, + Blocks.PUMPKIN_STEM, + Blocks.ATTACHED_PUMPKIN_STEM, + Blocks.ATTACHED_MELON_STEM); this.tag(WHIRLISPRIG_KINDA_LIKES); this.tag(MAGIC_SAPLINGS).add( From 60a5db49d38f495f2d3835ebf8d94024ed9ebf9b Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 3 Nov 2024 08:42:45 -0600 Subject: [PATCH 243/363] Add burst whitelist --- .../.cache/d0c924a870929ce1baf161c329e85242236b3530 | 3 ++- .../ars_nouveau/tags/entity_type/burst_whitelist.json | 5 +++++ .../arsnouveau/common/datagen/EntityTagProvider.java | 1 + .../arsnouveau/common/lib/EntityTags.java | 3 +++ .../arsnouveau/common/spell/effect/EffectBurst.java | 10 ++++++---- .../arsnouveau/common/spell/effect/EffectPickup.java | 2 +- 6 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 src/generated/resources/data/ars_nouveau/tags/entity_type/burst_whitelist.json diff --git a/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 b/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 index 45c272e905..925f70d326 100644 --- a/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 +++ b/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 @@ -1,7 +1,8 @@ -// 1.21.1 2024-10-13T12:06:56.1303326 Tags for minecraft:entity_type mod id ars_nouveau +// 1.21.1 2024-11-03T08:26:56.8381996 Tags for minecraft:entity_type mod id ars_nouveau 4d0235b95823f5d315aae7e9f9e484cbde8294a0 data/ars_nouveau/tags/entity_type/animal_summon_blacklist.json a958530eef4b0d5ac2f1c7bd552b60e23cb66d9a data/ars_nouveau/tags/entity_type/an_hostile.json 290c285b1e334d322b8d070b2c6a071114b1d70c data/ars_nouveau/tags/entity_type/berry_blacklist.json +9ed25624536bcb61560aaa371809230a68e5ca55 data/ars_nouveau/tags/entity_type/burst_whitelist.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_type/disintegration_blacklist.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_type/disintegration_whitelist.json 29671cfa11d074462c259806e9d60468451e3cdb data/ars_nouveau/tags/entity_type/drygmy_blacklist.json diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_type/burst_whitelist.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/burst_whitelist.json new file mode 100644 index 0000000000..1b697dc4de --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/tags/entity_type/burst_whitelist.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ars_nouveau:bubble" + ] +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java index 2961ded275..bd6137bece 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java @@ -74,5 +74,6 @@ protected void addTags(HolderLookup.Provider pProvider) { this.tag(EntityTags.JAR_RELEASE_BLACKLIST).add(EntityType.ENDER_DRAGON); this.tag(EntityTags.ANIMAL_SUMMON_BLACKLIST).add(ModEntities.GIFT_STARBY.get()); + this.tag(EntityTags.BURST_WHITELIST).add(ModEntities.BUBBLE.get()); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/EntityTags.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/EntityTags.java index 1df5b83005..e1c981b395 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/EntityTags.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/EntityTags.java @@ -25,4 +25,7 @@ public class EntityTags { public static final TagKey> ITEM_GRATE_PASSABLE = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "item_grate_passable")); public static final TagKey> ITEM_GRATE_COLLIDE = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "item_grate_collide")); + + public static final TagKey> BURST_WHITELIST = TagKey.create(Registries.ENTITY_TYPE, ArsNouveau.prefix( "burst_whitelist")); + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java index 3d266cbb0b..4096e4d66a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.api.util.BlockUtil; +import com.hollingsworth.arsnouveau.common.lib.EntityTags; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAOE; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDampen; @@ -9,6 +10,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; @@ -51,10 +53,10 @@ public void makeSphere(BlockPos center, Level world, @NotNull LivingEntity shoot spellContext.setCanceled(true); int radius = (int) (1 + spellStats.getAoeMultiplier()); - Predicate Sphere = spellStats.hasBuff(AugmentDampen.INSTANCE) ? (distance) -> distance <= radius + 0.5 && distance >= radius - 0.5 : (distance) -> (distance <= radius + 0.5); + Predicate sphere = spellStats.hasBuff(AugmentDampen.INSTANCE) ? (distance) -> distance <= radius + 0.5 && distance >= radius - 0.5 : (distance) -> (distance <= radius + 0.5); if (spellStats.isSensitive()) { for (BlockPos pos : BlockPos.withinManhattan(center, radius, radius, radius)) { - if (Sphere.test(BlockUtil.distanceFromCenter(pos, center))) { + if (sphere.test(BlockUtil.distanceFromCenter(pos, center))) { pos = pos.immutable(); SpellResolver resolver1 = resolver.getNewResolver(newContext); //TODO it needs a direction, UP as a dummy for now @@ -62,8 +64,8 @@ public void makeSphere(BlockPos center, Level world, @NotNull LivingEntity shoot } } } else { - for (LivingEntity entity : world.getEntitiesOfClass(LivingEntity.class, new AABB(center).inflate(radius, radius, radius))) { - if (Sphere.test(BlockUtil.distanceFromCenter(entity.blockPosition(), center))) { + for (Entity entity : world.getEntities(null, new AABB(center).inflate(radius, radius, radius))) { + if ((entity instanceof LivingEntity || entity.getType().is(EntityTags.BURST_WHITELIST)) && sphere.test(BlockUtil.distanceFromCenter(entity.blockPosition(), center))) { SpellResolver resolver1 = resolver.getNewResolver(newContext); resolver1.onResolveEffect(world, new EntityHitResult(entity)); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java index 339807dc19..700b941469 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java @@ -41,8 +41,8 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt posVec.add(expansion, expansion, expansion), posVec.subtract(expansion, expansion, expansion))); InventoryManager manager = spellContext.getCaster().getInvManager().extractSlotMax(-1); for (ItemEntity i : entityList) { - ItemStack stack = i.getItem(); var pickupPre = NeoForge.EVENT_BUS.post(new ItemEntityPickupEvent.Pre(getPlayer(shooter, (ServerLevel) world), i)); + ItemStack stack = i.getItem(); if (stack.isEmpty() || pickupPre.canPickup().isFalse()) continue; stack = manager.insertStack(stack); From ae86e8821cef416140abef587e9e1b751bd806e5 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 3 Nov 2024 08:47:55 -0600 Subject: [PATCH 244/363] Remove possible CME on remove? --- .../arsnouveau/common/entity/EntityFollowProjectile.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java index ff6f47de7a..c3dad357a9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java @@ -81,9 +81,6 @@ protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { @Override public void onRemovedFromLevel() { super.onRemovedFromLevel(); - if(!this.isRemoved()) { - this.remove(RemovalReason.DISCARDED); - } } public boolean defaultsBurst() { From baa445c3542c58e28d61db2190a0033bea130690 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 3 Nov 2024 08:59:11 -0600 Subject: [PATCH 245/363] Add arrow to burst whitelist --- .../data/ars_nouveau/tags/entity_type/burst_whitelist.json | 3 ++- .../arsnouveau/common/datagen/EntityTagProvider.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_type/burst_whitelist.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/burst_whitelist.json index 1b697dc4de..5863320452 100644 --- a/src/generated/resources/data/ars_nouveau/tags/entity_type/burst_whitelist.json +++ b/src/generated/resources/data/ars_nouveau/tags/entity_type/burst_whitelist.json @@ -1,5 +1,6 @@ { "values": [ - "ars_nouveau:bubble" + "ars_nouveau:bubble", + "minecraft:arrow" ] } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java index bd6137bece..29cb3141e5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java @@ -74,6 +74,6 @@ protected void addTags(HolderLookup.Provider pProvider) { this.tag(EntityTags.JAR_RELEASE_BLACKLIST).add(EntityType.ENDER_DRAGON); this.tag(EntityTags.ANIMAL_SUMMON_BLACKLIST).add(ModEntities.GIFT_STARBY.get()); - this.tag(EntityTags.BURST_WHITELIST).add(ModEntities.BUBBLE.get()); + this.tag(EntityTags.BURST_WHITELIST).add(ModEntities.BUBBLE.get(), EntityType.ARROW); } } From 25a50e0f6a4e07da71d2a62642e0a4c9fd03abc6 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 3 Nov 2024 09:03:13 -0600 Subject: [PATCH 246/363] Readd sourceberry docs #1477 --- .../resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 ++-- .../resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 | 4 ++-- src/generated/resources/assets/ars_nouveau/lang/en_us.json | 2 +- .../hollingsworth/arsnouveau/common/datagen/LangDatagen.java | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index d978a21222..e5a254fde2 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-10-20T14:38:31.3652392 Languages: en_us for mod: ars_nouveau -8adc5bdc2d4dbdbb860566359d908f0de766f2d8 assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-11-03T08:59:37.0587828 Languages: en_us for mod: ars_nouveau +47b48e067238f53a7a403b5ac51fcd83cfddf29c assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 b/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 index 925f70d326..cce38dc9cb 100644 --- a/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 +++ b/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 @@ -1,8 +1,8 @@ -// 1.21.1 2024-11-03T08:26:56.8381996 Tags for minecraft:entity_type mod id ars_nouveau +// 1.21.1 2024-11-03T08:55:51.1524375 Tags for minecraft:entity_type mod id ars_nouveau 4d0235b95823f5d315aae7e9f9e484cbde8294a0 data/ars_nouveau/tags/entity_type/animal_summon_blacklist.json a958530eef4b0d5ac2f1c7bd552b60e23cb66d9a data/ars_nouveau/tags/entity_type/an_hostile.json 290c285b1e334d322b8d070b2c6a071114b1d70c data/ars_nouveau/tags/entity_type/berry_blacklist.json -9ed25624536bcb61560aaa371809230a68e5ca55 data/ars_nouveau/tags/entity_type/burst_whitelist.json +7bddc9acec76a3ed5a2e6c0fb20d3fc69857c7ac data/ars_nouveau/tags/entity_type/burst_whitelist.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_type/disintegration_blacklist.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_type/disintegration_whitelist.json 29671cfa11d074462c259806e9d60468451e3cdb data/ars_nouveau/tags/entity_type/drygmy_blacklist.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index fd1b7d9ce2..aeced98877 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -563,8 +563,8 @@ "ars_nouveau.page1.scribes_table": "To craft new glyphs, use a spell book on the table to open the codex. Each glyph requires a set of items and experience points to unlock. Select a glyph by clicking on it in the menu, and hit select. Throw the items onto the table as rendered above, and the table will scribe a new glyph. The table will also pull items from nearby inventories. Using the dominion wand on the table will disable auto-pull.", "ars_nouveau.page1.shapers_focus": "A focus that modifies effects that move, create, or modify blocks. Blocks that you move with effects like Launch, Gravity, Pull, Knockback, etc. will now deal damage to entities they hit. Damage is increased by Spell Damage, block hardness, and the speed of the block. Additionally, effects that target or create blocks will duplicate the rest of the spell targeting the new block or moving block.", "ars_nouveau.page1.source": "Source is a special resource that must be gathered using devices in the world. Source is used for powering devices like the Imbuement Chamber and Enchanting Apparatus. To begin gathering Source, you will need a Source Jar and a Sourcelink.", - "ars_nouveau.page1.source_berry": "A Sourceberry Bush can be found in Taiga and Archwood Forest biomes, and produces Sourceberries. A Sourceberry can be used to craft a Potion of Mana Regeneration or consumed as food. Starbuncles will automatically harvest fully grown Source Berry Bushes, making them useful for early automation of the Agronomic Sourcelink. Sourceberry foods will also grant Mana Regeneration.", "ars_nouveau.page1.source_lamp": "Behaves like a copper bulb, but the light and comparator values can be adjusted by casting Light with dampen.", + "ars_nouveau.page1.sourceberry_bush": "A Sourceberry Bush can be found in Taiga and Archwood Forest biomes, and produces Sourceberries. A Sourceberry can be used to craft a Potion of Mana Regeneration or consumed as food. Starbuncles will automatically harvest fully grown Source Berry Bushes, making them useful for early automation of the Agronomic Sourcelink. Sourceberry foods will also grant Mana Regeneration.", "ars_nouveau.page1.spell_books": "Accessing higher tier spells will require a better spell book. While a novice spell book only has access to Tier 1 spells, the Apprentice and Archmage spell books will unlock tiers two and three. Upgrading your spell book will transfer all of the spells that you have learned into your new book. Books may be dyed by crafting them with a piece of dye.", "ars_nouveau.page1.spell_bow": "A bow that can be inscribed with a spell using the Scribes Table. If the player has enough mana, arrows will become Spell Arrows and will apply the spell on their target. If no arrows are in the inventory, a spell arrow that deals 0 damage will be cast. If there is not enough mana, regular arrows will be fired. Enchanter's Bows may use special Augment Arrows for empowering the inscribed spell.", "ars_nouveau.page1.spell_casting": "To begin spell casting, you will need to first obtain a Spellbook. A spellbook will allow you to create, store, and cast spells using Mana. A higher tier spell book will provide additional spell slots, allowing you to craft more complex spells. $(br) To craft your first spell, you must first select the $(bold)Form$() that the spell will take on. A $(bold)Form$() glyph must always be the first glyph in a spell recipe.", diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 8fe68c9615..62bf3656a7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -614,7 +614,7 @@ protected void addTranslations() { add("ars_nouveau.wilden", "Wilden"); add("ars_nouveau.page.decorative", "Decorative Blocks"); add("ars_nouveau.page1.magelight_torch", "Decorative lights. To ignite, cast Light on the sconce. The color of the flame corresponds with your spell color. The Magelight Torch on a wall can change the direction of its flames by interacting. Use Touch or Projectile Sensitive to target the sconce."); - add("ars_nouveau.page1.source_berry", "A Sourceberry Bush can be found in Taiga and Archwood Forest biomes, and produces Sourceberries. A Sourceberry can be used to craft a Potion of Mana Regeneration or consumed as food. Starbuncles will automatically harvest fully grown Source Berry Bushes, making them useful for early automation of the Agronomic Sourcelink. Sourceberry foods will also grant Mana Regeneration."); + add("ars_nouveau.page1.sourceberry_bush", "A Sourceberry Bush can be found in Taiga and Archwood Forest biomes, and produces Sourceberries. A Sourceberry can be used to craft a Potion of Mana Regeneration or consumed as food. Starbuncles will automatically harvest fully grown Source Berry Bushes, making them useful for early automation of the Agronomic Sourcelink. Sourceberry foods will also grant Mana Regeneration."); add("ars_nouveau.page.wilden", "Wilden"); add("ars_nouveau.page.weald_walker", "Weald Walkers"); add("ars_nouveau.spell_schools", "Spell Schools"); From 68afceab8591dfdb3c72e3d045133ded0f800021 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 3 Nov 2024 09:25:49 -0600 Subject: [PATCH 247/363] Add recipe to clear charm and shard --- .../9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e | 18 ++++++++++- .../recipes/misc/clear_alakarkinos_charm.json | 32 +++++++++++++++++++ .../misc/clear_amethyst_golem_charm.json | 32 +++++++++++++++++++ .../recipes/misc/clear_bookwyrm_charm.json | 32 +++++++++++++++++++ .../recipes/misc/clear_drygmy_charm.json | 32 +++++++++++++++++++ .../recipes/misc/clear_starbuncle_charm.json | 32 +++++++++++++++++++ .../recipes/misc/clear_starbuncle_shard.json | 32 +++++++++++++++++++ .../recipes/misc/clear_whirlisprig_charm.json | 32 +++++++++++++++++++ .../recipes/misc/clear_wixie_charm.json | 32 +++++++++++++++++++ .../recipe/clear_alakarkinos_charm.json | 13 ++++++++ .../recipe/clear_amethyst_golem_charm.json | 13 ++++++++ .../recipe/clear_bookwyrm_charm.json | 13 ++++++++ .../minecraft/recipe/clear_drygmy_charm.json | 13 ++++++++ .../recipe/clear_starbuncle_charm.json | 13 ++++++++ .../recipe/clear_starbuncle_shard.json | 13 ++++++++ .../recipe/clear_whirlisprig_charm.json | 13 ++++++++ .../minecraft/recipe/clear_wixie_charm.json | 13 ++++++++ .../common/datagen/RecipeDatagen.java | 13 +++++++- 18 files changed, 389 insertions(+), 2 deletions(-) create mode 100644 src/generated/resources/data/minecraft/advancement/recipes/misc/clear_alakarkinos_charm.json create mode 100644 src/generated/resources/data/minecraft/advancement/recipes/misc/clear_amethyst_golem_charm.json create mode 100644 src/generated/resources/data/minecraft/advancement/recipes/misc/clear_bookwyrm_charm.json create mode 100644 src/generated/resources/data/minecraft/advancement/recipes/misc/clear_drygmy_charm.json create mode 100644 src/generated/resources/data/minecraft/advancement/recipes/misc/clear_starbuncle_charm.json create mode 100644 src/generated/resources/data/minecraft/advancement/recipes/misc/clear_starbuncle_shard.json create mode 100644 src/generated/resources/data/minecraft/advancement/recipes/misc/clear_whirlisprig_charm.json create mode 100644 src/generated/resources/data/minecraft/advancement/recipes/misc/clear_wixie_charm.json create mode 100644 src/generated/resources/data/minecraft/recipe/clear_alakarkinos_charm.json create mode 100644 src/generated/resources/data/minecraft/recipe/clear_amethyst_golem_charm.json create mode 100644 src/generated/resources/data/minecraft/recipe/clear_bookwyrm_charm.json create mode 100644 src/generated/resources/data/minecraft/recipe/clear_drygmy_charm.json create mode 100644 src/generated/resources/data/minecraft/recipe/clear_starbuncle_charm.json create mode 100644 src/generated/resources/data/minecraft/recipe/clear_starbuncle_shard.json create mode 100644 src/generated/resources/data/minecraft/recipe/clear_whirlisprig_charm.json create mode 100644 src/generated/resources/data/minecraft/recipe/clear_wixie_charm.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index beca55bcc6..9652a3e4fa 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,4 +1,4 @@ -// 1.21.1 2024-09-11T20:33:56.464892 Recipes +// 1.21.1 2024-11-03T09:24:17.7282028 Recipes a76e5d9eef406841f56740535ec2afdd509de507 data/ars_nouveau/advancement/recipes/building_blocks/archwood_button.json 443515bb80018fbe37a128cb6849f5e818be315d data/ars_nouveau/advancement/recipes/building_blocks/archwood_door.json 4dfc3afae271aae8423d20dedb67dc601ff71fa0 data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence.json @@ -565,3 +565,19 @@ e40f3959e9af493782395c436060a4c80ee61929 data/ars_nouveau/recipe/wipe_starby_sha c1ff140a7eea0c25559c9445572b928edec0d5f1 data/ars_nouveau/recipe/wixie_hat.json 635ab6a0a28315545b61d556d8924deac512ac98 data/ars_nouveau/recipe/worn_notebook.json 6fd5261e1412280fcc8d3a12414c7cb6342b78f3 data/ars_nouveau/recipe/yellow_sbed.json +4a0bca6db6b1f078e1f74a54c3ef7792c417fed8 data/minecraft/advancement/recipes/misc/clear_alakarkinos_charm.json +b28977b57687b12771356d3a03d3f80b84966266 data/minecraft/advancement/recipes/misc/clear_amethyst_golem_charm.json +a43956ca840726d63a7ad568808b8e25568e3770 data/minecraft/advancement/recipes/misc/clear_bookwyrm_charm.json +d66f72c8b0941a426ff060e99764be325714050c data/minecraft/advancement/recipes/misc/clear_drygmy_charm.json +100ab394a95ab190843f4d76f5c233e2911a54a8 data/minecraft/advancement/recipes/misc/clear_starbuncle_charm.json +86197147340c7828d85eee8993772465b8e0544a data/minecraft/advancement/recipes/misc/clear_starbuncle_shard.json +fe7dc162a7ed20009710cbdb6a1ccbd94a034b6d data/minecraft/advancement/recipes/misc/clear_whirlisprig_charm.json +c38e4ff3ebfaae36efe861f63409a42ef7887505 data/minecraft/advancement/recipes/misc/clear_wixie_charm.json +36f93e4053af09f5393c6b147fffbc69c7ef1ddb data/minecraft/recipe/clear_alakarkinos_charm.json +6b2aa4d03411783352471307a0b74faf3b5ec516 data/minecraft/recipe/clear_amethyst_golem_charm.json +ee6a4ca85028a4c6b2b7373d7da7a62573c1bb99 data/minecraft/recipe/clear_bookwyrm_charm.json +28dd25917feed5b72c8f449830ddad58caf9710a data/minecraft/recipe/clear_drygmy_charm.json +744dd39d50c1277291980520aeb5eaa548da6fb6 data/minecraft/recipe/clear_starbuncle_charm.json +e40f3959e9af493782395c436060a4c80ee61929 data/minecraft/recipe/clear_starbuncle_shard.json +642a9347a8cdbb423f8303d800738cc9319c93dd data/minecraft/recipe/clear_whirlisprig_charm.json +c3023681f4c929c8990c1ae05f198d353daddd31 data/minecraft/recipe/clear_wixie_charm.json diff --git a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_alakarkinos_charm.json b/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_alakarkinos_charm.json new file mode 100644 index 0000000000..1ce805157d --- /dev/null +++ b/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_alakarkinos_charm.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_journal": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "minecraft:clear_alakarkinos_charm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_journal" + ] + ], + "rewards": { + "recipes": [ + "minecraft:clear_alakarkinos_charm" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_amethyst_golem_charm.json b/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_amethyst_golem_charm.json new file mode 100644 index 0000000000..9d754f987c --- /dev/null +++ b/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_amethyst_golem_charm.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_journal": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "minecraft:clear_amethyst_golem_charm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_journal" + ] + ], + "rewards": { + "recipes": [ + "minecraft:clear_amethyst_golem_charm" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_bookwyrm_charm.json b/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_bookwyrm_charm.json new file mode 100644 index 0000000000..1bd7c279e7 --- /dev/null +++ b/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_bookwyrm_charm.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_journal": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "minecraft:clear_bookwyrm_charm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_journal" + ] + ], + "rewards": { + "recipes": [ + "minecraft:clear_bookwyrm_charm" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_drygmy_charm.json b/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_drygmy_charm.json new file mode 100644 index 0000000000..5ee8f27ce5 --- /dev/null +++ b/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_drygmy_charm.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_journal": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "minecraft:clear_drygmy_charm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_journal" + ] + ], + "rewards": { + "recipes": [ + "minecraft:clear_drygmy_charm" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_starbuncle_charm.json b/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_starbuncle_charm.json new file mode 100644 index 0000000000..a222532ddb --- /dev/null +++ b/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_starbuncle_charm.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_journal": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "minecraft:clear_starbuncle_charm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_journal" + ] + ], + "rewards": { + "recipes": [ + "minecraft:clear_starbuncle_charm" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_starbuncle_shard.json b/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_starbuncle_shard.json new file mode 100644 index 0000000000..14da2b5144 --- /dev/null +++ b/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_starbuncle_shard.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_journal": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "minecraft:clear_starbuncle_shard" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_journal" + ] + ], + "rewards": { + "recipes": [ + "minecraft:clear_starbuncle_shard" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_whirlisprig_charm.json b/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_whirlisprig_charm.json new file mode 100644 index 0000000000..1b39f8e52d --- /dev/null +++ b/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_whirlisprig_charm.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_journal": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "minecraft:clear_whirlisprig_charm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_journal" + ] + ], + "rewards": { + "recipes": [ + "minecraft:clear_whirlisprig_charm" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_wixie_charm.json b/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_wixie_charm.json new file mode 100644 index 0000000000..4787b870f7 --- /dev/null +++ b/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_wixie_charm.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_journal": { + "conditions": { + "items": [ + { + "items": "ars_nouveau:worn_notebook" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "minecraft:clear_wixie_charm" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_journal" + ] + ], + "rewards": { + "recipes": [ + "minecraft:clear_wixie_charm" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/recipe/clear_alakarkinos_charm.json b/src/generated/resources/data/minecraft/recipe/clear_alakarkinos_charm.json new file mode 100644 index 0000000000..c5c2fe70ae --- /dev/null +++ b/src/generated/resources/data/minecraft/recipe/clear_alakarkinos_charm.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "ars_nouveau:alakarkinos_charm" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:alakarkinos_charm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/recipe/clear_amethyst_golem_charm.json b/src/generated/resources/data/minecraft/recipe/clear_amethyst_golem_charm.json new file mode 100644 index 0000000000..eb51cb5a41 --- /dev/null +++ b/src/generated/resources/data/minecraft/recipe/clear_amethyst_golem_charm.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "ars_nouveau:amethyst_golem_charm" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:amethyst_golem_charm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/recipe/clear_bookwyrm_charm.json b/src/generated/resources/data/minecraft/recipe/clear_bookwyrm_charm.json new file mode 100644 index 0000000000..69ea98bb02 --- /dev/null +++ b/src/generated/resources/data/minecraft/recipe/clear_bookwyrm_charm.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "ars_nouveau:bookwyrm_charm" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:bookwyrm_charm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/recipe/clear_drygmy_charm.json b/src/generated/resources/data/minecraft/recipe/clear_drygmy_charm.json new file mode 100644 index 0000000000..8098b668cb --- /dev/null +++ b/src/generated/resources/data/minecraft/recipe/clear_drygmy_charm.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "ars_nouveau:drygmy_charm" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:drygmy_charm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/recipe/clear_starbuncle_charm.json b/src/generated/resources/data/minecraft/recipe/clear_starbuncle_charm.json new file mode 100644 index 0000000000..55195f60f7 --- /dev/null +++ b/src/generated/resources/data/minecraft/recipe/clear_starbuncle_charm.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "ars_nouveau:starbuncle_charm" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:starbuncle_charm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/recipe/clear_starbuncle_shard.json b/src/generated/resources/data/minecraft/recipe/clear_starbuncle_shard.json new file mode 100644 index 0000000000..23cb11151c --- /dev/null +++ b/src/generated/resources/data/minecraft/recipe/clear_starbuncle_shard.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "ars_nouveau:starbuncle_shards" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:starbuncle_shards" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/recipe/clear_whirlisprig_charm.json b/src/generated/resources/data/minecraft/recipe/clear_whirlisprig_charm.json new file mode 100644 index 0000000000..b3412f0026 --- /dev/null +++ b/src/generated/resources/data/minecraft/recipe/clear_whirlisprig_charm.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "ars_nouveau:whirlisprig_charm" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:whirlisprig_charm" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/recipe/clear_wixie_charm.json b/src/generated/resources/data/minecraft/recipe/clear_wixie_charm.json new file mode 100644 index 0000000000..f722bcc6dc --- /dev/null +++ b/src/generated/resources/data/minecraft/recipe/clear_wixie_charm.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "ars_nouveau:wixie_charm" + } + ], + "result": { + "count": 1, + "id": "ars_nouveau:wixie_charm" + } +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java index ca42a618b3..2120829b08 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java @@ -775,10 +775,21 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .define('r', Tags.Items.DUSTS_REDSTONE) .save(consumer); - + clearBuilder(ItemsRegistry.STARBUNCLE_CHARM).save(consumer, "clear_starbuncle_charm"); + clearBuilder(ItemsRegistry.STARBUNCLE_SHARD).save(consumer, "clear_starbuncle_shard"); + clearBuilder(ItemsRegistry.DRYGMY_CHARM).save(consumer, "clear_drygmy_charm"); + clearBuilder(ItemsRegistry.WIXIE_CHARM).save(consumer, "clear_wixie_charm"); + clearBuilder(ItemsRegistry.BOOKWYRM_CHARM).save(consumer, "clear_bookwyrm_charm"); + clearBuilder(ItemsRegistry.WHIRLISPRIG_CHARM).save(consumer, "clear_whirlisprig_charm"); + clearBuilder(ItemsRegistry.AMETHYST_GOLEM_CHARM).save(consumer, "clear_amethyst_golem_charm"); + clearBuilder(ItemsRegistry.ALAKARKINOS_CHARM).save(consumer, "clear_alakarkinos_charm"); } } + public ShapelessRecipeBuilder clearBuilder(ItemLike item) { + return shapelessBuilder(item).requires(item); + } + public static RitualTablet getRitualItem(String name) { return RitualRegistry.getRitualItemMap().get(ArsNouveau.prefix( name)); } From 9a4970307ce4e3cb0092bbffa55205e3ee3a9a13 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 3 Nov 2024 09:35:53 -0600 Subject: [PATCH 248/363] Fix starbuncles not saving behavior tag to charm #1458 --- .../hollingsworth/arsnouveau/common/entity/Starbuncle.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index c83eb13b32..06baa4ecda 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -337,7 +337,9 @@ public List getWandHighlight(List list) { } public void syncBehavior() { - Networking.sendToNearbyClient(level, this, new PacketSyncTag(dynamicBehavior.toTag(new CompoundTag()), getId())); + CompoundTag behaviorTag = dynamicBehavior.toTag(new CompoundTag()); + this.data.behaviorTag = behaviorTag; + Networking.sendToNearbyClient(level, this, new PacketSyncTag(behaviorTag, getId())); } @Override From 5aa7497c01d40faf4ed70dd4451bc28010fa4f86 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 3 Nov 2024 09:44:52 -0600 Subject: [PATCH 249/363] Add particle to warp portal #1465 --- .../resources/assets/ars_nouveau/blockstates/portal.json | 2 +- .../assets/ars_nouveau/models/block/warp_portal.json | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/assets/ars_nouveau/models/block/warp_portal.json diff --git a/src/main/resources/assets/ars_nouveau/blockstates/portal.json b/src/main/resources/assets/ars_nouveau/blockstates/portal.json index 64ee5c95fd..c42b312bcb 100644 --- a/src/main/resources/assets/ars_nouveau/blockstates/portal.json +++ b/src/main/resources/assets/ars_nouveau/blockstates/portal.json @@ -10,7 +10,7 @@ "model": "ars_nouveau:block/warp_portal_ud" }, "alternate=false": { - "model": "minecraft:block/air" + "model": "ars_nouveau:block/warp_portal" } } } \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/models/block/warp_portal.json b/src/main/resources/assets/ars_nouveau/models/block/warp_portal.json new file mode 100644 index 0000000000..5761468334 --- /dev/null +++ b/src/main/resources/assets/ars_nouveau/models/block/warp_portal.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "minecraft:block/obsidian" + } +} From 890f347af70e58d62bc88727d58d7135015033e1 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 3 Nov 2024 09:50:15 -0600 Subject: [PATCH 250/363] Remove pickup delay before pickup --- .../arsnouveau/common/spell/effect/EffectPickup.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java index 700b941469..ae8277b86a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java @@ -41,6 +41,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt posVec.add(expansion, expansion, expansion), posVec.subtract(expansion, expansion, expansion))); InventoryManager manager = spellContext.getCaster().getInvManager().extractSlotMax(-1); for (ItemEntity i : entityList) { + i.setPickUpDelay(0); // Fixes backpack mods respecting pickup delay var pickupPre = NeoForge.EVENT_BUS.post(new ItemEntityPickupEvent.Pre(getPlayer(shooter, (ServerLevel) world), i)); ItemStack stack = i.getItem(); if (stack.isEmpty() || pickupPre.canPickup().isFalse()) From fd775cbaeb14a19bf3e249324ae5e1132e1a2792 Mon Sep 17 00:00:00 2001 From: Qther Date: Mon, 4 Nov 2024 01:05:29 +0800 Subject: [PATCH 251/363] fix: child context for multi-resolvers (#1480) * fix: child context for multi-resolvers this fixes EffectDelay causing spells with multi-resolvers (EffectBurst, Entity{Lingering,Wall}Spell, and EntityOrbitProjectile) to only resolve once, may have other side effects. * fix some issues surrounding EffectReset --- .../hollingsworth/arsnouveau/api/spell/SpellContext.java | 2 +- .../hollingsworth/arsnouveau/api/spell/SpellResolver.java | 5 +---- .../arsnouveau/common/entity/EntityLingeringSpell.java | 4 ++-- .../arsnouveau/common/entity/EntityOrbitProjectile.java | 4 ++-- .../arsnouveau/common/entity/EntityWallSpell.java | 5 +++-- .../arsnouveau/common/spell/effect/EffectBurst.java | 8 ++++---- 6 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java index 036edbe7bf..09579785ce 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellContext.java @@ -108,7 +108,7 @@ public T getOrCreateAttachment(ResourceLocation i * or by cloning this context and setting the spell to the remainder of the spell and canceling the current one. * The new context will have its previous context set to this context. */ - public @NotNull SpellContext makeChildContext(){ + public @NotNull SpellContext makeChildContext() { Spell remainder = getRemainingSpell(); for(AbstractSpellPart spellPart : remainder.recipe()){ if(spellPart instanceof IContextManipulator manipulator){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java index af19d79de9..df72e5bc80 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java @@ -1,10 +1,7 @@ package com.hollingsworth.arsnouveau.api.spell; import com.hollingsworth.arsnouveau.api.ArsNouveauAPI; -import com.hollingsworth.arsnouveau.api.event.EffectResolveEvent; -import com.hollingsworth.arsnouveau.api.event.SpellCastEvent; -import com.hollingsworth.arsnouveau.api.event.SpellCostCalcEvent; -import com.hollingsworth.arsnouveau.api.event.SpellResolveEvent; +import com.hollingsworth.arsnouveau.api.event.*; import com.hollingsworth.arsnouveau.api.mana.IManaCap; import com.hollingsworth.arsnouveau.api.util.CuriosUtil; import com.hollingsworth.arsnouveau.api.util.SpellUtil; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityLingeringSpell.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityLingeringSpell.java index 26795c7e4a..3ffebb949a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityLingeringSpell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityLingeringSpell.java @@ -79,7 +79,7 @@ public void castSpells() { if (isSensitive()) { for (BlockPos p : BlockPos.betweenClosed(blockPosition().east(flatAoe).north(flatAoe), blockPosition().west(flatAoe).south(flatAoe))) { p = p.immutable(); - spellResolver.onResolveEffect(level, new + spellResolver.getNewResolver(spellResolver.spellContext.clone().makeChildContext()).onResolveEffect(level, new BlockHitResult(new Vec3(p.getX(), p.getY(), p.getZ()), Direction.UP, p, false)); } } else { @@ -87,7 +87,7 @@ public void castSpells() { for (Entity entity : level.getEntities(null, new AABB(this.blockPosition()).inflate(getAoe()))) { if (entity.equals(this) || entity.getType().is(EntityTags.LINGERING_BLACKLIST)) continue; - spellResolver.onResolveEffect(level, new EntityHitResult(entity)); + spellResolver.getNewResolver(spellResolver.spellContext.clone().makeChildContext()).onResolveEffect(level, new EntityHitResult(entity)); i++; if (i > 5) break; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityOrbitProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityOrbitProjectile.java index 7751cde6e6..38bb929852 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityOrbitProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityOrbitProjectile.java @@ -166,14 +166,14 @@ protected void onHit(@NotNull HitResult result) { return; } if (this.spellResolver != null) { - this.spellResolver.onResolveEffect(level, result); + this.spellResolver.getNewResolver(this.spellResolver.spellContext.clone().makeChildContext()).onResolveEffect(level, result); Networking.sendToNearbyClient(level, BlockPos.containing(result.getLocation()), new PacketANEffect(PacketANEffect.EffectType.BURST, BlockPos.containing(result.getLocation()), getParticleColor())); attemptRemoval(); } } else if (numSensitive > 0 && result instanceof BlockHitResult blockraytraceresult && !this.isRemoved()) { if (this.spellResolver != null) { - this.spellResolver.onResolveEffect(this.level, blockraytraceresult); + this.spellResolver.getNewResolver(this.spellResolver.spellContext.clone().makeChildContext()).onResolveEffect(this.level, blockraytraceresult); } Networking.sendToNearbyClient(level, ((BlockHitResult) result).getBlockPos(), new PacketANEffect(PacketANEffect.EffectType.BURST, BlockPos.containing(result.getLocation()).below(), getParticleColor())); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWallSpell.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWallSpell.java index 03d5499b22..c016dd8624 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWallSpell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityWallSpell.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.common.entity; +import com.hollingsworth.arsnouveau.api.spell.SpellContext; import com.hollingsworth.arsnouveau.client.particle.ParticleLineData; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.lib.EntityTags; @@ -97,7 +98,7 @@ public void castSpells() { return; for(BlockPos p : BlockPos.betweenClosed(start, end)){ p = p.immutable(); - spellResolver.onResolveEffect(level, new + spellResolver.getNewResolver(spellResolver.spellContext.clone().makeChildContext()).onResolveEffect(level, new BlockHitResult(new Vec3(p.getX(), p.getY(), p.getZ()), Direction.UP, p, false)); } }else{ @@ -126,7 +127,7 @@ public void castSpells() { } if(skipEntity) continue; - spellResolver.onResolveEffect(level, new EntityHitResult(entity)); + spellResolver.getNewResolver(spellResolver.spellContext.clone().makeChildContext()).onResolveEffect(level, new EntityHitResult(entity)); i++; if(hit.isEmpty()){ hitEntities.add(new EntityHit(entity)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java index 4096e4d66a..74141ce994 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java @@ -49,8 +49,6 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul public void makeSphere(BlockPos center, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver){ if (spellContext.getRemainingSpell().isEmpty()) return; - SpellContext newContext = spellContext.makeChildContext(); - spellContext.setCanceled(true); int radius = (int) (1 + spellStats.getAoeMultiplier()); Predicate sphere = spellStats.hasBuff(AugmentDampen.INSTANCE) ? (distance) -> distance <= radius + 0.5 && distance >= radius - 0.5 : (distance) -> (distance <= radius + 0.5); @@ -58,7 +56,7 @@ public void makeSphere(BlockPos center, Level world, @NotNull LivingEntity shoot for (BlockPos pos : BlockPos.withinManhattan(center, radius, radius, radius)) { if (sphere.test(BlockUtil.distanceFromCenter(pos, center))) { pos = pos.immutable(); - SpellResolver resolver1 = resolver.getNewResolver(newContext); + SpellResolver resolver1 = resolver.getNewResolver(spellContext.clone().makeChildContext()); //TODO it needs a direction, UP as a dummy for now resolver1.onResolveEffect(world, new BlockHitResult(new Vec3(pos.getX(), pos.getY(), pos.getZ()), Direction.UP, pos, false)); } @@ -66,11 +64,13 @@ public void makeSphere(BlockPos center, Level world, @NotNull LivingEntity shoot } else { for (Entity entity : world.getEntities(null, new AABB(center).inflate(radius, radius, radius))) { if ((entity instanceof LivingEntity || entity.getType().is(EntityTags.BURST_WHITELIST)) && sphere.test(BlockUtil.distanceFromCenter(entity.blockPosition(), center))) { - SpellResolver resolver1 = resolver.getNewResolver(newContext); + SpellResolver resolver1 = resolver.getNewResolver(spellContext.clone().makeChildContext()); resolver1.onResolveEffect(world, new EntityHitResult(entity)); } } } + + spellContext.setCanceled(true); } @Override From d329ebba4b9196304ffc860a78f7cf7af32fc834 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 3 Nov 2024 11:09:26 -0600 Subject: [PATCH 252/363] Feat/hold select radial (#1460) * feat: hold config option for radial selection * fix: cleanup merge * fix: update import paths --------- Co-authored-by: Kay0n Co-authored-by: Jarva <4622609+Jarva@users.noreply.github.com> --- .../client/gui/radial_menu/GuiRadialMenu.java | 15 +++++++++++++++ .../arsnouveau/setup/config/Config.java | 2 ++ 2 files changed, 17 insertions(+) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java index da1d325b50..ad1d014b5b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/radial_menu/GuiRadialMenu.java @@ -1,6 +1,8 @@ package com.hollingsworth.arsnouveau.client.gui.radial_menu; import com.hollingsworth.arsnouveau.client.ClientInfo; +import com.hollingsworth.arsnouveau.client.registry.ModKeyBindings; +import com.hollingsworth.arsnouveau.setup.config.Config; import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; @@ -28,6 +30,7 @@ public class GuiRadialMenu extends Screen { private static final int MAX_SLOTS = 20; private boolean closing; + private boolean holdToOpenGUI; private RadialMenu radialMenu; private List> radialMenuSlots; final float OPEN_ANIMATION_LENGTH = 0.40f; @@ -45,6 +48,7 @@ public GuiRadialMenu(RadialMenu radialMenu) { this.radialMenu = radialMenu; this.radialMenuSlots = this.radialMenu.getRadialMenuSlots(); this.closing = false; + this.holdToOpenGUI = !Config.TOGGLE_RADIAL_HUD.get(); this.minecraft = Minecraft.getInstance(); this.selectedItem = -1; itemRenderer = Minecraft.getInstance().getItemRenderer(); @@ -78,6 +82,17 @@ public void tick() { if (totalTime != OPEN_ANIMATION_LENGTH){ extraTick++; } + + if(holdToOpenGUI){ + int openRadialKey = ModKeyBindings.OPEN_RADIAL_HUD.getKey().getValue(); + boolean radialKeyIsDown = InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), openRadialKey); + if(!radialKeyIsDown){ + if (this.selectedItem != -1) { + radialMenu.setCurrentSlot(selectedItem); + } + minecraft.player.closeContainer(); + } + } } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java b/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java index 404b826190..28da85b28f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java @@ -68,6 +68,7 @@ public class Config { public static ModConfigSpec.IntValue TOOLTIP_Y_OFFSET; public static ModConfigSpec.IntValue MANABAR_X_OFFSET; public static ModConfigSpec.IntValue MANABAR_Y_OFFSET; + public static ModConfigSpec.BooleanValue TOGGLE_RADIAL_HUD; public static ModConfigSpec.IntValue BOOKWYRM_LIMIT; public static ModConfigSpec.BooleanValue GUI_TRANSPARENCY; public static ModConfigSpec.BooleanValue GLYPH_TOOLTIPS; @@ -113,6 +114,7 @@ public static boolean isGlyphEnabled(AbstractSpellPart tag) { MANABAR_Y_OFFSET = CLIENT_BUILDER.comment("Y offset for the Mana Bar").defineInRange("yManaBar", 0, Integer.MIN_VALUE, Integer.MAX_VALUE); SHOW_RECIPE_BOOK = CLIENT_BUILDER.comment("If the Storage Lectern should show the recipe book icon").define("showRecipeBook", true); INFORM_LIGHTS = CLIENT_BUILDER.comment("Inform the player of Dynamic lights once.").define("informLights", true); + TOGGLE_RADIAL_HUD = CLIENT_BUILDER.comment("Whether the Selection HUD is toggled or held").define("toggleSelectionHUD", true); CLIENT_BUILDER.pop(); CLIENT_BUILDER.comment("Misc").push("misc"); ALTERNATE_PORTAL_RENDER = CLIENT_BUILDER.comment("Use simplified renderer for Warp Portals").define("no_end_portal_render", false); From 623881e06efd86f2ce0310bc4f9353ebbd6ed359 Mon Sep 17 00:00:00 2001 From: Jarva <4622609+Jarva@users.noreply.github.com> Date: Sun, 3 Nov 2024 17:31:38 +0000 Subject: [PATCH 253/363] feat: add bonus glyph slot override (#1472) * feat: add glyph slot modifier interface * chore: remove unused interface * fix: remove default interface implementation * chore: remove unused import * fix: move to AbstractCaster --- .../arsnouveau/api/spell/AbstractCaster.java | 4 ++++ .../client/gui/book/GuiSpellBook.java | 22 ++++++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java index 0ad2e1a72a..0fa32aadef 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java @@ -242,6 +242,10 @@ public T setSpellName(String name) { return setSpellName(name, getCurrentSlot()); } + public int getBonusGlyphSlots() { + return 0; + } + @NotNull public Spell getSpell(Level world, LivingEntity playerEntity, InteractionHand hand, AbstractCaster caster) { return caster.getSpell(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index fa6ed841df..007fd9800b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -93,6 +93,7 @@ public class GuiSpellBook extends BaseBook { public PageButton nextGlyphButton; public PageButton prevGlyphButton; public int spellWindowOffset = 0; + public int bonusSlots = 0; public GuiSpellBook(InteractionHand hand){ super(); @@ -109,6 +110,12 @@ public GuiSpellBook(InteractionHand hand){ if(heldStack.getItem() instanceof SpellBook book){ tier = book.getTier().value; } + if (SpellCasterRegistry.hasCaster(heldStack)) { + AbstractCaster caster = SpellCasterRegistry.from(heldStack); + if (caster != null) { + bonusSlots = caster.getBonusGlyphSlots(); + } + } this.bookStack = heldStack; this.unlockedSpells = parts; this.displayedGlyphs = new ArrayList<>(this.unlockedSpells); @@ -204,7 +211,7 @@ public void init() { spell = new ArrayList<>(recipe); //infinite spells - if (ServerConfig.INFINITE_SPELLS.get()) { + if (getExtraGlyphSlots() > 0) { this.nextGlyphButton = addRenderableWidget(new PageButton(bookRight - 25, bookBottom - 30, true, i -> updateWindowOffset(spellWindowOffset + 1), true)); this.prevGlyphButton = addRenderableWidget(new PageButton(bookLeft, bookBottom - 30, false, i -> updateWindowOffset(spellWindowOffset - 1), true)); updateWindowOffset(0); @@ -377,10 +384,14 @@ public void onPageDec(Button button) { validate(); } + public int getExtraGlyphSlots() { + return (ServerConfig.INFINITE_SPELLS.get() ? ServerConfig.NOT_SO_INFINITE_SPELLS.get() : 0) + bonusSlots; + } + @Override public boolean mouseScrolled(double pMouseX, double pMouseY, double pScrollX, double pScrollY) { boolean isShiftDown = InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), Minecraft.getInstance().options.keyShift.getKey().getValue()); - if(ServerConfig.INFINITE_SPELLS.get() && isShiftDown){ + if(getExtraGlyphSlots() > 0 && isShiftDown){ if (pScrollY < 0 && nextGlyphButton.active) { updateWindowOffset(spellWindowOffset + 1); } else if (pScrollY > 0 && prevGlyphButton.active) { @@ -475,7 +486,7 @@ public void onGlyphClick(Button button) { private void updateNextGlyphArrow() { - if (spellWindowOffset >= ServerConfig.NOT_SO_INFINITE_SPELLS.get() || spellWindowOffset >= spell.size() - 1) { + if (spellWindowOffset >= getExtraGlyphSlots() || spellWindowOffset >= spell.size() - 1) { nextGlyphButton.active = false; nextGlyphButton.visible = false; } else { @@ -527,9 +538,10 @@ public void updateCraftingSlots(int bookSlot) { public void updateWindowOffset(int offset) { //do nothing if the spell is empty and nextGlyphButton is clicked - if (ServerConfig.INFINITE_SPELLS.get()) + int extraSlots = getExtraGlyphSlots(); + if (extraSlots > 0) if (spellWindowOffset != 0 || offset <= 0 || !spell.stream().allMatch(Objects::isNull)) { - this.spellWindowOffset = Mth.clamp(offset, 0, ServerConfig.NOT_SO_INFINITE_SPELLS.get()); + this.spellWindowOffset = Mth.clamp(offset, 0, extraSlots); for (int i = 0; i < 10; i++) { var cell = craftingCells.get(i); cell.slotNum = spellWindowOffset + i; From 5e0be8d2570378ee506b13854c4b59731de6ca97 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 3 Nov 2024 14:32:05 -0600 Subject: [PATCH 254/363] Update gradle wrapper --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a4413138c9..9355b41557 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 7dae701635646ca85cb391deb338c7f72c75f8c2 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 3 Nov 2024 14:48:31 -0600 Subject: [PATCH 255/363] Fix drygmy essence offset #1434 --- .../common/entity/goal/drygmy/CollectEssenceGoal.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/drygmy/CollectEssenceGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/drygmy/CollectEssenceGoal.java index d4c5d85fcd..3eeeb961d1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/drygmy/CollectEssenceGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/drygmy/CollectEssenceGoal.java @@ -73,7 +73,7 @@ public void tick() { drygmy.setChannelingEntity(-1); this.complete = true; BlockPos homePos = drygmy.getHome().getBlockPos(); - BlockPos targetPos = target.blockPosition(); + BlockPos targetPos = target.blockPosition().above(1); if (homePos.getY() >= targetPos.getY() - 2) { targetPos = targetPos.above(homePos.getY() - targetPos.getY()); } From f3b44d33493993bd164931d5a2c6dec4e32fb129 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 3 Nov 2024 16:23:55 -0600 Subject: [PATCH 256/363] Use recipe getRemainingItems #1478 --- .../arsnouveau/common/block/tile/CraftingLecternTile.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java index 549712af37..9788a051e0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CraftingLecternTile.java @@ -140,10 +140,11 @@ public void craft(Player thePlayer, @Nullable String tab) { return; } boolean playerInvUpdate = false; + List remainingItems = currentRecipe.getRemainingItems(craftMatrix.asCraftInput()); for (int i = 0; i < 9; ++i) { ItemStack currentStack = craftMatrix.getItem(i); ItemStack oldItem = currentStack.copy(); - ItemStack rem = currentStack.getCraftingRemainingItem(); + ItemStack rem = remainingItems.size() > i ? remainingItems.get(i) : ItemStack.EMPTY; if (!currentStack.isEmpty()) { craftMatrix.removeItemNoUpdate(i, 1); currentStack = craftMatrix.getItem(i); From a38c433d3a69524f2952a6f7bf9e736a9a142027 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 3 Nov 2024 16:30:18 -0600 Subject: [PATCH 257/363] Fix scryer crystal crash --- .../hollingsworth/arsnouveau/common/block/ScryersOculus.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java index a1a1bb1ae5..e04e622213 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java @@ -75,7 +75,7 @@ public void openMenu(Level pLevel, BlockPos pPos, Player pPlayer) { } Minecraft.getInstance().setScreen(new GuiRadialMenu<>(new RadialMenu<>((int scroll) -> { ScryPosData data = stackList.get(scroll).get(DataComponentRegistry.SCRY_DATA); - if (data == null || data.pos() == null) { + if (data == null || data.pos().isEmpty()) { PortUtil.sendMessage(pPlayer, Component.translatable("ars_nouveau.scryers_eye.no_pos")); return; } From ad2578d7a1ddc357e0872930fab84f58dc88a863 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 3 Nov 2024 19:29:44 -0600 Subject: [PATCH 258/363] Check for null enchants --- .../arsnouveau/common/crafting/recipes/SpellWriteRecipe.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java index 7f205996be..26abe83c3a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/SpellWriteRecipe.java @@ -47,6 +47,9 @@ public boolean doesReagentMatch(ApparatusRecipeInput input, Level level, @org.je @Override public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.annotations.Nullable Player player) { ItemEnchantments enchantments = input.catalyst().get(DataComponents.ENCHANTMENTS); + if(enchantments == null){ + return false; + } int level1 = enchantments.getLevel(HolderHelper.unwrap(level, EnchantmentRegistry.REACTIVE_ENCHANTMENT)); ItemStack parchment = getParchment(input.pedestals()); return !parchment.isEmpty() && !SpellCasterRegistry.from(parchment).getSpell().isEmpty() && level1 > 0 && super.matches(input, level, player); From 452a0355f472da59f13e2089015cca784e24f352 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 3 Nov 2024 22:02:52 -0600 Subject: [PATCH 259/363] Use full block support for intangible --- .../arsnouveau/common/block/IntangibleAirBlock.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/IntangibleAirBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/IntangibleAirBlock.java index 23e1a51fa0..f325f3d1f7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/IntangibleAirBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/IntangibleAirBlock.java @@ -29,7 +29,18 @@ public RenderShape getRenderShape(BlockState state) { return RenderShape.ENTITYBLOCK_ANIMATED; } - public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { + @Override + protected VoxelShape getBlockSupportShape(BlockState state, BlockGetter level, BlockPos pos) { + return Shapes.block(); + } + + @Override + protected VoxelShape getInteractionShape(BlockState state, BlockGetter level, BlockPos pos) { + return Shapes.empty(); + } + + @Override + protected VoxelShape getVisualShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { return Shapes.empty(); } From 17e7c00a5ea7cb9795a3f8f9ea241061ae7a0231 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 4 Nov 2024 20:22:35 -0600 Subject: [PATCH 260/363] Prevent mods from early loading rewind config #1488 --- .../common/mixin/rewind/RewindEntityMixin.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/rewind/RewindEntityMixin.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/rewind/RewindEntityMixin.java index d792d6e9ff..0920da0949 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/rewind/RewindEntityMixin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/rewind/RewindEntityMixin.java @@ -23,26 +23,26 @@ public abstract class RewindEntityMixin implements IRewindable { @Shadow public abstract Vec3 getDeltaMovement(); - @Shadow public abstract Level level(); - @Shadow public abstract void remove(Entity.RemovalReason pReason); - @Shadow public abstract boolean removeTag(String pTag); - @Shadow public abstract Vec3 position(); @Shadow public Level level; @Unique - public Stack ars_Nouveau$motions = new FixedStack<>(EffectRewind.INSTANCE.getEntityMaxTrackingTicks()); + public Stack ars_Nouveau$motions = null; @Unique public boolean an_isRewinding = false; @Inject(method = "baseTick", at = @At("TAIL")) public void onTick(CallbackInfo ci) { + // Prevent other mods from early loading Entity and causing the config to throw + if(ars_Nouveau$motions == null){ + ars_Nouveau$motions = new FixedStack<>(EffectRewind.INSTANCE.getEntityMaxTrackingTicks()); + } Entity entity = (Entity) (Object) this; if(!EffectRewind.shouldRecordData(entity, this) || level == null) { return; @@ -55,7 +55,6 @@ public void onTick(CallbackInfo ci) { ars_Nouveau$motions.push(data); } - @Inject(method = "setDeltaMovement(Lnet/minecraft/world/phys/Vec3;)V", at = @At("HEAD"), cancellable = true) protected void anSetDeltaMovement(Vec3 pDeltaMovement, CallbackInfo ci) { if(!EffectRewind.shouldAllowMovement(this)){ @@ -72,7 +71,7 @@ protected void anSetDeltaMovement(double pX, double pY, double pZ, CallbackInfo @Override public Stack getMotions() { - return ars_Nouveau$motions; + return ars_Nouveau$motions == null ? new FixedStack<>(0) : ars_Nouveau$motions; } @Override From a4fb7932726e05f2d2851441998a8606b73cc486 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 4 Nov 2024 20:53:12 -0600 Subject: [PATCH 261/363] Fix intangible being targetable --- .../arsnouveau/common/block/IntangibleAirBlock.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/IntangibleAirBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/IntangibleAirBlock.java index f325f3d1f7..b6b094f75b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/IntangibleAirBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/IntangibleAirBlock.java @@ -34,6 +34,12 @@ protected VoxelShape getBlockSupportShape(BlockState state, BlockGetter level, B return Shapes.block(); } + + @Override + protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + return Shapes.empty(); + } + @Override protected VoxelShape getInteractionShape(BlockState state, BlockGetter level, BlockPos pos) { return Shapes.empty(); @@ -44,6 +50,11 @@ protected VoxelShape getVisualShape(BlockState state, BlockGetter level, BlockPo return Shapes.empty(); } + @Override + protected VoxelShape getOcclusionShape(BlockState state, BlockGetter level, BlockPos pos) { + return Shapes.empty(); + } + @Override public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { return new IntangibleAirTile(pos, state); From 96fc29e959a09a34f6f69d9ad50b4d5b6c44f0bf Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 4 Nov 2024 20:53:21 -0600 Subject: [PATCH 262/363] Make breeze only reflect projectiles --- .../hollingsworth/arsnouveau/common/event/BreezeEvent.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/BreezeEvent.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/BreezeEvent.java index 5a9de896e4..2e0072d423 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/BreezeEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/BreezeEvent.java @@ -7,6 +7,7 @@ import com.hollingsworth.arsnouveau.api.spell.SpellResolver; import com.hollingsworth.arsnouveau.common.entity.EntityOrbitProjectile; import com.hollingsworth.arsnouveau.common.entity.EntityProjectileSpell; +import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.monster.breeze.Breeze; import net.minecraft.world.item.ItemStack; @@ -56,7 +57,8 @@ public static void onSpellResolve(SpellResolveEvent.Pre pre){ } if(hitResult instanceof EntityHitResult entityHitResult && !(pre.shooter instanceof FakePlayer fakePlayer) - && entityHitResult.getEntity() instanceof Breeze breeze){ + && entityHitResult.getEntity() instanceof Breeze breeze + && pre.resolver.spell.getCastMethod() instanceof MethodProjectile){ pre.setCanceled(true); EntityOrbitProjectile orbitProjectile = new EntityOrbitProjectile(breeze.level, new SpellResolver(SpellContext.fromEntity(pre.spell, breeze, ItemStack.EMPTY)), entityHitResult.getEntity()); breeze.level.addFreshEntity(orbitProjectile); From 50cd4f49a8387653f373d8ab062115f846df8c5b Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 4 Nov 2024 21:35:48 -0600 Subject: [PATCH 263/363] 5.2.3 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 8be62803b1..5f0eee215a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.2.2 +mod_version=5.2.3 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 716b5f6719d1814500c35f0a2dc6f0cc9bbd165b Mon Sep 17 00:00:00 2001 From: Darshan Phaldesai <51489635+dphaldes@users.noreply.github.com> Date: Wed, 6 Nov 2024 19:42:00 -0700 Subject: [PATCH 264/363] feat: make turrets and Runes use owner UUID (#1431) * Update supporters.json * feat: make turrets and tiles use owner UUID * fix: refactor ANFakePlayer * Use fakeplayer for EffectPlaceBlock also fix functions calls --------- Co-authored-by: Bailey Hollingsworth Co-authored-by: Jarva <4622609+Jarva@users.noreply.github.com> --- build.gradle | 9 +++-- .../arsnouveau/api/ANFakePlayer.java | 10 ++++++ .../arsnouveau/api/spell/AbstractCaster.java | 8 ++--- .../arsnouveau/api/spell/AbstractEffect.java | 2 +- .../arsnouveau/api/spell/IDamageEffect.java | 7 +--- .../arsnouveau/api/spell/SpellResolver.java | 19 ++++------ .../spell/wrapped_caster/IWrappedCaster.java | 7 +++- .../spell/wrapped_caster/LivingCaster.java | 18 ++++++++++ .../api/spell/wrapped_caster/RuneCaster.java | 2 +- .../api/spell/wrapped_caster/TileCaster.java | 18 ++++++++++ .../arsnouveau/api/util/BlockUtil.java | 24 +++++++------ .../arsnouveau/api/util/LootUtil.java | 2 +- .../common/block/BasicSpellTurret.java | 1 + .../arsnouveau/common/block/RuneBlock.java | 1 + .../block/tile/BasicSpellTurretTile.java | 14 +++++++- .../common/block/tile/RuneTile.java | 17 ++++++--- .../common/entity/EnchantedFallingBlock.java | 2 +- .../common/items/EnchantersSword.java | 3 +- .../arsnouveau/common/items/SpellBow.java | 2 +- .../common/items/SpellCrossbow.java | 10 ++++-- .../common/items/data/ScryCasterData.java | 2 +- .../common/ritual/RitualAwakening.java | 34 ++++++++++++------ .../common/ritual/RitualWildenSummoning.java | 35 ++++++++++++++----- .../common/spell/effect/EffectFell.java | 6 ++-- .../common/spell/effect/EffectPlaceBlock.java | 2 +- .../common/spell/effect/EffectRedstone.java | 2 +- 26 files changed, 181 insertions(+), 76 deletions(-) diff --git a/build.gradle b/build.gradle index 30720d9596..b250c92d83 100644 --- a/build.gradle +++ b/build.gradle @@ -116,10 +116,13 @@ dependencies { implementation "curse.maven:jade-324717:5444008" implementation "top.theillusivec4.curios:curios-neoforge:${curios_version}+1.21" - // use localRuntime for adding mods to env that won't be listed as dependencies in the manifest + implementation "curse.maven:ars-additions-974408:5698511" + + runtimeOnly 'curse.maven:ftb-teams-forge-404468:5631446' + runtimeOnly 'curse.maven:ftb-chunks-forge-314906:5710609' + runtimeOnly 'curse.maven:ftb-library-forge-404465:5754910' + runtimeOnly 'curse.maven:architectury-api-419699:5553800' - // localRuntime "com.alexthw.ars_elemental:ars_elemental-${minecraft_version}:0.7.0.8.9" - // localRuntime "curse.maven:ars-additions-974408:5852361" } jar { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/ANFakePlayer.java b/src/main/java/com/hollingsworth/arsnouveau/api/ANFakePlayer.java index c16d8029e2..6b2aff8bb9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/ANFakePlayer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/ANFakePlayer.java @@ -12,7 +12,10 @@ import net.minecraft.server.network.CommonListenerCookie; import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; import net.neoforged.neoforge.common.util.FakePlayer; +import net.neoforged.neoforge.common.util.FakePlayerFactory; import org.jetbrains.annotations.Nullable; import java.lang.ref.WeakReference; @@ -21,6 +24,13 @@ // https://github.com/Creators-of-Create/Create/blob/mc1.15/dev/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFakePlayer.java#L57 public class ANFakePlayer extends FakePlayer { + public static FakePlayer getOrFakePlayer(ServerLevel level, @Nullable LivingEntity player) { + return getPlayer(level, player instanceof Player ? player.getUUID() : null); + } + + public static FakePlayer getPlayer(ServerLevel level, @Nullable UUID uuid) { + return uuid != null ? FakePlayerFactory.get(level, new GameProfile(uuid, "")) : ANFakePlayer.getPlayer(level); + } private static final Connection NETWORK_MANAGER = new Connection(PacketFlow.CLIENTBOUND); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java index 0fa32aadef..7406531638 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java @@ -251,21 +251,21 @@ public Spell getSpell(Level world, LivingEntity playerEntity, InteractionHand ha return caster.getSpell(); } - public Spell modifySpellBeforeCasting(Level worldIn, @Nullable Entity playerIn, @Nullable InteractionHand handIn, Spell spell) { + public Spell modifySpellBeforeCasting(ServerLevel worldIn, @Nullable Entity playerIn, @Nullable InteractionHand handIn, Spell spell) { return spell; } public InteractionResultHolder castSpell(Level worldIn, LivingEntity entity, InteractionHand handIn, @Nullable Component invalidMessage, @NotNull Spell spell) { ItemStack stack = entity.getItemInHand(handIn); - if (worldIn.isClientSide) + if (!(worldIn instanceof ServerLevel serverLevel)) return InteractionResultHolder.pass(entity.getItemInHand(handIn)); - spell = modifySpellBeforeCasting(worldIn, entity, handIn, spell); + spell = modifySpellBeforeCasting(serverLevel, entity, handIn, spell); if (!spell.isValid() && invalidMessage != null) { PortUtil.sendMessageNoSpam(entity, invalidMessage); return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); } - Player player = entity instanceof Player thisPlayer ? thisPlayer : ANFakePlayer.getPlayer((ServerLevel) worldIn); + Player player = ANFakePlayer.getOrFakePlayer(serverLevel, entity); IWrappedCaster wrappedCaster = entity instanceof Player pCaster ? new PlayerCaster(pCaster) : new LivingCaster(entity); SpellResolver resolver = getSpellResolver(new SpellContext(worldIn, spell, entity, wrappedCaster, stack), worldIn, player, handIn); boolean isSensitive = resolver.spell.getBuffsAtIndex(0, entity, AugmentSensitive.INSTANCE) > 0; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractEffect.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractEffect.java index 4c31210a4d..e05d1b0ead 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractEffect.java @@ -89,7 +89,7 @@ public void summonLivingEntity(HitResult rayTraceResult, Level world, @NotNull L } public Player getPlayer(LivingEntity entity, ServerLevel world) { - return entity instanceof Player player ? player : ANFakePlayer.getPlayer(world); + return entity instanceof Player player ? player : ANFakePlayer.getPlayer(world, entity.getUUID()); } public int getBaseHarvestLevel(SpellStats stats) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/IDamageEffect.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/IDamageEffect.java index d6e4d88102..49a51ec82d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/IDamageEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/IDamageEffect.java @@ -4,18 +4,14 @@ import com.hollingsworth.arsnouveau.api.event.SpellDamageEvent; import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import com.hollingsworth.arsnouveau.api.util.DamageUtil; -import com.hollingsworth.arsnouveau.common.mixin.looting.*; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentFortune; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentRandomize; import com.hollingsworth.arsnouveau.setup.registry.DamageTypesRegistry; -import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.NotNull; @@ -83,7 +79,6 @@ default int randomRolls(SpellStats stats, ServerLevel server) { * @return Player-Based Damage Source, will use Ars FakePlayer if the source is not a Player */ default DamageSource buildDamageSource(Level world, LivingEntity shooter) { - return DamageUtil.source(world, DamageTypesRegistry.GENERIC_SPELL_DAMAGE, !(shooter instanceof Player player) ? ANFakePlayer.getPlayer((ServerLevel) world) : player); + return DamageUtil.source(world, DamageTypesRegistry.GENERIC_SPELL_DAMAGE, ANFakePlayer.getOrFakePlayer((ServerLevel) world, shooter)); } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java index df72e5bc80..e667a4d24a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellResolver.java @@ -70,14 +70,12 @@ public boolean canCast(LivingEntity entity) { protected boolean enoughMana(LivingEntity entity) { int totalCost = getResolveCost(); - IManaCap manaCap = CapabilityRegistry.getMana(entity); - if (manaCap == null) - return false; - boolean canCast = totalCost <= manaCap.getCurrentMana() || (entity instanceof Player player && player.isCreative()); - if (!canCast && !entity.getCommandSenderWorld().isClientSide && !silent) { - PortUtil.sendMessageNoSpam(entity, Component.translatable("ars_nouveau.spell.no_mana")); - if (entity instanceof ServerPlayer serverPlayer) - Networking.sendToPlayerClient(new NotEnoughManaPacket(totalCost), serverPlayer); + boolean enoughMana = spellContext.getCaster().enoughMana(totalCost); + + boolean canCast = enoughMana || (entity instanceof Player player && player.isCreative()); + if (!canCast && entity instanceof ServerPlayer serverPlayer && !silent) { + PortUtil.sendMessageNoSpam(serverPlayer, Component.translatable("ars_nouveau.spell.no_mana")); + Networking.sendToPlayerClient(new NotEnoughManaPacket(totalCost), serverPlayer); } return canCast; } @@ -197,10 +195,7 @@ public void resume(Level world){ public void expendMana() { int totalCost = getResolveCost(); - var mana = CapabilityRegistry.getMana(spellContext.getUnwrappedCaster()); - if(mana != null){ - mana.removeMana(totalCost); - } + spellContext.getCaster().expendMana(totalCost); } /** diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/IWrappedCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/IWrappedCaster.java index ccdf0331da..3644bc2400 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/IWrappedCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/IWrappedCaster.java @@ -40,8 +40,13 @@ default Direction getFacingDirection(){ return null; } - default Vec3 getPosition(){ return Vec3.ZERO; } + + default boolean enoughMana(int totalCost) { + return false; + } + + void expendMana(int totalCost); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/LivingCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/LivingCaster.java index dd871a34d2..fcb7bca23b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/LivingCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/LivingCaster.java @@ -1,7 +1,10 @@ package com.hollingsworth.arsnouveau.api.spell.wrapped_caster; import com.hollingsworth.arsnouveau.api.item.inv.FilterableItemHandler; +import com.hollingsworth.arsnouveau.api.mana.IManaCap; import com.hollingsworth.arsnouveau.api.spell.SpellContext; +import com.hollingsworth.arsnouveau.common.capability.ManaCap; +import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import net.minecraft.core.Direction; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -51,4 +54,19 @@ public Direction getFacingDirection() { public Vec3 getPosition() { return livingEntity.position(); } + + @Override + public boolean enoughMana(int totalCost) { + IManaCap mana = CapabilityRegistry.getMana(livingEntity); + if (mana == null) return false; + return totalCost <= mana.getCurrentMana(); + } + + @Override + public void expendMana(int totalCost) { + IManaCap mana = CapabilityRegistry.getMana(livingEntity); + if (mana != null) { + mana.removeMana(totalCost); + } + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/RuneCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/RuneCaster.java index f43b90adf3..6056f372d6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/RuneCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/RuneCaster.java @@ -10,7 +10,7 @@ import java.util.ArrayList; import java.util.List; -public class RuneCaster extends TileCaster{ +public class RuneCaster extends TileCaster { public RuneCaster(RuneTile tile, SpellContext.CasterType casterType) { super(tile, casterType); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/TileCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/TileCaster.java index 46f2c91b6a..44c4e65eb1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/TileCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/TileCaster.java @@ -3,6 +3,8 @@ import com.hollingsworth.arsnouveau.api.item.inv.FilterableItemHandler; import com.hollingsworth.arsnouveau.api.spell.SpellContext; import com.hollingsworth.arsnouveau.api.util.InvUtil; +import com.hollingsworth.arsnouveau.api.util.SourceUtil; +import com.hollingsworth.arsnouveau.common.block.tile.BasicSpellTurretTile; import net.minecraft.core.Direction; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -59,4 +61,20 @@ public BlockEntity getNearbyBlockEntity(Predicate predicate) { public Vec3 getPosition() { return new Vec3(tile.getBlockPos().getX(), tile.getBlockPos().getY(), tile.getBlockPos().getZ()); } + + @Override + public boolean enoughMana(int totalCost) { + if (tile instanceof BasicSpellTurretTile spellTurretTile) { + return SourceUtil.hasSourceNearby(tile.getBlockPos(), tile.getLevel(), 10, spellTurretTile.getManaCost()); + } + return false; + } + + @Override + public void expendMana(int totalCost) { + if (tile instanceof BasicSpellTurretTile spellTurretTile) { + if (spellTurretTile.getManaCost() <= 0) return; + SourceUtil.takeSourceWithParticles(tile.getBlockPos(), tile.getLevel(), 10, spellTurretTile.getManaCost()); + } + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java index 9b58f1376d..30b2de0ba5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/BlockUtil.java @@ -89,18 +89,20 @@ public static double distanceFrom(Vec3 start, Vec3 end) { } public static boolean destroyBlockSafely(Level world, BlockPos pos, boolean dropBlock, LivingEntity caster) { - if (!(world instanceof ServerLevel)) + if (!(world instanceof ServerLevel serverLevel)) return false; - Player playerEntity = caster instanceof Player ? (Player) caster : ANFakePlayer.getPlayer((ServerLevel) world); + Player playerEntity = ANFakePlayer.getOrFakePlayer(serverLevel, caster); if (ANEventBus.post(new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), playerEntity))) return false; world.getBlockState(pos).getBlock().playerWillDestroy(world, pos, world.getBlockState(pos), playerEntity); return world.destroyBlock(pos, dropBlock); - } - public static boolean destroyRespectsClaim(Entity caster, Level world, BlockPos pos) { - Player playerEntity = caster instanceof Player ? (Player) caster : ANFakePlayer.getPlayer((ServerLevel) world); + public static boolean destroyRespectsClaim(LivingEntity caster, Level world, BlockPos pos) { + if (!(world instanceof ServerLevel serverLevel)) + return false; + + Player playerEntity = ANFakePlayer.getOrFakePlayer(serverLevel, caster); return !ANEventBus.post(new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), playerEntity)); } @@ -113,26 +115,28 @@ public static void safelyUpdateState(Level world, BlockPos pos) { safelyUpdateState(world, pos, world.getBlockState(pos)); } + @Deprecated public static boolean destroyBlockSafelyWithoutSound(Level world, BlockPos pos, boolean dropBlock) { return destroyBlockWithoutSound(world, pos, dropBlock, null); } - public static boolean destroyBlockSafelyWithoutSound(Level world, BlockPos pos, boolean dropBlock, @Nullable LivingEntity caster) { - if (!(world instanceof ServerLevel)) + public static boolean destroyBlockSafelyWithoutSound(Level world, BlockPos pos, boolean dropBlock, LivingEntity caster) { + if (!(world instanceof ServerLevel serverLevel)) return false; - Player playerEntity = caster instanceof Player ? (Player) caster : ANFakePlayer.getPlayer((ServerLevel) world); + Player playerEntity = ANFakePlayer.getOrFakePlayer(serverLevel, caster); if (ANEventBus.post(new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), playerEntity))) return false; - return destroyBlockWithoutSound(world, pos, dropBlock); + return destroyBlockWithoutSound(world, pos, dropBlock, playerEntity); } + @Deprecated private static boolean destroyBlockWithoutSound(Level world, BlockPos pos, boolean dropBlock) { return destroyBlockWithoutSound(world, pos, dropBlock, null); } - private static boolean destroyBlockWithoutSound(Level world, BlockPos pos, boolean isMoving, @Nullable Entity entityIn) { + private static boolean destroyBlockWithoutSound(Level world, BlockPos pos, boolean isMoving, LivingEntity entityIn) { BlockState blockstate = world.getBlockState(pos); if (blockstate.isAir()) { return false; diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/LootUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/LootUtil.java index 595ad3d2b2..4f63ff620d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/LootUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/LootUtil.java @@ -52,7 +52,7 @@ public static LootParams.Builder getLootingContext(ServerLevel world, LivingEnti return new LootParams.Builder(world) .withParameter(LootContextParams.THIS_ENTITY, slainEntity) .withParameter(LootContextParams.ORIGIN, new Vec3(slainEntity.getX(), slainEntity.getY(), slainEntity.getZ())) - .withParameter(LootContextParams.LAST_DAMAGE_PLAYER, player) + .withParameter(LootContextParams.LAST_DAMAGE_PLAYER, ANFakePlayer.getOrFakePlayer(world, player)) .withParameter(LootContextParams.DAMAGE_SOURCE, source) .withOptionalParameter(LootContextParams.DIRECT_ATTACKING_ENTITY, player) .withParameter(LootContextParams.ATTACKING_ENTITY, player) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java index 02d4cfaf07..f9009c539a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/BasicSpellTurret.java @@ -173,6 +173,7 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { } if (worldIn.getBlockEntity(pos) instanceof BasicSpellTurretTile tile) { tile.setSpell(spell); + tile.setPlayer(player.getUUID()); tile.updateBlock(); PortUtil.sendMessage(player, Component.translatable("ars_nouveau.alert.spell_set")); worldIn.sendBlockUpdated(pos, state, state, 2); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/RuneBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/RuneBlock.java index feaf71f76a..b6bea8c8ba 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/RuneBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/RuneBlock.java @@ -85,6 +85,7 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level return ItemInteractionResult.SUCCESS; } runeTile.setSpell(spell); + runeTile.setPlayer(player.getUUID()); PortUtil.sendMessage(player, Component.translatable("ars_nouveau.spell_set")); } return super.useItemOn(stack, state, worldIn, pos, player, handIn, hit); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java index aa9cc0785a..b452a5892b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java @@ -14,6 +14,7 @@ import com.hollingsworth.arsnouveau.common.network.PacketOneShotAnimation; import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.mojang.authlib.GameProfile; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; @@ -26,6 +27,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.capabilities.ICapabilityProvider; import net.neoforged.neoforge.common.util.FakePlayer; +import net.neoforged.neoforge.common.util.FakePlayerFactory; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -33,11 +35,13 @@ import software.bernie.geckolib.util.GeckoLibUtil; import java.util.List; +import java.util.UUID; public class BasicSpellTurretTile extends ModdedTile implements ITooltipProvider, GeoBlockEntity, IAnimationListener, ITickable, ICapabilityProvider { boolean playRecoil; protected SpellCaster spellCaster = new SpellCaster(0, null, false, null, 1); + private @Nullable UUID uuid = null; public BasicSpellTurretTile(BlockEntityType p_i48289_1_, BlockPos pos, BlockState state) { super(p_i48289_1_, pos, state); @@ -51,6 +55,10 @@ public int getManaCost() { return this.spellCaster.getSpell().getCost(); } + public void setPlayer(UUID uuid) { + this.uuid = uuid; + } + public void setSpell(Spell spell){ this.spellCaster = this.spellCaster.setSpell(spell, 0); } @@ -66,7 +74,9 @@ public void shootSpell(){ Networking.sendToNearbyClient(level, pos, new PacketOneShotAnimation(pos)); Position iposition = BasicSpellTurret.getDispensePosition(pos, level.getBlockState(pos).getValue(BasicSpellTurret.FACING)); Direction direction = level.getBlockState(pos).getValue(BasicSpellTurret.FACING); - FakePlayer fakePlayer = ANFakePlayer.getPlayer(level); + FakePlayer fakePlayer = uuid != null + ? FakePlayerFactory.get(level, new GameProfile(uuid, "")) + : ANFakePlayer.getPlayer(level); fakePlayer.setPos(pos.getX(), pos.getY(), pos.getZ()); EntitySpellResolver resolver = new EntitySpellResolver(new SpellContext(level, spellCaster.getSpell(), fakePlayer, new TileCaster(this, SpellContext.CasterType.TURRET))); if (resolver.castType != null && BasicSpellTurret.TURRET_BEHAVIOR_MAP.containsKey(resolver.castType)) { @@ -79,12 +89,14 @@ public void shootSpell(){ protected void saveAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { super.saveAdditional(pTag, pRegistries); pTag.put("spell_caster", ANCodecs.encode(SpellCaster.CODEC.codec(), spellCaster)); + if (uuid != null) pTag.putUUID("uuid", uuid); } @Override protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) { super.loadAdditional(pTag, pRegistries); this.spellCaster = ANCodecs.decode(SpellCaster.CODEC.codec(), pTag.get("spell_caster")); + if (pTag.contains("uuid")) uuid = pTag.getUUID("uuid"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java index dcfb70132c..4ad6fee068 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java @@ -18,6 +18,7 @@ import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModPotions; +import com.mojang.authlib.GameProfile; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; @@ -28,6 +29,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.common.util.FakePlayerFactory; import software.bernie.geckolib.animatable.GeoBlockEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; @@ -44,7 +46,7 @@ public class RuneTile extends ModdedTile implements GeoBlockEntity, ITickable, I public boolean isCharged; public boolean isSensitive; public int ticksUntilCharge; - public UUID uuid; + public UUID uuid = null; public Entity touchedEntity; public RuneTile(BlockPos pos, BlockState state) { @@ -63,13 +65,14 @@ public void setSpell(Spell spell) { public void castSpell(Entity entity) { if (entity == null) return; - if (!this.isCharged || spell.isEmpty() || !(level instanceof ServerLevel) || !(spell.get(0) instanceof MethodTouch)) + if (!this.isCharged || spell.isEmpty() || !(level instanceof ServerLevel serverLevel) || !(spell.get(0) instanceof MethodTouch)) return; if (!this.isTemporary && this.disabled) return; try { - - Player playerEntity = uuid != null ? level.getPlayerByUUID(uuid) : ANFakePlayer.getPlayer((ServerLevel) level); - playerEntity = !this.isSensitive || playerEntity == null ? ANFakePlayer.getPlayer((ServerLevel) level) : playerEntity; + Player playerEntity = uuid != null ? FakePlayerFactory.get(serverLevel, new GameProfile(uuid, "")) : ANFakePlayer.getPlayer(serverLevel); + if (this.isSensitive) { + playerEntity = serverLevel.getPlayerByUUID(uuid); + } EntitySpellResolver resolver = new EntitySpellResolver(new SpellContext(entity.level, spell, playerEntity, new RuneCaster(this, SpellContext.CasterType.RUNE))); resolver.onCastOnEntity(ItemStack.EMPTY, entity, InteractionHand.MAIN_HAND); if (this.isTemporary) { @@ -88,6 +91,10 @@ public void castSpell(Entity entity) { } } + public void setPlayer(UUID uuid) { + this.uuid = uuid; + } + @Override public void saveAdditional(CompoundTag tag, HolderLookup.Provider pRegistries) { super.saveAdditional(tag, pRegistries); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java index fc528e4768..c8bc5ac976 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java @@ -132,7 +132,7 @@ public static boolean canFall(Level level, BlockPos pos, Entity owner, SpellStat || level.getBlockEntity(pos) instanceof SkullBlockEntity))) { return false; } - return BlockUtil.canBlockBeHarvested(spellStats, level, pos) && BlockUtil.destroyRespectsClaim(owner, level, pos); + return BlockUtil.canBlockBeHarvested(spellStats, level, pos) && BlockUtil.destroyRespectsClaim((LivingEntity) owner, level, pos); } public static @Nullable EnchantedFallingBlock fall(Level level, BlockPos pos, Entity owner, SpellContext context, SpellResolver resolver, SpellStats spellStats) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java index 0cee1e60d0..d05fbf86cc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java @@ -15,6 +15,7 @@ import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; @@ -78,7 +79,7 @@ public void scribeModifiedSpell(AbstractCaster caster, Player player, Interac public boolean hurtEnemy(@NotNull ItemStack stack, LivingEntity target, @NotNull LivingEntity entity) { AbstractCaster caster = getSpellCaster(stack); IWrappedCaster wrappedCaster = entity instanceof Player player ? new PlayerCaster(player) : new LivingCaster(entity); - SpellContext context = new SpellContext(entity.level, caster.modifySpellBeforeCasting(target.level, entity, InteractionHand.MAIN_HAND, caster.getSpell()), entity, wrappedCaster, stack); + SpellContext context = new SpellContext(entity.level, caster.modifySpellBeforeCasting((ServerLevel) target.level, entity, InteractionHand.MAIN_HAND, caster.getSpell()), entity, wrappedCaster, stack); SpellResolver resolver = entity instanceof Player ? new SpellResolver(context) : new EntitySpellResolver(context); EntityHitResult entityRes = new EntityHitResult(target); resolver.onCastOnEntity(stack, entityRes.getEntity(), InteractionHand.MAIN_HAND); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java index 5c83a907f6..ed7f98cada 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java @@ -155,7 +155,7 @@ public void releaseUsing(@NotNull ItemStack bowStack, @NotNull Level worldIn, @N abstractarrowentity = customArrow(abstractarrowentity, arrowStack, bowStack); List arrows = new ArrayList<>(); - SpellResolver resolver = new SpellResolver(new SpellContext(worldIn, caster.modifySpellBeforeCasting(worldIn, entityLiving, InteractionHand.MAIN_HAND, caster.getSpell()), playerentity, new PlayerCaster(playerentity), bowStack)); + SpellResolver resolver = new SpellResolver(new SpellContext(worldIn, caster.modifySpellBeforeCasting((ServerLevel) worldIn, entityLiving, InteractionHand.MAIN_HAND, caster.getSpell()), playerentity, new PlayerCaster(playerentity), bowStack)); if (arrowitem instanceof SpellArrow) { if (!(resolver.canCast(playerentity))) { return; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java index f742623ea4..f2eacca532 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java @@ -15,6 +15,7 @@ import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; @@ -81,6 +82,10 @@ public void releaseUsing(@NotNull ItemStack pStack, @NotNull Level pLevel, @NotN } private boolean tryLoadProjectiles(LivingEntity pShooter, ItemStack pCrossbowStack) { + if(pShooter.level().isClientSide){ + return true; + } + int multishotLevel = EnchantmentHelper.getTagEnchantmentLevel(pShooter.level.holderOrThrow(Enchantments.MULTISHOT), pCrossbowStack); int numProjectiles = multishotLevel == 0 ? 1 : 3; boolean isCreative = pShooter instanceof Player && ((Player)pShooter).getAbilities().instabuild; @@ -88,7 +93,7 @@ private boolean tryLoadProjectiles(LivingEntity pShooter, ItemStack pCrossbowSta ItemStack ammoCopy = ammoStack.copy(); AbstractCaster caster = getSpellCaster(pCrossbowStack); - SpellResolver resolver = new SpellResolver(new SpellContext(pShooter.level, caster.modifySpellBeforeCasting(pShooter.level, pShooter, InteractionHand.MAIN_HAND, caster.getSpell()), pShooter, LivingCaster.from(pShooter), pCrossbowStack)); + SpellResolver resolver = new SpellResolver(new SpellContext(pShooter.level, caster.modifySpellBeforeCasting((ServerLevel) pShooter.level, pShooter, InteractionHand.MAIN_HAND, caster.getSpell()), pShooter, LivingCaster.from(pShooter), pCrossbowStack)); boolean consumedMana = false; if(!(pShooter instanceof Player) || resolver.withSilent(true).canCast(pShooter)){ @@ -139,7 +144,8 @@ public void shootOne(Level worldIn, LivingEntity pShooter, InteractionHand pHand } LivingCaster livingCaster = pShooter instanceof Player ? new PlayerCaster((Player)pShooter) : new LivingCaster(pShooter); AbstractCaster caster = getSpellCaster(pCrossbowStack); - SpellResolver resolver = new SpellResolver(new SpellContext(worldIn, caster.modifySpellBeforeCasting(worldIn, pShooter, InteractionHand.MAIN_HAND, caster.getSpell()), pShooter, livingCaster, pCrossbowStack)); + SpellResolver resolver = new SpellResolver(new SpellContext(worldIn, caster.modifySpellBeforeCasting((ServerLevel) worldIn, pShooter, + InteractionHand.MAIN_HAND, caster.getSpell()), pShooter, livingCaster, pCrossbowStack)); if (isSpell) { projectile = buildSpellArrow(worldIn, pShooter, caster, pCrossbowStack, pAmmoStack); ((EntitySpellArrow) projectile).pierceLeft += EnchantmentHelper.getTagEnchantmentLevel(worldIn.holderOrThrow(Enchantments.PIERCING), pCrossbowStack); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java index bfcdf4e2c0..d5c9457ce5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/ScryCasterData.java @@ -64,7 +64,7 @@ public InteractionResultHolder castSpell(Level worldIn, LivingEntity if (worldIn.isClientSide) return InteractionResultHolder.pass(entity.getItemInHand(handIn)); - spell = modifySpellBeforeCasting(worldIn, entity, handIn, spell); + spell = modifySpellBeforeCasting((ServerLevel) worldIn, entity, handIn, spell); if (!spell.isValid() && invalidMessage != null) { PortUtil.sendMessageNoSpam(entity, invalidMessage); return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAwakening.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAwakening.java index a9fcdac536..adfc5c4da1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAwakening.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAwakening.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.common.ritual; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.ANFakePlayer; import com.hollingsworth.arsnouveau.api.ritual.AbstractRitual; import com.hollingsworth.arsnouveau.api.util.BlockUtil; import com.hollingsworth.arsnouveau.api.util.SpellUtil; @@ -19,26 +20,37 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.WritableBookItem; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.common.util.FakePlayer; +import org.jetbrains.annotations.Nullable; import java.util.Set; +import java.util.UUID; public class RitualAwakening extends AbstractRitual { EntityType entity = null; BlockPos foundPos; + UUID uuid; - public void destroyTree(Level world, Set set) { + @Override + public void onStart(@Nullable Player player) { + if (player != null) uuid = player.getUUID(); + } + + public void destroyTree(ServerLevel world, Set set) { + FakePlayer fakePlayer = ANFakePlayer.getPlayer(world, uuid); for (BlockPos p : set) { - BlockUtil.destroyBlockSafelyWithoutSound(world, p, false); + BlockUtil.destroyBlockSafelyWithoutSound(world, p, false, fakePlayer); } } - public void findTargets(Level world) { + public void findTargets(ServerLevel world) { for (BlockPos p : BlockPos.withinManhattan(getPos(), 3, 1, 3)) { Set blazing = SpellUtil.DFSBlockstates(world, p, 350, (b) -> b.getBlock() == BlockRegistry.BLAZING_LOG.get() || b.getBlock() == BlockRegistry.BLAZING_LEAVES.get()); if (blazing.size() >= 50) { @@ -93,28 +105,28 @@ protected void tick() { pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5); } } - if (!world.isClientSide && world.getGameTime() % 20 == 0) { + if (world instanceof ServerLevel serverLevel && serverLevel.getGameTime() % 20 == 0) { if(isBookwyrms()){ int progress = getProgress(); int numBookwyrms = getConsumedItems().stream().filter(i -> i.getItem() instanceof WritableBookItem).mapToInt(ItemStack::getCount).sum(); if(progress < numBookwyrms){ ItemStack charm = new ItemStack(ItemsRegistry.BOOKWYRM_CHARM); - ItemEntity itemEntity = new ItemEntity(world, getPos().getX() + 0.5, getPos().getY() + 1, getPos().getZ() + 0.5, charm); + ItemEntity itemEntity = new ItemEntity(serverLevel, getPos().getX() + 0.5, getPos().getY() + 1, getPos().getZ() + 0.5, charm); float range = 0.1f; itemEntity.setDeltaMovement(ParticleUtil.inRange(-range, range), ParticleUtil.inRange(0.4, 0.6), ParticleUtil.inRange(-range, range)); - getWorld().playSound(null, getPos(), SoundEvents.BOOK_PAGE_TURN, SoundSource.BLOCKS, 1.0F, 1.0F); - world.addFreshEntity(itemEntity); + serverLevel.playSound(null, getPos(), SoundEvents.BOOK_PAGE_TURN, SoundSource.BLOCKS, 1.0F, 1.0F); + serverLevel.addFreshEntity(itemEntity); }else{ setFinished(); } }else { if (getProgress() > 5) { - findTargets(world); + findTargets(serverLevel); if (entity != null) { - ParticleUtil.spawnPoof((ServerLevel) world, foundPos); - LivingEntity walker = entity.create(world); + ParticleUtil.spawnPoof(serverLevel, foundPos); + LivingEntity walker = entity.create(serverLevel); walker.setPos(foundPos.getX() + 0.5, foundPos.getY(), foundPos.getZ() + 0.5); - world.addFreshEntity(walker); + serverLevel.addFreshEntity(walker); setFinished(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java index 034e35ef4f..24f5b32625 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.common.ritual; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.ANFakePlayer; import com.hollingsworth.arsnouveau.api.ritual.AbstractRitual; import com.hollingsworth.arsnouveau.api.util.BlockUtil; import com.hollingsworth.arsnouveau.api.util.SpellUtil; @@ -10,28 +11,44 @@ import com.hollingsworth.arsnouveau.common.entity.WildenStalker; import com.hollingsworth.arsnouveau.common.lib.RitualLib; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import com.mojang.authlib.GameProfile; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.common.util.FakePlayer; +import net.neoforged.neoforge.common.util.FakePlayerFactory; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; import static com.hollingsworth.arsnouveau.common.datagen.ItemTagProvider.WILDEN_DROP_TAG; public class RitualWildenSummoning extends AbstractRitual { + private UUID uuid; + + @Override + public void onStart(@Nullable Player player) { + if (player != null) this.uuid = player.getUUID(); + } + @Override protected void tick() { WildenChimera.spawnPhaseParticles(getPos().above(), getWorld(), 1); if (getWorld().getGameTime() % 20 == 0) incrementProgress(); - if (getWorld().getGameTime() % 60 == 0 && !getWorld().isClientSide) { + if (getWorld().getGameTime() % 60 == 0 && (getWorld() instanceof ServerLevel serverLevel)) { + FakePlayer fakePlayer = ANFakePlayer.getPlayer(serverLevel, uuid); if (!isBossSpawn()) { int wild = rand.nextInt(3); BlockPos summonPos = getPos().above().east(rand.nextInt(3) - rand.nextInt(6)).north(rand.nextInt(3) - rand.nextInt(6)); Mob mobEntity = switch (wild) { - case 0 -> new WildenStalker(getWorld()); - case 1 -> new WildenGuardian(getWorld()); - default -> new WildenHunter(getWorld()); + case 0 -> new WildenStalker(serverLevel); + case 1 -> new WildenGuardian(serverLevel); + default -> new WildenHunter(serverLevel); }; summon(mobEntity, summonPos); if (getProgress() >= 15) { @@ -39,15 +56,15 @@ protected void tick() { } } else { if (getProgress() >= 8) { - WildenChimera chimera = new WildenChimera(getWorld()); + WildenChimera chimera = new WildenChimera(serverLevel); summon(chimera, getPos().above()); for(BlockPos b : BlockPos.betweenClosed(getPos().east(5).north(5).above(), getPos().west(5).south(5).above(5))){ - if (!net.neoforged.neoforge.event.EventHooks.canEntityGrief(this.getWorld(), chimera)) { + if (!net.neoforged.neoforge.event.EventHooks.canEntityGrief(serverLevel, chimera)) { continue; } - if (getWorld().getBlockState(b).getDestroySpeed(getWorld(), b) < 0) continue; - if (SpellUtil.isCorrectHarvestLevel(4, this.getWorld().getBlockState(b))) { - BlockUtil.destroyBlockSafelyWithoutSound(getWorld(), b, true); + if (serverLevel.getBlockState(b).getDestroySpeed(serverLevel, b) < 0) continue; + if (SpellUtil.isCorrectHarvestLevel(4, serverLevel.getBlockState(b))) { + BlockUtil.destroyBlockSafelyWithoutSound(serverLevel, b, true, fakePlayer); } } setFinished(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFell.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFell.java index e211ddbf03..2bc6832a19 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFell.java @@ -43,14 +43,14 @@ public void onResolveBlock(BlockHitResult ray, Level world, @NotNull LivingEntit return; if (spellStats.hasBuff(AugmentExtract.INSTANCE)) { world.getBlockState(listPos).getDrops(LootUtil.getSilkContext((ServerLevel) world, listPos, shooter)).forEach(i -> world.addFreshEntity(new ItemEntity(world, listPos.getX(), listPos.getY(), listPos.getZ(), i))); - BlockUtil.destroyBlockSafelyWithoutSound(world, listPos, false); + BlockUtil.destroyBlockSafelyWithoutSound(world, listPos, false, shooter); } else if (spellStats.hasBuff(AugmentFortune.INSTANCE)) { world.getBlockState(listPos) .getDrops(LootUtil.getFortuneContext((ServerLevel) world, listPos, shooter, spellStats.getBuffCount(AugmentFortune.INSTANCE))) .forEach(i -> world.addFreshEntity(new ItemEntity(world, listPos.getX(), listPos.getY(), listPos.getZ(), i))); - BlockUtil.destroyBlockSafelyWithoutSound(world, listPos, false); + BlockUtil.destroyBlockSafelyWithoutSound(world, listPos, false, shooter); } else { - BlockUtil.destroyBlockSafelyWithoutSound(world, listPos, true); + BlockUtil.destroyBlockSafelyWithoutSound(world, listPos, true, shooter); } }); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java index b5064bb7ab..f6d412e4d4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java @@ -41,7 +41,7 @@ private EffectPlaceBlock() { @Override public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { List posList = SpellUtil.calcAOEBlocks(shooter, rayTraceResult.getBlockPos(), rayTraceResult, spellStats); - FakePlayer fakePlayer = ANFakePlayer.getPlayer((ServerLevel) world); + FakePlayer fakePlayer = ANFakePlayer.getOrFakePlayer((ServerLevel) world, shooter); for (BlockPos pos1 : posList) { if (!world.isInWorldBounds(pos1)) continue; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java index b6a3941bff..a73b6c4fb3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java @@ -41,7 +41,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull int timeBonus = (int) spellStats.getDurationMultiplier(); int delay = Math.max(GENERIC_INT.get() + timeBonus * BONUS_TIME.get(), 2); List posList = SpellUtil.calcAOEBlocks(shooter, rayTraceResult.getBlockPos(), rayTraceResult, spellStats); - FakePlayer fakePlayer = ANFakePlayer.getPlayer((ServerLevel) world); + FakePlayer fakePlayer = ANFakePlayer.getOrFakePlayer((ServerLevel) world, shooter); for (BlockPos pos1 : posList) { if (spellStats.isSensitive()) { if (!world.isInWorldBounds(pos1)) From 33cd971be8b1cfe65836c152173bf7bc32a13cde Mon Sep 17 00:00:00 2001 From: Jarva <4622609+Jarva@users.noreply.github.com> Date: Thu, 7 Nov 2024 02:57:08 +0000 Subject: [PATCH 265/363] feat: add patchouli install message when opening the wiki (#1424) * Update supporters.json * feat: add patchouli install message when opening the wiki * feat: update dependency missing message * comment out aa --------- Co-authored-by: Bailey Hollingsworth --- build.gradle | 4 +- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 +- .../d0c924a870929ce1baf161c329e85242236b3530 | 4 +- .../assets/ars_nouveau/lang/en_us.json | 2 + .../tags/entity_type/familiar.json | 3 +- .../arsnouveau/client/gui/GuiUtils.java | 47 +++++++++++++++++++ .../client/gui/book/GuiSpellBook.java | 10 +--- .../common/datagen/EntityTagProvider.java | 2 +- .../common/datagen/LangDatagen.java | 3 +- .../arsnouveau/common/items/WornNotebook.java | 14 ++---- 10 files changed, 66 insertions(+), 27 deletions(-) diff --git a/build.gradle b/build.gradle index b250c92d83..50b8149c60 100644 --- a/build.gradle +++ b/build.gradle @@ -103,7 +103,7 @@ dependencies { implementation "software.bernie.geckolib:geckolib-neoforge-1.21.1:${geckolib_version}" // - implementation(jarJar(group: 'vazkii.patchouli', name: 'Patchouli', version: '[1.21,)') { + compileOnly(jarJar(group: 'vazkii.patchouli', name: 'Patchouli', version: '[1.21,)') { jarJar.pin(it, patchouli_version) }) @@ -116,7 +116,7 @@ dependencies { implementation "curse.maven:jade-324717:5444008" implementation "top.theillusivec4.curios:curios-neoforge:${curios_version}+1.21" - implementation "curse.maven:ars-additions-974408:5698511" +// implementation "curse.maven:ars-additions-974408:5698511" runtimeOnly 'curse.maven:ftb-teams-forge-404468:5631446' runtimeOnly 'curse.maven:ftb-chunks-forge-314906:5710609' diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index e5a254fde2..583e5e14fc 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-11-03T08:59:37.0587828 Languages: en_us for mod: ars_nouveau -47b48e067238f53a7a403b5ac51fcd83cfddf29c assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-11-06T20:55:11.2196957 Languages: en_us for mod: ars_nouveau +c18a6b328844f2b6086ed3eb28ae3b9e6dd4082c assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 b/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 index cce38dc9cb..61b14ef544 100644 --- a/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 +++ b/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 @@ -1,4 +1,4 @@ -// 1.21.1 2024-11-03T08:55:51.1524375 Tags for minecraft:entity_type mod id ars_nouveau +// 1.21.1 2024-11-06T20:55:11.216698 Tags for minecraft:entity_type mod id ars_nouveau 4d0235b95823f5d315aae7e9f9e484cbde8294a0 data/ars_nouveau/tags/entity_type/animal_summon_blacklist.json a958530eef4b0d5ac2f1c7bd552b60e23cb66d9a data/ars_nouveau/tags/entity_type/an_hostile.json 290c285b1e334d322b8d070b2c6a071114b1d70c data/ars_nouveau/tags/entity_type/berry_blacklist.json @@ -6,7 +6,7 @@ a958530eef4b0d5ac2f1c7bd552b60e23cb66d9a data/ars_nouveau/tags/entity_type/an_ho 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_type/disintegration_blacklist.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_type/disintegration_whitelist.json 29671cfa11d074462c259806e9d60468451e3cdb data/ars_nouveau/tags/entity_type/drygmy_blacklist.json -37c0c70962a460e0c2d62b6dafe0ee563c8773d4 data/ars_nouveau/tags/entity_type/familiar.json +d7241e9bb8f594e377c93623dbf68fe446f1b65f data/ars_nouveau/tags/entity_type/familiar.json 626ec463a66bcda15fd17dfe131322f296b2ff38 data/ars_nouveau/tags/entity_type/jar_blacklist.json e00f2931577049b9a4400a87ed9c249373be376c data/ars_nouveau/tags/entity_type/jar_release_blacklist.json 81129e21b3ae9fc2579ae17d4c228b76271a2b4d data/ars_nouveau/tags/entity_type/jar_whitelist.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index aeced98877..9013eedebc 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -159,6 +159,7 @@ "ars_nouveau.crafting": "Crafting: %s", "ars_nouveau.crafting_progress": "Crafting Progress: %s", "ars_nouveau.crush_recipe": "Crush Glyph", + "ars_nouveau.dependency.install": "Open mod page", "ars_nouveau.discord_text": "Join Discord!", "ars_nouveau.dominion_wand.clear": "Clear", "ars_nouveau.dominion_wand.cleared": "Dominion wand cleared.", @@ -658,6 +659,7 @@ "ars_nouveau.page7.wilden": "The Chimera is a worthy fight for a caster with Tier 2 spells and equipment. The Chimera resists cold damage, and a variety of spells including buffs, dispel, and mobility are suggested.", "ars_nouveau.page7.wixie_charm": "You can select specific inventories for the wixie by using a dominion wand on an inventory, and then the cauldron. If any inventories are selected, only these inventories can be used and the Wixie will no longer pull from all nearby inventories by default.", "ars_nouveau.page8.starbuncle_charm": "Using a charm on an existing Starbuncle will stack them. Stacked starbuncles will transport multiple stacks at a time, depositing them in the order that they are taken. Wanding a stackbuncle will wand the main starbuncle and will always display the main starbuncles tooltip. Note: multiple itemstacks are not simulated at a time, which can result in several items being taken, but only able to deposit one while holding the rest.", + "ars_nouveau.patchouli.missing": "Patchouli missing: opening online wiki", "ars_nouveau.pathing": "Pathing", "ars_nouveau.patreon": "Join the Ars Nouveau patreon and get a special Discord role, contribute a custom Tome, receive merchandise, summon a Lily and Nook dog, and more!", "ars_nouveau.patreon_text": "Patreon", diff --git a/src/generated/resources/data/ars_nouveau/tags/entity_type/familiar.json b/src/generated/resources/data/ars_nouveau/tags/entity_type/familiar.json index e7590ab927..182b5fcb61 100644 --- a/src/generated/resources/data/ars_nouveau/tags/entity_type/familiar.json +++ b/src/generated/resources/data/ars_nouveau/tags/entity_type/familiar.json @@ -4,6 +4,7 @@ "ars_nouveau:familiar_whirlisprig", "ars_nouveau:familiar_wixie", "ars_nouveau:familiar_drygmy", - "ars_nouveau:familiar_bookwyrm" + "ars_nouveau:familiar_bookwyrm", + "ars_nouveau:lily" ] } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiUtils.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiUtils.java index 18f74a7e37..f99298406e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiUtils.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiUtils.java @@ -1,6 +1,18 @@ package com.hollingsworth.arsnouveau.client.gui; +import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.common.compat.PatchouliHandler; +import net.minecraft.ChatFormatting; +import net.minecraft.Util; import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.network.chat.ClickEvent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; + +import java.net.URI; +import java.net.URISyntaxException; public class GuiUtils { @@ -11,4 +23,39 @@ public static boolean isMouseInRelativeRange(int mouseX, int mouseY, AbstractWid public static boolean isMouseInRelativeRange(int mouseX, int mouseY, int x, int y, int w, int h) { return mouseX >= x && mouseX <= x + w && mouseY >= y && mouseY <= y + h; } + + public static void openWiki(Player player) { + if (player instanceof ServerPlayer serverPlayer) { + if (ArsNouveau.patchouliLoaded) { + PatchouliHandler.openBookGUI(serverPlayer); + } + return; + } + + if (ArsNouveau.patchouliLoaded) { + PatchouliHandler.openBookClient(); + return; + } + + ClickEvent clickEvent = new ClickEvent(ClickEvent.Action.OPEN_URL, "https://www.curseforge.com/minecraft/mc-mods/patchouli"); + Component clickText = Component.literal("[") + .append( + Component.translatable("ars_nouveau.dependency.install").withStyle(Style.EMPTY.withColor(ChatFormatting.GOLD)) + ) + .append("]") + .withStyle(Style.EMPTY.withClickEvent(clickEvent)); + + Component text = Component.translatable("ars_nouveau.patchouli.missing") + .withStyle(Style.EMPTY.withColor(ChatFormatting.GRAY)) + .append(" ") + .append(clickText); + + player.sendSystemMessage(text); + + try { + Util.getPlatform().openUri(new URI("https://www.arsnouveau.wiki/")); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index 007fd9800b..9781bac6b3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -412,15 +412,7 @@ public boolean mouseScrolled(double pMouseX, double pMouseY, double pScrollX, do } public void onDocumentationClick(Button button) { - if(ArsNouveau.patchouliLoaded){ - PatchouliHandler.openBookClient(); - }else{ - try { - Util.getPlatform().openUri(new URI("https://www.arsnouveau.wiki/")); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - } + GuiUtils.openWiki(ArsNouveau.proxy.getPlayer()); } public void onColorClick(Button button) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java index 29cb3141e5..3ce481dde7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EntityTagProvider.java @@ -48,7 +48,7 @@ protected void addTags(HolderLookup.Provider pProvider) { ); this.tag(EntityTags.FAMILIAR).add(ModEntities.ENTITY_FAMILIAR_STARBUNCLE.get(), ModEntities.ENTITY_FAMILIAR_SYLPH.get(), ModEntities.ENTITY_FAMILIAR_WIXIE.get(), ModEntities.ENTITY_FAMILIAR_DRYGMY.get(), - ModEntities.ENTITY_FAMILIAR_BOOKWYRM.get()); + ModEntities.ENTITY_FAMILIAR_BOOKWYRM.get(), ModEntities.LILY.get()); this.tag(EntityTags.JAR_BLACKLIST).addTag(EntityTags.FAMILIAR).addTag(Tags.EntityTypes.CAPTURING_NOT_SUPPORTED); this.tag(EntityTags.JAR_WHITELIST) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 62bf3656a7..d32297486d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -1310,6 +1310,8 @@ protected void addTranslations() { add("block.ars_nouveau.smooth_sourcestone_grate","Smooth Sourcestone Grate"); add("block.ars_nouveau.source_lamp", "Source Gem Lamp"); add("ars_nouveau.page1.source_lamp", "Behaves like a copper bulb, but the light and comparator values can be adjusted by casting Light with dampen."); + add("ars_nouveau.patchouli.missing", "Patchouli missing: opening online wiki"); + add("ars_nouveau.dependency.install", "Open mod page"); add("tooltip.starbuncle_shard2", "Made with love."); add("tooltip.whirlisprig_shard2","A natural portrait."); add("tooltip.drygmy_shard2","A tribute to what once was."); @@ -1327,7 +1329,6 @@ protected void addTranslations() { add("ars_nouveau.sifting", "Sifting"); add("tooltip.alakarkinos_shard1", "Found by giving an Alakarkinos a Sherd."); add("tooltip.alakarkinos_shard2", "What's that behind your ear?"); - } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/WornNotebook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/WornNotebook.java index fac71350af..d16f910ee8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/WornNotebook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/WornNotebook.java @@ -1,9 +1,12 @@ package com.hollingsworth.arsnouveau.common.items; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.client.gui.GuiUtils; import com.hollingsworth.arsnouveau.common.compat.PatchouliHandler; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import net.minecraft.ChatFormatting; import net.minecraft.Util; +import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; @@ -28,15 +31,8 @@ public WornNotebook() { @Override public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); - if (ArsNouveau.patchouliLoaded && playerIn instanceof ServerPlayer player) { - PatchouliHandler.openBookGUI(player); - }else if(!ArsNouveau.patchouliLoaded && worldIn.isClientSide){ - try { - Util.getPlatform().openUri(new URI("https://www.arsnouveau.wiki/")); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - } + + GuiUtils.openWiki(ArsNouveau.proxy.getPlayer()); return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); } From 9fd91b390df1f33ba524a3365d2ef5a94aa6098c Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 9 Nov 2024 17:15:35 -0600 Subject: [PATCH 266/363] Fix alakarkinos charm not consumed --- .../hollingsworth/arsnouveau/common/items/AlakarkinosCharm.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlakarkinosCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlakarkinosCharm.java index 39e6de6c8c..9f66a5c047 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlakarkinosCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlakarkinosCharm.java @@ -33,6 +33,7 @@ public InteractionResult useOn(UseOnContext pContext) { alakarkinos.fromCharmData(data); } world.addFreshEntity(alakarkinos); + pContext.getItemInHand().shrink(1); return super.useOn(pContext); } From cdbf185ecafcd7eb4484a2a86d06025448f9299f Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 9 Nov 2024 17:19:14 -0600 Subject: [PATCH 267/363] Revert "Fix alakarkinos charm not consumed" This reverts commit 9fd91b390df1f33ba524a3365d2ef5a94aa6098c. --- .../hollingsworth/arsnouveau/common/items/AlakarkinosCharm.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlakarkinosCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlakarkinosCharm.java index 9f66a5c047..39e6de6c8c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/AlakarkinosCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/AlakarkinosCharm.java @@ -33,7 +33,6 @@ public InteractionResult useOn(UseOnContext pContext) { alakarkinos.fromCharmData(data); } world.addFreshEntity(alakarkinos); - pContext.getItemInHand().shrink(1); return super.useOn(pContext); } From b856915791b0ad89f5e851bb2e585f8492286454 Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Sun, 10 Nov 2024 00:19:22 +0100 Subject: [PATCH 268/363] Tooltips update and fixes (#1497) * fix alakrinos charm, add school tooltips, fix summoning sickness being dispellable, remove jei from mods toml * School tooltips, add glyph tooltips to other caster tools and reactive. Reenable reactive on everything Fix missing background texture in glyph crafting and missing school for bubble Add config for spell text offset in HUD * reduce horiz offset --- build.gradle | 12 +-- .../56408d4385cae198e776e71d25785a05a196148d | 4 +- .../ars_nouveau/enchantment/reactive.json | 4 +- .../api/item/AbstractSummonCharm.java | 3 +- .../arsnouveau/api/spell/SpellSchool.java | 5 ++ .../arsnouveau/api/spell/SpellSchools.java | 2 +- .../client/events/ClientEvents.java | 15 ++++ .../client/gui/GlyphRecipeTooltip.java | 12 +-- .../arsnouveau/client/gui/GuiSpellHUD.java | 5 +- .../arsnouveau/client/gui/SchoolTooltip.java | 59 +++++++++++++++ .../arsnouveau/client/gui/SpellTooltip.java | 7 +- .../client/gui/book/GlyphUnlockMenu.java | 33 ++++---- .../client/gui/book/GuiSpellBook.java | 71 +++++++++++------- .../client/gui/buttons/GlyphButton.java | 3 +- .../client/gui/buttons/UnlockGlyphButton.java | 3 +- .../common/datagen/EnchantmentProvider.java | 6 +- .../common/items/AlakarkinosCharm.java | 38 +++++++--- .../arsnouveau/common/items/CasterTome.java | 16 ++-- .../common/items/EnchantersMirror.java | 16 +++- .../common/items/EnchantersSword.java | 16 +++- .../arsnouveau/common/items/Glyph.java | 21 +++++- .../arsnouveau/common/items/SpellBow.java | 16 +++- .../common/items/SpellCrossbow.java | 15 +++- .../common/items/SpellParchment.java | 2 +- .../arsnouveau/common/items/Wand.java | 17 ++++- .../items/summon_charms/WixieCharm.java | 3 +- .../potions/SummoningSicknessEffect.java | 9 +++ .../common/spell/effect/EffectBubble.java | 5 ++ .../arsnouveau/setup/config/Config.java | 5 ++ .../resources/META-INF/neoforge.mods.toml | 12 +-- .../ars_nouveau/textures/gui/bundle.png | Bin 0 -> 299 bytes .../gui/schools/abjuration_tooltip.png | Bin 0 -> 152 bytes .../textures/gui/schools/air_tooltip.png | Bin 0 -> 146 bytes .../gui/schools/conjuration_tooltip.png | Bin 0 -> 151 bytes .../textures/gui/schools/earth_tooltip.png | Bin 0 -> 163 bytes .../textures/gui/schools/fire_tooltip.png | Bin 0 -> 141 bytes .../gui/schools/manipulation_tooltip.png | Bin 0 -> 148 bytes .../textures/gui/schools/water_tooltip.png | Bin 0 -> 152 bytes 38 files changed, 335 insertions(+), 100 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/client/gui/SchoolTooltip.java create mode 100644 src/main/resources/assets/ars_nouveau/textures/gui/bundle.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/gui/schools/abjuration_tooltip.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/gui/schools/air_tooltip.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/gui/schools/conjuration_tooltip.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/gui/schools/earth_tooltip.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/gui/schools/fire_tooltip.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/gui/schools/manipulation_tooltip.png create mode 100644 src/main/resources/assets/ars_nouveau/textures/gui/schools/water_tooltip.png diff --git a/build.gradle b/build.gradle index 50b8149c60..d27145c6ac 100644 --- a/build.gradle +++ b/build.gradle @@ -116,13 +116,15 @@ dependencies { implementation "curse.maven:jade-324717:5444008" implementation "top.theillusivec4.curios:curios-neoforge:${curios_version}+1.21" -// implementation "curse.maven:ars-additions-974408:5698511" +// use localRuntime for adding mods to env that won't be listed as dependencies in the manifest - runtimeOnly 'curse.maven:ftb-teams-forge-404468:5631446' - runtimeOnly 'curse.maven:ftb-chunks-forge-314906:5710609' - runtimeOnly 'curse.maven:ftb-library-forge-404465:5754910' - runtimeOnly 'curse.maven:architectury-api-419699:5553800' + localRuntime 'curse.maven:ftb-teams-forge-404468:5631446' + localRuntime 'curse.maven:ftb-chunks-forge-314906:5710609' + localRuntime 'curse.maven:ftb-library-forge-404465:5754910' + localRuntime 'curse.maven:architectury-api-419699:5553800' + // localRuntime ("com.alexthw.ars_elemental:ars_elemental-${minecraft_version}:0.7.0.9.3.17") {transitive = false} + // localRuntime "curse.maven:ars-additions-974408:5852361" } jar { diff --git a/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d b/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d index e51978c557..fc372048d5 100644 --- a/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d +++ b/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d @@ -1,4 +1,4 @@ -// 1.21.1 2024-08-17T10:54:39.1707777 Ars Nouveau's Enchantment Data +// 1.21.1 2024-11-09T21:45:14.2597449 Ars Nouveau's Enchantment Data e86598b47a336ed9c1c12c8c0391cf4d2f771c21 data/ars_nouveau/enchantment/mana_boost.json 321253ad8e6e58e584e3fe140e7fc39a1f2f11b7 data/ars_nouveau/enchantment/mana_regen.json -8091c2c07766c95ebf45a5618abc2da3ab8c9051 data/ars_nouveau/enchantment/reactive.json +48649708bc7378402370f35ac7d600a31385fa01 data/ars_nouveau/enchantment/reactive.json diff --git a/src/generated/resources/data/ars_nouveau/enchantment/reactive.json b/src/generated/resources/data/ars_nouveau/enchantment/reactive.json index 8119b15c23..a3a6d0c948 100644 --- a/src/generated/resources/data/ars_nouveau/enchantment/reactive.json +++ b/src/generated/resources/data/ars_nouveau/enchantment/reactive.json @@ -15,6 +15,8 @@ "slots": [ "any" ], - "supported_items": "#minecraft:enchantable/armor", + "supported_items": { + "type": "neoforge:any" + }, "weight": 1 } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/AbstractSummonCharm.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/AbstractSummonCharm.java index f2c5cd40bf..912301203e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/AbstractSummonCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/AbstractSummonCharm.java @@ -9,6 +9,7 @@ import net.minecraft.world.InteractionResult; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; public abstract class AbstractSummonCharm extends ModItem { @@ -21,7 +22,7 @@ public AbstractSummonCharm() { } @Override - public InteractionResult useOn(UseOnContext context) { + public @NotNull InteractionResult useOn(UseOnContext context) { Level world = context.getLevel(); if (world.isClientSide) return InteractionResult.SUCCESS; BlockPos pos = context.getClickedPos(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSchool.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSchool.java index f4a8ad4d00..e3b39b7629 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSchool.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSchool.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.api.spell; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import java.util.HashSet; import java.util.Set; @@ -60,4 +61,8 @@ public Set getSpellParts() { public void setSpellParts(Set spellParts) { this.spellParts = spellParts; } + + public ResourceLocation getTexturePath() { + return ResourceLocation.fromNamespaceAndPath("ars_nouveau", "textures/gui/schools/" + getId() + "_tooltip.png"); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSchools.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSchools.java index a5880fbcb7..70a117587f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSchools.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSchools.java @@ -4,7 +4,7 @@ public class SpellSchools { public static SpellSchool ABJURATION = new SpellSchool("abjuration"); public static SpellSchool CONJURATION = new SpellSchool("conjuration"); - // public static SpellSchool NECROMANCY = new SpellSchool("necromancy"); + public static SpellSchool NECROMANCY = new SpellSchool("necromancy"); public static SpellSchool MANIPULATION = new SpellSchool("manipulation"); public static SpellSchool ELEMENTAL_AIR = new SpellSchool("air"); public static SpellSchool ELEMENTAL_EARTH = new SpellSchool("earth"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java index 22225749c1..97db80016d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/events/ClientEvents.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.registry.DynamicTooltipRegistry; import com.hollingsworth.arsnouveau.client.gui.PatchouliTooltipEvent; +import com.hollingsworth.arsnouveau.client.gui.SchoolTooltip; import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; import com.hollingsworth.arsnouveau.client.gui.radial_menu.GuiRadialMenu; import com.hollingsworth.arsnouveau.client.renderer.world.PantomimeRenderer; @@ -10,8 +11,11 @@ import com.hollingsworth.arsnouveau.common.block.tile.GhostWeaveTile; import com.hollingsworth.arsnouveau.common.block.tile.SkyBlockTile; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.datafixers.util.Either; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.BlockPos; @@ -41,6 +45,7 @@ static class ClientModEvents { @SubscribeEvent public static void registerTooltipFactory(RegisterClientTooltipComponentFactoriesEvent event) { event.register(SpellTooltip.class, SpellTooltip.SpellTooltipRenderer::new); + event.register(SchoolTooltip.class, SchoolTooltip.SchoolTooltipRenderer::new); } @@ -82,6 +87,16 @@ public static void TooltipEvent(RenderTooltipEvent.Pre e) { } } + @SubscribeEvent + public static void addComponents(RenderTooltipEvent.GatherComponents event) { + if (!Screen.hasShiftDown() && event.getItemStack().isEnchanted() && event.getItemStack().has(DataComponentRegistry.REACTIVE_CASTER)) { + var caster = event.getItemStack().get(DataComponentRegistry.REACTIVE_CASTER); + if (caster != null && caster.getSpell().isValid()) { + event.getTooltipElements().add(Either.right(new SpellTooltip(caster))); + } + } + } + @SubscribeEvent public static void highlightBlockEvent(RenderHighlightEvent.Block e) { Level level = Minecraft.getInstance().level; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GlyphRecipeTooltip.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GlyphRecipeTooltip.java index ac3aee0168..e6c4c97084 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GlyphRecipeTooltip.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GlyphRecipeTooltip.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.client.gui; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.ClientInfo; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; @@ -9,13 +10,14 @@ import net.minecraft.world.item.crafting.Ingredient; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; public class GlyphRecipeTooltip implements ClientTooltipComponent { - // TODO: fix background render on tooltip - public static final ResourceLocation TEXTURE_LOCATION = ResourceLocation.withDefaultNamespace("textures/gui/container/bundle/background.png"); + + public static final ResourceLocation TEXTURE_LOCATION = ArsNouveau.prefix("textures/gui/bundle.png"); private static final int MARGIN_Y = 4; private static final int BORDER_WIDTH = 1; private static final int TEX_SIZE = 128; @@ -32,12 +34,12 @@ public int getHeight() { return this.gridSizeY() * SLOT_SIZE_Y + 2 + MARGIN_Y; } - public int getWidth(Font pFont) { + public int getWidth(@NotNull Font pFont) { return this.gridSizeX() * SLOT_SIZE_X + 2; } - public void renderImage(Font pFont, int pMouseX, int pMouseY, GuiGraphics graphics) { + public void renderImage(@NotNull Font pFont, int pMouseX, int pMouseY, @NotNull GuiGraphics graphics) { if (this.items.isEmpty()) return; int i = this.gridSizeX(); @@ -91,7 +93,7 @@ private void blit(GuiGraphics graphics, int pX, int pY, GlyphRecipeTooltip.Textu } private int gridSizeX() { - return this.items.size() == 0 ? 0 : Math.min(3, this.items.size()); + return this.items.isEmpty() ? 0 : Math.min(3, this.items.size()); } private int gridSizeY() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java index 27bbdeff99..4ee3db0a49 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiSpellHUD.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.api.spell.AbstractCaster; import com.hollingsworth.arsnouveau.api.util.StackUtil; import com.hollingsworth.arsnouveau.common.items.SpellBook; +import com.hollingsworth.arsnouveau.setup.config.Config; import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; @@ -22,10 +23,10 @@ public static void renderOverlay(GuiGraphics graphics, DeltaTracker deltaTracker } ItemStack stack = StackUtil.getHeldSpellbook(minecraft.player); if (stack != ItemStack.EMPTY && stack.getItem() instanceof SpellBook) { - int offsetLeft = 10; + int offsetLeft = Config.SPELLNAME_X_OFFSET.get(); AbstractCaster caster = SpellCasterRegistry.from(stack); String renderString = caster.getCurrentSlot() + 1 + " " + caster.getSpellName(); - graphics.drawString(Minecraft.getInstance().font, renderString, offsetLeft, minecraft.getWindow().getGuiScaledHeight() - 30, 0xFFFFFF); + graphics.drawString(Minecraft.getInstance().font, renderString, offsetLeft, minecraft.getWindow().getGuiScaledHeight() - Config.SPELLNAME_Y_OFFSET.get(), 0xFFFFFF); } } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/SchoolTooltip.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/SchoolTooltip.java new file mode 100644 index 0000000000..f4c48a18a8 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/SchoolTooltip.java @@ -0,0 +1,59 @@ +package com.hollingsworth.arsnouveau.client.gui; + +import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; +import com.hollingsworth.arsnouveau.api.spell.SpellSchool; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public record SchoolTooltip(AbstractSpellPart part) implements TooltipComponent { + + public List schools() { + return part.spellSchools; + } + + public String name() { + return Component.translatable("ars_nouveau.glyph_of", part.getLocaleName()).getString(); + } + + public static class SchoolTooltipRenderer implements ClientTooltipComponent { + + static final int offset = 16; + private final List schools; + private final String name; + + public SchoolTooltipRenderer(SchoolTooltip pSchoolTooltip) { + this.schools = pSchoolTooltip.schools(); + this.name = pSchoolTooltip.name(); + } + + public SchoolTooltipRenderer(AbstractSpellPart part) { + this.schools = part.spellSchools; + this.name = part.getLocaleName(); + } + + @Override + public int getHeight() { + return 0; + } + + @Override + public int getWidth(@NotNull Font font) { + return font.width(name) + offset + 16 * schools.size(); + } + + @Override + public void renderImage(@NotNull Font font, int x, int y, @NotNull GuiGraphics guiGraphics) { + x += offset; + for (SpellSchool school : schools) { + guiGraphics.blit(school.getTexturePath(), x + font.width(name), y - 16, 0, 0, 16, 16, 16, 16); + x += 16; + } + } + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java index 42dbc9f410..3fe724d98e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java @@ -9,6 +9,7 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.network.chat.Component; import net.minecraft.world.inventory.tooltip.TooltipComponent; +import org.jetbrains.annotations.NotNull; import org.joml.Matrix4f; public record SpellTooltip(AbstractCaster spellcaster, boolean showName) implements TooltipComponent { @@ -32,12 +33,12 @@ public int getHeight() { } @Override - public int getWidth(Font pFont) { + public int getWidth(@NotNull Font pFont) { return 4 + spellCaster.getSpell().size() * 16; } @Override - public void renderText(Font pFont, int pX, int pY, Matrix4f pMatrix, MultiBufferSource.BufferSource pBufferSource) { + public void renderText(@NotNull Font pFont, int pX, int pY, @NotNull Matrix4f pMatrix, MultiBufferSource.@NotNull BufferSource pBufferSource) { if (showName) { pFont.drawInBatch(Component.literal(spellCaster.getSpellName()), (float) (pX + 4), (float) pY, -1, true, pMatrix, pBufferSource, Font.DisplayMode.NORMAL, 0, 15728880); @@ -46,7 +47,7 @@ public void renderText(Font pFont, int pX, int pY, Matrix4f pMatrix, MultiBuffer } @Override - public void renderImage(Font pFont, int pX, int pY, GuiGraphics pGuiGraphics) { + public void renderImage(@NotNull Font pFont, int pX, int pY, @NotNull GuiGraphics pGuiGraphics) { var spell = spellCaster.getSpell(); for (int i = 0, recipeSize = spell.size(); i < recipeSize; i++) { AbstractSpellPart part = spell.get(i); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java index 33b1ec85ae..37aeb0ced0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import com.hollingsworth.arsnouveau.client.gui.GlyphRecipeTooltip; import com.hollingsworth.arsnouveau.client.gui.NoShadowTextField; +import com.hollingsworth.arsnouveau.client.gui.SchoolTooltip; import com.hollingsworth.arsnouveau.client.gui.buttons.*; import com.hollingsworth.arsnouveau.common.block.tile.ScribesTile; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; @@ -107,7 +108,7 @@ public void init() { searchBar.setSuggestion(Component.translatable("ars_nouveau.spell_book_gui.search").getString()); searchBar.setResponder((val) -> this.onSearchChanged(val)); addRenderableWidget(searchBar); - addRenderableWidget(new GuiImageButton(bookRight - 71, bookBottom - 13, 50, 12, ArsNouveau.prefix( "textures/gui/create_icon.png"), this::onSelectClick)); + addRenderableWidget(new GuiImageButton(bookRight - 71, bookBottom - 13, 50, 12, ArsNouveau.prefix("textures/gui/create_icon.png"), this::onSelectClick)); this.nextButton = addRenderableWidget(new PageButton(bookRight - 20, bookBottom - 10, true, this::onPageIncrease, true)); this.previousButton = addRenderableWidget(new PageButton(bookLeft - 5, bookBottom - 10, false, this::onPageDec, true)); updateNextPageButtons(); @@ -123,16 +124,16 @@ public void init() { itemButtons.add(cell); } - all = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 22, 0, 0, 23, 20, 23, 20, ArsNouveau.prefix( "textures/gui/filter_tab_all.png"), - ArsNouveau.prefix( "textures/gui/filter_tab_all_selected.png"), (b) -> this.setFilter(Filter.ALL, (SelectableButton) b, Component.translatable("ars_nouveau.all_glyphs").getString())).withTooltip(Component.translatable("ars_nouveau.all_glyphs")); + all = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 22, 0, 0, 23, 20, 23, 20, ArsNouveau.prefix("textures/gui/filter_tab_all.png"), + ArsNouveau.prefix("textures/gui/filter_tab_all_selected.png"), (b) -> this.setFilter(Filter.ALL, (SelectableButton) b, Component.translatable("ars_nouveau.all_glyphs").getString())).withTooltip(Component.translatable("ars_nouveau.all_glyphs")); all.isSelected = true; - tier1 = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 46, 0, 0, 23, 20, 23, 20, ArsNouveau.prefix( "textures/gui/filter_tab_tier1.png"), - ArsNouveau.prefix( "textures/gui/filter_tab_tier1_selected.png"), (b) -> this.setFilter(Filter.TIER1, (SelectableButton) b, Component.translatable("ars_nouveau.tier", 1).getString())).withTooltip(Component.translatable("ars_nouveau.tier", 1)); + tier1 = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 46, 0, 0, 23, 20, 23, 20, ArsNouveau.prefix("textures/gui/filter_tab_tier1.png"), + ArsNouveau.prefix("textures/gui/filter_tab_tier1_selected.png"), (b) -> this.setFilter(Filter.TIER1, (SelectableButton) b, Component.translatable("ars_nouveau.tier", 1).getString())).withTooltip(Component.translatable("ars_nouveau.tier", 1)); - tier2 = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 70, 0, 0, 23, 20, 23, 20, ArsNouveau.prefix( "textures/gui/filter_tab_tier2.png"), - ArsNouveau.prefix( "textures/gui/filter_tab_tier2_selected.png"), (b) -> this.setFilter(Filter.TIER2, (SelectableButton) b, Component.translatable("ars_nouveau.tier", 2).getString())).withTooltip(Component.translatable("ars_nouveau.tier", 2)); - tier3 = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 94, 0, 0, 23, 20, 23, 20, ArsNouveau.prefix( "textures/gui/filter_tab_tier3.png"), - ArsNouveau.prefix( "textures/gui/filter_tab_tier3_selected.png"), (b) -> this.setFilter(Filter.TIER3, (SelectableButton) b, Component.translatable("ars_nouveau.tier", 3).getString())).withTooltip(Component.translatable("ars_nouveau.tier", 3)); + tier2 = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 70, 0, 0, 23, 20, 23, 20, ArsNouveau.prefix("textures/gui/filter_tab_tier2.png"), + ArsNouveau.prefix("textures/gui/filter_tab_tier2_selected.png"), (b) -> this.setFilter(Filter.TIER2, (SelectableButton) b, Component.translatable("ars_nouveau.tier", 2).getString())).withTooltip(Component.translatable("ars_nouveau.tier", 2)); + tier3 = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 94, 0, 0, 23, 20, 23, 20, ArsNouveau.prefix("textures/gui/filter_tab_tier3.png"), + ArsNouveau.prefix("textures/gui/filter_tab_tier3_selected.png"), (b) -> this.setFilter(Filter.TIER3, (SelectableButton) b, Component.translatable("ars_nouveau.tier", 3).getString())).withTooltip(Component.translatable("ars_nouveau.tier", 3)); filterButtons.add(all); filterButtons.add(tier2); filterButtons.add(tier1); @@ -343,7 +344,7 @@ public void onPageDec(Button button) { @Override public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { this.hoveredRecipe = null; - if(getHoveredRenderable(mouseX, mouseY) instanceof UnlockGlyphButton button){ + if (getHoveredRenderable(mouseX, mouseY) instanceof UnlockGlyphButton button) { this.hoveredRecipe = button.recipe; } super.render(graphics, mouseX, mouseY, partialTicks); @@ -355,9 +356,9 @@ public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, graphics.drawString(font, orderingTitle, tier1Row > 7 ? 154 : 20, 5 + 18 * (tier1Row + (tier1Row == 1 ? 0 : 1)), -8355712, false); - graphics.blit(ArsNouveau.prefix( "textures/gui/create_paper.png"), 216, 179, 0, 0, 56, 15, 56, 15); + graphics.blit(ArsNouveau.prefix("textures/gui/create_paper.png"), 216, 179, 0, 0, 56, 15, 56, 15); - graphics.blit(ArsNouveau.prefix( "textures/gui/search_paper.png"), 203, 0, 0, 0, 72, 15, 72, 15); + graphics.blit(ArsNouveau.prefix("textures/gui/search_paper.png"), 203, 0, 0, 0, 72, 15, 72, 15); graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.select"), 233, 183, -8355712, false); } @@ -371,8 +372,10 @@ public void drawTooltip(GuiGraphics stack, int mouseX, int mouseY) { List components = new ArrayList<>(net.neoforged.neoforge.client.ClientHooks.gatherTooltipComponents(ItemStack.EMPTY, tooltip, mouseX, width, height, this.font)); if (hoveredRecipe != null) components.add(new GlyphRecipeTooltip(hoveredRecipe.value().inputs)); - renderTooltipInternal(stack, components, mouseX, mouseY); + if (getHoveredRenderable(mouseX, mouseY) instanceof UnlockGlyphButton button && !button.spellPart.spellSchools.isEmpty()) + components.add(1, new SchoolTooltip.SchoolTooltipRenderer(button.spellPart)); + renderTooltipInternal(stack, components, mouseX, mouseY); } public void renderTooltipInternal(GuiGraphics graphics, List pClientTooltipComponents, int pMouseX, int pMouseY) { @@ -406,7 +409,7 @@ public void renderTooltipInternal(GuiGraphics graphics, List(GlyphRegistry.getSpellpartMap().values().stream().filter(AbstractSpellPart::shouldShowInSpellBook).toList()); } int tier = 1; - if(heldStack.getItem() instanceof SpellBook book){ + if (heldStack.getItem() instanceof SpellBook book) { tier = book.getTier().value; } if (SpellCasterRegistry.hasCaster(heldStack)) { @@ -352,7 +353,7 @@ public void updateNextPageButtons() { } public void onPageIncrease(Button button) { - if(page + 1 >= getNumPages()) + if (page + 1 >= getNumPages()) return; page++; if (displayedGlyphs.size() < glyphsPerPage * (page + 1)) { @@ -366,7 +367,7 @@ public void onPageIncrease(Button button) { } public void onPageDec(Button button) { - if(page <= 0){ + if (page <= 0) { page = 0; return; } @@ -390,8 +391,8 @@ public int getExtraGlyphSlots() { @Override public boolean mouseScrolled(double pMouseX, double pMouseY, double pScrollX, double pScrollY) { - boolean isShiftDown = InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), Minecraft.getInstance().options.keyShift.getKey().getValue()); - if(getExtraGlyphSlots() > 0 && isShiftDown){ + boolean isShiftDown = InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), Minecraft.getInstance().options.keyShift.getKey().getValue()); + if (getExtraGlyphSlots() > 0 && isShiftDown) { if (pScrollY < 0 && nextGlyphButton.active) { updateWindowOffset(spellWindowOffset + 1); } else if (pScrollY > 0 && prevGlyphButton.active) { @@ -436,7 +437,7 @@ public void onFamiliarClick(Button button) { } public void onCraftingSlotClick(Button button) { - if(button instanceof CraftingButton craftingButton) { + if (button instanceof CraftingButton craftingButton) { craftingButton.clear(); if (craftingButton.slotNum < spell.size()) { spell.set(((CraftingButton) button).slotNum, null); @@ -500,11 +501,11 @@ public void onSlotChange(Button button) { @Override public boolean charTyped(char pCodePoint, int pModifiers) { - if(hoveredWidget instanceof GlyphButton glyphButton && glyphButton.validationErrors.isEmpty()){ + if (hoveredWidget instanceof GlyphButton glyphButton && glyphButton.validationErrors.isEmpty()) { // check if char is a number - if(pCodePoint >= '0' && pCodePoint <= '9'){ + if (pCodePoint >= '0' && pCodePoint <= '9') { int num = Integer.parseInt(String.valueOf(pCodePoint)); - if(num == 0){ + if (num == 0) { num = 10; } num -= 1; @@ -600,10 +601,10 @@ public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, if (augmentTextRow >= 1) { graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.augment").getString(), augmentTextRow > 6 ? 154 : 20, 5 + 18 * (augmentTextRow + 1), -8355712, false); } - graphics.blit(ArsNouveau.prefix( "textures/gui/spell_name_paper.png"), 16, 179, 0, 0, 109, 15, 109, 15); - graphics.blit(ArsNouveau.prefix( "textures/gui/search_paper.png"), 203, 0, 0, 0, 72, 15, 72, 15); - graphics.blit(ArsNouveau.prefix( "textures/gui/clear_paper.png"), 161, 179, 0, 0, 47, 15, 47, 15); - graphics.blit(ArsNouveau.prefix( "textures/gui/create_paper.png"), 216, 179, 0, 0, 56, 15, 56, 15); + graphics.blit(ArsNouveau.prefix("textures/gui/spell_name_paper.png"), 16, 179, 0, 0, 109, 15, 109, 15); + graphics.blit(ArsNouveau.prefix("textures/gui/search_paper.png"), 203, 0, 0, 0, 72, 15, 72, 15); + graphics.blit(ArsNouveau.prefix("textures/gui/clear_paper.png"), 161, 179, 0, 0, 47, 15, 47, 15); + graphics.blit(ArsNouveau.prefix("textures/gui/create_paper.png"), 216, 179, 0, 0, 56, 15, 56, 15); if (validationErrors.isEmpty()) { graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.create"), 233, 183, -8355712, false); } else { @@ -630,16 +631,16 @@ public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, poseStack.pushPose(); poseStack.scale(1.2F, 1.2F, 1.2F); poseStack.translate(-25, -30, 0); - graphics.blit(ArsNouveau.prefix( "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 18, 0, 0, 108, 18, 256, 256); + graphics.blit(ArsNouveau.prefix("textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 18, 0, 0, 108, 18, 256, 256); int manaOffset = (int) (((ClientInfo.ticksInGame + partialTicks) / 3 % (33))) * 6; // default length is 96 // rainbow effect for perfect match is currently disabled by the >= if (manaLength >= 0) { - graphics.blit( ArsNouveau.prefix( "textures/gui/manabar_gui_mana.png"), offsetLeft + 9, yOffset - 9, 0, manaOffset, manaLength, 6, 256, 256); + graphics.blit(ArsNouveau.prefix("textures/gui/manabar_gui_mana.png"), offsetLeft + 9, yOffset - 9, 0, manaOffset, manaLength, 6, 256, 256); } else { //color rainbow if mana cost = max mana, red if mana cost > max mana - RenderSystem.setShaderTexture(0, ArsNouveau.prefix( "textures/gui/manabar_gui_grayscale.png")); + RenderSystem.setShaderTexture(0, ArsNouveau.prefix("textures/gui/manabar_gui_grayscale.png")); RenderUtils.colorBlit(graphics.pose(), offsetLeft + 8, yOffset - 10, 0, manaOffset, 100, 8, 256, 256, manaLength < 0 ? Color.RED : Color.rainbowColor(ClientInfo.ticksInGame)); } if (ArsNouveauAPI.ENABLE_DEBUG_NUMBERS && minecraft != null) { @@ -647,10 +648,10 @@ public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, int maxWidth = minecraft.font.width(maxManaCache + " / " + maxManaCache); int offset = offsetLeft - maxWidth / 2 + (maxWidth - minecraft.font.width(text)); - graphics.drawString(minecraft.font, text, offset + 55, yOffset - 10, 0xFFFFFF, false); + graphics.drawString(minecraft.font, text, offset + 55, yOffset - 10, 0xFFFFFF, false); } - graphics.blit(ArsNouveau.prefix( "textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 17, 0, 18, 108, 20, 256, 256); + graphics.blit(ArsNouveau.prefix("textures/gui/manabar_gui_border.png"), offsetLeft, yOffset - 17, 0, 18, 108, 20, 256, 256); poseStack.popPose(); } @@ -734,13 +735,13 @@ private void validateGlyphButton(List recipe, GlyphButton gly @Override public void render(GuiGraphics ms, int mouseX, int mouseY, float partialTicks) { super.render(ms, mouseX, mouseY, partialTicks); - if(this.setFocusOnLoad){ + if (this.setFocusOnLoad) { this.setFocusOnLoad = false; this.setInitialFocus(searchBar); } hoveredWidget = null; - for(Renderable widget : renderables){ - if(widget instanceof AbstractWidget abstractWidget && GuiUtils.isMouseInRelativeRange(mouseX, mouseY, abstractWidget)){ + for (Renderable widget : renderables) { + if (widget instanceof AbstractWidget abstractWidget && GuiUtils.isMouseInRelativeRange(mouseX, mouseY, abstractWidget)) { hoveredWidget = widget; break; } @@ -750,7 +751,7 @@ public void render(GuiGraphics ms, int mouseX, int mouseY, float partialTicks) { @Override public void collectTooltips(GuiGraphics stack, int mouseX, int mouseY, List tooltip) { - if(GuiUtils.isMouseInRelativeRange(mouseX, mouseY, createSpellButton)){ + if (GuiUtils.isMouseInRelativeRange(mouseX, mouseY, createSpellButton)) { if (!validationErrors.isEmpty()) { boolean foundGlyphErrors = false; tooltip.add(Component.translatable("ars_nouveau.spell.validation.crafting.invalid").withStyle(ChatFormatting.RED)); @@ -763,14 +764,32 @@ public void collectTooltips(GuiGraphics stack, int mouseX, int mouseY, List tooltip = new ArrayList<>(); + collectTooltips(stack, mouseX, mouseY, tooltip); + if (!tooltip.isEmpty()) { + stack.renderTooltip(font, tooltip, Optional.ofNullable(collectComponent(mouseX, mouseY)), mouseX, mouseY); + } + } + + protected TooltipComponent collectComponent(int mouseX, int mouseY) { + for (Renderable renderable : renderables) { + if (renderable instanceof GlyphButton widget) { + if (GuiUtils.isMouseInRelativeRange(mouseX, mouseY, widget)) { + return widget.abstractSpellPart.spellSchools.isEmpty() ? null : new SchoolTooltip(widget.abstractSpellPart); + } + } + } + return null; + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GlyphButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GlyphButton.java index 8921925b69..145ca970d1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GlyphButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GlyphButton.java @@ -16,6 +16,7 @@ import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModList; import net.neoforged.neoforgespi.language.IModInfo; +import org.jetbrains.annotations.NotNull; import java.util.LinkedList; import java.util.List; @@ -33,7 +34,7 @@ public GlyphButton(int x, int y, AbstractSpellPart abstractSpellPart, OnPress on } @Override - protected void renderWidget(GuiGraphics graphics, int pMouseX, int pMouseY, float pPartialTick) { + protected void renderWidget(@NotNull GuiGraphics graphics, int pMouseX, int pMouseY, float pPartialTick) { if(!visible){ return; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java index 41d543a425..9ac13efc58 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/UnlockGlyphButton.java @@ -14,6 +14,7 @@ import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModList; import net.neoforged.neoforgespi.language.IModInfo; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -34,7 +35,7 @@ public UnlockGlyphButton(int x, int y, boolean isCraftingSlot, RecipeHolder ctx) { ))); register(ctx, EnchantmentRegistry.REACTIVE_ENCHANTMENT, Enchantment.enchantment(Enchantment.definition( - holdergetter2.getOrThrow(ItemTags.ARMOR_ENCHANTABLE), + new AnyHolderSet<>(BuiltInRegistries.ITEM.asLookup()), 1, 4, Enchantment.dynamicCost(1, 11), @@ -99,7 +101,7 @@ public EnchantmentTagsProvider(PackOutput pPackOutput, CompletableFuture tooltip2, @NotNull TooltipFlag flagIn) { AbstractCaster caster = getSpellCaster(stack); - if (Config.GLYPH_TOOLTIPS.get() || Screen.hasShiftDown()) { + if (caster != null) { + + // If the caster is hidden, show the hidden recipe + if (caster.isSpellHidden()) { tooltip2.add(Component.literal(caster.getHiddenRecipe()).withStyle(Style.EMPTY.withFont(ResourceLocation.fromNamespaceAndPath("minecraft", "alt")).withColor(ChatFormatting.GOLD))); + } else if (Screen.hasShiftDown() || !Config.GLYPH_TOOLTIPS.get()) { + getInformation(stack, context, tooltip2, flagIn); } + if (!caster.getFlavorText().isEmpty()) tooltip2.add(Component.literal(caster.getFlavorText()).withStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.BLUE))); - } else{ - getInformation(stack, context, tooltip2, flagIn); - } - tooltip2.add(Component.translatable("tooltip.ars_nouveau.caster_tome")); + tooltip2.add(Component.translatable("tooltip.ars_nouveau.caster_tome")); + } super.appendHoverText(stack, context, tooltip2, flagIn); } @@ -77,7 +81,7 @@ public int getManaDiscount(ItemStack i, Spell spell) { @Override public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { AbstractCaster caster = getSpellCaster(pStack); - if (!Screen.hasShiftDown() && Config.GLYPH_TOOLTIPS.get() && !caster.isSpellHidden() && !caster.getSpell().isEmpty()) + if (caster != null && !Screen.hasShiftDown() && Config.GLYPH_TOOLTIPS.get() && !caster.isSpellHidden() && !caster.getSpell().isEmpty()) return Optional.of(new SpellTooltip(caster)); return Optional.empty(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java index 43224f9b7b..2574aff68b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersMirror.java @@ -4,15 +4,19 @@ import com.hollingsworth.arsnouveau.api.item.ISpellModifierItem; import com.hollingsworth.arsnouveau.api.mana.IManaDiscountEquipment; import com.hollingsworth.arsnouveau.api.spell.*; +import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; import com.hollingsworth.arsnouveau.client.renderer.item.MirrorRenderer; import com.hollingsworth.arsnouveau.common.spell.method.MethodSelf; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.config.Config; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; @@ -27,6 +31,7 @@ import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.function.Consumer; public class EnchantersMirror extends ModItem implements ICasterTool, GeoItem, ISpellModifierItem, IManaDiscountEquipment { @@ -82,7 +87,8 @@ public void scribeModifiedSpell(AbstractCaster caster, Player player, Interac @Override public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { - getInformation(stack, context, tooltip2, flagIn); + if (Screen.hasShiftDown() || !Config.GLYPH_TOOLTIPS.get()) + getInformation(stack, context, tooltip2, flagIn); new SpellStats.Builder().addDurationModifier(1.0).build().addTooltip(tooltip2); super.appendHoverText(stack, context, tooltip2, flagIn); } @@ -106,4 +112,12 @@ public void createGeoRenderer(Consumer consumer) { }); } + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + AbstractCaster caster = getSpellCaster(pStack); + if (caster != null && !Screen.hasShiftDown() && Config.GLYPH_TOOLTIPS.get() && !caster.isSpellHidden() && !caster.getSpell().isEmpty()) + return Optional.of(new SpellTooltip(caster)); + return Optional.empty(); + } + } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java index d05fbf86cc..966cd50584 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java @@ -6,12 +6,15 @@ import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.IWrappedCaster; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.LivingCaster; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.PlayerCaster; +import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; import com.hollingsworth.arsnouveau.client.renderer.item.SwordRenderer; import com.hollingsworth.arsnouveau.common.perk.RepairingPerk; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.config.Config; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; @@ -20,6 +23,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.SwordItem; import net.minecraft.world.item.Tier; @@ -35,6 +39,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.function.Consumer; import static com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry.defaultItemProperties; @@ -88,10 +93,19 @@ public boolean hurtEnemy(@NotNull ItemStack stack, LivingEntity target, @NotNull @Override public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { - getInformation(stack, context, tooltip2, flagIn); + if (Screen.hasShiftDown() || !Config.GLYPH_TOOLTIPS.get()) + getInformation(stack, context, tooltip2, flagIn); super.appendHoverText(stack, context, tooltip2, flagIn); } + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + AbstractCaster caster = getSpellCaster(pStack); + if (caster != null && !Screen.hasShiftDown() && Config.GLYPH_TOOLTIPS.get() && !caster.isSpellHidden() && !caster.getSpell().isEmpty()) + return Optional.of(new SpellTooltip(caster)); + return Optional.empty(); + } + @Override public void registerControllers(AnimatableManager.ControllerRegistrar animatableManager) { } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java index 54ed321703..39e87a6d3e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java @@ -3,17 +3,20 @@ import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import com.hollingsworth.arsnouveau.api.spell.SpellSchool; +import com.hollingsworth.arsnouveau.client.gui.SchoolTooltip; import com.hollingsworth.arsnouveau.common.capability.IPlayerCap; import com.hollingsworth.arsnouveau.setup.config.Config; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; @@ -23,6 +26,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Optional; public class Glyph extends ModItem { public AbstractSpellPart spellPart; @@ -70,9 +74,11 @@ public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext co tooltip2.add(Component.translatable("tooltip.ars_nouveau.glyph_disabled")); } else if (spellPart != null) { tooltip2.add(Component.translatable("tooltip.ars_nouveau.glyph_level", spellPart.getConfigTier().value).setStyle(Style.EMPTY.withColor(ChatFormatting.BLUE))); - tooltip2.add(Component.translatable("ars_nouveau.schools")); - for (SpellSchool s : spellPart.spellSchools) { - tooltip2.add(s.getTextComponent()); + if (Screen.hasShiftDown()) { + tooltip2.add(Component.translatable("ars_nouveau.schools")); + for (SpellSchool s : spellPart.spellSchools) { + tooltip2.add(s.getTextComponent()); + } } } @@ -87,11 +93,18 @@ public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext co tooltip2.add(Component.translatable("tooltip.ars_nouveau.glyph_unknown").setStyle(Style.EMPTY.withColor(ChatFormatting.DARK_RED))); } } - tooltip2.add(Component.translatable(" ")); if (InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), Minecraft.getInstance().options.keyShift.getKey().getValue())) { tooltip2.add(spellPart.getBookDescLang()); } else { tooltip2.add(Component.translatable("tooltip.ars_nouveau.hold_shift", Minecraft.getInstance().options.keyShift.getKey().getDisplayName())); } } + + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + if (!Screen.hasShiftDown() && spellPart != null && !spellPart.spellSchools.isEmpty()) { + return Optional.of(new SchoolTooltip(spellPart)); + } + return Optional.empty(); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java index ed7f98cada..d82395f456 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBow.java @@ -4,14 +4,17 @@ import com.hollingsworth.arsnouveau.api.mana.IManaDiscountEquipment; import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.PlayerCaster; +import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; import com.hollingsworth.arsnouveau.client.renderer.item.SpellBowRenderer; import com.hollingsworth.arsnouveau.common.entity.EntitySpellArrow; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentSplit; import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; import com.hollingsworth.arsnouveau.common.util.HolderHelper; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.config.Config; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; @@ -24,6 +27,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; @@ -39,6 +43,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.function.Consumer; import java.util.function.Predicate; @@ -243,10 +248,19 @@ public AnimatableInstanceCache getAnimatableInstanceCache() { @Override public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { - getInformation(stack, context, tooltip2, flagIn); + if (Screen.hasShiftDown() || !Config.GLYPH_TOOLTIPS.get()) + getInformation(stack, context, tooltip2, flagIn); super.appendHoverText(stack, context, tooltip2, flagIn); } + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + AbstractCaster caster = getSpellCaster(pStack); + if (caster != null && Config.GLYPH_TOOLTIPS.get() && !Screen.hasShiftDown() && !caster.isSpellHidden() && !caster.getSpell().isEmpty()) + return Optional.of(new SpellTooltip(caster)); + return Optional.empty(); + } + @Override public boolean isScribedSpellValid(AbstractCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { return spell.unsafeList().stream().noneMatch(s -> s instanceof AbstractCastMethod); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java index f2eacca532..a565ad7143 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellCrossbow.java @@ -5,12 +5,15 @@ import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.LivingCaster; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.PlayerCaster; +import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; import com.hollingsworth.arsnouveau.client.renderer.item.SpellCrossbowRenderer; import com.hollingsworth.arsnouveau.common.entity.EntitySpellArrow; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentSplit; import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.config.Config; import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; @@ -26,6 +29,7 @@ import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.FireworkRocketEntity; import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.*; import net.minecraft.world.item.component.ChargedProjectiles; import net.minecraft.world.item.component.CustomData; @@ -221,10 +225,19 @@ public EntitySpellArrow buildSpellArrow(Level worldIn, LivingEntity playerentity @Override public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { - getInformation(stack, context, tooltip2, flagIn); + if (Screen.hasShiftDown() || !Config.GLYPH_TOOLTIPS.get()) + getInformation(stack, context, tooltip2, flagIn); super.appendHoverText(stack, context, tooltip2, flagIn); } + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + AbstractCaster caster = getSpellCaster(pStack); + if (caster != null && Config.GLYPH_TOOLTIPS.get() && !Screen.hasShiftDown() && !caster.isSpellHidden() && !caster.getSpell().isEmpty()) + return Optional.of(new SpellTooltip(caster)); + return Optional.empty(); + } + @Override public boolean isScribedSpellValid(AbstractCaster caster, Player player, InteractionHand hand, ItemStack stack, Spell spell) { return spell.unsafeList().stream().noneMatch(s -> s instanceof AbstractCastMethod); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java index 3bafd25646..3cc286a34f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellParchment.java @@ -42,7 +42,7 @@ public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext co @Override public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { AbstractCaster caster = getSpellCaster(pStack); - if (Config.GLYPH_TOOLTIPS.get() && !Screen.hasShiftDown() && !caster.isSpellHidden() && !caster.getSpell().isEmpty()) + if (caster != null && Config.GLYPH_TOOLTIPS.get() && !Screen.hasShiftDown() && !caster.isSpellHidden() && !caster.getSpell().isEmpty()) return Optional.of(new SpellTooltip(caster)); return Optional.empty(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java index 3d26056854..2bcb822026 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Wand.java @@ -2,16 +2,20 @@ import com.hollingsworth.arsnouveau.api.item.ICasterTool; import com.hollingsworth.arsnouveau.api.spell.*; +import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; import com.hollingsworth.arsnouveau.client.renderer.item.WandRenderer; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAccelerate; import com.hollingsworth.arsnouveau.common.spell.method.MethodProjectile; import com.hollingsworth.arsnouveau.common.util.PortUtil; +import com.hollingsworth.arsnouveau.setup.config.Config; import com.hollingsworth.arsnouveau.setup.registry.DataComponentRegistry; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; @@ -26,6 +30,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.function.Consumer; public class Wand extends ModItem implements GeoItem, ICasterTool { @@ -82,7 +87,8 @@ public void scribeModifiedSpell(AbstractCaster caster, Player player, Interac @Override public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext context, @NotNull List tooltip2, @NotNull TooltipFlag flagIn) { - getInformation(stack, context, tooltip2, flagIn); + if (Screen.hasShiftDown() || !Config.GLYPH_TOOLTIPS.get()) + getInformation(stack, context, tooltip2, flagIn); super.appendHoverText(stack, context, tooltip2, flagIn); } @@ -96,4 +102,13 @@ public BlockEntityWithoutLevelRenderer getGeoItemRenderer() { } }); } + + + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + AbstractCaster caster = getSpellCaster(pStack); + if (caster != null && Config.GLYPH_TOOLTIPS.get() && !Screen.hasShiftDown() && !caster.isSpellHidden() && !caster.getSpell().isEmpty()) + return Optional.of(new SpellTooltip(caster)); + return Optional.empty(); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WixieCharm.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WixieCharm.java index 6785ce10ec..9ba5d7adbf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WixieCharm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/summon_charms/WixieCharm.java @@ -15,6 +15,7 @@ import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.CauldronBlock; +import org.jetbrains.annotations.NotNull; public class WixieCharm extends AbstractSummonCharm { public WixieCharm() { @@ -24,7 +25,7 @@ public WixieCharm() { /** * Called when this item is used when targetting a Block */ - public InteractionResult useOn(UseOnContext context) { + public @NotNull InteractionResult useOn(UseOnContext context) { return super.useOn(context); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/potions/SummoningSicknessEffect.java b/src/main/java/com/hollingsworth/arsnouveau/common/potions/SummoningSicknessEffect.java index 009c232e37..2887dd6b71 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/potions/SummoningSicknessEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/potions/SummoningSicknessEffect.java @@ -2,9 +2,18 @@ import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.effect.MobEffectInstance; +import net.neoforged.neoforge.common.EffectCure; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; public class SummoningSicknessEffect extends MobEffect { public SummoningSicknessEffect() { super(MobEffectCategory.HARMFUL, 2039587); } + + @Override + public void fillEffectCures(@NotNull Set cures, @NotNull MobEffectInstance effectInstance) { + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java index 3fe34feb19..437c93614b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java @@ -49,6 +49,11 @@ public void buildConfig(ModConfigSpec.Builder builder) { return Set.of(AugmentExtendTime.INSTANCE, AugmentAmplify.INSTANCE, AugmentDampen.INSTANCE, AugmentDurationDown.INSTANCE); } + @Override + protected @NotNull Set getSchools() { + return Set.of(SpellSchools.ELEMENTAL_WATER); + } + @Override public String getBookDescription() { return "Captures mobs and entities it touches, causing them to float upwards. If the bubble has been alive for at least one tick, damaging the entity trapped in the bubble will cause it to pop, dealing bonus damage to the entity inside. Extend time and amplify can be used to increase the duration and damage of the bubble."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java b/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java index 28da85b28f..0d83d8376c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/config/Config.java @@ -68,6 +68,8 @@ public class Config { public static ModConfigSpec.IntValue TOOLTIP_Y_OFFSET; public static ModConfigSpec.IntValue MANABAR_X_OFFSET; public static ModConfigSpec.IntValue MANABAR_Y_OFFSET; + public static ModConfigSpec.IntValue SPELLNAME_X_OFFSET; + public static ModConfigSpec.IntValue SPELLNAME_Y_OFFSET; public static ModConfigSpec.BooleanValue TOGGLE_RADIAL_HUD; public static ModConfigSpec.IntValue BOOKWYRM_LIMIT; public static ModConfigSpec.BooleanValue GUI_TRANSPARENCY; @@ -112,6 +114,9 @@ public static boolean isGlyphEnabled(AbstractSpellPart tag) { TOOLTIP_Y_OFFSET = CLIENT_BUILDER.comment("Y offset for the tooltip").defineInRange("yTooltip", 0, Integer.MIN_VALUE, Integer.MAX_VALUE); MANABAR_X_OFFSET = CLIENT_BUILDER.comment("X offset for the Mana Bar").defineInRange("xManaBar", 0, Integer.MIN_VALUE, Integer.MAX_VALUE); MANABAR_Y_OFFSET = CLIENT_BUILDER.comment("Y offset for the Mana Bar").defineInRange("yManaBar", 0, Integer.MIN_VALUE, Integer.MAX_VALUE); + SPELLNAME_X_OFFSET = CLIENT_BUILDER.comment("X offset for the Spell Name").defineInRange("xSpellName", 10, Integer.MIN_VALUE, Integer.MAX_VALUE); + SPELLNAME_Y_OFFSET = CLIENT_BUILDER.comment("Y offset for the Spell Name").defineInRange("ySpellName", 30, Integer.MIN_VALUE, Integer.MAX_VALUE); + SHOW_RECIPE_BOOK = CLIENT_BUILDER.comment("If the Storage Lectern should show the recipe book icon").define("showRecipeBook", true); INFORM_LIGHTS = CLIENT_BUILDER.comment("Inform the player of Dynamic lights once.").define("informLights", true); TOGGLE_RADIAL_HUD = CLIENT_BUILDER.comment("Whether the Selection HUD is toggled or held").define("toggleSelectionHUD", true); diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml index e9960b14e9..832ecde8bd 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -51,9 +51,9 @@ license="GNU GENERAL PUBLIC LICENSE" [[mixins]] config="ars_nouveau.mixins.json" -[[dependencies.ars_nouveau]] - modId="jei" - mandatory=true - versionRange="[1.19-5.0.7.1,)" - ordering="AFTER" - side="BOTH" \ No newline at end of file +#[[dependencies.ars_nouveau]] +# modId="jei" +# mandatory=true +# versionRange="[1.19-5.0.7.1,)" +# ordering="AFTER" +# side="BOTH" \ No newline at end of file diff --git a/src/main/resources/assets/ars_nouveau/textures/gui/bundle.png b/src/main/resources/assets/ars_nouveau/textures/gui/bundle.png new file mode 100644 index 0000000000000000000000000000000000000000..a5b55ee4c0b98a83252e640e0841fb192fdf1965 GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&v7|ftIx;Y9?C1WI$O`0(2Ka=y znwy({DOhvK)@j7&FlsgTIcEF7*cWT?G0b4`j`;4~EbmcSdYB#07U!1hDlo6;J2>wVX#8kI4&JSl;&RA{^ z5d*sG%X`k}*FM@W-YGSSDM3)BSFnQR>3cQs^m3o7d!{&;fX4hCsy>G>*WcN{U?)8NZ&H=9$+ zVaooCxkpm1FJA2ORXjN>ahvk)rZp|5KNuN)J`CL);rZhL&~ye*S3j3^P6m^>g6=i$_a%rYDAaPf4qJPSjxDpsA)= waPnHmX@N<+&fl1fj-^|8>McIeaFCP1#Ub^(U)i|}K*Je4UHx3vIVCg!0OBb%;{X5v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ars_nouveau/textures/gui/schools/earth_tooltip.png b/src/main/resources/assets/ars_nouveau/textures/gui/schools/earth_tooltip.png new file mode 100644 index 0000000000000000000000000000000000000000..d7a6bdc62ebd569af231423e3f497df9bcf65e82 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Vm)0PLo9le z6C^%02*xVBytw7R!8eK#RjRdQR7|I&~aq5re0zpUXO@ GgeCx>sy7D! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ars_nouveau/textures/gui/schools/fire_tooltip.png b/src/main/resources/assets/ars_nouveau/textures/gui/schools/fire_tooltip.png new file mode 100644 index 0000000000000000000000000000000000000000..1b30fd27cf456a5d80926f3fd5917f60e99c6297 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|+&x_!Lo9le z6D00EaE`k5pFcD6zorqxOtom?i);@zP0X17AlPGy;*FeRPokbA2M=ysN uEYemwYRzJrD4c#|nZWdy!|G_}SWz`9kiYR1R)M z@he9;jg_R`4AcsKPE~0*Es)c8NllSgmw_SL!{&6-4x4R2(-}Nn{an^LB{Ts5{9iMt literal 0 HcmV?d00001 From a8b5e7d08c5092515f9f19d2350b4499877df1f0 Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Sun, 10 Nov 2024 00:19:36 +0100 Subject: [PATCH 269/363] Update README.md (#1495) Changes maven to 1.21.1 from 1.21 --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 44d8a95c79..b207155949 100644 --- a/README.md +++ b/README.md @@ -20,14 +20,14 @@ dependencies { // Ars Nouveau implementation "com.hollingsworth.ars_nouveau:ars_nouveau-[MC_VERSION]:[ARS_VERSION]" - // Ars dependencies + // Ars dependencies, should be automatically downloaded by gradle but include them if they don't implementation "software.bernie.geckolib:geckolib-neoforge-[MC_VERSION]:[GECKOLIB_VERSION]" implementation 'top.theillusivec4.curios:curios-neoforge:[CURIO_VERSION]' } ``` -Current version (1.21): -[![Maven](https://img.shields.io/maven-metadata/v?label=&color=C71A36&metadataUrl=https%3A%2F%2Fmaven.blamejared.com%2Fcom%2Fhollingsworth%2Fars_nouveau%2Fars_nouveau-1.21.0%2Fmaven-metadata.xml&style=flat-square)](https://maven.blamejared.com/com/hollingsworth/ars_nouveau/ars_nouveau-1.21.0/) +Current version (1.21.1): +[![Maven](https://img.shields.io/maven-metadata/v?label=&color=C71A36&metadataUrl=https%3A%2F%2Fmaven.blamejared.com%2Fcom%2Fhollingsworth%2Fars_nouveau%2Fars_nouveau-1.21.1%2Fmaven-metadata.xml&style=flat-square)](https://maven.blamejared.com/com/hollingsworth/ars_nouveau/ars_nouveau-1.21.1/) (remove the v) From 3756f9ad17f3da74f331b95ba8658d42382f05d6 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 10 Nov 2024 10:40:56 -0600 Subject: [PATCH 270/363] update supporters --- .../cdae075e2d4d58384fe4d2075f6d5323fe5baa69 | 3 +- .../ars_nouveau/recipe/tomes/lufia_tome.json | 30 +++++++++++++++++++ .../common/datagen/CasterTomeProvider.java | 10 +++++++ supporters.json | 7 ++++- 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/lufia_tome.json diff --git a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 index 701489dc2e..f2fd3c308b 100644 --- a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 +++ b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 @@ -1,4 +1,4 @@ -// 1.21.1 2024-10-21T11:24:04.7862855 Ars Nouveau Caster Tomes Datagen +// 1.21.1 2024-11-10T10:39:34.8948897 Ars Nouveau Caster Tomes Datagen ab9cf50e4958592dcee6f5dae6d6bad2e7fe08ab data/ars_nouveau/recipe/tomes/alex_tome.json dae41a867bde9258624fe4676128e8140f2e7fe4 data/ars_nouveau/recipe/tomes/arachne_tome.json 71e004bfa5837d293c6ee00dd9fd99493b9b9aba data/ars_nouveau/recipe/tomes/aurellia_tome.json @@ -13,6 +13,7 @@ f64772fb96f68b7865f64ee40a8718e1a2412fce data/ars_nouveau/recipe/tomes/fireball_ 787770b1ff09200b5f0b8ad6b30236f532ed7687 data/ars_nouveau/recipe/tomes/gootastic_tome.json fa2eefd9631a78bf8c31e4c9aad34a2517bb9736 data/ars_nouveau/recipe/tomes/ivy_tome.json 488adf82fa89d69891e333e9bb94290f8ff6b6b1 data/ars_nouveau/recipe/tomes/kirin_tome.json +43d839ec049575b8c5a5cff6c6c7ff9f2605994c data/ars_nouveau/recipe/tomes/lufia_tome.json 9836505724bc647ab6d1f92f212ad618456c878c data/ars_nouveau/recipe/tomes/lyrellion_tome.json d7ff05ccece42ac8ee440c7ef0d707e7c3f7e78b data/ars_nouveau/recipe/tomes/othy_tome.json b7b6cc3145b830c0e936f67d3aec459142c85a2c data/ars_nouveau/recipe/tomes/poseidon_tome.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/lufia_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/lufia_tome.json new file mode 100644 index 0000000000..55cdff8287 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/lufia_tome.json @@ -0,0 +1,30 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 1, + "g": 128, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Your enemies will try to kill you. Use this, to kill them back. Cast under a targets feet to bury them. Results may vary.", + "name": "Lufia's Bwomp", + "sound": { + "pitch": 0.5, + "sound": { + "id": "ars_nouveau:tempestry_family" + } + }, + "spell": [ + "ars_nouveau:glyph_projectile", + "ars_nouveau:glyph_sensitive", + "ars_nouveau:glyph_pierce", + "ars_nouveau:glyph_pierce", + "ars_nouveau:glyph_pierce", + "ars_nouveau:glyph_intangible", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java index fc956e23e2..c6484a7c5a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java @@ -264,6 +264,16 @@ public void collectJsons(CachedOutput pOutput) { .add(AugmentRandomize.INSTANCE) .add(EffectPickup.INSTANCE) .withSound(new ConfiguredSpellSound(SoundRegistry.GAIA_SPELL_SOUND, 0.55f, 2.0f)), "In a flash of magic, the world twists, and what was once here is now there.", new ParticleColor(255, 114, 32))); + + tomes.add(buildTome("lufia", "Lufia's Bwomp", new Spell(MethodProjectile.INSTANCE) + .add(AugmentSensitive.INSTANCE) + .add(AugmentPierce.INSTANCE, 3) + .add(EffectIntangible.INSTANCE) + .add(AugmentAOE.INSTANCE, 4) + .withSound(new ConfiguredSpellSound(SoundRegistry.TEMPESTRY_SPELL_SOUND, 1.0f, 0.5f)), + "Your enemies will try to kill you. Use this, to kill them back. Cast under a targets feet to bury them. Results may vary.", + new ParticleColor(255, 128, 1))); + for (CasterRecipeWrapper g : tomes) { Path path = getRecipePath(output, g.id().getPath()); saveStable(pOutput, CasterTomeData.CODEC.encodeStart(JsonOps.INSTANCE, g.toData()).getOrThrow(), path); diff --git a/supporters.json b/supporters.json index b8b040b5a3..3c54764d67 100644 --- a/supporters.json +++ b/supporters.json @@ -31,7 +31,7 @@ "0421ad40-0881-47d4-b086-38c90c1ab62f", "a8875ecb-6e84-4c6d-ac68-3251b945d963", "cf1f7109-266d-4e5a-8a8a-d93684cf60b9", "e7976ce2-3344-4499-8b15-91adddc5ed0f", "d29025d7-cf5d-4976-8a65-fc3bdcc991b5", "8ced638c-eac7-433e-b794-54c0f23807a4", "db489a87-6509-4d75-917d-9c426b519c64", "eb079f27-e266-4b3c-beba-b34d34bef268", "831086b8-d566-4f25-aa09-ecb505e54885", - "e3298bd7-61bf-427f-af89-4e418a20bf57", "01b53c7e-c7f4-4465-88df-f8b6c645b6b9"], + "e3298bd7-61bf-427f-af89-4e418a20bf57", "01b53c7e-c7f4-4465-88df-f8b6c645b6b9", "a29ffabb-ac40-4754-8df8-94b9f394045c"], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -503,6 +503,11 @@ "color": "gray", "adopter": "ImPaw", "bio": "Not to be left unsupervised." + },{ + "name": "Boo", + "adopter": "Lufia", + "color": "black", + "bio": "Eternal Companion to the Spellblade Lufia, reincarnated in this life to help you on your journey. She may eat your snacks when you aren't looking. Real cat-like behavior right there. " } ] } From a3a3a06b359af6357bd3c907d12f13d292f5679b Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 10 Nov 2024 11:42:50 -0600 Subject: [PATCH 271/363] Fix grate deleting waterlogged blocks, support cauldrons (#1499) --- .../arsnouveau/common/block/ItemGrate.java | 35 ++++++++++++++++--- .../common/mixin/BlockBehaviourAccessor.java | 21 +++++++++++ src/main/resources/ars_nouveau.mixins.json | 1 + 3 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/mixin/BlockBehaviourAccessor.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ItemGrate.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ItemGrate.java index e0277a9b52..3e3017cd92 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ItemGrate.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ItemGrate.java @@ -1,6 +1,8 @@ package com.hollingsworth.arsnouveau.common.block; +import com.hollingsworth.arsnouveau.api.ANFakePlayer; import com.hollingsworth.arsnouveau.common.lib.EntityTags; +import com.hollingsworth.arsnouveau.common.mixin.BlockBehaviourAccessor; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -22,6 +24,7 @@ import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.EntityCollisionContext; import net.minecraft.world.phys.shapes.Shapes; @@ -67,16 +70,40 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { @Override protected void tick(BlockState pState, ServerLevel pLevel, BlockPos pPos, RandomSource pRandom) { super.tick(pState, pLevel, pPos, pRandom); + BlockPos below = pPos.below(); BlockState stateAbove = pLevel.getBlockState(pPos.above()); - BlockState stateBelow = pLevel.getBlockState(pPos.below()); - if( stateAbove.getFluidState().isSource()) { - if (stateBelow.getBlock() instanceof LiquidBlockContainer blockContainer && blockContainer.canPlaceLiquid(null, pLevel, pPos.below(), stateBelow, stateAbove.getFluidState().getType())) { + BlockState stateBelow = pLevel.getBlockState(below); + if(stateAbove.getFluidState().isSource()) { + if (stateBelow.getBlock() instanceof LiquidBlockContainer blockContainer + && blockContainer.canPlaceLiquid(null, pLevel, pPos.below(), stateBelow, stateAbove.getFluidState().getType())) { if(blockContainer.placeLiquid(pLevel, pPos.below(), stateBelow, stateAbove.getFluidState())){ - pLevel.setBlockAndUpdate(pPos.above(), Blocks.AIR.defaultBlockState()); + if(stateAbove.getBlock() instanceof BucketPickup bucketPickup){ + bucketPickup.pickupBlock(null, pLevel, pPos.above(), stateAbove); + } + if(pLevel.getBlockState(pPos.above()).getFluidState().isSource()){ + pLevel.setBlockAndUpdate(pPos.above(), Blocks.AIR.defaultBlockState()); + } } } else if (stateBelow.canBeReplaced()) { pLevel.setBlockAndUpdate(pPos.below(), stateAbove); pLevel.setBlockAndUpdate(pPos.above(), Blocks.AIR.defaultBlockState()); + }else if (stateBelow.getBlock() instanceof CauldronBlock cauldronBlock + && !cauldronBlock.isFull(stateBelow)) { + if(stateAbove.getBlock() instanceof BucketPickup bucketPickup){ + + ItemStack stack = bucketPickup.pickupBlock(null, pLevel, pPos.above(), stateAbove); + if(!stack.isEmpty()){ + var accessor = (BlockBehaviourAccessor) cauldronBlock; + ANFakePlayer fakePlayer = ANFakePlayer.getPlayer(pLevel); + fakePlayer.setItemInHand(InteractionHand.MAIN_HAND, stack.copy()); + ItemInteractionResult result = accessor.callUseItemOn(stack, stateBelow, pLevel, pPos.below(), fakePlayer, InteractionHand.MAIN_HAND, new BlockHitResult(new Vec3(below.getX(), below.getY(), below.getZ()), Direction.UP, pPos.below(), false)); + if(!ItemStack.isSameItem(fakePlayer.getItemInHand(InteractionHand.MAIN_HAND), stack)){ + if(pLevel.getBlockState(pPos.above()).getFluidState().isSource()){ + pLevel.setBlockAndUpdate(pPos.above(), Blocks.AIR.defaultBlockState()); + } + } + } + } } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mixin/BlockBehaviourAccessor.java b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/BlockBehaviourAccessor.java new file mode 100644 index 0000000000..4f19e45f9f --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mixin/BlockBehaviourAccessor.java @@ -0,0 +1,21 @@ +package com.hollingsworth.arsnouveau.common.mixin; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.ItemInteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(BlockBehaviour.class) +public interface BlockBehaviourAccessor { + @Invoker + ItemInteractionResult callUseItemOn( + ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult + ); +} diff --git a/src/main/resources/ars_nouveau.mixins.json b/src/main/resources/ars_nouveau.mixins.json index 592507633f..0ec4bf9a93 100644 --- a/src/main/resources/ars_nouveau.mixins.json +++ b/src/main/resources/ars_nouveau.mixins.json @@ -17,6 +17,7 @@ "light.LightEntityMixin" ], "mixins": [ + "BlockBehaviourAccessor", "BrushableBlockEntityAccessor", "DamageSourceMixin", "EntityMixin", From 69d2d4a5eda543fa5f2df01ea177839d8a18430b Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Sun, 10 Nov 2024 18:46:16 +0100 Subject: [PATCH 272/363] hotfix on positioning, aliases for school for glyph items (lost due to hiding school while shifting) (#1498) --- .../arsnouveau/client/gui/SchoolTooltip.java | 8 +++- .../client/jei/JEIArsNouveauPlugin.java | 37 ++++++++++++++++--- .../arsnouveau/common/items/Glyph.java | 2 +- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/SchoolTooltip.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/SchoolTooltip.java index f4c48a18a8..451ef7db66 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/SchoolTooltip.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/SchoolTooltip.java @@ -11,14 +11,18 @@ import java.util.List; -public record SchoolTooltip(AbstractSpellPart part) implements TooltipComponent { +public record SchoolTooltip(AbstractSpellPart part, boolean glyphItem) implements TooltipComponent { + + public SchoolTooltip(AbstractSpellPart part) { + this(part, false); + } public List schools() { return part.spellSchools; } public String name() { - return Component.translatable("ars_nouveau.glyph_of", part.getLocaleName()).getString(); + return glyphItem ? Component.translatable("ars_nouveau.glyph_of", part.getLocaleName()).getString() : part.getLocaleName(); } public static class SchoolTooltipRenderer implements ClientTooltipComponent { diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIArsNouveauPlugin.java b/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIArsNouveauPlugin.java index b31f9a1d5c..1c8c4e5ba4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIArsNouveauPlugin.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/jei/JEIArsNouveauPlugin.java @@ -1,7 +1,10 @@ package com.hollingsworth.arsnouveau.client.jei; import com.hollingsworth.arsnouveau.ArsNouveau; +import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; import com.hollingsworth.arsnouveau.api.registry.RitualRegistry; +import com.hollingsworth.arsnouveau.api.spell.SpellSchool; +import com.hollingsworth.arsnouveau.api.spell.SpellSchools; import com.hollingsworth.arsnouveau.client.container.IAutoFillTerminal; import com.hollingsworth.arsnouveau.common.crafting.recipes.*; import com.hollingsworth.arsnouveau.common.spell.effect.EffectCrush; @@ -10,18 +13,22 @@ import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry; import mezz.jei.api.IModPlugin; import mezz.jei.api.JeiPlugin; +import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.recipe.RecipeType; import mezz.jei.api.registration.*; import mezz.jei.api.runtime.IJeiRuntime; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeManager; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; import static com.hollingsworth.arsnouveau.client.jei.ScryRitualRecipeCategory.SCRY_RITUAL; @@ -38,8 +45,8 @@ public class JEIArsNouveauPlugin implements IModPlugin { public static final RecipeType SCRY_RITUAL_RECIPE_TYPE = RecipeType.create(ArsNouveau.MODID, "scry_ritual", ScryRitualRecipe.class); @Override - public ResourceLocation getPluginUid() { - return ArsNouveau.prefix( "main"); + public @NotNull ResourceLocation getPluginUid() { + return ArsNouveau.prefix("main"); } @Override @@ -57,7 +64,7 @@ public void registerCategories(IRecipeCategoryRegistration registry) { } @Override - public void registerRecipes(IRecipeRegistration registry) { + public void registerRecipes(@NotNull IRecipeRegistration registry) { List recipeList = new ArrayList<>(); List apparatus = new ArrayList<>(); List enchantments = new ArrayList<>(); @@ -114,12 +121,12 @@ public void registerRecipeCatalysts(IRecipeCatalystRegistration registry) { } @Override - public void registerGuiHandlers(IGuiHandlerRegistration registration) { + public void registerGuiHandlers(@NotNull IGuiHandlerRegistration registration) { // registration.addRecipeClickArea(CraftingTerminalScreen.class, 100, 125, 28, 23, new RecipeType[] { RecipeTypes.CRAFTING }); } @Override - public void registerRecipeTransferHandlers(IRecipeTransferRegistration registration) { + public void registerRecipeTransferHandlers(@NotNull IRecipeTransferRegistration registration) { CraftingTerminalTransferHandler.registerTransferHandlers(registration); } @@ -128,10 +135,28 @@ public void registerVanillaCategoryExtensions(IVanillaCategoryExtensionRegistrat registration.getCraftingCategory().addExtension(DyeRecipe.class, new DyeRecipeCategory()); } + @Override + public void registerIngredientAliases(@NotNull IIngredientAliasRegistration registration) { + + // for each school, add an alias for the glyph + List schools = List.of(SpellSchools.ELEMENTAL, SpellSchools.ABJURATION, SpellSchools.CONJURATION, SpellSchools.NECROMANCY, SpellSchools.MANIPULATION, SpellSchools.ELEMENTAL_AIR, SpellSchools.ELEMENTAL_EARTH, SpellSchools.ELEMENTAL_FIRE, SpellSchools.ELEMENTAL_WATER); + + for (SpellSchool school : schools) { + registration.addAliases(VanillaTypes.ITEM_STACK, GlyphRegistry.getGlyphItemMap().values() + .stream() + .map(Supplier::get) + .filter(glyph -> school.isPartOfSchool(glyph.spellPart)) + .map(Item::getDefaultInstance) + .toList(), + school.getTextComponent().getString()); + } + + } + private static IJeiRuntime jeiRuntime; @Override - public void onRuntimeAvailable(IJeiRuntime jeiRuntime) { + public void onRuntimeAvailable(@NotNull IJeiRuntime jeiRuntime) { JEIArsNouveauPlugin.jeiRuntime = jeiRuntime; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java index 39e87a6d3e..24be8e7208 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/Glyph.java @@ -103,7 +103,7 @@ public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext co @Override public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { if (!Screen.hasShiftDown() && spellPart != null && !spellPart.spellSchools.isEmpty()) { - return Optional.of(new SchoolTooltip(spellPart)); + return Optional.of(new SchoolTooltip(spellPart, true)); } return Optional.empty(); } From 89b1d227b695bf79f9e04f8a41be76d9bed44fb3 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 10 Nov 2024 11:48:23 -0600 Subject: [PATCH 273/363] Add creative jar loot table #1489 --- .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 3 ++- .../blocks/creative_source_jar.json | 21 +++++++++++++++++++ .../common/datagen/DefaultTableProvider.java | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/generated/resources/data/ars_nouveau/loot_table/blocks/creative_source_jar.json diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d index fa9da74b29..af7ccaccdc 100644 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -1,4 +1,4 @@ -// 1.21.1 2024-09-11T20:19:28.537053 Loot Tables +// 1.21.1 2024-11-10T11:47:56.4656631 Loot Tables 4f70eae621815da8d08d3ea0b9fd479b48bad2d3 data/ars_nouveau/loot_table/blocks/agronomic_sourcelink.json 8a6d60f2b39de0408c7e4537b53e866a04236d22 data/ars_nouveau/loot_table/blocks/alchemical_sourcelink.json 8bdff8a0a49a9f3f21a822eb1d1d01a950d6ad1a data/ars_nouveau/loot_table/blocks/alteration_table.json @@ -26,6 +26,7 @@ ecc018a81786cc6a6e28d361245f41ac11dbe254 data/ars_nouveau/loot_table/blocks/blue d74fd91465aa6474895a69ce39c3c63e96cd61af data/ars_nouveau/loot_table/blocks/blue_sbed.json fe4e42346e3f3b02b067ec99d988953be10780f3 data/ars_nouveau/loot_table/blocks/bombegranate_pod.json 25879b59f556935200d2f9d63e9fe18c0f8b6375 data/ars_nouveau/loot_table/blocks/brazier_relay.json +d55a3d256fd7d71a17fc46cb1373ddf4581ebaab data/ars_nouveau/loot_table/blocks/creative_source_jar.json cf0a6f8a23b9a04aac70bae40c63d8e57b1006a6 data/ars_nouveau/loot_table/blocks/drygmy_stone.json 50fb5a022df6f6d156c90ee3121ccfe82943beb7 data/ars_nouveau/loot_table/blocks/enchanting_apparatus.json 7a2afda0f26e560c401265332ba8466e324c2b90 data/ars_nouveau/loot_table/blocks/falseweave.json diff --git a/src/generated/resources/data/ars_nouveau/loot_table/blocks/creative_source_jar.json b/src/generated/resources/data/ars_nouveau/loot_table/blocks/creative_source_jar.json new file mode 100644 index 0000000000..2be1942298 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/loot_table/blocks/creative_source_jar.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ars_nouveau:creative_source_jar" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ars_nouveau:blocks/creative_source_jar" +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java index 864caa5828..16cf087165 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/DefaultTableProvider.java @@ -189,6 +189,7 @@ protected void generate() { registerDropSelf(BlockRegistry.SKY_WEAVE); registerDropSelf(BlockRegistry.ROTATING_TURRET); registerDropSelf(BlockRegistry.SPELL_SENSOR); + registerDropSelf(BlockRegistry.CREATIVE_SOURCE_JAR); add(BlockRegistry.SOURCE_JAR.get(), createManaManchineTable(BlockRegistry.SOURCE_JAR.get())); From 800e6ab170612ec21cfa1634803bf1d80c7cd2e7 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 10 Nov 2024 12:49:26 -0600 Subject: [PATCH 274/363] Fix whirlisprig blossom clipping #1496 --- .../geo/whirlisprig_blossom.geo.json | 12 ++++++------ .../block/whirlisprig_autumn_blossom.png | Bin 633 -> 635 bytes .../textures/block/whirlisprig_blossom.png | Bin 597 -> 615 bytes .../block/whirlisprig_spring_blossom.png | Bin 635 -> 629 bytes .../block/whirlisprig_winter_blossom.png | Bin 636 -> 615 bytes 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/resources/assets/ars_nouveau/geo/whirlisprig_blossom.geo.json b/src/main/resources/assets/ars_nouveau/geo/whirlisprig_blossom.geo.json index 38c1bf8a64..c5d498483a 100644 --- a/src/main/resources/assets/ars_nouveau/geo/whirlisprig_blossom.geo.json +++ b/src/main/resources/assets/ars_nouveau/geo/whirlisprig_blossom.geo.json @@ -43,7 +43,7 @@ "origin": [-2, 12, 0], "size": [4, 4, 0], "uv": { - "north": {"uv": [14, 0], "uv_size": [4, 4]}, + "north": {"uv": [18, 2], "uv_size": [4, 4]}, "east": {"uv": [0, 0], "uv_size": [0, 4]}, "south": {"uv": [14, 0], "uv_size": [4, 4]}, "west": {"uv": [0, 0], "uv_size": [0, 4]}, @@ -59,7 +59,7 @@ "uv": { "north": {"uv": [14, 0], "uv_size": [4, 4]}, "east": {"uv": [0, 0], "uv_size": [0, 4]}, - "south": {"uv": [14, 0], "uv_size": [4, 4]}, + "south": {"uv": [18, 2], "uv_size": [4, 4]}, "west": {"uv": [0, 0], "uv_size": [0, 4]}, "up": {"uv": [0, 0], "uv_size": [4, 0]}, "down": {"uv": [0, 0], "uv_size": [4, 0]} @@ -87,7 +87,7 @@ "south": {"uv": [0, 0], "uv_size": [4, 0]}, "west": {"uv": [0, 0], "uv_size": [9, 0]}, "up": {"uv": [0, 0], "uv_size": [4, 9]}, - "down": {"uv": [0, 9], "uv_size": [4, -9]} + "down": {"uv": [20, 18], "uv_size": [4, -9]} } } ] @@ -109,7 +109,7 @@ "south": {"uv": [0, 0], "uv_size": [4, 0]}, "west": {"uv": [0, 0], "uv_size": [9, 0]}, "up": {"uv": [0, 0], "uv_size": [4, 9]}, - "down": {"uv": [0, 9], "uv_size": [4, -9]} + "down": {"uv": [20, 15], "uv_size": [4, -9]} } } ] @@ -131,7 +131,7 @@ "south": {"uv": [0, 0], "uv_size": [4, 0]}, "west": {"uv": [0, 0], "uv_size": [9, 0]}, "up": {"uv": [0, 0], "uv_size": [4, 9]}, - "down": {"uv": [0, 9], "uv_size": [4, -9]} + "down": {"uv": [20, 17], "uv_size": [4, -9]} } } ] @@ -153,7 +153,7 @@ "south": {"uv": [0, 0], "uv_size": [4, 0]}, "west": {"uv": [0, 0], "uv_size": [9, 0]}, "up": {"uv": [0, 0], "uv_size": [4, 9]}, - "down": {"uv": [0, 9], "uv_size": [4, -9]} + "down": {"uv": [20, 17], "uv_size": [4, -9]} } } ] diff --git a/src/main/resources/assets/ars_nouveau/textures/block/whirlisprig_autumn_blossom.png b/src/main/resources/assets/ars_nouveau/textures/block/whirlisprig_autumn_blossom.png index 92554f5f44343d253ccf9749fb9474df6dc5d352..aec87f46ed173504d9b13d82100b7adc25bf3675 100644 GIT binary patch delta 611 zcmV-p0-XK%1p5S#BYyw^b5ch_0Itp)=>Px%HAzH4R9J=WmcMHgVHn3h7w+Ja_dCwu5Vz3ENCvf~v;^;(!wa0l z^*P?l56Q1d?gJq&FVEfcJm2?uznpxdVXuI=~Nx0QkX>s@pYwoa{sZo3)Pd zitPxX$N4OI(*;QK&01%yYNZPJ{&kXER1hr70^kitGj%*xK)Y3mD&=*;Fq{~0c3}W2 zm0Z~-5En7+xqq1pkcD(Iij((IszB{=5rC3o)As`Y+^a`#KgKaH_wGjrhldL(kVET2 z&Q!-6D9$bnN{-EL^UBzH{d1v2(?}Eu!*HSsPTmLLmlq^^CC3JTH3j6VZrAwcU1C|* z#Pjq93U3h4K&P=09q*T;zE;e#m;hC`YqVRHG5OJEpnun_b9uAZU#m+>32$wofyw<^U5GmAWpi)T5`|(UXTprGMM>CMe-Dr4Ozc$)?;IF)8-;> zS90uRPhZbVPN@P)72w8n1W79Y(!Koj&X-ZajEx2$mRd|lkd8m^4M0=Pt z{k&s}sa!aj0hU!ju9zSyjCTAlmQrB-c7*R=gVz1LtY8LW6(-GqAYLzi(R1s3NgdJA xVg*c_fqBqBMCN6x1CD+fWn^SzWMure`~`F{?8&pawsZgh002ovPDHLkV1f?kC}aQt delta 609 zcmV-n0-pW*1o;GzBYy%wNklvCV2=2dtd< z2y8hF%sKLh@!2+KupCHF9YgegkOLkuyaFp}VpvMN18`XmGJojeK7;>XzkXww*Le?Y zFf0^64tTxW1MC1%*BwMzhAk8rL6#c|iZlHF{TsvgAPpdS5WQ;BWt1qGxaS8-2;d50 zLgH`-;PMG53b?ts818O;2sVqKhlAncmmdtfzlNijJ$=RuvO)pu08resva(_g1y~3$ zUwy$4V=n@>bbspBC)9TU$Y78o(Bl)92wxm{&5-Ra19rfYgKrqty!59|2*BbQS2}=& zz?YK`;K2{lL$xS?c>`tl^C4Ze_{R*%=$nl_@;oSI~ybu5t zG$4aOg$*dXfoKre;cE)E5awfKHb|aoApi?v^bkNV+s|fvM^O?YzL7d1fF1>~Pyj^% z%=aLhUT5&4IKY*AC3VsOt`Jzi&m28aa5{kEGysctPx%AxT6*R9J=WmcNVBU>L_g={0Q{;V^I< zbd`1qy@Esv4ld&4;vmQ^ZZ3{G`Jc3io69Y?x(JmVQiJJeh7cm-yw$Ae_v>ank7Wk1 zsBia9@5r&6Fn|1<0N{8vk|^fz{ez5Mx7XXO0vK7So|*_Dn2u&RUXAGSnf2rT*Nq%4 zLyIs?(~OE0uImDjeE+5Q9Iv*u07_vnu$~XUVB7Y>ehMM92I~C-=^Zy@62)5!pbQWO z1M6AHwekb(?3JhrhyKGWp{8ldBk!YLCs7Q&4Fm9w8-H@&n{e^_f}c@EA3Unp)6oop z&@EC`N}^Z`G7sgJe^W2^>sK${#ZPrb%+@HKm^#R#iPG3j7`vAvrktiZw1tdY5rDWKI4Cps{(4w zFtT5l+(;VGeP5sfg*xkl(3b#x|8Ay59nLljU}vwS7iJ~aVbKx3DwfJb_01l0tPBYy%MNkl(qzQ%|wCb>`dKZvhYag{+wm5t%b z?O$N}NRbi)Of5*?bX7eDR#sNHRzuFkDCQuWiOhy8f*E4Qw*p0@?R68d1B_a(fGvlC zy{G;$p86C4mILVlu|W>_{rfjq3A#CW9e~Snut5)X{_S(nGZ$;^E!S3%mgJ!P}+bwm{7LE$OWJv1_^=+8&Gxw(SIP&E3E=fl(3QwnN8IYfCVwS z%h1dAS%usvN;ZTYrA`Q-M*%DpKv4kmJ;b!yBE*4xl&< zz~UV_4d_fXA=&{Tg=FUfVng6m>LC;d!74DAAhFdi&RhV?2_PC262|Q|C~EOJ09z4G zY<2`!MmE?KqnC)p8c3=-vWibqEy1UL)B&R*Fd71*Aut*OqagqQtyv~8ie)#s00000 LNkvXXu0mjfKN0b# diff --git a/src/main/resources/assets/ars_nouveau/textures/block/whirlisprig_spring_blossom.png b/src/main/resources/assets/ars_nouveau/textures/block/whirlisprig_spring_blossom.png index de1c2f0732f3ac504b8938e2e61c003339526a7c..7ac26522e5c425ea0db5b3a04d2e76a2f78eb3c0 100644 GIT binary patch delta 605 zcmV-j0;2u<1oZ@vBYyw^b5ch_0Itp)=>Px%FG)l}R9J=Wma&V|a1_TsX<|)@{3vxO zx1Ls{Ee`gMcJ;VX5EsEw?BpUi3H}=eI|vRA!Z|qHjpCfafMBgd1vifyY-4D+P_7q; z_V>Fay~W{ie#~K`yavFR%81@z0zhvtq1EVXQ~z!V zpj&&|ulv_RibaO5dzQHI1Y~gC+FQul&`pk}feJ3GAj#I06+)}&+~D1?#29GcDv~+ zKtzS?X_O!c82c_lShTnHwFevDQw3Uv8p7l0q3UN8(=-9_4o1o*gmrNVv>JWQb_kob z+Nu4N{Ri0jbUpMuAJ6kIE&%|U#AyzuX=3Omk2?)z8-Kbk;>8E`?0G(PQzjr)^?r{K z!cvQ;y|u5QDiAPqT}qL2?s>i%$SfE)3IYn^#4^7RA8pSn(jm57O2r~1<{-;VF-u;wP6aD4!_3BfhEoEEO>1F;j;5>MbSrdO03M z&Hz~}5LP{AGiJ|8#eXAH1+G{{j;6DqQvG@Pr!ydtyWV!HAwaXU9cxjW-E;{on}PEn r2Q>|vRFow7&uGPp6)RS(_;2|G3ytt{@QOrR$6PXQH1Tw@_Ly3Wzdkc!j3s;T64w&C| z4Qx3K>^=35@$Xk3upCIw+d$v{LIMH|?>>A0D-mA5nRo}_vVR<8(3Klj|Ns2`!BCud z0c(`{QLVI!}lN!AbAj7op}Q#3MMZ7ff53^ zf|!sv+yS_J0*V3_W)6lE&+dcG;^X6H`1I*3!`W5-C}vNeF@vm706PE__e{*3SVI98 z0+0UxV#xo*34gYGEJ7~_U}-?RQyK1KP*&SpeI3pRrHK@$=j5eR<46=su7n)ae#5yM(U&iTp_Sll*%BDgUn@=%Di6UaFUv#?|aiszD5WwdEP!1us0fONGTp@s7B9a=k x#HuH&@F3Q3V$_W~U^E0qLtr!nMnhmU1OOPx%AxT6*R9J=Wmc45fK^Vq=d$&l~8FE6{ z3*r$Fi^M`W@ejCQZ6S7|-C?w{u)azT!CvuHY(%h=2mw3Efry2|HA2Kzl(-yvVRi{h z9E&)U*}J`PUpBH2EIZ7;yYKUUJv$x_8tsm5)~cSnS6|=M0DoT|+#w7@q9`H^Lze0{ zF}96%N58y$i;`Th@4ec3l={vv_^$J%Q^y7jPF9Ws@awO0fGCQ1Qmc9ozin%Pweq5O zwsKJe^i+2gzi9%-`C55#fVC)k#CzI04;>-^zvt!vc>nqNND&VZXtX=Ja^?i=?q(W9 zJIb!z5*QSQyni<;JWBw$K3^J$;`X~wS`IFW(53Zt!m4VRnH`j?Yh3c zsS~A0l;X&&2mlxoSq9;}B;M0(H(%Jjp6XJ)d*gtlQh(5DO-A6-(+wR+$=B~cNR+a| zV`^=tpr^W&l)4)HyvYh$g+{#rA@aEdRl(-nRbNgVLo+yZ-hbZnhwz=ad znz@_k&E-ZuO%{AtXp#&A6Y=tD5h&aJpEJsU9|)1!Fw*PRdmrVLo#_Fl&44>*I9ceA z_%KYB0Z21uIMD-)^H2MyJz!w8-sr{0zUi2lKp=$eem4{2eA+#TjEkWP*ncw0kt0Wr d96A15`~g1U`T>&r4$A-l002ovPDHLkV1mnb9Jl}g delta 612 zcmV-q0-OEk1pEY$BYy%zNkl@)oS*?2~oGI{=sEAb*1)-zjhimh| z2E#%DqG8~Yq1Uta%(_{v=9V@640Oc<_VtP%R2z-hf$zUJk%=!Je2dxQ{_u&0q>7SAYO0O)QV`AukO?F4^)Ql(1k1 z!Ps*H9KZ&`90n_BVEJ6FBMBu$$aVlMj?uFVx{pEf$bTiBVn;NJqhSsvlsL11k_IoLv&kCE9Rd8&l~EQrxvhF-R-J20at`Q;Hooe)5e0$3=3q5$T5 zkWFSjVki#yVB>$rC%U!_qvGl1ZQABL@i;)Xpl?^N>fM`%i+?d&eq86V6Kskii1_*`&aD@PRiAZYx yCRROJ#V4_b6Qgd_0iz)>8UmvsFd71*Apii;B1bS{cCcmu0000 Date: Sun, 10 Nov 2024 13:42:36 -0600 Subject: [PATCH 275/363] Validate book GUI at end of init #1492 --- .../hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index 8e882edc45..e2fd470910 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -207,7 +207,6 @@ public void init() { previousButton.active = false; previousButton.visible = false; - validate(); List recipe = SpellCasterRegistry.from(bookStack).getSpell(selectedSlot).mutable().recipe; spell = new ArrayList<>(recipe); @@ -217,6 +216,7 @@ public void init() { this.prevGlyphButton = addRenderableWidget(new PageButton(bookLeft, bookBottom - 30, false, i -> updateWindowOffset(spellWindowOffset - 1), true)); updateWindowOffset(0); } + validate(); } public int getNumPages() { From 0305f38d329ce695db45e2b1db8882fd9ccab117 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 10 Nov 2024 13:58:58 -0600 Subject: [PATCH 276/363] Remove old render type map logic --- .../client/renderer/tile/PortalTileRenderer.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PortalTileRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PortalTileRenderer.java index bd4e2b5f8b..758f736f6d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PortalTileRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/PortalTileRenderer.java @@ -15,15 +15,12 @@ import net.neoforged.api.distmarker.OnlyIn; import org.joml.Matrix4f; -import java.util.List; import java.util.Random; -import java.util.stream.IntStream; @OnlyIn(Dist.CLIENT) public class PortalTileRenderer implements BlockEntityRenderer { private static final Random RANDOM = new Random(31100L); - private static final List RENDER_TYPES = IntStream.range(0, 16).mapToObj((p_228882_0_) -> RenderType.endPortal()).toList(); public PortalTileRenderer(BlockEntityRendererProvider.Context rendererDispatcherIn) { @@ -35,12 +32,11 @@ public void render(PortalTile tileEntityIn, float partialTicks, PoseStack matrix int i = this.getPasses(d0); float f = this.getOffset(); Matrix4f matrix4f = matrixStackIn.last().pose(); - this.renderCube(tileEntityIn, f, 0.10F, matrix4f, bufferIn.getBuffer(RENDER_TYPES.get(0))); + this.renderCube(tileEntityIn, f, 0.10F, matrix4f, bufferIn.getBuffer(RenderType.endPortal())); for (int j = 1; j < i; ++j) { - this.renderCube(tileEntityIn, f, 2.0F / (float) (35 - j), matrix4f, bufferIn.getBuffer(RENDER_TYPES.get(j))); + this.renderCube(tileEntityIn, f, 2.0F / (float) (35 - j), matrix4f, bufferIn.getBuffer( RenderType.endPortal())); } - } private void renderCube(PortalTile tileEntityIn, float p_228883_2_, float p_228883_3_, Matrix4f p_228883_4_, VertexConsumer p_228883_5_) { From df53573648240f68ba3940624159a837357d119a Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 10 Nov 2024 14:27:36 -0600 Subject: [PATCH 277/363] Fix glyph tier formatting #1485 --- build.gradle | 2 +- .../resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 ++-- src/generated/resources/assets/ars_nouveau/lang/en_us.json | 2 +- .../arsnouveau/client/patchouli/GlyphProcessor.java | 3 ++- .../hollingsworth/arsnouveau/common/datagen/LangDatagen.java | 2 +- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index d27145c6ac..342e23d30a 100644 --- a/build.gradle +++ b/build.gradle @@ -103,7 +103,7 @@ dependencies { implementation "software.bernie.geckolib:geckolib-neoforge-1.21.1:${geckolib_version}" // - compileOnly(jarJar(group: 'vazkii.patchouli', name: 'Patchouli', version: '[1.21,)') { + implementation(jarJar(group: 'vazkii.patchouli', name: 'Patchouli', version: '[1.21,)') { jarJar.pin(it, patchouli_version) }) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 583e5e14fc..9a5cc68933 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-11-06T20:55:11.2196957 Languages: en_us for mod: ars_nouveau -c18a6b328844f2b6086ed3eb28ae3b9e6dd4082c assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-11-10T14:17:22.9532023 Languages: en_us for mod: ars_nouveau +6bda58086730da53e85d21674e15c61da8c5ab4f assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 9013eedebc..90267f36c7 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -901,7 +901,7 @@ "ars_nouveau.thread_layout": "Thread Tiers", "ars_nouveau.thread_of": "Thread of %s", "ars_nouveau.threads": "Thread Slots", - "ars_nouveau.tier": "Tier %s", + "ars_nouveau.tier": "Tier", "ars_nouveau.tier_1_spells": "Tier 1 Glyphs", "ars_nouveau.tier_1_spells_desc": "Glyphs that may be cast using a Novice Spellbook.", "ars_nouveau.tier_2_spells": "Tier 2 Glyphs", diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/GlyphProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/GlyphProcessor.java index 818acc5009..e9c9a21eaf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/GlyphProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/GlyphProcessor.java @@ -33,8 +33,9 @@ public IVariable process(Level level, String s) { if (holder == null) return null; var recipe = holder.value(); - if (s.equals("tier")) + if (s.equals("tier")) { return IVariable.wrap(Component.translatable("ars_nouveau.tier").getString() + ": " + Component.translatable("ars_nouveau.spell_tier." + recipe.getSpellPart().getConfigTier().value).getString()); + } if (s.equals("schools")) { AbstractSpellPart part = ((Glyph) recipe.output.getItem()).spellPart; StringBuilder str = new StringBuilder(Component.translatable("ars_nouveau.spell_schools").getString() + ": "); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index d32297486d..4c46ab9a59 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -619,7 +619,7 @@ protected void addTranslations() { add("ars_nouveau.page.weald_walker", "Weald Walkers"); add("ars_nouveau.spell_schools", "Spell Schools"); add("ars_nouveau.casting_cost", "Casting Cost"); - add("ars_nouveau.tier", "Tier %s"); + add("ars_nouveau.tier", "Tier"); add("ars_nouveau.page.agronomic_sourcelink", "The Agronomic Sourcelink generates source from crop and tree growth within 15 blocks. Bonus source is generated for magical plants such as Mageblooms, Source Berry Bushes, and Archwood Saplings. Source will be output from the Sourcelink to nearby jars within 5 blocks. Note: Bonemealing crops will not grant Source."); add("ars_nouveau.page.source_jar", "Source Jars store source gathered from nearby Sourcelinks. Source is used in glyphs and rituals by powering devices like the Imbuement Chamber and Enchanting Apparatus. Source may be moved using a Source Relay or by breaking and moving it. To use Source in a jar, simply place the jar near your desired device. Source Jars will provide a signal to Redstone Comparators based on their fill level."); add("ars_nouveau.page1.volcanic_sourcelink", "The Volcanic Sourcelink generates Source by consuming burnable items. Archwood logs will generate bonus Source, with Blazing Archwood generating the most. As the Volcanic Sourcelink produces Source, it also produces $(item)heat$(), used for spawning Lava Lilies and converting stone into lava. The Volcanic Sourcelink automatically outputs to nearby jars, starting with the one closest to it."); From 84fd894e838e8187ad383e0b060b0db600e42fd8 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 10 Nov 2024 14:37:39 -0600 Subject: [PATCH 278/363] Make music discs mono #1112 --- .../sounds/firel_the_wild_hunt.ogg | Bin 984139 -> 853273 bytes .../sounds/thistle_the_sound_of_glass.ogg | Bin 1297243 -> 963847 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/ars_nouveau/sounds/firel_the_wild_hunt.ogg b/src/main/resources/assets/ars_nouveau/sounds/firel_the_wild_hunt.ogg index 661cbc550b43a7aeeae1d10759326fc2fa45d5d9..c230070404d21fed09ceff5bf151eb7217033136 100644 GIT binary patch literal 853273 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

8CAUm|Oxx`vsy;m)#wNsOH;?tGR2@wuaW2kt}jJ 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 }vqHQr~)t*SJ_#FGJ`@{P1Gkvx0l0go;pP9Rr~^ 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

yHy6L^^W)mGouIi8l8*RA#9{%R`9i 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 z z{V+t6NfvZ-2qKplXwXfdT#3vficJutA|!mjACnScKS`yHas0^^^c-?eX#4!4Z0EiX zd37q?0&3G`S@>VCkULJ1-$=oOcD;m^nxjUq<)2opZnP2QiwqLYMCQ(Z4*Rv!%yzM% zg&TFc3lnQ%k=&BTJN*LX-WtnY+QhpQ%^#PNO|6YT?M2g~h0BLNtNy`B1fxfYe8}bx zKI$qrfm5zNi0HFNe@3B2nG3Vm0V`dSLjUr?;yLss18aMQ6B$H>w4Zqi!y`yLr&AdD*pR#J=Fg^r{k%_i{H&)09_k!M1 zC397&MqYNI_}}0}%Kr@{NM8y>y7iDejZLjxAL|-Bo0{jFnj0HiI_euRQj!v~5;BvW z+-1Mys_EB-!dlaR{nBQ8KBw041aIEs58N*-;7hckzNFOn)lOhiCep1+iwy}B;NEjZ z!ivl|KhkBL8q2{iUOhzWg4G?uFuSUHQ2B*4MpBt~!WC$c&8-!D@42ai0MWpdDDDI~ zn`(lwWAI8OAu}zAQI9f2cY$*qR%GUo)zOT?%KC?#w5BPJ4Ce*8A590QdCiAokfBM|SbuuNOcRsrur0 zXY;IU{$`IbSDBEd5?29{5=>{5xw76SwFNiE2U(5gqOZe3rbqlKr4d}by7(%r8Q*jr zeuxE=c9VRd%fHP2w}1|a#iMJ3N&h7O*3b8_yHZ_XjFRN2pl4qqGGHYTS|DaYR&n;IJm>xWb~;#t{gfN-v-j{U{oW zz%GLD5V|`~c5>-N76V~KeWcPOhuqdWhkKGXQSA{5XCKi3LxJ`}bT@M?_&23N2MW%Q zVH8p2Te4lUJKyiA+g0ClF}vcvpOC-JUjFmLJ7&RgdkJqhZnF6cMgp|nA#F;s(%rhP zfWWne_sCW7VKXhQDZgXc^5$$zUXE4-N6{<*NBt7hFslpk3mK7tj4j5Rx+PnQE)yS9 zf8(a{iWZ!{i#Ogl<5Y#D*)qeEr$74F}yyu@h?M2Uow^$t=4JSVj zeI4Z_d}(up|4uIcs#}p}xT>cAxeLG@sl_oe4Oi^+pPT#3s|Nn@nU6A3=u^Cpi3R}M z)!}7(&x=aJQi;^Qc!9NKXtvj+Fk&#QpR|X7;g3(DKzGjnNu#n%{pf8moC1#OWw0-N2O~7_OPc$JKAYs5@i445;hJw*M+`Q_#;Wqb) z;x`uEB2xd11vkoWsgo=Cw+G?g6hNz4cRVh>JV>eMP_HnEv9y3halJ>nLy78}UfTM6ynHE6Pm`6*3Im+0{ zV^L90BAMd_N~Dt|cU^{u?$^YOh2gc#8t-y)4ORnXE48DcCI6?s-d@c-QAUAx`kUz- zvU0>)=qz4jk&EgPB5Fm~QEM{sL~=MBEmi8YhWmkh++Df}hJTwBgeZB+TlNS{b0 zgB}X^w9{Q6xX= z@80^@fw<~hUwTg?>sdy%jx4(AuON?ZqnW^$5i>vy>*6y^h(`57shxhE=X$;?!~XGO zI~xoJl+?@ANV2;ZCIX-^m4azdcdUAz>%xArYA2B$^g)&CA8O(fz5Z2r<@hD4|$P6K!%X>y?)q$Q}&J-FhIe(?)2Nbru zVeMX=qKVwnj|mTGWzFP~btPdU)PQ+H2{|KS)zQ4jfm&!d5UHCJB6a-)6~J&d1zHr7 zZCV%xi9irY05fQp5`AtH5OgG}+l+hsAsuc{3?RU6apz_dRPYe0=wr5c`8;WHk%+Ue z`5MUE|FWfgLyM{SecGi<&pnD)(w`9c?i=_z#Ii+a2fGf|sJ}2sf5x+qgb-x52+w{E zwfhgbM0BjiD?~mv4j+7P8}P+||ADndfNj~E%8LaBTdE2X zU)%Q)#0!R;d5ICK)6hWt_AW$+0Y~)J0>gisA&#FlI|SxjRS}ruzp&}(NP>M#h(5*0 zR8E0ELWcp3IE-N1znH@^g_@a_)}+zDQub@rJ)tl;^}BDYkb;RZV!{T4jo9RoL* z_WPA!59##2zQ&&BqJ!fT#k7TI;j*@}>!~X|IbuAfUBJ#ipe?Hv3H5NwRl8!nA5B~M zvdb^^)z}Q&vqA;X@stzB;ewlM-K5aJKqrGa_WUwAhVY94Yswjt;&(=qjsk=v1Y{W* zo5t--GLD_&x9E30IwgT8$?v21mzBjE$}pgb*&j%Ee7-A6- z@FN7K*ZvC}mpuw+`nX+A0=i?Egkey^>&^yFK0rbU~ z#WfyYphDQiNrCt{Mua5x4Ty1TI3OD*8&d-2d*ar|Wnntne3jh2#d}sM;e&Fke2cU2 zbxH2|eODfj(Kqh*&|J?hOL91bdR~s9=?o8E<4P-&y^0sfYf&|6xaODLNX-px4=6P6 z;fr{*-t`^&>h`mW)lg@?L z+Iq!-vCkJp+M@is#8q~t$TtKEfR`=V;v(db40&RWg<}Lb0C>;=$ZK`D5r6_yYvu~n zFXt-e7_%C06cde&lXb#>#16pgkG2x=R+&)F1O)O->(s7npx_T6`w8@C|(WY^~HaHaV*!|LrMEWkw ziG|ztp>4~vf-3qcD>iqHQ%>-6@l=1=4$Pq5!I7JN+e3?8ft2`jby=1=ybYxjFV>A< zO@linOL{6x?r^NK)La2}acMM27I0?82}3&Q&rxGwXK(a@zYL@fvXJ;ay9``hANB#f zyX2o4;uiH*;;j`!Jr7^6$Zv@stq$KT4fZ9g)$q_=>+kzK?9x%_X?y11yUO%@MX=~9 zDP|Ik&D|Oby_+8l-LB*eH2fm4t`4~w+pWMjG}fxJ0FTRKa4@1DEHYMX$mR z<@fE#-NF^2f_dJ51!}@cA-yt9l7Hl`cK1eYEHMb^?Yh$m-Z$u(To*AXO+|D#kPGH` zZWshCEY=hV0?{dUfO$nkU$}2t1XCor{Y>*~Hn>nKC4n?RA z(oPv-_y#6w$eD~ERQHU%pkDy_-glO7zmi_-HBCf^-Ta(B?LFZ!-*qGRDtd<&)q6^3 z3ypdo_J{t4;0?A~=`Vy#D6;q8yLYI7^W#V80a{E&)pt1}D;P5qP)2{Ipy`hzn-u~5 zC^INHCTr0D;0M7+oU;RobUJguS=+g|%X1C^Z@$}PH1_VR0}Ln6 zz))bDoV`jPo8zh9e$0WHDb*HsJC!B4_$=@;3%n-NP`qj3^8~)pgU8l>S0vdhDDTO%Stli#uh#M{8 z*VDM@a&#|k`g-VtrOz;}YZC{&*|q$y4?L-?+Bd?bUXNaT*Rr2+-$9^^%Ufl;_O$`I z)l6X5T#)_Hd>B3t9&bIje6Trfw(r;w_5GH2z^y#{D>j>VuBwvcQv4AfGgOv~htWrF zC5-H54UP0a2vIJU+s4d)4`w6t)~mLn^TWBThl$h?&hB_rGw0ttuM8$ii&w`t@4@~F ziC>itUYUwo{IKY3R&tZoKF{yBytNw?&HM*LsdcvQ1mcxcr4$d%&t5AA2= zWGvE_FDZ+OqZ=(V+D~Mj^6e_fH$D5XSd_3PKAw=rTkHL^VdKN%>;nab{^xfuS>Cl| zGI>3@a@==t`nhUH`-fJ>66Mt#L%d4?Qkh5UW98+HM*o%6i(Ad5@746O)va zZ!T|;laX$HTU}LET3V1_T$EqA$^@k?g!tK{7J~J%eQNP2zd3$ll={2|uNf=4UYH5x ze|CeaIBnJc(C){S_x7ojbV+%#&5yOFfcFg-?>gXBgF-!mI{b=DuSP?5Xzf613agZs z@3R~y_bEy`{hluA25uF!1$E)}>1OeS!dLQV^FonXW=CctMAbVPhCDF;70O#7gZZm6 z!!?gS&6f?kwKS9YoT-;8Xhh9PTut(A^%pUQ=2wbAplmTewn~^D+fa+MfmoiD*kGpD z0$8Dv({~51&gH@{-x|>n7|=fvi>4##l?<`S ziX@(0z99^`cyiO1Z057QAeQ;2zIIYX(_>5Z5HH;@q6!0W{*iag4*{H1!e8R^sJxN} zE_anlUFM@s_1ptJgQ?yaNyp2Z*92*OgH^mg1-!$^H^KT`+;hss!2-2GD%6FdB<{+r zv^W)?f{P8T`r7&v`b#^}_aWuCta&~VA!8|nGFw;v7_|burVw)Ml9n^^&tmIMos->= zl-}7Y$|QwS^6Vr(3mEws>~fWJ!s+Y9T5>>5vRlWT9nq3wlu1SwSAZtRDbED86(H7r zn*ikR5UOp(UT5)tx2HT_1Z;f>8LCqW+Kgq+ z@yvupQLjO0=(_*D)E%f%H5Fu1@w_K!aSqy2`(|sRbA!uXOIx|Ex`wfXj;zM=_!_01 z@oWY7_+BH$y@yX*1HPY1hwe+HIWIQrMC~yp>&6iX6zO_K_o6%9`m&<$qCp{nv2-_e zzntwY1=NZ9EqpmA0}Ab0lIf%Z_%+w@*spJx)Pt`x7}TV+`CblHzCZ5yRoKP;Wy>_X z?XmyF0G&vkLZ!vi@Ka9DNrtLG^8BzhG}SW<3*Pl>Qc?n=b4v+N4&$godbC7)FNTjc zQ8d;YW0fhe{sFC6BRj80;z@q*VJZ|QWsO$8&OVU1u-tM5{YXjij~^8)atf7#L<*HC zOkQ)L1`$#Xx^JtfU+UPF0XxR+T{^~CN=}MMNih9YSwbbQ-*cDNEtvQI^G7deMWkRHr2--LrJoCD^=+IJKhIO z^E_nQq;hy`#751gYH&tYIIGSdWS@6X+X&e>$|9jmyT+VDr_0pYtcznnAp>i%*-yZD z(u8C*H|pPTog-b=XS%EELa~@DQfSCVhB&th7+PRwN*HZ3e)j0$f={#^2zhG4UAhR3I!h_!y2mG0J9bFCkE(7{4DV-1;2SFYicp$Re#4g!> z9s?k__=FIsB$`v-!tQ4VEB+?Xh5V{QFP^C&fkFyBe+IdbkBNN?|Mf>JBXt4B1NkgF zUP#F^;h{i!i}`%aCI1+bdBo3z->K{zKybddz> zgTtKk9HA%y?weJvKMEE@@(2Ho`mCSEhi<7a9yo4m zq3;TaChXMW39#%W?0XOmMJmBpmidy1PoU`HXmH%|#~@0VM9Coo14+mzF*FqY>5BeX zxuivL=Bcz$Q{x|XlBB0FAhQt<1Pg0C70Bf0VoAExy|zJ0&A zb&2qwGq)EP6eelSpNvDRU1dY!P)-q&5dpt@OyCM;Y+6eCWuz_tC?gTPO%<0CRDmg` zwSwnc^&OoyMHEA>PAgX+=>n`L>&4b%(1>&DLTSii&!34}I>0za@pf0#+E}OyYL4Xs zP7Y|2@{#)I3_pI8OO(}Doi^o?C{c$}*ve#7r24LMksaA}CKgB7PJAvb!O^x^x%~U2 z(z_T&$RU+YOiEC%mxLEt&%CKevt~Vi#(O)17Bmq6EhvRf*llpLRM=BV^T`Ai_UF1# zRDErgdt~#5^ag%cP3pKk^nPqbas;nD#7Ibg`>?t;bpD}u^!={ZYuNMmuqDLY+*gbU zz`66G3uE`IG|0K4wINBmpCP5CR{XIZm+7&PbghkLQpd%Z?sKSG$qlg&lT*r^SHXi`TBvHodxeksUO``h-o)b|kJ*lA`HP7vmDDSz6IsMXi;C1l zl--}SM`spaf6a`{oG+t}P&Ha66mBzjE4%!8r*Bc5lRuZ-LJ)U3?OpXgM~cs7t=E;! z5?l8C80?S!9?KZP+-5EJBj)3k%K_Bp)m8sR-Y3iI*9R=`<=^$}JbE=hMvR{FjJgmR zJ!trI`0$N`Ed^!wb;nIRGjsG<2!RZ|O#AoXfH#wJ5_W3*I4#V_ub-ks_f54cAAbHde? zgQytf{_P0*xUV_$=SIKt3|;u>#aw^&?}eXPDP9`A>6v+eAiai64Jfui*S;9ekgDwY z3**f=X%`X*GR@cb9|-guCrTi#?#z$Qtt_k}cIIt_ICy%|dJ~)w72QzbO}ng>FV zd`XVh6}%8V7NJ?RY;SECo=pX4w1OP52b zm3nyDcF%UHmOeiG%gNcqeSg%SCp+(%^_f>|pIs%F6zK_e|AW}el1nR7J>sfhLE1nN zx?JuCNqB&g%DLep+GC`+6uR`t%3J~ydC*Dk%ZpAaXa6{to5}b*>wU7Q|8d3 zc;v41O30|bn-;#;6&;`#e|C@p0Q+|11rVG6PV0o05zAG|v%5_eWZ4=Vv(AEMytI8k z;9V!D30b#i^l!iG`^$cohidWRn=j8}SA|Z#MJ3tko~mbgu-)48Zp>+JQH!0ijGtpJ z_@wu7j!}}X`7xdu@bkc%^WZ7w@c~PrnH}Rz%4H^S zbAiH$8Qsgk67z|YQJC-B2q!;dMoFn1V6Q?Rle!qJso-QPR+2Gg4qXWOZ9Z9slK5zF zQk}Mfco)$e^9|)a--c`Sm96Vy{0ZZ-+yS2+RL9;ksqE#sHF*W(UxojAxt6_e4(!Hx z10EepzDBDtV>y!C(-dlUS=IU7%)G4L5^h}tcma2}nWQS2H`VH{6y&={Axjzr@}nr}L=Skd*LWC8(Z%hqvu_cWgh=!fZx*ZO z|9wG(8B%)}on{-rMce!G`K&_S=;Y1|n#7^-vgJ#%Y!#GubQyZnNP>}?$XjnD^wSCB zR$#_KX#o*=>F1Eg@?J97@bW|wMa?OZ(FA@Zsn=IEC;r=?7NECTkx8DvYUko1b(L7_ zGX{W0nPcx_9`fk=C$1{~xuRls1h0|(1JzNXR%uW9h^;;cs?yCl-RCfW{l1R32{hE5 z$^CPjM;SX~7sMp5?aeV&rzA3!%Y3>rJww_=v2xNsPSHJ($bSkP6l1p?w0=~)uoWKMrKXuhJo_j)&BI78}5~{N@KneQ6 zF$cgQm#D_T=*IBc?~2vi2!^&-8@Cgaep5OW2;W9{<-#jhxMEEPW9pgI6re>}u|Pg5 zd2PV8`Dso4#n_YPnleond+Nx^Z{DQU`9NDxg97{cXRHGD<8!NzMkIqRsI#hlJ<<^j zeiNZ}Eq7>FA95vf#58Fii98-ZGDAv&f_$0*KVUhQ0mW{UjKSz_N}z%}iWLB%Cfka?eb~+=Ao5Eg`Jqbvz{g)zo2=IK9?OaL`fJ~v-(BU0Uw7<6&ZTvBEzkdGI-@-F5u|n#9z-V>-Z;wu zPS@m&;NceLIR@Z`vhc)Ppp;$DI5#7+TeTU`E#tqo1&1yY+Szd$Q9IF3r2=ViFE8DkoIMdw2+IX$E6aq5xL@mSc`s%nBhE%L&fcTz<~Y(?4|jfXT}g6J@N zJRR+O4GWX3GGfHRmud4oCtnO&kyk$jhm;9)_Ghj_pEMLUE4ZDnLQ#qhaXrDRscQp^QFB5UhT9nchi7kaE}n3dKXB2!+MS zvmwX^i}?@KLybw3w<5RPO?bx9pJPUK!}~J7D9`1NiL^l81v)uPc)WYrr({E7XL|>) zeX|uOdy$+pS6`ZK(ElcgIp(JkrJw&h6W>>uBJ<{p`$Se_6=9|i^7FmbsK#~?Ole~^ z_^|}pzBC*9falXzryzm2jCx#n4Ee_a2q*Ncf3c@W5HttS>qo*M=eo;=kklk5uY4uT zWOau#0?SqEslXFApU3Ne?dEqs576}UO*Uwcw*BFMmMr2QrH4l?Gv_g6A;;u23v#kjS-6m-Jo@K~*~{*HZhbMktOhqlG1HUEV)9}-IV#~QTi87Tl1XK$fwv}?TJ_yo;4%wXz60EvcBo-B`4u$S z%QpSREyEjoRPi5O!tG=7ieUZY@hF3TK=c0G1}z=8g1 zY3GPUEteET!471=FOZKypUDDDA88J8Mt+&{$gX?)r?Kp7Uq*Th2QB4<>aVXk=M)l{ zh19R;{>q|*dL`5x(|zfQy!CC9ni|fZH@UCF!W}OigxpCY3z*~r>jEMjT)!$eFDWHBhsJnrJ5iCxvk6zru$jd~_?+^E zOJFF@cHqO8Ko4`QHVq?sUP18kf(}4p9)=12Vqt~&65Bup!^RN;sl)FAIL%*6Qje0z zsfG!j@3mhv57q3nWD=e_(ih#fQQY17iM#yL<;@k|=8q4$lgmO=-*Q5>!uZ}e@1*x8 zQIbf~ZEAnHYhC2+B8OPBJFS&JjrLpphKp=rS9(Vkp1~r{vpx9KpYjSYFDuZ|4&P2p2!yv>0QKX48w&?)d;Q$7-Hjrm4?Z zs~$67zQh=*0+=yx(K?l+yTrM(0!NhKniVlseQ9CrZ zc)D8{xz_10KYUv|28R>EvX*B&OE2aODg7PDzItav=Ss@005{f%C_u5CX6)VY%B!NM zIg@Bs2)BE9^zmqyj6#hl{~uravWx-jmuT8cSNK*$5dq@ zVGH+%{%C2X*OWr7Lq(D^fPUR-o>#|$o_TJE@eNZ*`1@V5eJc=kwQPUfXq+-x#QSkX z1uAKqDaiOWYaXrWuS1$oo=m?m%XFoAUkM1Y6%s!$ zCq7hFbJb}*VLm6zp45&w(!Jz+IsGE0R~@hf)aicd3FePT+R4m@#ces^1 z&KEhSnm&2Op?bI9_SyDSrFk9bw9DF^vHf&<5pX0k7)<;+DqC}x0#|ta_oQ4>gQPdN^uuQ4I9ku?=#L=+N>* zG*=xbbvL(}&J4O~mn7-dEXf%%SrU)Yj!wkIXAT=QbBBbPu zLn)E^5&%=DWMKvYzd}sWRA=FkgnB`_bHrmkz9y;S=#(o{r><`nnt5s}tLHxr3w^qs zm0=@SZs(fh@F?X3nj+Q%bM%7me-OHgn%)dwOR`Wj)+zp1DETOh(u0(Hc4@~e-kRH! z){rF$E%odB%~&8v1&*2Cf7_S5zwZmC&SddvJb83hqWy6S_hxxkg@D%83!pgXNCOcI z#RIPxKn!Y<$`zfe00bcIdMz(ktB{B;P)82TON!&Nud$U}b3LiyxDbEs zeWlKj7t1XrsIOQ?6$&%|vo&(Q_GnYy;+S^I%6ibeHzdmdie3&Zh<=wB9dqcFCKvo- z^I-npD5~vb8zu3earz8S9aRMRBmm;66kkyYD%5bhYQgc(7yx0H3_!1qoB{1nGUP=F zuoWdR;sS+0p%{lYnJrc)2_z*Y>Aaw3@)PP=%$3B9_!P8Osd1~7aa96N z^CdyYtBVbGS{@8KWHhq8Wp0%f>%_ZHu1X${%5{wY@ji?q*BBewo8cavi`d5-lHjz5 zwGixuo)bn~6i>v+MGpjeCK}>|xZgF>7Se>7Nkh=ot>FRv^Siu%L-Q83(ERATqY;Zr zg0=-eTBFBLj}Oxz0H0g9^?vL9_JyMnl1zAol|1~qF+vx_YxU_i6=fEL=y*NC%_Mnl{$-0s zO6G|0`=tEX{CdHi5|&H4C?bbu1cvCW2#b3x@}0Jzuq@f?z{3n82qzjbNezuLXAW-J z_fVTIFig_+w?Y_WcGV#`#^(emJUZqmq7W<=uoiaboa%N82)0AfJ0bvb3<&feU`GdZ zK#)RDfOwS}jnp=GKy{{bV54~e!?{w(;;wdOmpR{;u%KJVT6fENI4d&rJPk{uxraY- z&dEMbm8~+;7ZVeSlYA=(S&)Kns4aQ7TW3c6hFm-bNQ5w8VM6nvAlD&SvjRwic@N5Pj5L=r7!E_Flw(agWzg3#X}aG|rKR^srPx^DnY5+YES3 zIT)dE?$2Iee_EM#SS!ZK3umw$!zNWfcM{+HcsQ7e(>8#8e`a-UTwsFI-^lx~O86#W zH2q-f?j1J%!*AUuJP)%JVAJsZXlc+e8-qTsMPYAzqQEY-X(6NU&YI!sLZZm&snOX{ zq_F({O{hCNxNnc7UjD@=^tS*26b1rSpw1MScx^Yg>5AJ-RUKKK5Ax#oGruExVw4N5 z>=HE|?EWC$*SY^-F;hqlY5Wie=jVpwer`BqvmvOT3*E^Ib?4!lFnRHl&ndo&bm8J# zT+gW4>&zD!%rh!=z6pSp_|kZJK!F|b7XaV_HL$<4?mZy2;U~w?fyDjnI2rBu;xqdI zp#e?5BKZ8UnlL+kjz5FqPsBc*|FdN^YX^Ej;|E3Y z0%K~S99APl+&$tV`NuZ`^mMnY!uF-C&g{mQP0lVb__99B7w)xNN5n5uR<;Ic&Fp*BF zjYZl$91Zm!o8C9JwzRjlVY*w|Yuew{H-CIT)%mVw&*QHY=4OwELzVi=+O~a|lJ*r7 zhg$V9v|&%h1>;ibuVoKJEyJ}g8_V1>zRy3{_X=8?c7I09 z-iId^KW#<3&CsdM(?vIBSACL#rAkG|)F_v7Vho_?`msOEmP0|KbA?gS#gzg}tLHG3 zmE&PH83P1;^|qRz-QSXwVUj+d{>{jnqug}>Do$F9qbty9UDywCCCeO%^l{YMVVZvXpjnI$xV zm%fhQzobx7^bTukH>U-+c^xjEplFTqnC1wL>=o@$Uq-R z@$kb6T&cciS_v^HtbX|2!)P&{CVMOL0&HyL^so-va`G^g7XZxfd<0N*2-Fdb){crn zwBG{vB>>Mirp^gg?pi2zg$zw9T}BbmyR1R{TYd}_WQ{< zBgNPq4lH`9cW)DfV%m9|Xm1PM&^Lh%M^Fybt>?aoERs@eE;O>mLOXN&Pqb%jPVO&} z6!CpV^J;jpAYr=<(3OrEN@HjK+`D_au<4I+9;8k9bNttcNrYvBclAZd-XrklC~_hj z8h-QR=F@`%6b-05!v+HlFRqxiwj1CT2>HC|2Y8zg7_{b38A;ZT=JN+H0ibMI^fO{` z_)39gL4MickoC00#6Z8>pChSpcfX0HHr}qguD(3f6etygdOwz=!o~a|JN7;Gn3)_| zV(GOMsW?m8!D|r@qyT^3_2qBk6Y-9|L}>GvODbUKpFiD_;NKP0q1udBKSfXS)feHWZdC0M^ z^goW3r2Oy%6BSJ+7v{es%49YVZ%<1uXCvz$)g=K!a@OubZsSFo&h7-K7qsJzLm_W< zC1a@LakLQ=Ax3qG7O2i=Y7NmKNj)ztg1Lway`SZIynN(ce|QmX%I^#Awoj}DTL9Rv zMFIs9&OCq;!L*U1&knZz0HK52rix%%#47-{vUg~(JZSuN9)J=6Edex=tS|45Z8HEl zpaa(A3WZOq=n9R7n%WKjsPqejTbA)hRDbdR=U(@6U0X)>mK91y z$h{G%$R5e6tn8wM%e_`aLMbzZkWFQCuQDn!5-RK3n``fTfA{nF{=Sdz{pbGse!Ryy z=k=V@b1}EYrmSsa#poSetwnn8OxKsPo(<(WN20~z^6Gnklv2_uInOo8{<_bk< zM?UEA_aL{b-1#?g8RMLelT|c|bI@2_;CQEtT3GgpUKmGN^u$F#6NOfwZo*AuLLG`T ziTBRQi2$|I?buU@N??3=-r zQ}LzMn}-kI!^1S(({-<9NX126JXf0Wnf7BFGE{ml!fW|~oPFdeW6`FRDRh0?h+p94 z97fiC8k_L1gOOJv7MV`g;G@t<` zp8)J&^iQzdL|w?Agz?ijt_l<1(4#}dIbvfS9TAFarM7y4<3^1wHdb_{;B;gx0s16t zD)i%FH@5#{;goV>7_`MZG2Ghv&+squznNS+!3JH+HNo&R*cr^QM*{K7T-tAL`^| z^_pGrg?zT3{kIvn0|zHYk6}3*VhZEf{cILU^2o3U7#(KKnV!cc`T*h&BR?p!PeRUv zdCit56zF&sl;GzJMiYTU1vh2BHxz2jv0t(i2T22HNXrSI7%Pfle=nMLW01C81HHM3 zqH*O7TL{v#zdI=2oqK3vwTOkKD$te3c&Xn|&EdU9O>(s9m@%=u?Qvk3vWAZ4#JqJL z|ChD!=yfscu4o4hK!I(a@vRRPEi#V(UZo+E^a*5^e8ZGlgX*PR)%JjFW(_1DU=R7~ zT6K+I{{tXHp{shrwj!brk|ry0Bh+!!Z@ja-c1dbcN zeKJkANKd#5q_A1trj#_G5u2o!&;Pw)GL%d;VXM`AVENFOSX3I`-yd~>cByCT&Sf69 z9dPkapk-wdo1l$kpYoT&F5SQ%z}8OVXU)U0C^h@{>1A+%woDS;N{c$>-WauaeTv`u zMDvRWeU3(xH_l1QJdoT8aja-5ZT%EDkOkS40{#=`!Sui_G>rfQIbx)lt01T!dfR~s zf)xb|w1;~e2+{$>abf~XX`s0hknhhuySnIAraoE~ zV}n@h`}o67$ZJ@~;?qKcyjTRvQI0E*lHC}!qiR!W58WH5TSsOBUo}TxPElvM&U1I5 z`c>IupJ8WirqQt)ND-Pg)4Ywms5#^f{bB&b5=1J=WOlV#J{*3E#Q~0{y&v&&SdkSf zB!s6Sw&vE=wK5RbLtP-brtRb#!bZ{nN-AUaHe(`$o|Vrc()K7^_Mh6~|27exqwEsS z={aYvf|tl|?BeF9=PbL?{aU-T(pYr-mgS_Mq|5TX1c5k2OP8Nxw$Za?v%+|hBm@?n zz~zJWT%D)0rmG|!4-Crg380IlFLK1YQh@j|gK{@-p)9mCkY?e<^NXjUz?X990k+p? zm-+mK&=e9LPNMYk;hIP*R(G_J1)ES-3Kpof^IA8Z0wD~-^HfyVH5_2DLM!2T^~ww78KX*%G}C=cu<>58CuPp7;!SO@ zMajBRfAO;Jc!@#4aV}4}Gvn z>&tz3=73PB%Vh3dL4?Bx*kfkp+yzv-Fo91usR8?_r4$&Y3`4)!#pT_=_O`)6-#XoS zU~33AwhI{&>u&6Y&w~1-h-3HVKw?#u~$;d zlz5t68ReYOv;6>mVV@v_n|rG|&ptTd>J36G};} z5fQ-~pHI42E}hWQG$S{~OnXt_7-HFxP*_q2JIoG-a0@~z{UkmM|3Vp2SyHV-kMHU? zxxrsAbs)Ax9XsKF0(3T}9iVN31ef`E5A>AF1dBIhNc;1`S1kN060p>=05R~S2cz>u z4jczH(+MNcsHg)7h01qoUZ8Y@eE=E3cakP{Qj<+0ZB0^dGT{?OIMyG_uf$fpljaqv zba^6CsuMW<-rMzqEyDDCKCI>0T%E_grn6qHZ|)Ejb{JnzTRm=Y3d~<{m{OGIKZX!p z3oL0#2YG&dA+Mo|XN#m__bK$?Me%xYo+xmG!)9+6YKK7(p>N|(TC0%;E6?Et1d)ZRQ zn<xB_p^`7|Aom>voZy;H)2nUMWeu)wvu2Xeltn^Cwk}C=fz;_2 zRUGRf-+2|%EYzA=qQ9TSeTP1Ziih)=hgR7x#U~rxI+$X#&xi0J;Mz9lUJy-XOF>Jf z;D}f~mmk}gAt?9$%Ylwd4Mh=-*U$TjXo{KmGt8tA9;=I6oT55K%=(-%?w>PHpL=SS z3vfSPG6+4xK3-qg$rcdQonf?Xs(%YRE#~$q=Y-#p2COa6VE2S-7j#6j*5OkWIQ63& ztzrHm271x(8EOcPHZj2q>` zsiNVJzw`GdDM{>nFG^GDEJv!wCem=*to0}Cy60h!8}$E`Oxamyp`4%S+|FSK^`mskOc4T8<)ZH?HWjYIply#AC!Y9NReuxkHM~(! zAcMzIk}{wDD?W>Tdf31O^SM8%eg6H*>xx0=Ijn$ zy@gwz@JaP^e6y3Pi0`5Bq4mIR&CqOmHv@Q6cJ`^!24+AZr!J=ALUu#t{~U3rVbrvM zq&=AX^dWuy`!AbW{!t;36dnI{>{2TuK`YVu?i?rL%Mcx&CJ3(9hw4(^i zdoKVRSzTRPc>NX8=JSkU|F4b&=>MoOz~28M80=I8V;SYm#NRUXv9|tGT}`{JqEsio zw5+r;zpkpd{iCF$q=bD5*Y?n^<@2arn1c+@OOJdl{|n_D@{y|i_zt_R#}VrffSIJ( zDVZt1KXP`DSnCmo%>$&z9jkB3fvxug5fJ=ySY5*!l4$?5rCBy7Eq}ZKC5%w7!`>&VE zRBT4xseCiV|2{9iSHJXC`^NdZ#1!!O2&FzB7Fj{7#$U{AagS`4A4nIY+&gJ{d+Qdh ze|irGVm@GE)GMC{GZJO|1}_9jPj$nMd9d(Z*lJP&GmA&V^0$00m!$34`QE#5E@b=& zLiB4HKSP-BKI~@5uCT9c4u+IwtaCNi;)cG#-_EbxYkdSp2lhr_YV*~n-tOkb4T9Lv z+gHGklV8#ro85Yk#^&Bc2`Uv~f)o7$m}XyFlxT-=Brdw18`0z$Y^83f%r~74fd}&V~L#-)0kXi|L`}e%5<*^(x>_O^m?78xN z)@#Pe`=Rp?!|{h!5ZY%7){AFpt{|^mlgHJGA&;{?NP8?GrX~BbqrhbY;^HgZC80g& z{tq)qn9R)a4!z1bvH*1*MiQ0$n8k@KXrLX6(H;9%nDOBXw z@adphzBD?Pk7me#`x9T6jyk%Ys~#TZwMV1oPbf_3us9XKxGm!_wCQl4>*pIF3Y;zFp7&v z^HyEyH9cHPuaanEb8*Dw*+_Kr+b>Z?F9qecNdSGT{I52zM|HrA)$!Ukz32+^Sw9PRU)xC1^o&w*KOQD9G~W z)7(()?WF_kMJAF`kr)ULn$Vj)z4`W3g!&Iuw0nD7?%T23oIH7mJc*u@o-8fGkKQesR2}5XO@52%T~?3_^=W9{yYce7f`8sa-E#}(#JF;& z(>ND*PjH? zY9fqp=pvJ{vO@qdd7`k%`OH}w1nP`D?$N@Njeru+K-0I60HB@*&{7Bv@i2nJ#{6xF z-W`+uos*-0J`2z@@6#&?Ablt^lO!!^0GT1+)POPCp4Wjz7?=4^L&j9ZEn1H}+-pD_ zvT_LXX1|yaard)RlJqk}t|11V!Jr3L+@ZhY6YC`pPDgpm+vdV$a${z zV-i=cF6-YtwabdbLcma1%v1{d*%B+jufi#9-is1&oH-uXtwWSs9o0R!aVDg>HWP9K z34ZOKPo6EmUNJZk92)TVb%KXx?@uZ?!`Ux~-fe08izfGjee(8t28g}SU@I8%2bT+8 z1Z09bgc^2$+71@cgk~jZhl-CT$OG`BR!f!N1~(k%pK%U3v`3%m5v<#k$Htm;;+JHK z`@}K6Bi3=c?%;GXC)}cMGXi>x#%Uz;!L5KBjuVq#@na6#7S&KoZ@W3|`IFw-+l=-x z4Z=O^ZtGhPHXD(&nuE8@UH_gtCj`VTFzie*>NL6M2lV5QP@H6;+TJ(i6)ZwpnA8={ zHA-XiE|LtvOw`riQFB>~|0f1_(#?Nsv>5n1U*Pu5xBPi4@g8q$HfFx>&o18pK_!v~ zasFa1Om+3{=w(w?W85+dpql!k<;u;3U7{#sR^0F2JDQE7nS2Zl~VR1+8kJ|r^ZL` zzTWAU)ZW(mJKlLqNK0?;_l6Err~A5u&mv;h z?%zf8xZMpbVlL?knEiZbC&t1n+>WLyX=rm)B5yeKBnSRv4B+_Z+ny1Z|PCCHnUOFMwVm(`kp1%K(}TMW18@ z{*&0GKoU7{hb6ooxr-Vt47`;ch+2h))hBD;3btDu%2t|BOw8o@u%Ev!&}oZuk3ci>|NRgjJjD+kT_L`I^3FGUn3b41z!A>Q|k5KQRN(0-Z;< zrv@0j&Oe-{mT!}?C!#0qWG~Yz8m8*UQRAV2_JGp!+0-zMDh&{RcuXDO{oz`>5H;eR zu}Bf&V>&378eIoiufTg@-7X7wAPh*{ICtvFKE`y0zFlPQ2m5`tmj1+@eKYdSgbvOg zyU91_wYs0Ud0+Dmst9)D%R>$5B-}4weQa}rySMK6#g30o`x5Ea!o5q9oW@=bN=|>&BT&(o%JH$^0Hq$Pfp4 z;5lG!!Qo7i2D|YtM>l{VZzpK0kvfqAI1wjRzys#|gl z!rGr!5lB`|$OT$zM@jewH$2e+%}#asLfBdKJ^^^kjh^l{+v*{m)91+}M17qvAMSHH zSaM#kQ$9CTd-|e6pvSFeKabtNJ3M=RH_Ti{PF_?$w1IZPL@&QH^x2v*%ek-$4(iRl z&@3qE&i*V;kq!@L_D~IR#1m%z$B&JR5R?Rc98K=LhhpS(Fw}QXoe?)e`J0Cg+4Z59 z#_T9KfWsT&G1+Y*MNhDlWdJ)mE>!-uaI_9F_Kr_f0O>(oIi+4zqUxq=`US6C>pXOM zrcvdM4)GQ)6hkJ{Yya$Z+jbgk-QHj4bQ~}EcHu)nY+FN*H6Y)r`906!cQ&AHD3>Up zymkEe)dRbary}~IIS?eq7c5!6W%NCGFUUAkjt6cr@v>pe6&{KaAjBSfKYDc_cH5Q* zJ@Okux+njmb5;d_v9}Qb7-NvgsrFjj6BCf$Yeg&Uly8QWW%;U2L4t2@U+>xAlrcYt zMSvT=2^#(;Ze@O1HD#JA_G;l6$D{`}imA?wVhHcI=&!8ze(+D7onid)Z%JEF#rpKE zn76*Oj!ihoB!GqnNq)cj)n+-y{f|6g2-NxMRQY)Rma7q4sJ3h<dI{AI!4-zcRGq3Vk|hkRHiOOEyR%-@GDF^*ZvjX&XG5b}P~m%Vpf8{TjuRfC zZ%ZpV`)41Zv9oZ}>6kC;LJm1~n}6s4=y5Pp%!Qy^n$JX*KrrghzOo(gD>&3y%7zjL zN@DzVvVOwwj*4)Pc-3XS)O`8Y*zE^=F}`e&@ifW7qx@XkU=ab^6V%V*>JtQB%RHw1 z)w2i`ZjyYWz))UGu;W|Ex~aw$rtT<8ql?XAMhKh!uu0Ggh6^vA0?L%Yx<3$*GwFk6 zL7O8_9}CeqaNx*`uVKC!tR#w09?F;Ia8VYWjNJe3!=CxQ@DPqeEb3s=pu%1!zX&Mz zeiq35RYsP2wf*gYye?VIb`Jbb=Ac zbiAt$J9l`(_5DyIrm7urKHE7-%URk*_NlFCbF2N9{3KVh1Ut7O$5RMZKy5qm>x=VW zaw-a#LmZeG={kEIGOA*;*I!UJURwswsnoi8*yZng#0!8qPeY zF_1{(KOfhz)^he1o|{66WN~@IT=Z zr>Or2()@X15@#f3rRAih+CG++lvbUUIV&q&lJNG`%f$Tr4;l5<75Jtq+p(zy*WtEV zAvC9TfYPV2t%oK|IGsm#s!p2T?c~MR{)P@h?!5OQTYl zbqDg3?yE9Oqz?tG>)Y+Xb8>XL#)p0Ri1gWKcQ#hW*RHwQ&*_*#;hsn!7IgDU4BdaC zPmh^h4s)8A+6)1SKhP7ZB#QO5OGS0YJXbrHhb8?p=b@ex(HUzE*GOx5AAEusp)TRY z8n(+D`4fZsJX#td+*UO$kA{cs<7+%`iiu;UJ-@A#z_1gfkoqh!N6~`e8^KWp3q_Rt z4?A(!#-GUF%Mw}pY?a3lIho^nnpwR?>!=ZZhwGZG;bb;OOdBOy8tCF@*?8xr`R{}? z7ebIUydGQ^vh>udpF0Ike+vP9@TD&*y^cHy@9MF{z=Z zJ#o<2IM2MpP7bR;a!)q?d|8~3(^mZWI7__e53iI;gA3t(WXhZs!X!%KHzm7*b;2|X z7fO?8ddTvb6sma&gmYl5UO$+b9`;*koKHLb;zp6~$nURoXF6S3)_oVGzuP=i5NUCE zS@fcYk8|lfl#0T19`#_x!#0j zTFI1Q=iIn(NrEb|MDXE^!M4A5FyAu(Vx%Ex#;#|Bc&a*+gdqE6uZD`?K%LAh&r(}tP4f6S~fH${@^9ybor=oz~8dO(9+`bdXaH|_5$^mY*d2JhAw6x zmNQ8VjwidDc)MgxRM)D89n*@f+862A{ek2d0PB1Bsop^K1F+R>lFdmNaUK0E2f(Oz z$VZx-3>eWUn!aFk%_ zd>LPuOrIJLG4ez=Z`yR&B+{$iicfiO+@jhql=`;Z5?2NPBaLjiWl1P|RM4*DZb&O- zFm8Imbf|pl*1zI2Q;exJ)OX>66k&_PKML(TPo-4zjbl0CsW zXUjMmw^rZ60*k3liSnyRQ?|)?x0i#|94F$!?CE=T$K$QLM?Zgf0psv9(Ol0++owbz z*8Q0Eqn6d?y`E1P@bkf}=ej5YWHVEdY7F9vXdovi`TEbDQ!6!UDwKh|o7$csEp&(6 zP(n5gt;?~kL44m8$_CCei@PuIfn-IW@bRxjHVMDgA4YkEaNW57zDLOAVV&vw{ik$Z z$>VH@4|iX)THWNns2zhy3^o7zasf41Roj%}v(|NVQJ#s?JlN@l;q!=LQue_H*P`h`?KeNKCtXQF22=qQ9A z5;;r9Y&)`@>!T%*;&DdDn6{i7?@)|-X~}axPctWvmMnHi5leHE6&)YD3W=N)iNB|& zO2ia{4^xxAE4#H8i&%X=-cA|^?Iufgang5o-jJ4w$~+my zgP1p5yx-k%avtoR@gdR~rRP|z^RQ*_Tuzo=}BMM<<9a#2^Y`YvOKQ4cyj4}5FI)^9PduZ|JIA*1yJwAg$xKnOXtxm(@tQ#rlys5PV5eTk^cp|I6kU*%^uk!;FhN!+Z-tUXA zimva~h)gi#9d1bxXGN_qP6csJ!l6d!47+b*tgX7Ov2bMQ^T&&S4du?Jt}-W!WF|Iu zy8T^yAJ1@|Z2>x`ZG#a{dB7AE`)T2fAU!?XTL*ONXxe}?Pi6-36=kI%hH;RkiEV5> zn&VtWbQ410AUFhQ>WllILqhP zHO9nFiVhzp+Lz5;tZQ-k@+YIC@@`Cu&Om!S$pX*)i=BztNSu92<1#EOb8RtAo}K02 zDl3a6e#$?s$E7HO*^rjes<7}-9;!iSu0|uuh6>IN(3^Rn17zR^heG*`Jhxf)TJa8Z zJL50J%Q2hBS0nco^Pu|IgeT6z7asmisJj8%XU>;SE*+%0m(ar7CjJ|)EkKc1hfF2i z(kqIUZS4xtwpaF~_+4#VG_TMkL0q3cT3$vdt65_kNbkx7N@!+W?4f@NYHg7(0d;Md zQ~p?%)_ki4Vv(6pG}}Hl%YKd2k^T7L@{!u)Fmg%f>mB&oi$QCh zHsDFdxWmxlv2|8$yP{mSAUy?jNQ=jCwy^AA1w@zddsVILi+Y*}y}Y}{wk1f;$} z78=K^YO!T9etD>QVYX3JYJBnBHRw6^yoyMedv1H zvWRNu+uNfC7;PGi338K(VQ&&qlMw!o_08-Tj9(bCoqFLz50yBBY_Y|^z58SMr7nq0 zDSv}Lerw=SAE2MeL z1C>@TX+OXHhs=o%A7u_x@PiOaz?y`L5R}z%U&%2RKjA6@pxR9o^u9TlKItYzk)iTn z;Ap1-`;(m~Tz2Nm{ZsVL~avMt|nqkgL zM(P!FJyJ?>`M}v8pK4p(zkXA8jDBsG@e%qdksGo+M%k&j9IcmRW|-zKMKKcx4?)kT z9z*{~M)sd?9vel~TD#%3j%%%vSM0fG+PNVQ8J$oT<3ijx%n9&~NjgG6&?mqF4b?m_ ze46x}x-%?TTY<{#Y%T!QHQ#Y4CH>)YCDU^heblV%`7mwiZ~B^aPOw4chS2hRDZ{&n z_WRGeDhi9zw8`kX;(t<#j*#(Uu7^q~7lzlR;tO%Qm~i?jv5q*d=jX-in?sX`7lkPP zwhNs5fla`|B1(UjLQn5Rdza?}`Ep++lV^p)rERx8PmNcv*jTBb)mmKk>R6UjX@>mO z0|(L=bm5E`WQovw)fyCTF_0KK2rGCj1WwH$zUUwaM91rKI^am8n3XOkr@mX;Xb%qG zFz*MEZ+%{FkVK5=*P^ctRF#gpp@aQ=qSO-7#3OzG2#^2FZ*BW6fpSsEIIUO*4@0!1 z7x*i2`wv`-u*;fE8N`1LGr;ChF=qaY4?XJ~}onsNAX zQK|=iM&fzW@LmPOv3NF=dX&y-ok!N;QWI&VHxKtvB8XGBY8jRJUZq?3U!DGExEAcC zSI=KKjzRV-aObhaCAvH}8vJRY`jiMa8G^{D|5~Ik}BuXP<#pE(<*MS*CHW+yB;EiVeybxAojPo+XWqJBRI(mf(S8 zNL%C+(I3o!`2^ZT4tE9U@|y@OXNX{qg_?sYDD5pgdIl5Ds>_C{Sv7!BRya<9d!Hff z7MTIJ`}i?JA*p8|zgBzB+3N96wV^-O;i%kxrbS8E`xkN6c`$`ieivg7$p0c7CI5$T za8NhR7oPk(T)%$zR}Iwk)HT=Rt3QAINT@HUZz^jDbuXB*>UzKsTMO|F3S6_eSI+s9 zQDbta3v^KMl>i$PZu+XjTx97K(+uQNl)MihmOhGM>-%v1aiHxBwRwaT$O zM9N+h>u$QAzh`%#B%ojf2?wKi(xvfUd)($$x#Exmo$5Nn_&k1JI2+)OTI`okmWfk4 zNAoSJM_}t%a2>iU$gE5);Ymvhgn-VmBl%N|bK8(`yRV;llgsGig~%Uoy*g}A_SUzY zw?5WhyPNyk%-y!RRbVguv}wEOIGV}pWta*#9GMmLc>7~efb0{RS0m^^*4H6n5QKL`Ncmd^hv^!`UYJCS3lLNc&Id@PRL&lOHlZe<3S(Fz2_sRE6Vx& zY+JIn|EzRnoIO6+c%q)I(KZS_|f2whNq7` zdJYv-^&@RDU8DWV;X%ciB|m7DP&{_c(1 z)QjB@m~Pl|QjO?+$yf2gvif4~h(@Ql{pa77f*QBF!Ye^&Y{5!N|JY7E(N6KJc#4&G z8LS)ueqY@r|AoKP%Hh}KJanF20 z!g`)_)1PL?qlt-4ttx>~g{{5iuAf;HhSX2qdo<}6@phqF4N#}OZaZQ#K1Zk$f1>iD z@uHC@AT5VnRo#L*t_M>_X^t}|y1D;+t!F-!O1ine^C1{QEnJBfe*S&*n!gcZ^dH}3 zb&c2aN4qdy^?N}tn3eH;Y5Ssz?zzm@xidZs5N@Eo*^B{IWN}!+I#Bj%&MVAFvA20? zWgyS4fUV|D_csx$A_V1+I=SOXwN0wjZ$NbM<$k1x!y5HC8&}XN=C#TjG zS;MnpRkrQs4Xh50n+5pf>#zHswQS6{px3!2CA%vGgqcE_(~65_&b$c`g|Y6@H1%3y z<~Q5P*58wy@3ZiO!aFHV*3K8E<;h35o_1QllP8%Sz1b6Z3gL7rc0TzCLU@9~(RLp_ zstDfm^TOkn50Cb2iS?u&ZqLxx7gXx%b-;1jo*+;i546kiS1|7O)1tnPk>Ov9$m7aYRHQ7D@E*0i%=!!uIlexqxBLGYKdy*qza_@6~Dfjwg=h6C{c zJqxu@@7T{H36?+IZT~6pr`p>vyYsw8yCqj0HEX&mN_dK&+Pb$1WfxCX5u4VQ513FT{*h|}LudsNT(^7=YATA02A-csPfl}ONn zAXjfAf&Izy@>$#uISNN&f)QCyi%7oc{8D(`0x31Wj0GzfphR_|~H|FqfgRhvNGa zoY_Q=R0|2iPo#Wh0BY;@6Uuhhf!(AxjVu^^J_fZ-@m*-8<=gGg)y-l;vX>O*y z4KQ?C>*ynB_Ovs65WAcrpd0DSBM!3C3#Lj~FWJ&emL)1>IOx{L$KLaLn;TWmjI*7g zlJmM@>1VE@AL>7S*GEZ0;B=HK+wHhru&*fR#9I_T8otO0 z4hMsc5)KIojH>40gT(634T5_NO22I~Pfh`XSru)jjFQF9Um-}{i?F!KN_HB@`CU#x zN4GG`bG(6xA?pei{G6xw_KL`2|Cwk6iBJghH_ijFhVo?qQ_pHZM>BMku8Hj%Xz~#U z3w!&QtN`oV&4)OLIT(^Ux8EL+f#a_2Gl6#K=LbapOg; zai#g=iw7tXEN2Tj1ctDHoh9Lz>|(=Hjuo>g}m?!U;ks zN2|}}jh4`T&G&7gqFHyP@BhktRtv8WyO3_`BlDB#eg`b)^v0N-*$Zm>!i!Ir+KkWS ze_kH#>I{(`=g19YlnnayrL20op0uLh`9UY-$&Fryq+;!|i0jl*HmfsWfnIx`9;E-g z*R0V0rk`Pw&z#d$XhE@j*7)PQ(pK%44-oDNDsM6ZF$3OfR|oNs6Uy}> z+6z>!YZHn*x~}+&Z%uM7uUupKNr=`{FGH=%CVT<0cCnr|Tk~m29@mw=x}ms#W!t`b zY;#UUF^5A=FjFN&$!7P8atO^^OGhHN?dbdIS7R6N(5eUVW4P={Gjg%;V)xTu?rR-I z#_*NZqth<61zh=F5fF_d`0goYo%LyM}`3MHVTmDH^Rb` zXZZFpq4K~v9J@z3q65U8inuVq2G&R5qySiT6)?UE3-h^jQ|F&3u}g#J)%%e;WquYd z?_cgaEPS!PLZ?eJodeB^cr+t<$+L5qcP0(S2w>m%X7OW{?DqK3t$e;$V1$a5TEac@z~kvbd7S7~iDo;3Ab_>3)vBC=}8dSRKi|ni1K~#NbX_Cmz~0 zG}ZY0)bpFjUNp-UaYyCnea-!k|J*`A&H0%_*&IU-@h>K#CM(lkrXOaS4uwLv$0(>(Oas(p)>lWMpyi7*Eq|yCj)_FW>bT=a z2l@^@gpfHY-}4fngWz{y1aK_hR|kas=uciXW6wHKLwxv^@$YS4$4+?56z!uPsnzL> zMOWUv)?WD%*Kx&I@Mza#@P-3n zo1^<%is;{eV%_)Cvdm26xu=xwH49^R83jF$cO}(50}OY#D`lJ~5N{e(Xd+`Fd*Mi} zE|qOD&T<8X`eutql8+esl-u5!{{Uww5a7)nK2KsIoK7@Qw&2`Fv4MFemQL@yxFB%p z@ZaT6P;~WY8sRbU^}(WbsYB|aLUyQ8VZH!q~lNE~9IC7x{s2pm3G zJwqJs9vRwn!UMU*&kg<@!oW9L6L2giQMvJs|E>kVDOz{lo?Sno|2!Xfe^B^_e*K@& zJ0Z09RKzvi#@Yw*++s}^lmu;$**R$KN8W6UjlVh|ScUBKZ|$nsB-9u`btfqRG-f>W zQKf3u3;Lp4YMjqPG1NLd$iU~QQpCdDaPkWZCr+suCQOAKPT8$Uh~TobzhuM6&)pz6 z)P@jf+nV+m%*M5;5whA>FiIfDiy{I9snPgIW8owW8?KNQZ7{a)Ea^pd_&b`SD|B}~ z$knOx-{pfbVYkj0lW?BffnL)0oqBR=&L!)I$w0`(Z%Chi4=8iDs~Q{W`ChE~SZi)) zQz)GAUuto7&>L8^frO4Y`-#~V7?DPE?|{8zI3859S|ID8#8TB10|o-XUs5AYcFNO) zQUvx7<&SqJVIUm4^;HZM;h846Jm1y>^p?;CB(|x{5aeL9teeHP%>X4!^+Eu=Z@u@b z=r5z}D`D!db{0J+^w+-je>)8BaryM9H^qx3I(2(~G;sBEY>yFhKT-Dq&&GArvgfgy zY@bZ1XhX-g-zP46%dch~GUl;LX(RT2LESR2uT{0obpNr1RnbGUJm0vOGp-l>OZ!+z z&xY%Kn*EU((#JbtB1}{1{#G%?{-@u6r|K@OjJ-4P1;pJ zJIr3;p)8S^{Cu5i0|zamRNJ(}3QJDK-avQ*E6`F+`x{;|AA;fnHHfGH*PS<2jlq+N zuTQ!3O<2dTg?`1eU8~psYIrCgW}KJ&&zeyVVwsa;3&=kTHt#7V*>kmPY~RP3Trllz zBrR{)!3sarsfG|)2w(FiSQHf06~bCJ@;jo;-sOHdL5X>TXShPAUSvBWlHE( zAh>&?kV92P88xz^1Rz9Dq*qXDb_VgtzGH5Ztv61K>X887@cj!ux(zUQT2g{Jl{8ix zid}QQu!KIn^1JbilmvZ-Kp2P91?H1J7LBfkfV1Vb#n!cT-y7oJ*eZ>4L@>MrT3sEB z(+16$1?6@9-(RHD&8cMS;=L9rrDH~!aw>b6SphU%?RtE29xPPbt8UeA9@`x&O9Au9s=F z$-49H<;rvL5WprJ~LsK5U@I5?^QV>aJ>1sdwUcD9zaG#6F1 zHxdYSctU+i&zUn)lHxK_XX>;XAFs4b&ze}i_1V8DC;Zz}diZE@__h7%C8}=df!ZM- z=~~l`KA#6(1;xb+R6IzA@P6DVihD_tkDyZWa$cFBOsIH3uT?RQ(>y+)bTCmXZfq&9 zDxjcwh6Xzhxrdh~8s4!d)GMS>$jty}G?%Rch!zQ43x%sNG(*nDyu+rJ;5`78L!LvV zqYQ?>5$N{0w=yF>4_#O(jjc;w6JVx}-pWc0A8W4~L{=)Fw4TIWX%e%brbESXt<<~C z@>=XLn!nbOy!F%bRM53J934OW7}|DND&%YbvO@Di7(ISNH%P2OWa%P$O znRRaZ5$qyngmLOvayM0Ah%WB)@rCHizLR~=d9}oRo9ZeZ)u^gL!8C%N?PuQPYt(ze zdZnoU@Nt!@8Wx|SXdgY`<)0c&M1ez7J44?SyHtmsvUTP?% z>BzT?nvpg0COAZ9zx=?f8i%EvrN8r$gXyrvptw>?v0PMfR%VZhjSAwf)I5`_@cXbv zjKe-(KhH1Y`a@{rCHpXj@xMorRTP&sKM46FEU#$)mjQRZ_^$3>BQvlZiaUJCZdVR5 z2=W;IcH<(AR4@ccweK-fKR6vBRh|p4!)iKLIhx&Qq4fE=A-l?2gYa#MzyO8TeZKpNTBYR< zTR`iG=wh(R^JiS zBTo)AVSctrO_VtxI;U8_?jTza1l#JY)O0N#GT>H+Z*iANU?6}62^7co&8cEIkn3FH zvv*$#vYw4>Y5F2WO%cyZd%QaWaA7i7A*Sr-5x%0F{~uB39Zhxo|MB;|Tzl`8 zU3L^9>t35wMo4xdN@g;`y_c+v$Vk~)$u5M9du=7zWM4BSdyjkX?|#qkd(QVS|J{Rg zKcDye^?W@a&!+@}s3=^$`wJGiTU&Pf3S#4p^S`C{t-Y5dG&fStdLQl<_mUTiWHZmI zNOu~TuqI!vE&+2H6#I?AvhG&3hjiav*p9Duym|JobRw-(&)Xl0A;sv{5E*|r4Q)5? zc|qN{lRk>Fa1Rg*m>>sv8&L{#hgw%a-utPjOAxUC0HjaTYq-SjOvsW}W4o1S6Dt7s z6sdG_LScQB2+f6hIo?xyLqx^<f!5<1^ zR3PH?qUbGD*1k4p5KdDbvgA^Dkp0i#u8f6M6K`MKTGpi-Um1e)$eU~ke}z*0rTQIm zOr!Ev-;7BJ>rojFJ|>Qd8BDm8B?8!ql)JyNyc(nfkAtb}9t`9qTt zfi+I*=Fwe0vb;;Rq|Q@gwP8b7Xz>Kbgh8wv z3gpG1^3ZCz^xm;A%xKR|B?S!#y`ThnM7WD#&xClJxecH)i0q*hRwNeKC#hO+DpHNWCh38k?QpeGfxmaf%&pn7}x$;zvqDnJ`or#mAHc}^=pIfzpu!@5j> zm@+n>Mfv!7N*ETOHgMW=7i`-e3V6T#397X01Z}TkFzjIF?_#6Y)d7hZ3ZM+~Fe5!w zp!&NkU&M29mGtQ5{G7KP**#h5&K*{mG^lTRQ$x@_(L@JFw+G+*WAD{k6*Vw1yZNw# zR`4eO#{Ni2+^L3C7jC{SR@loFzTaK5 z#gAy8l<}&efh0T4oAK!zLb20fv`i>z-2L*ls%C(0e#VSkeE|@O4#MN;0?Z~X{)9Hc zhIV^EUvGmH1L?MUQ~++Ci-rQ%vm-LWJTxj$ho3+P5NBeb-2YOIUSq%b>Z?$(?G4k& z4$rw?cq@1MfEfSh&nAz~=GLMPuCe_s4UgrH+bQFcdP-Sq3E1b{{df79`(r-a+@F;7 zr~Bq1%-~{SYV~}ZZprn;sW1IPeCJ*qJ_t5G7ycvFT+}iZKZ27Kj`Q?V;sU6-l0W-{n0ODI^FE*2_Wm)FMY0}7NK4|7Yf*c?nL+CWu)sEhaUC`GE<*-tc z7Y;lUNu|9aZp3bSkBQXqsCb;CP9vbzRK$90-4_qPvnXdTsU3{t?tbvitG4+wU=CE# zpooM{C|Ky8eh`aM3->#;jDi#+G$t&;1pj326Cil>hZDUATbgfgQYE!0RGc2Hr(Xlg zI!})vAZV@J2s!@GYRnqw}D=#^!LW%|a$E($r?wPq^* zOPh@IruO_KeBbNIJC^hahbc)A7-c##KV%oKy%<#C1qxu5rSB!b|2_}&);v~8_)dfH zcAuVu^k!I~h_s;XEo8NRHwLN7lv@PQK3Qc4B(ZPi{$N!*!^sXCmCRd2t=jiL7H3(LVIc(sW#&_=77 zal4^wgBCb#eE&)i$c3T>cu|+m4Nti#e?p|ZlS%Q(Oh#AW_y2}!sbrjrz0__U%>R=v zMSRLi;~k?iL}TXv<6@vhen+c{>GP#G=L_kHodL@e)wH}$0bG`)%aH2F9d8gudLkBVS}G1dV*~fk;g&qg*Xo~jUjhMV?0;)D zC;cZ-RH9Xrn@IiIQu$7yskF&dICT&50xarg&TEy`ORipf}>?Eg=(;`c4$*^3H4^2Kkl}Tqz3(57##K+Lzd$ zO5E|()_=!M`(83VX!}m;Cx0thi!nRXk4G=MzUIrNJzUB!mJ^2X@Gi#24!e+4>f-GT zYon%Z^LD$8sJ}c5(Lo=J89~lMe@0cU>I#LA|Ied0f#iyj8F9*Iq~CLJ&N?xavIrH{ z3Td6E5+LY+U#M9~?;4^x5j!G91B5Q;G-V`$Jbb&X3BN~}4~fD_qajtW%^&ZR=Na~A z2FMRT^cOXc%>~C8rUQMH^}k`~>J(9!%*1AFtt9l5=JA~O3u5AefTbt5p1hrzS(QcS z4ZF(<@g<^)H%JKYL)E}Pe1(-C9>tGWjjb1raECF#NvaH%6LaKW9+c|#$#=?JSD4-B z5Dxt`e4((Yd+zk`iptm67^<>5+{6_bFZU`sdYMNi2h*H(e)1!-@SJ$LH+Kg+uQ58Q zJJ95A!obE(dZNPuq{K<*jDrCe1Ye*$S_9IW~o z*oL*H)0x;mb)8qF8lMYhWN^}#}lWY#bht3P5Z65&T2Kgq7ksx>xvnqvf#_R4tHVKPB+# zgU+|a3dhD?q1pS#OQiq&Uc8M!IB=f7=NK@Lteu#CjTYxo>KB+$xm7fD zGk<9u(-6FmxhJ2}(Z7{;pJbZlO0MGT@fCj@ESfC7dfm1vT*E_6*DTdFM1>CXRISnH zVRq>d3BB&Fe1ZzQ z*~fLDOwfW%Eq|6ke)HCt+r2{^B>#u_8-^z4kEhL^BD)ep|7e5+hDyvtE?m=26ZE8m zs~G<(;p0(xyv)6zSy^t6;ne?o=EcK){^{Jz<2VV{A$J#ra#V&`RI%-NSL%1@P zij>D2vhVCU&h`D}lMSMmlxyIt7FE!98}=VdhT4mhll?yyg0TIco)S7 zRWf;B(eUbBe!&~cplr>SK@>@#iBY^(Ybi;ie)dR5vUG43rDKDJ}C1R4E z7^1hX0<;DaqR`eLnAn~Ax=+(^Q7Av#{#GA;x#rkosIladMf`}Hm4gNf*;13~zE<=* zXlW zrjhdxj@B3`0Q~7UVc`!CAUG)vinR%^@Cc3~Uq0ovN)Nom`48*8O)=kQ`oD3ZwPj25cxL*~(MK9lCZT#<#(vLUVMB5pE z)r=x*Df{=gra>AIDUF4iHh#mqNPrwte1WRd>8CFiZ6{e-DC~w4fSi32UJEBGIAl-;WZ{>|v&WSnY#szCjQE5N~(h8ytNpYq4FM`M6ET`tRsmeuD(JHEepF$_T!v$PiSM}XBKEmrTJm!z* zko84PsA`WJ_tw=I-1UBX%Qz+2T7>C-y*5(loM~ZJWTrH&d6N`08MUuh0Jneoo=UkR zjnkSToVH?hV<;biyLS?Tgt+PwG4^2>m3LcS3cNEARe8{}V+vX@GZyIn0lNGVBap2| zJ=RMyF-cZUfG2H3zdhVg`2f-REshV0M#4~$J9^zPnsZ+m;_PC7s)7gVdS_bc*LNG8 zUkj+3W}^lVeTF3%f=^TaI>p6XZT3A~-juX4+rKI_&a7FwV=E&qJ$MmD_5EvUlBn&+ zZ}cSHt$5$CZF7ht=|xD{!#rCzt(nS631!Uo87!-7Lw_Es#FLX1!}*PgTjBRVl0iYe z>mJPepXHQ$TQPW*(|&N62z4ySK#q?h6~bIeU~+Q3ZZRmKvVZFHVBw5fL6h`7)(Rnu zcW?;`s!w|5t~zbV zz4ns}XiYm|VZw8YZNt$JTaHV0Jyo?g#l?zted>&O_;QbqXdA3H7kP1)&2WF<%mdH` zAK@5BVfIj!+YodRd8-m`KcLKYoECQM37zvIEloC0IZ4xDa4yNPzCAI*n1Rs+pw=|U zN_W~7nvaQ~03~o4I_7p(2vcDG*kiO8;|qKKtFrGXrg@(?A_E^vywkrF`RSzMmMZ*- zr|Q-6c-lAy`SS6&(7EM{BrR4nz7-=2=SG5 zkLWa)O+9}4GOB9HdKcB-k{27e1fAXn5=KM@|hJj%EB4m|bKH^V8o} z^sn+d1!<$kesiy4e}@FkH-g}qMMGS7@m~{m7wHQ-08vZ$Wkv~&jf_W2DGcP9<(RTNu&aD124PiNWsd*b{r%1Wh%y9ip%-QBee z9vw4E2EUynX$aQE%PqmL2}#_J1~S^aTv}rm98wx#-vshP=L9?gm7f}E;r$ktB4?rqkAK>YG#plT#U6JKbuv{nWdkvd2AH<=<<^vO5HU)wX_+mzBO}1kO zwlx7sfaswIxYuip;vpAjfGAdkL->>odp2w9kZ-3Xi`fazPjE8#G#D_H-Lx1OIC9gW z&lZi)Qf#N8kdB+oG!P9hvwTprILC%Ett?Tzu{xygcVFN8ig1*%&zok?f3Y;B?>6A1 zLl8Z3Z7iZRre;K7P@iAsVf|g8kb381rFZ9#&=CBi5BP(%j_s(|GSLj`H&wAI_-WoK zq&g11we`j0A@X>TPC0hK`&N6`_=kF42v`^)B3sGO+}kctRIe6Zf0X9E3*i;cU|8cw(@_p#msq~XK70-GH#>W!d zgXP7VUtH+Js(Qb_`k>PWdymbjLF9R>L@GrQ)OPmI>8nzSJN)UG^Xn95U3GP%x996m zf)W&&({phyEWfkUUT#>kJJ0@@z5C_(ZO_U8!M74t7>gwI^PY`!a(yYrG1+9_x%rr_ zn8JMi&*S2MYXxv%f%B#uFQ}6qcV^EB?1`a_R-UdoFKps=0yOY*Rxsv-VZIhuB3u6E+#f1%{pCsbrS*Kgf7+5OH$ zCG_yT-giLSc}b$drXg{SF^@dLkq<)4P+_IvF4A7I^q8qqa%4x4IXJrFe$Iu&(tb1G zyd=6PtLD8!Mgy!UC|5Vri_67P&^O`Xg!@B`@!V58zXgPo^6lFp zjPiS1EM}6sY6CW+yQBV7xjX(f<1$x6W7RNnOMxO8v6kC!$1k*me-6aFfk<=SxAG&; zV*fUf8z1lE6MR6phjA9bZywoyRmZ#toSrHZSns3%Vu@XRPtqC3tg}M0eKWdKx9XSI zcGxs;&xip02VRTK=kf`mGLiNo$T1T&N{D&Q7qF#7)khJvE^P%Ad;mNZD z-zsr^Ho7Y=WTRR!uW9(>y4TiPY1p0Flyybi=g2+O8D}|gPFhz9V7+tx9fAn0r)HR3 zydE+HO}(&)qj)W3X`Y%(fP!;mCiG}u_c3K^F1&Y(26zGRVESugIY6jHDR{F}0R%#z zP5Vt;KwimnF|s_hbXhpUkFOFp$NNR6Rq7(F^>FF3>H~S1(8V89Q9Fjh=@0pCwCh}G zvs(LQb+)CsC#PjtnK7qSs4`^3b&FPOdCMCqYqp~!tVeQg&pZ>EvRBZ{=&L{nII^MhD{9eo=r4{a;fy?t7nbJEO6)Ms~` zC8!8-C)}oyMcApE1wHW<5pN$m-06{-SkMvk~eWtL>VJzU@ysr4&f7^r(u7o zb3zJ>G2n^kjqLI~*4H;f9Q?W!R#0~zEV~N>G=F>usW+roMgxDSdVCRx3c+Jvm$E5~ zlOs`P0Fil~ws{b>1tjwQEmVIqSTjs~}h~-}>ChM(dW&aatKZi{!j(*l z=YI<^nQtx%GE-67vPhf9lj(k?dryig?_T_LWx|4kZ>;)j@gbq%cHd^jmlR3@Na@fx zCm%OXhWZcfhz>%oT9~d88G(~^`U~ua@JTs%eyaat#Q}l~xDP{wV_K0=xXAehlDA^3 zo|^_N4<%8&bO3I&+?*)La4rDn`$SZm-+YJNyN*oaI6o1B*4Ev;SfO?;?f6wt?Vi>9 z*N)4)#BhO+c3470AJ@p+h1Tk1uLm?WGx^09a{P$_4Wi#F*f}_!M|tzErwsOaMyo5^ zJ@Ccj29j0c7M8>C|Cye)eLE8TxxQmQP)Bd_Wl&rJbtc65DVD7Q2-RawZ}ry zY#j*+B1dN>YM+8ER$kqczjRg=@A>vlGWK&_6R#)%F6eYX@3W(!1905!pLA%F7uSy* z+UBiEON%p`5DCdg%oj0cF$7W~wKraXI0S9be{=55%Dr)!3bk3C`K9-)UvB%ok>lFM zf1KO2Prh(4Mjc3Lz{1e7ACoMTY$>R2PArnS&W1VW0`iC$PpER}X;giF|M({SQD@ae zBJs$KSaJHf>c|<%>^vI8mxAWOkwmRUk|0WZ&_yb27PW6@O(n}lK^72E0XFY_Mx%{rk?y=9{iQUTrPj{Ao z91f_W*?Z&=X8k-F3DsL6MiH;n%05`8JR(fXP1?wxe1p^4&a&akG9|ZjrY5qAA|txW zDr~zeEqn0QlT3uvNxYt3c8f7;@{cj?bL&fvj9f)zK3xw#yfMs&zd=M{CChV+oZ}C_ z&JbNCK9hk!b;uh+&3Vw$VkJpLsHN zHjEcmxtz1zepnL5H;qbsatl2b`4@Ezd^%g74cj?UjVDCy_-QMQ+q{Zt5RSF61v%DH z%RC$Xw$B0)mrYbG8(eByY(>!V+|5_Ulxmx=aaKK8d|5%dAQ2rv#EUAwPzJ}o5rgt? zUSKVS2EJkl;fnWz6oy%&B9AEncAPkS)^{H|bDYB`ikBJI(i7KV0W6r8mW4y)39<=w z!H@_6a;+#E{1f2?#5jupCGea@Ovp=;KFp1bN5exs|VChjjwq}<6PpA z`_JD@l-Y?znf@ zJjT>6RUY?5s>R5cN?_EayT}{SM}WU z+eF`n&%ATKIx_IEyOLfyGvMWo9m@T^&%}m^bFzTE12r`~`{O6J3Bu~C*;J$&uHkRs z;=5`-L=;_ET%S2)A;i@<432L%rs3E4D?>6*OL3wMfI9vAoEQ5JdGtCrmg@~k&4eeq zuPG)2WgsyE9`~`idJwJx$=-VE>8HGXrxP8e>hWJLkUjBXeY_HCq;c7#u-DVk6ly8@ z!;DIarIQlc8e81?EYixTQK#ombg+E6WS`yz_cNEaKcu(4$Q}l=A)rm$5NPES^THS* z%JMRTH9=!EG_8_Vq?QVS-4D{& zcki0Qu994M$b)$Y-4u94aeiPWsaJUPmjgs@b4Iny+$S`C@MrV#A^it}qLy(|@p0Gc zb1J0N*BZ`f`L@58BJH~H66^_MZVlD{pg9$D-p!jU- zH=i|GT=*XO5x6oEVpI68zUFvMiob4uH}WN?;+kBgzrrUot7mn82an$E1)%uPdl*|^ z>0}91VMnO&BUk}7(%W(u3ngVb?Tk%DYN|kAP&hy&@h}E;K8sduW|OLpKK52>?Awvc zo?JDitSiP*-TTFF-@cI|N5T^JXnnp-Au#h%Dpc{Nvwg*rf+uuYe1Mhs0;y714jY~$@JkFLyZ@wPSx-SAQEHmUTU#deMEDu|>y z$}kHPY;Nzc55?Wv;fOd&pV@CsYp7-P82}&HX6BOUb9u5BS12NS3i4t(@VQi1VEI<% zjYNv=z!u@YV07<^gJqzP8=3i~*+_!I)pgSRrZZa4pa{C{U+jj~&W;{1NG zUNq)^L7Q1p;@v}}ip}fKt!LmZU0dl=OgRenJNoB5)W^1&U8$*Qzy{l;BzgNto9!o< zq95dFfi#+RcGbGWEjl!A;AjF~{^qSvKbu>S+tZ)&wLK4OBYr)3yY{cLK-T41=d*^$ zD_6EN?hL$n_Q$$AGMf2LvMOB;*#;Yj*9&vDk6QLn{w&WOk*OD-Vpy4@ee z;rt^RD|7DKz!vE&E$uJmD2TK5nv1I7jj1jRp2Z>I8YSq7@aI&z%eGkMOZm`qQt-4v z(!9X-ksul@G^vvId)pQ!C{ooATYi$aJUa+N{$}(|gD)`5xv=#vYG3~ME%;}1iJxec zQ{(cJ8BD!|`Vd1$w@!%TE#1e$1-Z_qqEOd{ICK)2%dA|HDh|K(#8^b4=0Q*8>zYT* z`b-)a^s&_!&-eMq=Dr@KQR1mYeI0Qcb(y1I{Vw@6944O^K0SX=+pSqKysKL2$9;CH9?{yWF>G)_6-3rBtwNJe)6QyH6;LUq~ zJ#ybH|C+@_c0w)f(4hC9_vLL5|DAQt%8+l?G*IYJ514t$=)&@8TQfIzgPyyC(6 zbWb9cZO(J@T|2FLXtxBQuEuMyf?b$(O!pQiR-Rr@%V0|xf;fLfEO>@%jIc0?J*K^@ z6Vk~jm`dcrmWT01Uwt`t`HxelZks{*L(yD>GGA<3&8FSCa|OtU7?QVU^3S?5{iIq9 zDWksj;Xa-Hj{TEZUXq-8VtRHTyVZV_Wvwe5o`YwG;8Mape9^q-`v@IR<3}^uIES1T zw&V)bFvRB}#D+P^lGcwc2}9vP@2D6t_UfFHIS*VZh34URS&=eeA5ML0elZ%3WFgnm zUgWmQG<$h5YF;~b-FJpj?%u~&XE!i~Uq4fQ%Huh{&*Nkzqa#Qo_?ZplWNz+CO=VNm zt0=R}li+q%&VF;cTnB8&K0Xu?owrRb%brKW`f{lo4R znkr%ubuEm8bjR8Ys>hIIP~Zv!-B9!)wPXF15{*#j9V$>e<}fEivLz=)kSe)O#GfG@ zUrYNq+mFmON(ky4;sR=R{&iRTK5$zK*5orpv67#R9E(pR24^rGgh(>;)Sync6oI|1Z50EAP2)4#?$4Mfca zlj?A(KC7XGe>cK&5*M3GnG1%jH)-T!b=+*29pZl_ zz_8BfUNt)z5dt=ad%iBOup)d*O1+1PBG}N$?bqdOwm}47GxOMZ&S*)k0VoV} zLofa}Z#b|5C1oV2BB0AP>TB&-NxAodZ}+Wlt;-%d{-4)Z$vhjq3rL%LCrh`Z$vzCZqi6mok=_Ql{a zZ#EkFOmdu_Zag&4Z;?cX=`B<8zBG+!pdrB{G>4~_b>mLVzjIZ>wB3|;?<6IDS?d@w zPUVC|IAHPf@MaHszVJuhrA4Lf67UCbDAsIK>K{~8ou_*A5~i;7goe@&_yBfd0)ps(4?^b( z*;Dh-O&#ufh{*;Jhp7qaLa2)))@#LUw%H;=ubmk%liZ?>t} ze7m0Xe%XW^W@@$;qnrKgBj#(Cb;H_xFVc)U6Z0b!@XedvMA zV9@95^kC3m5)p0#H2LT0!H?}e+Cjx1)C!2}z_Am8W!NEpN~KZ16Kiha7oTM8Q!#M2 zA=thuI?1<;*Xu?;`%`CvVAtmq$26*BI}Y7Joi?+#Wd;EGt?T=j;0t%xx!`{n_8TL& z<9A+<8cumbA#>iS)n+Q7L*BT+v&JB!!e-)o3e5-~&Gsx5K#`_Wk*L6Zx&it4Ke z8|TSx-(xA$!UJ0;cJhY#80tU*`Qdpalxf-v4NNhwn6Z?Fd+OvMcOPI^)nSO_Tw}RTQ*%vyT< zws9Wqj)BHrq(wjwggv|T(D9j79?lkY8|U^zGax-61zur(r%c@4_9FiYHv!8RIKk-_ ziB#P;0u8@^pH;2-+vGt7E`uMtP{fcxlFr;D83V?db8%}`&p7nu=3min2L-vbatbzj zt(M_-fx#5I!U)5()okwCjt8Q2W)S~I*s+=Cl#WTu!An^5O*u+Wq05m^lm~ILF-)!> zLQnCVC#%mqh)w^_W~crx4cqk`1wh$em1=iwcN4pIuLn2wk@k|iKlDHD9W1JC$h)m9 zd)yiCG8;{g(VZWnS>P76K0+P~on<$~EV0p~*w^rg@+(a01s zuxQ#`Gz8Kk?`mFseySJ1M{Ev6iwiEQ=V*Lux0%q?AZ!{{ z#Z;;OYK^Auh@ww?{&PPB{z(XCyYLiqbZUS7XIVd=ULFhgbkpCKnjZukJJ#^Nv9vZv z+lo+>n$XC4h!ftWM-pniVPBu=W6JO6{kZ5YT=MFr;P*Xi z*>1O|6`JQX96xf6ecy}cr_O6loyNRsDR)5D6E#--0|P`uFJJ~Tuc?R53vgawN#jRP z2WvbsVanBCs*3jfsmKj{hf8xJW;hX;aEMD;vKwe6DNw(u(b9#WvPA7I#%O7dLil+{`(9 zFvuH+LzxJWcPwA=p!68-y^U7YSo)W+5z}SSX+&lq`7t){oQV)&ZdrC*tW)-{oXEmq zeKqy0y#=E;HHZuv(JlNM1*leYkJ4$dT@#F0s(m#K4LCmZ2A-d2k53s30YYE|PYaMY z(e_pVA>sfhwZi27gwi*>h0Q|@M$f`02X?fn#}s<-;p$?O@??kb=V1u?AC&eT!q2;( z>BXE&dB;JRL!}8eua;bg9}7#Ik4&%22{&Z@70Flncz1Y1QHZt?FF2SXu+Kg)z2zhX z3@WwgUlS%p;){Fx)P<=ZR{Hvzwo+jslGhcR4v2VvvexorYOGA}JQ@!V8z7RylGX)! zm=QjIII)mZ8yNQB;E3@!j6D7uIf59Cp>zc`5t(6_(+i-NXani`-M@0AlKjhzhLN@R zqP)H;bj01yBs#Dmtj{gciL+o7i(+!H?2COZc%x3xxOtQrYjck05bfR~4jF8Swx+BOrdkh)GyY&PhS|DuIA!K<-!kid_`t}ux zJb)WTo6mWL}F2o*sA0P8;V7KM(PYCA{Dful%~)Klj9ljrN-7Xw9bi z$ILow3KRMO8bVy%WLu_dYh;9RA@ydReY~RXqz2-F-Cw{I?KY^J*~Ss>Q9> z1bDc3t;9ivO==B?KN+bNGz{uDx8K70h*N>2R!{3g0u5Wk0>g|2_MAZ82?kUnb1=C= z;DjVbpAa4VqO^;gv4U@{Ac}R&(nX_=? z;pZ{W=#LiO6~!}2U+e9*aF3)bXw|ols}Qm^>~~@KvG<*~)^CGk!RQ151qG~*?eq>oAa8GvlGZ@u<&8Wn+d>Eo zyqvK#Nj``fxE<$j|L~*k)K)`b!;VZ=+J5rma(8vamk1#?$svWUYoTh=S7M8^KU+R| zEiBBRwYihMrg?8WP17gu&5yrjuj`ydxtCafA|X4@)n86(vDko6sPaui3(>_%I1AO_ z@AZJO7lmS|cl^EtK`_{U$L^=V000q_a7bYEByBaMyTBU4v{O$3R<7KJvgHVaZU5k7 z0tDT(vlUL(AViDp_X_a}W1?hAF>Ba`qJu7XrHsru8&B=Wr9AFt%xsJ8?^(Z@Wq9*N z=X;|dPN;55=hIiI8TunZSFIKSta7mf7n@_0Xtca5a1G| z5DgE4Aez_u?@|jMUq}dRMes3$?S6>hF%>qVMFz}#I=-3%`c+TDaco`=?c|@7PsLy2 zFfA&*@{y`%Aw)yw%-L#x7Xm@!I+p}nVBhO!Nv!xUlx3dN(+~V|ir5uwJ7lPAnaBP! z>aSjNj;MpRCpNWnS$<=)e_rN3Mtwh+35cPv`RCJ$BsONs2$zD+c$^_T^x*>)aFs2# z7OQUR2YZdIXr6V|$8Y-pNF`Np4&I$}aQsQcEfJ%^_FLka0Tf{}k3fbEkTi)s{80w@ z&PhqtOTtBoJA}q;bOc9rpgZqL$DZ{nbe^qT>L_i?yq}hLQGEt1b@WV|m>prN%^OJq9IFqP7?6*k)-1|e0 zZ^xk=*e;f11xb_Wn-+z{MBupo*t8V;c>vnG%?l|}J*)Ihp(H(h-s@28v2PDLlx(=| zw;7n8pXYxFQm2tGz97ZUp20xK^9Gk0QeQHusQ~>E93L>+qxV_Rr!);kLb1-zm%Uo@ z#WAeuXRf70uV)wHqRd+NpMO%!+Ea=OhBe1!#*qL-wtkaY>BsHwycxusN*2X+F1EpP z;x3=oWu(t(1(Q`hgjBUS*~u7v`E?^DDuu{P(ux{ z#R2@vTBPjeR7sgDS^F#ieG#nL%54wTrUs#<5GbI8HIWgNRJZK?x@obgeo}SSrKqtB?@Sn^=rTP+^cNIqz8eg0 zRD?^8Y8-;5cTN&>)MOeq{)_yj;@cb(YujlV5~xF#i3|?9YdB7~4b?b1-QEgu-s)BwN?-%v_LnSD-mzaPCQKs%I0(VE4-Yn;eS&nZcn$Xf!i&RV zk_puVgxt;|E!80CXA?)W224dl-zp5A5n!PGpkc@TaF!Eu7XA6k+W=3wXvDG_VF##Sn9>UnO!1+>l^mi)f>%71>5i|)>bq1RPtc}Z8g z{VN)zr(qZM9K>i7PbpUSfItz%R&1b$5s^1Q+J4VewXM~gh)_{==#$Ew2)ne{%WQ1T zG-bI8K+dyi0Y0}So&Ef~L^Q}dj(nWF5n$T7{YbZF!J+XFAGbM##l`L4>3vb>{$58- zXpYLmQ|n)E-wd02T4XhUbPTr>UNS3Fh<`?M)j2|gMn_zk)>-$jl+nO4F8@8i=wF}b^W z$^cj28%l;^5sb-#3VNMBnuAbTKVUL-Tg9^h%xewaL515tVD&x=3vH@M`g85;dlGUV zdoaCIPx4X`wtBkSa%D*^xj1#I{*r zmzK_$7D;$~2OwARJWxTU6B=>Z?L8>^E)0!ZN58y%t^;8jJKA=KCdtaV%s7Wwpve$R zwC^1|Ub+QbUr;!35Z#=Q9g&T=Id=oYGN5ihS5^LqteWM9LraH>m$Y!;BEV9VE`Oz<#`=mFC*66CI52AsS2$TGX`^omTgX-8%-jf;6 zHsN@iCnAOx)_UX3F@G(!rd-$Qwvmi{E$6o?DP1$>X-XtG5&4%(q(ru4&J43+9e{8& zy(G6VL!WCR1o6WDT4F`Dy%wGkfcynn(jpc^+!2Xscs)Rk@cO(nbm_LbNn(5**twRbH93@I_a}@^u}(x zr*GUTng(tJ6c`LH$p6~OecEPkNJ!-3#GGcSx&~_{L`k7WQ$cxyfsd1i{j6!->9aQ7^cpx9SlP$l^18D(=`WzmQ$6E!uKBHxXSh%>L0i$J@Zwj4e~%r5 zC^I_>ZZPR<@_|;;9um1}7B?KR!%!)_TwO8eSa3wTlBvkVGqE7&I6R|q6+0L1Kt@wl z%;7|xn49hv;|F9@7B=rtzbFLf7KdYjTI*XFiQxn9p3Rft7)wo{=kRi9%z&&q8@6xH z)xTY5ff5Lw2L*MlJvabKnH`C5<{8291n?$h5w?1^vZMC|$C504|4LOTKGuHcl|z^H ztF`EvV(_OTxu#})YSxTeuaC>JhLtT1%K=vhM~tlo*uBIpW9di((D?4VzX{UU|1R|1 zGV(DV{+3rOWd3Pder?fjhpg8Wd=P!KMAYw+WViU-bYozM{oS4knp2yZ^zv$Vs9&1A z%Yr*DAZ4J20SA~cQj-+)L5u#p>JAXciBJQgp`(kZEj4i3Sx>C=s}`Em^3anSWwdcH zE^8|O(ez2t)%S;nQ{?W`hi+|cLGqUyiv^Bu);iU!%Chlm1sN7Xx{U6#Te}Ma5|+8j zZrW8DHGN-jmsTSI1nH%t_fhWicnZ)f=)d zXz@RdFTnwMi8UFJ3wT8;aXEmiP@Ffjh7gGaQJOq2GcbRBi;*lfe2WMJO8E6MupJ0N zqK{7j`e09~)lpC5qZ@J#4mES@H;*fvVJnkYwPv*S(^G}48Jl?j8Z_%L(EIdg z70mR{FRyuBFVo{F;*mU0W+8h_o)hQ4dZ9w6bDVOaPhCI6a(OI4I`dS?6FML_YcZE5 zWhFa+J_;=cWW9XJ*21CPiLByD>(o6_pLL<* z#TU7Mr>T)5J#2rpe%PEXy1AuSR9L;W-u9eR@zaXsR9l9t$Ymls6ocx#g zHjk|8XWIv<-mfr&JqI9Yo#T)Q!0Pxos-ARNPl3;4=YbOH2Nf%Jb|_P9mfYkN&v{$` zCGN389M@m;kp5D$5^7P5JSi+%DQ-R&G>AmpegwmTwjNo)S6qx}9Wc>bc3BTS-0S@L ztxBWoCUW##cGUsjAb;}ysq7y+WC~aRX^{ox@1Zz0diFO$FA5DtY3<7%{u8N-)ja&d zp}ZVh)T&dfT?&0nPC2lR%HQ3*lb1-gjjxBkE!MI)ATqN#Hm;D{{w^~pBqgKTvEfEE zQ+CU{%nE0TnrLKhnE?IgVLpo zqGN%Gf~>a*3+5WH&QkrWa+PRG^?T@w4qa|zYtK4KR zFf1*t&!G*UssR%VK5nmvJ1rKK&&brio^ri7773FofN5YL(b_KgL=xEh{PvwfZHWtr zoODXTr5fGQQUQ|EyuUCo1L-}o0tVYvBBYw5k^dv=Eu*6B-uLf4Lr6$>cPj`=NRE;M zN{2KC0wN_{GtylmEnSi#NJvWGN=m8J&>-DI%{3f$yx<*cZLXQ?+~+>`aeR(m zBNXq4ni?@mL_bmp>_eOuI!Z)|7z`DPEPcvXH^tJj6S=p4g`;VKjzdxIjs&YO_8~da z)R5n3DwB*;r`&A%1g~6p#;q{@nQ+7laY|}qVnV=P`Q)f&UGE#C!(Nw>%~uFmRX`qA zxv}$3kmVeb8bKh3c5@WR(AQYZ51=zC*VYOx1vn)u?(c>lM&n|StmnK?h$F?jg@#GDS5`vweeC<9zrKdGiDdK}|F*;^Li3GgsGKAbQ3U?_&;zDS!o z_O?@%UUAk;=`?sft6|~zohYb)fq=WcC4Q66JS?`+Z$CP`rz-uezVYP5mtN>NYkQ&a zD(iqbkFE0(XNcmsqiwIJr-p;BWxe&1-q^>ugR$ZmaO>H*jrUuK@O$wHvI~QN2QaGd z&No`I8>G1~`^$YcjbSy=cdZv|*}6Dx3`ehLh>BF)o4|qR0AJeQd~EI2$Fb9|p9tGu z($HLS1Y?%D;$0)ieozu=<9a;e4*X45MIAr!(*8{mrho;-crDRARVBetoh`chsJ=ej z$RGdU_i@?ko&|b^!SopSp7i#l_zf=?Xj`Sa|Z=kLNwmD=1`X9qyw5%>00kwY& ze-5F$!_J*Tqyx;N-Uk(M1yjs*2fEl5cNoGq=xZ4~XQ2v?_Lhfm&kkI0Lwc}#y^lG8 z>s~84CKt>o$-_S9%w}|X??$ssT@duQY1n0+J$)w{+dAoEk)eG@((su=v#=)Pkrzof!{6}cqK3P$g*0$+daDa*Wwp!~DbOkXA5hjCfX zz5f@|BcpVDf|ZMOlX7tCr+ZRj#gnD)Ke{uqnWAF-yN-9rU;x)ntR_kHfUH;BG>nov z=qSP*2=$!7B4RC>1_gr7Ynl+$i+Ly(l`fQ zg6*Nl>ZGy;f&13Sc``~xe}9R8p%8+-Scsu4f4z`6ebuitOjF)Dkd|3~g?$y65b2?H z(eUl`N6Ab=K6o(~le63PS_C`S5ujJVCld7De6!p7??S`X5Bj>GXZrgNUB!JleivcMYkg)ul6~xWUZ@|-Y&8qs&Vy&Y^&3;N^`8i(8$MosfU59=LP*VO^1D1*&jv5U?z1cOwKv}4 zOpazRFKc{y9p)}4_bi>u$0D%B)Vg2_Uzh5fC%T4&9rXiOAY|rf$Y-hN{9M*o9b+=t z^yTc&=U>He$>F+*&*Uv>m;SW;R#EyQZGNw&Fzj7F%MZVD=t?tWoD6EX88^Q(Xa46S z*Xu`egZbt=DTO66%{EoDabXg)FeT}{CgGr@&~M52Q0w!OG$mXp^pOU1H(yiv`!Pf?Fi|R9;9&RKHp8)AVh9Yd8gSAm&O(5SN^xAxp|fIjmIlT1?>s1)9~MS z4w6Z~;+OnszF^Vv@jo{#v~?)GGiI_hFYX>W4M!<0vk*1U9U=fhsbwv zE>Rx0rWqcwS4`R6eyn6AO2uQVKO*1!CjI@`Yx{?2hR;^JV!PIaxri_U0XTP3vOW}{&xIG|{TlY)q+{h( zSZ=`n7YCIgGR8GBj2AFMO?f|0wE!tg1;r6P&5@F_RK~BpKgWF-m$2J*#k);x3FDj* z43DV$cC;mQ(J;2l92lj8c?|cN?(hK)?e_`xcfZa7-78&{LjpuQHb2^+%2JWcK5R{Z z*p}pPxHaNje^PELsAX_OD}>fw@rR){(bo6Iu@Um;4HLYsy;(zZruBxfPwkOA0*5uZCqLOd-wx3_=u5>t;ek0V-py>; zLtHtZPit0QJft(-u^Krzx@lI-+>vw~Ch?fWVljr@X+d375g4^9;=M_$uD!~q{L*2a zbW>{Li6v4p^J<~cL_qpVQjXVYvFVRNgUTNcl*$1usfALI`KNmY#mBd*$lmvP)F~*` z_zS=2E4n_Chk2~_98_!(Mk&BFNEp~|%3O5L##tG2^~bN*`A#V(rGID&~PdYgP-`6GKCD(qDD^ zDcMk>BK=PWl#5r&3D1DWp3#omOQG9y5rxhlQ?aL*pTwemuTv#%tJVhN&sx`&?fiHM zLqpvW+8rx#yn-z@9@%Yq0&WQ&Z|iVG);^yVld3IUwVcuDLyiZYdpxh(@CzZ~E(kuJ zHp}+8dLS0mW;A$tITLXZq~*f33Ft!|FF+P|9oW&63GHi@@BYY|#8 ze)-4Ti%PXrQ=v(-4k~B69>d8mVh?4qxa;L@U|2spLAv5iKFzY{fn<2B%7R4c=T~qq zH>_`)d}+7t@~SwBxnLU_IMe_1tCD-+GOx+od8@fvxbym1T7ft$RS%YnR3pll4=v%7 z9bnjJfP;mOgREbj5A-P(6Kv~mf41Np%iMPv8lWVUAtUj} z>bI+L&R4CYRbvs=b*ry#FY$NYZtpoie!3+n^;A6mPx4SraU`P&)f~V5q?x##^fQ>^ z>u{fHukhC@c)n7~!Wq1!kQT@@c=!OK#-@3+P{gZPyrhw4ET)#bPn~4Ix1_9lESy>VZ~S{| zlYKj0{U}=xPd|2Bj>5U4R1v|e`=#|ODZk`P$C_4tJe`xV_&#>J9r@hKzVu=0;i5&b zZB@F4meWR-tJY)M<3d^s#Vot+Sd0Fz{y={OrNr&%@R7aNj$6K4Jgd9u(sL|$2Hzq{ zh(u%!hldJk3_bUA&(rV2g4$1I#PvtJt^M@^( zmM@f3G$slpc#Sjp_n&7x72UtLJby3Zil?3wK83ahD3kX4cvZQ+!~tgxAVMR5v;e1$ z=&(v?B{HkzhSwyNmi=o}jNIN0&W7+J11~b~y$WZ?kXRG%#wL(h`(_fG&f2n2p0#_R zlqf+EDf-TTc%6(u_&R!tz)W~w03*)?i}bi}t40KiQ{=J9-Nsxhha1$br~RerAg2@H_fBuoq!T&dwV1~|5zA@Hq zoT7ZqpBq0He-#wqza_}S!&{X4J}D`#w6Nl9M_WTv-B)>oug9-u6uxgGeGO+7ct6mM zWCU4#45!j*Zazo7NZ~!j`5xv#(e)j;X{&8m?6ORy)Jmy)ub}u3n_}%Ta_%n48e7;V8aK9ouQ}N_qSm2re_x(?RikA5T zr(QL7#D-Pu7|EG!@Bdf)CsxO(B(6=f_`CMWXVDV9NntvDo&Pwwm$wmr5t2Fy)`8=D zk{)q*W0AsSfn%MFcg$xdGe2^is4+e=&`vz@eqndde@@z6 zw~JCP_azkEC9>QX*;48=z5M!ndHuAG-;8Uype7-2;39=^yA>I#1p?1ep#b11tPzq4AbHsl9AcdX#d@#o$t)N)594|3`B2ayJOWB>g?Z)CL`US#PDb=QUwHI!hb}^OSK!KTE6NT!2&I1Rf;b4 z0cu{!i4WxB5w!QQgvD>@n1j3p!AN!=w-5dyqdR3SB~-^_oP7E=hSwANQgg|22N_k? zZ>8526zBak?~&gUsO(>Sy>$K3@QBWLvuVzJPNG7?c|m1@?$tBOD9;oOJ=>2E@fXcp z$yFk%+}Lk@8_d=b4^+leA3d(PYI_^s|C@TZkdso0{b-2$OMLR>cY&T#iLaOM!iToILspUVs}dx( z_wEs=gehx_kZcJO2$P(CE4gTodMb*q&K*$Uh+pH)GOo-m$&_N_b;$r_V)%!Ioooqo z3NhJjZ0AzL{d)Sn9%XsweG|$&-q7U=l`EYLHH*o#Zj_ZZmx>Y5>HX24U~Ly{u|h!w z+mFdr%2UHZ@w1%KSIZ`-ic0zo8nB;;U+EMZH2HV|0DZ^u=M>#@X@6!hi=&rwFzw%y z)Y}Q&PFYHQ{~}-8nKdr)`!E%qa__ihl$sGYb&m%kpH8PUr~s7(-qRKr@(v14-FIh~ zpV3Mq=(&HfbjwO3I7e+fhvTkYT$)pcV4%exw8tZ1oOvdn$^Br{%5ZwH*~A+?%7GF_&oZpMKL0kR&GF&U2}hvPXIf5yFgin`7{11reoOjocQ|mgp-(s`8vZw4!bbDaCvZc+Q9VUPoJ&#+^?pD zvyRgf@-NRm&z~)+T^NQAPPY6@Uqd!`sCNXBMYKbQ@oi6&#uv4h>(QdR1Z%o6w>C;? zW++aYs|@a5BNe}#)~x)*b}42`8(5f_ z*Y0Mq`kij_#31Od|4gye6u8fo9;6Rzr-Z)>TAT2RqR#XqbkdIIg)v%<;hR61`AJ7a zWcxp+E8CUpS}x9qgz?f#uIl?aZlF^)A1jOGcNElra4+F+kdw=vK+9#OMTSx!Hb!t) z)ebe75cG&z;?Qp7%^87}QGstzZGxx8hB@opaY1E%A9YrmWL90_+mCN@X2pA`pUo+# zYsGn2`3t^}NQ})_I#uy>c%7JJ?ER92#{_QVHK$tiCl51LxOd)J47X~TdKUlYH5nCQ zK9|uDm3mUmiLg2EgjFD!qED8(n>)`X?glt+S#7?UBeF36NPNJ6vyNWL40=V|@(8}P z)=z^7C$idZz`OQ>c{t9Oj|3Vz&|i(#n?IU8_zM$fbczq!E}>SgxfGJN?K7RcPt><| zsTPqZm~ZH*IvvB(H@R1u>`B9`yqj+Sro0tDLZhjNl9LmL%`90dR=1{jN_m`#KqrEtL>>Y`}dBI zLsQOuJ&7;$H5$%@A?_c-{P8U6-LyWFs6e)gsSRWEdi70vb3#^^PniNPlc$?hEG0MT zEEGb5#w{060;u;h%jY;9Xeiff5_~@yjH|=O;G8SS+|X8T8nl)#8Tf_I^A$$rD+N2e z@4+ia5fD<4edG5>!iVX^B8Q~EcN}GspE||1s?S^^WT`(H(=8K;M?c<9E+=U`Jqs@m0J4xJ%6?Q!pep=JFnocC>Thu3uzF3;|t8aSP-4lt>6+%I<3CsbT zC+gjvslLj2w&EoX*ti&2TwR+3^f{CWdtX}6?n28r02w~^Qt>#)O~W5@UOdF>yqoBu z$5>zw7Rc0uc%HuN*8cS=Yd4b?sZA&#>s16j5}=tyJSg1`sukDSai9f zDQ#fv72z9qnH|_tjwe)x=O^xcveMbzr;vNESw(&nokiEB48<@qkeJ#&fJ1uB>J!UMVNKe=xwv@F zr))n9Ki7?I&idukH7hs<+;)rBZu0$&OPWgKhwm@-&1ixzIK+=9qv=@V@Q;lk1W2Y@q(r^hk?Q}?8`kt*{zzc13553w2oVMi#`}y zunpAKy8_?^E%YIL*T9#=5`saT};Gx7$YZR)=yBlnn5?rxxlO#4{Zc6qc zzz+^?l7D-TJ}=vPt1sHK1nO!OVzaL5|J<~CRvmk)QQMqqEK6$pAw4Qv6y3(}Ofx=D zCb`GS{pI(2(Cp^b6UMpmAb}?(?RFHP=P_c@kIdeZR+3U1`_x zi<*Imv0Iyfx%isQO75dVqcFrLx4~jz+#uD@MaeO0y-Gbb)f$`I^Z*+JneYnWdL%9< z*_(UGhQ|%)K8I@r!Fnhqo2CWCq`Y zl85|I@i3Ie*Dc_BDa22?xPUhYFlty*;A4({{J_(_j(>ovv+MzHm%2gLknBSDncRdX1e-H?+xNU{L*(C))_H<_B_aH~j7Ao%6+K<3IY)uivZcKCnS`ZZS1D z2rHO#wp-+{%3aYw_M=bSiZ~iTW%#Sgn!~S!PWS{5eeO(zM0(5& zqnK?^53nO1i#ZU`#a~sz} z(#`l)lfNFvYCbcvcSP(C+3d!`pEk%vns6zNe70UlChaU;?;JM=6Z%GF8zXA?sDi_m zEvuR*)G576d18%l&aX)knx0-ImY@%>ux5+`rHFS$pml)iS#Q3?c*Kg{Y{z1meZba;oABEs_G+%jdDg_iobUp1y966Q8=>lA+?~U|+4*&;0zU z^`UpFjB$lmtoE!5?hBRXG_cVUUjcMBvsd!x;nM!*}NqoN}vYFHk1$0x~a_72iUe@lc;0{J>=;{Ggdq4B@5RmfE-c=Q7gtW-Y4 z$I4$pRIzwm@}W2QA)rW;j$GxrH9F!gs&T<`M@=%LQx6m{;ZfrI;b5+M=$AI9XA8G) zW!7*bHUb_>w@=P5|8XNQT&VS@kutgS^@3vLX$$lTP#R8Esu&tuOm}L^KQieKjv;|z zvz$)^Jk(wN%LP=nOh0=E&=(Uou*k=a+;uw2_&H}~i+QH(U0z=PFPD!Opd`91pDj;X zaJ{+Vb4iansH(A4_QyP6X!4QPcHu?zsIPXPMR7uDGHou3FM{xLNK8ol=)v$?9Dbs8 zeM-peLnI9SAwEM)A5;Ud02qLwMem@592`+}LaIkq*YWH_LHoU2^@C4(r$Hv3Z%#H1 zjXoL~hlI4hsQkH)pmx4p|6(kIAjkj7ZpAUv_LIX8L}uOkO3(gs3pd2*hR)6ZR?l|x z=S=bW$dCsuc^%0M3=48&F4tIT=tTv}a_1f-BRcidNBEsDiRA*(_Swbn1y;Vg75BDDc*#9XXc%k?@=;wby zBLCC)O;FIir~h3uQ#$^ws;Q;rOH<45_IfB^uB)fbO2lhTWRm8)JyIWCuQkT=P++7$ zV^?jUsjW6atYf*inb731q|t{61%GZJ?4QP=zP9DONuGUqGrME2fe`(r^=xb2u0p>d z57R7TokM~0#pM=k#rV!=ox#z=GY0#Ru+w&Nt>yE&6KwxHc0>$~@*SBiQDE||yv!l( zyndN@U&*2~_Y#E4Bv zS3$C&wF;3PV`KofvAC5X8eHsY}e zU;|np&&mQ`aknuOj32D3z0^tQVc4m)kbY^P!yiqipa1c8)6-N$eYitGZcA(Apbwr& zCxN1f*FoW=RlQAoO~oIQ`<3ooZ48s_bj;=zkBV$a-S4|(3TD?)+-#3bE+!I3sYlHks$^)S}PnghKOVY zPUl}K1)0J8M&>C{&3g*Kru`b7Gtz`2Mg$?xE(6p!z+sN(!bkvHdgWQ?>YxQb16q+| zXP51oy80uMWR&eyL*9h9Qa2Z636DEbZ_T#D9nt1=KGju!X$r}t&}TkT&`2%o%he)KYHji-vb>78y@GzBsshd_4Ea2H5`$CgxU4X^4g8g4eI%`7jx`R_-yQxBceTv`d16${4l+CB8v8Dn~NDI9l z?6Cl03eX8(>wwhd2i7=%3TuC}f!B5gLm{Tq`L33icAsFvdUoy8+|!19tmyRrwLkq! zTpK-OfWV|{jg~{x;~Vv{G59$@ikIl_r#&RmVfa2W(EeETbA!-M6D#JU9akh&lzY^O7z#qZDipF@^H)K>Qn%{3j7n? z+Yu(N?!o}PmaV-R`4IiCeQ$}Dt}u52I_T>=yjf>4`YX&Ki4z5?eQ$T&0+{jGci5|; zWx#JL;QH+dw;9~HMst4 zI(iH%)_#?DLQPG(IsG|GrF=G$G>D|{g3fMBy>I6G7W#69dRB@{^sex`*hMEZzh$K$ zs|m7&Fo^q@ltqVfD0eLxuw9W?gzzDCaV5*|rCna~&6&{>Ju*>3q<%Z5Bfkq$yj^jS zAUJ6D`|^2Lm0}w}FWy!U1?au7;m0TnKr{kJsP%O&v_sBWZ+w6{zdWZ)$si~Ldv~Mi z-%XK%f*~^0>x0)vF_C+Z*p^1KO5ElZpOUxn*$1dNq~jqzH}bqa(wlV?zPHHaidAMG-);DOjc<9djLwO`!%yd5$GHv&)y z-{Yu^%sSDk0SI&zUYJ0N8!ke9qU`FDCdE>sJ+IN)1I%zgqYV8_a1bi>+o*@RhK?#U zGOPHZ{wPf+p4E?H47E$d)0h2mk5Dal2R}7xpEI^iG*yz(%%{7M7B2Y^HA2`6fu_Y` zpb`GmH|PnJXGFQ38nYJ?%CpO$#E2*Fe2pV;MTXSniozX6tZ@IX(l5}vd|qdvTAe1ioLUGV>i9OOpdeL9M60ba2}dEt7q z1noR=k2a7a&u*V_1svuHenJ$Wn9Vhfg7)B3rXJ$L23FsC-OV2>Y*h!FPsvosx&-_B z&-h#Xv@E_e%b3Ut5$SR<9v{@c{5L*LX7j^P#z2OKJr$P%D1+~{IwD*p4G_o%v-<=u z3(rFpHejH2wu1+T-eiqz)XDw6P5?G@bCp0@JpG}pN!}#|7`*{{%m?HQj!z^R0A-K& zA)Ezn^UK;yM)Coywa~6`TZ?Fk1NBAjZ{j_S@d=EvB#hw33H?Q5j-UpA5W7 zhM4KEm`2~b?lH~(jXTu9aJ8wJi=+n2)&x^E(OSw67u2IQrPO?u&&&4K`*K!JCxCi{ zvTFE1ywZV=#y{!|7Nu_G?w@b9*Kd)m#1-GUAJ7h&q#|1tR8y8`$#Cvx#@s ztwaHbbB#3Em&px=LKEN~mMXqE*U-0pZ@+e8O(5nROA9F-=Cr`VS-EJ@< zJp9=ALIj2%G{=xWK;WlRF!qnGFL#6QI9ogI#5qQulDIKjU>Pp|ZqA?K zQd%)e$=o|Y&|SgwcJPb=)E}imWfG4abqz~dI({m=BE)8-$<}B;iZ>v}LsNtbeMCZr zVu9?HIApqcijqN28{+Y&ps(^w>&IN`8wn{>=(6q;RUaK*(C10f4bw&iJrQ8e zAkw{kbz7CBd8x?}(p+MajRNJC90F?@`^0dE?{0$?jI>QQM^hgII3C%`h1ozRLu;?^ z0RU>E0eYQfAn!N3%K|ebA5wZmVF5>=!aH7>1vnC%&Jd0?cs;x8bN1~lh{A6{DJ1#y zp7TU1Pd&@^BgSiH^mwO1S^{HYYS)k z{U4!wVMz?AHwzMs)~&31jrb9jvs*-Z4cFm`;-X{zf3e zq*f$lJ2)?7*zO;XO^SSIbUK|CeK41r(OSIp%kMUsG^l3jK)Fr)P^ETdo;oA$wEd5@ zJabivuT#Uv*F`D+4;^YKKSX@=I_ma(8iEU;y>W*#Gj{lhZ}y*uU7p;*UBNqjvB#U9 zz;zfS>*lxCyqL4;jgP3?4N!oi8Zx|V^8=-A;b8sf?gh?w1n!DHeuG5MhG?UIClGY{ z2K;(He;L@{fB&rj6n=D`VA=@9In;gWuxYo}_%!Mr!|AeW9X#aJ6_Vb+?fBqS>$5%s zMPn{9_M4CRGx&{{9Mf=YMb0u`7j3@D_zWJgyH}ayYrm3z5~AN-dEWBrU%~pu$#0@} zdrAHV;YJ`yCS7OBQ^#nPKk}DEg2IJy3$kcIN>48sy>%BvU@K#jJAztUd0tq%5?=1r z4N65MUl2&FC3|*dE4MfYQ2jGIF2Lr<7son3Mw3F&nc>h1{n@S&!lNApKXz5To|2|L zm2~2)&O52XOvCyva|p% z%+H#e>V&-?pd0FGLpHk_e9=$t`=o+O|A?b4C=M^Kzd`ZnR;cd$XLRL|%!8BD|J+4y z(TNeL$VD*OsCG@Tk2{ljDRhGv5$?8zPnM*KAe0BDaRR%p>nBX|dK-sm7W$W;ou z^rrxEi&WjqG%5=6U;|PzAG>@;QkQ*~FbV|VixT{$Ugrut&lJfO#+pBp6ZJTD#W{7|(_ zc6b2zC_iC`Y;sE^z)gz*kV3K72{6=P16kA6Bi@w-2wXl1UAK>-UMLFc9GW9^3m0In+#IOK9b{BRebiE4`R=FU@sM(p8KUEN^+C*5n-zB6XG|j9Xy-m zsHFMpZ97?JTqRri)c5Yf$U5r{W$2#tjBh$Yr`=SquW{?D+mB(^sHupOBDq@d;qHXDG12W5f8k#%CQo1MEZVtuw1g3LX83qcHM zX(%)n--5(n9hbXjcj;KVpO|hRT)wL8j8ymjD3G?r@T%`On{aFZMLVu8*yC{*n@Aew zk#qq;G#}-U+hx?i$~=B)qgwr}&h+71ss$VJH^Lbq)BoIL^!Pd{1mvN9F+S&cEy|kw zC+my05quALdNr?pk|`Dk$_4{Ds8-Dsby2vi8veX&nQvl$6JelAi32JWpk_H{OB~O?Eyze@T_-1LYcDk%M;kj4de$=ECKidOh0l8RXr5bhw}l|vNIpa^c`ELAH!5<+m2h5zdD&ES za&J+q%FGaP(#-k9VA4$O)#kc#lEpjbn?B*U&vESpyslek&&6P!MTEb7WhoH7jWF9sXA;j2flhv2`@pmwj%k{qm)? zqp_`{siXS)%$N{lybu-@7G7)@p4#8$%h^^|-%L)_-pE*Q{CYW_tJOIa_9(V#Sqw6` zVy>Z6HzQf+q7j@|Ie+P`;zww*b?D*cpCCB&3W}(4hwPW8E)c5`dL<$Rp%?zZG7dDG zOHgZ^aCmWaUmW^#A^~SJ1?>7nChrY7SgZNT0m|~S*0WGTBG;E3SlAudR~y?c0#xGO zl3)ZZ1((cgdBPH`#4xtneE(aQn^$;}ikf#UIz01hj9B)-dGF)1xk4I0N*1 zw+J6u6azRsTc`kt@3|d-T?WWpMA}Q(-p*6>zMF4E9%sI$a4h}P^0+X>m_p5G&lq)9 z(_TnuR4A40Dm2f(*uc~iEnRJd0N7@}v8Sa`ME{Zq)oPE$<_xGS&j(AWfSc2Eu36{5$(7MAS0mW+9KMQv0-`?*o%n{Pfo?|6wM z-=E5Qx!H?R_Q!VKwfG)b93lg}gE}zK(M}Y|MQHGHhbSrVQ&PIQyzn;RaoAP{KIEh0 z%+PCrc071<6N<{jihoaQQNFX*J5A^7vCC4?`w(rB#eMTSr7o>zO3OnX`OprOgePF*}L!HkARq;)y>7@T-qwN$9Np z^*(#N@4D#*OGD}0RQ+v0;9cOo&aegS7?kY`^U6s9+C^~*N^nm1 z-}-w-1hqJ>&Kg+?RQhx&w8l?-&~AX*(B*;f0Eica7T8f3-bl&*96mGihPM_NMIN$D zN)h!K0HB+xPUU3G89f~_f?*avc=d9FooxMFaEN=)oWFqUjC;hFe*C+bep+Plfd-AV z^OEA=o#=rS0;I+MlR$v|L(r3n{$(ZmfEDi+huTPMpmV?2@~`|GWky%9HEZV2BdG2) zk>6NiVB>eKj-VEb#y|ws?}t8#zpsh%d>ioX+n}r1?!y`A z(aNq$#Sdt>@n(`hw2K^C_;DMSeXLdYgJ9`WWg3P}M>;q1?ml(~fdslG zc?yW##!X2Gr#s-643(PBvz3vD_Ye?TCMaQn0}2ziKv*0pqSe|DO#tGTqN=)$?TXGL zP@d*4j)yTp*6UyIOd^sV&M;;XRHdPU*i`hDn~(yqA2n((=)OD8{?MDXj-z81cD(zR zR!ynX9mcMGdcwRJ;T6@uLR0?itU4olYd6TA6n}$@AGRcmH(WCd3$n751C=EN>O%$R zI-9f1ylS};oWF$j%K;E-Y4dOS$Z+#G5MTcMKgiF7Q6f3WqA!5Ff4|TW%gj;e{;Tt^7kZsZ8cpEr zHdnZ`l+wR9#;_Mf%O6rG3yQpsgPd*TX`($8Zd3C4rmh^evB2L?-MCI7rB53y#`N)G0eV2EruCVKu1WR~edw36fNe+H_hg=a4)GgzIYpgjK z4GJU?IO}?*P~%+)KHL3&{4DjTAyzF2;s|^HzwK`gx z)@>NsrAK?HfroOvCes*HeODr0Dh5?MosvzcnnY%eJqy^q=E(zzdmPSvZSLrNFL3nZHxG(cTzQsPGVgw#B$-IC3VKTdxxo1NbUc+`Zn?dWV-eL>c*_)jD ztp~7v!Z%Y3H7;@>djSap>DAG!lu^StMiqk6RXdnX&{i7B#)B?(kovx4lnwwDb7<9w zRw%RS`jTS59ddJXv_ZhQ^Kn+n4%|Xy+hc-Gbvo2azh6Q?vW>V;qv9+a;oLCZ$rfcjUJmBnt+SE-FqK+59a&V(B z-qTPZVy2Z~HjCrZup-NIXp7lqTc?5cMqX}?{h2E%40KsPca7YhgLfX8Lva`oa|`$) z+er{s?-v$A!(t9LM_jJF1OV-CfAX>~fak^;5hevQ-Tuy9I`j|E)3`~q=dRdyYWIar ztQu5B+8Y}e8CZh@B8hw_6o{v;$X5!yLusvpxSmNsxr;HUn9R+gR(y3<^8URKH_;h~ zKP?PrS%3fV3BR#ua{CTN(Sr2FODHrKPuoP5-%tj7Wk4C4Wru@6RNHum`rF_@8+ziS zL9_omPXFqkE|?cXi@|`{-sOfWNOWWI{%vixkGlsLk?Ra#4R<$qt;V8g0E%mQ3c!lu zgE$B&kOvp-anW$~n>{VAAbh=ZzN*1aGRf?zSb4)EhKacG;ceT@T3*&egWrEx{Mi2mmg);=S?xc0kuQ=B^TI^#hrY5|JRRL<9;X zvMu!>i4M5j6chzo*|;@jUo< zj1d$;j)~;Hf^GfBw14=9^jHk#ue8?zz^w>o61sSSobX&CVA*c~%5;F=d!jFfm(aJp z3~P4%8p1gW%46yFvjA#xU49&fl7Dx0#IrI25&8lL@xb{&ND#4Z$fYzi4~An6ZFnLH zQ24AJVQ+te@;6b#1A)KA+8sk){<#x8g_E~tAH0d7?h?F3)Ny~45FbYD(C}Lo%$t>< z2ddNdv;1_@^t1{^B}M+-pZ5}?U=t0dTcoh>aJhjw4hZq`N1X-XZov>0Fw<(rq)*&^ zIVHpd`=)(_rkePnhj&p{;?T*Iv)#1de>?ri6-wz0$Aa;52A>u8H}CR*$^=B~b*(67 zOB{l6bso9E7LK}lI~qSG01&Jrka|W0Cg{P+xaf)h`w+h_?B^V(k^ek&A@5u+Vd8c{iViC5z~a)cC@sWY_lJlyUs~$=yUXpzreP z{&VYwdC^bh_%bj47gL(srp!uKAFw

o}pd@V&z(C9$|gQFB;NrVWkJ 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

QIJP)|7_oGKOlQ=j1Ui~g8bHUA4LD^W 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�RjXHGA=XRV(+4b^^ihg2}J8QR)mEQEKmq+!J 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

3m2O8+7UmJh}Q`uk1x4i;9Yf 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

mWFKA;do0D9q~2mtp2sBBYsP9i#xByHWv(t~U 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 z

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 U@4o)mu&6&c`Na^K7(}}L9|FB?R{#J2 diff --git a/src/main/resources/assets/ars_nouveau/sounds/thistle_the_sound_of_glass.ogg b/src/main/resources/assets/ars_nouveau/sounds/thistle_the_sound_of_glass.ogg index b324a1136265925d529c7a30de7e5b205f167043..910fc1d2c6a45f24803fb5a4dade68fc51ea3f3e 100644 GIT binary patch literal 963847 zcmagGWmq1u5-7a5wz#{yL$N|}cXuf6?%v|=ZiN;K#fn>z;_j|Ric4{aZ)wjt_ugM$ zp1ix+naL!X%w#8<{Skx`pNJP|px zkA&=UxCxgiV|=hZ?5VY{TkC?buSL1nxkF(sFjQV=ZfE@5ydBW>iz zZq`QZU}!Gd=#N{h{nJ56BH@`q(p)$A!4|@v*#F9)6qbq)f)(z^4VDlFYXHmJh#5R2 zT#O$~&kIiyOv-7B1;hiurvlo@0$M~={Axs?9{^B=lrj692nP}f2dW5>;9qIOfc*f# zgLG1nU!-EUq!KB$6RG~j?TBxTL)CvH``_$R0HCCdEbfE}_cxy@0Kk9Zi7eELEVPW= z36F&j4lRQO0s#OTEQV85^{r&G*qEC7T)o}W{}pvp&G7za2W5ylX=Ppl8_o)a2m7}l zz-k1dMY47W{#VF>xH7K`5XyPivNu0zzs{7Y;w8$Ks`Elr6G9v1|DynGc>S#Yshm=AXbJ0U>y@5KI-R|6Yv4$wG0R2kE|k z`Y1zRQd|(tKEzlv{P)6lSXT3zADOKiRg|H;TSe85YgWtVn0F^Ls8&PAro2u?hORJK z1@W)^NI}_)z~Y(4E5C3y4yXH??TkoY{7;;uFI@uwif4oqXhi=fo)V6sQ7NN?k!gyZ zYf4pI-OX$+)lIv>Pj@~<|JrW_j5luYwNlNr|DX7;>7bF5g3A7{A#}aCF2lULl*y?7 zZ6?^EfFq{lUwxCVrj(te9GPTPJm*xz5KzVxpW;-Xz|vRdwo`s%HpQi{`bJ+}!%j2R zPPg7|Da~x@+HdXuiu!PWn}`koe2ElviR5&Nn>?|U(n6N~^neiTi$z9m(8g}^BvMKz zQduQhc%>F+WbS3;(trC)0-(N-yoAUi&&U$b$YRgf-S9-qjMUlEeRhec~#Aj61|Nnyg6sJ4}C|HCSgB{m#87@zY72YjN>!(y*Fv%$wf+Cm-KQldgNn{QQMCIAlnA?1(9V?hXE0>B4k6-2s_WaCk~ zop_Z&-fcqTNZzm6CZoKxImv^(G&xD=bcNs}-A;D$sPuMr(xfyks2?2=;7^2>(^MQl zr2&3963QoW%41T=V~8ta>d#?_&!ljUaB?ZDsmo)^�+uW6P_jQpt13%VVmmVu-6_ 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�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%0AD+C^0UW;5<;jpb1`d#Ye{{qaO%0thJb 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 JW)cu@SiTF#5Jj& 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%0A{YgNE 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�<>U(Jl$i5}j^%gN-86*y;~>6-84 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

    OucG(=k@nu6*Fax94wp3-~DNL00z@>Sd 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˶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�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

    U8&z9_piE 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

  1. MelY#i{NO7~=k&`?NyTG$rm5`9 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%0AL*1@K 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ⅆTJ5!@D{TaP3{->>Y{s%|UU(SgX+ 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 C5RB3Q literal 1297243 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�L$ByAnX7FF!c7SUTpJY(qZKSHcGjJ0Z2N$|$ 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

    *zJ(@ZU`!j@7cwl*2Hg4*<;|< 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

    l`oHee!U6}!qBV~GJOgJ2 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

    ^$));*VD#U8 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

    _kSq5K?CG%GH)7< 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�%fIT`#FDpa$KyWS-X2>X#o0e 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 P*>mK%HX0yx3`KzGvxsX?Y_k#V3+llQd-$zc+ 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

    gKyX0absA?yWDVCb4<01 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 From d7a3441cb61c1b229c6ffaf1436974d49bd33829 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 10 Nov 2024 21:37:10 -0600 Subject: [PATCH 279/363] Increase saturation bonus, decrease magic food bonus #1500 --- .../arsnouveau/common/block/tile/MycelialSourcelinkTile.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MycelialSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MycelialSourcelinkTile.java index d9bc53b0a0..e1fa240c1a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MycelialSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/MycelialSourcelinkTile.java @@ -69,13 +69,13 @@ public int getSourceValue(ItemStack i) { int mana = 0; mana += 11 * food.nutrition(); - mana += 30 * food.saturation(); + mana += (int) (30.0 * ((food.saturation() * 2.0))); progress += 1; if (i.is(ItemTagProvider.MAGIC_FOOD) || (i.getItem() instanceof BlockItem blockItem && blockItem.getBlock().defaultBlockState().is(BlockTagProvider.MAGIC_PLANTS))) { progress += 4; mana += 10; - mana *= 2; + mana += (int) ((float)mana * 1.5f); } return mana; From 0ff9a754c2ca67e36756541cfd7cbce3a0a379d2 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 10 Nov 2024 21:45:59 -0600 Subject: [PATCH 280/363] 5.2.4 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 5f0eee215a..437279f94a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.2.3 +mod_version=5.2.4 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 4fd43c1768e3a8d6d914b76de0d0a4488da5bb34 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 11 Nov 2024 10:28:28 -0600 Subject: [PATCH 281/363] Fix fake player returned for everything --- .../com/hollingsworth/arsnouveau/api/ANFakePlayer.java | 5 +++-- .../arsnouveau/api/spell/AbstractCaster.java | 9 --------- .../arsnouveau/common/spell/effect/EffectPlaceBlock.java | 5 ++--- .../arsnouveau/common/spell/effect/EffectRedstone.java | 4 ++-- 4 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/ANFakePlayer.java b/src/main/java/com/hollingsworth/arsnouveau/api/ANFakePlayer.java index 6b2aff8bb9..38563fe59b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/ANFakePlayer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/ANFakePlayer.java @@ -24,8 +24,9 @@ // https://github.com/Creators-of-Create/Create/blob/mc1.15/dev/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFakePlayer.java#L57 public class ANFakePlayer extends FakePlayer { - public static FakePlayer getOrFakePlayer(ServerLevel level, @Nullable LivingEntity player) { - return getPlayer(level, player instanceof Player ? player.getUUID() : null); + + public static Player getOrFakePlayer(ServerLevel level, @Nullable LivingEntity player) { + return player instanceof Player player1 ? player1 : getPlayer(level); } public static FakePlayer getPlayer(ServerLevel level, @Nullable UUID uuid) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java index 7406531638..fca8603c4c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractCaster.java @@ -306,15 +306,6 @@ public InteractionResultHolder castSpell(Level worldIn, LivingEntity return castSpell(worldIn, playerIn, handIn, invalidMessage, getSpell(worldIn, playerIn, handIn, this)); } - public T copyFromCaster(AbstractCaster other) { - T self = (T) this; - for (int i = 0; i < getMaxSlots() && i < other.getMaxSlots(); i++) { - self = self.setSpell(other.getSpell(i), i); - self = self.setFlavorText(other.getFlavorText()); - } - return self; - } - @SuppressWarnings("unchecked") public void saveToStack(ItemStack stack) { stack.set(this.getComponentType(), this); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java index f6d412e4d4..588687d25f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java @@ -24,7 +24,6 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.util.BlockSnapshot; -import net.neoforged.neoforge.common.util.FakePlayer; import net.neoforged.neoforge.event.level.BlockEvent; import org.jetbrains.annotations.NotNull; @@ -41,7 +40,7 @@ private EffectPlaceBlock() { @Override public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { List posList = SpellUtil.calcAOEBlocks(shooter, rayTraceResult.getBlockPos(), rayTraceResult, spellStats); - FakePlayer fakePlayer = ANFakePlayer.getOrFakePlayer((ServerLevel) world, shooter); + Player fakePlayer = ANFakePlayer.getOrFakePlayer((ServerLevel) world, shooter); for (BlockPos pos1 : posList) { if (!world.isInWorldBounds(pos1)) continue; @@ -56,7 +55,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull } } - public void place(BlockHitResult resolveResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver, FakePlayer fakePlayer) { + public void place(BlockHitResult resolveResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver, Player fakePlayer) { InventoryManager manager = spellContext.getCaster().getInvManager(); ExtractedStack extractItem = spellStats.isRandomized() ? manager.extractRandomItem(i -> !i.isEmpty() && i.getItem() instanceof BlockItem, 1) : manager.extractItem(i -> !i.isEmpty() && i.getItem() instanceof BlockItem, 1); if (extractItem.isEmpty()) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java index a73b6c4fb3..13ffd1b222 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java @@ -13,6 +13,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; @@ -20,7 +21,6 @@ import net.neoforged.neoforge.common.ModConfigSpec; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.util.BlockSnapshot; -import net.neoforged.neoforge.common.util.FakePlayer; import net.neoforged.neoforge.event.level.BlockEvent; import org.jetbrains.annotations.NotNull; @@ -41,7 +41,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull int timeBonus = (int) spellStats.getDurationMultiplier(); int delay = Math.max(GENERIC_INT.get() + timeBonus * BONUS_TIME.get(), 2); List posList = SpellUtil.calcAOEBlocks(shooter, rayTraceResult.getBlockPos(), rayTraceResult, spellStats); - FakePlayer fakePlayer = ANFakePlayer.getOrFakePlayer((ServerLevel) world, shooter); + Player fakePlayer = ANFakePlayer.getOrFakePlayer((ServerLevel) world, shooter); for (BlockPos pos1 : posList) { if (spellStats.isSensitive()) { if (!world.isInWorldBounds(pos1)) From 4715f4a92f2c5095e84e01b438f05f90b20829f2 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 11 Nov 2024 11:35:15 -0600 Subject: [PATCH 282/363] 5.2.5 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 437279f94a..31c1733490 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.2.4 +mod_version=5.2.5 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 2cdd5fb40d77ce42516b7315da0561f5de596fd8 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 11 Nov 2024 11:35:34 -0600 Subject: [PATCH 283/363] Fix grate moving waterlogged blocks #1503 --- .../arsnouveau/common/block/ItemGrate.java | 62 +++++++++++-------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ItemGrate.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ItemGrate.java index 3e3017cd92..394674140b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ItemGrate.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ItemGrate.java @@ -14,6 +14,7 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.BucketItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; @@ -73,39 +74,46 @@ protected void tick(BlockState pState, ServerLevel pLevel, BlockPos pPos, Random BlockPos below = pPos.below(); BlockState stateAbove = pLevel.getBlockState(pPos.above()); BlockState stateBelow = pLevel.getBlockState(below); - if(stateAbove.getFluidState().isSource()) { - if (stateBelow.getBlock() instanceof LiquidBlockContainer blockContainer - && blockContainer.canPlaceLiquid(null, pLevel, pPos.below(), stateBelow, stateAbove.getFluidState().getType())) { - if(blockContainer.placeLiquid(pLevel, pPos.below(), stateBelow, stateAbove.getFluidState())){ - if(stateAbove.getBlock() instanceof BucketPickup bucketPickup){ - bucketPickup.pickupBlock(null, pLevel, pPos.above(), stateAbove); - } - if(pLevel.getBlockState(pPos.above()).getFluidState().isSource()){ - pLevel.setBlockAndUpdate(pPos.above(), Blocks.AIR.defaultBlockState()); - } - } - } else if (stateBelow.canBeReplaced()) { - pLevel.setBlockAndUpdate(pPos.below(), stateAbove); - pLevel.setBlockAndUpdate(pPos.above(), Blocks.AIR.defaultBlockState()); - }else if (stateBelow.getBlock() instanceof CauldronBlock cauldronBlock - && !cauldronBlock.isFull(stateBelow)) { - if(stateAbove.getBlock() instanceof BucketPickup bucketPickup){ + if(!stateAbove.getFluidState().isSource()){ + return; + } - ItemStack stack = bucketPickup.pickupBlock(null, pLevel, pPos.above(), stateAbove); - if(!stack.isEmpty()){ - var accessor = (BlockBehaviourAccessor) cauldronBlock; - ANFakePlayer fakePlayer = ANFakePlayer.getPlayer(pLevel); - fakePlayer.setItemInHand(InteractionHand.MAIN_HAND, stack.copy()); - ItemInteractionResult result = accessor.callUseItemOn(stack, stateBelow, pLevel, pPos.below(), fakePlayer, InteractionHand.MAIN_HAND, new BlockHitResult(new Vec3(below.getX(), below.getY(), below.getZ()), Direction.UP, pPos.below(), false)); - if(!ItemStack.isSameItem(fakePlayer.getItemInHand(InteractionHand.MAIN_HAND), stack)){ - if(pLevel.getBlockState(pPos.above()).getFluidState().isSource()){ - pLevel.setBlockAndUpdate(pPos.above(), Blocks.AIR.defaultBlockState()); - } + if (stateBelow.getBlock() instanceof LiquidBlockContainer blockContainer + && blockContainer.canPlaceLiquid(null, pLevel, pPos.below(), stateBelow, stateAbove.getFluidState().getType())) { + if(blockContainer.placeLiquid(pLevel, pPos.below(), stateBelow, stateAbove.getFluidState())){ + if(stateAbove.getBlock() instanceof BucketPickup bucketPickup){ + bucketPickup.pickupBlock(null, pLevel, pPos.above(), stateAbove); + } + if(pLevel.getBlockState(pPos.above()).getFluidState().isSource()){ + pLevel.setBlockAndUpdate(pPos.above(), Blocks.AIR.defaultBlockState()); + } + } + } else if (stateBelow.canBeReplaced()) { + if(stateAbove.getBlock() instanceof BucketPickup bucketPickup){ + ItemStack bucket = bucketPickup.pickupBlock(null, pLevel, pPos.above(), stateAbove); + if(bucket.getItem() instanceof BucketItem bucketItem){ + pLevel.setBlockAndUpdate(below, stateAbove.getFluidState().createLegacyBlock()); + } + } + }else if (stateBelow.getBlock() instanceof CauldronBlock cauldronBlock + && !cauldronBlock.isFull(stateBelow)) { + if(stateAbove.getBlock() instanceof BucketPickup bucketPickup){ + + ItemStack stack = bucketPickup.pickupBlock(null, pLevel, pPos.above(), stateAbove); + if(!stack.isEmpty()){ + var accessor = (BlockBehaviourAccessor) cauldronBlock; + ANFakePlayer fakePlayer = ANFakePlayer.getPlayer(pLevel); + fakePlayer.setItemInHand(InteractionHand.MAIN_HAND, stack.copy()); + ItemInteractionResult result = accessor.callUseItemOn(stack, stateBelow, pLevel, pPos.below(), fakePlayer, InteractionHand.MAIN_HAND, new BlockHitResult(new Vec3(below.getX(), below.getY(), below.getZ()), Direction.UP, pPos.below(), false)); + if(!ItemStack.isSameItem(fakePlayer.getItemInHand(InteractionHand.MAIN_HAND), stack)){ + if(pLevel.getBlockState(pPos.above()).getFluidState().isSource()){ + pLevel.setBlockAndUpdate(pPos.above(), Blocks.AIR.defaultBlockState()); } } } } } + } @Override From ba1baac88df04531d4d0cc8639fc7fe751f24ec0 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 11 Nov 2024 21:46:47 -0600 Subject: [PATCH 284/363] Fix rituals not starting, make UUID available to all rituals --- .../arsnouveau/api/ritual/AbstractRitual.java | 17 +++-------------- .../common/ritual/RitualAwakening.java | 13 ++----------- .../common/ritual/RitualWildenSummoning.java | 15 +-------------- 3 files changed, 6 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/AbstractRitual.java b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/AbstractRitual.java index b24b573608..d3d01819d2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/ritual/AbstractRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/ritual/AbstractRitual.java @@ -17,10 +17,7 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Predicate; public abstract class AbstractRitual { @@ -31,6 +28,7 @@ public abstract class AbstractRitual { public RandomSource rand = RandomSource.create(); + public UUID playerUUID; public AbstractRitual() { } @@ -55,11 +53,6 @@ public boolean canStart(@Nullable Player player) { return true; } - @Deprecated(since = "4.10.1", forRemoval = true) - public boolean canStart() { - return canStart(null); - } - public List getConsumedItems() { return getContext().consumedItems; } @@ -121,11 +114,7 @@ public int getProgress() { public void onStart(@Nullable Player player) { getContext().isStarted = true; - } - - @Deprecated(since = "4.10.1", forRemoval = true) - public void onStart() { - onStart(null); + if (player != null) this.playerUUID = player.getUUID(); } public boolean isRunning() { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAwakening.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAwakening.java index adfc5c4da1..d8e31608c2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAwakening.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualAwakening.java @@ -8,10 +8,10 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleLineData; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; -import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import com.hollingsworth.arsnouveau.common.lib.RitualLib; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; +import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; @@ -20,31 +20,22 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.WritableBookItem; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.common.util.FakePlayer; -import org.jetbrains.annotations.Nullable; import java.util.Set; -import java.util.UUID; public class RitualAwakening extends AbstractRitual { EntityType entity = null; BlockPos foundPos; - UUID uuid; - - @Override - public void onStart(@Nullable Player player) { - if (player != null) uuid = player.getUUID(); - } public void destroyTree(ServerLevel world, Set set) { - FakePlayer fakePlayer = ANFakePlayer.getPlayer(world, uuid); + FakePlayer fakePlayer = ANFakePlayer.getPlayer(world, playerUUID); for (BlockPos p : set) { BlockUtil.destroyBlockSafelyWithoutSound(world, p, false, fakePlayer); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java index 24f5b32625..06acf6f693 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/RitualWildenSummoning.java @@ -11,37 +11,24 @@ import com.hollingsworth.arsnouveau.common.entity.WildenStalker; import com.hollingsworth.arsnouveau.common.lib.RitualLib; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; -import com.mojang.authlib.GameProfile; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.common.util.FakePlayer; -import net.neoforged.neoforge.common.util.FakePlayerFactory; -import org.jetbrains.annotations.Nullable; - -import java.util.UUID; import static com.hollingsworth.arsnouveau.common.datagen.ItemTagProvider.WILDEN_DROP_TAG; public class RitualWildenSummoning extends AbstractRitual { - private UUID uuid; - - @Override - public void onStart(@Nullable Player player) { - if (player != null) this.uuid = player.getUUID(); - } - @Override protected void tick() { WildenChimera.spawnPhaseParticles(getPos().above(), getWorld(), 1); if (getWorld().getGameTime() % 20 == 0) incrementProgress(); if (getWorld().getGameTime() % 60 == 0 && (getWorld() instanceof ServerLevel serverLevel)) { - FakePlayer fakePlayer = ANFakePlayer.getPlayer(serverLevel, uuid); + FakePlayer fakePlayer = ANFakePlayer.getPlayer(serverLevel, this.playerUUID); if (!isBossSpawn()) { int wild = rand.nextInt(3); BlockPos summonPos = getPos().above().east(rand.nextInt(3) - rand.nextInt(6)).north(rand.nextInt(3) - rand.nextInt(6)); From f6cd5154020c521d8294da887f3bb123b0011aef Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 11 Nov 2024 21:48:39 -0600 Subject: [PATCH 285/363] 5.2.6 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 31c1733490..06d7ff8d4b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.2.5 +mod_version=5.2.6 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 32bc4abf5d70d0364be24968e07431b90a517d41 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 14 Nov 2024 15:29:01 -0600 Subject: [PATCH 286/363] Update supporters.json --- supporters.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/supporters.json b/supporters.json index 3c54764d67..f18516868e 100644 --- a/supporters.json +++ b/supporters.json @@ -31,7 +31,8 @@ "0421ad40-0881-47d4-b086-38c90c1ab62f", "a8875ecb-6e84-4c6d-ac68-3251b945d963", "cf1f7109-266d-4e5a-8a8a-d93684cf60b9", "e7976ce2-3344-4499-8b15-91adddc5ed0f", "d29025d7-cf5d-4976-8a65-fc3bdcc991b5", "8ced638c-eac7-433e-b794-54c0f23807a4", "db489a87-6509-4d75-917d-9c426b519c64", "eb079f27-e266-4b3c-beba-b34d34bef268", "831086b8-d566-4f25-aa09-ecb505e54885", - "e3298bd7-61bf-427f-af89-4e418a20bf57", "01b53c7e-c7f4-4465-88df-f8b6c645b6b9", "a29ffabb-ac40-4754-8df8-94b9f394045c"], + "e3298bd7-61bf-427f-af89-4e418a20bf57", "01b53c7e-c7f4-4465-88df-f8b6c645b6b9", "a29ffabb-ac40-4754-8df8-94b9f394045c", + "aef9c054-e96e-4332-944b-9393105b6ac6"], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -508,6 +509,11 @@ "adopter": "Lufia", "color": "black", "bio": "Eternal Companion to the Spellblade Lufia, reincarnated in this life to help you on your journey. She may eat your snacks when you aren't looking. Real cat-like behavior right there. " + },{ + "name": "Mothball", + "adopter": "Mira", + "color": "light_gray", + "bio": "There has never been a fluffier Starbuncle, nor will there be. While not particularly bright or strong, Mothball is always happy to be your friend!" } ] } From 8bdc785f50e3a823a5954ed712bbeef053d652bc Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 16 Nov 2024 11:54:38 -0600 Subject: [PATCH 287/363] Add nuggets --- build.gradle | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 342e23d30a..d8a82a689f 100644 --- a/build.gradle +++ b/build.gradle @@ -122,9 +122,7 @@ dependencies { localRuntime 'curse.maven:ftb-chunks-forge-314906:5710609' localRuntime 'curse.maven:ftb-library-forge-404465:5754910' localRuntime 'curse.maven:architectury-api-419699:5553800' - - // localRuntime ("com.alexthw.ars_elemental:ars_elemental-${minecraft_version}:0.7.0.9.3.17") {transitive = false} - // localRuntime "curse.maven:ars-additions-974408:5852361" + implementation 'com.hollingsworth.nuggets:nuggets-neoforge-1.21:1.0.1' } jar { From ccfd6e686687b75f50b71fe73ecb60932242717a Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 16 Nov 2024 12:54:13 -0600 Subject: [PATCH 288/363] Ship nuggets as jarjar --- build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d8a82a689f..15e6ee1f0a 100644 --- a/build.gradle +++ b/build.gradle @@ -122,7 +122,9 @@ dependencies { localRuntime 'curse.maven:ftb-chunks-forge-314906:5710609' localRuntime 'curse.maven:ftb-library-forge-404465:5754910' localRuntime 'curse.maven:architectury-api-419699:5553800' - implementation 'com.hollingsworth.nuggets:nuggets-neoforge-1.21:1.0.1' + implementation(jarJar(group: 'com.hollingsworth.nuggets', name: 'nuggets-neoforge-1.21', version:'[1.0.2,)'){ + jarJar.pin(it, '1.0.2.23') + }) } jar { From 214e1963161caf899a3a58b057006f8bb3ba39c2 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 21 Nov 2024 21:50:07 -0600 Subject: [PATCH 289/363] Fix book elements moving on screen resize --- .../arsnouveau/client/gui/book/BaseBook.java | 24 +++++++++++-- .../client/gui/book/GlyphUnlockMenu.java | 36 ++++++++++++------- .../client/gui/book/GuiSpellBook.java | 7 ++-- 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java index 835265d19c..317dd5d912 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java @@ -5,20 +5,22 @@ import com.hollingsworth.arsnouveau.client.gui.BookSlider; import com.hollingsworth.arsnouveau.client.gui.ModdedScreen; import com.hollingsworth.arsnouveau.client.gui.buttons.ANButton; +import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Renderable; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import vazkii.patchouli.client.base.PersistentData; import java.util.ArrayList; import java.util.List; public class BaseBook extends ModdedScreen { - public final int FULL_WIDTH = 290; - public final int FULL_HEIGHT = 194; + public static final int FULL_WIDTH = 290; + public static final int FULL_HEIGHT = 194; public static ResourceLocation background = ArsNouveau.prefix( "textures/gui/spell_book_template.png"); public int bookLeft; public int bookTop; @@ -33,6 +35,24 @@ public BaseBook() { @Override public void init() { super.init(); + Window res = minecraft.getWindow(); + double oldGuiScale = res.calculateScale(minecraft.options.guiScale().get(), minecraft.isEnforceUnicode()); + + maxScale = this.minecraft.getWindow().calculateScale(0, this.minecraft.isEnforceUnicode()); + int persistentScale = Math.min(PersistentData.data.bookGuiScale, maxScale); + double newGuiScale = res.calculateScale(persistentScale, minecraft.isEnforceUnicode()); + + if (persistentScale > 0 && newGuiScale != oldGuiScale) { + scaleFactor = (float) newGuiScale / (float) res.getGuiScale(); + + res.setGuiScale(newGuiScale); + width = res.getGuiScaledWidth(); + height = res.getGuiScaledHeight(); + res.setGuiScale(oldGuiScale); + } else { + scaleFactor = 1; + } + bookLeft = width / 2 - FULL_WIDTH / 2; bookTop = height / 2 - FULL_HEIGHT / 2; bookRight = width / 2 + FULL_WIDTH / 2; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java index 37aeb0ced0..b30fd856c5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GlyphUnlockMenu.java @@ -117,9 +117,13 @@ public void init() { layoutAllGlyphs(0); //Crafting slots + for(ItemButton button : itemButtons){ + removeWidget(button); + } + itemButtons = new ArrayList<>(); for (int i = 0; i < 10; i++) { int offset = i >= 5 ? 14 : 0; - ItemButton cell = new ItemButton(this, bookLeft + 19 + 24 * i + offset, bookTop + FULL_HEIGHT - 47); + ItemButton cell = new ItemButton(this, bookLeft + 19 + 24 * i + offset, bookBottom - 47); addRenderableWidget(cell); itemButtons.add(cell); } @@ -134,6 +138,7 @@ public void init() { ArsNouveau.prefix("textures/gui/filter_tab_tier2_selected.png"), (b) -> this.setFilter(Filter.TIER2, (SelectableButton) b, Component.translatable("ars_nouveau.tier", 2).getString())).withTooltip(Component.translatable("ars_nouveau.tier", 2)); tier3 = (SelectableButton) new SelectableButton(bookRight - 8, bookTop + 94, 0, 0, 23, 20, 23, 20, ArsNouveau.prefix("textures/gui/filter_tab_tier3.png"), ArsNouveau.prefix("textures/gui/filter_tab_tier3_selected.png"), (b) -> this.setFilter(Filter.TIER3, (SelectableButton) b, Component.translatable("ars_nouveau.tier", 3).getString())).withTooltip(Component.translatable("ars_nouveau.tier", 3)); + filterButtons = new ArrayList<>(); filterButtons.add(all); filterButtons.add(tier2); filterButtons.add(tier1); @@ -141,6 +146,7 @@ public void init() { for (SelectableButton button : filterButtons) { addRenderableWidget(button); } + updateRecipeButtons(); } @Override @@ -294,25 +300,29 @@ public List> applyFilter(List itemButtons.size()) - break; - itemButtons.get(i).visible = true; - itemButtons.get(i).ingredient = selectedRecipe.value().inputs.get(i); + updateRecipeButtons(); + } + } - } + public void updateRecipeButtons(){ + if (selectedRecipe == null) + return; + for (ItemButton itemButton : itemButtons) { + itemButton.visible = false; + itemButton.ingredient = Ingredient.EMPTY; + } + + for (int i = 0; i < selectedRecipe.value().inputs.size(); i++) { + if (i > itemButtons.size()) + break; + itemButtons.get(i).visible = true; + itemButtons.get(i).ingredient = selectedRecipe.value().inputs.get(i); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index e2fd470910..6cb3f706d3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -132,10 +132,11 @@ public void init() { super.init(); AbstractCaster caster = SpellCasterRegistry.from(bookStack); int selectedSlot = caster.getCurrentSlot(); - //Crafting slots + + craftingCells = new ArrayList<>(); for (int i = 0; i < numLinks; i++) { int offset = i >= 5 ? 14 : 0; - CraftingButton cell = new CraftingButton(bookLeft + 19 + 24 * i + offset, bookTop + FULL_HEIGHT - 47, this::onCraftingSlotClick, i); + CraftingButton cell = new CraftingButton(bookLeft + 19 + 24 * i + offset, bookBottom - 47, this::onCraftingSlotClick, i); addRenderableWidget(cell); craftingCells.add(cell); } @@ -145,7 +146,7 @@ public void init() { createSpellButton = addRenderableWidget(new CreateSpellButton(bookRight - 71, bookBottom - 13, this::onCreateClick, () -> !this.validationErrors.isEmpty())); addRenderableWidget(new GuiImageButton(bookRight - 126, bookBottom - 13, 0, 0, 41, 12, 41, 12, "textures/gui/clear_icon.png", this::clear)); - spell_name = new NoShadowTextField(minecraft.font, bookLeft + 32, bookTop + FULL_HEIGHT - 11, + spell_name = new NoShadowTextField(minecraft.font, bookLeft + 32, bookBottom - 11, 88, 12, null, Component.translatable("ars_nouveau.spell_book_gui.spell_name")); spell_name.setBordered(false); spell_name.setTextColor(12694931); From 23c0850e64b9c94287ffedc0c36d1b04eef4ded8 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 21 Nov 2024 22:02:45 -0600 Subject: [PATCH 290/363] Fix place block destroying held item --- .../hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java | 2 +- .../arsnouveau/common/spell/effect/EffectPlaceBlock.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index 6cb3f706d3..4b117d08f4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -132,7 +132,7 @@ public void init() { super.init(); AbstractCaster caster = SpellCasterRegistry.from(bookStack); int selectedSlot = caster.getCurrentSlot(); - + craftingCells = new ArrayList<>(); for (int i = 0; i < numLinks; i++) { int offset = i >= 5 ? 14 : 0; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java index 588687d25f..0f98cb0abd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java @@ -40,7 +40,7 @@ private EffectPlaceBlock() { @Override public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { List posList = SpellUtil.calcAOEBlocks(shooter, rayTraceResult.getBlockPos(), rayTraceResult, spellStats); - Player fakePlayer = ANFakePlayer.getOrFakePlayer((ServerLevel) world, shooter); + Player fakePlayer = ANFakePlayer.getPlayer((ServerLevel) world, shooter instanceof Player player ? player.getUUID() : null); for (BlockPos pos1 : posList) { if (!world.isInWorldBounds(pos1)) continue; From 29ff3a8d999f3b733c5df6e078c77efd27a1a985 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 21 Nov 2024 22:32:59 -0600 Subject: [PATCH 291/363] Check for falling block removal #1511 --- .../arsnouveau/common/entity/EnchantedFallingBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java index c8bc5ac976..3040c97407 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EnchantedFallingBlock.java @@ -198,7 +198,7 @@ public void tick() { onHitEntity(hitEntity); } this.move(MoverType.SELF, this.getDeltaMovement()); - if (!this.level.isClientSide) { + if (!this.level.isClientSide && !this.isRemoved()) { BlockPos blockpos = this.blockPosition(); boolean isConcrete = this.blockState.getBlock() instanceof ConcretePowderBlock; boolean isConcreteInWater = isConcrete && this.level.getFluidState(blockpos).is(FluidTags.WATER); From 57e46a57db5b2997bc8d21a21d24b6b1b2b9251f Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 21 Nov 2024 22:38:53 -0600 Subject: [PATCH 292/363] 5.2.7 --- build.gradle | 6 +++--- gradle.properties | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 15e6ee1f0a..0690b7fd14 100644 --- a/build.gradle +++ b/build.gradle @@ -122,9 +122,9 @@ dependencies { localRuntime 'curse.maven:ftb-chunks-forge-314906:5710609' localRuntime 'curse.maven:ftb-library-forge-404465:5754910' localRuntime 'curse.maven:architectury-api-419699:5553800' - implementation(jarJar(group: 'com.hollingsworth.nuggets', name: 'nuggets-neoforge-1.21', version:'[1.0.2,)'){ - jarJar.pin(it, '1.0.2.23') - }) +// implementation(jarJar(group: 'com.hollingsworth.nuggets', name: 'nuggets-neoforge-1.21', version:'[1.0.2,)'){ +// jarJar.pin(it, '1.0.2.23') +// }) } jar { diff --git a/gradle.properties b/gradle.properties index 06d7ff8d4b..60d0637cf8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.2.6 +mod_version=5.2.7 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 15e8c468392b36a270aa2a4e3a16cced5586a0d9 Mon Sep 17 00:00:00 2001 From: Qther Date: Sat, 23 Nov 2024 07:50:03 +0800 Subject: [PATCH 293/363] Add GlobalPos versions of IWandable methods with fallback if dimensions are the same (#1437) --- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 +- .../assets/ars_nouveau/lang/en_us.json | 1 + .../arsnouveau/api/item/IWandable.java | 73 ++++++++++++++++++- .../common/datagen/LangDatagen.java | 1 + .../arsnouveau/common/items/DominionWand.java | 31 +++++--- .../common/items/data/DominionWandData.java | 13 ++-- 6 files changed, 104 insertions(+), 19 deletions(-) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 9a5cc68933..29b7ae8144 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-11-10T14:17:22.9532023 Languages: en_us for mod: ars_nouveau -6bda58086730da53e85d21674e15c61da8c5ab4f assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-11-22T17:42:19.4427397 Languages: en_us for mod: ars_nouveau +88075d83bbe635f207366f56b6caafce743838c7 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 90267f36c7..a0aac8fc42 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -213,6 +213,7 @@ "ars_nouveau.gathering_at": "Gathering at: %s", "ars_nouveau.getting_started": "Getting Started", "ars_nouveau.getting_started_desc": "An introduction to Ars Nouveau. It is recommended to follow each section in order.", + "ars_nouveau.global_position": "X: %1$d Y: %2$d Z: %3$d in %4$s", "ars_nouveau.glyph_crafting": "Glyph Crafting", "ars_nouveau.glyph_desc.glyph_accelerate": "Increases the speed of projectile spells.", "ars_nouveau.glyph_desc.glyph_amplify": "Additively increases the power of most spell effects. Can increase the harvest level of Break and increases the damage of spells.", diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/IWandable.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/IWandable.java index 8d39ebbb38..16be7d8860 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/IWandable.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/IWandable.java @@ -3,8 +3,11 @@ import com.hollingsworth.arsnouveau.client.particle.ColorPos; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.GlobalPos; +import net.minecraft.resources.ResourceKey; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -14,6 +17,37 @@ public interface IWandable { * When the wand has made 2 connections, block -> block, block -> entity, entity -> block, or entity -> entity. * The FIRST IWandable in the chain is called. */ + default void onFinishedConnectionFirst(@Nullable GlobalPos storedPos, @Nullable LivingEntity storedEntity, Player playerEntity) { + ResourceKey dim = getStoredDimension(storedPos, storedEntity); + if (dim == null) { + return; + } + + if (playerEntity.level.dimension().equals(dim)) { + onFinishedConnectionFirst(storedPos != null ? storedPos.pos() : null, storedEntity, playerEntity); + } + } + + /** + * When the wand has made 2 connections, block -> block, block -> entity, entity -> block, or entity -> entity. + * The LAST IWandable in the chain is called. + */ + default void onFinishedConnectionLast(@Nullable GlobalPos storedPos, @Nullable LivingEntity storedEntity, Player playerEntity) { + ResourceKey dim = getStoredDimension(storedPos, storedEntity); + if (dim == null) { + return; + } + + if (playerEntity.level.dimension().equals(dim)) { + onFinishedConnectionLast(storedPos != null ? storedPos.pos() : null, storedEntity, playerEntity); + } + } + + /** + * When the wand has made 2 connections, block -> block, block -> entity, entity -> block, or entity -> entity. + * The FIRST IWandable in the chain is called. + */ + @Deprecated default void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @Nullable LivingEntity storedEntity, Player playerEntity) { } @@ -21,16 +55,41 @@ default void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @Nullable L * When the wand has made 2 connections, block -> block, block -> entity, entity -> block, or entity -> entity. * The LAST IWandable in the chain is called. */ + @Deprecated default void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable LivingEntity storedEntity, Player playerEntity) { } //Face-Sensitive versions + default void onFinishedConnectionFirst(@Nullable GlobalPos storedPos, @Nullable Direction face, @Nullable LivingEntity storedEntity, Player playerEntity) { + ResourceKey dim = getStoredDimension(storedPos, storedEntity); + if (dim == null) { + return; + } + + if (playerEntity.level.dimension().equals(dim)) { + onFinishedConnectionFirst(storedPos != null ? storedPos.pos() : null, face, storedEntity, playerEntity); + } + } + + default void onFinishedConnectionLast(@Nullable GlobalPos storedPos, @Nullable Direction face, @Nullable LivingEntity storedEntity, Player playerEntity) { + ResourceKey dim = getStoredDimension(storedPos, storedEntity); + if (dim == null) { + return; + } + + if (playerEntity.level.dimension().equals(dim)) { + onFinishedConnectionLast(storedPos != null ? storedPos.pos() : null, face, storedEntity, playerEntity); + } + } + + @Deprecated default void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @Nullable Direction face, @Nullable LivingEntity storedEntity, Player playerEntity) { onFinishedConnectionFirst(storedPos, storedEntity, playerEntity); } + @Deprecated default void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable Direction face, @Nullable LivingEntity storedEntity, Player playerEntity) { onFinishedConnectionLast(storedPos, storedEntity, playerEntity); } @@ -47,4 +106,16 @@ default void onWanded(Player playerEntity) { default List getWandHighlight(List list) { return list; } -} + + private ResourceKey getStoredDimension(@Nullable GlobalPos storedPos, @Nullable LivingEntity storedEntity) { + if (storedPos != null) { + return storedPos.dimension(); + } + + if (storedEntity != null) { + return storedEntity.level.dimension(); + } + + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 4c46ab9a59..91d7eba33c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -348,6 +348,7 @@ protected void addTranslations() { add("ars_nouveau.dominion_wand.no_location", "No location set."); add("ars_nouveau.dominion_wand.position_stored", "Stored: %s"); add("ars_nouveau.position", "X: %1$d Y: %2$d Z: %3$d"); + add("ars_nouveau.global_position", "X: %1$d Y: %2$d Z: %3$d in %4$s"); add("ars_nouveau.spell_arrow.desc", "Augments spells when used with an Enchanter's Bow."); add("ars_nouveau.spell_parchment.no_spell", "Set your spell book to a spell."); add("ars_nouveau.spell_parchment.inscribed", "Spell inscribed."); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java index 1d017cdce5..39a45c04f1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/DominionWand.java @@ -17,7 +17,10 @@ import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.GlobalPos; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -50,7 +53,7 @@ public void inventoryTick(@NotNull ItemStack pStack, @NotNull Level pLevel, @Not DominionWandData data = pStack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()); if (data.storedPos().isPresent()) { - if (pLevel.getBlockEntity(data.storedPos().get()) instanceof IWandable wandable) { + if (pLevel.getBlockEntity(data.storedPos().get().pos()) instanceof IWandable wandable) { Networking.sendToPlayerClient(new HighlightAreaPacket(wandable.getWandHighlight(new ArrayList<>()), 10), (ServerPlayer) pEntity); } return; @@ -79,9 +82,9 @@ public void inventoryTick(@NotNull ItemStack pStack, @NotNull Level pLevel, @Not PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.dominion_wand.stored_entity")); return InteractionResult.SUCCESS; } - Level world = playerEntity.getCommandSenderWorld(); + Level world = data.storedPos().isPresent() ? playerEntity.getServer().getLevel(data.storedPos().get().dimension()) : playerEntity.getCommandSenderWorld(); - if (data.storedPos().isPresent() && world.getBlockEntity(data.storedPos().get()) instanceof IWandable wandable) { + if (data.storedPos().isPresent() && world.getBlockEntity(data.storedPos().get().pos()) instanceof IWandable wandable) { wandable.onFinishedConnectionFirst(data.storedPos().orElse(null), data.face().orElse(null), target, playerEntity); } @@ -115,10 +118,10 @@ public void clear(ItemStack stack, Player player) { return super.useOn(context); BlockPos pos = context.getClickedPos(); Direction face = context.getClickedFace(); - Level world = context.getLevel(); Player playerEntity = context.getPlayer(); ItemStack stack = context.getItemInHand(); DominionWandData data = stack.getOrDefault(DataComponentRegistry.DOMINION_WAND, new DominionWandData()); + Level world = data.storedPos().isPresent() ? playerEntity.getServer().getLevel(data.storedPos().get().dimension()) : context.getLevel(); if (playerEntity.isShiftKeyDown() && world.getBlockEntity(pos) instanceof IWandable wandable && !data.hasStoredData()) { wandable.onWanded(playerEntity); @@ -127,23 +130,23 @@ public void clear(ItemStack stack, Player player) { } if (!data.hasStoredData()) { - data = data.storePos(pos.immutable()); + data = data.storePos(new GlobalPos(context.getLevel().dimension(), pos)); if (data.strict()) data = data.setFace(face); stack.set(DataComponentRegistry.DOMINION_WAND, data); PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.dominion_wand.position_set")); return InteractionResult.SUCCESS; } - BlockPos storedPos = data.storedPos().orElse(null); + GlobalPos storedPos = data.storedPos().orElse(null); Direction storedDirection = data.face().orElse(null); - if (storedPos != null && world.getBlockEntity(storedPos) instanceof IWandable wandable) { - wandable.onFinishedConnectionFirst(pos, storedDirection, (LivingEntity) world.getEntity(data.storedEntityId()), playerEntity); + if (storedPos != null && world.getBlockEntity(storedPos.pos()) instanceof IWandable wandable) { + wandable.onFinishedConnectionFirst(new GlobalPos(world.dimension(), pos), storedDirection, (LivingEntity) world.getEntity(data.storedEntityId()), playerEntity); } if (world.getBlockEntity(pos) instanceof IWandable wandable) { wandable.onFinishedConnectionLast(storedPos, storedDirection, (LivingEntity) world.getEntity(data.storedEntityId()), playerEntity); } if (data.storedEntityId() != DominionWandData.NULL_ENTITY && world.getEntity(data.storedEntityId()) instanceof IWandable wandable) { - wandable.onFinishedConnectionFirst(pos, data.strict() ? face : null, null, playerEntity); + wandable.onFinishedConnectionFirst(new GlobalPos(world.dimension(), pos), data.strict() ? face : null, null, playerEntity); } clear(stack, playerEntity); @@ -169,7 +172,7 @@ public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext wo if (data.storedPos().isEmpty()) { tooltip.add(Component.translatable("ars_nouveau.dominion_wand.no_location")); } else { - tooltip.add(Component.translatable("ars_nouveau.dominion_wand.position_stored", getPosString(data.getValidPos()))); + tooltip.add(Component.translatable("ars_nouveau.dominion_wand.position_stored", getGlobalPosString(data.getValidPos()))); } if (data.strict()) tooltip.add(Component.literal("Side-Sensitive")); @@ -179,6 +182,14 @@ public static String getPosString(BlockPos pos) { return Component.translatable("ars_nouveau.position", pos.getX(), pos.getY(), pos.getZ()).getString(); } + public static String getGlobalPosString(GlobalPos globalPos) { + BlockPos pos = globalPos.pos(); + ResourceLocation dimLoc = globalPos.dimension().location(); + String translationKey = dimLoc.getPath() + "." + dimLoc.getNamespace() + ".name"; + String translation = Component.translatable(translationKey).getString(); + return Component.translatable("ars_nouveau.global_position", pos.getX(), pos.getY(), pos.getZ(), translation.equals(translationKey) ? dimLoc.toString() : translation).getString(); + } + @OnlyIn(Dist.CLIENT) @Override public void onRadialKeyPressed(ItemStack stack, Player player) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java index b0baacbb25..a8e8bd86c3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/DominionWandData.java @@ -4,6 +4,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.GlobalPos; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; @@ -12,7 +13,7 @@ import java.util.Objects; import java.util.Optional; -public record DominionWandData(Optional storedPos, Optional face, boolean strict, int storedEntityId) { +public record DominionWandData(Optional storedPos, Optional face, boolean strict, int storedEntityId) { public DominionWandData(){ this(Optional.empty(), Optional.empty(), false, NULL_ENTITY); @@ -21,14 +22,14 @@ public DominionWandData(){ public static final int NULL_ENTITY = -1; public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - BlockPos.CODEC.optionalFieldOf("pos").forGetter(DominionWandData::storedPos), + GlobalPos.CODEC.optionalFieldOf("pos").forGetter(DominionWandData::storedPos), Direction.CODEC.optionalFieldOf("face").forGetter(DominionWandData::face), Codec.BOOL.fieldOf("strict").forGetter(DominionWandData::strict), Codec.INT.fieldOf("entityId").forGetter(DominionWandData::storedEntityId) ).apply(instance, DominionWandData::new)); public static StreamCodec STREAM = StreamCodec.composite( - BlockPos.STREAM_CODEC.apply(ByteBufCodecs::optional), + GlobalPos.STREAM_CODEC.apply(ByteBufCodecs::optional), DominionWandData::storedPos, Direction.STREAM_CODEC.apply(ByteBufCodecs::optional), DominionWandData::face, @@ -43,7 +44,7 @@ public boolean hasStoredData(){ return storedPos.isPresent() || storedEntityId != -1; } - public @Nullable BlockPos getValidPos(){ + public @Nullable GlobalPos getValidPos(){ return storedPos.orElse(null); } @@ -51,8 +52,8 @@ public int getStoredEntity(){ return storedEntityId == 0 || storedEntityId == NULL_ENTITY ? NULL_ENTITY : storedEntityId; } - public DominionWandData storePos(@Nullable BlockPos pos){ - return new DominionWandData(pos == null ? Optional.empty() : Optional.of(pos.immutable()), face, strict, storedEntityId); + public DominionWandData storePos(@Nullable GlobalPos pos){ + return new DominionWandData(pos == null ? Optional.empty() : Optional.of(new GlobalPos(pos.dimension(), pos.pos().immutable())), face, strict, storedEntityId); } public DominionWandData storeEntity(int entityId){ From 63cb2229e2c5ad385df2beeecdb987ef30819731 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Fri, 22 Nov 2024 18:05:36 -0600 Subject: [PATCH 294/363] Fix book opening on wrong side in lan --- .../arsnouveau/client/gui/GuiUtils.java | 3 --- .../arsnouveau/common/items/WornNotebook.java | 15 +++------------ 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiUtils.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiUtils.java index f99298406e..926f05d240 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiUtils.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/GuiUtils.java @@ -26,9 +26,6 @@ public static boolean isMouseInRelativeRange(int mouseX, int mouseY, int x, int public static void openWiki(Player player) { if (player instanceof ServerPlayer serverPlayer) { - if (ArsNouveau.patchouliLoaded) { - PatchouliHandler.openBookGUI(serverPlayer); - } return; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/WornNotebook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/WornNotebook.java index d16f910ee8..ef948ae183 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/WornNotebook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/WornNotebook.java @@ -1,14 +1,8 @@ package com.hollingsworth.arsnouveau.common.items; -import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.client.gui.GuiUtils; -import com.hollingsworth.arsnouveau.common.compat.PatchouliHandler; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; -import net.minecraft.ChatFormatting; -import net.minecraft.Util; -import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; @@ -17,9 +11,6 @@ import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; -import java.net.URI; -import java.net.URISyntaxException; - public class WornNotebook extends ModItem { public WornNotebook() { @@ -31,9 +22,9 @@ public WornNotebook() { @Override public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); - - GuiUtils.openWiki(ArsNouveau.proxy.getPlayer()); - + if(playerIn.level.isClientSide) { + GuiUtils.openWiki(playerIn); + } return new InteractionResultHolder<>(InteractionResult.CONSUME, stack); } } From 6565bb196f09246e6bb095dce0f719365618b7d6 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 24 Nov 2024 12:15:47 -0600 Subject: [PATCH 295/363] Revert width/height scaling --- gradle.properties | 2 +- .../arsnouveau/client/gui/book/BaseBook.java | 20 ------------------- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/gradle.properties b/gradle.properties index 60d0637cf8..6dd09f3f0b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,5 +26,5 @@ mod_description=Craft spells, create powerful baubles, and summon magical creatu jei_version=19.21.0.247 curios_version=9.0.12 geckolib_version=4.6.6 -patchouli_version=88-NEOFORGE-SNAPSHOT +patchouli_version=87-NEOFORGE caelus_version=7.0.0+1.21 diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java index 317dd5d912..57dd10590f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/BaseBook.java @@ -5,14 +5,12 @@ import com.hollingsworth.arsnouveau.client.gui.BookSlider; import com.hollingsworth.arsnouveau.client.gui.ModdedScreen; import com.hollingsworth.arsnouveau.client.gui.buttons.ANButton; -import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Renderable; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import vazkii.patchouli.client.base.PersistentData; import java.util.ArrayList; import java.util.List; @@ -35,24 +33,6 @@ public BaseBook() { @Override public void init() { super.init(); - Window res = minecraft.getWindow(); - double oldGuiScale = res.calculateScale(minecraft.options.guiScale().get(), minecraft.isEnforceUnicode()); - - maxScale = this.minecraft.getWindow().calculateScale(0, this.minecraft.isEnforceUnicode()); - int persistentScale = Math.min(PersistentData.data.bookGuiScale, maxScale); - double newGuiScale = res.calculateScale(persistentScale, minecraft.isEnforceUnicode()); - - if (persistentScale > 0 && newGuiScale != oldGuiScale) { - scaleFactor = (float) newGuiScale / (float) res.getGuiScale(); - - res.setGuiScale(newGuiScale); - width = res.getGuiScaledWidth(); - height = res.getGuiScaledHeight(); - res.setGuiScale(oldGuiScale); - } else { - scaleFactor = 1; - } - bookLeft = width / 2 - FULL_WIDTH / 2; bookTop = height / 2 - FULL_HEIGHT / 2; bookRight = width / 2 + FULL_WIDTH / 2; From 659f7e3aa6f5e8619a50ca374809fb89cc0a28f9 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 24 Nov 2024 15:58:13 -0600 Subject: [PATCH 296/363] Augment + glyph doc support (#1521) * Use equal number of crafting cells, add per augment docs * Add sensitive cap to all isSensitive checks * Document rest of augments * Do not display augment descriptions for invalid glyphs * Show extended tooltip on crafting cell * Fix validation when removing effects in middle * Add missing augment docs --- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 +- .../assets/ars_nouveau/lang/en_us.json | 317 +++++++++++++++++- .../hollingsworth/arsnouveau/ArsNouveau.java | 8 + .../arsnouveau/api/spell/AbstractEffect.java | 37 ++ .../api/spell/AbstractSpellPart.java | 28 +- .../arsnouveau/client/gui/SpellTooltip.java | 10 +- .../client/gui/book/GuiSpellBook.java | 234 +++++++------ .../client/gui/buttons/CraftingButton.java | 48 ++- .../client/gui/buttons/GlyphButton.java | 12 + .../common/datagen/LangDatagen.java | 22 +- .../common/spell/effect/EffectAnimate.java | 7 + .../common/spell/effect/EffectBlink.java | 8 + .../common/spell/effect/EffectBreak.java | 12 +- .../common/spell/effect/EffectBubble.java | 12 +- .../common/spell/effect/EffectBurst.java | 15 + .../common/spell/effect/EffectColdSnap.java | 11 +- .../spell/effect/EffectConjureWater.java | 15 + .../common/spell/effect/EffectCrush.java | 11 + .../common/spell/effect/EffectCut.java | 10 +- .../common/spell/effect/EffectDelay.java | 9 + .../common/spell/effect/EffectEvaporate.java | 9 +- .../common/spell/effect/EffectExchange.java | 9 + .../common/spell/effect/EffectExplosion.java | 13 +- .../common/spell/effect/EffectFangs.java | 8 + .../common/spell/effect/EffectFell.java | 20 +- .../common/spell/effect/EffectFirework.java | 7 + .../common/spell/effect/EffectFlare.java | 15 +- .../common/spell/effect/EffectFreeze.java | 7 + .../common/spell/effect/EffectGravity.java | 11 +- .../common/spell/effect/EffectGrow.java | 7 + .../common/spell/effect/EffectHarm.java | 9 +- .../common/spell/effect/EffectHarvest.java | 7 + .../common/spell/effect/EffectHeal.java | 8 + .../common/spell/effect/EffectHex.java | 2 +- .../common/spell/effect/EffectIgnite.java | 17 + .../common/spell/effect/EffectInfuse.java | 7 + .../common/spell/effect/EffectIntangible.java | 10 + .../common/spell/effect/EffectInteract.java | 14 + .../spell/effect/EffectInvisibility.java | 3 +- .../common/spell/effect/EffectKnockback.java | 17 + .../common/spell/effect/EffectLaunch.java | 19 +- .../common/spell/effect/EffectLeap.java | 22 +- .../common/spell/effect/EffectLight.java | 11 + .../common/spell/effect/EffectLightning.java | 11 +- .../common/spell/effect/EffectLinger.java | 20 ++ .../common/spell/effect/EffectOrbit.java | 14 + .../spell/effect/EffectPhantomBlock.java | 9 + .../common/spell/effect/EffectPickup.java | 7 + .../common/spell/effect/EffectPlaceBlock.java | 7 + .../common/spell/effect/EffectPull.java | 17 + .../common/spell/effect/EffectRedstone.java | 22 +- .../common/spell/effect/EffectRewind.java | 9 + .../common/spell/effect/EffectRotate.java | 16 + .../common/spell/effect/EffectRune.java | 16 +- .../common/spell/effect/EffectSenseMagic.java | 2 +- .../common/spell/effect/EffectSmelt.java | 17 + .../common/spell/effect/EffectSnare.java | 5 +- .../spell/effect/EffectSummonDecoy.java | 7 + .../spell/effect/EffectSummonSteed.java | 10 +- .../spell/effect/EffectSummonUndead.java | 10 + .../common/spell/effect/EffectSummonVex.java | 7 + .../spell/effect/EffectSummonWolves.java | 7 + .../common/spell/effect/EffectToss.java | 12 +- .../common/spell/effect/EffectWall.java | 19 ++ .../common/spell/effect/EffectWither.java | 2 +- .../common/spell/effect/EffectWololo.java | 21 +- .../common/spell/method/MethodPantomime.java | 8 + .../common/spell/method/MethodProjectile.java | 13 +- .../common/spell/method/MethodTouch.java | 9 +- 69 files changed, 1192 insertions(+), 187 deletions(-) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index 29b7ae8144..a7ac38925f 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-11-22T17:42:19.4427397 Languages: en_us for mod: ars_nouveau -88075d83bbe635f207366f56b6caafce743838c7 assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-11-24T15:48:43.600024 Languages: en_us for mod: ars_nouveau +e87d9cae5756a85082a8ae5f95896ea9f016c1c6 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index a0aac8fc42..0efd3ff7ce 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -101,6 +101,321 @@ "ars_nouveau.armor_tiers": "Armor Tiers", "ars_nouveau.armor_upgrade": "Magic Armor Upgrade", "ars_nouveau.armor_upgrade.book_desc": "Accepts Tier %s Armor", + "ars_nouveau.augment_desc.glyph_animate_block_glyph_duration_down": "Reduces the duration of the summon.", + "ars_nouveau.augment_desc.glyph_animate_block_glyph_extend_time": "Extends the duration of the summon.", + "ars_nouveau.augment_desc.glyph_blink_glyph_amplify": "Increases the distance of the teleport.", + "ars_nouveau.augment_desc.glyph_blink_glyph_dampen": "Decreases the distance of the teleport.", + "ars_nouveau.augment_desc.glyph_bounce_glyph_amplify": "Increases the level of the effect.", + "ars_nouveau.augment_desc.glyph_bounce_glyph_duration_down": "Reduces the duration of the effect.", + "ars_nouveau.augment_desc.glyph_bounce_glyph_extend_time": "Extends the duration of the effect.", + "ars_nouveau.augment_desc.glyph_break_glyph_amplify": "Increases the harvest level.", + "ars_nouveau.augment_desc.glyph_break_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_break_glyph_dampen": "Decreases the harvest level.", + "ars_nouveau.augment_desc.glyph_break_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_break_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_break_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_break_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_break_glyph_sensitive": "Breaks blocks with Shears instead of a pickaxe.", + "ars_nouveau.augment_desc.glyph_bubble_glyph_amplify": "Increases the damage of the bubble when popped.", + "ars_nouveau.augment_desc.glyph_bubble_glyph_dampen": "Decreases the damage of the bubble when popped.", + "ars_nouveau.augment_desc.glyph_bubble_glyph_duration_down": "Decreases the duration of the bubble.", + "ars_nouveau.augment_desc.glyph_bubble_glyph_extend_time": "Increases the duration of the bubble.", + "ars_nouveau.augment_desc.glyph_burst_glyph_aoe": "Increases the target radius.", + "ars_nouveau.augment_desc.glyph_burst_glyph_dampen": "Targets an empty sphere.", + "ars_nouveau.augment_desc.glyph_burst_glyph_sensitive": "Targets blocks instead of entities.", + "ars_nouveau.augment_desc.glyph_cold_snap_glyph_amplify": "Increases damage dealt.", + "ars_nouveau.augment_desc.glyph_cold_snap_glyph_aoe": "Increases the number of ice shards.", + "ars_nouveau.augment_desc.glyph_cold_snap_glyph_dampen": "Reduces damage dealt.", + "ars_nouveau.augment_desc.glyph_cold_snap_glyph_duration_down": "Decreases the freezing duration.", + "ars_nouveau.augment_desc.glyph_cold_snap_glyph_extend_time": "Increases the freezing duration.", + "ars_nouveau.augment_desc.glyph_cold_snap_glyph_fortune": "Applies looting when killing a mob.", + "ars_nouveau.augment_desc.glyph_cold_snap_glyph_randomize": "Randomizes the damage dealt.", + "ars_nouveau.augment_desc.glyph_conjure_water_glyph_amplify": "Increases the level of the effect.", + "ars_nouveau.augment_desc.glyph_conjure_water_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_conjure_water_glyph_duration_down": "Reduces the duration of the effect.", + "ars_nouveau.augment_desc.glyph_conjure_water_glyph_extend_time": "Extends the duration of the effect.", + "ars_nouveau.augment_desc.glyph_conjure_water_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_conjure_water_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_conjure_water_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_conjure_water_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_conjure_water_glyph_sensitive": "Places water at a target entity's feet.", + "ars_nouveau.augment_desc.glyph_crush_glyph_amplify": "Increases damage dealt and the harvest level.", + "ars_nouveau.augment_desc.glyph_crush_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_crush_glyph_dampen": "Decreases damage dealt and the harvest level.", + "ars_nouveau.augment_desc.glyph_crush_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_crush_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_crush_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_crush_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_crush_glyph_sensitive": "Crush will also target items nearby.", + "ars_nouveau.augment_desc.glyph_cut_glyph_amplify": "Simulates using an Axe instead of Shears.", + "ars_nouveau.augment_desc.glyph_cut_glyph_dampen": "Reduces the damage dealt.", + "ars_nouveau.augment_desc.glyph_cut_glyph_extract": "Applies Silk Touch when breaking blocks.", + "ars_nouveau.augment_desc.glyph_cut_glyph_fortune": "Applies Fortune when breaking blocks or killing mobs.", + "ars_nouveau.augment_desc.glyph_delay_glyph_duration_down": "Decreases the duration of the delay.", + "ars_nouveau.augment_desc.glyph_delay_glyph_extend_time": "Increases the duration of the delay.", + "ars_nouveau.augment_desc.glyph_delay_glyph_randomize": "Randomizes the duration of the delay, increasing or decreasing it by 25% of the base duration.", + "ars_nouveau.augment_desc.glyph_evaporate_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_evaporate_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_evaporate_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_evaporate_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_evaporate_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_exchange_glyph_amplify": "Increases the hardness of blocks that can be harvested.", + "ars_nouveau.augment_desc.glyph_exchange_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_exchange_glyph_dampen": "Decreases the hardness of blocks that can be harvested.", + "ars_nouveau.augment_desc.glyph_exchange_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_exchange_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_exchange_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_exchange_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_explosion_glyph_amplify": "Increases damage dealt.", + "ars_nouveau.augment_desc.glyph_explosion_glyph_aoe": "Increases the size of the explosion.", + "ars_nouveau.augment_desc.glyph_explosion_glyph_dampen": "Reduces the size of the explosion and damage.", + "ars_nouveau.augment_desc.glyph_explosion_glyph_extract": "Drops all blocks instead of destroying them.", + "ars_nouveau.augment_desc.glyph_explosion_glyph_fortune": "Applies looting when killing a mob.", + "ars_nouveau.augment_desc.glyph_explosion_glyph_randomize": "Randomizes the damage dealt.", + "ars_nouveau.augment_desc.glyph_fangs_glyph_accelerate": "Increases the travel speed of the fangs.", + "ars_nouveau.augment_desc.glyph_fangs_glyph_amplify": "Increases damage dealt.", + "ars_nouveau.augment_desc.glyph_fangs_glyph_dampen": "Reduces damage dealt.", + "ars_nouveau.augment_desc.glyph_fangs_glyph_duration_down": "Decreases the duration of the fangs.", + "ars_nouveau.augment_desc.glyph_fangs_glyph_extend_time": "Increases the duration of the fangs.", + "ars_nouveau.augment_desc.glyph_fangs_glyph_fortune": "Applies looting when killing a mob.", + "ars_nouveau.augment_desc.glyph_fangs_glyph_randomize": "Randomizes the damage dealt.", + "ars_nouveau.augment_desc.glyph_fell_glyph_amplify": "Increases the hardness of blocks that can be harvested.", + "ars_nouveau.augment_desc.glyph_fell_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_fell_glyph_dampen": "Decreases the hardness of blocks that can be harvested.", + "ars_nouveau.augment_desc.glyph_fell_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_fell_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_fell_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_fell_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_firework_glyph_amplify": "Adds more Firework Stars.", + "ars_nouveau.augment_desc.glyph_firework_glyph_dampen": "Reduces damage dealt.", + "ars_nouveau.augment_desc.glyph_firework_glyph_extend_time": "Increases flight time.", + "ars_nouveau.augment_desc.glyph_firework_glyph_fortune": "Applies looting when killing a mob.", + "ars_nouveau.augment_desc.glyph_firework_glyph_randomize": "Randomizes the damage dealt.", + "ars_nouveau.augment_desc.glyph_firework_glyph_split": "Summons multiple fireworks.", + "ars_nouveau.augment_desc.glyph_flare_glyph_amplify": "Increases damage dealt.", + "ars_nouveau.augment_desc.glyph_flare_glyph_aoe": "Increases the number of cinders spawned.", + "ars_nouveau.augment_desc.glyph_flare_glyph_dampen": "Reduces damage dealt.", + "ars_nouveau.augment_desc.glyph_flare_glyph_fortune": "Applies looting when killing a mob.", + "ars_nouveau.augment_desc.glyph_flare_glyph_randomize": "Randomizes the damage dealt.", + "ars_nouveau.augment_desc.glyph_freeze_glyph_amplify": "Increases the level of the effect.", + "ars_nouveau.augment_desc.glyph_freeze_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_freeze_glyph_duration_down": "Reduces the duration of the effect.", + "ars_nouveau.augment_desc.glyph_freeze_glyph_extend_time": "Extends the duration of the effect.", + "ars_nouveau.augment_desc.glyph_freeze_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_freeze_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_freeze_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_freeze_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_freeze_glyph_sensitive": "Turns water into Frosted Ice and will vanish after a short time.", + "ars_nouveau.augment_desc.glyph_glide_glyph_amplify": "Increases the level of the effect.", + "ars_nouveau.augment_desc.glyph_glide_glyph_duration_down": "Reduces the duration of the effect.", + "ars_nouveau.augment_desc.glyph_glide_glyph_extend_time": "Extends the duration of the effect.", + "ars_nouveau.augment_desc.glyph_gravity_glyph_amplify": "Increases the falling speed of blocks and entities, or increases the effect of the potion.", + "ars_nouveau.augment_desc.glyph_gravity_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_gravity_glyph_dampen": "Reduces the falling speed of blocks and entities, or decreases the effect of the potion.", + "ars_nouveau.augment_desc.glyph_gravity_glyph_duration_down": "Reduces the duration of the effect.", + "ars_nouveau.augment_desc.glyph_gravity_glyph_extend_time": "Extends the duration of the effect.", + "ars_nouveau.augment_desc.glyph_gravity_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_gravity_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_gravity_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_gravity_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_grow_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_grow_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_grow_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_grow_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_grow_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_gust_glyph_amplify": "Increases the knockback strength.", + "ars_nouveau.augment_desc.glyph_gust_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_gust_glyph_dampen": "Decreases the knockback strength.", + "ars_nouveau.augment_desc.glyph_gust_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_gust_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_gust_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_gust_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_gust_glyph_sensitive": "Prevents blocks from being moved.", + "ars_nouveau.augment_desc.glyph_harm_glyph_amplify": "Increases damage dealt, or the level of Poison applied.", + "ars_nouveau.augment_desc.glyph_harm_glyph_dampen": "Reduces damage dealt.", + "ars_nouveau.augment_desc.glyph_harm_glyph_duration_down": "Decreases the duration of Poison applied.", + "ars_nouveau.augment_desc.glyph_harm_glyph_extend_time": "Applies Poison instead of dealing damage, increases the duration.", + "ars_nouveau.augment_desc.glyph_harm_glyph_fortune": "Applies looting when killing a mob.", + "ars_nouveau.augment_desc.glyph_harm_glyph_randomize": "Randomizes the damage dealt.", + "ars_nouveau.augment_desc.glyph_harvest_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_harvest_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_harvest_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_harvest_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_harvest_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_heal_glyph_amplify": "Increases the amount of healing done or damage dealt to undead.", + "ars_nouveau.augment_desc.glyph_heal_glyph_dampen": "Decreases the amount of healing done or damage dealt to undead.", + "ars_nouveau.augment_desc.glyph_heal_glyph_fortune": "Applies looting when killing a mob.", + "ars_nouveau.augment_desc.glyph_heal_glyph_randomize": "Randomizes the damage dealt.", + "ars_nouveau.augment_desc.glyph_hex_glyph_amplify": "Increases the level of the effect.", + "ars_nouveau.augment_desc.glyph_hex_glyph_duration_down": "Reduces the duration of the effect.", + "ars_nouveau.augment_desc.glyph_hex_glyph_extend_time": "Extends the duration of the effect.", + "ars_nouveau.augment_desc.glyph_ignite_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_ignite_glyph_duration_down": "Decreases the fire duration.", + "ars_nouveau.augment_desc.glyph_ignite_glyph_extend_time": "Increases the fire duration.", + "ars_nouveau.augment_desc.glyph_ignite_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_ignite_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_ignite_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_ignite_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_ignite_glyph_sensitive": "Creates a short-lived magic fire that will not spread or destroy blocks instead of normal fire.", + "ars_nouveau.augment_desc.glyph_infuse_glyph_aoe": "Spawns a splash potion at the location.", + "ars_nouveau.augment_desc.glyph_infuse_glyph_extend_time": "Spawns a lingering potion at the location.", + "ars_nouveau.augment_desc.glyph_intangible_glyph_amplify": "Increases the hardness of blocks that can be affected.", + "ars_nouveau.augment_desc.glyph_intangible_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_intangible_glyph_dampen": "Decreases the hardness of blocks that can be affected.", + "ars_nouveau.augment_desc.glyph_intangible_glyph_duration_down": "Reduces the duration of the effect.", + "ars_nouveau.augment_desc.glyph_intangible_glyph_extend_time": "Extends the duration of the effect.", + "ars_nouveau.augment_desc.glyph_intangible_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_intangible_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_intangible_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_intangible_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_interact_glyph_sensitive": "Will interact with your off-hand item.", + "ars_nouveau.augment_desc.glyph_invisibility_glyph_amplify": "Increases the level of the effect.", + "ars_nouveau.augment_desc.glyph_invisibility_glyph_duration_down": "Reduces the duration of the effect.", + "ars_nouveau.augment_desc.glyph_invisibility_glyph_extend_time": "Extends the duration of the effect.", + "ars_nouveau.augment_desc.glyph_launch_glyph_amplify": "Increases the knockup amount.", + "ars_nouveau.augment_desc.glyph_launch_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_launch_glyph_dampen": "Decreases the knockup amount.", + "ars_nouveau.augment_desc.glyph_launch_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_launch_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_launch_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_launch_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_launch_glyph_sensitive": "Prevents blocks from being moved.", + "ars_nouveau.augment_desc.glyph_leap_glyph_amplify": "Increases the velocity.", + "ars_nouveau.augment_desc.glyph_leap_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_leap_glyph_dampen": "Decreases the velocity.", + "ars_nouveau.augment_desc.glyph_leap_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_leap_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_leap_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_leap_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_leap_glyph_sensitive": "Prevents blocks from being moved.", + "ars_nouveau.augment_desc.glyph_light_glyph_amplify": "Increases the light level.", + "ars_nouveau.augment_desc.glyph_light_glyph_dampen": "Decreases the light level.", + "ars_nouveau.augment_desc.glyph_light_glyph_duration_down": "The light will last for a shorter duration. Affects the duration of Glowing and Night Vision.", + "ars_nouveau.augment_desc.glyph_light_glyph_extend_time": "The light will instead be temporary, lasting longer. Affects the duration of Glowing and Night Vision.", + "ars_nouveau.augment_desc.glyph_light_glyph_sensitive": "Allows Glowing to be applied to the caster and applies the spell color to the Glowing effect.", + "ars_nouveau.augment_desc.glyph_lightning_glyph_amplify": "Increases the damage of the lightning bolt.", + "ars_nouveau.augment_desc.glyph_lightning_glyph_dampen": "Decreases the damage of the lightning bolt.", + "ars_nouveau.augment_desc.glyph_lightning_glyph_duration_down": "Decreases the duration of the lightning bolt.", + "ars_nouveau.augment_desc.glyph_lightning_glyph_extend_time": "Increases the duration of the lightning bolt.", + "ars_nouveau.augment_desc.glyph_linger_glyph_accelerate": "Casts spells faster.", + "ars_nouveau.augment_desc.glyph_linger_glyph_aoe": "Increases the target area.", + "ars_nouveau.augment_desc.glyph_linger_glyph_dampen": "Ignores gravity.", + "ars_nouveau.augment_desc.glyph_linger_glyph_decelerate": "Casts spells slower.", + "ars_nouveau.augment_desc.glyph_linger_glyph_duration_down": "Decreases the duration of the effect.", + "ars_nouveau.augment_desc.glyph_linger_glyph_extend_time": "Increases the duration of the effect.", + "ars_nouveau.augment_desc.glyph_linger_glyph_sensitive": "Targets blocks instead of entities.", + "ars_nouveau.augment_desc.glyph_orbit_glyph_accelerate": "Increases the speed of the orbiting projectiles.", + "ars_nouveau.augment_desc.glyph_orbit_glyph_aoe": "Increases the radius of the orbiting projectiles.", + "ars_nouveau.augment_desc.glyph_orbit_glyph_decelerate": "Decreases the speed of the orbiting projectiles.", + "ars_nouveau.augment_desc.glyph_orbit_glyph_duration_down": "Decreases the duration of the orbiting projectiles.", + "ars_nouveau.augment_desc.glyph_orbit_glyph_extend_time": "Increases the duration of the orbiting projectiles.", + "ars_nouveau.augment_desc.glyph_orbit_glyph_pierce": "Allows the orbiting projectiles to pierce through enemies.", + "ars_nouveau.augment_desc.glyph_orbit_glyph_sensitive": "Allows the orbiting projectiles to hit blocks.", + "ars_nouveau.augment_desc.glyph_orbit_glyph_split": "Increases the number of orbiting projectiles.", + "ars_nouveau.augment_desc.glyph_pantomime_glyph_amplify": "Increases the target distance.", + "ars_nouveau.augment_desc.glyph_pantomime_glyph_dampen": "Reduces the target distance.", + "ars_nouveau.augment_desc.glyph_pantomime_glyph_sensitive": "Highlights the selected block.", + "ars_nouveau.augment_desc.glyph_phantom_block_glyph_amplify": "Makes the block permanent.", + "ars_nouveau.augment_desc.glyph_phantom_block_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_phantom_block_glyph_duration_down": "Decreases the duration of the temporary block.", + "ars_nouveau.augment_desc.glyph_phantom_block_glyph_extend_time": "Increases the duration of the temporary block.", + "ars_nouveau.augment_desc.glyph_phantom_block_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_phantom_block_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_phantom_block_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_phantom_block_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_pickup_glyph_aoe": "Increases the radius of the pickup effect.", + "ars_nouveau.augment_desc.glyph_place_block_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_place_block_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_place_block_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_place_block_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_place_block_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_projectile_glyph_accelerate": "Projectiles will move faster.", + "ars_nouveau.augment_desc.glyph_projectile_glyph_decelerate": "Projectiles will move slower.", + "ars_nouveau.augment_desc.glyph_projectile_glyph_pierce": "Projectiles will pierce through enemies and blocks an additional time.", + "ars_nouveau.augment_desc.glyph_projectile_glyph_sensitive": "Projectiles will hit plants and other materials that do not block motion.", + "ars_nouveau.augment_desc.glyph_projectile_glyph_split": "Creates multiple projectiles.", + "ars_nouveau.augment_desc.glyph_pull_glyph_amplify": "Increases the velocity.", + "ars_nouveau.augment_desc.glyph_pull_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_pull_glyph_dampen": "Decreases the velocity.", + "ars_nouveau.augment_desc.glyph_pull_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_pull_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_pull_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_pull_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_pull_glyph_sensitive": "Prevents blocks from being pulled.", + "ars_nouveau.augment_desc.glyph_redstone_signal_glyph_amplify": "Increases the power of the redstone signal.", + "ars_nouveau.augment_desc.glyph_redstone_signal_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_redstone_signal_glyph_dampen": "Decreases the power of the redstone signal.", + "ars_nouveau.augment_desc.glyph_redstone_signal_glyph_duration_down": "Decreases the duration of the redstone signal.", + "ars_nouveau.augment_desc.glyph_redstone_signal_glyph_extend_time": "Increases the duration of the redstone signal.", + "ars_nouveau.augment_desc.glyph_redstone_signal_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_redstone_signal_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_redstone_signal_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_redstone_signal_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_redstone_signal_glyph_sensitive": "Sets the target block to a redstone power source, powering itself and its neighbors.", + "ars_nouveau.augment_desc.glyph_rotate_glyph_amplify": "Increases rotations clockwise.", + "ars_nouveau.augment_desc.glyph_rotate_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_rotate_glyph_dampen": "Increases rotations counter-clockwise.", + "ars_nouveau.augment_desc.glyph_rotate_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_rotate_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_rotate_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_rotate_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_rotate_glyph_sensitive": "Rotates the block on a different axis or forces an entity to rotate their head.", + "ars_nouveau.augment_desc.glyph_rune_glyph_sensitive": "The rune will use the owner's inventory for pickup and usage.", + "ars_nouveau.augment_desc.glyph_sense_magic_glyph_amplify": "Increases the level of the effect.", + "ars_nouveau.augment_desc.glyph_sense_magic_glyph_duration_down": "Reduces the duration of the effect.", + "ars_nouveau.augment_desc.glyph_sense_magic_glyph_extend_time": "Extends the duration of the effect.", + "ars_nouveau.augment_desc.glyph_slowfall_glyph_amplify": "Increases the level of the effect.", + "ars_nouveau.augment_desc.glyph_slowfall_glyph_duration_down": "Reduces the duration of the effect.", + "ars_nouveau.augment_desc.glyph_slowfall_glyph_extend_time": "Extends the duration of the effect.", + "ars_nouveau.augment_desc.glyph_smelt_glyph_amplify": "Allows smelting of blocks with higher hardness, or blasting recipes when targeting items.", + "ars_nouveau.augment_desc.glyph_smelt_glyph_aoe": "Increases the radius of targeted blocks.", + "ars_nouveau.augment_desc.glyph_smelt_glyph_dampen": "Uses smoking recipes instead of smelting recipes.", + "ars_nouveau.augment_desc.glyph_smelt_glyph_extract": "Applies silk touch when breaking a block.", + "ars_nouveau.augment_desc.glyph_smelt_glyph_fortune": "Applies fortune when breaking a block.", + "ars_nouveau.augment_desc.glyph_smelt_glyph_pierce": "Increases the depth of targeted blocks.", + "ars_nouveau.augment_desc.glyph_smelt_glyph_randomize": "Adds a chance to not target a block.", + "ars_nouveau.augment_desc.glyph_smelt_glyph_sensitive": "Only smelts items, not blocks.", + "ars_nouveau.augment_desc.glyph_snare_glyph_amplify": "Increases the level of the effect.", + "ars_nouveau.augment_desc.glyph_snare_glyph_duration_down": "Reduces the duration of the effect.", + "ars_nouveau.augment_desc.glyph_snare_glyph_extend_time": "Extends the duration of the effect.", + "ars_nouveau.augment_desc.glyph_summon_decoy_glyph_duration_down": "Reduces the duration of the summon.", + "ars_nouveau.augment_desc.glyph_summon_decoy_glyph_extend_time": "Extends the duration of the summon.", + "ars_nouveau.augment_desc.glyph_summon_steed_glyph_aoe": "Increases the number of horses summoned.", + "ars_nouveau.augment_desc.glyph_summon_steed_glyph_duration_down": "Reduces the duration of the summon.", + "ars_nouveau.augment_desc.glyph_summon_steed_glyph_extend_time": "Extends the duration of the summon.", + "ars_nouveau.augment_desc.glyph_summon_undead_glyph_amplify": "Increases the summoned skeletons' weapon quality.", + "ars_nouveau.augment_desc.glyph_summon_undead_glyph_duration_down": "Reduces the duration of the summon.", + "ars_nouveau.augment_desc.glyph_summon_undead_glyph_extend_time": "Extends the duration of the summon.", + "ars_nouveau.augment_desc.glyph_summon_undead_glyph_pierce": "Changes the summoned skeletons to archers.", + "ars_nouveau.augment_desc.glyph_summon_undead_glyph_split": "Increases the number of summoned skeletons.", + "ars_nouveau.augment_desc.glyph_summon_vex_glyph_duration_down": "Reduces the duration of the summon.", + "ars_nouveau.augment_desc.glyph_summon_vex_glyph_extend_time": "Extends the duration of the summon.", + "ars_nouveau.augment_desc.glyph_summon_wolves_glyph_duration_down": "Reduces the duration of the summon.", + "ars_nouveau.augment_desc.glyph_summon_wolves_glyph_extend_time": "Extends the duration of the summon.", + "ars_nouveau.augment_desc.glyph_toss_glyph_amplify": "Doubles the stack size.", + "ars_nouveau.augment_desc.glyph_toss_glyph_dampen": "Halves the stack size.", + "ars_nouveau.augment_desc.glyph_toss_glyph_extract": "Extracts the item from the caster's inventory.", + "ars_nouveau.augment_desc.glyph_toss_glyph_randomize": "Randomizes the stack selection.", + "ars_nouveau.augment_desc.glyph_touch_glyph_sensitive": "Can target air and fluids.", + "ars_nouveau.augment_desc.glyph_wall_glyph_accelerate": "Casts spells faster.", + "ars_nouveau.augment_desc.glyph_wall_glyph_aoe": "Increases the target area.", + "ars_nouveau.augment_desc.glyph_wall_glyph_dampen": "Ignores gravity.", + "ars_nouveau.augment_desc.glyph_wall_glyph_decelerate": "Casts spells slower.", + "ars_nouveau.augment_desc.glyph_wall_glyph_duration_down": "Decreases the duration of the effect.", + "ars_nouveau.augment_desc.glyph_wall_glyph_extend_time": "Increases the duration of the effect.", + "ars_nouveau.augment_desc.glyph_wall_glyph_sensitive": "Targets blocks instead of entities.", + "ars_nouveau.augment_desc.glyph_wind_shear_glyph_amplify": "Increases damage dealt.", + "ars_nouveau.augment_desc.glyph_wind_shear_glyph_dampen": "Reduces damage dealt.", + "ars_nouveau.augment_desc.glyph_wind_shear_glyph_fortune": "Applies looting when killing a mob.", + "ars_nouveau.augment_desc.glyph_wind_shear_glyph_randomize": "Randomizes the damage dealt.", + "ars_nouveau.augment_desc.glyph_wither_glyph_amplify": "Increases the level of the effect.", + "ars_nouveau.augment_desc.glyph_wither_glyph_duration_down": "Reduces the duration of the effect.", + "ars_nouveau.augment_desc.glyph_wither_glyph_extend_time": "Extends the duration of the effect.", + "ars_nouveau.augment_desc.rewind_glyph_duration_down": "Decreases the duration to rewind.", + "ars_nouveau.augment_desc.rewind_glyph_extend_time": "Increases the duration to rewind.", + "ars_nouveau.augment_desc.wololo_glyph_randomize": "Randomizes the color of the dye used.", + "ars_nouveau.augment_desc.wololo_glyph_sensitive": "Dyes the targets armor.", + "ars_nouveau.augmenting": "Augmenting %s:", "ars_nouveau.automation": "Automation", "ars_nouveau.automation_desc": "Magical Automation", "ars_nouveau.binding_inventories": "Binding Inventories", @@ -221,7 +536,7 @@ "ars_nouveau.glyph_desc.glyph_aoe": "Spells will affect a larger area around a targeted block.", "ars_nouveau.glyph_desc.glyph_blink": "Teleports the caster to a location. If an entity is hit and the caster is holding a Warp Scroll in the offhand, the entity will be warped to the location on the Warp Scroll. When used on Self, the caster blinks forward. Spell Turrets and Runes can warp entities using Warp Scrolls from adjacent inventories without consuming the scroll.", "ars_nouveau.glyph_desc.glyph_bounce": "Gives players the Bounce effect, causing them to bounce upwards upon falling. Amplification of Bounce will preserve additional forward facing motion per bounce.", - "ars_nouveau.glyph_desc.glyph_break": "A spell you start with. Breaks blocks of an average hardness. Can be amplified to increase the harvest level. Sensitive will simulate breaking blocks with Shears instead of a pickaxe.", + "ars_nouveau.glyph_desc.glyph_break": "Breaks blocks of an average hardness. Can be amplified to increase the harvest level. Sensitive will simulate breaking blocks with Shears instead of a pickaxe.", "ars_nouveau.glyph_desc.glyph_bubble": "Captures mobs and entities it touches, causing them to float upwards. If the bubble has been alive for at least one tick, damaging the entity trapped in the bubble will cause it to pop, dealing bonus damage to the entity inside. Extend time and amplify can be used to increase the duration and damage of the bubble.", "ars_nouveau.glyph_desc.glyph_burst": "Resolves the spell in a spherical area around the target. Augment with Sensitive to target blocks instead of entities and Dampen to make an empty sphere. Augment with AOE to increase the radius. ", "ars_nouveau.glyph_desc.glyph_cold_snap": "Causes wet, slowed, or freezing entities to take a burst of damage and erupt into falling ice. Falling ice will slow and damage nearby entities. Can also be used to erupt a block of ice instead. Falling blocks of ice can be manipulated with the Focus of Block Shaping. Entities afflicted with Freezing will be set to the maximum freeze level immediately.", diff --git a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java index cd2ee1ef17..31448ec6fd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java +++ b/src/main/java/com/hollingsworth/arsnouveau/ArsNouveau.java @@ -11,6 +11,7 @@ import com.hollingsworth.arsnouveau.common.event.BreezeEvent; import com.hollingsworth.arsnouveau.common.items.RitualTablet; import com.hollingsworth.arsnouveau.common.network.Networking; +import com.hollingsworth.arsnouveau.common.util.Log; import com.hollingsworth.arsnouveau.common.world.Terrablender; import com.hollingsworth.arsnouveau.setup.ModSetup; import com.hollingsworth.arsnouveau.setup.config.Config; @@ -42,6 +43,8 @@ import net.neoforged.neoforge.common.world.chunk.TicketController; import net.neoforged.neoforge.event.server.ServerStartedEvent; +import java.util.ArrayList; +import java.util.List; import java.util.function.Supplier; @Mod(ArsNouveau.MODID) @@ -55,6 +58,8 @@ public class ArsNouveau { public static boolean sodiumLoaded = false; public static boolean patchouliLoaded = false; + public static List postLoadWarnings = new ArrayList<>(); + public static TicketController ticketController = new TicketController(ArsNouveau.prefix("ticket_controller"), (level, ticketHelper) -> { ticketHelper.getEntityTickets().forEach(((uuid, chunk) -> { if (level.getEntity(uuid) == null) @@ -153,6 +158,9 @@ public void postModLoadEvent(final FMLLoadCompleteEvent event) { } }); + for(String warning : postLoadWarnings){ + Log.getLogger().error(warning); + } } public void clientSetup(final FMLClientSetupEvent event) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractEffect.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractEffect.java index e05d1b0ead..c590f4496e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractEffect.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractEffect.java @@ -178,6 +178,17 @@ public void addGenericDouble(ModConfigSpec.Builder builder, double val, String c GENERIC_DOUBLE = builder.comment(comment).defineInRange(path, val, 0.0, Double.MAX_VALUE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + if(this instanceof IPotionEffect){ + addPotionAugmentDescriptions(map); + } + if(this instanceof IDamageEffect){ + addDamageAugmentDescriptions(map); + } + } + public void addDefaultPotionConfig(ModConfigSpec.Builder builder) { addPotionConfig(builder, 30); addExtendTimeConfig(builder, 8); @@ -188,7 +199,33 @@ protected Set getPotionAugments() { AugmentAmplify.INSTANCE); } + protected void addBlockAoeAugmentDescriptions(Map map){ + map.put(AugmentAOE.INSTANCE, "Increases the radius of targeted blocks."); + map.put(AugmentPierce.INSTANCE, "Increases the depth of targeted blocks."); + map.put(AugmentRandomize.INSTANCE, "Adds a chance to not target a block."); + map.put(AugmentFortune.INSTANCE, "Applies fortune when breaking a block."); + map.put(AugmentExtract.INSTANCE, "Applies silk touch when breaking a block."); + } + + protected void addDamageAugmentDescriptions(Map map){ + map.put(AugmentAmplify.INSTANCE, "Increases damage dealt."); + map.put(AugmentDampen.INSTANCE, "Reduces damage dealt."); + map.put(AugmentFortune.INSTANCE, "Applies looting when killing a mob."); + map.put(AugmentRandomize.INSTANCE, "Randomizes the damage dealt."); + } + + protected void addPotionAugmentDescriptions(Map map){ + map.put(AugmentExtendTime.INSTANCE, "Extends the duration of the effect."); + map.put(AugmentDurationDown.INSTANCE, "Reduces the duration of the effect."); + map.put(AugmentAmplify.INSTANCE, "Increases the level of the effect."); + } + protected Set getSummonAugments() { return augmentSetOf(AugmentExtendTime.INSTANCE, AugmentDurationDown.INSTANCE); } + + protected void addSummonAugmentDescriptions(Map map){ + map.put(AugmentExtendTime.INSTANCE, "Extends the duration of the summon."); + map.put(AugmentDurationDown.INSTANCE, "Reduces the duration of the summon."); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java index 5fa9ad3b2d..42fd0361f9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java @@ -9,6 +9,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; +import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; @@ -69,6 +70,8 @@ public ResourceLocation getRegistryName() { */ public Set compatibleAugments = ConcurrentHashMap.newKeySet(); + public Map augmentDescriptions = new ConcurrentHashMap<>(); + /** * A wrapper for the list of glyphs that cannot be used with this glyph. Parsed from configs. */ @@ -86,6 +89,18 @@ public AbstractSpellPart(ResourceLocation registryName, String name) { spellSchools.add(spellSchool); } compatibleAugments.addAll(getCompatibleAugments()); + Map map = new ConcurrentHashMap<>(); + this.addAugmentDescriptions(map); + for(AbstractAugment augment : map.keySet()){ + augmentDescriptions.put(augment, Component.translatable(map.get(augment))); + } + if(!FMLEnvironment.production){ + for(AbstractAugment augment : compatibleAugments){ + if(!augmentDescriptions.containsKey(augment)){ + ArsNouveau.postLoadWarnings.add("Glyph " + registryName + " is missing a description for augment " + augment.getRegistryName()); + } + } + } } public void onContextCanceled(SpellContext context) { @@ -145,7 +160,18 @@ public Glyph getGlyph() { * @see AbstractSpellPart#augmentSetOf(AbstractAugment...) for easy syntax to make the Set. * This should not be accessed directly, but can be overridden. */ - protected abstract@NotNull Set getCompatibleAugments(); + protected abstract @NotNull Set getCompatibleAugments(); + + /** + * Return the Augment -> string mappings used for datagen. + */ + public void addAugmentDescriptions(Map map){ + + } + + public Component getAugmentLangKey(AbstractAugment augment){ + return Component.translatable("ars_nouveau.augment_desc." + registryName.getPath() + "_" + augment.getRegistryName().getPath()); + } /** * Syntax support to easily make a set for {@link AbstractSpellPart#getCompatibleAugments()} diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java index 3fe724d98e..ee6b0f3aa7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/SpellTooltip.java @@ -29,12 +29,13 @@ public SpellTooltipRenderer(SpellTooltip pSpellTooltip) { @Override public int getHeight() { - return showName ? 28 : 20; + + return (showName ? 28 : 20) + (spellCaster.getSpell().size() / 10) * 16; } @Override public int getWidth(@NotNull Font pFont) { - return 4 + spellCaster.getSpell().size() * 16; + return 4 + Math.min(spellCaster.getSpell().size(), 10) * 16; } @Override @@ -49,9 +50,10 @@ public void renderText(@NotNull Font pFont, int pX, int pY, @NotNull Matrix4f pM @Override public void renderImage(@NotNull Font pFont, int pX, int pY, @NotNull GuiGraphics pGuiGraphics) { var spell = spellCaster.getSpell(); - for (int i = 0, recipeSize = spell.size(); i < recipeSize; i++) { + for (int i = 0; i < spell.size(); i++) { + int yOffset = i / 10; AbstractSpellPart part = spell.get(i); - RenderUtils.drawSpellPart(part, pGuiGraphics, pX + i * 16, pY + (showName ? 10 : 0), 16, false); + RenderUtils.drawSpellPart(part, pGuiGraphics, pX + (i % 10) * 16, pY + (showName ? 10 : 0) + yOffset * 16, 16, false); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index 4b117d08f4..c4cf8f9c6c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -95,6 +95,8 @@ public class GuiSpellBook extends BaseBook { public PageButton prevGlyphButton; public int spellWindowOffset = 0; public int bonusSlots = 0; + public String spellname = ""; + public AbstractCaster caster; public GuiSpellBook(InteractionHand hand) { super(); @@ -125,24 +127,20 @@ public GuiSpellBook(InteractionHand hand) { ArsNouveauAPI.getInstance().getSpellCraftingSpellValidator(), new GlyphMaxTierValidator(tier) ); + caster = SpellCasterRegistry.from(bookStack); + this.selectedSpellSlot = caster.getCurrentSlot(); + this.spellname = caster.getSpellName(caster.getCurrentSlot()); + List recipe = SpellCasterRegistry.from(bookStack).getSpell(selectedSpellSlot).mutable().recipe; + spell = new ArrayList<>(recipe); } @Override public void init() { super.init(); - AbstractCaster caster = SpellCasterRegistry.from(bookStack); - int selectedSlot = caster.getCurrentSlot(); - craftingCells = new ArrayList<>(); - for (int i = 0; i < numLinks; i++) { - int offset = i >= 5 ? 14 : 0; - CraftingButton cell = new CraftingButton(bookLeft + 19 + 24 * i + offset, bookBottom - 47, this::onCraftingSlotClick, i); - addRenderableWidget(cell); - craftingCells.add(cell); - } - updateCraftingSlots(selectedSlot); + resetCraftingCells(); - layoutAllGlyphs(0); + layoutAllGlyphs(page); createSpellButton = addRenderableWidget(new CreateSpellButton(bookRight - 71, bookBottom - 13, this::onCreateClick, () -> !this.validationErrors.isEmpty())); addRenderableWidget(new GuiImageButton(bookRight - 126, bookBottom - 13, 0, 0, 41, 12, 41, 12, "textures/gui/clear_icon.png", this::clear)); @@ -160,7 +158,7 @@ public void init() { return null; }; - spell_name.setValue(caster.getSpellName(caster.getCurrentSlot())); + spell_name.setValue(spellname); if (spell_name.getValue().isEmpty()) spell_name.setSuggestion(Component.translatable("ars_nouveau.spell_book_gui.spell_name").getString()); @@ -170,12 +168,11 @@ public void init() { addRenderableWidget(spell_name); addRenderableWidget(searchBar); // Add spell slots - for (int i = 0; i < numLinks; i++) { + for (int i = 0; i < 10; i++) { String name = caster.getSpellName(i); GuiSpellSlot slot = new GuiSpellSlot(bookLeft + 281, bookTop + 1 + 15 * (i + 1), i, name, this::onSlotChange); - if (i == selectedSlot) { + if (i == selectedSpellSlot) { selected_slot = slot; - selectedSpellSlot = i; slot.isSelected = true; } addRenderableWidget(slot); @@ -208,9 +205,6 @@ public void init() { previousButton.active = false; previousButton.visible = false; - List recipe = SpellCasterRegistry.from(bookStack).getSpell(selectedSlot).mutable().recipe; - spell = new ArrayList<>(recipe); - //infinite spells if (getExtraGlyphSlots() > 0) { this.nextGlyphButton = addRenderableWidget(new PageButton(bookRight - 25, bookBottom - 30, true, i -> updateWindowOffset(spellWindowOffset + 1), true)); @@ -296,14 +290,6 @@ private void layoutAllGlyphs(int page) { } } - public void resetPageState() { - updateNextPageButtons(); - this.page = 0; - previousButton.active = false; - previousButton.visible = false; - layoutAllGlyphs(page); - validate(); - } public void onSearchChanged(String str) { if (str.equals(previousString)) @@ -340,7 +326,12 @@ public void onSearchChanged(String str) { } } } - resetPageState(); + updateNextPageButtons(); + this.page = 0; + previousButton.active = false; + previousButton.visible = false; + layoutAllGlyphs(page); + validate(); } public void updateNextPageButtons() { @@ -454,33 +445,31 @@ public void onCraftingSlotClick(Button button) { public void onGlyphClick(Button button) { GlyphButton button1 = (GlyphButton) button; + if(!button1.validationErrors.isEmpty()){ + return; + } + for (CraftingButton b : craftingCells.subList(spellWindowOffset, Math.min(spellWindowOffset + 10, craftingCells.size()))) { + if(b.getAbstractSpellPart() != null){ + continue; + } - if (button1.validationErrors.isEmpty()) { - for (CraftingButton b : craftingCells) { - if (b.getAbstractSpellPart() == null) { - b.setAbstractSpellPart(button1.abstractSpellPart); - - if (b.slotNum >= spell.size()) { - - spell.add(button1.abstractSpellPart); - - } else { - - spell.set(b.slotNum, button1.abstractSpellPart); - - } + b.setAbstractSpellPart(button1.abstractSpellPart); - if (nextGlyphButton != null) updateNextGlyphArrow(); - validate(); - return; - } + if (b.slotNum >= spell.size()) { + spell.add(button1.abstractSpellPart); + } else { + spell.set(b.slotNum, button1.abstractSpellPart); } + + if (nextGlyphButton != null) updateNextGlyphArrow(); + validate(); + return; } } private void updateNextGlyphArrow() { - if (spellWindowOffset >= getExtraGlyphSlots() || spellWindowOffset >= spell.size() - 1) { + if (spellWindowOffset >= getExtraGlyphSlots() || spellWindowOffset > spell.size() - 1) { nextGlyphButton.active = false; nextGlyphButton.visible = false; } else { @@ -494,9 +483,10 @@ public void onSlotChange(Button button) { this.selected_slot = (GuiSpellSlot) button; this.selected_slot.isSelected = true; this.selectedSpellSlot = this.selected_slot.slotNum; - updateCraftingSlots(this.selectedSpellSlot); - spell_name.setValue(SpellCasterRegistry.from(bookStack).getSpellName(selectedSpellSlot)); - this.spell = new ArrayList<>(SpellCasterRegistry.from(bookStack).getSpell(selectedSpellSlot).unsafeList()); + this.spellname = caster.getSpellName(selectedSpellSlot); + spell_name.setValue(spellname); + this.spell = new ArrayList<>(caster.getSpell(selectedSpellSlot).unsafeList()); + resetCraftingCells(); updateWindowOffset(0); //includes validation } @@ -518,33 +508,40 @@ public boolean charTyped(char pCodePoint, int pModifiers) { return super.charTyped(pCodePoint, pModifiers); } - public void updateCraftingSlots(int bookSlot) { - //Crafting slots - Spell recipe = SpellCasterRegistry.from(bookStack).getSpell(bookSlot); - for (int i = 0; i < craftingCells.size(); i++) { - CraftingButton slot = craftingCells.get(i); - slot.clear(); - if (i < recipe.size()) { - slot.setAbstractSpellPart(recipe.get(i)); + public void resetCraftingCells(){ + for(CraftingButton button : craftingCells){ + removeWidget(button); + } + craftingCells = new ArrayList<>(); + for(int i = 0; i < numLinks + getExtraGlyphSlots(); i++){ + CraftingButton cell = new CraftingButton(0, 0, this::onCraftingSlotClick, i); + addRenderableWidget(cell); + craftingCells.add(cell); + cell.visible = false; + AbstractSpellPart spellPart = i < this.spell.size() ? this.spell.get(i) : null; + cell.setAbstractSpellPart(spellPart); + } + + for(int i = 0; i < 10; i++){ + int placementOffset = i % 10; + int offset = placementOffset >= 5 ? 14 : 0; + + if(i + spellWindowOffset >= craftingCells.size()){ + break; } + var cell = craftingCells.get(spellWindowOffset + i); + cell.setX(bookLeft + 19 + 24 * placementOffset + offset); + cell.setY(bookBottom - 47); + cell.visible = true; } } public void updateWindowOffset(int offset) { //do nothing if the spell is empty and nextGlyphButton is clicked int extraSlots = getExtraGlyphSlots(); - if (extraSlots > 0) + if (extraSlots > 0) { if (spellWindowOffset != 0 || offset <= 0 || !spell.stream().allMatch(Objects::isNull)) { this.spellWindowOffset = Mth.clamp(offset, 0, extraSlots); - for (int i = 0; i < 10; i++) { - var cell = craftingCells.get(i); - cell.slotNum = spellWindowOffset + i; - if (spellWindowOffset + i >= spell.size() || spell.get(spellWindowOffset + i) == null) { - cell.clear(); - } else { - cell.setAbstractSpellPart(spell.get(spellWindowOffset + i)); - } - } if (spellWindowOffset <= 0) { prevGlyphButton.active = false; prevGlyphButton.visible = false; @@ -555,18 +552,12 @@ public void updateWindowOffset(int offset) { } updateNextGlyphArrow(); } + } validate(); } public void clear(Button button) { - boolean allWereEmpty = true; - - for (CraftingButton slot : craftingCells) { - if (slot.getAbstractSpellPart() != null) { - allWereEmpty = false; - } - slot.clear(); - } + boolean allWereEmpty = spell.isEmpty(); spell.clear(); if (allWereEmpty) spell_name.setValue(""); @@ -671,66 +662,71 @@ private int getCurrentManaCost() { * Validates the current spell as well as the potential for adding each glyph. */ private void validate() { - int firstBlankSlot = -1; + resetCraftingCells(); - int offset = spellWindowOffset;//craftingCells.get(0).slotNum; - List recipe = new LinkedList<>(spell.subList(0, Math.min(offset, spell.size()))); // Reset the crafting slots and build the recipe to validate - for (int i = 0; i < craftingCells.size(); i++) { - CraftingButton b = craftingCells.get(i); + for (CraftingButton b : craftingCells) { b.validationErrors.clear(); - if (b.getAbstractSpellPart() == null) { - // The validator can cope with null. Insert it to preserve glyph indices. - recipe.add(null); - // Also note where we found the first blank. Used later for the glyph buttons. - if (firstBlankSlot < 0) firstBlankSlot = offset + i; - } else { - recipe.add(b.getAbstractSpellPart()); - } } - //if there are more glyphs than slots, add them to the end of the recipe for validation - recipe.addAll(spell.subList(Math.min(spell.size(), craftingCells.get(craftingCells.size() - 1).slotNum), spell.size())); // Validate the crafting slots - List errors = spellValidator.validate(recipe); + List errors = spellValidator.validate(spell); for (SpellValidationError ve : errors) { - // Attach errors to the corresponding crafting slot (when applicable) - if (ve.getPosition() >= offset && ve.getPosition() - offset < craftingCells.size()) { - CraftingButton b = craftingCells.get(ve.getPosition() - offset); - b.validationErrors.add(ve); - } + CraftingButton b = craftingCells.get(ve.getPosition()); + b.validationErrors.add(ve); } this.validationErrors = errors; - // Validate the glyph buttons - // Trim the spell to the first gap, if there is a gap - if (firstBlankSlot >= 0) { - recipe = new ArrayList<>(recipe.subList(0, firstBlankSlot)); + for(CraftingButton craftingButton : craftingCells){ + craftingButton.setAugmenting(null); } - for (GlyphButton button : glyphButtons) { - validateGlyphButton(recipe, button); + AbstractSpellPart parent = null; + for(int i = 0; i < Math.max(spell.size(), craftingCells.size()); i++){ + AbstractSpellPart part = i < spell.size() ? spell.get(i) : null; + if(!(part instanceof AbstractAugment)) { + parent = part; + } + for(CraftingButton craftingButton : craftingCells){ + if(craftingButton.slotNum == i){ + craftingButton.setAugmenting(parent); + } + } + } + // Find the last effect before an empty space + AbstractSpellPart lastEffect = null; + int lastGlyphNoGap = 0; + for(int i = 0; i < spell.size(); i++){ + AbstractSpellPart effect = spell.get(i); + if(effect == null){ + break; + } + if(!(effect instanceof AbstractAugment)){ + lastEffect = effect; + } + lastGlyphNoGap = i; } - //update mana cache - currentCostCache = getCurrentManaCost(); - maxManaCache = ManaUtil.getMaxMana(Minecraft.getInstance().player); - } - - private void validateGlyphButton(List recipe, GlyphButton glyphButton) { - // Start from a clean slate - glyphButton.validationErrors.clear(); + List slicedSpell = spell.subList(0, lastGlyphNoGap + 1); + // Set validation errors on all of the glyph buttons + for (GlyphButton glyphButton : glyphButtons) { + glyphButton.validationErrors.clear(); + glyphButton.augmentingParent = lastEffect; + // Simulate adding the glyph to the current spell + slicedSpell.add(GlyphRegistry.getSpellpartMap().get(glyphButton.abstractSpellPart.getRegistryName())); - // Simulate adding the glyph to the current spell - recipe.add(GlyphRegistry.getSpellpartMap().get(glyphButton.abstractSpellPart.getRegistryName())); + // Filter the errors to ones referring to the simulated glyph + glyphButton.validationErrors.addAll( + spellValidator.validate(slicedSpell).stream() + .filter(ve -> ve.getPosition() >= slicedSpell.size() - 1).toList() + ); - // Filter the errors to ones referring to the simulated glyph - glyphButton.validationErrors.addAll( - spellValidator.validate(recipe).stream() - .filter(ve -> ve.getPosition() >= recipe.size() - 1).toList() - ); + // Remove the simulated glyph to make room for the next one + slicedSpell.removeLast(); + } - // Remove the simulated glyph to make room for the next one - recipe.remove(recipe.size() - 1); + //update mana cache + currentCostCache = getCurrentManaCost(); + maxManaCache = ManaUtil.getMaxMana(Minecraft.getInstance().player); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java index 20ba01c87e..cf99ce8dec 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/CraftingButton.java @@ -1,20 +1,29 @@ package com.hollingsworth.arsnouveau.client.gui.buttons; +import com.hollingsworth.arsnouveau.api.spell.AbstractAugment; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; +import com.hollingsworth.arsnouveau.api.spell.SpellSchool; import com.hollingsworth.arsnouveau.api.spell.SpellValidationError; import com.hollingsworth.arsnouveau.client.gui.utils.RenderUtils; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.ModList; +import net.neoforged.neoforgespi.language.IModInfo; import javax.annotation.Nullable; import java.util.LinkedList; import java.util.List; public class CraftingButton extends GuiImageButton { - private AbstractSpellPart abstractSpellPart; + protected AbstractSpellPart abstractSpellPart; + protected AbstractSpellPart augmentedParent; public List validationErrors; public int slotNum; @@ -22,12 +31,14 @@ public CraftingButton(int x, int y, Button.OnPress onPress, int slotNum) { super(x, y, 0, 0, 22, 20, 22, 20, "textures/gui/spell_glyph_slot.png", onPress); this.validationErrors = new LinkedList<>(); abstractSpellPart = null; + augmentedParent = null; this.slotNum = slotNum; } public void clear() { this.validationErrors.clear(); this.abstractSpellPart = null; + this.augmentedParent = null; } public @Nullable AbstractSpellPart getAbstractSpellPart() { @@ -38,6 +49,10 @@ public void setAbstractSpellPart(AbstractSpellPart abstractSpellPart) { this.abstractSpellPart = abstractSpellPart; } + public void setAugmenting(@Nullable AbstractSpellPart parent) { + this.augmentedParent = parent; + } + @Override protected void renderWidget(GuiGraphics graphics, int pMouseX, int pMouseY, float pPartialTick) { if (validationErrors.isEmpty()) { @@ -52,11 +67,36 @@ protected void renderWidget(GuiGraphics graphics, int pMouseX, int pMouseY, floa } @Override - public void getTooltip(List tooltip) { + public void getTooltip(List tip) { if (abstractSpellPart != null) { - tooltip.add(Component.translatable(abstractSpellPart.getLocalizationKey())); + tip.add(Component.translatable(abstractSpellPart.getLocalizationKey())); for (SpellValidationError ve : validationErrors) { - tooltip.add(ve.makeTextComponentExisting().withStyle(ChatFormatting.RED)); + tip.add(ve.makeTextComponentExisting().withStyle(ChatFormatting.RED)); + } + if(abstractSpellPart instanceof AbstractAugment augment && augmentedParent != null) { + if(validationErrors != null && !validationErrors.isEmpty()){ + return; + } + Component augmentDescription = augmentedParent.augmentDescriptions.get(augment); + if (augmentDescription != null) { + tip.add(Component.translatable("ars_nouveau.augmenting", augmentedParent.getLocaleName())); + tip.add(augmentDescription.copy().withStyle(ChatFormatting.GOLD)); + } + } + if (Screen.hasShiftDown()) { + tip.add(Component.translatable("tooltip.ars_nouveau.glyph_level", abstractSpellPart.getConfigTier().value).setStyle(Style.EMPTY.withColor(ChatFormatting.BLUE))); + tip.add(Component.translatable("ars_nouveau.schools")); + for (SpellSchool s : abstractSpellPart.spellSchools) { + tip.add(s.getTextComponent()); + } + tip.add(abstractSpellPart.getBookDescLang()); + } else { + tip.add(Component.translatable("tooltip.ars_nouveau.hold_shift", Minecraft.getInstance().options.keyShift.getKey().getDisplayName())); + var modName = ModList.get() + .getModContainerById(abstractSpellPart.getRegistryName().getNamespace()) + .map(ModContainer::getModInfo) + .map(IModInfo::getDisplayName).orElse(abstractSpellPart.getRegistryName().getNamespace()); + tip.add(Component.literal(modName).withStyle(ChatFormatting.BLUE)); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GlyphButton.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GlyphButton.java index 145ca970d1..dcc7aaa2be 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GlyphButton.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/buttons/GlyphButton.java @@ -1,6 +1,7 @@ package com.hollingsworth.arsnouveau.client.gui.buttons; import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; +import com.hollingsworth.arsnouveau.api.spell.AbstractAugment; import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import com.hollingsworth.arsnouveau.api.spell.SpellSchool; import com.hollingsworth.arsnouveau.api.spell.SpellValidationError; @@ -26,6 +27,7 @@ public class GlyphButton extends ANButton { public AbstractSpellPart abstractSpellPart; public List validationErrors; + public AbstractSpellPart augmentingParent; public GlyphButton(int x, int y, AbstractSpellPart abstractSpellPart, OnPress onPress) { super(x, y, 16, 16, onPress); @@ -66,5 +68,15 @@ public void getTooltip(List tip) { .map(IModInfo::getDisplayName).orElse(spellPart.getRegistryName().getNamespace()); tip.add(Component.literal(modName).withStyle(ChatFormatting.BLUE)); } + if(this.abstractSpellPart instanceof AbstractAugment augment && this.augmentingParent != null){ + if(validationErrors != null && !validationErrors.isEmpty()){ + return; + } + Component augmentDescription = augmentingParent.augmentDescriptions.get(augment); + if (augmentDescription != null) { + tip.add(Component.translatable("ars_nouveau.augmenting", augmentingParent.getLocaleName())); + tip.add(augmentDescription.copy().withStyle(ChatFormatting.GOLD)); + } + } } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 91d7eba33c..d3c971ba0f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -7,16 +7,20 @@ import com.hollingsworth.arsnouveau.api.registry.GlyphRegistry; import com.hollingsworth.arsnouveau.api.registry.PerkRegistry; import com.hollingsworth.arsnouveau.api.registry.RitualRegistry; +import com.hollingsworth.arsnouveau.api.spell.AbstractAugment; +import com.hollingsworth.arsnouveau.api.spell.AbstractSpellPart; import com.hollingsworth.arsnouveau.common.items.FamiliarScript; import com.hollingsworth.arsnouveau.common.items.Glyph; import com.hollingsworth.arsnouveau.common.items.PerkItem; import com.hollingsworth.arsnouveau.common.items.RitualTablet; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.neoforged.neoforge.common.data.LanguageProvider; import org.jetbrains.annotations.NotNull; +import java.util.HashMap; import java.util.Map; import java.util.TreeMap; import java.util.function.Supplier; @@ -33,10 +37,19 @@ public LangDatagen(PackOutput output, String modid, String locale) { protected void addTranslations() { ArsNouveauAPI arsNouveauAPI = ArsNouveauAPI.getInstance(); for (Supplier supplier : GlyphRegistry.getGlyphItemMap().values()) { - Glyph i = supplier.get(); - if(supplier.get().spellPart.getRegistryName().getNamespace().equals(ArsNouveau.MODID)) { - add("ars_nouveau.glyph_desc." + i.spellPart.getRegistryName().getPath(), i.spellPart.getBookDescription()); - add("ars_nouveau.glyph_name." + i.spellPart.getRegistryName().getPath(), i.spellPart.getName()); + Glyph glyph = supplier.get(); + AbstractSpellPart spellPart = glyph.spellPart; + ResourceLocation registryName = glyph.spellPart.getRegistryName(); + if(registryName.getNamespace().equals(ArsNouveau.MODID)) { + add("ars_nouveau.glyph_desc." + registryName.getPath(), spellPart.getBookDescription()); + add("ars_nouveau.glyph_name." + registryName.getPath(), spellPart.getName()); + + Map augmentDescriptions = new HashMap<>(); + spellPart.addAugmentDescriptions(augmentDescriptions); + + for(AbstractAugment augment : augmentDescriptions.keySet()){ + add("ars_nouveau.augment_desc." + registryName.getPath() + "_" + augment.getRegistryName().getPath(), augmentDescriptions.get(augment)); + } } } for (FamiliarScript i : FamiliarRegistry.getFamiliarScriptMap().values()) { @@ -1330,6 +1343,7 @@ protected void addTranslations() { add("ars_nouveau.sifting", "Sifting"); add("tooltip.alakarkinos_shard1", "Found by giving an Alakarkinos a Sherd."); add("tooltip.alakarkinos_shard2", "What's that behind your ear?"); + add("ars_nouveau.augmenting", "Augmenting %s:"); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectAnimate.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectAnimate.java index 3e800d5d53..dea46212f0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectAnimate.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectAnimate.java @@ -20,6 +20,7 @@ import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Set; public class EffectAnimate extends AbstractEffect { @@ -73,6 +74,12 @@ public void buildConfig(ModConfigSpec.Builder builder) { addExtendTimeConfig(builder, 60); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addSummonAugmentDescriptions(map); + } + @Override public int getDefaultManaCost() { return 200; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java index b703ce448f..25ecd2df98 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBlink.java @@ -32,6 +32,7 @@ import net.neoforged.neoforge.event.entity.EntityTeleportEvent; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Set; public class EffectBlink extends AbstractEffect { @@ -182,6 +183,13 @@ public Set getCompatibleAugments() { return augmentSetOf(AugmentAmplify.INSTANCE, AugmentDampen.INSTANCE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentAmplify.INSTANCE, "Increases the distance of the teleport."); + map.put(AugmentDampen.INSTANCE, "Decreases the distance of the teleport."); + } + @Override public String getBookDescription() { return "Teleports the caster to a location. If an entity is hit and the caster is holding a Warp Scroll in the offhand, the entity will be warped to the location on the Warp Scroll. When used on Self, the caster blinks forward. Spell Turrets and Runes can warp entities using Warp Scrolls from adjacent inventories without consuming the scroll."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBreak.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBreak.java index 063fa91f5d..16198f5798 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBreak.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBreak.java @@ -106,14 +106,24 @@ public Set getCompatibleAugments() { ); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentSensitive.INSTANCE, "Breaks blocks with Shears instead of a pickaxe."); + map.put(AugmentDampen.INSTANCE, "Decreases the harvest level."); + map.put(AugmentAmplify.INSTANCE, "Increases the harvest level."); + } + @Override public String getBookDescription() { - return "A spell you start with. Breaks blocks of an average hardness. Can be amplified to increase the harvest level. Sensitive will simulate breaking blocks with Shears instead of a pickaxe."; + return "Breaks blocks of an average hardness. Can be amplified to increase the harvest level. Sensitive will simulate breaking blocks with Shears instead of a pickaxe."; } @Override protected void addDefaultAugmentLimits(Map defaults) { defaults.put(AugmentFortune.INSTANCE.getRegistryName(), 4); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); } @NotNull diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java index 437c93614b..a03c02ef5d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java @@ -13,6 +13,7 @@ import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Set; public class EffectBubble extends AbstractEffect { @@ -26,7 +27,7 @@ public EffectBubble() { @Override public void onResolve(HitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { super.onResolve(rayTraceResult, world, shooter, spellStats, spellContext, resolver); - var bubble = new BubbleEntity(world, (int) (100 + spellStats.getDurationMultiplier() * EXTEND_TIME.getAsInt()), (float) (DAMAGE.getAsDouble() + spellStats.getAmpMultiplier() * AMP_VALUE.getAsDouble())); + var bubble = new BubbleEntity(world, (int) (100 + spellStats.getDurationMultiplier() * EXTEND_TIME.getAsInt()), (float) (DAMAGE.getAsDouble() + spellStats.getAmpMultiplier() * AMP_VALUE.getAsDouble() + spellStats.getDamageModifier())); bubble.setPos(rayTraceResult.getLocation().x, rayTraceResult.getLocation().y, rayTraceResult.getLocation().z); world.addFreshEntity(bubble); } @@ -49,6 +50,15 @@ public void buildConfig(ModConfigSpec.Builder builder) { return Set.of(AugmentExtendTime.INSTANCE, AugmentAmplify.INSTANCE, AugmentDampen.INSTANCE, AugmentDurationDown.INSTANCE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentExtendTime.INSTANCE, "Increases the duration of the bubble."); + map.put(AugmentAmplify.INSTANCE, "Increases the damage of the bubble when popped."); + map.put(AugmentDampen.INSTANCE, "Decreases the damage of the bubble when popped."); + map.put(AugmentDurationDown.INSTANCE, "Decreases the duration of the bubble."); + } + @Override protected @NotNull Set getSchools() { return Set.of(SpellSchools.ELEMENTAL_WATER); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java index 74141ce994..fbf2392a52 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBurst.java @@ -20,6 +20,7 @@ import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Set; import java.util.function.Predicate; @@ -89,6 +90,20 @@ public SpellTier defaultTier() { return SpellTier.THREE; } + @Override + protected void addDefaultAugmentLimits(Map defaults) { + super.addDefaultAugmentLimits(defaults); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); + } + + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentAOE.INSTANCE, "Increases the target radius."); + map.put(AugmentSensitive.INSTANCE, "Targets blocks instead of entities."); + map.put(AugmentDampen.INSTANCE, "Targets an empty sphere."); + } + @Override protected @NotNull Set getCompatibleAugments() { return augmentSetOf(AugmentAOE.INSTANCE, AugmentSensitive.INSTANCE, AugmentDampen.INSTANCE); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectColdSnap.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectColdSnap.java index 0c52b53009..a487efec6f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectColdSnap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectColdSnap.java @@ -160,6 +160,14 @@ protected void addDefaultAugmentLimits(Map defaults) defaults.put(AugmentAOE.INSTANCE.getRegistryName(), 1); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentAOE.INSTANCE, "Increases the number of ice shards."); + map.put(AugmentDurationDown.INSTANCE, "Decreases the freezing duration."); + map.put(AugmentExtendTime.INSTANCE, "Increases the freezing duration."); + } + @Override public int getDefaultManaCost() { return 30; @@ -171,8 +179,7 @@ public Set getCompatibleAugments() { return augmentSetOf( AugmentAmplify.INSTANCE, AugmentDampen.INSTANCE, AugmentExtendTime.INSTANCE, AugmentDurationDown.INSTANCE, - AugmentAOE.INSTANCE, - AugmentFortune.INSTANCE, AugmentRandomize.INSTANCE + AugmentAOE.INSTANCE, AugmentFortune.INSTANCE, AugmentRandomize.INSTANCE ); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectConjureWater.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectConjureWater.java index 74cffcdebe..c6cd993f44 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectConjureWater.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectConjureWater.java @@ -12,6 +12,7 @@ import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; @@ -27,6 +28,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Map; import java.util.Set; public class EffectConjureWater extends AbstractEffect implements IPotionEffect { @@ -94,6 +96,19 @@ public Set getCompatibleAugments() { return augmentSetOf(AugmentAOE.INSTANCE, AugmentPierce.INSTANCE, AugmentExtendTime.INSTANCE, AugmentSensitive.INSTANCE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentSensitive.INSTANCE, "Places water at a target entity's feet."); + } + + @Override + protected void addDefaultAugmentLimits(Map defaults) { + super.addDefaultAugmentLimits(defaults); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); + } + @Override public String getBookDescription() { return "Places water at a location or extinguishes entities on fire. If augmented with extend time, it will keep entities wet for a longer period of time."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java index a4743efc9f..a57a041992 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java @@ -156,9 +156,20 @@ public Set getCompatibleAugments() { ); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addDamageAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentAmplify.INSTANCE, "Increases damage dealt and the harvest level."); + map.put(AugmentDampen.INSTANCE, "Decreases damage dealt and the harvest level."); + map.put(AugmentSensitive.INSTANCE, "Crush will also target items nearby."); + } + @Override protected void addDefaultAugmentLimits(Map defaults) { defaults.put(AugmentAmplify.INSTANCE.getRegistryName(), 2); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java index 2df3b63c2f..17d94eecfa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCut.java @@ -112,7 +112,7 @@ public void buildConfig(ModConfigSpec.Builder builder) { addAmpConfig(builder, 1.0); } - @NotNull + @NotNull @Override public Set getCompatibleAugments() { return augmentSetOf( @@ -121,6 +121,14 @@ public Set getCompatibleAugments() { ); } + @Override + public void addAugmentDescriptions(Map map) { + map.put(AugmentAmplify.INSTANCE, "Simulates using an Axe instead of Shears."); + map.put(AugmentDampen.INSTANCE, "Reduces the damage dealt."); + map.put(AugmentExtract.INSTANCE, "Applies Silk Touch when breaking blocks."); + map.put(AugmentFortune.INSTANCE, "Applies Fortune when breaking blocks or killing mobs."); + } + @Override protected void addDefaultAugmentLimits(Map defaults) { defaults.put(AugmentAmplify.INSTANCE.getRegistryName(), 2); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDelay.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDelay.java index b29badb2ed..9fac8ed79d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDelay.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectDelay.java @@ -20,6 +20,7 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; +import java.util.Map; import java.util.Set; public class EffectDelay extends AbstractEffect { @@ -82,6 +83,14 @@ public String getBookDescription() { return "Delays the resolution of effects placed to the right of this spell for a few moments. The delay may be increased with the Extend Time augment, or decreased with Duration Down."; } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentExtendTime.INSTANCE, "Increases the duration of the delay."); + map.put(AugmentDurationDown.INSTANCE, "Decreases the duration of the delay."); + map.put(AugmentRandomize.INSTANCE, "Randomizes the duration of the delay, increasing or decreasing it by 25% of the base duration."); + } + @Override public SpellTier defaultTier() { return SpellTier.ONE; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectEvaporate.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectEvaporate.java index 207e1ed1cf..2781a438bb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectEvaporate.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectEvaporate.java @@ -19,6 +19,7 @@ import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Set; public class EffectEvaporate extends AbstractEffect { @@ -71,9 +72,15 @@ public Set getSchools() { return setOf(SpellSchools.MANIPULATION); } - @NotNull + @NotNull @Override public Set getCompatibleAugments() { return setOf(AugmentAOE.INSTANCE, AugmentPierce.INSTANCE); } + + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExchange.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExchange.java index 9bc7bfba4b..eee9933054 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExchange.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExchange.java @@ -33,6 +33,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Map; import java.util.Set; public class EffectExchange extends AbstractEffect { @@ -132,6 +133,14 @@ public Set getCompatibleAugments() { ); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentAmplify.INSTANCE, "Increases the hardness of blocks that can be harvested."); + map.put(AugmentDampen.INSTANCE, "Decreases the hardness of blocks that can be harvested."); + } + @Override public String getBookDescription() { return "When used on blocks, exchanges the blocks in the players hotbar for the blocks hit as if they were mined with silk touch. Can be augmented with AOE, and Amplify is required for swapping blocks of higher hardness. " diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExplosion.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExplosion.java index 8e746e7001..24a2ebad2d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExplosion.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExplosion.java @@ -39,9 +39,8 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt double intensity = BASE.get() + AMP_VALUE.get() * spellStats.getAmpMultiplier() + AOE_BONUS.get() * spellStats.getAoeMultiplier(); int dampen = spellStats.getBuffCount(AugmentDampen.INSTANCE); intensity -= 0.5 * dampen; - //TODO: check explosion augment functionality - Explosion.BlockInteraction mode = dampen > 0 ? Explosion.BlockInteraction.KEEP : Explosion.BlockInteraction.DESTROY; - mode = spellStats.hasBuff(AugmentExtract.INSTANCE) ? Explosion.BlockInteraction.DESTROY_WITH_DECAY : mode; + + Explosion.BlockInteraction mode = spellStats.hasBuff(AugmentExtract.INSTANCE) ? Explosion.BlockInteraction.KEEP : Explosion.BlockInteraction.DESTROY; explode(world, shooter, null, null, vec.x, vec.y, vec.z, (float) intensity, false, mode, spellStats.getAmpMultiplier()); } @@ -110,6 +109,14 @@ protected void addDefaultAugmentLimits(Map defaults) defaults.put(AugmentAmplify.INSTANCE.getRegistryName(), 2); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentAOE.INSTANCE, "Increases the size of the explosion."); + map.put(AugmentExtract.INSTANCE, "Drops all blocks instead of destroying them."); + map.put(AugmentDampen.INSTANCE, "Reduces the size of the explosion and damage."); + } + @Override public String getBookDescription() { return "Causes an explosion at the location. Amplify increases the damage and size by a small amount, while AOE will increase the size of the explosion by a large amount, but not damage."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFangs.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFangs.java index 467da78d03..341ab64b82 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFangs.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFangs.java @@ -140,6 +140,14 @@ public Set getCompatibleAugments() { ); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentExtendTime.INSTANCE, "Increases the duration of the fangs."); + map.put(AugmentDurationDown.INSTANCE, "Decreases the duration of the fangs."); + map.put(AugmentAccelerate.INSTANCE, "Increases the travel speed of the fangs."); + } + @Override public String getBookDescription() { return "Summons Evoker Fangs in the direction where the spell was targeted. Using fangs on your self will spawn them in an area around you."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFell.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFell.java index 2bc6832a19..ccd1a2ea2a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFell.java @@ -6,10 +6,7 @@ import com.hollingsworth.arsnouveau.api.util.SpellUtil; import com.hollingsworth.arsnouveau.common.datagen.BlockTagProvider; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; -import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAOE; -import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; -import com.hollingsworth.arsnouveau.common.spell.augment.AugmentExtract; -import com.hollingsworth.arsnouveau.common.spell.augment.AugmentFortune; +import com.hollingsworth.arsnouveau.common.spell.augment.*; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.LivingEntity; @@ -21,6 +18,7 @@ import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Set; public class EffectFell extends AbstractEffect { @@ -39,7 +37,7 @@ public void onResolveBlock(BlockHitResult ray, Level world, @NotNull LivingEntit Set list = getTree(world, blockPos, (int) (GENERIC_INT.get() + Math.round(AOE_BONUS.get() * spellStats.getAoeMultiplier()))); world.levelEvent(2001, blockPos, Block.getId(state)); list.forEach(listPos -> { - if (!BlockUtil.destroyRespectsClaim(shooter, world, listPos)) + if (!BlockUtil.destroyRespectsClaim(shooter, world, listPos) || !BlockUtil.canBlockBeHarvested(spellStats, world, listPos)) return; if (spellStats.hasBuff(AugmentExtract.INSTANCE)) { world.getBlockState(listPos).getDrops(LootUtil.getSilkContext((ServerLevel) world, listPos, shooter)).forEach(i -> world.addFreshEntity(new ItemEntity(world, listPos.getX(), listPos.getY(), listPos.getZ(), i))); @@ -73,7 +71,6 @@ public Set getTree(Level world, BlockPos start, int maxBlocks) { return SpellUtil.DFSBlockstates(world, start, maxBlocks, this::isTree); } - @Override public int getDefaultManaCost() { return 150; @@ -91,10 +88,19 @@ public Set getCompatibleAugments() { AugmentAOE.INSTANCE, AugmentExtract.INSTANCE, AugmentFortune.INSTANCE, - AugmentAmplify.INSTANCE + AugmentAmplify.INSTANCE, + AugmentDampen.INSTANCE ); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentAmplify.INSTANCE, "Increases the hardness of blocks that can be harvested."); + map.put(AugmentDampen.INSTANCE, "Decreases the hardness of blocks that can be harvested."); + } + @Override public String getBookDescription() { return "Harvests entire trees, mushrooms, cactus, and other vegetation. Can be amplified with Amplify to break materials of higher hardness. AOE will increase the number of blocks that may be broken at one time."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFirework.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFirework.java index 677ac5a14f..6871065406 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFirework.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFirework.java @@ -121,6 +121,13 @@ public Set getCompatibleAugments() { return augmentSetOf(AugmentExtendTime.INSTANCE, AugmentAmplify.INSTANCE, AugmentSplit.INSTANCE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentSplit.INSTANCE, "Summons multiple fireworks."); + map.put(AugmentAmplify.INSTANCE, "Adds more Firework Stars."); + map.put(AugmentExtendTime.INSTANCE, "Increases flight time."); + } public static FireworkExplosion.Shape[] shapes = FireworkExplosion.Shape.values(); private static List dyes; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFlare.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFlare.java index 4d434b45be..d392fc1606 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFlare.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFlare.java @@ -17,7 +17,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.BlockTags; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; @@ -43,11 +42,10 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNul return; Vec3 vec = safelyGetHitPos(rayTraceResult); float damage = (float) (DAMAGE.get() + AMP_VALUE.get() * spellStats.getAmpMultiplier()); - int snareSec = 0;//(int) (POTION_TIME.get() + EXTEND_TIME.get() * spellStats.getDurationMultiplier()); if (!canDamage(livingEntity)) return; - this.damage(vec, level, shooter, livingEntity, spellStats, spellContext, resolver, snareSec, damage); + this.damage(vec, level, shooter, livingEntity, spellStats, spellContext, resolver, damage); spawnCinders(shooter, level,rayTraceResult.getLocation().add(0, (rayTraceResult.getEntity().onGround() ? 1 : 0),0), spellStats, spellContext, resolver); if(rayTraceResult.getEntity() instanceof LivingEntity living && living.hasEffect(ModPotions.BLAST_EFFECT)){ @@ -105,12 +103,10 @@ public void spawnCinders(LivingEntity shooter, Level level, Vec3 hit, SpellStats - public void damage(Vec3 vec, ServerLevel world, LivingEntity shooter, LivingEntity livingEntity, SpellStats stats, SpellContext context, SpellResolver resolver, int snareTime, float damage) { + public void damage(Vec3 vec, ServerLevel world, LivingEntity shooter, LivingEntity livingEntity, SpellStats stats, SpellContext context, SpellResolver resolver, float damage) { if (attemptDamage(world, shooter, stats, context, resolver, livingEntity, buildDamageSource(world, shooter), damage)) { world.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, vec.x, vec.y + 0.5, vec.z, 50, ParticleUtil.inRange(-0.1, 0.1), ParticleUtil.inRange(-0.1, 0.1), ParticleUtil.inRange(-0.1, 0.1), 0.3); - - livingEntity.addEffect(new MobEffectInstance(ModPotions.SNARE_EFFECT, 20 * snareTime)); } } @@ -143,12 +139,17 @@ public int getDefaultManaCost() { public Set getCompatibleAugments() { return augmentSetOf( AugmentAmplify.INSTANCE, AugmentDampen.INSTANCE, - AugmentExtendTime.INSTANCE, AugmentDurationDown.INSTANCE, AugmentAOE.INSTANCE, AugmentFortune.INSTANCE, AugmentRandomize.INSTANCE ); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentAOE.INSTANCE, "Increases the number of cinders spawned."); + } + @Override public String getBookDescription() { return "When used on an entity or block that is on fire or afflicted with Blasting, Cinders will explode around the target, dealing damage and creating Mage Fire nearby. Mage Fire cannot spread to blocks and is short lived. Entities with Blasting will immediately explode for extra strength."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFreeze.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFreeze.java index 7a86f3e316..0d421c6659 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFreeze.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectFreeze.java @@ -129,6 +129,13 @@ public Set getCompatibleAugments() { return augments; } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentSensitive.INSTANCE, "Turns water into Frosted Ice and will vanish after a short time."); + } + @Override public String getBookDescription() { return "Freezes water or lava in a small area or slows a target for a short time. Freeze on Ice will turn it into Packed Ice, and Packed Ice into Blue Ice. Sensitive will turn water into Frosted Ice and will vanish after a short time."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGravity.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGravity.java index 8326a1c326..6170076305 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGravity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGravity.java @@ -17,6 +17,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Map; import java.util.Set; public class EffectGravity extends AbstractEffect implements IPotionEffect { @@ -85,7 +86,15 @@ public String getBookDescription() { return "Causes blocks and entities to fall. When augmented with Extend Time, players will have their flight disabled and will obtain the Gravity effect. While afflicted with Gravity, entities will rapidly fall and take double falling damage."; } - @NotNull + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentDampen.INSTANCE, "Reduces the falling speed of blocks and entities, or decreases the effect of the potion."); + map.put(AugmentAmplify.INSTANCE, "Increases the falling speed of blocks and entities, or increases the effect of the potion."); + } + + @NotNull @Override public Set getSchools() { return setOf(SpellSchools.ELEMENTAL_AIR); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGrow.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGrow.java index 01f2d5bd53..918d5c8a30 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGrow.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectGrow.java @@ -17,6 +17,7 @@ import net.minecraft.world.phys.BlockHitResult; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Set; public class EffectGrow extends AbstractEffect { @@ -64,6 +65,12 @@ public Set getCompatibleAugments() { return augmentSetOf(AugmentAOE.INSTANCE, AugmentPierce.INSTANCE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + } + @Override public String getBookDescription() { return "Causes plants to accelerate in growth as if they were bonemealed."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHarm.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHarm.java index ff9deac960..e27789567a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHarm.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHarm.java @@ -45,7 +45,6 @@ public void buildConfig(ModConfigSpec.Builder builder) { addExtendTimeConfig(builder, 5); } - @Override public boolean defaultedStarterGlyph() { return true; @@ -66,6 +65,14 @@ public Set getCompatibleAugments() { ); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentExtendTime.INSTANCE, "Applies Poison instead of dealing damage, increases the duration."); + map.put(AugmentDurationDown.INSTANCE, "Decreases the duration of Poison applied."); + map.put(AugmentAmplify.INSTANCE, "Increases damage dealt, or the level of Poison applied."); + } + @Override protected void addDefaultAugmentLimits(Map defaults) { defaults.put(AugmentAmplify.INSTANCE.getRegistryName(), 2); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHarvest.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHarvest.java index a69657e0d6..f6594bc225 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHarvest.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHarvest.java @@ -24,6 +24,7 @@ import javax.annotation.Nullable; import java.util.List; +import java.util.Map; import java.util.Set; public class EffectHarvest extends AbstractEffect { @@ -115,6 +116,12 @@ public Set getCompatibleAugments() { return augmentSetOf(AugmentAOE.INSTANCE, AugmentPierce.INSTANCE, AugmentFortune.INSTANCE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + } + @Override public String getBookDescription() { return "When used on grown crops, this spell will obtain the fully grown product without destroying the plant."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHeal.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHeal.java index f25ad343b9..e6ecc07afa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHeal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHeal.java @@ -18,6 +18,7 @@ import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Set; public class EffectHeal extends AbstractEffect implements IDamageEffect { @@ -66,6 +67,13 @@ public void buildConfig(ModConfigSpec.Builder builder) { addAmpConfig(builder, 3.0); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentAmplify.INSTANCE, "Increases the amount of healing done or damage dealt to undead."); + map.put(AugmentDampen.INSTANCE, "Decreases the amount of healing done or damage dealt to undead."); + } + @Override public int getDefaultManaCost() { return 50; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHex.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHex.java index 2842699a06..4f221a9204 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHex.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectHex.java @@ -27,7 +27,7 @@ public void onResolveEntity(EntityHitResult rayTraceResult, Level world,@NotNull Entity entity = rayTraceResult.getEntity(); if (!(entity instanceof LivingEntity living)) return; - ((IPotionEffect)this).applyConfigPotion(living, ModPotions.HEX_EFFECT, spellStats); + this.applyConfigPotion(living, ModPotions.HEX_EFFECT, spellStats); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIgnite.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIgnite.java index e39aa724c8..375042d9ef 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIgnite.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIgnite.java @@ -8,6 +8,7 @@ import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; @@ -21,6 +22,7 @@ import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Set; public class EffectIgnite extends AbstractEffect { @@ -71,6 +73,21 @@ public void buildConfig(ModConfigSpec.Builder builder) { addPotionConfig(builder, 3); } + @Override + protected void addDefaultAugmentLimits(Map defaults) { + super.addDefaultAugmentLimits(defaults); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); + } + + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentExtendTime.INSTANCE, "Increases the fire duration."); + map.put(AugmentDurationDown.INSTANCE, "Decreases the fire duration."); + map.put(AugmentSensitive.INSTANCE, "Creates a short-lived magic fire that will not spread or destroy blocks instead of normal fire."); + } + @Override public int getDefaultManaCost() { return 15; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java index 8f534e5d25..cabb890f71 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInfuse.java @@ -115,6 +115,13 @@ protected Set getCompatibleAugments() { return setOf(AugmentAOE.INSTANCE, AugmentExtendTime.INSTANCE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentAOE.INSTANCE, "Spawns a splash potion at the location."); + map.put(AugmentExtendTime.INSTANCE, "Spawns a lingering potion at the location."); + } + @Override protected void addDefaultAugmentLimits(Map defaults) { defaults.put(AugmentAOE.INSTANCE.getRegistryName(), 1); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIntangible.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIntangible.java index e5953f5460..f6269cc3c7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIntangible.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectIntangible.java @@ -19,6 +19,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Map; import java.util.Set; public class EffectIntangible extends AbstractEffect { @@ -78,6 +79,15 @@ public Set getCompatibleAugments() { ); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addPotionAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentAmplify.INSTANCE, "Increases the hardness of blocks that can be affected."); + map.put(AugmentDampen.INSTANCE, "Decreases the hardness of blocks that can be affected."); + } + @Override public String getBookDescription() { return "Causes blocks to temporarily turn into air. Can be modified with Amplify for blocks of higher hardness, AOE, Duration Down, and Extend Time."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java index 7180250312..532bd7b59b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInteract.java @@ -10,6 +10,7 @@ import com.hollingsworth.arsnouveau.common.spell.augment.AugmentSensitive; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.stats.Stats; @@ -35,6 +36,7 @@ import net.neoforged.neoforge.common.util.FakePlayer; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Set; public class EffectInteract extends AbstractEffect { @@ -201,6 +203,18 @@ public Set getCompatibleAugments() { return augmentSetOf(AugmentSensitive.INSTANCE); } + @Override + protected void addDefaultAugmentLimits(Map defaults) { + super.addDefaultAugmentLimits(defaults); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); + } + + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentSensitive.INSTANCE, "Will interact with your off-hand item."); + } + @Override public String getBookDescription() { return "Interacts with blocks or entities as it were a player. Useful for reaching levers, chests, or animals. Sensitive will use your off-hand item on the block or entity."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInvisibility.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInvisibility.java index 41eff42712..3c7eebf4d9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInvisibility.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectInvisibility.java @@ -24,7 +24,7 @@ private EffectInvisibility() { @Override public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { if (rayTraceResult.getEntity() instanceof LivingEntity living) { - ((IPotionEffect)this).applyConfigPotion(living, MobEffects.INVISIBILITY, spellStats, false); + this.applyConfigPotion(living, MobEffects.INVISIBILITY, spellStats, false); } } @@ -48,7 +48,6 @@ public int getDefaultManaCost() { @NotNull @Override public Set getCompatibleAugments() { - // Augmentation has no effect return augmentSetOf(AugmentExtendTime.INSTANCE, AugmentDurationDown.INSTANCE); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectKnockback.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectKnockback.java index 3f4de7f04a..0609b493c1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectKnockback.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectKnockback.java @@ -13,6 +13,7 @@ import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.spell.augment.*; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; @@ -26,6 +27,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Map; import java.util.Set; import static net.minecraft.world.level.block.state.properties.BlockStateProperties.FACING; @@ -103,6 +105,21 @@ public Set getCompatibleAugments() { return augmentSetOf(AugmentAmplify.INSTANCE, AugmentDampen.INSTANCE, AugmentAOE.INSTANCE, AugmentPierce.INSTANCE, AugmentSensitive.INSTANCE); } + @Override + protected void addDefaultAugmentLimits(Map defaults) { + super.addDefaultAugmentLimits(defaults); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); + } + + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentAmplify.INSTANCE, "Increases the knockback strength."); + map.put(AugmentDampen.INSTANCE, "Decreases the knockback strength."); + map.put(AugmentSensitive.INSTANCE, "Prevents blocks from being moved."); + } + @Override public String getBookDescription() { return "Knocks a target or block away a short distance from the caster. Sensitive will stop this spell from launching blocks."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLaunch.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLaunch.java index b84d6502c6..3d4e69ffe5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLaunch.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLaunch.java @@ -7,6 +7,7 @@ import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.spell.augment.*; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; @@ -16,6 +17,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Map; import java.util.Set; public class EffectLaunch extends AbstractEffect { @@ -71,7 +73,22 @@ public String getBookDescription() { return "Launches an entity or block into the air. Can be used for large jumps, yeeting mobs in the sky or for scaling mountains! Sensitive will stop this spell from launching blocks."; } - @NotNull + @Override + protected void addDefaultAugmentLimits(Map defaults) { + super.addDefaultAugmentLimits(defaults); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); + } + + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentAmplify.INSTANCE, "Increases the knockup amount."); + map.put(AugmentDampen.INSTANCE, "Decreases the knockup amount."); + map.put(AugmentSensitive.INSTANCE, "Prevents blocks from being moved."); + } + + @NotNull @Override public Set getSchools() { return setOf(SpellSchools.ELEMENTAL_AIR); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLeap.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLeap.java index ff909d4fc8..5e59cb2149 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLeap.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLeap.java @@ -11,6 +11,7 @@ import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.spell.augment.*; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; @@ -22,6 +23,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Map; import java.util.Set; import static net.minecraft.world.level.block.state.properties.BlockStateProperties.FACING; @@ -67,6 +69,9 @@ public static Vec3 getLookVector(@NotNull LivingEntity shooter, SpellContext spe @Override public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { + if(spellStats.isSensitive()){ + return; + } List posList = SpellUtil.calcAOEBlocks(shooter, rayTraceResult.getBlockPos(), rayTraceResult, spellStats); for (BlockPos pos1 : posList) { EnchantedFallingBlock entity = EnchantedFallingBlock.fall(world, pos1, shooter, spellContext, resolver, spellStats); @@ -94,7 +99,7 @@ public void buildConfig(ModConfigSpec.Builder builder) { @NotNull @Override public Set getCompatibleAugments() { - return augmentSetOf(AugmentAmplify.INSTANCE, AugmentDampen.INSTANCE, AugmentAOE.INSTANCE, AugmentPierce.INSTANCE); + return augmentSetOf(AugmentAmplify.INSTANCE, AugmentDampen.INSTANCE, AugmentAOE.INSTANCE, AugmentPierce.INSTANCE, AugmentSensitive.INSTANCE); } @Override @@ -102,6 +107,21 @@ public String getBookDescription() { return "Launches the target in the direction they are looking. Amplification will increase the distance moved."; } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentAmplify.INSTANCE, "Increases the velocity."); + map.put(AugmentDampen.INSTANCE, "Decreases the velocity."); + map.put(AugmentSensitive.INSTANCE, "Prevents blocks from being moved."); + } + + @Override + protected void addDefaultAugmentLimits(Map defaults) { + super.addDefaultAugmentLimits(defaults); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); + } + @Override public int getDefaultManaCost() { return 25; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLight.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLight.java index e7e77657b7..6bdeff154c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLight.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLight.java @@ -103,6 +103,7 @@ public void buildConfig(ModConfigSpec.Builder builder) { @Override protected void addDefaultAugmentLimits(Map defaults) { defaults.put(AugmentAmplify.INSTANCE.getRegistryName(), 1); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); } @Override @@ -116,6 +117,16 @@ public Set getCompatibleAugments() { return augmentSetOf(AugmentAmplify.INSTANCE, AugmentDurationDown.INSTANCE, AugmentDampen.INSTANCE, AugmentExtendTime.INSTANCE, AugmentSensitive.INSTANCE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentExtendTime.INSTANCE, "The light will instead be temporary, lasting longer. Affects the duration of Glowing and Night Vision."); + map.put(AugmentDurationDown.INSTANCE, "The light will last for a shorter duration. Affects the duration of Glowing and Night Vision."); + map.put(AugmentAmplify.INSTANCE, "Increases the light level."); + map.put(AugmentDampen.INSTANCE, "Decreases the light level."); + map.put(AugmentSensitive.INSTANCE, "Allows Glowing to be applied to the caster and applies the spell color to the Glowing effect."); + } + @Override public String getBookDescription() { return "If cast on a block, a permanent light source is created. May be amplified up to Glowstone brightness, or Dampened for a lower light level. When cast on yourself, you will receive night vision. When cast on other entities or with Sensitive, they will receive Night Vision and Glowing. If Sensitive, Glowing will use the spell color."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLightning.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLightning.java index aeaf3047e1..cab2e57bf4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLightning.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLightning.java @@ -2,12 +2,12 @@ import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.common.entity.LightningEntity; -import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDampen; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDurationDown; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentExtendTime; +import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.LivingEntity; @@ -55,6 +55,15 @@ protected void addDefaultAugmentLimits(Map defaults) defaults.put(AugmentAmplify.INSTANCE.getRegistryName(), 2); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentExtendTime.INSTANCE, "Increases the duration of the lightning bolt."); + map.put(AugmentDurationDown.INSTANCE, "Decreases the duration of the lightning bolt."); + map.put(AugmentDampen.INSTANCE, "Decreases the damage of the lightning bolt."); + map.put(AugmentAmplify.INSTANCE, "Increases the damage of the lightning bolt."); + } + @Override public int getDefaultManaCost() { return 100; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLinger.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLinger.java index fdae72aa19..b5b3a79c93 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLinger.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectLinger.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.common.entity.EntityLingeringSpell; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.spell.augment.*; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; @@ -11,6 +12,7 @@ import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Set; public class EffectLinger extends AbstractEffect { @@ -65,6 +67,24 @@ public Set getCompatibleAugments() { return augmentSetOf(AugmentSensitive.INSTANCE, AugmentAOE.INSTANCE, AugmentAccelerate.INSTANCE, AugmentDecelerate.INSTANCE, AugmentExtendTime.INSTANCE, AugmentDurationDown.INSTANCE, AugmentDampen.INSTANCE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentAOE.INSTANCE, "Increases the target area."); + map.put(AugmentAccelerate.INSTANCE, "Casts spells faster."); + map.put(AugmentDecelerate.INSTANCE, "Casts spells slower."); + map.put(AugmentExtendTime.INSTANCE, "Increases the duration of the effect."); + map.put(AugmentDurationDown.INSTANCE, "Decreases the duration of the effect."); + map.put(AugmentDampen.INSTANCE, "Ignores gravity."); + map.put(AugmentSensitive.INSTANCE, "Targets blocks instead of entities."); + } + + @Override + protected void addDefaultAugmentLimits(Map defaults) { + super.addDefaultAugmentLimits(defaults); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); + } + @Override public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectOrbit.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectOrbit.java index 6df7b757d4..9765fc95e3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectOrbit.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectOrbit.java @@ -11,6 +11,7 @@ import net.minecraft.world.phys.EntityHitResult; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Set; public class EffectOrbit extends AbstractEffect { @@ -80,4 +81,17 @@ public Set getCompatibleAugments() { return augmentSetOf(AugmentAccelerate.INSTANCE, AugmentDecelerate.INSTANCE, AugmentAOE.INSTANCE, AugmentPierce.INSTANCE, AugmentSplit.INSTANCE, AugmentExtendTime.INSTANCE, AugmentDurationDown.INSTANCE, AugmentSensitive.INSTANCE); } + + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentAccelerate.INSTANCE, "Increases the speed of the orbiting projectiles."); + map.put(AugmentDecelerate.INSTANCE, "Decreases the speed of the orbiting projectiles."); + map.put(AugmentAOE.INSTANCE, "Increases the radius of the orbiting projectiles."); + map.put(AugmentPierce.INSTANCE, "Allows the orbiting projectiles to pierce through enemies."); + map.put(AugmentSplit.INSTANCE, "Increases the number of orbiting projectiles."); + map.put(AugmentExtendTime.INSTANCE, "Increases the duration of the orbiting projectiles."); + map.put(AugmentDurationDown.INSTANCE, "Decreases the duration of the orbiting projectiles."); + map.put(AugmentSensitive.INSTANCE, "Allows the orbiting projectiles to hit blocks."); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPhantomBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPhantomBlock.java index d08f382352..9d24156549 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPhantomBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPhantomBlock.java @@ -74,6 +74,15 @@ public Set getCompatibleAugments() { return augmentSetOf(AugmentAOE.INSTANCE, AugmentPierce.INSTANCE, AugmentAmplify.INSTANCE, AugmentExtendTime.INSTANCE, AugmentDurationDown.INSTANCE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentExtendTime.INSTANCE, "Increases the duration of the temporary block."); + map.put(AugmentAmplify.INSTANCE, "Makes the block permanent."); + map.put(AugmentDurationDown.INSTANCE, "Decreases the duration of the temporary block."); + } + @Override public String getBookDescription() { return "Creates a temporary block that will disappear after a short time. Amplify will cause the block to be permanent. Dispelling this block will destroy it instantly."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java index ae8277b86a..dcb0d5bb32 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPickup.java @@ -22,6 +22,7 @@ import javax.annotation.Nullable; import java.util.List; +import java.util.Map; import java.util.Set; public class EffectPickup extends AbstractEffect { @@ -69,6 +70,12 @@ public Set getCompatibleAugments() { return augmentSetOf(AugmentAOE.INSTANCE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentAOE.INSTANCE, "Increases the radius of the pickup effect."); + } + @Override public String getBookDescription() { return "Picks up nearby items in a medium radius where this spell is activated. The range may be expanded with AOE."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java index 0f98cb0abd..8167119a86 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPlaceBlock.java @@ -28,6 +28,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Map; import java.util.Set; public class EffectPlaceBlock extends AbstractEffect { @@ -84,6 +85,12 @@ public Set getCompatibleAugments() { return augmentSetOf(AugmentAOE.INSTANCE, AugmentPierce.INSTANCE, AugmentRandomize.INSTANCE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + } + @Override public String getBookDescription() { return "Places blocks from the casters inventory. If a player is casting this, this spell will place blocks from the hot bar first."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPull.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPull.java index cf8c0b8be4..edcf155481 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPull.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectPull.java @@ -9,6 +9,7 @@ import com.hollingsworth.arsnouveau.common.spell.augment.*; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; @@ -19,6 +20,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Map; import java.util.Set; public class EffectPull extends AbstractEffect { @@ -79,6 +81,21 @@ public Set getCompatibleAugments() { return augmentSetOf(AugmentAmplify.INSTANCE, AugmentDampen.INSTANCE, AugmentAOE.INSTANCE, AugmentPierce.INSTANCE, AugmentSensitive.INSTANCE); } + @Override + protected void addDefaultAugmentLimits(Map defaults) { + super.addDefaultAugmentLimits(defaults); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); + } + + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentAmplify.INSTANCE, "Increases the velocity."); + map.put(AugmentDampen.INSTANCE, "Decreases the velocity."); + map.put(AugmentSensitive.INSTANCE, "Prevents blocks from being pulled."); + } + @Override public String getBookDescription() { return "Pulls the target closer to the caster. When used on blocks, they become falling blocks with motion towards the side of the block that was hit. Sensitive will stop this spell from pulling blocks."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java index 13ffd1b222..8251ca48b8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRedstone.java @@ -10,6 +10,7 @@ import com.hollingsworth.arsnouveau.common.world.saved_data.RedstoneSavedData; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; import net.minecraft.world.entity.LivingEntity; @@ -27,7 +28,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; public class EffectRedstone extends AbstractEffect { public static EffectRedstone INSTANCE = new EffectRedstone(); @@ -86,12 +86,29 @@ public void buildConfig(ModConfigSpec.Builder builder) { BONUS_TIME = builder.comment("Extend time bonus, in ticks").defineInRange("extend_time", 10, 0, Integer.MAX_VALUE); } + @Override + protected void addDefaultAugmentLimits(Map defaults) { + super.addDefaultAugmentLimits(defaults); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); + } + @NotNull @Override public Set getCompatibleAugments() { return augmentSetOf(AugmentAmplify.INSTANCE, AugmentAOE.INSTANCE, AugmentDampen.INSTANCE, AugmentExtendTime.INSTANCE, AugmentDurationDown.INSTANCE, AugmentSensitive.INSTANCE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentAmplify.INSTANCE, "Increases the power of the redstone signal."); + map.put(AugmentDampen.INSTANCE, "Decreases the power of the redstone signal."); + map.put(AugmentSensitive.INSTANCE, "Sets the target block to a redstone power source, powering itself and its neighbors."); + map.put(AugmentExtendTime.INSTANCE, "Increases the duration of the redstone signal."); + map.put(AugmentDurationDown.INSTANCE, "Decreases the duration of the redstone signal."); + } + @Override public String getBookDescription() { return "Places a temporary block of redstone with configurable power and duration. Augment with Sensitive to set the target block as a power source for itself and surrounding blocks. Dampen and Amplify will adjust the power from the base value of 10."; @@ -107,7 +124,4 @@ public int getDefaultManaCost() { public Set getSchools() { return setOf(SpellSchools.MANIPULATION); } - - public static final Map> signalMap = new ConcurrentHashMap<>(); - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRewind.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRewind.java index bfd9342e49..348c50912a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRewind.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRewind.java @@ -105,6 +105,13 @@ protected void buildAugmentLimitsConfig(ModConfigSpec.Builder builder, Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentExtendTime.INSTANCE, "Increases the duration to rewind."); + map.put(AugmentDurationDown.INSTANCE, "Decreases the duration to rewind."); + } + public int getEntityMaxTrackingTicks(){ return GENERIC_INT.get(); } @@ -130,6 +137,8 @@ public SpellTier defaultTier() { return augmentSetOf(AugmentExtendTime.INSTANCE, AugmentDurationDown.INSTANCE); } + + @Override protected @NotNull Set getSchools() { return setOf(SpellSchools.MANIPULATION); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRotate.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRotate.java index 16bc397a37..2112759cfa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRotate.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRotate.java @@ -9,6 +9,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.projectile.Projectile; @@ -22,6 +23,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Map; import java.util.Set; public class EffectRotate extends AbstractEffect { @@ -104,6 +106,12 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull } } + @Override + protected void addDefaultAugmentLimits(Map defaults) { + super.addDefaultAugmentLimits(defaults); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); + } + @Override public int getDefaultManaCost() { return 10; @@ -120,4 +128,12 @@ public int getDefaultManaCost() { return augmentSetOf(AugmentAmplify.INSTANCE, AugmentSensitive.INSTANCE, AugmentAOE.INSTANCE, AugmentPierce.INSTANCE, AugmentDampen.INSTANCE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentSensitive.INSTANCE, "Rotates the block on a different axis or forces an entity to rotate their head."); + map.put(AugmentDampen.INSTANCE, "Increases rotations counter-clockwise."); + map.put(AugmentAmplify.INSTANCE, "Increases rotations clockwise."); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRune.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRune.java index bb9bffb789..1e8326b3c2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRune.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectRune.java @@ -7,6 +7,7 @@ import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.LivingEntity; @@ -18,6 +19,7 @@ import net.minecraft.world.phys.BlockHitResult; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Set; public class EffectRune extends AbstractEffect { @@ -53,6 +55,12 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull } } + @Override + protected void addDefaultAugmentLimits(Map defaults) { + super.addDefaultAugmentLimits(defaults); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); + } + @Override public int getDefaultManaCost() { return 30; @@ -64,7 +72,13 @@ public String getBookDescription() { "and cannot be recharged. When using Item Pickup, items are deposited into adjacent inventories. Sensitive will cause the rune to use the Owner's inventory for pickup and usage instead. Players with Magic Find will be able to read spells inscribed on runes."; } - @NotNull + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentSensitive.INSTANCE, "The rune will use the owner's inventory for pickup and usage."); + } + + @NotNull @Override public Set getSchools() { return setOf(SpellSchools.MANIPULATION); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSenseMagic.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSenseMagic.java index 7a5e97b933..325358bbc7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSenseMagic.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSenseMagic.java @@ -27,7 +27,7 @@ public EffectSenseMagic(String tag, String description) { public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { if (!(rayTraceResult.getEntity() instanceof LivingEntity living)) return; - ((IPotionEffect)this).applyConfigPotion(living, ModPotions.MAGIC_FIND_EFFECT, spellStats); + this.applyConfigPotion(living, ModPotions.MAGIC_FIND_EFFECT, spellStats); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java index 4a9e696c48..4b5948f693 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java @@ -7,6 +7,7 @@ import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.spell.augment.*; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.item.ItemEntity; @@ -25,6 +26,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Set; @@ -121,6 +123,21 @@ public Set getCompatibleAugments() { ); } + @Override + protected void addDefaultAugmentLimits(Map defaults) { + super.addDefaultAugmentLimits(defaults); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); + } + + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addBlockAoeAugmentDescriptions(map); + map.put(AugmentSensitive.INSTANCE, "Only smelts items, not blocks."); + map.put(AugmentDampen.INSTANCE, "Uses smoking recipes instead of smelting recipes."); + map.put(AugmentAmplify.INSTANCE, "Allows smelting of blocks with higher hardness, or blasting recipes when targeting items."); + } + @Override public String getBookDescription() { return "Smelts blocks and items in the world. AOE will increase the number of items and radius of blocks that can be smelted at once, while Amplify will allow Smelt to work on blocks of higher hardness, Sensitive will make it only smelt items and not blocks. Dampen will cause Smelt to use smoking recipes."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSnare.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSnare.java index 412da6fa9d..01d8bf5c17 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSnare.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSnare.java @@ -4,6 +4,7 @@ import com.hollingsworth.arsnouveau.common.entity.EnchantedFallingBlock; import com.hollingsworth.arsnouveau.common.items.curios.ShapersFocus; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; +import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDurationDown; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentExtendTime; import com.hollingsworth.arsnouveau.setup.registry.ModPotions; import net.minecraft.core.BlockPos; @@ -28,7 +29,7 @@ private EffectSnare() { public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { if (rayTraceResult.getEntity() instanceof LivingEntity living) { - ((IPotionEffect)this).applyConfigPotion(living, ModPotions.SNARE_EFFECT, spellStats); + this.applyConfigPotion(living, ModPotions.SNARE_EFFECT, spellStats); living.setDeltaMovement(0, 0, 0); living.hurtMarked = true; }else if (rayTraceResult.getEntity() instanceof EnchantedFallingBlock fallingBlock) { @@ -51,7 +52,7 @@ public void buildConfig(ModConfigSpec.Builder builder) { @NotNull @Override public Set getCompatibleAugments() { - return augmentSetOf(AugmentExtendTime.INSTANCE); + return augmentSetOf(AugmentExtendTime.INSTANCE, AugmentDurationDown.INSTANCE); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonDecoy.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonDecoy.java index bb6596a7e1..2903c6fd5e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonDecoy.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonDecoy.java @@ -12,6 +12,7 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; +import java.util.Map; import java.util.Set; public class EffectSummonDecoy extends AbstractEffect { @@ -59,6 +60,12 @@ public Set getCompatibleAugments() { return getSummonAugments(); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addSummonAugmentDescriptions(map); + } + @Override public String getBookDescription() { return "Summons a decoy of yourself. Upon summoning, the decoy will attract any nearby mobs to attack it."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonSteed.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonSteed.java index a84ab7c043..19b3ff529e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonSteed.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonSteed.java @@ -1,12 +1,12 @@ package com.hollingsworth.arsnouveau.common.spell.effect; import com.hollingsworth.arsnouveau.api.spell.*; -import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import com.hollingsworth.arsnouveau.common.entity.SummonHorse; import com.hollingsworth.arsnouveau.common.lib.GlyphLib; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAOE; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDurationDown; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentExtendTime; +import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -19,6 +19,7 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; +import java.util.Map; import java.util.Set; public class EffectSummonSteed extends AbstractEffect { @@ -77,6 +78,13 @@ public Set getCompatibleAugments() { ); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addSummonAugmentDescriptions(map); + map.put(AugmentAOE.INSTANCE, "Increases the number of horses summoned."); + } + @Override public String getBookDescription() { return "Summons a saddled horse that will vanish after a few minutes. AOE will increase the amount summoned, while Extend Time will increase the duration of the summon. Applies Summoning Sickness to the caster, and cannot be cast while afflicted by this Sickness."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java index 51e23441d1..750b11493d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonUndead.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; +import java.util.Map; import java.util.Set; public class EffectSummonUndead extends AbstractEffect { @@ -90,6 +91,15 @@ public Set getCompatibleAugments() { return setOf(AugmentExtendTime.INSTANCE, AugmentDurationDown.INSTANCE, AugmentAmplify.INSTANCE, AugmentSplit.INSTANCE, AugmentPierce.INSTANCE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addSummonAugmentDescriptions(map); + map.put(AugmentSplit.INSTANCE, "Increases the number of summoned skeletons."); + map.put(AugmentPierce.INSTANCE, "Changes the summoned skeletons to archers."); + map.put(AugmentAmplify.INSTANCE, "Increases the summoned skeletons' weapon quality."); + } + @Override public String getBookDescription() { return "Summons a number of Skeleton allies that will attack nearby hostile enemies. These Skeletons will last a short time until they begin to take damage, but time may be extended with the " + diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonVex.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonVex.java index af29f715a4..a84cf662f6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonVex.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonVex.java @@ -16,6 +16,7 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; +import java.util.Map; import java.util.Set; public class EffectSummonVex extends AbstractEffect { @@ -71,6 +72,12 @@ public Set getCompatibleAugments() { return getSummonAugments(); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addSummonAugmentDescriptions(map); + } + @Override public String getBookDescription() { return "Summons three Vex allies that will attack nearby hostile enemies. These Vex will last a short time until they begin to take damage, but time may be extended with the " + diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonWolves.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonWolves.java index 6b74536c59..14b4b14a0b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonWolves.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSummonWolves.java @@ -13,6 +13,7 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; +import java.util.Map; import java.util.Set; public class EffectSummonWolves extends AbstractEffect { @@ -61,6 +62,12 @@ public Set getCompatibleAugments() { return getSummonAugments(); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + addSummonAugmentDescriptions(map); + } + @Override public String getBookDescription() { return "Summons two wolves that will fight with you. Extend Time will increase the amount of time on the summons. Applies Summoning Sickness to the caster, preventing other summoning magic."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java index 0f28e805ed..aeebd308ee 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectToss.java @@ -9,7 +9,6 @@ import com.hollingsworth.arsnouveau.common.spell.augment.AugmentDampen; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentExtract; import com.hollingsworth.arsnouveau.common.spell.augment.AugmentRandomize; -import com.hollingsworth.arsnouveau.common.util.ItemUtil; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.item.ItemEntity; @@ -23,9 +22,9 @@ import net.neoforged.neoforge.items.ItemHandlerHelper; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Set; import java.util.function.Consumer; -import java.util.function.Function; import java.util.function.Predicate; public class EffectToss extends AbstractEffect { @@ -121,4 +120,13 @@ public String getBookDescription() { public Set getCompatibleAugments() { return augmentSetOf(AugmentExtract.INSTANCE, AugmentRandomize.INSTANCE, AugmentDampen.INSTANCE, AugmentAmplify.INSTANCE); } + + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentExtract.INSTANCE, "Extracts the item from the caster's inventory."); + map.put(AugmentRandomize.INSTANCE, "Randomizes the stack selection."); + map.put(AugmentDampen.INSTANCE, "Halves the stack size."); + map.put(AugmentAmplify.INSTANCE, "Doubles the stack size."); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWall.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWall.java index fa7925f752..ffb4336549 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWall.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWall.java @@ -13,6 +13,7 @@ import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Set; import static net.minecraft.core.Direction.DOWN; @@ -79,6 +80,24 @@ protected void addDefaultInvalidCombos(Set defaults) { defaults.add(EffectLinger.INSTANCE.getRegistryName()); } + @Override + protected void addDefaultAugmentLimits(Map defaults) { + super.addDefaultAugmentLimits(defaults); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); + } + + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentAOE.INSTANCE, "Increases the target area."); + map.put(AugmentAccelerate.INSTANCE, "Casts spells faster."); + map.put(AugmentDecelerate.INSTANCE, "Casts spells slower."); + map.put(AugmentExtendTime.INSTANCE, "Increases the duration of the effect."); + map.put(AugmentDurationDown.INSTANCE, "Decreases the duration of the effect."); + map.put(AugmentDampen.INSTANCE, "Ignores gravity."); + map.put(AugmentSensitive.INSTANCE, "Targets blocks instead of entities."); + } + @Override public void buildConfig(ModConfigSpec.Builder builder) { super.buildConfig(builder); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWither.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWither.java index e8f7817916..68bcb0ba67 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWither.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWither.java @@ -25,7 +25,7 @@ private EffectWither() { public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { if (rayTraceResult.getEntity() instanceof LivingEntity living) { - ((IPotionEffect)this).applyConfigPotion(living, MobEffects.WITHER, spellStats); + this.applyConfigPotion(living, MobEffects.WITHER, spellStats); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java index 448a41f400..498e2c7e83 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectWololo.java @@ -15,6 +15,7 @@ import com.hollingsworth.arsnouveau.common.spell.augment.AugmentSensitive; import net.minecraft.core.BlockPos; import net.minecraft.core.component.DataComponents; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; @@ -222,18 +223,24 @@ protected int getDefaultManaCost() { return 30; } - /** - * Returns the set of augments that this spell part can be enhanced by. - * Mods should use {@link AbstractSpellPart#compatibleAugments} for addon-supported augments. - * - * @see AbstractSpellPart#augmentSetOf(AbstractAugment...) for easy syntax to make the Set. - * This should not be accessed directly, but can be overridden. - */ @Override protected @NotNull Set getCompatibleAugments() { return augmentSetOf(AugmentRandomize.INSTANCE, AugmentSensitive.INSTANCE); } + @Override + protected void addDefaultAugmentLimits(Map defaults) { + super.addDefaultAugmentLimits(defaults); + defaults.put(AugmentSensitive.INSTANCE.getRegistryName(), 1); + } + + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentRandomize.INSTANCE, "Randomizes the color of the dye used."); + map.put(AugmentSensitive.INSTANCE, "Dyes the targets armor."); + } + public static Map vanillaColors = new HashMap<>(); static { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodPantomime.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodPantomime.java index 0f44804169..4487d1af7a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodPantomime.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodPantomime.java @@ -86,6 +86,14 @@ protected void addDefaultAugmentLimits(Map defaults) defaults.put(AugmentDampen.INSTANCE.getRegistryName(), 1); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentDampen.INSTANCE, "Reduces the target distance."); + map.put(AugmentAmplify.INSTANCE, "Increases the target distance."); + map.put(AugmentSensitive.INSTANCE, "Highlights the selected block."); + } + @Override public String getBookDescription() { return "Applies spells to the nearest block in your line of sight. Dampen will reduce the distance, Amplify will increase it. Sensitive will highlight the selected block."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodProjectile.java index 95e423f800..00711a1684 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodProjectile.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Set; public class MethodProjectile extends AbstractCastMethod { @@ -121,12 +122,22 @@ public CastResolveType onCastOnEntity(ItemStack stack, LivingEntity caster, Enti return CastResolveType.SUCCESS; } - @NotNull + @NotNull @Override public Set getCompatibleAugments() { return augmentSetOf(AugmentPierce.INSTANCE, AugmentSplit.INSTANCE, AugmentAccelerate.INSTANCE, AugmentDecelerate.INSTANCE, AugmentSensitive.INSTANCE); } + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentPierce.INSTANCE, "Projectiles will pierce through enemies and blocks an additional time."); + map.put(AugmentSplit.INSTANCE, "Creates multiple projectiles."); + map.put(AugmentAccelerate.INSTANCE, "Projectiles will move faster."); + map.put(AugmentDecelerate.INSTANCE, "Projectiles will move slower."); + map.put(AugmentSensitive.INSTANCE, "Projectiles will hit plants and other materials that do not block motion."); + } + @Override public String getBookDescription() { return "A spell you start with. Summons a projectile that applies spell effects when this projectile hits a target or block. Sensitive will allow Projectiles to break plants or other materials that do not block motion."; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodTouch.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodTouch.java index d1a74ffa80..d88d32240f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodTouch.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/method/MethodTouch.java @@ -17,6 +17,7 @@ import net.minecraft.world.phys.EntityHitResult; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Set; public class MethodTouch extends AbstractCastMethod { @@ -67,7 +68,13 @@ public void addFadingLight(Level level, double x, double y, double z) { Networking.sendToNearbyClient(level, BlockPos.containing(x, y, z), new PacketAddFadingLight(x, y, z)); } - @NotNull + @Override + public void addAugmentDescriptions(Map map) { + super.addAugmentDescriptions(map); + map.put(AugmentSensitive.INSTANCE, "Can target air and fluids."); + } + + @NotNull @Override public Set getCompatibleAugments() { return augmentSetOf(AugmentSensitive.INSTANCE); From 80f41947d74843683da23f59564c79a7f2846243 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 24 Nov 2024 19:10:26 -0600 Subject: [PATCH 297/363] Supporters --- .../cdae075e2d4d58384fe4d2075f6d5323fe5baa69 | 3 +- .../recipe/tomes/mystifi_tome.json | 30 +++++++++++++++++++ .../common/datagen/CasterTomeProvider.java | 10 +++++++ supporters.json | 7 ++++- 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/mystifi_tome.json diff --git a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 index f2fd3c308b..514c99d53f 100644 --- a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 +++ b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 @@ -1,4 +1,4 @@ -// 1.21.1 2024-11-10T10:39:34.8948897 Ars Nouveau Caster Tomes Datagen +// 1.21.1 2024-11-24T19:09:29.1829951 Ars Nouveau Caster Tomes Datagen ab9cf50e4958592dcee6f5dae6d6bad2e7fe08ab data/ars_nouveau/recipe/tomes/alex_tome.json dae41a867bde9258624fe4676128e8140f2e7fe4 data/ars_nouveau/recipe/tomes/arachne_tome.json 71e004bfa5837d293c6ee00dd9fd99493b9b9aba data/ars_nouveau/recipe/tomes/aurellia_tome.json @@ -15,6 +15,7 @@ fa2eefd9631a78bf8c31e4c9aad34a2517bb9736 data/ars_nouveau/recipe/tomes/ivy_tome. 488adf82fa89d69891e333e9bb94290f8ff6b6b1 data/ars_nouveau/recipe/tomes/kirin_tome.json 43d839ec049575b8c5a5cff6c6c7ff9f2605994c data/ars_nouveau/recipe/tomes/lufia_tome.json 9836505724bc647ab6d1f92f212ad618456c878c data/ars_nouveau/recipe/tomes/lyrellion_tome.json +9cdb7fe0028ff63dddcb16992aad8233a111da3c data/ars_nouveau/recipe/tomes/mystifi_tome.json d7ff05ccece42ac8ee440c7ef0d707e7c3f7e78b data/ars_nouveau/recipe/tomes/othy_tome.json b7b6cc3145b830c0e936f67d3aec459142c85a2c data/ars_nouveau/recipe/tomes/poseidon_tome.json 2a0f47cc40a8be0d2cd08db1a457463b10ed3cf9 data/ars_nouveau/recipe/tomes/renew_rune_tome.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/mystifi_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/mystifi_tome.json new file mode 100644 index 0000000000..dd2fe9a3a0 --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/mystifi_tome.json @@ -0,0 +1,30 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 1, + "g": 128, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Be careful About digging straight down, People say its like digging your own grave", + "name": "Mysti's Gravely Dig", + "sound": { + "sound": { + "id": "ars_nouveau:fire_family_2" + }, + "volume": 0.27 + }, + "spell": [ + "ars_nouveau:glyph_underfoot", + "ars_nouveau:glyph_linger", + "ars_nouveau:glyph_sensitive", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_intangible", + "ars_nouveau:glyph_pierce", + "ars_nouveau:glyph_pierce", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java index c6484a7c5a..2d48353ced 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java @@ -274,6 +274,16 @@ public void collectJsons(CachedOutput pOutput) { "Your enemies will try to kill you. Use this, to kill them back. Cast under a targets feet to bury them. Results may vary.", new ParticleColor(255, 128, 1))); + tomes.add(buildTome("mystifi","Mysti's Gravely Dig", new Spell(MethodUnderfoot.INSTANCE) + .add(EffectLinger.INSTANCE, AugmentSensitive.INSTANCE) + .add(AugmentExtendTime.INSTANCE, 2) + .add(EffectIntangible.INSTANCE) + .add(AugmentPierce.INSTANCE, 2) + .add(AugmentExtendTime.INSTANCE, 2) + .withSound(new ConfiguredSpellSound(SoundRegistry.FIRE_SPELL_SOUND, 0.27f, 1)), + "Be careful About digging straight down, People say its like digging your own grave", + new ParticleColor(255, 128, 1))); + for (CasterRecipeWrapper g : tomes) { Path path = getRecipePath(output, g.id().getPath()); saveStable(pOutput, CasterTomeData.CODEC.encodeStart(JsonOps.INSTANCE, g.toData()).getOrThrow(), path); diff --git a/supporters.json b/supporters.json index f18516868e..0471dd50bf 100644 --- a/supporters.json +++ b/supporters.json @@ -32,7 +32,7 @@ "e7976ce2-3344-4499-8b15-91adddc5ed0f", "d29025d7-cf5d-4976-8a65-fc3bdcc991b5", "8ced638c-eac7-433e-b794-54c0f23807a4", "db489a87-6509-4d75-917d-9c426b519c64", "eb079f27-e266-4b3c-beba-b34d34bef268", "831086b8-d566-4f25-aa09-ecb505e54885", "e3298bd7-61bf-427f-af89-4e418a20bf57", "01b53c7e-c7f4-4465-88df-f8b6c645b6b9", "a29ffabb-ac40-4754-8df8-94b9f394045c", - "aef9c054-e96e-4332-944b-9393105b6ac6"], + "aef9c054-e96e-4332-944b-9393105b6ac6", "1f62ed4b-91f9-42fa-b331-b7e3e3c0637f"], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -514,6 +514,11 @@ "adopter": "Mira", "color": "light_gray", "bio": "There has never been a fluffier Starbuncle, nor will there be. While not particularly bright or strong, Mothball is always happy to be your friend!" + },{ + "name": "Will the Starbuncle", + "adopter": "Mystifi", + "color": "orange", + "bio": "Will The Stabuncle do what? What Will he do? Will Will Willfully a thing?" } ] } From e1caa7fa21df9065b472b7946af2fa8296d8dacd Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 24 Nov 2024 22:13:10 -0600 Subject: [PATCH 298/363] update supporters --- .../cdae075e2d4d58384fe4d2075f6d5323fe5baa69 | 3 +- .../recipe/tomes/plauged757_tome.json | 29 +++++++++++++++++++ .../common/datagen/CasterTomeProvider.java | 4 +++ supporters.json | 7 ++++- 4 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/plauged757_tome.json diff --git a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 index 514c99d53f..6ca9a5901b 100644 --- a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 +++ b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 @@ -1,4 +1,4 @@ -// 1.21.1 2024-11-24T19:09:29.1829951 Ars Nouveau Caster Tomes Datagen +// 1.21.1 2024-11-24T22:12:56.6409296 Ars Nouveau Caster Tomes Datagen ab9cf50e4958592dcee6f5dae6d6bad2e7fe08ab data/ars_nouveau/recipe/tomes/alex_tome.json dae41a867bde9258624fe4676128e8140f2e7fe4 data/ars_nouveau/recipe/tomes/arachne_tome.json 71e004bfa5837d293c6ee00dd9fd99493b9b9aba data/ars_nouveau/recipe/tomes/aurellia_tome.json @@ -17,6 +17,7 @@ fa2eefd9631a78bf8c31e4c9aad34a2517bb9736 data/ars_nouveau/recipe/tomes/ivy_tome. 9836505724bc647ab6d1f92f212ad618456c878c data/ars_nouveau/recipe/tomes/lyrellion_tome.json 9cdb7fe0028ff63dddcb16992aad8233a111da3c data/ars_nouveau/recipe/tomes/mystifi_tome.json d7ff05ccece42ac8ee440c7ef0d707e7c3f7e78b data/ars_nouveau/recipe/tomes/othy_tome.json +119ae572bc9a0f96c350bc53454d0919f0de75d3 data/ars_nouveau/recipe/tomes/plauged757_tome.json b7b6cc3145b830c0e936f67d3aec459142c85a2c data/ars_nouveau/recipe/tomes/poseidon_tome.json 2a0f47cc40a8be0d2cd08db1a457463b10ed3cf9 data/ars_nouveau/recipe/tomes/renew_rune_tome.json f50e62b11676774b3822a8cbd7acf1b0efe8df85 data/ars_nouveau/recipe/tomes/shadow_tome.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/plauged757_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/plauged757_tome.json new file mode 100644 index 0000000000..d27eb1893c --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/plauged757_tome.json @@ -0,0 +1,29 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 1, + "g": 1, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "WARNING: ONLY TO BE USED AS A LAST RESORT!!", + "name": "Self Atomic", + "sound": { + "sound": { + "id": "ars_nouveau:gaia_family" + } + }, + "spell": [ + "ars_nouveau:glyph_self", + "ars_nouveau:glyph_explosion", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_amplify", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe", + "ars_nouveau:glyph_aoe" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java index 2d48353ced..a2f1496438 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java @@ -284,6 +284,10 @@ public void collectJsons(CachedOutput pOutput) { "Be careful About digging straight down, People say its like digging your own grave", new ParticleColor(255, 128, 1))); + tomes.add(buildTome("plauged757", "Self Atomic", new Spell(MethodSelf.INSTANCE, EffectExplosion.INSTANCE, AugmentAmplify.INSTANCE, AugmentAmplify.INSTANCE) + .add(AugmentAOE.INSTANCE, 6) + .withSound(new ConfiguredSpellSound(SoundRegistry.GAIA_SPELL_SOUND)), "WARNING: ONLY TO BE USED AS A LAST RESORT!!", new ParticleColor(255, 1, 1))); + for (CasterRecipeWrapper g : tomes) { Path path = getRecipePath(output, g.id().getPath()); saveStable(pOutput, CasterTomeData.CODEC.encodeStart(JsonOps.INSTANCE, g.toData()).getOrThrow(), path); diff --git a/supporters.json b/supporters.json index 0471dd50bf..8d850e2c01 100644 --- a/supporters.json +++ b/supporters.json @@ -32,7 +32,7 @@ "e7976ce2-3344-4499-8b15-91adddc5ed0f", "d29025d7-cf5d-4976-8a65-fc3bdcc991b5", "8ced638c-eac7-433e-b794-54c0f23807a4", "db489a87-6509-4d75-917d-9c426b519c64", "eb079f27-e266-4b3c-beba-b34d34bef268", "831086b8-d566-4f25-aa09-ecb505e54885", "e3298bd7-61bf-427f-af89-4e418a20bf57", "01b53c7e-c7f4-4465-88df-f8b6c645b6b9", "a29ffabb-ac40-4754-8df8-94b9f394045c", - "aef9c054-e96e-4332-944b-9393105b6ac6", "1f62ed4b-91f9-42fa-b331-b7e3e3c0637f"], + "aef9c054-e96e-4332-944b-9393105b6ac6", "1f62ed4b-91f9-42fa-b331-b7e3e3c0637f", "eb14192a-c53f-44c0-bb13-7f7ff1a0e662"], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -519,6 +519,11 @@ "adopter": "Mystifi", "color": "orange", "bio": "Will The Stabuncle do what? What Will he do? Will Will Willfully a thing?" + },{ + "name": "Nooch", + "adopter": "Plagued757", + "bio": "What an odd name for a mystical creature? Oh well, at least it stands out amongst the rest of its kind, even if its a little.. weird.", + "color": "purple" } ] } From e4c2acadb88042fe2aa2dea9db127a1cc6b379ec Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 25 Nov 2024 09:17:23 -0600 Subject: [PATCH 299/363] 5.3.0 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 6dd09f3f0b..ecb93edff6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.2.7 +mod_version=5.3.0 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From cd264fda371dc47588d4779d58d485db6dba6d7c Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Mon, 25 Nov 2024 10:09:39 -0600 Subject: [PATCH 300/363] Fix crash with no spell, bookstack not updating --- gradle.properties | 2 +- .../client/gui/book/GuiSpellBook.java | 18 +++++++++++++----- .../common/network/PacketUpdateBookGUI.java | 5 +++-- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/gradle.properties b/gradle.properties index ecb93edff6..9d3b423297 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.3.0 +mod_version=5.3.1 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index c4cf8f9c6c..35ab62a011 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -134,6 +134,14 @@ public GuiSpellBook(InteractionHand hand) { spell = new ArrayList<>(recipe); } + public void onBookstackUpdated(ItemStack stack){ + this.bookStack = stack; + this.caster = SpellCasterRegistry.from(stack); + if(caster == null){ + Minecraft.getInstance().setScreen(null); + } + } + @Override public void init() { super.init(); @@ -663,6 +671,9 @@ private int getCurrentManaCost() { */ private void validate() { resetCraftingCells(); + //update mana cache + currentCostCache = getCurrentManaCost(); + maxManaCache = ManaUtil.getMaxMana(Minecraft.getInstance().player); // Reset the crafting slots and build the recipe to validate for (CraftingButton b : craftingCells) { @@ -706,7 +717,8 @@ private void validate() { lastGlyphNoGap = i; } - List slicedSpell = spell.subList(0, lastGlyphNoGap + 1); + + List slicedSpell = spell.subList(0, spell.isEmpty() ? 0 : (lastGlyphNoGap + 1)); // Set validation errors on all of the glyph buttons for (GlyphButton glyphButton : glyphButtons) { glyphButton.validationErrors.clear(); @@ -723,10 +735,6 @@ private void validate() { // Remove the simulated glyph to make room for the next one slicedSpell.removeLast(); } - - //update mana cache - currentCostCache = getCurrentManaCost(); - maxManaCache = ManaUtil.getMaxMana(Minecraft.getInstance().player); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateBookGUI.java b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateBookGUI.java index b8d4c274ce..06af0c9387 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateBookGUI.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/network/PacketUpdateBookGUI.java @@ -30,8 +30,9 @@ public PacketUpdateBookGUI(ItemStack stack) { @Override public void onClientReceived(Minecraft minecraft, Player player) { - if (ArsNouveau.proxy.getMinecraft().screen instanceof GuiSpellBook) - ((GuiSpellBook) ArsNouveau.proxy.getMinecraft().screen).bookStack = bookStack; + if (minecraft.screen instanceof GuiSpellBook guiSpellBook) { + guiSpellBook.onBookstackUpdated(bookStack); + } } @Override From 45c2ee9cc8d75afefef6415f18c7139ecddd2389 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 27 Nov 2024 11:29:07 -0600 Subject: [PATCH 301/363] Update supporters.json --- supporters.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/supporters.json b/supporters.json index 8d850e2c01..f8208128dd 100644 --- a/supporters.json +++ b/supporters.json @@ -32,7 +32,8 @@ "e7976ce2-3344-4499-8b15-91adddc5ed0f", "d29025d7-cf5d-4976-8a65-fc3bdcc991b5", "8ced638c-eac7-433e-b794-54c0f23807a4", "db489a87-6509-4d75-917d-9c426b519c64", "eb079f27-e266-4b3c-beba-b34d34bef268", "831086b8-d566-4f25-aa09-ecb505e54885", "e3298bd7-61bf-427f-af89-4e418a20bf57", "01b53c7e-c7f4-4465-88df-f8b6c645b6b9", "a29ffabb-ac40-4754-8df8-94b9f394045c", - "aef9c054-e96e-4332-944b-9393105b6ac6", "1f62ed4b-91f9-42fa-b331-b7e3e3c0637f", "eb14192a-c53f-44c0-bb13-7f7ff1a0e662"], + "aef9c054-e96e-4332-944b-9393105b6ac6", "1f62ed4b-91f9-42fa-b331-b7e3e3c0637f", "eb14192a-c53f-44c0-bb13-7f7ff1a0e662", + "758ca96e-100a-4611-a849-5d76229b6c83"], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -524,6 +525,11 @@ "adopter": "Plagued757", "bio": "What an odd name for a mystical creature? Oh well, at least it stands out amongst the rest of its kind, even if its a little.. weird.", "color": "purple" + },{ + "name": "Eclipse", + "adopter": "Sophie", + "color": "pink", + "bio": "A little engineer turned into a curious creature, she's sure to help in any way she can." } ] } From b638b11492411e282899d13824bc90c747d6e425 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 30 Nov 2024 09:03:56 -0600 Subject: [PATCH 302/363] Fix augment descriptions using wrong translation key --- .../hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java index 42fd0361f9..f6053672be 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/AbstractSpellPart.java @@ -92,7 +92,7 @@ public AbstractSpellPart(ResourceLocation registryName, String name) { Map map = new ConcurrentHashMap<>(); this.addAugmentDescriptions(map); for(AbstractAugment augment : map.keySet()){ - augmentDescriptions.put(augment, Component.translatable(map.get(augment))); + augmentDescriptions.put(augment, Component.translatable("ars_nouveau.augment_desc." + registryName.getPath() + "_" + augment.getRegistryName().getPath())); } if(!FMLEnvironment.production){ for(AbstractAugment augment : compatibleAugments){ From 5554712621165a7e81eb14686a4b088332c4af82 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 30 Nov 2024 09:59:23 -0600 Subject: [PATCH 303/363] Add lectern config, fix linking --- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 ++-- .../assets/ars_nouveau/lang/en_us.json | 4 ++-- .../common/block/tile/StorageLecternTile.java | 17 +++++++++++------ .../arsnouveau/common/datagen/LangDatagen.java | 4 ++-- .../arsnouveau/setup/config/ServerConfig.java | 6 +++++- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index a7ac38925f..dfebba0a5e 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-11-24T15:48:43.600024 Languages: en_us for mod: ars_nouveau -e87d9cae5756a85082a8ae5f95896ea9f016c1c6 assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-11-30T09:11:00.0655628 Languages: en_us for mod: ars_nouveau +0eb8e34a057c397915e153eeb94aa30e48fa3b75 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 0efd3ff7ce..562f549347 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -1197,9 +1197,9 @@ "ars_nouveau.starbuncle_stacking": "Starby Stacking", "ars_nouveau.storage": "Advanced Usage", "ars_nouveau.storage.from_set": "Inventory added.", - "ars_nouveau.storage.inv_too_far": "Inventory must be within 30 blocks.", + "ars_nouveau.storage.inv_too_far": "Inventory must be within %s blocks.", "ars_nouveau.storage.lectern_chained": "Linked to x: %s y: %s z: %s", - "ars_nouveau.storage.lectern_too_far": "Lectern must be within 30 blocks.", + "ars_nouveau.storage.lectern_too_far": "Lectern must be within %s blocks.", "ars_nouveau.storage.no_tile": "Not a valid inventory.", "ars_nouveau.storage.not_lectern": "Connect to another Lectern to connect the views.", "ars_nouveau.storage.num_bookwyrms": "%s Bookwyrms", diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java index fb3ed8fe13..1268d16bcb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java @@ -18,6 +18,7 @@ import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.config.Config; +import com.hollingsworth.arsnouveau.setup.config.ServerConfig; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -239,8 +240,8 @@ public void onFinishedConnectionLast(@Nullable BlockPos storedPos, @Nullable Dir PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.storage.no_tile")); return; } - if (BlockUtil.distanceFrom(storedPos, worldPosition) > 30) { - PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.storage.inv_too_far")); + if (BlockUtil.distanceFrom(storedPos, worldPosition) > ServerConfig.LECTERN_LINK_RANGE.get()) { + PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.storage.inv_too_far", ServerConfig.LECTERN_LINK_RANGE.get())); return; } if(this.getBlockPos().equals(storedPos)){ @@ -268,9 +269,12 @@ public void onFinishedConnectionFirst(@Nullable BlockPos storedPos, @Nullable Di if (storedPos == null || storedPos.equals(worldPosition) || level == null) { return; } - - if (BlockUtil.distanceFrom(storedPos, worldPosition) > 30) { - PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.storage.lectern_too_far")); + BlockEntity tile = level.getBlockEntity(storedPos); + if (!(tile instanceof StorageLecternTile)) { + return; + } + if (BlockUtil.distanceFrom(storedPos, worldPosition) > ServerConfig.LECTERN_LINK_RANGE.get()) { + PortUtil.sendMessage(playerEntity, Component.translatable("ars_nouveau.storage.lectern_too_far", ServerConfig.LECTERN_LINK_RANGE.get())); return; } this.mainLecternPos = storedPos.immutable(); @@ -510,11 +514,12 @@ protected void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegis CompoundTag c = list.getCompound(i); connectedInventories.add(new BlockPos(c.getInt("x"), c.getInt("y"), c.getInt("z"))); } + mainLecternPos = null; if (compound.contains("mainLecternPos")) { mainLecternPos = BlockPos.of(compound.getLong("mainLecternPos")); } + bookwyrmUUIDs.clear(); if (compound.contains("bookwyrmUUIDs")) { - bookwyrmUUIDs.clear(); ListTag bookwyrmList = compound.getList("bookwyrmUUIDs", 11); for (Tag tag : bookwyrmList) { bookwyrmUUIDs.add(NbtUtils.loadUUID(tag)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index d3c971ba0f..6c09d6452f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -1223,8 +1223,8 @@ protected void addTranslations() { add("ars_nouveau.storage.num_bookwyrms", "%s Bookwyrms"); add("ars_nouveau.storage.removed", "Inventory removed."); add("ars_nouveau.storage.not_lectern", "Connect to another Lectern to connect the views."); - add("ars_nouveau.storage.lectern_too_far", "Lectern must be within 30 blocks."); - add("ars_nouveau.storage.inv_too_far", "Inventory must be within 30 blocks."); + add("ars_nouveau.storage.lectern_too_far", "Lectern must be within %s blocks."); + add("ars_nouveau.storage.inv_too_far", "Inventory must be within %s blocks."); add("ars_nouveau.storage.no_tile", "Not a valid inventory."); add("block.ars_nouveau.storage_lectern", "Storage Lectern"); add("ars_nouveau.page1.storage_lectern", "The Storage Lectern can used to view, manage, and craft from multiple connected inventories. The number of inventories that may be connected is determined by the number of Bookwyrms bound to the lectern. You can add more Bookwyrms to the lectern by using a Bookwyrm Charm. Use the Dominion Wand from an inventory to the lectern in order to bind or remove access. Inventories can be connected 30 blocks away."); diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ServerConfig.java b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ServerConfig.java index c8b80875f9..e75a8525ac 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/config/ServerConfig.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/config/ServerConfig.java @@ -21,10 +21,14 @@ public class ServerConfig { public static ModConfigSpec.BooleanValue INFINITE_SPELLS; public static ModConfigSpec.IntValue NOT_SO_INFINITE_SPELLS; - + public static ModConfigSpec.IntValue LECTERN_LINK_RANGE; static { ModConfigSpec.Builder SERVER_BUILDER = new ModConfigSpec.Builder(); + SERVER_BUILDER.comment("Blocks").push("blocks"); + LECTERN_LINK_RANGE = SERVER_BUILDER.comment("Maximum storage lectern linking range").defineInRange("lecternLinkRange", 30, 1, Integer.MAX_VALUE); + SERVER_BUILDER.pop(); + SERVER_BUILDER.comment("Mana").push("mana"); INIT_MANA_REGEN = SERVER_BUILDER.comment("Base mana regen in seconds").defineInRange("baseRegen", 5, 0, Integer.MAX_VALUE); INIT_MAX_MANA = SERVER_BUILDER.comment("Base max mana").defineInRange("baseMax", 100, 0, Integer.MAX_VALUE); From 57a3022eae4ef0e67fe81b04ac8bc6e2a91313a6 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 30 Nov 2024 10:07:41 -0600 Subject: [PATCH 304/363] Add serene season tags #1512 --- .../eac00f78ae0d33a31d4f208cb05939a004e6cb91 | 6 +++++- .../tags/block/autumn_crops.json | 7 +++++++ .../tags/block/spring_crops.json | 7 +++++++ .../tags/block/summer_crops.json | 7 +++++++ .../tags/block/winter_crops.json | 7 +++++++ .../common/datagen/BlockTagProvider.java | 20 +++++++++++++++++++ 6 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/generated/resources/data/sereneseasons/tags/block/autumn_crops.json create mode 100644 src/generated/resources/data/sereneseasons/tags/block/spring_crops.json create mode 100644 src/generated/resources/data/sereneseasons/tags/block/summer_crops.json create mode 100644 src/generated/resources/data/sereneseasons/tags/block/winter_crops.json diff --git a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 index 0897b9f1c1..48b9035349 100644 --- a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 +++ b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 @@ -1,4 +1,4 @@ -// 1.21.1 2024-11-02T21:24:07.8371802 AN tags +// 1.21.1 2024-11-30T10:07:18.7027 AN tags 939cde8f97e4e8d7ea8445415522f703b2b927d4 data/ars_nouveau/tags/block/an_decorative.json de95bc21249101b079255a1a00274f60d55e0602 data/ars_nouveau/tags/block/blazing_logs.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/block/break_blacklist.json @@ -59,3 +59,7 @@ a01909919207615cda1bb44f33db287efa02333b data/minecraft/tags/block/wooden_doors. 70afef6fe4926a8dbf1205248dc1371974ef3037 data/minecraft/tags/block/wooden_slabs.json e5d97b748b59672ba4baec9c3f1093370adf0332 data/minecraft/tags/block/wooden_stairs.json 23fc13405d4dc43512deb39ee5bbbb73da177166 data/minecraft/tags/block/wooden_trapdoors.json +336846dc81b26d8bbe0f7a94c56cd769dc47fe1d data/sereneseasons/tags/block/autumn_crops.json +89c5ef23119c5bce8be294cd59d6c42530dca3a2 data/sereneseasons/tags/block/spring_crops.json +b71c14024b9d4ee697d0a80dcc6be06be52da98e data/sereneseasons/tags/block/summer_crops.json +abdb4d3d8f68389efc82016295267c54f9ca7f42 data/sereneseasons/tags/block/winter_crops.json diff --git a/src/generated/resources/data/sereneseasons/tags/block/autumn_crops.json b/src/generated/resources/data/sereneseasons/tags/block/autumn_crops.json new file mode 100644 index 0000000000..c698bc4eb8 --- /dev/null +++ b/src/generated/resources/data/sereneseasons/tags/block/autumn_crops.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ars_nouveau:sourceberry_bush", + "ars_nouveau:purple_archwood_sapling", + "ars_nouveau:bastion_pod" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/sereneseasons/tags/block/spring_crops.json b/src/generated/resources/data/sereneseasons/tags/block/spring_crops.json new file mode 100644 index 0000000000..a62659ccd2 --- /dev/null +++ b/src/generated/resources/data/sereneseasons/tags/block/spring_crops.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ars_nouveau:magebloom_crop", + "ars_nouveau:green_archwood_sapling", + "ars_nouveau:mendosteen_pod" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/sereneseasons/tags/block/summer_crops.json b/src/generated/resources/data/sereneseasons/tags/block/summer_crops.json new file mode 100644 index 0000000000..780065bf57 --- /dev/null +++ b/src/generated/resources/data/sereneseasons/tags/block/summer_crops.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ars_nouveau:magebloom_crop", + "ars_nouveau:red_archwood_sapling", + "ars_nouveau:bombegranate_pod" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/sereneseasons/tags/block/winter_crops.json b/src/generated/resources/data/sereneseasons/tags/block/winter_crops.json new file mode 100644 index 0000000000..4b01b655ed --- /dev/null +++ b/src/generated/resources/data/sereneseasons/tags/block/winter_crops.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ars_nouveau:sourceberry_bush", + "ars_nouveau:blue_archwood_sapling", + "ars_nouveau:frostaya_pod" + ] +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java index 02260b98d4..52a12ef1f1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java @@ -46,6 +46,12 @@ public class BlockTagProvider extends IntrinsicHolderTagsProvider { public static TagKey DOWSING_ROD = BlockTags.create(ArsNouveau.prefix( "dowsing_rod")); public static TagKey BUSHES = BlockTags.create(ResourceLocation.fromNamespaceAndPath("c", "bushes")); + public static TagKey SPRING_CROPS = BlockTags.create(ResourceLocation.fromNamespaceAndPath("sereneseasons", "spring_crops")); + public static TagKey SUMMER_CROPS = BlockTags.create(ResourceLocation.fromNamespaceAndPath("sereneseasons", "summer_crops")); + public static TagKey AUTUMN_CROPS = BlockTags.create(ResourceLocation.fromNamespaceAndPath("sereneseasons", "autumn_crops")); + public static TagKey WINTER_CROPS = BlockTags.create(ResourceLocation.fromNamespaceAndPath("sereneseasons", "winter_crops")); + + public BlockTagProvider(PackOutput output, CompletableFuture future, ExistingFileHelper helper) { super(output, Registries.BLOCK, future, block -> block.builtInRegistryHolder().key(), ArsNouveau.MODID, helper); } @@ -300,6 +306,20 @@ protected void addTags(HolderLookup.Provider pProvider) { this.tag(BlockTags.SNOW_LAYER_CANNOT_SURVIVE_ON).add(BlockRegistry.ALTERATION_TABLE.get(), BlockRegistry.WIXIE_CAULDRON.get(), BlockRegistry.POTION_MELDER.get(), BlockRegistry.SCRIBES_BLOCK.get(), BlockRegistry.IMBUEMENT_BLOCK.get(), BlockRegistry.SCRYERS_OCULUS.get(), BlockRegistry.ARCANE_PEDESTAL.get(), BlockRegistry.CRAFTING_LECTERN.get(), BlockRegistry.ENCHANTING_APP_BLOCK.get()); + + this.tag(SPRING_CROPS).add(BlockRegistry.MAGE_BLOOM_CROP.get(), + BlockRegistry.FLOURISHING_SAPLING.get(), + BlockRegistry.MENDOSTEEN_POD.get()); + this.tag(SUMMER_CROPS).add(BlockRegistry.MAGE_BLOOM_CROP.get(), + BlockRegistry.BLAZING_SAPLING.get(), + BlockRegistry.BOMBEGRANTE_POD.get()); + this.tag(WINTER_CROPS).add(BlockRegistry.SOURCEBERRY_BUSH.get(), + BlockRegistry.CASCADING_SAPLING.get(), + BlockRegistry.FROSTAYA_POD.get()); + + this.tag(AUTUMN_CROPS).add(BlockRegistry.SOURCEBERRY_BUSH.get(), + BlockRegistry.VEXING_SAPLING.get(), + BlockRegistry.BASTION_POD.get()); } public String getName() { From 157c0f2151091373e1dff918ce34cbf1631f0765 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 30 Nov 2024 10:09:23 -0600 Subject: [PATCH 305/363] Fix crash with invalid potion types #1526 --- .../com/hollingsworth/arsnouveau/common/util/PotionUtil.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java b/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java index 33384a8ce0..a4bdda39c1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/util/PotionUtil.java @@ -73,7 +73,9 @@ public static PotionContents merge(PotionContents contents1, PotionContents cont for(MobEffectInstance effect : contents2.getAllEffects()){ set.add(new MobEffectInstance(effect)); } - contents1.potion().get().value().getEffects().forEach(set::remove); + if(contents1.potion().isPresent()) { + contents1.potion().get().value().getEffects().forEach(set::remove); + } return new PotionContents(contents1.potion(), contents1.customColor(), new ArrayList<>(set)); } } From 2cbcdb679eeba92969245b8aaa6f2ebb231372a6 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 30 Nov 2024 10:43:46 -0600 Subject: [PATCH 306/363] Fix duplicate starbuncle shard recipe, namespace --- .../9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e | 36 +++++++++---------- .../recipes/misc/clear_alakarkinos_charm.json | 4 +-- .../misc/clear_amethyst_golem_charm.json | 4 +-- .../recipes/misc/clear_bookwyrm_charm.json | 4 +-- .../recipes/misc/clear_drygmy_charm.json | 4 +-- .../recipes/misc/clear_starbuncle_charm.json | 4 +-- .../recipes/misc/clear_starbuncle_shard.json | 4 +-- .../recipes/misc/clear_whirlisprig_charm.json | 4 +-- .../recipes/misc/clear_wixie_charm.json | 4 +-- .../recipes/misc/wipe_starby_shard.json | 32 ----------------- .../recipe/clear_alakarkinos_charm.json | 0 .../recipe/clear_amethyst_golem_charm.json | 0 .../recipe/clear_bookwyrm_charm.json | 0 .../recipe/clear_drygmy_charm.json | 0 .../recipe/clear_starbuncle_charm.json | 0 .../recipe/clear_starbuncle_shard.json | 0 .../recipe/clear_whirlisprig_charm.json | 0 .../recipe/clear_wixie_charm.json | 0 .../ars_nouveau/recipe/wipe_starby_shard.json | 13 ------- .../common/datagen/RecipeDatagen.java | 17 +++++---- 20 files changed, 41 insertions(+), 89 deletions(-) rename src/generated/resources/data/{minecraft => ars_nouveau}/advancement/recipes/misc/clear_alakarkinos_charm.json (83%) rename src/generated/resources/data/{minecraft => ars_nouveau}/advancement/recipes/misc/clear_amethyst_golem_charm.json (82%) rename src/generated/resources/data/{minecraft => ars_nouveau}/advancement/recipes/misc/clear_bookwyrm_charm.json (84%) rename src/generated/resources/data/{minecraft => ars_nouveau}/advancement/recipes/misc/clear_drygmy_charm.json (84%) rename src/generated/resources/data/{minecraft => ars_nouveau}/advancement/recipes/misc/clear_starbuncle_charm.json (83%) rename src/generated/resources/data/{minecraft => ars_nouveau}/advancement/recipes/misc/clear_starbuncle_shard.json (83%) rename src/generated/resources/data/{minecraft => ars_nouveau}/advancement/recipes/misc/clear_whirlisprig_charm.json (83%) rename src/generated/resources/data/{minecraft => ars_nouveau}/advancement/recipes/misc/clear_wixie_charm.json (85%) delete mode 100644 src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wipe_starby_shard.json rename src/generated/resources/data/{minecraft => ars_nouveau}/recipe/clear_alakarkinos_charm.json (100%) rename src/generated/resources/data/{minecraft => ars_nouveau}/recipe/clear_amethyst_golem_charm.json (100%) rename src/generated/resources/data/{minecraft => ars_nouveau}/recipe/clear_bookwyrm_charm.json (100%) rename src/generated/resources/data/{minecraft => ars_nouveau}/recipe/clear_drygmy_charm.json (100%) rename src/generated/resources/data/{minecraft => ars_nouveau}/recipe/clear_starbuncle_charm.json (100%) rename src/generated/resources/data/{minecraft => ars_nouveau}/recipe/clear_starbuncle_shard.json (100%) rename src/generated/resources/data/{minecraft => ars_nouveau}/recipe/clear_whirlisprig_charm.json (100%) rename src/generated/resources/data/{minecraft => ars_nouveau}/recipe/clear_wixie_charm.json (100%) delete mode 100644 src/generated/resources/data/ars_nouveau/recipe/wipe_starby_shard.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index 9652a3e4fa..666f5dd842 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,4 +1,4 @@ -// 1.21.1 2024-11-03T09:24:17.7282028 Recipes +// 1.21.1 2024-11-30T10:36:09.6049088 Recipes a76e5d9eef406841f56740535ec2afdd509de507 data/ars_nouveau/advancement/recipes/building_blocks/archwood_button.json 443515bb80018fbe37a128cb6849f5e818be315d data/ars_nouveau/advancement/recipes/building_blocks/archwood_door.json 4dfc3afae271aae8423d20dedb67dc601ff71fa0 data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence.json @@ -115,8 +115,16 @@ fe2d63b2c1ab989576d865de606e933041d432c9 data/ars_nouveau/advancement/recipes/mi 1a7b11ebce4db493ec50cf75cba887031da1f10f data/ars_nouveau/advancement/recipes/misc/blue_archwood_wood.json 93e1fcf252f3070b7f8177b7bc53a40afef1b50a data/ars_nouveau/advancement/recipes/misc/blue_sbed.json 322033a1b280739bdbdb1727bcff7a062543f295 data/ars_nouveau/advancement/recipes/misc/challenge_2.json +60fb2d89f6829a85a743f7fb5e8164af8f3576b2 data/ars_nouveau/advancement/recipes/misc/clear_alakarkinos_charm.json 7da8bc295360a5593768f48cb28969e176ed9c26 data/ars_nouveau/advancement/recipes/misc/clear_allow.json +022bff3d3d654bc750717eb077eb7c9892df113f data/ars_nouveau/advancement/recipes/misc/clear_amethyst_golem_charm.json +b9f2fd2eb9477dd48886b165440a918350727c65 data/ars_nouveau/advancement/recipes/misc/clear_bookwyrm_charm.json bd84245ddb990572c5b7c28344abbef91b6afffd data/ars_nouveau/advancement/recipes/misc/clear_deny.json +5a3d3f96e18e805b669bd8ff79668f4220b80132 data/ars_nouveau/advancement/recipes/misc/clear_drygmy_charm.json +549f8b6de89b380ff2c270c7b80319196afa0d45 data/ars_nouveau/advancement/recipes/misc/clear_starbuncle_charm.json +0aa677aa592a9c5b55085d2a19fbbe7efac8ddc8 data/ars_nouveau/advancement/recipes/misc/clear_starbuncle_shard.json +85f73c390801eb059a22b5a1865390dd98950eb8 data/ars_nouveau/advancement/recipes/misc/clear_whirlisprig_charm.json +60a32504ac4e3f07856443863abd295eaab31613 data/ars_nouveau/advancement/recipes/misc/clear_wixie_charm.json 3b9109fa6d74c9ea53ec1c988f11d63b82b158c8 data/ars_nouveau/advancement/recipes/misc/conjuration_essence_to_end_stone.json 51662ebf31064f23ee492a65c57354e3f379b3b2 data/ars_nouveau/advancement/recipes/misc/conjuration_essence_to_soul_sand.json aeb58692a9a5d2ae343fb99c63c6e5b4face1165 data/ars_nouveau/advancement/recipes/misc/deny_scroll.json @@ -278,7 +286,6 @@ b29d4b79698922fff384dcb4c8cfdc4f755e66a5 data/ars_nouveau/advancement/recipes/mi adb956258b9aff02e0b8396cd3b1c30743c00f3b data/ars_nouveau/advancement/recipes/misc/wilden_summon_alt.json 14cec136a7a9321a31b4fc30ccdb0b92fac35723 data/ars_nouveau/advancement/recipes/misc/wing_to_leather.json db1612c9ca686be98cf08042852b554004c20b36 data/ars_nouveau/advancement/recipes/misc/wipe_spell_parchment.json -af16e626f979fe486e94e2ce83029e605f9e0484 data/ars_nouveau/advancement/recipes/misc/wipe_starby_shard.json 3c94cedc091410f9753fafd28c68c70e065e43d2 data/ars_nouveau/advancement/recipes/misc/wixie_hat.json f5d0e8bf6c31595b6a37dc127d98a90a542353ca data/ars_nouveau/advancement/recipes/misc/worn_notebook.json 0d8e97944642ff8e877d0aa4688fa4407f09fe61 data/ars_nouveau/advancement/recipes/misc/yellow_sbed.json @@ -310,8 +317,16 @@ e27acf9a62c7ac6edd984df1f526089bb5d8c768 data/ars_nouveau/recipe/archwood_to_che 05a109cd0b76401aa94d1958644e15df3ee1295c data/ars_nouveau/recipe/blue_archwood_wood.json f7f44d2c3eb30021937d9cec4fe65a1921d29c1e data/ars_nouveau/recipe/blue_sbed.json fa6ef2dc0ff3bed59dae1e84d229529b02860109 data/ars_nouveau/recipe/challenge_2.json +36f93e4053af09f5393c6b147fffbc69c7ef1ddb data/ars_nouveau/recipe/clear_alakarkinos_charm.json aaa983f63a03c4423709c2cd6b7c064df9fa555f data/ars_nouveau/recipe/clear_allow.json +6b2aa4d03411783352471307a0b74faf3b5ec516 data/ars_nouveau/recipe/clear_amethyst_golem_charm.json +ee6a4ca85028a4c6b2b7373d7da7a62573c1bb99 data/ars_nouveau/recipe/clear_bookwyrm_charm.json 4b75d660393bdf2ef048cd1d1b5a060ad2e1e69d data/ars_nouveau/recipe/clear_deny.json +28dd25917feed5b72c8f449830ddad58caf9710a data/ars_nouveau/recipe/clear_drygmy_charm.json +744dd39d50c1277291980520aeb5eaa548da6fb6 data/ars_nouveau/recipe/clear_starbuncle_charm.json +e40f3959e9af493782395c436060a4c80ee61929 data/ars_nouveau/recipe/clear_starbuncle_shard.json +642a9347a8cdbb423f8303d800738cc9319c93dd data/ars_nouveau/recipe/clear_whirlisprig_charm.json +c3023681f4c929c8990c1ae05f198d353daddd31 data/ars_nouveau/recipe/clear_wixie_charm.json a6d152a895509e9499224a26df6a16958eb1a7ab data/ars_nouveau/recipe/conjuration_essence_to_end_stone.json eb467e8db516eb4a594e598773148c391b95246b data/ars_nouveau/recipe/conjuration_essence_to_soul_sand.json 93301e4c21000b77f346500c66d17515abddb623 data/ars_nouveau/recipe/deny_scroll.json @@ -561,23 +576,6 @@ c19871c38692c25e6045b280e8b4b5d36203c15f data/ars_nouveau/recipe/water_essence_t f9c3f8eef713e609e22c9c5b3eba2b848c13af89 data/ars_nouveau/recipe/wilden_summon_alt.json 70042fe858652ec14314d20f993b5bade0b7de16 data/ars_nouveau/recipe/wing_to_leather.json 532075e3c595e9d3b3b067289d5efbaf7fe49362 data/ars_nouveau/recipe/wipe_spell_parchment.json -e40f3959e9af493782395c436060a4c80ee61929 data/ars_nouveau/recipe/wipe_starby_shard.json c1ff140a7eea0c25559c9445572b928edec0d5f1 data/ars_nouveau/recipe/wixie_hat.json 635ab6a0a28315545b61d556d8924deac512ac98 data/ars_nouveau/recipe/worn_notebook.json 6fd5261e1412280fcc8d3a12414c7cb6342b78f3 data/ars_nouveau/recipe/yellow_sbed.json -4a0bca6db6b1f078e1f74a54c3ef7792c417fed8 data/minecraft/advancement/recipes/misc/clear_alakarkinos_charm.json -b28977b57687b12771356d3a03d3f80b84966266 data/minecraft/advancement/recipes/misc/clear_amethyst_golem_charm.json -a43956ca840726d63a7ad568808b8e25568e3770 data/minecraft/advancement/recipes/misc/clear_bookwyrm_charm.json -d66f72c8b0941a426ff060e99764be325714050c data/minecraft/advancement/recipes/misc/clear_drygmy_charm.json -100ab394a95ab190843f4d76f5c233e2911a54a8 data/minecraft/advancement/recipes/misc/clear_starbuncle_charm.json -86197147340c7828d85eee8993772465b8e0544a data/minecraft/advancement/recipes/misc/clear_starbuncle_shard.json -fe7dc162a7ed20009710cbdb6a1ccbd94a034b6d data/minecraft/advancement/recipes/misc/clear_whirlisprig_charm.json -c38e4ff3ebfaae36efe861f63409a42ef7887505 data/minecraft/advancement/recipes/misc/clear_wixie_charm.json -36f93e4053af09f5393c6b147fffbc69c7ef1ddb data/minecraft/recipe/clear_alakarkinos_charm.json -6b2aa4d03411783352471307a0b74faf3b5ec516 data/minecraft/recipe/clear_amethyst_golem_charm.json -ee6a4ca85028a4c6b2b7373d7da7a62573c1bb99 data/minecraft/recipe/clear_bookwyrm_charm.json -28dd25917feed5b72c8f449830ddad58caf9710a data/minecraft/recipe/clear_drygmy_charm.json -744dd39d50c1277291980520aeb5eaa548da6fb6 data/minecraft/recipe/clear_starbuncle_charm.json -e40f3959e9af493782395c436060a4c80ee61929 data/minecraft/recipe/clear_starbuncle_shard.json -642a9347a8cdbb423f8303d800738cc9319c93dd data/minecraft/recipe/clear_whirlisprig_charm.json -c3023681f4c929c8990c1ae05f198d353daddd31 data/minecraft/recipe/clear_wixie_charm.json diff --git a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_alakarkinos_charm.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_alakarkinos_charm.json similarity index 83% rename from src/generated/resources/data/minecraft/advancement/recipes/misc/clear_alakarkinos_charm.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_alakarkinos_charm.json index 1ce805157d..54ebf85ae5 100644 --- a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_alakarkinos_charm.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_alakarkinos_charm.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "minecraft:clear_alakarkinos_charm" + "recipe": "ars_nouveau:clear_alakarkinos_charm" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "minecraft:clear_alakarkinos_charm" + "ars_nouveau:clear_alakarkinos_charm" ] } } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_amethyst_golem_charm.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_amethyst_golem_charm.json similarity index 82% rename from src/generated/resources/data/minecraft/advancement/recipes/misc/clear_amethyst_golem_charm.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_amethyst_golem_charm.json index 9d754f987c..c14d4cc443 100644 --- a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_amethyst_golem_charm.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_amethyst_golem_charm.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "minecraft:clear_amethyst_golem_charm" + "recipe": "ars_nouveau:clear_amethyst_golem_charm" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "minecraft:clear_amethyst_golem_charm" + "ars_nouveau:clear_amethyst_golem_charm" ] } } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_bookwyrm_charm.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_bookwyrm_charm.json similarity index 84% rename from src/generated/resources/data/minecraft/advancement/recipes/misc/clear_bookwyrm_charm.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_bookwyrm_charm.json index 1bd7c279e7..141b3d84bc 100644 --- a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_bookwyrm_charm.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_bookwyrm_charm.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "minecraft:clear_bookwyrm_charm" + "recipe": "ars_nouveau:clear_bookwyrm_charm" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "minecraft:clear_bookwyrm_charm" + "ars_nouveau:clear_bookwyrm_charm" ] } } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_drygmy_charm.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_drygmy_charm.json similarity index 84% rename from src/generated/resources/data/minecraft/advancement/recipes/misc/clear_drygmy_charm.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_drygmy_charm.json index 5ee8f27ce5..c39d42a469 100644 --- a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_drygmy_charm.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_drygmy_charm.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "minecraft:clear_drygmy_charm" + "recipe": "ars_nouveau:clear_drygmy_charm" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "minecraft:clear_drygmy_charm" + "ars_nouveau:clear_drygmy_charm" ] } } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_starbuncle_charm.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_starbuncle_charm.json similarity index 83% rename from src/generated/resources/data/minecraft/advancement/recipes/misc/clear_starbuncle_charm.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_starbuncle_charm.json index a222532ddb..8d2d96a12f 100644 --- a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_starbuncle_charm.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_starbuncle_charm.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "minecraft:clear_starbuncle_charm" + "recipe": "ars_nouveau:clear_starbuncle_charm" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "minecraft:clear_starbuncle_charm" + "ars_nouveau:clear_starbuncle_charm" ] } } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_starbuncle_shard.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_starbuncle_shard.json similarity index 83% rename from src/generated/resources/data/minecraft/advancement/recipes/misc/clear_starbuncle_shard.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_starbuncle_shard.json index 14da2b5144..b1c015db70 100644 --- a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_starbuncle_shard.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_starbuncle_shard.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "minecraft:clear_starbuncle_shard" + "recipe": "ars_nouveau:clear_starbuncle_shard" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "minecraft:clear_starbuncle_shard" + "ars_nouveau:clear_starbuncle_shard" ] } } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_whirlisprig_charm.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_whirlisprig_charm.json similarity index 83% rename from src/generated/resources/data/minecraft/advancement/recipes/misc/clear_whirlisprig_charm.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_whirlisprig_charm.json index 1b39f8e52d..b43d4c1c40 100644 --- a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_whirlisprig_charm.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_whirlisprig_charm.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "minecraft:clear_whirlisprig_charm" + "recipe": "ars_nouveau:clear_whirlisprig_charm" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "minecraft:clear_whirlisprig_charm" + "ars_nouveau:clear_whirlisprig_charm" ] } } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_wixie_charm.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_wixie_charm.json similarity index 85% rename from src/generated/resources/data/minecraft/advancement/recipes/misc/clear_wixie_charm.json rename to src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_wixie_charm.json index 4787b870f7..8bed66cf32 100644 --- a/src/generated/resources/data/minecraft/advancement/recipes/misc/clear_wixie_charm.json +++ b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/clear_wixie_charm.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "minecraft:clear_wixie_charm" + "recipe": "ars_nouveau:clear_wixie_charm" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "minecraft:clear_wixie_charm" + "ars_nouveau:clear_wixie_charm" ] } } \ No newline at end of file diff --git a/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wipe_starby_shard.json b/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wipe_starby_shard.json deleted file mode 100644 index cf735e8ae2..0000000000 --- a/src/generated/resources/data/ars_nouveau/advancement/recipes/misc/wipe_starby_shard.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_journal": { - "conditions": { - "items": [ - { - "items": "ars_nouveau:worn_notebook" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "ars_nouveau:wipe_starby_shard" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_journal" - ] - ], - "rewards": { - "recipes": [ - "ars_nouveau:wipe_starby_shard" - ] - } -} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/recipe/clear_alakarkinos_charm.json b/src/generated/resources/data/ars_nouveau/recipe/clear_alakarkinos_charm.json similarity index 100% rename from src/generated/resources/data/minecraft/recipe/clear_alakarkinos_charm.json rename to src/generated/resources/data/ars_nouveau/recipe/clear_alakarkinos_charm.json diff --git a/src/generated/resources/data/minecraft/recipe/clear_amethyst_golem_charm.json b/src/generated/resources/data/ars_nouveau/recipe/clear_amethyst_golem_charm.json similarity index 100% rename from src/generated/resources/data/minecraft/recipe/clear_amethyst_golem_charm.json rename to src/generated/resources/data/ars_nouveau/recipe/clear_amethyst_golem_charm.json diff --git a/src/generated/resources/data/minecraft/recipe/clear_bookwyrm_charm.json b/src/generated/resources/data/ars_nouveau/recipe/clear_bookwyrm_charm.json similarity index 100% rename from src/generated/resources/data/minecraft/recipe/clear_bookwyrm_charm.json rename to src/generated/resources/data/ars_nouveau/recipe/clear_bookwyrm_charm.json diff --git a/src/generated/resources/data/minecraft/recipe/clear_drygmy_charm.json b/src/generated/resources/data/ars_nouveau/recipe/clear_drygmy_charm.json similarity index 100% rename from src/generated/resources/data/minecraft/recipe/clear_drygmy_charm.json rename to src/generated/resources/data/ars_nouveau/recipe/clear_drygmy_charm.json diff --git a/src/generated/resources/data/minecraft/recipe/clear_starbuncle_charm.json b/src/generated/resources/data/ars_nouveau/recipe/clear_starbuncle_charm.json similarity index 100% rename from src/generated/resources/data/minecraft/recipe/clear_starbuncle_charm.json rename to src/generated/resources/data/ars_nouveau/recipe/clear_starbuncle_charm.json diff --git a/src/generated/resources/data/minecraft/recipe/clear_starbuncle_shard.json b/src/generated/resources/data/ars_nouveau/recipe/clear_starbuncle_shard.json similarity index 100% rename from src/generated/resources/data/minecraft/recipe/clear_starbuncle_shard.json rename to src/generated/resources/data/ars_nouveau/recipe/clear_starbuncle_shard.json diff --git a/src/generated/resources/data/minecraft/recipe/clear_whirlisprig_charm.json b/src/generated/resources/data/ars_nouveau/recipe/clear_whirlisprig_charm.json similarity index 100% rename from src/generated/resources/data/minecraft/recipe/clear_whirlisprig_charm.json rename to src/generated/resources/data/ars_nouveau/recipe/clear_whirlisprig_charm.json diff --git a/src/generated/resources/data/minecraft/recipe/clear_wixie_charm.json b/src/generated/resources/data/ars_nouveau/recipe/clear_wixie_charm.json similarity index 100% rename from src/generated/resources/data/minecraft/recipe/clear_wixie_charm.json rename to src/generated/resources/data/ars_nouveau/recipe/clear_wixie_charm.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/wipe_starby_shard.json b/src/generated/resources/data/ars_nouveau/recipe/wipe_starby_shard.json deleted file mode 100644 index 23cb11151c..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipe/wipe_starby_shard.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "item": "ars_nouveau:starbuncle_shards" - } - ], - "result": { - "count": 1, - "id": "ars_nouveau:starbuncle_shards" - } -} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java index 2120829b08..c86b4e365c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/RecipeDatagen.java @@ -724,7 +724,6 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { shapelessBuilder(getRitualItem(RitualLib.SANCTUARY)).requires(BlockRegistry.CASCADING_LOG).requires(ItemsRegistry.WATER_ESSENCE).requires(Items.SEA_LANTERN).save(consumer); shapelessBuilder(BlockRegistry.ROTATING_TURRET).requires(BlockRegistry.BASIC_SPELL_TURRET).save(consumer); shapelessBuilder(BlockRegistry.BASIC_SPELL_TURRET).requires(BlockRegistry.ROTATING_TURRET).save(consumer, ArsNouveau.prefix( "rotating_turret_to_basic_spell_turret")); - shapelessBuilder(ItemsRegistry.STARBUNCLE_SHARD).requires(ItemsRegistry.STARBUNCLE_SHARD).save(consumer, ArsNouveau.prefix( "wipe_starby_shard")); shapedBuilder(BlockRegistry.REDSTONE_RELAY) .pattern("gxg") .pattern("gMg") @@ -775,14 +774,14 @@ protected void buildRecipes(RecipeOutput pRecipeOutput) { .define('r', Tags.Items.DUSTS_REDSTONE) .save(consumer); - clearBuilder(ItemsRegistry.STARBUNCLE_CHARM).save(consumer, "clear_starbuncle_charm"); - clearBuilder(ItemsRegistry.STARBUNCLE_SHARD).save(consumer, "clear_starbuncle_shard"); - clearBuilder(ItemsRegistry.DRYGMY_CHARM).save(consumer, "clear_drygmy_charm"); - clearBuilder(ItemsRegistry.WIXIE_CHARM).save(consumer, "clear_wixie_charm"); - clearBuilder(ItemsRegistry.BOOKWYRM_CHARM).save(consumer, "clear_bookwyrm_charm"); - clearBuilder(ItemsRegistry.WHIRLISPRIG_CHARM).save(consumer, "clear_whirlisprig_charm"); - clearBuilder(ItemsRegistry.AMETHYST_GOLEM_CHARM).save(consumer, "clear_amethyst_golem_charm"); - clearBuilder(ItemsRegistry.ALAKARKINOS_CHARM).save(consumer, "clear_alakarkinos_charm"); + clearBuilder(ItemsRegistry.STARBUNCLE_CHARM).save(consumer, ArsNouveau.prefix("clear_starbuncle_charm")); + clearBuilder(ItemsRegistry.STARBUNCLE_SHARD).save(consumer, ArsNouveau.prefix("clear_starbuncle_shard")); + clearBuilder(ItemsRegistry.DRYGMY_CHARM).save(consumer, ArsNouveau.prefix("clear_drygmy_charm")); + clearBuilder(ItemsRegistry.WIXIE_CHARM).save(consumer, ArsNouveau.prefix("clear_wixie_charm")); + clearBuilder(ItemsRegistry.BOOKWYRM_CHARM).save(consumer, ArsNouveau.prefix("clear_bookwyrm_charm")); + clearBuilder(ItemsRegistry.WHIRLISPRIG_CHARM).save(consumer, ArsNouveau.prefix("clear_whirlisprig_charm")); + clearBuilder(ItemsRegistry.AMETHYST_GOLEM_CHARM).save(consumer, ArsNouveau.prefix("clear_amethyst_golem_charm")); + clearBuilder(ItemsRegistry.ALAKARKINOS_CHARM).save(consumer, ArsNouveau.prefix("clear_alakarkinos_charm")); } } From 4c18e2d8b3d0f6e3bcb03372d8cf16a4e69e59db Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 30 Nov 2024 12:57:45 -0600 Subject: [PATCH 307/363] Fix source tooltip desyncing, improve update block calls --- .../api/source/AbstractSourceMachine.java | 58 ++++++++----------- .../arsnouveau/api/source/ISourceTile.java | 2 - .../api/source/SourcelinkEventQueue.java | 7 ++- .../common/block/CreativeSourceJar.java | 12 ++++ .../arsnouveau/common/block/SourceJar.java | 2 +- .../block/tile/AgronomicSourcelinkTile.java | 10 ---- .../block/tile/AlchemicalSourcelinkTile.java | 10 ---- .../block/tile/CreativeSourceJarTile.java | 47 ++++++--------- .../common/block/tile/ImbuementTile.java | 31 ++++------ .../common/block/tile/RelaySplitterTile.java | 10 +--- .../common/block/tile/RelayTile.java | 10 +--- .../common/block/tile/SourceJarTile.java | 16 ++--- .../common/block/tile/SourcelinkTile.java | 33 ++++------- .../block/tile/VitalicSourcelinkTile.java | 5 -- .../block/tile/VolcanicSourcelinkTile.java | 41 ++++--------- 15 files changed, 104 insertions(+), 190 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java b/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java index 4a6d8997f1..6f961a590f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java @@ -14,14 +14,11 @@ import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; - +//TODO: Make relevant source methods final and defaulted in interface public abstract class AbstractSourceMachine extends ModdedTile implements ISourceTile, IWololoable { - private int source = 0; - private int maxSource = 0; private ParticleColor color = ParticleColor.defaultParticleColor(); public static String SOURCE_TAG = "source"; - public static String MAX_SOURCE_TAG = "max_source"; public static String COLOR_TAG = "color"; public AbstractSourceMachine(BlockEntityType manaTile, BlockPos pos, BlockState state) { @@ -32,16 +29,7 @@ public AbstractSourceMachine(BlockEntityType manaTile, BlockPos pos, BlockSta public @NotNull SourceStorage getSourceStorage() { if (sourceStorage == null) { - sourceStorage = new SourceStorage(getMaxSource(), getTransferRate(), getTransferRate(), source) { - public void onContentsChanged() { - /* - * This is called when the source changes in the capability, and is used to update the tile's value. - * Opposite of the setSource method called in updateBlock. - */ - AbstractSourceMachine.this.source = this.source; - AbstractSourceMachine.this.updateBlock(); - } - }; + sourceStorage = createDefaultStorage(); if (level != null) level.invalidateCapabilities(worldPosition); } return sourceStorage; @@ -50,8 +38,10 @@ public void onContentsChanged() { @Override protected void loadAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider pRegistries) { super.loadAdditional(tag, pRegistries); - source = tag.getInt(SOURCE_TAG); - maxSource = tag.getInt(MAX_SOURCE_TAG); + this.sourceStorage = createDefaultStorage(); + if(tag.contains(SOURCE_TAG)) { + this.sourceStorage.setSource(tag.getInt(SOURCE_TAG)); + } color = ParticleColor.fromInt(tag.getInt(COLOR_TAG)); } @@ -59,23 +49,27 @@ protected void loadAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Pr protected void saveAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider pRegistries) { super.saveAdditional(tag, pRegistries); tag.putInt(SOURCE_TAG, getSource()); - tag.putInt(MAX_SOURCE_TAG, getMaxSource()); tag.putInt(COLOR_TAG, getColor().getColor()); } + protected @NotNull SourceStorage createDefaultStorage(){ + return new SourceStorage(10000, 1000, 1000, 0) { + public void onContentsChanged() { + AbstractSourceMachine.this.updateBlock(); + } + }; + } + @Override public int setSource(int source) { - if (this.source == source) - return this.source; - this.source = Math.clamp(source, 0, this.getMaxSource()); + this.getSourceStorage().setSource(Math.clamp(source, 0, this.getMaxSource())); updateBlock(); - return this.source; + return this.getSourceStorage().getSource(); } public boolean updateBlock() { if (level != null) { // force update the capability - getSourceStorage().setSource(this.source); BlockState state = level.getBlockState(worldPosition); level.sendBlockUpdated(worldPosition, state, state, 3); setChanged(); @@ -96,11 +90,14 @@ public int addSource(int source) { @Override public int getSource() { - if (this.sourceStorage == null) - return this.source; return this.getSourceStorage().getSource(); } + @Override + public int getTransferRate() { + return this.getSourceStorage().getMaxExtract(); + } + @Override public int removeSource(int source, boolean simulate) { return getSourceStorage().extractSource(source, simulate); @@ -115,16 +112,8 @@ public int removeSource(int source) { return this.getSource(); } - @Override - public void setMaxSource(int max) { - this.maxSource = max; - updateBlock(); - } - @Override public int getMaxSource() { - if (this.sourceStorage == null) - return this.maxSource; return this.getSourceStorage().getSourceCapacity(); } @@ -200,14 +189,13 @@ public void setColor(ParticleColor color) { protected void applyImplicitComponents(@NotNull DataComponentInput pComponentInput) { super.applyImplicitComponents(pComponentInput); var fill = pComponentInput.getOrDefault(DataComponentRegistry.BLOCK_FILL_CONTENTS, new BlockFillContents(0)); - this.source = fill.amount(); + this.getSourceStorage().setSource(fill.amount()); } @Override protected void collectImplicitComponents(DataComponentMap.@NotNull Builder pComponents) { super.collectImplicitComponents(pComponents); - pComponents.set(DataComponentRegistry.BLOCK_FILL_CONTENTS, new BlockFillContents(this.source)); + pComponents.set(DataComponentRegistry.BLOCK_FILL_CONTENTS, new BlockFillContents(this.getSourceStorage().getSource())); } - } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/source/ISourceTile.java b/src/main/java/com/hollingsworth/arsnouveau/api/source/ISourceTile.java index 0bdf34d9e3..38a20c77ac 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/source/ISourceTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/source/ISourceTile.java @@ -17,8 +17,6 @@ default boolean canProvideSource() { int getMaxSource(); - void setMaxSource(int max); - int setSource(final int source); /** diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/source/SourcelinkEventQueue.java b/src/main/java/com/hollingsworth/arsnouveau/api/source/SourcelinkEventQueue.java index 3ba785d958..b06d7d789a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/source/SourcelinkEventQueue.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/source/SourcelinkEventQueue.java @@ -5,6 +5,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.neoforged.bus.api.Event; + import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -27,12 +28,12 @@ public static void addManaEvent(Level world, Class til if (!world.isLoaded(p)) continue; BlockEntity entity = world.getBlockEntity(p); - if (world.getBlockEntity(p) == null || !(entity instanceof SourcelinkTile)) { + if (world.getBlockEntity(p) == null || !(entity instanceof SourcelinkTile sourcelinkTile)) { stalePos.add(p); continue; } - if (entity.getClass().equals(tileType) && ((SourcelinkTile) entity).eventInRange(sourcePos, event) && ((SourcelinkTile) entity).canAcceptSource()) { - ((SourcelinkTile) entity).getManaEvent(sourcePos, amount); + if (entity.getClass().equals(tileType) && sourcelinkTile.eventInRange(sourcePos, event) && sourcelinkTile.canAcceptSource()) { + sourcelinkTile.getManaEvent(sourcePos, amount); break; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/CreativeSourceJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/CreativeSourceJar.java index 6bc7fa62bb..9a98c86a6d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/CreativeSourceJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/CreativeSourceJar.java @@ -3,9 +3,16 @@ import com.hollingsworth.arsnouveau.common.block.tile.CreativeSourceJarTile; import com.hollingsworth.arsnouveau.common.lib.LibBlockNames; import net.minecraft.core.BlockPos; +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.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import javax.annotation.Nullable; +import java.util.List; + public class CreativeSourceJar extends SourceJar { public CreativeSourceJar() { @@ -17,4 +24,9 @@ public CreativeSourceJar() { public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { return new CreativeSourceJarTile(pos, state); } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Item.TooltipContext context, List tooltip, TooltipFlag flagIn) { + tooltip.add(Component.translatable("ars_nouveau.source_jar.fullness",100)); + } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceJar.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceJar.java index 91325dcbac..cc7a18e4b8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceJar.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/SourceJar.java @@ -127,7 +127,7 @@ public int getAnalogOutputSignal(BlockState blockState, Level worldIn, BlockPos public void appendHoverText(ItemStack stack, @Nullable Item.TooltipContext context, List tooltip, TooltipFlag flagIn) { super.appendHoverText(stack, context, tooltip, flagIn); int mana = BlockFillContents.get(stack); - tooltip.add(Component.literal((mana * 100) / 10000 + "% full")); + tooltip.add(Component.translatable("ars_nouveau.source_jar.fullness",(mana * 100) / 10000)); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AgronomicSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AgronomicSourcelinkTile.java index af9b84009b..4cf252e0cc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AgronomicSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AgronomicSourcelinkTile.java @@ -19,11 +19,6 @@ public AgronomicSourcelinkTile(BlockPos pos, BlockState state) { super(BlockRegistry.AGRONOMIC_SOURCELINK_TILE.get(), pos, state); } - @Override - public int getMaxSource() { - return 1000; - } - @SubscribeEvent public static void cropGrow(CropGrowEvent.Post event) { int mana = 20; @@ -49,9 +44,4 @@ public static void treeGrow(BlockGrowFeatureEvent event) { public boolean usesEventQueue() { return true; } - - @Override - public int getTransferRate() { - return 1000; - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlchemicalSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlchemicalSourcelinkTile.java index a2ce8d80ef..76354dedc3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlchemicalSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/AlchemicalSourcelinkTile.java @@ -18,16 +18,6 @@ public AlchemicalSourcelinkTile(BlockPos pos, BlockState state) { super(BlockRegistry.ALCHEMICAL_TILE.get(), pos, state); } - @Override - public int getMaxSource() { - return 20000; - } - - @Override - public int getTransferRate() { - return 10000; - } - @Override public void tick() { super.tick(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CreativeSourceJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CreativeSourceJarTile.java index c8a905880c..daeef0a113 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CreativeSourceJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/CreativeSourceJarTile.java @@ -9,37 +9,28 @@ public class CreativeSourceJarTile extends SourceJarTile { @Override - public @NotNull SourceStorage getSourceStorage() { - if (sourceStorage == null) { - sourceStorage = new SourceStorage(getMaxSource(), getTransferRate(), getTransferRate(), getMaxSource()) { - - // Acts as void or infinite source, overrides method without doing checks or changes - @Override - public int receiveSource(int toReceive, boolean simulate) { - return toReceive; - } - - @Override - public int extractSource(int toExtract, boolean simulate) { - return toExtract; - } - }; - if (level != null) level.invalidateCapabilities(worldPosition); - } - return sourceStorage; + protected @NotNull SourceStorage createDefaultStorage() { + return new SourceStorage(1000000, 1000000, 1000000, 1000000) { + + // Acts as void or infinite source, overrides method without doing checks or changes + @Override + public int receiveSource(int toReceive, boolean simulate) { + return toReceive; + } + + @Override + public int extractSource(int toExtract, boolean simulate) { + return toExtract; + } + + @Override + public int getSource() { + return 1000000; + } + }; } public CreativeSourceJarTile(BlockPos pos, BlockState state) { super(BlockRegistry.CREATIVE_SOURCE_JAR_TILE.get(), pos, state); } - - @Override - public int getSource() { - return this.getMaxSource(); - } - - @Override - public int getMaxSource() { - return 1000000; - } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java index b16a3600bc..603a234ed8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java @@ -54,24 +54,18 @@ public ImbuementTile(BlockPos pos, BlockState state) { super(BlockRegistry.IMBUEMENT_TILE.get(), pos, state); } - public SourceStorage jarStorage; - - @Override - public @NotNull SourceStorage getSourceStorage() { - if (jarStorage == null) { - jarStorage = new SourceStorage(this.getMaxSource(), this.getMaxSource(), 0, getSource()); - } - return jarStorage; - } - @Override - public int getTransferRate() { - return 0; - } + protected @NotNull SourceStorage createDefaultStorage() { + return new SourceStorage(10000000, 10000000, 0, 0){ + @Override + public boolean canProvideSource(int source) { + return false; + } - @Override - public boolean canProvideSource() { - return false; + public void onContentsChanged() { + ImbuementTile.this.updateBlock(); + } + }; } @Override @@ -196,11 +190,6 @@ protected void saveAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Pr tag.putInt("craftTicks", craftTicks); } - @Override - public int getMaxSource() { - return 10000000; - } - @Override public int getContainerSize() { return 1; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelaySplitterTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelaySplitterTile.java index 6f3783419c..c8eae753a0 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelaySplitterTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelaySplitterTile.java @@ -7,6 +7,7 @@ import com.hollingsworth.arsnouveau.client.particle.ColorPos; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; +import com.hollingsworth.arsnouveau.common.capability.SourceStorage; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import com.hollingsworth.arsnouveau.setup.registry.CapabilityRegistry; import net.minecraft.core.BlockPos; @@ -138,13 +139,8 @@ public void tick() { } @Override - public int getTransferRate() { - return 2500; - } - - @Override - public int getMaxSource() { - return 2500; + protected @NotNull SourceStorage createDefaultStorage() { + return new SourceStorage(2500, 2500); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java index fe69c23e33..80d2de81fc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelayTile.java @@ -10,6 +10,7 @@ import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.block.ITickable; +import com.hollingsworth.arsnouveau.common.capability.SourceStorage; import com.hollingsworth.arsnouveau.common.items.DominionWand; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; @@ -94,13 +95,8 @@ public void clearPos() { } @Override - public int getTransferRate() { - return 1000; - } - - @Override - public int getMaxSource() { - return 1000; + protected @NotNull SourceStorage createDefaultStorage() { + return new SourceStorage(1000, 1000); } public boolean closeEnough(BlockPos pos) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java index 6ab67fe3f9..6513f72f9b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java @@ -4,11 +4,13 @@ import com.hollingsworth.arsnouveau.api.source.AbstractSourceMachine; import com.hollingsworth.arsnouveau.common.block.ITickable; import com.hollingsworth.arsnouveau.common.block.SourceJar; +import com.hollingsworth.arsnouveau.common.capability.SourceStorage; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -23,8 +25,13 @@ public SourceJarTile(BlockEntityType tileTileEntityType } @Override - public int getMaxSource() { - return 10000; + protected @NotNull SourceStorage createDefaultStorage() { + return new SourceStorage(20000, 10000){ + @Override + public void onContentsChanged() { + SourceJarTile.this.updateBlock(); + } + }; } @Override @@ -42,11 +49,6 @@ else if (this.getSource() != 0) { return true; } - @Override - public int getTransferRate() { - return getMaxSource(); - } - @Override public void getTooltip(List tooltip) { tooltip.add(Component.translatable("ars_nouveau.source_jar.fullness", (getSource() * 100) / this.getMaxSource())); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java index 442bd256f8..24f1af3bba 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourcelinkTile.java @@ -36,29 +36,6 @@ public SourcelinkTile(BlockEntityType sourceLinkTile, BlockPos pos, BlockStat super(sourceLinkTile, pos, state); } - @Override - public @NotNull SourceStorage getSourceStorage() { - if (sourceStorage == null) { - sourceStorage = new SourceStorage(getMaxSource(), getTransferRate(), getTransferRate(), getSource()) { - @Override - public boolean canReceive() { - return false; - } - }; - } - return sourceStorage; - } - - @Override - public int getTransferRate() { - return 1000; - } - - @Override - public int getMaxSource() { - return 1000; - } - @Override public void tick() { if (level.isClientSide) @@ -122,6 +99,16 @@ protected void loadAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Pr isDisabled = tag.getBoolean("disabled"); } + @Override + protected @NotNull SourceStorage createDefaultStorage() { + return new SourceStorage(20000, 10000, 10000, 0) { + @Override + public boolean canReceive() { + return false; + } + }; + } + @Override public void saveAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider pRegistries) { super.saveAdditional(tag, pRegistries); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VitalicSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VitalicSourcelinkTile.java index 031fb64c92..cbaed59ee4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VitalicSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VitalicSourcelinkTile.java @@ -30,11 +30,6 @@ public VitalicSourcelinkTile(BlockPos pos, BlockState state) { super(BlockRegistry.VITALIC_TILE.get(), pos, state); } - @Override - public int getMaxSource() { - return 2500; - } - @Override public void tick() { super.tick(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java index 1b6a41020f..4127c59d1b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/VolcanicSourcelinkTile.java @@ -18,20 +18,12 @@ import net.neoforged.neoforge.common.Tags; import software.bernie.geckolib.animatable.GeoAnimatable; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; - public class VolcanicSourcelinkTile extends SourcelinkTile implements GeoAnimatable { public VolcanicSourcelinkTile(BlockPos pos, BlockState state) { super(BlockRegistry.VOLCANIC_TILE.get(), pos, state); } - @Override - public int getTransferRate() { - return 1000; - } - @Override public void tick() { super.tick(); @@ -97,7 +89,6 @@ public int getSourceValue(ItemStack i) { public void doRandomAction() { if (level.isClientSide) return; - AtomicBoolean set = new AtomicBoolean(false); BlockPos magmaPos = getBlockInArea(Blocks.MAGMA_BLOCK, 1); if (magmaPos != null && progress >= 200) { @@ -121,32 +112,20 @@ public void doRandomAction() { } public BlockPos getTagInArea(TagKey block, int range) { - AtomicReference posFound = new AtomicReference<>(); - BlockPos.betweenClosedStream(worldPosition.offset(range, -1, range), worldPosition.offset(-range, -1, -range)).forEach(blockPos -> { + for(BlockPos blockPos : BlockPos.betweenClosed(worldPosition.offset(range, -1, range), worldPosition.offset(-range, -1, -range))){ blockPos = blockPos.immutable(); - if (posFound.get() == null && level.getBlockState(blockPos).is(block)) - posFound.set(blockPos); - }); - - return posFound.get(); - + if (level.getBlockState(blockPos).is(block)) + return blockPos; + } + return null; } public BlockPos getBlockInArea(Block block, int range) { - AtomicReference posFound = new AtomicReference<>(); - BlockPos.betweenClosedStream(worldPosition.offset(range, -1, range), worldPosition.offset(-range, -1, -range)).forEach(blockPos -> { - blockPos = blockPos.immutable(); - if (posFound.get() == null && level.getBlockState(blockPos).getBlock() == block) - posFound.set(blockPos); - }); - - return posFound.get(); - - } + for(BlockPos blockPos : BlockPos.betweenClosed(worldPosition.offset(range, -1, range), worldPosition.offset(-range, -1, -range))){ + if (level.getBlockState(blockPos).getBlock() == block) + return blockPos.immutable(); + } + return null; - @Override - public int getMaxSource() { - return 5000; } - } From da35a9fb138efb933beb5f22573013ef49bd7274 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 30 Nov 2024 13:18:54 -0600 Subject: [PATCH 308/363] Fix bubble not dismountable, fix bubble causing damage to owner --- .../common/entity/BubbleEntity.java | 29 +++++++++++++++++-- .../common/spell/effect/EffectBubble.java | 3 ++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/BubbleEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/BubbleEntity.java index 879de54207..8b6f6dc0ce 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/BubbleEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/BubbleEntity.java @@ -24,12 +24,18 @@ import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + public class BubbleEntity extends Projectile implements GeoEntity { int maxAge; int age; float damage; public int poppingTicks; public boolean hasPopped; + List hasDismounted = new ArrayList<>(); + public static final EntityDataAccessor HAS_POPPED = SynchedEntityData.defineId(BubbleEntity.class, EntityDataSerializers.BOOLEAN); public BubbleEntity(EntityType pEntityType, Level pLevel) { super(pEntityType, pLevel); @@ -85,6 +91,14 @@ public Vec3 getNextHitPosition() { return this.position().add(this.getDeltaMovement()); } + @Override + public Vec3 getDismountLocationForPassenger(LivingEntity passenger) { + if(passenger != null && passenger.getUUID() != null){ + this.hasDismounted.add(passenger.getUUID()); + } + return super.getDismountLocationForPassenger(passenger); + } + public void pop(){ if(this.level.isClientSide) return; @@ -98,7 +112,9 @@ public void pop(){ // The only purpose of this is to prevent the default attack noise that occurs. public static void onAttacked(AttackEntityEvent event){ if(event.getTarget() instanceof BubbleEntity bubble){ - if(bubble.getPassengers().isEmpty() || bubble.getFirstPassenger() instanceof ItemEntity) { + if(bubble.getPassengers().isEmpty() + || bubble.getFirstPassenger() instanceof ItemEntity + || bubble.getFirstPassenger() == event.getEntity()) { bubble.pop(); event.setCanceled(true); }else if(bubble.getFirstPassenger() instanceof LivingEntity passenger){ @@ -109,7 +125,9 @@ public static void onAttacked(AttackEntityEvent event){ public static void entityHurt(LivingDamageEvent.Pre e) { if(e.getEntity().getVehicle() instanceof BubbleEntity bubble){ - if(bubble.age > 1 && !bubble.hasPopped) { + if(bubble.age > 1 + && !bubble.hasPopped + && bubble.getFirstPassenger() != bubble.getOwner()) { e.setNewDamage(e.getNewDamage() + bubble.damage); } bubble.pop(); @@ -144,7 +162,12 @@ public boolean isPickable() { @Override protected boolean canHitEntity(Entity pTarget) { - return !(pTarget instanceof BubbleEntity); + if(pTarget != null && pTarget.getUUID() != null){ + if(this.hasDismounted.contains(pTarget.getUUID())){ + return false; + } + } + return !(pTarget instanceof BubbleEntity) && !(pTarget.getVehicle() instanceof BubbleEntity); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java index a03c02ef5d..b56c177ce6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java @@ -29,6 +29,9 @@ public void onResolve(HitResult rayTraceResult, Level world, @NotNull LivingEnti super.onResolve(rayTraceResult, world, shooter, spellStats, spellContext, resolver); var bubble = new BubbleEntity(world, (int) (100 + spellStats.getDurationMultiplier() * EXTEND_TIME.getAsInt()), (float) (DAMAGE.getAsDouble() + spellStats.getAmpMultiplier() * AMP_VALUE.getAsDouble() + spellStats.getDamageModifier())); bubble.setPos(rayTraceResult.getLocation().x, rayTraceResult.getLocation().y, rayTraceResult.getLocation().z); + if(isRealPlayer(shooter)){ + bubble.setOwner(shooter); + } world.addFreshEntity(bubble); } From 7c76632c4ea08801290b7bf31f818aec604b1cca Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 30 Nov 2024 13:22:54 -0600 Subject: [PATCH 309/363] Check for missing tick times #1528 --- .../arsnouveau/common/event/ManaCapEvents.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java index 19735ff464..8fba5f94a8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/ManaCapEvents.java @@ -90,15 +90,15 @@ public static void syncPlayerEvent(Player playerEntity) { } } } - + private static final long[] UNLOADED = new long[] { 0 }; @SubscribeEvent public static void onTick(PlayerTickEvent.Post e) { var player = e.getEntity(); if (player.level.isClientSide) return; if (player.level.getGameTime() % 600 == 0 && player.getServer() != null) { - - double meanTickTime = mean(player.getServer().getTickTime(player.level.dimension())) * 1.0E-6D; + long[] tickTimes = player.getServer().getTickTime(player.level.dimension()); + double meanTickTime = mean(tickTimes == null ? UNLOADED : tickTimes) * 1.0E-6D; double meanTPS = Math.min(1000.0 / meanTickTime, 20); ManaCapEvents.MEAN_TPS = Math.max(1, meanTPS); } From da3899771fc067d4300c867cf7fc1cd428ae05a2 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 30 Nov 2024 14:25:40 -0600 Subject: [PATCH 310/363] Fix warp scroll equality #1486 --- .../api/item/inv/InventoryManager.java | 2 +- .../common/items/data/WarpScrollData.java | 18 ++---------------- .../setup/registry/DataComponentRegistry.java | 2 +- 3 files changed, 4 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/InventoryManager.java b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/InventoryManager.java index 1bcbf39c24..bd855a124c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/InventoryManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/item/inv/InventoryManager.java @@ -184,7 +184,7 @@ public MultiExtractedReference extractAllFromHandler(FilterableItemHandler filte if(stack.isEmpty()){ continue; } - if (!ItemStack.isSameItem(stack, desiredStack) || !ItemStack.isSameItemSameComponents(stack, desiredStack)) { + if (!(ItemStack.isSameItem(stack, desiredStack) && ItemStack.isSameItemSameComponents(stack, desiredStack))) { continue; } int toExtract = Math.min(stack.getCount(), remaining); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java index fb5d9caf4b..99c53f90ca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java @@ -1,15 +1,12 @@ package com.hollingsworth.arsnouveau.common.items.data; -import com.hollingsworth.arsnouveau.common.crafting.recipes.CheatSerializer; import com.hollingsworth.arsnouveau.common.util.ANCodecs; import com.hollingsworth.arsnouveau.setup.config.ServerConfig; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; -import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.TooltipFlag; @@ -17,7 +14,6 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec2; -import javax.annotation.Nullable; import java.util.Objects; import java.util.Optional; import java.util.function.Consumer; @@ -34,16 +30,6 @@ public WarpScrollData(boolean crossDim){ this(Optional.empty(), "", new Vec2(0, 0), crossDim); } - public static final StreamCodec STREAM_CODEC = CheatSerializer.create(WarpScrollData.CODEC); - - public WarpScrollData setPos(@Nullable BlockPos pos, @Nullable String dimension) { - return new WarpScrollData(Optional.ofNullable(pos), dimension, rotation, crossDim); - } - - public WarpScrollData setRotation(Vec2 rotation) { - return new WarpScrollData(pos, dimension, rotation, crossDim); - } - public boolean canTeleportWithDim(String dimension) { return this.dimension.equals(dimension) || crossDim; } @@ -81,11 +67,11 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; WarpScrollData that = (WarpScrollData) o; - return crossDim == that.crossDim && Objects.equals(pos, that.pos) && Objects.equals(rotation, that.rotation) && Objects.equals(dimension, that.dimension); + return crossDim == that.crossDim && rotation.equals(that.rotation) && Objects.equals(dimension, that.dimension) && pos.equals(that.pos); } @Override public int hashCode() { - return Objects.hash(pos, dimension, rotation, crossDim); + return Float.hashCode(rotation.x) + Float.hashCode(rotation.y) + Objects.hash(pos, dimension, crossDim); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java index 9372c3bc52..cbf936618c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/DataComponentRegistry.java @@ -29,7 +29,7 @@ public class DataComponentRegistry { public static final DeferredHolder , DataComponentType> SCRY_DATA = DATA.register("scry_data", () -> DataComponentType.builder().persistent(ScryPosData.CODEC).build()); - public static final DeferredHolder , DataComponentType> WARP_SCROLL = DATA.register("warp_scroll", () -> DataComponentType.builder().persistent(WarpScrollData.CODEC).networkSynchronized(WarpScrollData.STREAM_CODEC).build()); + public static final DeferredHolder , DataComponentType> WARP_SCROLL = DATA.register("warp_scroll", () -> DataComponentType.builder().persistent(WarpScrollData.CODEC).build()); public static final DeferredHolder, DataComponentType> MULTI_POTION = DATA.register("multi_potion", () -> DataComponentType.builder().persistent(MultiPotionContents.CODEC).networkSynchronized(MultiPotionContents.STREAM_CODEC).build()); From 8f3866b2aebdacd106261e3cbf95455f2c3ff9eb Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 30 Nov 2024 15:04:54 -0600 Subject: [PATCH 311/363] Fix stable warp scroll not warping cross dim --- .../arsnouveau/common/items/StableWarpScroll.java | 12 ++++++++++++ .../arsnouveau/common/items/data/WarpScrollData.java | 4 ++++ supporters.json | 7 ++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java index ff9fe0d7a0..a617b58107 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/StableWarpScroll.java @@ -11,6 +11,7 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; @@ -34,6 +35,17 @@ public boolean onEntityItemUpdate(@NotNull ItemStack stack, @NotNull ItemEntity return ItemsRegistry.WARP_SCROLL.get().onEntityItemUpdate(stack, entity); } + @Override + public void inventoryTick(ItemStack stack, Level level, Entity entity, int slotId, boolean isSelected) { + super.inventoryTick(stack, level, entity, slotId, isSelected); + // A hack to fix the crossDim flag on existing warp scrolls + // TODO: 1.22 - remove this tick and set the flag or check the stack elsewhere + WarpScrollData data = stack.get(DataComponentRegistry.WARP_SCROLL); + if(data != null && !data.crossDim()){ + stack.set(DataComponentRegistry.WARP_SCROLL, data.withCrossDim(true)); + } + } + @Override public @NotNull InteractionResult useOn(UseOnContext context) { if (!context.getLevel().isClientSide) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java index 99c53f90ca..b4329db619 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/data/WarpScrollData.java @@ -30,6 +30,10 @@ public WarpScrollData(boolean crossDim){ this(Optional.empty(), "", new Vec2(0, 0), crossDim); } + public WarpScrollData withCrossDim(boolean crossDim){ + return new WarpScrollData(pos, dimension, rotation, crossDim); + } + public boolean canTeleportWithDim(String dimension) { return this.dimension.equals(dimension) || crossDim; } diff --git a/supporters.json b/supporters.json index f8208128dd..be1f6f0323 100644 --- a/supporters.json +++ b/supporters.json @@ -33,7 +33,7 @@ "db489a87-6509-4d75-917d-9c426b519c64", "eb079f27-e266-4b3c-beba-b34d34bef268", "831086b8-d566-4f25-aa09-ecb505e54885", "e3298bd7-61bf-427f-af89-4e418a20bf57", "01b53c7e-c7f4-4465-88df-f8b6c645b6b9", "a29ffabb-ac40-4754-8df8-94b9f394045c", "aef9c054-e96e-4332-944b-9393105b6ac6", "1f62ed4b-91f9-42fa-b331-b7e3e3c0637f", "eb14192a-c53f-44c0-bb13-7f7ff1a0e662", - "758ca96e-100a-4611-a849-5d76229b6c83"], + "758ca96e-100a-4611-a849-5d76229b6c83", "1cf6b68a-a396-4ac1-8146-21fc314f6455"], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -530,6 +530,11 @@ "adopter": "Sophie", "color": "pink", "bio": "A little engineer turned into a curious creature, she's sure to help in any way she can." + },{ + "name": "Lerya", + "color": "magenta", + "adopter": "Keyla the Witch", + "bio": "Lerya is a curious little Starbuncle, and with the token of friendship she gave to you she shows her appreciation for your kindness. After her human parent ended her game with a deadly growth spell on lots of Sourceberries, Lerya feels very sad and lonely nowadays." } ] } From a223866ac662b845b52b7eac7d2009755a5058db Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 30 Nov 2024 15:33:41 -0600 Subject: [PATCH 312/363] Fix bubbe hitbox, spell damage, capture on entity hit --- .../renderer/entity/BubbleRenderer.java | 2 +- .../common/entity/BubbleEntity.java | 22 ++++++++++++++---- .../common/entity/EntityProjectileSpell.java | 5 ++++ .../common/spell/effect/EffectBubble.java | 23 +++++++++++++++---- .../setup/registry/ModEntities.java | 2 +- 5 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BubbleRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BubbleRenderer.java index 4f6dd8d7fe..f7427e914e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BubbleRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/entity/BubbleRenderer.java @@ -36,7 +36,7 @@ public void render(BubbleEntity entityIn, float pEntityYaw, float pPartialTick, } public static void renderBubble(Entity entityIn, EntityRenderDispatcher entityRenderDispatcher, PoseStack matrixStack, MultiBufferSource buffer){ - double y = entityIn.getBbHeight(); + double y = entityIn.getPassengers().isEmpty() ? 0.25f : entityIn.getBbHeight(); matrixStack.pushPose(); matrixStack.translate(0, y, 0); matrixStack.mulPose(entityRenderDispatcher.cameraOrientation()); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/BubbleEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/BubbleEntity.java index 8b6f6dc0ce..a69f61c6a9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/BubbleEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/BubbleEntity.java @@ -1,5 +1,6 @@ package com.hollingsworth.arsnouveau.common.entity; +import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; import net.minecraft.core.BlockPos; @@ -84,7 +85,14 @@ public void tick() { this.zOld = this.getZ(); this.setDeltaMovement(ParticleUtil.inRange(-0.01, 0.01), 0.1, ParticleUtil.inRange(-0.01, 0.01)); this.setPos(getNextHitPosition()); + } + public boolean tryCapturing(Entity target){ + if(this.getPassengers().isEmpty() && this.canHitEntity(target)){ + target.startRiding(this); + return !this.getPassengers().isEmpty(); + } + return false; } public Vec3 getNextHitPosition() { @@ -128,7 +136,13 @@ public static void entityHurt(LivingDamageEvent.Pre e) { if(bubble.age > 1 && !bubble.hasPopped && bubble.getFirstPassenger() != bubble.getOwner()) { - e.setNewDamage(e.getNewDamage() + bubble.damage); + float damage = bubble.damage; + Entity owner = bubble.getOwner(); + if(owner instanceof LivingEntity shooter){ + damage += shooter.getAttributes().hasAttribute(PerkAttributes.SPELL_DAMAGE_BONUS) ? + (float) shooter.getAttributeValue(PerkAttributes.SPELL_DAMAGE_BONUS) : 0; + } + e.setNewDamage(e.getNewDamage() + damage); } bubble.pop(); } @@ -137,9 +151,7 @@ public static void entityHurt(LivingDamageEvent.Pre e) { @Override protected void onHitEntity(EntityHitResult pResult) { super.onHitEntity(pResult); - if(this.getPassengers().isEmpty() && this.canHitEntity(pResult.getEntity())){ - pResult.getEntity().startRiding(this); - } + tryCapturing(pResult.getEntity()); } @Override @@ -172,7 +184,7 @@ protected boolean canHitEntity(Entity pTarget) { @Override public Vec3 getPassengerRidingPosition(Entity pEntity) { - return pEntity instanceof ItemEntity ? this.position.add(0, 0.5, 0) : this.position; + return pEntity instanceof ItemEntity ? this.position.add(0, 0.25f, 0) : this.position; } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java index 642456e54b..26b6724f51 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityProjectileSpell.java @@ -93,6 +93,11 @@ public EntityProjectileSpell(final Level world, final LivingEntity shooter) { this(ModEntities.SPELL_PROJ.get(), world, shooter); } + @Override + protected boolean canRide(Entity vehicle) { + return false; + } + @Override public void tick() { super.tick(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java index b56c177ce6..250450cbe4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBubble.java @@ -9,7 +9,8 @@ import com.hollingsworth.arsnouveau.common.spell.augment.AugmentExtendTime; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; -import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; import net.neoforged.neoforge.common.ModConfigSpec; import org.jetbrains.annotations.NotNull; @@ -25,9 +26,8 @@ public EffectBubble() { } @Override - public void onResolve(HitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { - super.onResolve(rayTraceResult, world, shooter, spellStats, spellContext, resolver); - var bubble = new BubbleEntity(world, (int) (100 + spellStats.getDurationMultiplier() * EXTEND_TIME.getAsInt()), (float) (DAMAGE.getAsDouble() + spellStats.getAmpMultiplier() * AMP_VALUE.getAsDouble() + spellStats.getDamageModifier())); + public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { + var bubble = createBubble(world, spellStats); bubble.setPos(rayTraceResult.getLocation().x, rayTraceResult.getLocation().y, rayTraceResult.getLocation().z); if(isRealPlayer(shooter)){ bubble.setOwner(shooter); @@ -35,6 +35,21 @@ public void onResolve(HitResult rayTraceResult, Level world, @NotNull LivingEnti world.addFreshEntity(bubble); } + public BubbleEntity createBubble(Level level, SpellStats spellStats){ + return new BubbleEntity(level, (int) (100 + spellStats.getDurationMultiplier() * EXTEND_TIME.getAsInt()), (float) (DAMAGE.getAsDouble() + spellStats.getAmpMultiplier() * AMP_VALUE.getAsDouble() + spellStats.getDamageModifier())); + } + + @Override + public void onResolveEntity(EntityHitResult rayTraceResult, Level world, @NotNull LivingEntity shooter, SpellStats spellStats, SpellContext spellContext, SpellResolver resolver) { + var bubble = createBubble(world, spellStats); + bubble.setPos(rayTraceResult.getLocation().x, rayTraceResult.getLocation().y, rayTraceResult.getLocation().z); + if(isRealPlayer(shooter)){ + bubble.setOwner(shooter); + } + world.addFreshEntity(bubble); + bubble.tryCapturing(rayTraceResult.getEntity()); + } + @Override protected int getDefaultManaCost() { return 20; diff --git a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java index 90bceeb9f9..555277d257 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java +++ b/src/main/java/com/hollingsworth/arsnouveau/setup/registry/ModEntities.java @@ -299,7 +299,7 @@ public boolean isNoGravity() { public static final DeferredHolder, EntityType> BUBBLE = registerEntity( LibEntityNames.BUBBLE, EntityType.Builder.of(BubbleEntity::new, MobCategory.MISC) - .sized(0.5F, 0.75F) + .sized(0.5F, 0.5f) .setTrackingRange(10)); From 6d278f45665ce937fcb8198a0877f91afd06b9ce Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 30 Nov 2024 16:04:46 -0600 Subject: [PATCH 313/363] Give enchanters sword spell damage instead of amplify --- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 +-- .../assets/ars_nouveau/lang/en_us.json | 2 +- .../common/datagen/LangDatagen.java | 2 +- .../common/items/EnchantersSword.java | 31 ++++++++++++++----- 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index dfebba0a5e..e2a53de889 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-11-30T09:11:00.0655628 Languages: en_us for mod: ars_nouveau -0eb8e34a057c397915e153eeb94aa30e48fa3b75 assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-11-30T15:59:43.8509392 Languages: en_us for mod: ars_nouveau +f3302d95d5ae52cc9255323563fd2fb44e135e85 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 562f549347..dd4cc92303 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -781,7 +781,7 @@ "ars_nouveau.page.enchanters_eye": "A caster tool that can cast inscribed spells remotely through a Scry Crystal. Use the eye on a Scry Crystal to bind the location, or hold a bound Scry Parchment in the offhand. Spells will be cast through the eye similar to a Spell Turret, but you are considered the caster for all effects. Useful for remote teleportation or item movement.", "ars_nouveau.page.enchanters_mirror": "Applies a self spell to the user. Spells cast with this mirror are discounted and gain additional bonus duration to all glyphs. Apply a spell at the Scribe's table that DOES NOT contain a form such as Heal -> Amplify.", "ars_nouveau.page.enchanters_shield": "Upon blocking damage, the user will gain a short duration of Mana Regeneration and Spell Damage. Additionally, this shield will repair over time using the wearers mana.", - "ars_nouveau.page.enchanters_sword": "Applies a Touch spell before damaging an entity. Additionally, all spells gain one additional Amplify augment on the last effect in the spell. Apply a spell at the Scribes Table that does NOT contain a form, such as Ignite -> Extend Time.", + "ars_nouveau.page.enchanters_sword": "Applies a Touch spell before damaging an entity. Additionally, all spells gain Spell Damage. Apply a spell at the Scribes Table that does NOT contain a form, such as Ignite -> Extend Time.", "ars_nouveau.page.flask_cannons": "Flask Cannons", "ars_nouveau.page.frostaya": "A fruit that can be brewed into a Potion of Freezing, freezing the target over time.", "ars_nouveau.page.how_to_enchant": "How to Enchant", diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 6c09d6452f..37a1d0cc52 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -454,7 +454,7 @@ protected void addTranslations() { add("ars_nouveau.sword.invalid", "Invalid spell. Swords accept Effects and Augments only, such as Freeze -> Extend Time."); add("item.ars_nouveau.enchanters_sword", "Enchanter's Sword"); add("item.ars_nouveau.enchanters_shield", "Enchanter's Shield"); - add("ars_nouveau.page.enchanters_sword", "Applies a Touch spell before damaging an entity. Additionally, all spells gain one additional Amplify augment on the last effect in the spell. Apply a spell at the Scribes Table that does NOT contain a form, such as Ignite -> Extend Time."); + add("ars_nouveau.page.enchanters_sword", "Applies a Touch spell before damaging an entity. Additionally, all spells gain Spell Damage. Apply a spell at the Scribes Table that does NOT contain a form, such as Ignite -> Extend Time."); add("ars_nouveau.page.enchanters_shield", "Upon blocking damage, the user will gain a short duration of Mana Regeneration and Spell Damage. Additionally, this shield will repair over time using the wearers mana."); add("ars_nouveau.tooltip.can_inscribe", "Can be inscribed with a spell at the Scribes Table."); add("biome.ars_nouveau.archwood_forest", "Archwood Forest"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java index 966cd50584..e89fef88fe 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/EnchantersSword.java @@ -1,7 +1,9 @@ package com.hollingsworth.arsnouveau.common.items; +import com.hollingsworth.arsnouveau.ArsNouveau; import com.hollingsworth.arsnouveau.api.item.ICasterTool; import com.hollingsworth.arsnouveau.api.mana.IManaDiscountEquipment; +import com.hollingsworth.arsnouveau.api.perk.PerkAttributes; import com.hollingsworth.arsnouveau.api.spell.*; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.IWrappedCaster; import com.hollingsworth.arsnouveau.api.spell.wrapped_caster.LivingCaster; @@ -9,7 +11,6 @@ import com.hollingsworth.arsnouveau.client.gui.SpellTooltip; import com.hollingsworth.arsnouveau.client.renderer.item.SwordRenderer; import com.hollingsworth.arsnouveau.common.perk.RepairingPerk; -import com.hollingsworth.arsnouveau.common.spell.augment.AugmentAmplify; import com.hollingsworth.arsnouveau.common.spell.method.MethodTouch; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.config.Config; @@ -21,13 +22,17 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.SwordItem; import net.minecraft.world.item.Tier; import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.ItemAttributeModifiers; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; import org.jetbrains.annotations.NotNull; @@ -51,7 +56,23 @@ public EnchantersSword(Tier iItemTier, int baseDamage, float baseAttackSpeed) { } public EnchantersSword(Tier iItemTier, int baseDamage, float baseAttackSpeed, Properties properties) { - super(iItemTier, properties.component(DataComponents.TOOL, createToolProperties()).attributes(SwordItem.createAttributes(iItemTier, baseDamage, baseAttackSpeed)).component(DataComponentRegistry.SPELL_CASTER, new SpellCaster())); + super(iItemTier, properties.component(DataComponents.TOOL, createToolProperties()) + .attributes(ItemAttributeModifiers.builder() + .add( + Attributes.ATTACK_DAMAGE, + new AttributeModifier( + BASE_ATTACK_DAMAGE_ID, (double)((float)baseDamage + iItemTier.getAttackDamageBonus()), AttributeModifier.Operation.ADD_VALUE + ), + EquipmentSlotGroup.MAINHAND + ) + .add( + Attributes.ATTACK_SPEED, + new AttributeModifier(BASE_ATTACK_SPEED_ID, (double)baseAttackSpeed, AttributeModifier.Operation.ADD_VALUE), + EquipmentSlotGroup.MAINHAND + ) + .add(PerkAttributes.SPELL_DAMAGE_BONUS, new AttributeModifier(ArsNouveau.prefix("sword_spell_bonus"), 4.0f, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND) + .build()) + .component(DataComponentRegistry.SPELL_CASTER, new SpellCaster())); } @Override @@ -76,7 +97,6 @@ public void scribeModifiedSpell(AbstractCaster caster, Player player, Interac ArrayList recipe = new ArrayList<>(); recipe.add(MethodTouch.INSTANCE); recipe.addAll(spell.recipe); - recipe.add(AugmentAmplify.INSTANCE); spell.recipe = recipe; } @@ -128,9 +148,4 @@ public BlockEntityWithoutLevelRenderer getGeoItemRenderer() { } }); } - - @Override - public int getManaDiscount(ItemStack i, Spell spell) { - return AugmentAmplify.INSTANCE.getCastingCost(); - } } From 84aa96cbf6e6b109931f108727b3f3ad3343757b Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 30 Nov 2024 16:04:57 -0600 Subject: [PATCH 314/363] 5.3.2 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 9d3b423297..a61aea82b3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.3.1 +mod_version=5.3.2 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 783a53ae282bf8a41654ddf993a49933c353a4c9 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 1 Dec 2024 12:19:22 -0600 Subject: [PATCH 315/363] perf: Check and cache nearby players before spawning decorative entities (#1529) --- .../api/recipe/PotionCraftingManager.java | 6 +-- .../api/util/NearbyPlayerCache.java | 45 +++++++++++++++++++ .../arsnouveau/api/util/SourceUtil.java | 6 +-- .../client/particle/ParticleUtil.java | 14 ++---- .../common/block/tile/ImbuementTile.java | 10 ++--- .../common/block/tile/PotionDiffuserTile.java | 9 ++-- .../common/block/tile/PotionMelderTile.java | 33 +++++++------- .../common/block/tile/StorageLecternTile.java | 5 ++- .../common/entity/EntityFlyingItem.java | 32 +++++++++++++ .../common/entity/EntityFollowProjectile.java | 30 ++++++++----- .../goal/drygmy/CollectEssenceGoal.java | 12 ++--- .../goal/whirlisprig/InspectPlantGoal.java | 5 +-- .../entity/goal/wixie/FindNextItemGoal.java | 9 +++- .../entity/goal/wixie/FindPotionGoal.java | 8 ++-- .../alakarkinos/ConvertBlockState.java | 8 ++-- .../alakarkinos/SpawnLootState.java | 7 ++- 16 files changed, 157 insertions(+), 82 deletions(-) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/api/util/NearbyPlayerCache.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java index 3af72f3954..9ab3475866 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/recipe/PotionCraftingManager.java @@ -8,6 +8,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.alchemy.Potions; @@ -63,15 +64,14 @@ public void completeCraft(WixieCauldronTile tile) { level.sendBlockUpdated(worldPosition, level.getBlockState(worldPosition), level.getBlockState(worldPosition), 3); } return; - }else if (level.getBlockEntity(jarPos) instanceof PotionJarTile jar) { + }else if (level instanceof ServerLevel serverLevel && level.getBlockEntity(jarPos) instanceof PotionJarTile jar) { tile.setNeedsPotionStorage(false); jar.add(potionOut,300); ParticleColor color2 = ParticleColor.fromInt(jar.getColor()); - EntityFlyingItem flying = new EntityFlyingItem(level, new Vec3(worldPosition.getX() + 0.5, worldPosition.getY() + 1.0, worldPosition.getZ()+ 0.5), + EntityFlyingItem.spawn(serverLevel, new Vec3(worldPosition.getX() + 0.5, worldPosition.getY() + 1.0, worldPosition.getZ()+ 0.5), new Vec3(jarPos.getX() + 0.5, jarPos.getY(), jarPos.getZ() + 0.5), Math.round(255 * color2.getRed()), Math.round(255 * color2.getGreen()), Math.round(255 * color2.getBlue())) .withNoTouch(); - level.addFreshEntity(flying); } super.completeCraft(tile); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/NearbyPlayerCache.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/NearbyPlayerCache.java new file mode 100644 index 0000000000..55cb6f4e01 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/NearbyPlayerCache.java @@ -0,0 +1,45 @@ +package com.hollingsworth.arsnouveau.api.util; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class NearbyPlayerCache { + /** + * A cache of the next time we should check for players at a given position in a given level + */ + private static final Map> levelPlayerCache = new ConcurrentHashMap<>(); + + public static boolean isPlayerNearby(BlockPos pos, ServerLevel level, int range){ + String key = level.dimension().location().toString(); + if (!levelPlayerCache.containsKey(key)) + levelPlayerCache.put(key, CacheBuilder.newBuilder().maximumSize(1000).build()); + Cache positionCache = levelPlayerCache.get(key); + long posLong = pos.asLong(); + CacheResult playerResult = positionCache.getIfPresent(posLong); + long gameTime = level.getGameTime(); + + if(playerResult != null && playerResult.nextCheck > gameTime){ + return playerResult.isPlayerNearby(); + } + + long nextCheck = gameTime + 500 + level.random.nextInt(20); + + for(Player player : level.players()){ + if(BlockUtil.distanceFrom(player.blockPosition(), pos) < range){ + positionCache.put(posLong, new CacheResult(true, nextCheck)); + return true; + } + } + positionCache.put(posLong, new CacheResult(false, nextCheck)); + return false; + } + + private record CacheResult(boolean isPlayerNearby, long nextCheck) { } + +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java index fee4f5b41e..9c1bb8744f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java @@ -6,6 +6,7 @@ import com.hollingsworth.arsnouveau.common.block.tile.SourceJarTile; import com.hollingsworth.arsnouveau.common.entity.EntityFollowProjectile; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.Level; import javax.annotation.Nullable; @@ -58,9 +59,8 @@ public static List canTakeSource(BlockPos pos, Level wor public static @Nullable ISpecialSourceProvider takeSourceWithParticles(BlockPos pos, BlockPos particlesTo, Level level, int range, int source){ ISpecialSourceProvider result = takeSource(pos, level, range, source); - if(result != null){ - EntityFollowProjectile aoeProjectile = new EntityFollowProjectile(level, result.getCurrentPos(), particlesTo); - level.addFreshEntity(aoeProjectile); + if(result != null && level instanceof ServerLevel serverLevel){ + EntityFollowProjectile.spawn(serverLevel, result.getCurrentPos(), particlesTo); } return result; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleUtil.java b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleUtil.java index eeee4d3207..0e663fbb55 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/particle/ParticleUtil.java @@ -47,16 +47,8 @@ public static Vec3 pointInSphere() { } public static void spawnFollowProjectile(Level world, BlockPos from, BlockPos to, ParticleColor color) { - if (world.isLoaded(to) && world.isLoaded(from)) { - EntityFollowProjectile aoeProjectile = new EntityFollowProjectile(world, from, to, color.toWrapper()); - world.addFreshEntity(aoeProjectile); - } - } - - public static void spawnFollowProjectile(Level world, BlockPos from, BlockPos to) { - if (world.isLoaded(to) && world.isLoaded(from)) { - EntityFollowProjectile aoeProjectile = new EntityFollowProjectile(world, from, to); - world.addFreshEntity(aoeProjectile); + if (world instanceof ServerLevel serverLevel && world.isLoaded(to) && world.isLoaded(from)) { + EntityFollowProjectile.spawn(serverLevel, from, to, color.getRedInt(), color.getGreenInt(), color.getBlueInt()); } } @@ -148,7 +140,7 @@ public static void spawnRitualSkyEffect(BlockEntity tileEntity, RandomSource ran EntityFollowProjectile proj1 = new EntityFollowProjectile(tileEntity.getLevel(), tileEntity.getBlockPos().above(), toPos, color); -// if(getProgress() >= 10) + proj1.getEntityData().set(EntityFollowProjectile.SPAWN_TOUCH, true); proj1.getEntityData().set(EntityFollowProjectile.DESPAWN, 15); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java index 603a234ed8..3bee701d30 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java @@ -20,6 +20,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.Container; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; @@ -135,17 +136,16 @@ public void tick() { int cost = recipe.getSourceCost(this); - if (this.level.getGameTime() % 20 == 0 && this.getSource() < cost) { + if (level instanceof ServerLevel serverLevel && this.level.getGameTime() % 20 == 0 && this.getSource() < cost) { if (!canAcceptSource(Math.min(200, cost))) return; ISpecialSourceProvider takePos = SourceUtil.takeSource(worldPosition, level, 2, Math.min(200, cost)); if (takePos != null) { this.addSource(transferRate); - EntityFlyingItem item = new EntityFlyingItem(level, takePos.getCurrentPos().above(), worldPosition, 255, 50, 80) - .withNoTouch(); - item.setDistanceAdjust(2f); - level.addFreshEntity(item); + EntityFlyingItem.spawn(worldPosition, serverLevel, takePos.getCurrentPos().above(), worldPosition) + .withNoTouch().setDistanceAdjust(2f); + if (!draining) { draining = true; updateBlock(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java index 69833cadcf..d78dea1345 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionDiffuserTile.java @@ -17,6 +17,7 @@ import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -67,16 +68,14 @@ public void tick() { } public void obtainPotion(){ - if(level.isLoaded(boundPos) && level.getBlockEntity(boundPos) instanceof PotionJarTile jar){ + if(level instanceof ServerLevel serverLevel && level.isLoaded(boundPos) && level.getBlockEntity(boundPos) instanceof PotionJarTile jar){ if(!PotionUtil.isEmpty(jar.getData()) && jar.getAmount() >= 100){ lastConsumedPotion = jar.getData(); ticksToConsume = 20 * 60 * 10; // 10 mins jar.remove(100); ParticleColor color2 = ParticleColor.fromInt(jar.getColor()); - EntityFlyingItem item2 = new EntityFlyingItem(level, jar.getBlockPos().above(), worldPosition, Math.round(255 * color2.getRed()), Math.round(255 * color2.getGreen()), Math.round(255 * color2.getBlue())) - .withNoTouch(); - item2.setDistanceAdjust(2f); - level.addFreshEntity(item2); + EntityFlyingItem.spawn(serverLevel, jar.getBlockPos().above(), worldPosition, Math.round(255 * color2.getRed()), Math.round(255 * color2.getGreen()), Math.round(255 * color2.getBlue())) + .withNoTouch().setDistanceAdjust(2f); updateBlock(); } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java index d796dbccdc..fc2d0fd151 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java @@ -22,6 +22,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -122,20 +123,17 @@ public void tick() { return; } - if (timeMixing % 20 == 0 && timeMixing > 0 && timeMixing <= 60) { - - EntityFlyingItem item = new EntityFlyingItem(level, tile1.getBlockPos().above(), worldPosition, Math.round(255 * color1.getRed()), Math.round(255 * color1.getGreen()), Math.round(255 * color1.getBlue())) - .withNoTouch(); - item.setDistanceAdjust(2f); - level.addFreshEntity(item); - EntityFlyingItem item2 = new EntityFlyingItem(level, tile2.getBlockPos().above(), worldPosition, Math.round(255 * color2.getRed()), Math.round(255 * color2.getGreen()), Math.round(255 * color2.getBlue())) - .withNoTouch(); - item2.setDistanceAdjust(2f); - level.addFreshEntity(item2); - } - if (!level.isClientSide && timeMixing >= maxMergeTicks) { - timeMixing = 0; - mergePotions(combJar, tile1, tile2, data); + if(level instanceof ServerLevel serverLevel) { + if (timeMixing % 20 == 0 && timeMixing > 0 && timeMixing <= 60) { + EntityFlyingItem.spawn(serverLevel, tile1.getBlockPos().above(), worldPosition, Math.round(255 * color1.getRed()), Math.round(255 * color1.getGreen()), Math.round(255 * color1.getBlue())) + .withNoTouch().setDistanceAdjust(2f); + EntityFlyingItem.spawn(serverLevel, tile2.getBlockPos().above(), worldPosition, Math.round(255 * color2.getRed()), Math.round(255 * color2.getGreen()), Math.round(255 * color2.getBlue())) + .withNoTouch().setDistanceAdjust(2f); + } + if (timeMixing >= maxMergeTicks) { + timeMixing = 0; + mergePotions(combJar, tile1, tile2, data); + } } } @@ -146,12 +144,11 @@ public void mergePotions(PotionJarTile combJar, PotionJarTile take1, PotionJarTi take2.remove(Config.MELDER_INPUT_COST.get()); hasSource = false; ParticleColor color2 = ParticleColor.fromInt(combJar.getColor()); - EntityFlyingItem item2 = new EntityFlyingItem(level, new Vec3(worldPosition.getX() + 0.5, worldPosition.getY() + 1.0, worldPosition.getZ()+ 0.5), + EntityFlyingItem.spawn((ServerLevel) level, new Vec3(worldPosition.getX() + 0.5, worldPosition.getY() + 1.0, worldPosition.getZ()+ 0.5), new Vec3(combJar.getX() + 0.5, combJar.getY(), combJar.getZ() + 0.5), Math.round(255 * color2.getRed()), Math.round(255 * color2.getGreen()), Math.round(255 * color2.getBlue())) - .withNoTouch(); - item2.setDistanceAdjust(2f); - level.addFreshEntity(item2); + .withNoTouch() + .setDistanceAdjust(2f); updateBlock(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java index 1268d16bcb..da8c43e516 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/StorageLecternTile.java @@ -138,9 +138,10 @@ public StoredItemStack pullStack(StoredItemStack stack, int max, @Nullable Strin } private void addExtractTasks(MultiExtractedReference multiSlotReference) { - if (multiSlotReference.getExtracted().isEmpty()) { + if (multiSlotReference.getExtracted().isEmpty() || !canCreateTasks) { return; } + for (ExtractedStack extractedStack : multiSlotReference.getSlots()) { BlockPos pos = handlerPosList.stream().filter(handlerPos -> handlerPos.handler().equals(extractedStack.getHandler())).findFirst().map(HandlerPos::pos).orElse(null); if (pos != null) { @@ -150,7 +151,7 @@ private void addExtractTasks(MultiExtractedReference multiSlotReference) { } private void addInsertTasks(ItemStack stack, MultiInsertReference reference) { - if (reference.isEmpty() || stack.isEmpty()) { + if (reference.isEmpty() || stack.isEmpty() || !canCreateTasks) { return; } for (SlotReference extractedStack : reference.getSlots()) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java index cc212c7aa3..5b3e70d05d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFlyingItem.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.api.util.BlockUtil; import com.hollingsworth.arsnouveau.api.util.NBTUtil; +import com.hollingsworth.arsnouveau.api.util.NearbyPlayerCache; import com.hollingsworth.arsnouveau.client.particle.GlowParticleData; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; @@ -17,10 +18,12 @@ import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; public class EntityFlyingItem extends ColoredProjectile { public static final EntityDataAccessor to = SynchedEntityData.defineId(EntityFlyingItem.class, DataSerializers.VEC.get()); @@ -62,6 +65,35 @@ public EntityFlyingItem(EntityType entityAOEProjectileEntityTy super(entityAOEProjectileEntityType, world); } + public static @NotNull EntityFlyingItem spawn(ServerLevel level, Vec3 from, Vec3 to, int r, int g, int b){ + boolean canSpawn = NearbyPlayerCache.isPlayerNearby(BlockPos.containing(from), level, 64); + EntityFlyingItem entity = new EntityFlyingItem(level, from, to, r, g, b); + if(canSpawn && level.isLoaded(BlockPos.containing(to))) { + level.addFreshEntity(entity); + } + return entity; + } + + public static @NotNull EntityFlyingItem spawn(ServerLevel level, BlockPos from, BlockPos to, int r, int g, int b){ + return spawn(from, level, from, to, r, g, b); + } + public static @NotNull EntityFlyingItem spawn(BlockPos checkCachePos, ServerLevel level, BlockPos from, BlockPos to, int r, int g, int b){ + boolean canSpawn = NearbyPlayerCache.isPlayerNearby(checkCachePos, level, 64); + EntityFlyingItem entity = new EntityFlyingItem(level, from, to, r, g, b); + if(canSpawn && level.isLoaded(to)) { + level.addFreshEntity(entity); + } + return entity; + } + + public static @NotNull EntityFlyingItem spawn(BlockPos checkCachePos, ServerLevel level, BlockPos from, BlockPos to){ + return spawn(checkCachePos, level, from, to, 255, 25, 180); + } + + public static @NotNull EntityFlyingItem spawn(ServerLevel level, BlockPos from, BlockPos to){ + return spawn(from, level, from, to); + } + public EntityFlyingItem setStack(ItemStack stack) { this.entityData.set(HELD_ITEM, stack.copy()); return this; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java index c3dad357a9..94ec3bdc1e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/EntityFollowProjectile.java @@ -2,6 +2,7 @@ import com.hollingsworth.arsnouveau.api.util.BlockUtil; import com.hollingsworth.arsnouveau.api.util.NBTUtil; +import com.hollingsworth.arsnouveau.api.util.NearbyPlayerCache; import com.hollingsworth.arsnouveau.client.particle.GlowParticleData; import com.hollingsworth.arsnouveau.client.particle.ParticleColor; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; @@ -12,6 +13,7 @@ import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; @@ -23,14 +25,8 @@ public class EntityFollowProjectile extends ColoredProjectile { public static final EntityDataAccessor DESPAWN = SynchedEntityData.defineId(EntityFollowProjectile.class, EntityDataSerializers.INT); private int age; - // int age; int maxAge = 500; - public EntityFollowProjectile(Level world) { - super(ModEntities.ENTITY_FOLLOW_PROJ.get(), world, 0, 0, 0); - } - - public void setDespawnDistance(int distance) { getEntityData().set(DESPAWN, distance); } @@ -39,7 +35,6 @@ public EntityFollowProjectile(Level worldIn, Vec3 from, Vec3 to) { this(ModEntities.ENTITY_FOLLOW_PROJ.get(), worldIn); this.entityData.set(EntityFollowProjectile.to, BlockPos.containing(to)); this.entityData.set(EntityFollowProjectile.from, BlockPos.containing(from)); -// this.age = 0; setPos(from.x + 0.5, from.y + 0.5, from.z + 0.5); this.entityData.set(RED, 255); this.entityData.set(GREEN, 25); @@ -61,14 +56,27 @@ public EntityFollowProjectile(Level worldIn, BlockPos from, BlockPos to, Particl this(worldIn, from, to, color.r, color.g, color.b); } - public EntityFollowProjectile(Level worldIn, BlockPos from, BlockPos to) { - this(worldIn, new Vec3(from.getX(), from.getY(), from.getZ()), new Vec3(to.getX(), to.getY(), to.getZ())); - } - public EntityFollowProjectile(EntityType entityAOEProjectileEntityType, Level world) { super(entityAOEProjectileEntityType, world); } + /** + * These are preferred for any cases where entities could be spawned without a player nearby. + * For instance, rituals don't need to check this, but automated source would. + */ + public static void spawn(ServerLevel level, BlockPos from, BlockPos to, int r, int g, int b){ + boolean canSpawn = NearbyPlayerCache.isPlayerNearby(from, level, 64); + if(!canSpawn){ + return; + } + EntityFollowProjectile entity = new EntityFollowProjectile(level, from, to, r, g, b); + level.addFreshEntity(entity); + } + + public static void spawn(ServerLevel level, BlockPos from, BlockPos to){ + EntityFollowProjectile.spawn(level, from, to, 255, 25, 180); + } + @Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { super.defineSynchedData(pBuilder); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/drygmy/CollectEssenceGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/drygmy/CollectEssenceGoal.java index 3eeeb961d1..8ce684effa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/drygmy/CollectEssenceGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/drygmy/CollectEssenceGoal.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.common.entity.EntityDrygmy; import com.hollingsworth.arsnouveau.common.entity.EntityFlyingItem; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.level.pathfinder.Path; @@ -77,13 +78,12 @@ public void tick() { if (homePos.getY() >= targetPos.getY() - 2) { targetPos = targetPos.above(homePos.getY() - targetPos.getY()); } + EntityFlyingItem.spawn(homePos, (ServerLevel) drygmy.level, + targetPos, homePos, + 50, + 255, + 20); - EntityFlyingItem item = new EntityFlyingItem(drygmy.level, - targetPos, homePos, - 50, - 255, - 20); - drygmy.level.addFreshEntity(item); drygmy.channelCooldown = 100; drygmy.getHome().giveProgress(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/whirlisprig/InspectPlantGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/whirlisprig/InspectPlantGoal.java index ab65c72846..28ad42819c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/whirlisprig/InspectPlantGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/whirlisprig/InspectPlantGoal.java @@ -87,9 +87,8 @@ public void start() { pos = list.get(entity.level.random.nextInt(list.size())); this.timeLooking = 120; this.timePerforming = 240; - EntityFlyingItem flyingItem = new EntityFlyingItem(entity.level, pos, entity.flowerPos, 50, 255, 40); - flyingItem.getEntityData().set(EntityFlyingItem.HELD_ITEM, entity.level.getBlockState(pos).getBlock().asItem().getDefaultInstance()); - entity.level.addFreshEntity(flyingItem); + EntityFlyingItem.spawn(entity.flowerPos, (ServerLevel) entity.level, pos, entity.flowerPos, 50, 255, 40) + .getEntityData().set(EntityFlyingItem.HELD_ITEM, entity.level.getBlockState(pos).getBlock().asItem().getDefaultInstance()); entity.timeSinceGen = 0; entity.getTile().addProgress(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java index 2bcd5296b2..1d7552df6f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindNextItemGoal.java @@ -3,6 +3,7 @@ import com.hollingsworth.arsnouveau.api.event.EventQueue; import com.hollingsworth.arsnouveau.api.event.FlyingItemEvent; import com.hollingsworth.arsnouveau.api.util.BlockUtil; +import com.hollingsworth.arsnouveau.api.util.NearbyPlayerCache; import com.hollingsworth.arsnouveau.client.particle.ParticleUtil; import com.hollingsworth.arsnouveau.common.block.tile.StorageLecternTile; import com.hollingsworth.arsnouveau.common.block.tile.WixieCauldronTile; @@ -12,6 +13,7 @@ import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketAnimEntity; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; @@ -135,7 +137,7 @@ public void tick() { int canExtract = Math.min(size, numNeeded); for(int count = 0; count < canExtract; count++) { ItemStack stackToGive = itemHandler.extractItem(j, 1, false); - spawnFlyingItem(tile.getLevel(), tile.getBlockPos(), handler.pos(), stackToGive, 1 + 3 * spawnDelay++); + spawnFlyingItem((ServerLevel) tile.getLevel(), tile.getBlockPos(), handler.pos(), stackToGive, 1 + 3 * spawnDelay++); tile.giveItem(stackToGive); if (!anyFound) { Networking.sendToNearbyClient(world, wixie, new PacketAnimEntity(wixie.getId(), EntityWixie.Animations.SUMMON_ITEM.ordinal())); @@ -156,7 +158,10 @@ public void tick() { } } - public void spawnFlyingItem(Level level, BlockPos worldPosition, BlockPos from, ItemStack stack, int delay) { + public void spawnFlyingItem(ServerLevel level, BlockPos worldPosition, BlockPos from, ItemStack stack, int delay) { + if(!NearbyPlayerCache.isPlayerNearby(worldPosition, level, 64)){ + return; + } BlockPos above = from.above(); EntityFlyingItem flyingItem = new EntityFlyingItem(level, new Vec3(above.getX() + 0.5, above.getY(), above.getZ() + 0.5).add(ParticleUtil.inRange(-0.25, 0.25), 0, ParticleUtil.inRange(-0.25, 0.25)), diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindPotionGoal.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindPotionGoal.java index b2c669874a..45c817ac27 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindPotionGoal.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/goal/wixie/FindPotionGoal.java @@ -9,8 +9,8 @@ import com.hollingsworth.arsnouveau.common.network.Networking; import com.hollingsworth.arsnouveau.common.network.PacketAnimEntity; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.alchemy.PotionContents; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import java.util.EnumSet; @@ -54,7 +54,7 @@ public void tick() { if (movePos != null && BlockUtil.distanceFrom(wixie.position(), movePos.above()) < 2.0 + this.extendedRange) { WixieCauldronTile tile = (WixieCauldronTile) wixie.getCommandSenderWorld().getBlockEntity(wixie.cauldronPos); - Level world = wixie.getCommandSenderWorld(); + ServerLevel world = (ServerLevel) wixie.getCommandSenderWorld(); if (tile == null) { found = true; return; @@ -71,9 +71,7 @@ public void tick() { int r = (color >> 16) & 0xFF; int g = (color >> 8) & 0xFF; int b = (color) & 0xFF; - EntityFollowProjectile aoeProjectile = new EntityFollowProjectile(world, movePos, wixie.cauldronPos, r, g, b); - - world.addFreshEntity(aoeProjectile); + EntityFollowProjectile.spawn(world, movePos, wixie.cauldronPos, r, g, b); found = true; } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/ConvertBlockState.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/ConvertBlockState.java index 78c315ec68..b6789f7f77 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/ConvertBlockState.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/ConvertBlockState.java @@ -6,6 +6,7 @@ import com.hollingsworth.arsnouveau.common.entity.Alakarkinos; import com.hollingsworth.arsnouveau.common.entity.EntityFlyingItem; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.phys.Vec3; @@ -66,10 +67,9 @@ public void onEnd() { this.recipe = res; spawnedFlyingItem = true; alakarkinos.setBlowingBubbles(false); - EntityFlyingItem flyingItem = new EntityFlyingItem(alakarkinos.level, target, hatPos.above()); - flyingItem.getEntityData().set(EntityFlyingItem.IS_BUBBLE, true); - alakarkinos.level.addFreshEntity(flyingItem); - flyingItem.setStack(alakarkinos.level.getBlockState(target).getBlock().asItem().getDefaultInstance()); + EntityFlyingItem.spawn(alakarkinos.getHome(), (ServerLevel) alakarkinos.level, target, hatPos.above()) + .setStack(alakarkinos.level.getBlockState(target).getBlock().asItem().getDefaultInstance()) + .getEntityData().set(EntityFlyingItem.IS_BUBBLE, true); alakarkinos.level.setBlockAndUpdate(target, Blocks.AIR.defaultBlockState()); waitTicks = 60; alakarkinos.setNeedSource(true); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/SpawnLootState.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/SpawnLootState.java index 9bf2fb5060..2a7b80b75f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/SpawnLootState.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/SpawnLootState.java @@ -62,10 +62,9 @@ public void onEnd() { alakarkinos.setBlowingBubbles(false); alakarkinos.findBlockCooldown = 60 * 20; ItemStack loot = getLoot(); - EntityFlyingItem flyingItem = new EntityFlyingItem(alakarkinos.level, hatPos, alakarkinos.getHome().above()); - flyingItem.getEntityData().set(EntityFlyingItem.IS_BUBBLE, true); - alakarkinos.level.addFreshEntity(flyingItem); - flyingItem.setStack(loot); + EntityFlyingItem.spawn(alakarkinos.getHome(), (ServerLevel) alakarkinos.level, hatPos, alakarkinos.getHome().above()) + .setStack(loot) + .getEntityData().set(EntityFlyingItem.IS_BUBBLE, true); IItemHandler handler = alakarkinos.level.getCapability(Capabilities.ItemHandler.BLOCK, alakarkinos.getHome(), null); ItemHandlerHelper.insertItemStacked(handler, loot, false); return new DecideCrabActionState(alakarkinos); From cfe50336dac6de6cdfde9c2c320403cd05bf9002 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 1 Dec 2024 17:37:25 -0600 Subject: [PATCH 316/363] 5.3.3 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index a61aea82b3..052b5f079a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.3.2 +mod_version=5.3.3 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 122366cc525a9e51256c1a086a6f9549bd46be96 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 1 Dec 2024 17:37:32 -0600 Subject: [PATCH 317/363] Fix jar capacity --- .../arsnouveau/common/block/tile/SourceJarTile.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java index 6513f72f9b..2f59fcc7a3 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/SourceJarTile.java @@ -26,7 +26,7 @@ public SourceJarTile(BlockEntityType tileTileEntityType @Override protected @NotNull SourceStorage createDefaultStorage() { - return new SourceStorage(20000, 10000){ + return new SourceStorage(10000, 10000){ @Override public void onContentsChanged() { SourceJarTile.this.updateBlock(); From 6af19a952652fb16d49709d1410c81dae298ea97 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 1 Dec 2024 18:51:50 -0600 Subject: [PATCH 318/363] Fix armor upgrade and book tier recipe display --- .../.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 | 6 +++--- .../worn_notebook/en_us/entries/armor/armor_upgrade.json | 4 ++-- .../en_us/entries/equipment/spell_books.json | 4 ++-- .../arsnouveau/common/datagen/PatchouliProvider.java | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 index 524cd0b021..7d11c9541f 100644 --- a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 +++ b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 @@ -1,8 +1,8 @@ -// 1.21.1 2024-10-20T14:14:58.4144629 Patchouli +// 1.21.1 2024-12-01T18:48:06.435762 Patchouli 2ec536fea831588201432d61d70af61385882054 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/alteration_table.json a82f4fc73946d228b1e3f5e03d0ecef46f33cdfb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/applying_perks.json 8ce1d8e886b45066bc5c1d9d8e87bdabbb27ae27 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor.json -a72fae57856145df76a0b444b82b0f5fa863985b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor_upgrade.json +677a941d61bd1f46d2960aa812d2f55d8f4ce373 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor_upgrade.json 5e1350ec3f7613b487ab5e40c32b74802c7e038f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_amethyst_golem.json b9069e1ccb5feff6c8bbc4278225b089fc4f6c4f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_chilling.json 5a797472d2955e71e014d353ac3314b3d76dd839 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_depths.json @@ -64,7 +64,7 @@ b71740ed0f131157a6bf36d3df15d6dbc61cb993 assets/ars_nouveau/patchouli_books/worn 9f6c54b8e0bf992a845d6f774a514721ae4c2117 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/ring_of_lesser_discount.json 08db3f3111f327f73110e2376b7e276c194b3be8 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/runic_chalk.json daa37877675a08762048e26cc75ffc00a369b93b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/shapers_focus.json -69e3c77682aa6375114e5cb316397ebd566a45eb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/spell_books.json +f332a9580792035793b5939e2fe037c4e8a34b29 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/spell_books.json 639ae4004196fbc889beff01446749011188c998 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/spell_bow.json 1c43f5926d50c083a3bf1d7543d4919bbfe816c4 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/spell_crossbow.json 640df81b52c050665f652b08780b61c38d62e072 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/stable_warp_scroll.json diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor_upgrade.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor_upgrade.json index 768e9692ed..5c86bb2b35 100644 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor_upgrade.json +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor_upgrade.json @@ -14,11 +14,11 @@ }, { "type": "ars_nouveau:no_output_apparatus_recipe", - "recipe": "ars_nouveau:upgrade_1" + "recipe": "ars_nouveau:first_armor_upgrade" }, { "type": "ars_nouveau:no_output_apparatus_recipe", - "recipe": "ars_nouveau:upgrade_2" + "recipe": "ars_nouveau:second_armor_upgrade" }, { "type": "patchouli:relations", diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/spell_books.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/spell_books.json index d6eaf621b6..ca35ffc11f 100644 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/spell_books.json +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/spell_books.json @@ -10,11 +10,11 @@ { "type": "patchouli:crafting", "recipe": "ars_nouveau:novice_spell_book", - "recipe2": "ars_nouveau:apprentice_spell_book_upgrade" + "recipe2": "ars_nouveau:apprentice_book_upgrade" }, { "type": "patchouli:crafting", - "recipe": "ars_nouveau:archmage_spell_book_upgrade" + "recipe": "ars_nouveau:archmage_book_upgrade" } ] } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java index 512b5d7e15..9dbac0c29a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java @@ -323,8 +323,8 @@ public void addEntries() { addPage(new PatchouliBuilder(EQUIPMENT, "spell_books") .withIcon(ItemsRegistry.ARCHMAGE_SPELLBOOK) .withLocalizedText() - .withPage(new CraftingPage(ItemsRegistry.NOVICE_SPELLBOOK).withRecipe2("ars_nouveau:apprentice_spell_book_upgrade")) - .withPage(new CraftingPage("ars_nouveau:archmage_spell_book_upgrade")), getPath(EQUIPMENT, "spell_books")); + .withPage(new CraftingPage(ItemsRegistry.NOVICE_SPELLBOOK).withRecipe2("ars_nouveau:apprentice_book_upgrade")) + .withPage(new CraftingPage("ars_nouveau:archmage_book_upgrade")), getPath(EQUIPMENT, "spell_books")); addBasicItem(ItemsRegistry.ENCHANTERS_MIRROR, EQUIPMENT, new ApparatusPage(ItemsRegistry.ENCHANTERS_MIRROR)); addBasicItem(ItemsRegistry.ENCHANTERS_SHIELD, EQUIPMENT, new ApparatusPage(ItemsRegistry.ENCHANTERS_SHIELD)); @@ -525,8 +525,8 @@ public void addEntries() { .withLocalizedText() .withPage(new TextPage(getLangPath("armor_upgrading", 2)).withTitle("ars_nouveau.armor_tiers")) .withIcon(ItemsRegistry.ARCANIST_HOOD) - .withPage(new ApparatusTextPage("ars_nouveau:upgrade_1")) - .withPage(new ApparatusTextPage("ars_nouveau:upgrade_2")) + .withPage(new ApparatusTextPage("ars_nouveau:first_armor_upgrade")) + .withPage(new ApparatusTextPage("ars_nouveau:second_armor_upgrade")) .withPage(new RelationsPage().withEntry(ARMOR, "armor").withEntry(ARMOR, "alteration_table")) .withSortNum(1), getPath(ARMOR, "armor_upgrade")); From 39f4f55f98f6da6dec18ab7d48a18ce980abc15c Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 7 Dec 2024 12:41:11 -0600 Subject: [PATCH 319/363] 5.3.4 --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 052b5f079a..ee41e0450b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ org.gradle.debug=false neogradle.subsystems.decompiler.maxMemory=4G neogradle.subsystems.recompiler.maxMemory=4G neogradle.subsystems.parchment.minecraftVersion=1.21.0 -neogradle.subsystems.parchment.mappingsVersion=2024.07.28 +neogradle.subsystems.parchment.mappingsVersion=2024.07.28 minecraft_version=1.21.1 parchment_version=2024.07.28 @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.3.3 +mod_version=5.3.4 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 792f1d85dc3d4fe3911e246ff7fd23a2ea91897e Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 7 Dec 2024 12:43:42 -0600 Subject: [PATCH 320/363] Fix splitter relays, check world height on break --- .../api/source/AbstractSourceMachine.java | 10 +++++++++- .../common/block/tile/RelaySplitterTile.java | 15 +++++++++------ .../common/spell/effect/EffectBreak.java | 2 +- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java b/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java index 6f961a590f..611d4d647f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/source/AbstractSourceMachine.java @@ -147,7 +147,11 @@ public int transferSource(ISourceTile from, ISourceTile to) { * checking the transfer rate of the source and destination via simulation. */ public int transferSource(ISourceCap from, ISourceCap to) { - int transfer = to.receiveSource(from.extractSource(from.getMaxExtract(), true), true); + return transferSource(from, to, from.getMaxExtract()); + } + + public int transferSource(ISourceCap from, ISourceCap to, int amount) { + int transfer = to.receiveSource(from.extractSource(amount, true), true); if (transfer == 0) return 0; from.extractSource(transfer, false); @@ -156,16 +160,20 @@ public int transferSource(ISourceCap from, ISourceCap to) { } /** + * TODO: 1.22 remove * Gets the maximum amount of source that can be transferred from one tile to another. */ + @Deprecated(forRemoval = true) public int getTransferRate(ISourceTile from, ISourceTile to) { return getTransferRate(from, to, from.getTransferRate()); } + @Deprecated(forRemoval = true) public int getTransferRate(ISourceTile from, ISourceTile to, int fromTransferRate) { return Math.min(Math.min(fromTransferRate, from.getSource()), to.getMaxSource() - to.getSource()); } + @Deprecated(forRemoval = true) public int transferSource(ISourceTile from, ISourceTile to, int fromTransferRate) { int transferRate = getTransferRate(from, to, fromTransferRate); if (transferRate == 0) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelaySplitterTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelaySplitterTile.java index c8eae753a0..4f92088404 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelaySplitterTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RelaySplitterTile.java @@ -68,13 +68,15 @@ public void processFromList() { ArrayList stale = new ArrayList<>(); int ratePer = getTransferRate() / fromList.size(); - getSourceStorage().setMaxReceive(ratePer); + if(ratePer == 0){ + return; + } for (BlockPos fromPos : fromList) { if (!level.isLoaded(fromPos)) continue; int transfer; if (level.getCapability(CapabilityRegistry.SOURCE_CAPABILITY, fromPos, null) instanceof ISourceCap sourceHandler) { - transfer = transferSource(sourceHandler, this.getSourceStorage()); + transfer = transferSource(sourceHandler, this.getSourceStorage(), ratePer); } else if (level.getBlockEntity(fromPos) instanceof AbstractSourceMachine fromTile) { int fromRate = Math.min(ratePer, getTransferRate(fromTile, this)); transfer = transferSource(fromTile, this, fromRate); @@ -103,13 +105,15 @@ public void processToList() { return; ArrayList stale = new ArrayList<>(); int ratePer = getSource() / toList.size(); - getSourceStorage().setMaxExtract(ratePer); + if(ratePer == 0){ + return; + } for (BlockPos toPos : toList) { if (!level.isLoaded(toPos)) continue; int transfer; if (level.getCapability(CapabilityRegistry.SOURCE_CAPABILITY, toPos, null) instanceof ISourceCap sourceHandler) { - transfer = transferSource(this.getSourceStorage(), sourceHandler); + transfer = transferSource(this.getSourceStorage(), sourceHandler, ratePer); } else if (level.getBlockEntity(toPos) instanceof AbstractSourceMachine toTile) { transfer = transferSource(this, toTile, ratePer); } else { @@ -121,8 +125,7 @@ public void processToList() { createParticles(worldPosition, toPos); } } - for ( - BlockPos s : stale) { + for (BlockPos s : stale) { toList.remove(s); updateBlock(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBreak.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBreak.java index 16198f5798..ee740edeeb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBreak.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectBreak.java @@ -71,7 +71,7 @@ public void onResolveBlock(BlockHitResult rayTraceResult, Level world, @NotNull stack.enchant(HolderHelper.unwrap(world,Enchantments.SILK_TOUCH), numSilkTouch); } for (BlockPos pos1 : posList) { - if (world.random.nextFloat() < spellStats.getBuffCount(AugmentRandomize.INSTANCE) * 0.25F) { + if (world.isOutsideBuildHeight(pos1) || world.random.nextFloat() < spellStats.getBuffCount(AugmentRandomize.INSTANCE) * 0.25F) { continue; } state = world.getBlockState(pos1); From 46ab2c44794dc8f33f8db23cb7691bfc6c22ba04 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 7 Dec 2024 13:35:19 -0600 Subject: [PATCH 321/363] Fix horizontal portal validation --- .../arsnouveau/api/util/PortalFrameTester.java | 10 +++++----- .../arsnouveau/common/block/PortalBlock.java | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/PortalFrameTester.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/PortalFrameTester.java index c502897b82..b7dca52f77 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/PortalFrameTester.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/PortalFrameTester.java @@ -25,16 +25,16 @@ public abstract class PortalFrameTester { public abstract void lightPortal(Block frameBlock); protected BlockPos getLowerCorner(BlockPos blockPos, Direction.Axis axis1, Direction.Axis axis2) { - if (!validStateInsidePortal(world.getBlockState(blockPos), VALID_FRAME)) + if (!validStateInsidePortal(world.getBlockState(blockPos))) return null; int offsetX = 1; - while (validStateInsidePortal(world.getBlockState(blockPos.relative(axis1, -offsetX)), VALID_FRAME)) { + while (validStateInsidePortal(world.getBlockState(blockPos.relative(axis1, -offsetX)))) { offsetX++; if (offsetX > 20) return null; } blockPos = blockPos.relative(axis1, -(offsetX - 1)); int offsetY = 1; - while (blockPos.getY() - offsetY > 0 && validStateInsidePortal(world.getBlockState(blockPos.relative(axis2, -offsetY)), VALID_FRAME)) { + while (blockPos.getZ() - offsetY > 0 && validStateInsidePortal(world.getBlockState(blockPos.relative(axis2, -offsetY)))) { offsetY++; if (offsetY > 20) return null; } @@ -44,7 +44,7 @@ protected BlockPos getLowerCorner(BlockPos blockPos, Direction.Axis axis1, Direc protected int getSize(Direction.Axis axis, int minSize, int maxSize) { for (int i = 1; i <= maxSize; i++) { BlockState blockState = this.world.getBlockState(this.lowerCorner.relative(axis, i)); - if (!validStateInsidePortal(blockState, VALID_FRAME)) { + if (!validStateInsidePortal(blockState)) { if (VALID_FRAME.test(blockState)) { return i >= minSize ? i : 0; @@ -78,7 +78,7 @@ protected void countExistingPortalBlocks(Direction.Axis axis1, Direction.Axis ax foundPortalBlocks++; } - public static boolean validStateInsidePortal(BlockState blockState, Predicate foundations) { + public static boolean validStateInsidePortal(BlockState blockState) { return blockState.isAir() || blockState.canBeReplaced() || blockState.getBlock() instanceof PortalBlock; } } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java index dc4578c646..770f56ffb7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java @@ -194,6 +194,8 @@ public BlockState updateShape(BlockState stateIn, Direction facing, BlockState f frameTester.init((Level) worldIn, currentPos, null, (bs) -> bs.is(BlockTagProvider.DECORATIVE_AN)); if (!frameTester.isValidFrame()) { return Blocks.AIR.defaultBlockState(); + }else if(flag && facingState.getBlock() != this){ + return Blocks.AIR.defaultBlockState(); } return super.updateShape(stateIn, facing, facingState, worldIn, currentPos, facingPos); } From bac5b1ddf225a14818f2798826bb8516c38ac970 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 7 Dec 2024 13:45:03 -0600 Subject: [PATCH 322/363] 5.3.5 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index ee41e0450b..bf5391018b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.3.4 +mod_version=5.3.5 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 0a665ea36dabda85bb080fceae4999e46d9ad62c Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 14 Dec 2024 16:28:35 -0600 Subject: [PATCH 323/363] perf: reorder apparatus recipe checks to avoid expensive enchantment checks --- .../crafting/recipes/ArmorUpgradeRecipe.java | 3 +++ .../recipes/EnchantingApparatusRecipe.java | 17 +++++++++++++++-- .../crafting/recipes/EnchantmentRecipe.java | 3 ++- .../recipes/ReactiveEnchantmentRecipe.java | 5 ++++- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java index ee49fd9891..fe9ffdee4a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ArmorUpgradeRecipe.java @@ -51,6 +51,9 @@ public boolean doesReagentMatch(ApparatusRecipeInput input, Level level, @org.je @Override public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.annotations.Nullable Player player) { + if(this.pedestalItems().size() != input.pedestals().size()){ + return false; + } IPerkHolder perkHolder = PerkUtil.getPerkHolder(input.catalyst()); if(!(perkHolder instanceof ArmorPerkHolder armorPerkHolder)){ return false; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantingApparatusRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantingApparatusRecipe.java index 754a430ed6..c6ca13e8f4 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantingApparatusRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantingApparatusRecipe.java @@ -45,8 +45,18 @@ public boolean excludeJei() { @Override public boolean matches(ApparatusRecipeInput input, Level level, @Nullable Player player) { + if(this.pedestalItems.size() != input.pedestals().size()){ + return false; + } + return doesReagentMatch(input, level, player) && doPedestalsMatch(input); + } + + public boolean doPedestalsMatch(ApparatusRecipeInput input){ + if(this.pedestalItems.size() != input.pedestals().size()){ + return false; + } var pedestalItems = input.pedestals().stream().filter(itemStack -> !itemStack.isEmpty()).collect(Collectors.toList()); - return doesReagentMatch(input, level, player) && this.pedestalItems.size() == pedestalItems.size() && doItemsMatch(pedestalItems, this.pedestalItems); + return doItemsMatch(pedestalItems, this.pedestalItems); } public boolean doesReagentMatch(ApparatusRecipeInput input, Level level, @Nullable Player player) { @@ -55,11 +65,14 @@ public boolean doesReagentMatch(ApparatusRecipeInput input, Level level, @Nullab // Function to check if both arrays are same public static boolean doItemsMatch(List inputs, List recipeItems) { + if(inputs.size() != recipeItems.size()){ + return false; + } StackedContents recipeitemhelper = new StackedContents(); for (ItemStack i : inputs) recipeitemhelper.accountStack(i, 1); - return inputs.size() == recipeItems.size() && (net.neoforged.neoforge.common.util.RecipeMatcher.findMatches(inputs, recipeItems) != null); + return (net.neoforged.neoforge.common.util.RecipeMatcher.findMatches(inputs, recipeItems) != null); } @Override diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantmentRecipe.java index a48ce3bf98..6e81b63b4b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantmentRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/EnchantmentRecipe.java @@ -55,7 +55,8 @@ public boolean excludeJei() { @Override public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.annotations.Nullable Player player) { - return super.matches(input, level, player); + // Check pedestal match first as it is less costly than enchantment checks + return doPedestalsMatch(input) && doesReagentMatch(input, level, player); } public Holder holderFor(Level level){ diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java index 77a56e405a..f28a695b7e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/crafting/recipes/ReactiveEnchantmentRecipe.java @@ -43,7 +43,10 @@ public ReactiveEnchantmentRecipe(List pedestalItems, int sourceCost) @Override public boolean matches(ApparatusRecipeInput input, Level level, @org.jetbrains.annotations.Nullable Player player) { ItemStack parchment = getParchment(input.pedestals()); - return super.matches(input, level, player) && !parchment.isEmpty() && !SpellCasterRegistry.from(parchment).getSpell().isEmpty(); + if(parchment.isEmpty() || SpellCasterRegistry.from(parchment).getSpell().isEmpty()){ + return false; + } + return super.matches(input, level, player); } public static@NotNull ItemStack getParchment(List pedestalItems) { From 513716c06b5ef7ab66a1d1f7ba033260fda62b31 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 14 Dec 2024 17:05:18 -0600 Subject: [PATCH 324/363] perf: Add backoff on alakarkinos FindBlockState --- .../common/entity/statemachine/alakarkinos/FindBlockState.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/FindBlockState.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/FindBlockState.java index c08567b221..b8259d2740 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/FindBlockState.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/FindBlockState.java @@ -31,6 +31,8 @@ public FindBlockState(Alakarkinos alakarkinos) { return new PlaceHatState(alakarkinos, PlaceHatState.findHatPos(alakarkinos), pos1); } + alakarkinos.findBlockCooldown = 100 + alakarkinos.level.random.nextInt(100); + return new DecideCrabActionState(alakarkinos); } } From 4bf53ddecc3cf7f12ab395af7ba5848b03e52f52 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 15 Dec 2024 12:11:06 -0600 Subject: [PATCH 325/363] Add storage tags for gem and magebloom blocks #1539 --- .../.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 | 5 ++++- .../resources/data/c/tags/block/storage_blocks.json | 6 ++++++ .../data/c/tags/block/storage_blocks/mage_bloom.json | 5 +++++ .../data/c/tags/block/storage_blocks/source_gem.json | 5 +++++ .../arsnouveau/common/datagen/BlockTagProvider.java | 7 +++++++ 5 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/generated/resources/data/c/tags/block/storage_blocks.json create mode 100644 src/generated/resources/data/c/tags/block/storage_blocks/mage_bloom.json create mode 100644 src/generated/resources/data/c/tags/block/storage_blocks/source_gem.json diff --git a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 index 48b9035349..9ad5c730c1 100644 --- a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 +++ b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 @@ -1,4 +1,4 @@ -// 1.21.1 2024-11-30T10:07:18.7027 AN tags +// 1.21.1 2024-12-15T12:10:45.2466694 AN tags 939cde8f97e4e8d7ea8445415522f703b2b927d4 data/ars_nouveau/tags/block/an_decorative.json de95bc21249101b079255a1a00274f60d55e0602 data/ars_nouveau/tags/block/blazing_logs.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/block/break_blacklist.json @@ -32,6 +32,9 @@ f36268e9375442e51cbf98f2c4d573082aa56378 data/c/tags/block/bushes.json 0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/c/tags/block/fence_gates.json 0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/c/tags/block/fence_gates/wooden.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/c/tags/block/relocation_not_supported.json +0cdb8fe6639628884e8e4eaad21566b8fc40b5d3 data/c/tags/block/storage_blocks.json +7d0c18d2019049acf42d10f3ae809011f4e968c1 data/c/tags/block/storage_blocks/mage_bloom.json +6febc815f11d70abf442be0be941a9132ddd072d data/c/tags/block/storage_blocks/source_gem.json 3737e6b65e87993bd971b233c3aca5088721eb32 data/minecraft/tags/block/bee_growables.json 43a847dca5f71ae27537abc65fabcd8d3fdb1c72 data/minecraft/tags/block/buttons.json 3737e6b65e87993bd971b233c3aca5088721eb32 data/minecraft/tags/block/crops.json diff --git a/src/generated/resources/data/c/tags/block/storage_blocks.json b/src/generated/resources/data/c/tags/block/storage_blocks.json new file mode 100644 index 0000000000..20133ff8f3 --- /dev/null +++ b/src/generated/resources/data/c/tags/block/storage_blocks.json @@ -0,0 +1,6 @@ +{ + "values": [ + "ars_nouveau:source_gem_block", + "ars_nouveau:magebloom_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/c/tags/block/storage_blocks/mage_bloom.json b/src/generated/resources/data/c/tags/block/storage_blocks/mage_bloom.json new file mode 100644 index 0000000000..2d0bbf0b14 --- /dev/null +++ b/src/generated/resources/data/c/tags/block/storage_blocks/mage_bloom.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ars_nouveau:magebloom_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/c/tags/block/storage_blocks/source_gem.json b/src/generated/resources/data/c/tags/block/storage_blocks/source_gem.json new file mode 100644 index 0000000000..eca86d2c50 --- /dev/null +++ b/src/generated/resources/data/c/tags/block/storage_blocks/source_gem.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ars_nouveau:source_gem_block" + ] +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java index 52a12ef1f1..f202459b80 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/BlockTagProvider.java @@ -45,6 +45,8 @@ public class BlockTagProvider extends IntrinsicHolderTagsProvider { public static TagKey BLAZING_LOGS = BlockTags.create(ArsNouveau.prefix( "blazing_logs")); public static TagKey DOWSING_ROD = BlockTags.create(ArsNouveau.prefix( "dowsing_rod")); public static TagKey BUSHES = BlockTags.create(ResourceLocation.fromNamespaceAndPath("c", "bushes")); + public static TagKey STORAGE_GEMS = BlockTags.create(ResourceLocation.fromNamespaceAndPath("c", "storage_blocks/source_gem")); + public static TagKey STORAGE_MAGEBLOOM = BlockTags.create(ResourceLocation.fromNamespaceAndPath("c", "storage_blocks/mage_bloom")); public static TagKey SPRING_CROPS = BlockTags.create(ResourceLocation.fromNamespaceAndPath("sereneseasons", "spring_crops")); public static TagKey SUMMER_CROPS = BlockTags.create(ResourceLocation.fromNamespaceAndPath("sereneseasons", "summer_crops")); @@ -320,6 +322,11 @@ protected void addTags(HolderLookup.Provider pProvider) { this.tag(AUTUMN_CROPS).add(BlockRegistry.SOURCEBERRY_BUSH.get(), BlockRegistry.VEXING_SAPLING.get(), BlockRegistry.BASTION_POD.get()); + this.tag(Tags.Blocks.STORAGE_BLOCKS).add(BlockRegistry.SOURCE_GEM_BLOCK.get(), + BlockRegistry.MAGEBLOOM_BLOCK.get()); + this.tag(STORAGE_GEMS).add(BlockRegistry.SOURCE_GEM_BLOCK.get()); + this.tag(STORAGE_MAGEBLOOM).add(BlockRegistry.MAGEBLOOM_BLOCK.get()); + } public String getName() { From 2cfbaaadee37e6ab4fe4efab644db898181d9938 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 15 Dec 2024 12:58:26 -0600 Subject: [PATCH 326/363] Add missing potion descriptions #1540 --- .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 4 ++-- .../assets/ars_nouveau/lang/en_us.json | 19 +++++++++++++++---- .../common/datagen/LangDatagen.java | 19 +++++++++++++++---- .../arsnouveau/common/lib/LibPotions.java | 1 - 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e index e2a53de889..445cab1e23 100644 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e @@ -1,2 +1,2 @@ -// 1.21.1 2024-11-30T15:59:43.8509392 Languages: en_us for mod: ars_nouveau -f3302d95d5ae52cc9255323563fd2fb44e135e85 assets/ars_nouveau/lang/en_us.json +// 1.21.1 2024-12-15T12:57:56.5568465 Languages: en_us for mod: ars_nouveau +fcac50dc53a13bbb9b67f62e08e26c5e7ff52f47 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index dd4cc92303..511bd0dc1e 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -503,7 +503,6 @@ "ars_nouveau.false": "false", "ars_nouveau.familiar.owned": "You already own this familiar.", "ars_nouveau.familiar.script": "Used for obtaining familiars. Obtained from the Ritual of Binding.", - "ars_nouveau.familiar.sickness": "You must wait before summoning another familiar.", "ars_nouveau.familiar.unlocked": "Familiar unlocked.", "ars_nouveau.familiar_desc.familiar_amethyst_golem": "Reduces knockback taken by half and knocks back any attackers. Giving the golem an Amethyst Shard will grant 3 minutes of Shielding.", "ars_nouveau.familiar_desc.familiar_bookwyrm": "A Bookwyrm will automatically pickup nearby items and exp orbs within 5 blocks of the player. Thrown items will not be picked up. Use of the familiar hotkey is recommended to turn the magnet on and off as needed. Obtained by performing the Ritual of Binding near a Bookwyrm.", @@ -1464,30 +1463,43 @@ "death.attack.an_enchantedBlock": "%1$s was crushed by %2$s magic blocks", "death.attack.freeze.item": "%1$s was frozen to death by %2$s using %3$", "effect.ars_nouveau.blasting": "Blasting", + "effect.ars_nouveau.blasting.desc": "Causes the target to explode when the duration ends.", "effect.ars_nouveau.bounce": "Bounce", - "effect.ars_nouveau.familiar_sickness": "Familiar Sickness", + "effect.ars_nouveau.bounce.desc": "Causes the entity to bounce off of surfaces.", "effect.ars_nouveau.flight": "Flight", + "effect.ars_nouveau.flight.desc": "Allows the player to fly.", "effect.ars_nouveau.freezing": "Freezing", + "effect.ars_nouveau.freezing.desc": "Freezes the target over time.", "effect.ars_nouveau.glide": "Glide", + "effect.ars_nouveau.glide.desc": "Allows the player to glide as if wearing an Elytra.", "effect.ars_nouveau.gravity": "Gravity", + "effect.ars_nouveau.gravity.desc": "Causes the entity to rapidly fall.", "effect.ars_nouveau.hex": "Hex", + "effect.ars_nouveau.hex.desc": "Increases the damage taken potion and non-player damage.", "effect.ars_nouveau.immolate": "Immolate", "effect.ars_nouveau.immolate.desc": "Enhances fire spells.", "effect.ars_nouveau.looting": "Drygmy's Blessing", "effect.ars_nouveau.looting.desc": "Increases the amount of loot dropped by mobs", "effect.ars_nouveau.magic_find": "Magic Find", + "effect.ars_nouveau.magic_find.desc": "Causes nearby magical entities to glow.", "effect.ars_nouveau.mana_regen": "Mana Regeneration", "effect.ars_nouveau.mana_regen.desc": "Improves mana regeneration", + "effect.ars_nouveau.recorvery.desc": "Increases healing received from all sources.", "effect.ars_nouveau.recovery": "Recovery", "effect.ars_nouveau.scrying": "Scrying", - "effect.ars_nouveau.shield": "Magic Shield", + "effect.ars_nouveau.scrying.desc": "Reveals certain blocks around you.", "effect.ars_nouveau.shielding": "Shielding", + "effect.ars_nouveau.shielding.desc": "Reduces the amount of damage taken.", "effect.ars_nouveau.shocked": "Shocked", + "effect.ars_nouveau.shocked.desc": "Increases the damage taken from lightning damage.", "effect.ars_nouveau.snared": "Snared", + "effect.ars_nouveau.snared.desc": "Prevents the entity from moving.", "effect.ars_nouveau.soaked": "Soaked", "effect.ars_nouveau.soaked.desc": "Wets the target, protecting from fire and triggering effects as if under the rain.", "effect.ars_nouveau.spell_damage": "Spell Damage", + "effect.ars_nouveau.spell_damage.desc": "Increases the damage dealt by spells.", "effect.ars_nouveau.summoning_sickness": "Summoning Sickness", + "effect.ars_nouveau.summoning_sickness.desc": "Prevents summoning for a short duration.", "enchantment.ars_nouveau.mana_boost": "Mana Boost", "enchantment.ars_nouveau.mana_boost.desc": "Increases the maximum mana of the player.", "enchantment.ars_nouveau.mana_regen": "Mana Regen", @@ -1826,7 +1838,6 @@ "the_nether.minecraft.name": "The Nether", "tooltip.alakarkinos_shard1": "Found by giving an Alakarkinos a Sherd.", "tooltip.alakarkinos_shard2": "What's that behind your ear?", - "tooltip.ars_nouveau.alchemists_crown": "", "tooltip.ars_nouveau.amethyst_charm": "Obtained by performing the Ritual of Awakening near Budding Amethyst", "tooltip.ars_nouveau.amount": "Total: %s", "tooltip.ars_nouveau.amp_modifier": "Amplification Modifier: %s", diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 37a1d0cc52..7d45b45e19 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -162,7 +162,6 @@ protected void addTranslations() { add("item.ars_nouveau.spell_parchment", "Spell Parchment"); add("item.ars_nouveau.ring_of_greater_discount", "Ring of Greater Discount"); add("item.ars_nouveau.ring_of_lesser_discount", "Ring of Lesser Discount"); - add("effect.ars_nouveau.shield", "Magic Shield"); add("alert.core", "An Arcane Core must be placed beneath this block."); add("whirlisprig.unhappy", "The Whirlisprig seems very unhappy in her home. Try sprucing it up!"); add("whirlisprig.content", "The Whirlisprig seems content, but could be better."); @@ -291,6 +290,7 @@ protected void addTranslations() { add("ars_nouveau.apparatus.nomana", "Not enough source nearby."); add("ars_nouveau.reset.cleared", "Progress cleared."); add("effect.ars_nouveau.summoning_sickness", "Summoning Sickness"); + add("effect.ars_nouveau.summoning_sickness.desc", "Prevents summoning for a short duration."); add("entity.ars_nouveau.wilden_guardian", "Wilden Defender"); add("entity.ars_nouveau.wilden_stalker", "Wilden Stalker"); add("entity.ars_nouveau.wilden_hunter", "Wilden Hunter"); @@ -303,6 +303,7 @@ protected void addTranslations() { add("entity.ars_nouveau.summon_wolf", "Summoned Wolf"); add("tooltip.worn_notebook", "Documentation for Ars Nouveau"); add("effect.ars_nouveau.shocked", "Shocked"); + add("effect.ars_nouveau.shocked.desc", "Increases the damage taken from lightning damage."); add("ars_nouveau.flask.charges", "Charges: %d"); add("item.ars_nouveau.potion_flask", "Potion Flask"); add("ars_nouveau.glyph_of", "Glyph of %s"); @@ -446,9 +447,11 @@ protected void addTranslations() { add("item.ars_nouveau.experience_gem", "Experience Gem"); add("item.ars_nouveau.greater_experience_gem", "Greater Experience Gem"); add("effect.ars_nouveau.hex", "Hex"); + add("effect.ars_nouveau.hex.desc", "Increases the damage taken potion and non-player damage."); add("ars_nouveau.set_spell", "Set spell."); add("ars_nouveau.invalid_spell", "Invalid Spell"); add("effect.ars_nouveau.scrying", "Scrying"); + add("effect.ars_nouveau.scrying.desc", "Reveals certain blocks around you."); add("ars_nouveau.tooltip.magebloom", "Grown from seeds crafted using the Enchanting Apparatus."); add("ars_nouveau.tooltip.dull", "A dull trinket, cannot be worn. Used for crafting."); add("ars_nouveau.sword.invalid", "Invalid spell. Swords accept Effects and Augments only, such as Freeze -> Extend Time."); @@ -460,7 +463,9 @@ protected void addTranslations() { add("biome.ars_nouveau.archwood_forest", "Archwood Forest"); add("ars_nouveau.tooltip.turned_off", "Turned off"); add("effect.ars_nouveau.glide", "Glide"); + add("effect.ars_nouveau.glide.desc", "Allows the player to glide as if wearing an Elytra."); add("effect.ars_nouveau.snared", "Snared"); + add("effect.ars_nouveau.snared.desc", "Prevents the entity from moving."); add("item.ars_nouveau.starbuncle_se", "Starbuncle Spawn Egg"); add("item.ars_nouveau.drygmy_se", "Drygmy Spawn Egg"); add("item.ars_nouveau.whirlisprig_se", "Whirlisprig Spawn Egg"); @@ -480,7 +485,9 @@ protected void addTranslations() { add("tooltip.ars_nouveau.drygmy_shard", "Obtained by giving a Drygmy a Wilden Horn."); add("entity.ars_nouveau.drygmy", "Drygmy"); add("effect.ars_nouveau.flight", "Flight"); + add("effect.ars_nouveau.flight.desc", "Allows the player to fly."); add("effect.ars_nouveau.gravity", "Gravity"); + add("effect.ars_nouveau.gravity.desc", "Causes the entity to rapidly fall."); add("tooltip.ars_nouveau.tablet", "A tablet used for rituals. Consumed on use."); add("ars_nouveau.enchanting.bad_level", "This item must have the previous level of enchantment."); add("ars_nouveau.enchanting.incompatible", "This enchantment is incompatible with this item."); @@ -541,10 +548,9 @@ protected void addTranslations() { add("item.minecraft.tipped_arrow.effect.spell_damage_potion", "Arrow of Spell Damage"); add("item.minecraft.tipped_arrow.effect.spell_damage_potion_long", "Arrow of Spell Damage"); add("effect.ars_nouveau.spell_damage", "Spell Damage"); + add("effect.ars_nouveau.spell_damage.desc", "Increases the damage dealt by spells."); add("ars_nouveau.spell_book_gui.familiar", "Familiars"); add("ars_nouveau.spell_book_gui.close", "Close"); - add("effect.ars_nouveau.familiar_sickness", "Familiar Sickness"); - add("ars_nouveau.familiar.sickness", "You must wait before summoning another familiar."); add("ars_nouveau.gui.notebook", "Documentation"); add("ars_nouveau.gui.color", "Color Picker"); add("ars_nouveau.gui.familiar", "Familiars"); @@ -569,6 +575,7 @@ protected void addTranslations() { add("block.ars_nouveau.timer_spell_turret", "Timer Spell Turret"); add("block.ars_nouveau.rotating_spell_turret", "Adjustable Spell Turret"); add("effect.ars_nouveau.bounce", "Bounce"); + add("effect.ars_nouveau.bounce.desc", "Causes the entity to bounce off of surfaces."); add("ars_nouveau.starbuncle.path", "Starbuncle will prefer to path on this block if it is on their way."); add("ars_nouveau.starbuncle.pathing", "Preferring to path on %s"); add("ars_nouveau.summoning", "Summoning"); @@ -763,6 +770,7 @@ protected void addTranslations() { add("item.ars_nouveau.fire_essence", "Fire Essence"); add("item.ars_nouveau.dowsing_rod", "Dowsing Rod"); add("effect.ars_nouveau.magic_find", "Magic Find"); + add("effect.ars_nouveau.magic_find.desc", "Causes nearby magical entities to glow."); add("tooltip.ars_nouveau.essences", "Magical Essences created in an Imbuement Chamber."); add("ars_nouveau.page.dowsing_rod", "A Dowsing Rod provides the user a short duration of Scrying for Budding Amethyst and Magic Find, which will cause magical creatures to glow within 75 blocks of you. The Dowsing Rod has a limited number of uses."); add("ars_nouveau.apparatus.norecipe", "No recipe found. Pedestals must be within 3 blocks."); @@ -980,10 +988,13 @@ protected void addTranslations() { add("item.minecraft.tipped_arrow.effect.shielding_potion", "Arrow of Shielding"); add("item.minecraft.tipped_arrow.effect.shielding_potion_long", "Arrow of Shielding"); add("effect.ars_nouveau.recovery", "Recovery"); + add("effect.ars_nouveau.recorvery.desc","Increases healing received from all sources."); add("effect.ars_nouveau.blasting", "Blasting"); + add("effect.ars_nouveau.blasting.desc","Causes the target to explode when the duration ends."); add("effect.ars_nouveau.freezing", "Freezing"); + add("effect.ars_nouveau.freezing.desc","Freezes the target over time."); add("effect.ars_nouveau.shielding", "Shielding"); - add("tooltip.ars_nouveau.alchemists_crown", ""); + add("effect.ars_nouveau.shielding.desc","Reduces the amount of damage taken."); add("item.ars_nouveau.wixie_hat", "Wixie Hat"); add("tooltip.ars_nouveau.wixie_hat", "Give to a Starbuncle to make them transport potions."); add("ars_nouveau.starbuncle.default_behavior", "Starbuncle will now transport items!"); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibPotions.java b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibPotions.java index d70ef78c56..b3bf137188 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibPotions.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/lib/LibPotions.java @@ -17,7 +17,6 @@ public class LibPotions { public static final String MANA_REGEN = "mana_regen"; public static final String SPELL_DAMAGE = "spell_damage"; - public static final String FAMILIAR_SICKNESS = "familiar_sickness"; public static final String SUMMONING_SICKNESS = "summoning_sickness"; public static final String RECOVERY = "recovery"; public static final String BLAST = "blasting"; From d8df6de7c4d7eecf3790400b2149be3e56e7fd0b Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 15 Dec 2024 15:23:20 -0600 Subject: [PATCH 327/363] Fix lectern crash, flickering on setting changes #1541 #1530 --- .../AbstractStorageTerminalScreen.java | 55 +++++++++++-------- .../container/CraftingTerminalMenu.java | 2 +- .../container/CraftingTerminalScreen.java | 6 +- .../client/container/SlotStorage.java | 29 +++++++++- .../client/container/StorageTerminalMenu.java | 22 ++++++-- 5 files changed, 81 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java index f2f24869e9..6b22bc9e9b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/AbstractStorageTerminalScreen.java @@ -102,10 +102,14 @@ public void receiveSettings(SortSettings settings){ expanded = settings.expanded(); } if(expanded != wasExpanded) { - menu.addStorageSlots(expanded); + onExpandedChanged(expanded); } } + protected void onExpandedChanged(boolean expanded){ + menu.addStorageSlots(expanded); + } + protected void onPacket() { if(tabNames != null && !tabNames.isEmpty()){ for(StorageTabButton tabButton : tabButtons){ @@ -361,11 +365,11 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTi if(this.menu.getCarried().isEmpty() && slotIDUnderMouse != -1) { SlotStorage slot = getMenu().storageSlotList.get(slotIDUnderMouse); - if(slot.stack != null) { - if (slot.stack.getQuantity() > 9999) { - ClientInfo.setTooltip(Component.translatable("tooltip.ars_nouveau.amount", slot.stack.getQuantity())); + if(slot.stack() != null) { + if (slot.stack().getQuantity() > 9999) { + ClientInfo.setTooltip(Component.translatable("tooltip.ars_nouveau.amount", slot.stack().getQuantity())); } - graphics.renderTooltip(font, slot.stack.getActualStack(), mouseX, mouseY); + graphics.renderTooltip(font, slot.stack().getActualStack(), mouseX, mouseY); ClientInfo.setTooltip(); } } else @@ -394,7 +398,6 @@ protected void renderLabels(GuiGraphics p_281635_, int mouseX, int mouseY) { PoseStack st = p_281635_.pose(); st.pushPose(); slotIDUnderMouse = drawSlots(p_281635_, mouseX, mouseY); -// System.out.println(slotIDUnderMouse); st.popPose(); } @@ -410,19 +413,22 @@ protected int drawSlots(GuiGraphics st, int mouseX, int mouseY) { } protected boolean drawSlot(GuiGraphics st, SlotStorage slot, int mouseX, int mouseY) { - if (slot.stack != null) { - ItemStack stack = slot.stack.getStack().copy().split(1); - int i = slot.xDisplayPosition, j = slot.yDisplayPosition; + if(!slot.show){ + return false; + } + if (slot.stack() != null) { + ItemStack stack = slot.stack().getStack().copy().split(1); + int i = slot.xPosition(), j = slot.yPosition(); st.renderItem(stack, i, j); st.renderItemDecorations(this.font, stack, i, j, null); - drawStackSize(st, getFont(), slot.stack.getQuantity(), i, j); + drawStackSize(st, getFont(), slot.stack().getQuantity(), i, j); } - if (mouseX >= getGuiLeft() + slot.xDisplayPosition - 1 && mouseY >= getGuiTop() + slot.yDisplayPosition - 1 && mouseX < getGuiLeft() + slot.xDisplayPosition + 17 && mouseY < getGuiTop() + slot.yDisplayPosition + 17) { - int l = slot.xDisplayPosition; - int t = slot.yDisplayPosition; + if (mouseX >= getGuiLeft() + slot.xPosition() - 1 && mouseY >= getGuiTop() + slot.yPosition() - 1 && mouseX < getGuiLeft() + slot.xPosition() + 17 && mouseY < getGuiTop() + slot.yPosition() + 17) { + int l = slot.xPosition(); + int t = slot.yPosition(); renderSlotHighlight(st, l, t, 0); return true; @@ -455,9 +461,10 @@ protected boolean needsScrollBars() { public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) { this.searchField.mouseClicked(mouseX, mouseY, mouseButton); if (slotIDUnderMouse > -1) { + SlotStorage slot = getMenu().getSlotByID(slotIDUnderMouse); if (isPullOne(mouseButton)) { - if (getMenu().getSlotByID(slotIDUnderMouse).stack != null && getMenu().getSlotByID(slotIDUnderMouse).stack.getQuantity() > 0) { - storageSlotClick(getMenu().getSlotByID(slotIDUnderMouse).stack, PULL_ONE, isTransferOne(mouseButton)); + if (slot.stack() != null && slot.stack().getQuantity() > 0) { + storageSlotClick(slot.stack(), PULL_ONE, isTransferOne(mouseButton)); return true; } return true; @@ -465,8 +472,8 @@ public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) { if (!menu.getCarried().isEmpty()) { storageSlotClick(null, hasControlDown() ? GET_QUARTER : GET_HALF, false); } else { - if (getMenu().getSlotByID(slotIDUnderMouse).stack != null && getMenu().getSlotByID(slotIDUnderMouse).stack.getQuantity() > 0) { - storageSlotClick(getMenu().getSlotByID(slotIDUnderMouse).stack, hasControlDown() ? GET_QUARTER : GET_HALF, false); + if (slot.stack() != null && slot.stack().getQuantity() > 0) { + storageSlotClick(slot.stack(), hasControlDown() ? GET_QUARTER : GET_HALF, false); return true; } } @@ -474,9 +481,9 @@ public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) { if (!menu.getCarried().isEmpty()) { storageSlotClick(null, PULL_OR_PUSH_STACK, false); } else { - if (getMenu().getSlotByID(slotIDUnderMouse).stack != null) { - if (getMenu().getSlotByID(slotIDUnderMouse).stack.getQuantity() > 0) { - storageSlotClick(getMenu().getSlotByID(slotIDUnderMouse).stack, hasShiftDown() ? SHIFT_PULL : StorageTerminalMenu.SlotAction.PULL_OR_PUSH_STACK, false); + if (slot.stack() != null) { + if (slot.stack().getQuantity() > 0) { + storageSlotClick(slot.stack(), hasShiftDown() ? SHIFT_PULL : StorageTerminalMenu.SlotAction.PULL_OR_PUSH_STACK, false); return true; } } @@ -597,8 +604,12 @@ public void updateItems(List items){ public Slot getSlotUnderMouse() { Slot s = super.getSlotUnderMouse(); if(s != null)return s; - if(slotIDUnderMouse > -1 && getMenu().getSlotByID(slotIDUnderMouse).stack != null) { - fakeSlotUnderMouse.container.setItem(0, getMenu().getSlotByID(slotIDUnderMouse).stack.getStack()); + if(slotIDUnderMouse > -1) { + SlotStorage slot = getMenu().getSlotByID(slotIDUnderMouse); + if(slot.stack == null){ + return null; + } + fakeSlotUnderMouse.container.setItem(0, slot.stack.getStack()); return fakeSlotUnderMouse; } return null; diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java index 490ed61e9c..1dfc0a7da1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalMenu.java @@ -105,7 +105,7 @@ public void onTake(Player thePlayer, ItemStack stack) { } } }); - if(te == null || te.sortSettings == null || !te.sortSettings.expanded()) { + if(craftMatrix != null) { for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { SlotCrafting slot = new SlotCrafting(craftMatrix, j + i * 3, x + 36 + j * 18, 89 + i * 18); diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java index 918abc7638..e556a74151 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/CraftingTerminalScreen.java @@ -113,8 +113,8 @@ protected void init() { } @Override - public void receiveSettings(SortSettings settings) { - super.receiveSettings(settings); + protected void onExpandedChanged(boolean expanded) { + super.onExpandedChanged(expanded); btnCollapse.visible = this.expanded; btnExpand.visible = !this.expanded; btnClr.visible = !this.expanded; @@ -124,6 +124,7 @@ public void receiveSettings(SortSettings settings) { public void collapseScreen(){ rowCount = 3; this.expanded = false; + onExpandedChanged(false); syncSortSettings(); } @@ -133,6 +134,7 @@ public void expandScreen(){ if(this.recipeBookGui.isVisible()){ btnRecipeBook.onPress(); } + onExpandedChanged(true); syncSortSettings(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/SlotStorage.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/SlotStorage.java index 51da54902f..3ccbde65fc 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/SlotStorage.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/SlotStorage.java @@ -13,11 +13,36 @@ public class SlotStorage { /** The inventory we want to extract a slot from. */ public final StorageLecternTile inventory; public StoredItemStack stack; - - public SlotStorage(StorageLecternTile inventory, int slotIndex, int xPosition, int yPosition) { + public boolean show; + public SlotStorage(StorageLecternTile inventory, int slotIndex, int xPosition, int yPosition, boolean show) { this.xDisplayPosition = xPosition; this.yDisplayPosition = yPosition; this.slotIndex = slotIndex; this.inventory = inventory; + this.show = show; + } + + public int xPosition(){ + return xDisplayPosition; + } + + public int yPosition(){ + return yDisplayPosition; + } + + public int slot(){ + return slotIndex; + } + + public StorageLecternTile inventory(){ + return inventory; + } + + public StoredItemStack stack(){ + return stack; + } + + public void setStack(StoredItemStack stack){ + this.stack = stack; } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java index bf53676f74..216fb3906f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java @@ -36,6 +36,7 @@ public class StorageTerminalMenu extends RecipeBookMenu itemMap = new HashMap<>(); + boolean sentSettings = false; public StorageTerminalMenu(int id, Inventory inv, StorageLecternTile te) { this(MenuRegistry.STORAGE.get(), id, inv, te); @@ -67,11 +68,16 @@ protected void addPlayerSlots(Inventory playerInventory, int x, int y) { } public void addStorageSlots(boolean expanded) { - storageSlotList.clear(); - int lines = !expanded ? 3 : 7; + int lines = 7; + boolean shouldAdd = storageSlotList.isEmpty(); for (int i = 0; i < lines; ++i) { - for (int j = 0;j < 9;++j) { - storageSlotList.add(new SlotStorage(this.te, i * 9 + j, 13 + j * 18, 21 + i * 18)); + for (int j = 0; j < 9;++j) { + int index = i * 9 + j; + if(shouldAdd) { + storageSlotList.add(new SlotStorage(this.te, index, 13 + j * 18, 21 + i * 18, expanded || i < 3)); + }else{ + storageSlotList.get(index).show = expanded || i < 3; + } } } } @@ -82,7 +88,7 @@ public boolean stillValid(Player playerIn) { } public final void setSlotContents(int id, StoredItemStack stack) { - storageSlotList.get(id).stack = stack; + storageSlotList.get(id).setStack(stack); } public final SlotStorage getSlotByID(int id) { @@ -98,6 +104,7 @@ public void broadcastChanges() { if(te == null){ return; } + Map itemsCount = te.getStacks(selectedTab); List toWrite = new ArrayList<>(); Set found = new HashSet<>(); @@ -127,7 +134,10 @@ public void broadcastChanges() { tabs.add(nameTag); } tag.put("tabs", tabs); - Networking.sendToPlayerClient(new SetTerminalSettingsPacket(te.sortSettings, null), (ServerPlayer) pinv.player); + if(!sentSettings) { + Networking.sendToPlayerClient(new SetTerminalSettingsPacket(te.sortSettings, null), (ServerPlayer) pinv.player); + sentSettings = true; + } Networking.sendToPlayerClient(new ServerToClientStoragePacket(tag), (ServerPlayer) pinv.player); super.broadcastChanges(); } From 2b39182d87097a4e328621c42596ed41e9f03a98 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 15 Dec 2024 20:05:50 -0600 Subject: [PATCH 328/363] perf: fix lectern packet spam with no changes --- .../client/container/StorageTerminalMenu.java | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java index 216fb3906f..b809398d25 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/container/StorageTerminalMenu.java @@ -101,7 +101,7 @@ public enum SlotAction { private Object2LongMap itemLongMap = new Object2LongOpenHashMap<>(); @Override public void broadcastChanges() { - if(te == null){ + if(te == null) { return; } @@ -121,24 +121,28 @@ public void broadcastChanges() { }); this.itemLongMap.clear(); this.itemLongMap.putAll(itemsCount); - Networking.sendToPlayerClient(new UpdateStorageItemsPacket(toWrite), (ServerPlayer) pinv.player); - CompoundTag tag = new CompoundTag(); - if(!te.getLastSearch().equals(search)) { - search = te.getLastSearch(); - tag.putString("search", search); + if(!toWrite.isEmpty()) { + Networking.sendToPlayerClient(new UpdateStorageItemsPacket(toWrite), (ServerPlayer) pinv.player); } - ListTag tabs = new ListTag(); - for(String s : te.getTabNames()){ - CompoundTag nameTag = new CompoundTag(); - nameTag.putString("name", s); - tabs.add(nameTag); - } - tag.put("tabs", tabs); + if(!sentSettings) { Networking.sendToPlayerClient(new SetTerminalSettingsPacket(te.sortSettings, null), (ServerPlayer) pinv.player); + CompoundTag tag = new CompoundTag(); + if(!te.getLastSearch().equals(search)) { + search = te.getLastSearch(); + tag.putString("search", search); + } + ListTag tabs = new ListTag(); + for(String s : te.getTabNames()){ + CompoundTag nameTag = new CompoundTag(); + nameTag.putString("name", s); + tabs.add(nameTag); + } + tag.put("tabs", tabs); + Networking.sendToPlayerClient(new ServerToClientStoragePacket(tag), (ServerPlayer) pinv.player); sentSettings = true; } - Networking.sendToPlayerClient(new ServerToClientStoragePacket(tag), (ServerPlayer) pinv.player); + super.broadcastChanges(); } @@ -202,6 +206,9 @@ public int getSize() { } public void updateItems(List stacks){ + if(stacks.isEmpty()){ + return; + } stacks.forEach(s -> { if(s.getQuantity() == 0) { this.itemMap.remove(s); From fcf470d69f21c996f43ee867096dc907c55042d8 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sun, 15 Dec 2024 21:08:53 -0600 Subject: [PATCH 329/363] 5.3.6 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index bf5391018b..96b390e7d9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=ars_nouveau mod_name=Ars Nouveau mod_license=LGPL -mod_version=5.3.5 +mod_version=5.3.6 mod_group_id=com.hollingsworth.ars_nouveau mod_authors=Bailey Hollingsworth mod_description=Craft spells, create powerful baubles, and summon magical creatures! From 2140404ec14ab49240a0b2cebee45465539edf5a Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Wed, 18 Dec 2024 18:53:31 -0600 Subject: [PATCH 330/363] fix portal block size --- .../arsnouveau/common/block/PortalBlock.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java index 770f56ffb7..0d0999f4e8 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java @@ -17,7 +17,6 @@ import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; @@ -32,8 +31,6 @@ import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.level.material.PushReaction; import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.VoxelShape; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; @@ -42,17 +39,10 @@ import static com.hollingsworth.arsnouveau.setup.config.ServerConfig.ENABLE_WARP_PORTALS; public class PortalBlock extends TickableModBlock { - protected static final VoxelShape SHAPE = Block.box(0.0D, 0.0D, 0.0D, 14.0D, 12.0D, 14.0D); - public static final EnumProperty AXIS = BlockStateProperties.AXIS; public static final BooleanProperty ALTERNATE = BooleanProperty.create("alternate"); - @Override - public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { - return SHAPE; - } - public PortalBlock() { super(BlockBehaviour.Properties.of().pushReaction(PushReaction.BLOCK).noCollission().strength(-1.0F, 3600000.0F).noLootTable()); this.registerDefaultState(this.defaultBlockState().setValue(AXIS, Direction.Axis.X).setValue(ALTERNATE, false)); From 21b0aae135f84a8c1c328983ab2547f49cbd4424 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Fri, 20 Dec 2024 21:25:36 -0600 Subject: [PATCH 331/363] Update supporters.json --- supporters.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/supporters.json b/supporters.json index be1f6f0323..119a7db599 100644 --- a/supporters.json +++ b/supporters.json @@ -33,7 +33,7 @@ "db489a87-6509-4d75-917d-9c426b519c64", "eb079f27-e266-4b3c-beba-b34d34bef268", "831086b8-d566-4f25-aa09-ecb505e54885", "e3298bd7-61bf-427f-af89-4e418a20bf57", "01b53c7e-c7f4-4465-88df-f8b6c645b6b9", "a29ffabb-ac40-4754-8df8-94b9f394045c", "aef9c054-e96e-4332-944b-9393105b6ac6", "1f62ed4b-91f9-42fa-b331-b7e3e3c0637f", "eb14192a-c53f-44c0-bb13-7f7ff1a0e662", - "758ca96e-100a-4611-a849-5d76229b6c83", "1cf6b68a-a396-4ac1-8146-21fc314f6455"], + "758ca96e-100a-4611-a849-5d76229b6c83", "1cf6b68a-a396-4ac1-8146-21fc314f6455", "f476db17-6995-44ab-b002-0a326959f01a"], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -535,6 +535,11 @@ "color": "magenta", "adopter": "Keyla the Witch", "bio": "Lerya is a curious little Starbuncle, and with the token of friendship she gave to you she shows her appreciation for your kindness. After her human parent ended her game with a deadly growth spell on lots of Sourceberries, Lerya feels very sad and lonely nowadays." + },{ + "name": "Muffin", + "color": "green", + "adopter": "allypandaa", + "bio": "A rogue little monster that somehow escaped. Contain him! Who knows what he'll do now he's free! Last time he blew up! It was a miracle he lived that..." } ] } From 2b569490f89847c98c868129865c1331ec4e0886 Mon Sep 17 00:00:00 2001 From: Jarva <4622609+Jarva@users.noreply.github.com> Date: Mon, 23 Dec 2024 16:00:54 +0000 Subject: [PATCH 332/363] feat: move checks for creative spellbook to tiers (#1534) * feat: move checks for creative spellbook to tiers * fix: revert switching check from creative mode to creative tier --- .../arsnouveau/client/gui/book/GuiSpellBook.java | 6 +++--- .../hollingsworth/arsnouveau/common/items/SpellBook.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index 35ab62a011..9127dcfe12 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -106,12 +106,12 @@ public GuiSpellBook(InteractionHand hand) { List parts = cap == null ? new ArrayList<>() : new ArrayList<>(cap.getKnownGlyphs().stream().filter(AbstractSpellPart::shouldShowInSpellBook).toList()); maxManaCache = ManaUtil.getMaxMana(Minecraft.getInstance().player); parts.addAll(GlyphRegistry.getDefaultStartingSpells()); - if (heldStack.getItem() == ItemsRegistry.CREATIVE_SPELLBOOK.get()) { - parts = new ArrayList<>(GlyphRegistry.getSpellpartMap().values().stream().filter(AbstractSpellPart::shouldShowInSpellBook).toList()); - } int tier = 1; if (heldStack.getItem() instanceof SpellBook book) { tier = book.getTier().value; + if (book.getTier() == SpellTier.CREATIVE) { + parts = new ArrayList<>(GlyphRegistry.getSpellpartMap().values().stream().filter(AbstractSpellPart::shouldShowInSpellBook).toList()); + } } if (SpellCasterRegistry.hasCaster(heldStack)) { AbstractCaster caster = SpellCasterRegistry.from(heldStack); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java index 4075a87e12..f8fae0a3f6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/SpellBook.java @@ -65,7 +65,7 @@ public SpellBook(Properties properties, SpellTier tier) { @Override public @NotNull InteractionResultHolder use(@NotNull Level worldIn, Player playerIn, @NotNull InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); - if (this != ItemsRegistry.CREATIVE_SPELLBOOK.get()) { + if (tier != SpellTier.CREATIVE) { var iMana = CapabilityRegistry.getMana(playerIn); if(iMana != null){ boolean shouldSync = false; From 0751b76fe7926c0454a68c71a349c1f9c5f99ed4 Mon Sep 17 00:00:00 2001 From: Qther Date: Tue, 24 Dec 2024 00:10:09 +0800 Subject: [PATCH 333/363] feat: command to list dropless mobs (#1451) the root command is quite cheap to run and thus does not require op, the "simulate" subcommand can get expensive and thus does require op. --- .../common/command/DroplessMobsCommand.java | 98 +++++++++++++++++++ .../arsnouveau/common/event/EventHandler.java | 1 + .../resources/META-INF/accesstransformer.cfg | 1 + 3 files changed, 100 insertions(+) create mode 100644 src/main/java/com/hollingsworth/arsnouveau/common/command/DroplessMobsCommand.java diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/command/DroplessMobsCommand.java b/src/main/java/com/hollingsworth/arsnouveau/common/command/DroplessMobsCommand.java new file mode 100644 index 0000000000..672b4d5ec2 --- /dev/null +++ b/src/main/java/com/hollingsworth/arsnouveau/common/command/DroplessMobsCommand.java @@ -0,0 +1,98 @@ +package com.hollingsworth.arsnouveau.common.command; + +import com.hollingsworth.arsnouveau.api.ANFakePlayer; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.server.ReloadableServerRegistries; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; + +import java.util.stream.Collectors; + +public class DroplessMobsCommand { + public static void register(CommandDispatcher dispatcher) { + dispatcher.register(Commands.literal("ars-dropless").executes(c -> { + // The root command is accessible to everyone as it isn't too expensive to run. + c.getSource().sendSystemMessage(Component.literal(listDroplessEntities(c.getSource().getServer().reloadableRegistries(), c.getSource().getLevel(), 0).stream().map(e -> BuiltInRegistries.ENTITY_TYPE.getKey(e).toString()).collect(Collectors.joining(",")))); + c.getSource().sendSystemMessage(Component.literal("Listed mobs that produce no drops under naive filtering, open your logs if you want to copy them.")); + + return 1; + }).then(Commands.literal("simulate").requires(c -> c.hasPermission(2)).then(Commands.argument("times", IntegerArgumentType.integer(1)).executes(c -> { + // This subcommand requires op as with enough simulations and entity types, it can get quite slow. + int times = IntegerArgumentType.getInteger(c, "times"); + c.getSource().sendSystemMessage(Component.literal(listDroplessEntities(c.getSource().getServer().reloadableRegistries(), c.getSource().getLevel(), times).stream().map(e -> BuiltInRegistries.ENTITY_TYPE.getKey(e).toString()).collect(Collectors.joining(",")))); + c.getSource().sendSystemMessage(Component.literal("Listed mobs that produced no drops after " + times + " simulations, open your logs if you want to copy them.")); + + return 1; + })))); + } + + public static ObjectArrayList> listDroplessEntities(ReloadableServerRegistries.Holder registries, ServerLevel level, int simulations) { + ANFakePlayer fakePlayer = simulations <= 0 ? null : ANFakePlayer.getPlayer(level); + DamageSource damageSource = simulations <= 0 ? null : level.damageSources().playerAttack(fakePlayer); + ObjectArrayList stacks = simulations <= 0 ? null : new ObjectArrayList<>(); + + ObjectArrayList> types = new ObjectArrayList<>(); + outer: for (EntityType ty : BuiltInRegistries.ENTITY_TYPE) { + Entity e; + try { + e = ty.create(level); + if (e == null) { + continue; + } + + if (!(e instanceof LivingEntity)) { + e.discard(); + continue; + } + } catch (Throwable ignored) { + continue; + } + + LootTable table = registries.getLootTable(e.getType().getDefaultLootTable()); + if (!table.pools.isEmpty()) { + e.discard(); + continue; + } + + if (simulations <= 0) { + types.add(e.getType()); + continue; + } + + LootParams.Builder ctx = (new LootParams.Builder(level)) + .withParameter(LootContextParams.THIS_ENTITY, e).withParameter(LootContextParams.ORIGIN, e.position()) + .withParameter(LootContextParams.DAMAGE_SOURCE, damageSource) + .withOptionalParameter(LootContextParams.ATTACKING_ENTITY, fakePlayer) + .withOptionalParameter(LootContextParams.DIRECT_ATTACKING_ENTITY, damageSource.getDirectEntity()); + ctx = ctx.withParameter(LootContextParams.LAST_DAMAGE_PLAYER, fakePlayer) + .withLuck(fakePlayer.getLuck()); + + for (int i = 0; i < simulations; i++) { + stacks.clear(); + stacks.addAll(table.getRandomItems(ctx.create(LootContextParamSets.ENTITY))); + if (!stacks.isEmpty()) { + e.discard(); + continue outer; + } + } + + types.add(e.getType()); + } + + return types; + } +} diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index 25545c5ea5..0e161ce24f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -344,6 +344,7 @@ public static void commandRegister(RegisterCommandsEvent event) { SummonAnimHeadCommand.register(event.getDispatcher()); LearnGlyphCommand.register(event.getDispatcher()); AdoptCommand.register(event.getDispatcher()); + DroplessMobsCommand.register(event.getDispatcher()); } @SubscribeEvent diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index eb14d2eea0..bd9f91a406 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -66,6 +66,7 @@ public net.minecraft.world.entity.Entity maxUpStep # maxUpStep public net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProviderType (Lcom/mojang/serialization/MapCodec;)V # BlockStateProviderType public net.minecraft.world.item.crafting.RecipeManager byKeyTyped(Lnet/minecraft/world/item/crafting/RecipeType;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/world/item/crafting/RecipeHolder; # byKeyTyped public net.minecraft.client.multiplayer.ClientChunkCache$Storage chunks # chunks +public net.minecraft.world.level.storage.loot.LootTable pools # pools # Geckolib ATs, do not delete public net.minecraft.client.model.geom.ModelPart$Cube public net.minecraft.client.model.geom.ModelPart cubes # cubes From 17ce9722fe1afc045b8440ab02b0e920ac5c4d3b Mon Sep 17 00:00:00 2001 From: TrueHorse <81418739+TrueHorse@users.noreply.github.com> Date: Mon, 23 Dec 2024 17:10:48 +0100 Subject: [PATCH 334/363] Make particles of DelayedSpellEvent optional (#1536) --- .../arsnouveau/api/event/DelayedSpellEvent.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/event/DelayedSpellEvent.java b/src/main/java/com/hollingsworth/arsnouveau/api/event/DelayedSpellEvent.java index 002271011a..41903819c9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/event/DelayedSpellEvent.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/event/DelayedSpellEvent.java @@ -18,17 +18,23 @@ public class DelayedSpellEvent implements ITimedEvent { public final SpellResolver resolver; public final HitResult result; public final Level world; + public final boolean showParticles; @Deprecated(forRemoval = true) public DelayedSpellEvent(int delay, Spell spell, HitResult result, Level world, @Nullable LivingEntity shooter, SpellContext resolver) { - this(delay, result, world, new SpellResolver(resolver)); + this(delay, result, world, new SpellResolver(resolver), true); } public DelayedSpellEvent(int delay, HitResult result, Level world, SpellResolver resolver) { + this(delay, result, world, resolver, true); + } + + public DelayedSpellEvent(int delay, HitResult result, Level world, SpellResolver resolver, boolean showParticles) { this.duration = delay; this.result = result; this.world = world; this.resolver = resolver; + this.showParticles = showParticles; } @Override @@ -38,7 +44,9 @@ public void tick(boolean serverSide) { resolveSpell(); } else if (!serverSide && result != null) { BlockPos hitVec = result instanceof EntityHitResult ? ((EntityHitResult) result).getEntity().blockPosition() : BlockPos.containing(result.getLocation()); - ParticleUtil.spawnTouch((ClientLevel) world, hitVec, resolver.spellContext.getColors()); + if(showParticles){ + ParticleUtil.spawnTouch((ClientLevel) world, hitVec, resolver.spellContext.getColors()); + } } } From abf1897e2e508a31d666357d39ccc0608c0b987a Mon Sep 17 00:00:00 2001 From: Qther Date: Mon, 30 Dec 2024 02:05:45 +0800 Subject: [PATCH 335/363] fix: crush off-by-one, smelt almost-off-by-one (#1551) --- .../arsnouveau/common/spell/effect/EffectCrush.java | 4 ++-- .../arsnouveau/common/spell/effect/EffectSmelt.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java index a57a041992..adb0cb84f7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectCrush.java @@ -113,7 +113,7 @@ public static void crushItems(Level world, List itemEntities, int ma CrushRecipe lastHit = null; // Cache this for AOE hits int itemsCrushed = 0; for (ItemEntity IE : itemEntities) { - if (itemsCrushed > maxItemCrush) { + if (itemsCrushed >= maxItemCrush) { break; } @@ -127,7 +127,7 @@ public static void crushItems(Level world, List itemEntities, int ma if (lastHit == null) continue; - while (!stack.isEmpty() && itemsCrushed <= maxItemCrush) { + while (!stack.isEmpty() && itemsCrushed < maxItemCrush) { List outputs = lastHit.getRolledOutputs(world.random); stack.shrink(1); itemsCrushed++; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java index 4b5948f693..472a1fea1c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectSmelt.java @@ -91,7 +91,7 @@ public void smeltBlock(Level world, BlockPos pos, LivingEntity shooter, BlockHit public void smeltItems(Level world, List itemEntities, int maxItemSmelt, SpellStats spellStats) { int numSmelted = 0; for (ItemEntity itemEntity : itemEntities) { - if (numSmelted > maxItemSmelt) break; + if (numSmelted >= maxItemSmelt) break; Optional optional; if (spellStats.hasBuff(AugmentDampen.INSTANCE)) { From 8cc1683ed9bb7fa72f125155c73192879f789b4e Mon Sep 17 00:00:00 2001 From: Qther Date: Thu, 2 Jan 2025 05:06:03 +0800 Subject: [PATCH 336/363] feat: dont track datagen cache (#1563) * delete datagen cache from repo * add datagen cache to gitignore --- .gitignore | 3 + .../103d9f3f36b01595f1aa5172191e60eff02e6924 | 30 - .../1fdcfe145635ded7bf0d505f6787667f0b49b64e | 6 - .../2741af456691947b147d613b4e1cc70c9e71dd32 | 7 - .../2851bad206eacbcf07f44fe5df73fe54d649e042 | 4 - .../303313689de900e45df1f7ca17c3d36f2c78ac0c | 8 - .../366e6cedc97b567a76524805ff813b15bef0b4f4 | 2 - .../43f70b1d0fc3650d25dddf44c6efffef1900bb18 | 27 - .../457d401e850e914fe39c053c4aa175787ef49774 | 13 - .../56408d4385cae198e776e71d25785a05a196148d | 4 - .../57a62c95f59bc5868cffb1d040840f0d715117bd | 2 - .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 178 ------ .../5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e | 2 - .../5c9e5647706b386caccf0aef27efaa68965030b8 | 65 -- .../73a0c150702b0db33c4f7a4031c7885e3223a862 | 4 - .../7b0970ef111b287b053eb2a386d0fca6ee5aa291 | 3 - .../8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 | 6 - .../95c82c0d51fb7266bfeb5f2d122be5f9b82ff056 | 2 - .../9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e | 581 ------------------ .../a4c3c262a85f6a179e7e29128e8b31d4da806803 | 259 -------- .../a5922da861c7ee259705eec42cf3df986f0db576 | 237 ------- .../abe0934abf823d33d3e88ae408c1d215f03f6bdc | 2 - .../af617d50f86666f21b24a8919c1c50aad8faa4f8 | 14 - .../b7d20159a598c550a793f4787d1e0a9f9d0b61c6 | 7 - .../c03ccd0f93606faadfab316dc8aedf1ba96c844a | 3 - .../cdae075e2d4d58384fe4d2075f6d5323fe5baa69 | 33 - .../d0c924a870929ce1baf161c329e85242236b3530 | 17 - .../d2032e9832fa171affe4a9c0c99fb97f183ff8a6 | 2 - .../d784f732a4c9f307e882d11a0eb56178c990bc6f | 7 - .../e0d3d0b8d9c807675613821fa865a35f707cd83f | 2 - .../e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 | 177 ------ .../e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 | 40 -- .../e7c243f38c2b0774b1bff1a90ede0b19a4077240 | 239 ------- .../eac00f78ae0d33a31d4f208cb05939a004e6cb91 | 68 -- .../f0f2bcace349d412215f006e6183aa56b9316c3c | 84 --- .../f49682cfc17456297bb895b136258055d85afc0c | 16 - 36 files changed, 3 insertions(+), 2151 deletions(-) delete mode 100644 src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 delete mode 100644 src/generated/resources/.cache/1fdcfe145635ded7bf0d505f6787667f0b49b64e delete mode 100644 src/generated/resources/.cache/2741af456691947b147d613b4e1cc70c9e71dd32 delete mode 100644 src/generated/resources/.cache/2851bad206eacbcf07f44fe5df73fe54d649e042 delete mode 100644 src/generated/resources/.cache/303313689de900e45df1f7ca17c3d36f2c78ac0c delete mode 100644 src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 delete mode 100644 src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 delete mode 100644 src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 delete mode 100644 src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d delete mode 100644 src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd delete mode 100644 src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d delete mode 100644 src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e delete mode 100644 src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 delete mode 100644 src/generated/resources/.cache/73a0c150702b0db33c4f7a4031c7885e3223a862 delete mode 100644 src/generated/resources/.cache/7b0970ef111b287b053eb2a386d0fca6ee5aa291 delete mode 100644 src/generated/resources/.cache/8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 delete mode 100644 src/generated/resources/.cache/95c82c0d51fb7266bfeb5f2d122be5f9b82ff056 delete mode 100644 src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e delete mode 100644 src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 delete mode 100644 src/generated/resources/.cache/a5922da861c7ee259705eec42cf3df986f0db576 delete mode 100644 src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc delete mode 100644 src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 delete mode 100644 src/generated/resources/.cache/b7d20159a598c550a793f4787d1e0a9f9d0b61c6 delete mode 100644 src/generated/resources/.cache/c03ccd0f93606faadfab316dc8aedf1ba96c844a delete mode 100644 src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 delete mode 100644 src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 delete mode 100644 src/generated/resources/.cache/d2032e9832fa171affe4a9c0c99fb97f183ff8a6 delete mode 100644 src/generated/resources/.cache/d784f732a4c9f307e882d11a0eb56178c990bc6f delete mode 100644 src/generated/resources/.cache/e0d3d0b8d9c807675613821fa865a35f707cd83f delete mode 100644 src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 delete mode 100644 src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 delete mode 100644 src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 delete mode 100644 src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 delete mode 100644 src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c delete mode 100644 src/generated/resources/.cache/f49682cfc17456297bb895b136258055d85afc0c diff --git a/.gitignore b/.gitignore index b7bf68e734..aaeea68e19 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,6 @@ server forge*changelog.txt run + +# Datagen cache +/src/generated/resources/.cache/ diff --git a/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 deleted file mode 100644 index b0dcf1a939..0000000000 --- a/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 +++ /dev/null @@ -1,30 +0,0 @@ -// 1.21.1 2024-10-13T12:06:56.1313344 Registries -e2ace9cd4c3d79ee5d08d9962a5852b61c97cbe7 data/ars_nouveau/neoforge/biome_modifier/alakarkinos_spawn.json -32a6b3988ea60702ed982c1c98ce98d780914ee6 data/ars_nouveau/neoforge/biome_modifier/common_source_berry.json -48f1ed52be8710f33085755655620cd53a9a6705 data/ars_nouveau/neoforge/biome_modifier/drygmy_spawn.json -e91a5b67459e7010b9d1a4352ce270b6d1c14d24 data/ars_nouveau/neoforge/biome_modifier/gift_starbuncle_spawn.json -87eb27c6d0baff653b0d954f8dcd774b3226006d data/ars_nouveau/neoforge/biome_modifier/rare_archwood_mix.json -58b5e0b1fce0f61d0d897e12070469b7e2273853 data/ars_nouveau/neoforge/biome_modifier/starbuncle_spawn.json -a1446fb90ad8cd51a55e9faa10d0da6dc6bc3d35 data/ars_nouveau/neoforge/biome_modifier/whirlisprig_spawn.json -9c2b9e582185c70673bbe62c4fa760e204e3154b data/ars_nouveau/worldgen/biome/archwood_forest.json -11dae67f4834780fdc8afa11b6add259df6f6fe1 data/ars_nouveau/worldgen/configured_feature/blazing_tree.json -2be9afcb9cb6e17391a8d24861adb4a0a6314ae2 data/ars_nouveau/worldgen/configured_feature/cascading_tree.json -d9029270f2740e4e84e75949c131a504613d5359 data/ars_nouveau/worldgen/configured_feature/flourishing_tree.json -d30c7c27da29b890c1d8bd285dbda9202c5c6b84 data/ars_nouveau/worldgen/configured_feature/lights.json -a21b4c0ed68c5ea8e6b5d0497efbc44c827d6406 data/ars_nouveau/worldgen/configured_feature/mixed_archwoods.json -f54a8bffecd9d41f35fac1c92f8a1e02ec01e54d data/ars_nouveau/worldgen/configured_feature/natural_blazing_tree.json -3ac1582c7155a72d82ab2e546d8050367dcd5504 data/ars_nouveau/worldgen/configured_feature/natural_cascading_tree.json -e7dd83973ec66d9a0dc19f4323df9d4352d83e98 data/ars_nouveau/worldgen/configured_feature/natural_flourishing_tree.json -b0e09044a79801d3dde689dd8ad800d16dd04e4f data/ars_nouveau/worldgen/configured_feature/natural_vexing_tree.json -eaa9fc028d32f25881bd9cda25c96359531a763c data/ars_nouveau/worldgen/configured_feature/patch_berry.json -40335ff334180caf10b53c0d3cab77d0776c6ad5 data/ars_nouveau/worldgen/configured_feature/vexing_tree.json -bf008aeef567f9361d4f6403ffadb7a675f1d506 data/ars_nouveau/worldgen/placed_feature/mojang_flowers.json -e0001a60d7b93a7a3a1aa534f7a1d42406e0bacc data/ars_nouveau/worldgen/placed_feature/mojang_grass.json -a9ecb313d4444666b74e42f640d22ff0746d4b11 data/ars_nouveau/worldgen/placed_feature/placed_berry_bush.json -71ba527f56cf9775ac0a31d6e27e0a48981e1f0c data/ars_nouveau/worldgen/placed_feature/placed_blazing_tree.json -374ef6a674c3ce384bef927a932b02ec51f73fa8 data/ars_nouveau/worldgen/placed_feature/placed_cascading_tree.json -366006d4328e92eadecfd9271b6e1f71278c6105 data/ars_nouveau/worldgen/placed_feature/placed_dense_archwoods.json -bce47bfb153c417703b4c1e817de6573c46a4e68 data/ars_nouveau/worldgen/placed_feature/placed_flourishing_tree.json -22ba86c2ca5e8545ec07c9827e2220ce36450f3c data/ars_nouveau/worldgen/placed_feature/placed_lights.json -51c9065c2a9dcabeb5c1dccdc90b9226f9fcdca8 data/ars_nouveau/worldgen/placed_feature/placed_mixed_archwoods.json -bb41b919988a7f3d7b3e5c9cf80a77011b753c3c data/ars_nouveau/worldgen/placed_feature/placed_vexing_tree.json diff --git a/src/generated/resources/.cache/1fdcfe145635ded7bf0d505f6787667f0b49b64e b/src/generated/resources/.cache/1fdcfe145635ded7bf0d505f6787667f0b49b64e deleted file mode 100644 index bfe17a8e56..0000000000 --- a/src/generated/resources/.cache/1fdcfe145635ded7bf0d505f6787667f0b49b64e +++ /dev/null @@ -1,6 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.1742947 Ars Nouveau's Damage Type Data -4b4b2ff422d23e4cb6282f664d89dad7ac8ff8e6 data/ars_nouveau/damage_type/crush.json -fe8c85729655f971ee94229cbb7d68bbb513d08b data/ars_nouveau/damage_type/flare.json -3aa319bb73ba25bbeae84aace10603b4900b6100 data/ars_nouveau/damage_type/frost.json -4b4b2ff422d23e4cb6282f664d89dad7ac8ff8e6 data/ars_nouveau/damage_type/spell.json -4b4b2ff422d23e4cb6282f664d89dad7ac8ff8e6 data/ars_nouveau/damage_type/windshear.json diff --git a/src/generated/resources/.cache/2741af456691947b147d613b4e1cc70c9e71dd32 b/src/generated/resources/.cache/2741af456691947b147d613b4e1cc70c9e71dd32 deleted file mode 100644 index 43e453005f..0000000000 --- a/src/generated/resources/.cache/2741af456691947b147d613b4e1cc70c9e71dd32 +++ /dev/null @@ -1,7 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.172785 Tags for minecraft:damage_type mod id ars_nouveau -8641b05da5b216be05123e3ed96b606930b31f26 data/minecraft/tags/damage_type/always_hurts_ender_dragons.json -c07768ed08384f5d693ed8bed719a825a531b78e data/minecraft/tags/damage_type/bypasses_armor.json -4eb8deadc24e4e017387ef06cfa6543373cea902 data/minecraft/tags/damage_type/is_fall.json -c03f05d0cd54c703078c47781e29b30b316ed23d data/minecraft/tags/damage_type/is_fire.json -df18c48c123c4f2586bbcec49ba5d5768308be5a data/minecraft/tags/damage_type/is_freezing.json -8641b05da5b216be05123e3ed96b606930b31f26 data/neoforge/tags/damage_type/is_magic.json diff --git a/src/generated/resources/.cache/2851bad206eacbcf07f44fe5df73fe54d649e042 b/src/generated/resources/.cache/2851bad206eacbcf07f44fe5df73fe54d649e042 deleted file mode 100644 index ad0b8f6729..0000000000 --- a/src/generated/resources/.cache/2851bad206eacbcf07f44fe5df73fe54d649e042 +++ /dev/null @@ -1,4 +0,0 @@ -// 1.21.1 2024-08-24T11:29:07.3818652 Ars Nouveau's Jukebox Data -7e8e4bde7700db0a53308df777880a129e98b5d0 data/ars_nouveau/jukebox_song/aria_biblio.json -3a76a49e3c264090a26ae2e512fdf36e94a0e382 data/ars_nouveau/jukebox_song/firel_the_wild_hunt.json -8df17e7d75fa4d9822e6b2ed109e2c9f92e874e0 data/ars_nouveau/jukebox_song/thistle_the_sound_of_glass.json diff --git a/src/generated/resources/.cache/303313689de900e45df1f7ca17c3d36f2c78ac0c b/src/generated/resources/.cache/303313689de900e45df1f7ca17c3d36f2c78ac0c deleted file mode 100644 index 2581d5bb9c..0000000000 --- a/src/generated/resources/.cache/303313689de900e45df1f7ca17c3d36f2c78ac0c +++ /dev/null @@ -1,8 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.1707777 Tags for minecraft:worldgen/biome mod id ars_nouveau -92c4e65802ffcb7533e9259f0b0356510154d662 data/ars_nouveau/tags/worldgen/biome/archwood_biome.json -60daaef808d1b0ed031d9007b5ad3007d1fdb695 data/ars_nouveau/tags/worldgen/biome/berry_spawn.json -e65d864a8148e6a6c372dcc989f9c68e0ae6110c data/ars_nouveau/tags/worldgen/biome/no_mob_spawn.json -b020f6cdcd2d955793278b2f89a178a1d31e599a data/ars_nouveau/tags/worldgen/biome/summon_spawn.json -c35a28e912b4aa05b77d622c24298f022d3bcb17 data/minecraft/tags/worldgen/biome/has_structure/village_plains.json -c35a28e912b4aa05b77d622c24298f022d3bcb17 data/minecraft/tags/worldgen/biome/is_forest.json -c35a28e912b4aa05b77d622c24298f022d3bcb17 data/minecraft/tags/worldgen/biome/is_overworld.json diff --git a/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 b/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 deleted file mode 100644 index 866f530b6e..0000000000 --- a/src/generated/resources/.cache/366e6cedc97b567a76524805ff813b15bef0b4f4 +++ /dev/null @@ -1,2 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.2161684 Dispel Entity Datagen -55a9fb696041d92f6546f9017307a9e660678713 data/ars_nouveau/recipe/dispel_entity/blaze_powder.json diff --git a/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 b/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 deleted file mode 100644 index 3618ba3dce..0000000000 --- a/src/generated/resources/.cache/43f70b1d0fc3650d25dddf44c6efffef1900bb18 +++ /dev/null @@ -1,27 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.2151663 Crush -b74461afbe445ac042cd1d04298474b2403054ae data/ars_nouveau/recipe/blue_dye.json -0ba5aafe171e9aab7bec69520d99698d5829fd97 data/ars_nouveau/recipe/brown_dye.json -dfee25791763eafe3dacdb2ce45173e1f5862a70 data/ars_nouveau/recipe/cobblestone.json -575e3ab2056dfc4cb00e501183d434b2546fc4b3 data/ars_nouveau/recipe/glowstone_block_to_dust.json -eecc8bebf1941c82ff27d283a099c03f68ed67d8 data/ars_nouveau/recipe/gravel.json -2cf6331b235739fa53cb9deb8d1f443fb38945e3 data/ars_nouveau/recipe/light_blue_dye.json -99c405fb0d2166d0e63729f77caa3af3ebf4b5f1 data/ars_nouveau/recipe/light_gray_dye_azure.json -a92b1477f4702c10681fde040b44253850a7ce34 data/ars_nouveau/recipe/light_gray_dye_oxeye.json -5b00ea72107e83f811de998845aad586f676e030 data/ars_nouveau/recipe/light_gray_dye_tulip.json -4cfa47af390d267002d2ebef40acdd651f79d7b1 data/ars_nouveau/recipe/magenta_dye.json -b667cbe48d5657fbb6b93fb7ff87b7314edd4fb9 data/ars_nouveau/recipe/magenta_dye_lilac.json -fa479269c71bb00c91df23e08e2bf701c64dae9c data/ars_nouveau/recipe/orange_dye.json -dea87ef323ffd7180447688f935fe8afc1031abb data/ars_nouveau/recipe/pink_dye.json -78fa095a707a79aca21c05b7efec251ae1bddbf8 data/ars_nouveau/recipe/pink_dye_peony.json -f2d6a6686cb251547ec6d9dececa4fdc8dbf3dc0 data/ars_nouveau/recipe/quartz_block_to_quartz.json -5122d980c0da3a720e186ec2c1e490ca7c990333 data/ars_nouveau/recipe/red_dye_beetroot.json -8a755ef772635b520a59ade0adcd3528194416b4 data/ars_nouveau/recipe/red_dye_poppy.json -506b0eba7d9ea4066203c5161c4eac26a71a4c7a data/ars_nouveau/recipe/red_dye_rose_bush.json -fb1c188da8ef388b0aaca584ca10daec68f305ee data/ars_nouveau/recipe/red_dye_tulip.json -9a1165eca1937afd1b7431bc523511bd823da0e6 data/ars_nouveau/recipe/sandstone_to_sand.json -eaa3c40e651175f0f50826932b652454d1a87048 data/ars_nouveau/recipe/stone.json -ff2d3c2c1f91c33d1255753ac8c914399f2343df data/ars_nouveau/recipe/sugar_cane.json -4706b358283011cbc03f2f7aa1d2cf167d4cc350 data/ars_nouveau/recipe/terracotta.json -a378f13327fd0ae314a250c17bd8bb655d54ce34 data/ars_nouveau/recipe/white_dye.json -0e93db507585d02d55d44661d08bbc215f725d9d data/ars_nouveau/recipe/yellow_dye.json -97e2ebd7e70f26dde9172bb3d93e9329a8823aa3 data/ars_nouveau/recipe/yellow_dye_sunflower.json diff --git a/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 b/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 deleted file mode 100644 index e8d6813e9d..0000000000 --- a/src/generated/resources/.cache/457d401e850e914fe39c053c4aa175787ef49774 +++ /dev/null @@ -1,13 +0,0 @@ -// 1.21.1 2024-10-28T14:22:45.355925757 Scry Ritual Datagen -bd426f52e2cdaf860c0fc270cb1746d8b7596501 data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json -539354bf11e8ce41a4db4ce41044247b8389aff4 data/ars_nouveau/recipe/scry_ritual/amethyst_gems.json -26baa828b81ffa33bb56b9ec47bb3d49fa2a0106 data/ars_nouveau/recipe/scry_ritual/coal_ores.json -d2dcdf8259d2bc6d29830a4f81b19f5d009cd062 data/ars_nouveau/recipe/scry_ritual/copper_ores.json -a6665e46a3e3d697fa16e1d7ec8f9a814fb11a0c data/ars_nouveau/recipe/scry_ritual/diamond_ores.json -1d97b836c7b01e4dd8bcbbdd164ad38f4f604dca data/ars_nouveau/recipe/scry_ritual/emerald_ores.json -5e3d38a9453f93eb12675393abffdf1392d35829 data/ars_nouveau/recipe/scry_ritual/gold_ores.json -411400d36c537e7ebe66b75ba53972d2bf519dca data/ars_nouveau/recipe/scry_ritual/iron_ores.json -bb0d58f05959e4958d7da998ac49662a1ac5245a data/ars_nouveau/recipe/scry_ritual/lapis_ores.json -40146eb7d6b66d4901cf356834424b8b88eb5fee data/ars_nouveau/recipe/scry_ritual/netherite_scrap_ores.json -5e8c407e166dcc51cb5d8e592ca85c0f30341440 data/ars_nouveau/recipe/scry_ritual/quartz_ores.json -e066e530226b8de300ef93e2ab9bbc1b804766b8 data/ars_nouveau/recipe/scry_ritual/redstone_ores.json diff --git a/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d b/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d deleted file mode 100644 index fc372048d5..0000000000 --- a/src/generated/resources/.cache/56408d4385cae198e776e71d25785a05a196148d +++ /dev/null @@ -1,4 +0,0 @@ -// 1.21.1 2024-11-09T21:45:14.2597449 Ars Nouveau's Enchantment Data -e86598b47a336ed9c1c12c8c0391cf4d2f771c21 data/ars_nouveau/enchantment/mana_boost.json -321253ad8e6e58e584e3fe140e7fc39a1f2f11b7 data/ars_nouveau/enchantment/mana_regen.json -48649708bc7378402370f35ac7d600a31385fa01 data/ars_nouveau/enchantment/reactive.json diff --git a/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd b/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd deleted file mode 100644 index 2fe79b2f3c..0000000000 --- a/src/generated/resources/.cache/57a62c95f59bc5868cffb1d040840f0d715117bd +++ /dev/null @@ -1,2 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.2031315 Summon Ritual Datagen -71d5df7266f203db9b869b49529b50e286ea662d data/ars_nouveau/recipe/summon_ritual/bats.json diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d deleted file mode 100644 index af7ccaccdc..0000000000 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ /dev/null @@ -1,178 +0,0 @@ -// 1.21.1 2024-11-10T11:47:56.4656631 Loot Tables -4f70eae621815da8d08d3ea0b9fd479b48bad2d3 data/ars_nouveau/loot_table/blocks/agronomic_sourcelink.json -8a6d60f2b39de0408c7e4537b53e866a04236d22 data/ars_nouveau/loot_table/blocks/alchemical_sourcelink.json -8bdff8a0a49a9f3f21a822eb1d1d01a950d6ad1a data/ars_nouveau/loot_table/blocks/alteration_table.json -3f9ddb75996549cf381b4b1b6d1739eb83bf437b data/ars_nouveau/loot_table/blocks/arcane_core.json -b7bc68db508b0f182607bdc24e0b6b6fe676390d data/ars_nouveau/loot_table/blocks/arcane_pedestal.json -32dd151b5c8ccbcdd7f177974bfd3e729d4d4346 data/ars_nouveau/loot_table/blocks/arcane_platform.json -45051ced83838c9d65d2b8f504b8a0f67a84b05e data/ars_nouveau/loot_table/blocks/archwood_button.json -bd02fbb12b7c0c175bd6d0e1b187d2863417639a data/ars_nouveau/loot_table/blocks/archwood_chest.json -e8985e027de224f13721125c4b09d65713f97dc5 data/ars_nouveau/loot_table/blocks/archwood_door.json -26b9292b4a83dd617d39b696cec4135427498a63 data/ars_nouveau/loot_table/blocks/archwood_fence.json -9f049cc2f08417b7eca511cf243c4f0fd02defc4 data/ars_nouveau/loot_table/blocks/archwood_fence_gate.json -04086022de397555e18d65bfc013c90cdd422a9d data/ars_nouveau/loot_table/blocks/archwood_grate.json -f9e27d9666e987dd258f4f7eae3e26e76af37a8b data/ars_nouveau/loot_table/blocks/archwood_planks.json -e81dd438da4fefc94c36ba7ca66cdc96eb894fbf data/ars_nouveau/loot_table/blocks/archwood_pressure_plate.json -34474b1ab19734300b3340f1fc93b35a3f236130 data/ars_nouveau/loot_table/blocks/archwood_sconce.json -9b6046d339e837e294f50722c066fd2b9ba4ca1c data/ars_nouveau/loot_table/blocks/archwood_slab.json -c175159946f8e1a1d9777625b1a565012f9ea1ac data/ars_nouveau/loot_table/blocks/archwood_stairs.json -241b4a83e94824d1d28d5203a3873d25b731f016 data/ars_nouveau/loot_table/blocks/archwood_trapdoor.json -953dc98596bb992c024d3a5bc5007d49600a5dea data/ars_nouveau/loot_table/blocks/basic_spell_turret.json -e9dbdaf07f7ec302897ddad436c794103b1059b2 data/ars_nouveau/loot_table/blocks/bastion_pod.json -d20df978db97dd6df3078dfa3b58ff8916020aa0 data/ars_nouveau/loot_table/blocks/blue_archwood_leaves.json -d177c2573688d773f18a7ebf34d00530a22f6ac1 data/ars_nouveau/loot_table/blocks/blue_archwood_log.json -ecc018a81786cc6a6e28d361245f41ac11dbe254 data/ars_nouveau/loot_table/blocks/blue_archwood_sapling.json -3d912ff5f4cb0dc9bd1253b96a1f4ffcdc06a2b3 data/ars_nouveau/loot_table/blocks/blue_archwood_wood.json -d74fd91465aa6474895a69ce39c3c63e96cd61af data/ars_nouveau/loot_table/blocks/blue_sbed.json -fe4e42346e3f3b02b067ec99d988953be10780f3 data/ars_nouveau/loot_table/blocks/bombegranate_pod.json -25879b59f556935200d2f9d63e9fe18c0f8b6375 data/ars_nouveau/loot_table/blocks/brazier_relay.json -d55a3d256fd7d71a17fc46cb1373ddf4581ebaab data/ars_nouveau/loot_table/blocks/creative_source_jar.json -cf0a6f8a23b9a04aac70bae40c63d8e57b1006a6 data/ars_nouveau/loot_table/blocks/drygmy_stone.json -50fb5a022df6f6d156c90ee3121ccfe82943beb7 data/ars_nouveau/loot_table/blocks/enchanting_apparatus.json -7a2afda0f26e560c401265332ba8466e324c2b90 data/ars_nouveau/loot_table/blocks/falseweave.json -e23b39b257d50c062129f1abb33f277a758ad2a1 data/ars_nouveau/loot_table/blocks/frostaya_pod.json -57a757c165d2b0bcb480c1e948766fb714a75dc0 data/ars_nouveau/loot_table/blocks/ghostweave.json -7d0528215f008b8e98d38e590cf5ad40ba2644a1 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating.json -ba6dd685d930c77f684b0b805799f7305296678d data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating_slab.json -ac5adad7cfa5a64b21aeb0399b50a885b4937968 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_alternating_stairs.json -381408b99442f1ad4bf66a6a10a68d2cbd789dc8 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave.json -e546d725ad3f43b5dd18057f212d38f9ed853361 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave_slab.json -6926d66cd344c39c06c86bd21ec9c45a853461e5 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_basketweave_stairs.json -6ced512f67c47e4a5162a0257d81f73dcae370da data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks.json -8d1891aa81a67e9ee849c6daa7c037c12c8f0839 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks_slab.json -8a51072a80ce8ea0696bdf22636e99de4c3d7f9d data/ars_nouveau/loot_table/blocks/gilded_sourcestone_large_bricks_stairs.json -1749337e2a7d8d623578b78cb1184a10b8dface9 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic.json -3e7d5686638e742fd74278e94157748119122956 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic_slab.json -c6e7419ee0480ecead75d1564f0c7f1927629975 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_mosaic_stairs.json -8cb421ba47c458534a0b87439be3c7813e0c6b2d data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks.json -73c7f7561087045f511845e5d6674889f17c4ad5 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks_slab.json -e36caa0a35b00d749d0ab30d86401b33c3ad6736 data/ars_nouveau/loot_table/blocks/gilded_sourcestone_small_bricks_stairs.json -13735344d4ecb2b7547d21c4b6b341d5b8a5324c data/ars_nouveau/loot_table/blocks/gold_grate.json -cf4043c312a2753289b18489e77be41712e59242 data/ars_nouveau/loot_table/blocks/green_archwood_leaves.json -8e02847416b3fbd2f7ee102ec6091b797890f027 data/ars_nouveau/loot_table/blocks/green_archwood_log.json -624aac56531fafa0fb0b66931e54ffade954dcf0 data/ars_nouveau/loot_table/blocks/green_archwood_sapling.json -a28c937d10a3fe9217162d764863964ce6d63c58 data/ars_nouveau/loot_table/blocks/green_archwood_wood.json -9881f7ab8a9fe67b52bc163b58fb2e9f1bb805b4 data/ars_nouveau/loot_table/blocks/green_sbed.json -e220cb0773c9e33776b5909041613d3291d06548 data/ars_nouveau/loot_table/blocks/imbuement_chamber.json -df5ba05995044413998b7cbbf02d6c7a63e7c583 data/ars_nouveau/loot_table/blocks/item_detector.json -2af90b26f5f047e3168626ce05aad7a64f42d2ec data/ars_nouveau/loot_table/blocks/magebloom_block.json -db151abe9a1ec4db50b9318d812d049a98154756 data/ars_nouveau/loot_table/blocks/magebloom_crop.json -072841a4552421b48e60a01206d4b1f42dd90da5 data/ars_nouveau/loot_table/blocks/magelight_torch.json -9d551107c336c6341450da44650d007e795ae962 data/ars_nouveau/loot_table/blocks/mendosteen_pod.json -019635e76547e287688dc710b66e2f96d86ba011 data/ars_nouveau/loot_table/blocks/mirrorweave.json -2f78f083e1ee6ccd18496465ce740c8353faf834 data/ars_nouveau/loot_table/blocks/mob_jar.json -06f0d996eea4783dd302764820d1d0e87178cc04 data/ars_nouveau/loot_table/blocks/mycelial_sourcelink.json -6bf8bd330d83e260cd4fcf8311560fd37399f016 data/ars_nouveau/loot_table/blocks/orange_sbed.json -b6f8c60f021cc50669d4a4f75056334922fdd5b1 data/ars_nouveau/loot_table/blocks/polished_sconce.json -a3b768d587399b35b7b094b7bce9f70e9033ef44 data/ars_nouveau/loot_table/blocks/potion_diffuser.json -bb3ffccb3f8ae3f0fa476304f82ded4f62a14cfd data/ars_nouveau/loot_table/blocks/potion_jar.json -8653cbc9f5368a9767156cf5842781623f1c76ed data/ars_nouveau/loot_table/blocks/potion_melder.json -2983589b24f1fa835eae3c40877e0728eb9a5981 data/ars_nouveau/loot_table/blocks/potted_blue_archwood_sapling.json -040c5c292dd024010db00c1433781b44351f52a4 data/ars_nouveau/loot_table/blocks/potted_green_archwood_sapling.json -20ddfca015d14d3a7f7b550c2b262f4862d1f75b data/ars_nouveau/loot_table/blocks/potted_magebloom_crop.json -dc18f35d7a8d6bf84c82e2206d5b0c069e964c1e data/ars_nouveau/loot_table/blocks/potted_purple_archwood_sapling.json -4e76f2d01cff38f0866d8cf088e258f428f35e4b data/ars_nouveau/loot_table/blocks/potted_red_archwood_sapling.json -4bafb6a4f58adb47ad5700df8ed23a90d2999464 data/ars_nouveau/loot_table/blocks/purple_archwood_leaves.json -cf7efdbd5b6e77bcbf10453354b14d0b96aadcda data/ars_nouveau/loot_table/blocks/purple_archwood_log.json -cf9cf5fccb3de2f32cee7d00ad660f69407602d5 data/ars_nouveau/loot_table/blocks/purple_archwood_sapling.json -fc728de445a4bc800c00a685110321f5e13dcc85 data/ars_nouveau/loot_table/blocks/purple_archwood_wood.json -ac8b57829cc7829446d261fa71c2574c72cd1c2d data/ars_nouveau/loot_table/blocks/purple_sbed.json -c233e9e672096d9d25210eda5b7b3bae135c7060 data/ars_nouveau/loot_table/blocks/redstone_relay.json -6d330e74dfe5536e111d1ea72a7136d382da7567 data/ars_nouveau/loot_table/blocks/red_archwood_leaves.json -2b1e55d818128d6e1575c5b9e947910ba1011148 data/ars_nouveau/loot_table/blocks/red_archwood_log.json -167dacda5b033bc2ea2f4f17b4b30d88187ef06b data/ars_nouveau/loot_table/blocks/red_archwood_sapling.json -8c4a3c881d255931c3304a5e310fa999686ddced data/ars_nouveau/loot_table/blocks/red_archwood_wood.json -d2eb2e725a6fe9ddf74eb22f4c4a2bb4e3717964 data/ars_nouveau/loot_table/blocks/red_sbed.json -99675e30bd8f76cbb080d31bc8a6047f2280bd54 data/ars_nouveau/loot_table/blocks/relay.json -9520d386bc5119acad6a177455b7ea5223fdb117 data/ars_nouveau/loot_table/blocks/relay_collector.json -f9cfd7f203d4fc26033d055fa936508c4e369ffa data/ars_nouveau/loot_table/blocks/relay_deposit.json -084d2d8f43154b85960282eb4c515348c80b1203 data/ars_nouveau/loot_table/blocks/relay_splitter.json -dd4282bd6f44a455aa442afd4d97fcf1ed9b2eaf data/ars_nouveau/loot_table/blocks/relay_warp.json -cac944832ef77dadfa9217f950fa995e762a5422 data/ars_nouveau/loot_table/blocks/repository.json -f93f19e982d57699feaaed5c19ed8fbc0dec4796 data/ars_nouveau/loot_table/blocks/ritual_brazier.json -8cb7ec62461732b94f263088750ea75273380bf4 data/ars_nouveau/loot_table/blocks/rotating_spell_turret.json -1e582aa987ca89e885741b61fa9229ebcdebce9d data/ars_nouveau/loot_table/blocks/sconce.json -26728e4a536530c8e335a606fca91f3ee99cb168 data/ars_nouveau/loot_table/blocks/scribes_table.json -984435831881b13c2c1bdecf041e8dd1ccb40bac data/ars_nouveau/loot_table/blocks/scryers_crystal.json -bc8435066f7b47edb7197fe0d207c44c0094f1c4 data/ars_nouveau/loot_table/blocks/scryers_oculus.json -faa169858abb5eb9e9d62d6f41954d98242ae42f data/ars_nouveau/loot_table/blocks/sky_block.json -674a56d476c613ddc975af252aa511d67c768130 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating.json -b048c81d1487ba7dd40189442ce11a5c6937317b data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating_slab.json -7aadcd3e56430fdfb7889374a4c4f7b732e8ce64 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_alternating_stairs.json -f1423b08a0b72a3b4e0902a88d5a8f809f5cba19 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave.json -fba23f12624dd92b240e9180d963590082d55557 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave_slab.json -4723ffa800c362863d51e6994e558aca587311c4 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_basketweave_stairs.json -16a119ba4294d3f77af4f764a3d2aef403f3038f data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks.json -d1bb287d54cc2a4bcb8e093a60893f579a178ec1 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks_slab.json -75ec795e4aa1be4ebb0c7fe1b8636993eaa5d8ba data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_large_bricks_stairs.json -4a3163207549d3f02541bf2039fab13e21803767 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic.json -ab9664200751134e23d539a824741ab30185cb41 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic_slab.json -b78795b7118976f7250d93827a9c80218ffe3ad0 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_mosaic_stairs.json -717886abf77f77f481af18662bd6b262bcef48f2 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks.json -283b1405945e3ecc25fcd4457097972077bc7e8f data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks_slab.json -d7cdfc8eaa9e40101eeb6185c1c4e9d5b9218243 data/ars_nouveau/loot_table/blocks/smooth_gilded_sourcestone_small_bricks_stairs.json -ccdb190d803f59c5ef8726d248830434d6c540d7 data/ars_nouveau/loot_table/blocks/smooth_sourcestone.json -67d31883c7dc6632265e7ec03fb5b739fab315d1 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating.json -9b046ee5f4bae2eb32d2db59cb7864bdc69d723e data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating_slab.json -a205a6b50ae311561b5d2bc29b188288141a299c data/ars_nouveau/loot_table/blocks/smooth_sourcestone_alternating_stairs.json -b8733770850ea0012c67a3ec3d1e03134e6c13f9 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave.json -8a7c0327f56cc9496e18be413478f2b7983ec445 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave_slab.json -d7d0b68063bdabc0e0ff1b1ae3b17ed004173540 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_basketweave_stairs.json -419b0649e2fd32b81cbd4555f43735496a049967 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_grate.json -c18b70f5e59d0ae6bdca21845da7f10c8baf2b46 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks.json -f5a1d6acb131a489129e1d0ab1a2c1f9de5156fd data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks_slab.json -0acf441f53f330991ef49828ff9b66e1c622b78a data/ars_nouveau/loot_table/blocks/smooth_sourcestone_large_bricks_stairs.json -31cbc75aab2372f6a23567dd4372fccd23005ea1 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic.json -7d0c6a97a0e3d9d0c011526c9db258443c3225d5 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic_slab.json -be49357c6ee04402a71b75963b5b2e047fee8938 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_mosaic_stairs.json -18884920130d1ca32411fbdedb9a551fbbbe5e4f data/ars_nouveau/loot_table/blocks/smooth_sourcestone_slab.json -64897b76c33423b90e8eb17390fa7de0d9dfe9dc data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks.json -ee44c86873143caf5b8e9fc05d74acb98fa9f3b9 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks_slab.json -eda12a15644f4ac9fbf901cd738434df58db11a9 data/ars_nouveau/loot_table/blocks/smooth_sourcestone_small_bricks_stairs.json -62a4e61ba7b3bbd78d5cdca0cba621c98113638b data/ars_nouveau/loot_table/blocks/smooth_sourcestone_stairs.json -585b4114f9b56f12e653eb71bf4faa0c563645b1 data/ars_nouveau/loot_table/blocks/sourceberry_bush.json -1fc8c5595757f818906588e2a7ad87f3ee7ad89d data/ars_nouveau/loot_table/blocks/sourceberry_sack.json -42e5040c6a81a4617c6ef147e12e17267bbbcd2a data/ars_nouveau/loot_table/blocks/sourcestone.json -b56aaf60ce3bafd66649843757a01d84d1cc8453 data/ars_nouveau/loot_table/blocks/sourcestone_alternating.json -56ae08dbfc2014ff8a2606d7e7e989c040d9d066 data/ars_nouveau/loot_table/blocks/sourcestone_alternating_slab.json -54175f8012d1f822f50d5703bcfcd99e4b0d3736 data/ars_nouveau/loot_table/blocks/sourcestone_alternating_stairs.json -491e38b7824baac8f6ac93c90f9edccf35f77707 data/ars_nouveau/loot_table/blocks/sourcestone_basketweave.json -e07e3d7b2e47f58dbe3db2575d250dd78acd1ca8 data/ars_nouveau/loot_table/blocks/sourcestone_basketweave_slab.json -00cfcfece665375c9df7bbe6f439eea43225e254 data/ars_nouveau/loot_table/blocks/sourcestone_basketweave_stairs.json -de0b37fdc7443d920177f65effd0ea150e498e2d data/ars_nouveau/loot_table/blocks/sourcestone_grate.json -4feb095b7aec7b12712b22cbc8b0c80bfde72e29 data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks.json -03d6d7899db53d9fc380e7b88b2a8c03c524d55d data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks_slab.json -a9ccd94f6755cbac1a79c19bdb5a07fe1220a852 data/ars_nouveau/loot_table/blocks/sourcestone_large_bricks_stairs.json -3df5edddb7ba8bcff233effb681a315a9011d539 data/ars_nouveau/loot_table/blocks/sourcestone_mosaic.json -3ccfc90bc256c162837acf8cce74d71387f918d8 data/ars_nouveau/loot_table/blocks/sourcestone_mosaic_slab.json -1e042e669e68da9bc47c3e7306b9ce47a3102e38 data/ars_nouveau/loot_table/blocks/sourcestone_mosaic_stairs.json -5a8e1094a4131655c1f2f83d2f0d545da41b74ef data/ars_nouveau/loot_table/blocks/sourcestone_sconce.json -f17397c3a6f7c57a5086773c548d6ca152d0739f data/ars_nouveau/loot_table/blocks/sourcestone_slab.json -065d119b33f7fb12f181b63105bd7bc40d65b079 data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks.json -4a2dbb5cc4f68b42d58c3c3da25b33f0b9cb3cbf data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks_slab.json -ecf0726adda255df3ff434ce3c33c041b04ece5f data/ars_nouveau/loot_table/blocks/sourcestone_small_bricks_stairs.json -e92ecb490985aae22297d2f5cd5bcb5e625671b7 data/ars_nouveau/loot_table/blocks/sourcestone_stairs.json -5708d7c438d48789ab5d0f00a115bdebe340215b data/ars_nouveau/loot_table/blocks/source_gem_block.json -d39e96455d731e5e4785fa923a056261b69d39ec data/ars_nouveau/loot_table/blocks/source_jar.json -b6b55b6623883d06b18729207a634fa1086abdaf data/ars_nouveau/loot_table/blocks/source_lamp.json -7cfca21047bb21713aaeec12060826e87c6cd4de data/ars_nouveau/loot_table/blocks/spell_prism.json -401055b950ac66d34a96e29f1666fd3c59244c0f data/ars_nouveau/loot_table/blocks/spell_sensor.json -2e038e8112b147e2a4d00e4a1d707541c89c421c data/ars_nouveau/loot_table/blocks/spell_turret.json -9ee66bf29aa157ad4254250a2471b6b0a8789355 data/ars_nouveau/loot_table/blocks/storage_lectern.json -9aaab2a4ead128014c2d59c87df70099a1df6a91 data/ars_nouveau/loot_table/blocks/stripped_blue_archwood_log.json -2f2e910c3358aaba61f6659bab3be24a8482ea93 data/ars_nouveau/loot_table/blocks/stripped_blue_archwood_wood.json -7845d4cd003da6b676c6a2567dc373aa1d2d7a8c data/ars_nouveau/loot_table/blocks/stripped_green_archwood_log.json -414eec71ea3a2f3d11a1ce6797bb1046afc119c3 data/ars_nouveau/loot_table/blocks/stripped_green_archwood_wood.json -508f43a5d8e9edc0df1895c3216b376d6ef3f6a7 data/ars_nouveau/loot_table/blocks/stripped_purple_archwood_log.json -000970bcb030af1b0966cf449b20d1c1934d8371 data/ars_nouveau/loot_table/blocks/stripped_purple_archwood_wood.json -7397be3ff36dd3a4199274affac7d79813d5c3b6 data/ars_nouveau/loot_table/blocks/stripped_red_archwood_log.json -4fdf99a777c15036d627f12d5ffe68e8fe74dbb3 data/ars_nouveau/loot_table/blocks/stripped_red_archwood_wood.json -5aff8275565145ae0e02d748a9076f36362ce067 data/ars_nouveau/loot_table/blocks/timer_spell_turret.json -8f418cce50e6d4c09d2a9c0e190b56ef41628010 data/ars_nouveau/loot_table/blocks/vitalic_sourcelink.json -9961fbe0d98b899ed331c4b52c8be082764fe178 data/ars_nouveau/loot_table/blocks/void_prism.json -b7c7dfedc82b75fad6c44b41b53664b086f17e20 data/ars_nouveau/loot_table/blocks/volcanic_sourcelink.json -5a7f8da8da17f592fe60568b87cba566dbfa6105 data/ars_nouveau/loot_table/blocks/wixie_cauldron.json -6a4107b990568ff31b9c3251ac2d03330dff96d7 data/ars_nouveau/loot_table/blocks/yellow_sbed.json -8acf67783a1a936e05e1c351380da320c575ff32 data/ars_nouveau/loot_table/entities/wilden_guardian.json -93f3c19d89891b175b026838172e8b1d240e42db data/ars_nouveau/loot_table/entities/wilden_hunter.json -11298f214fe5e17eb24190b6843c11848050116b data/ars_nouveau/loot_table/entities/wilden_stalker.json diff --git a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e b/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e deleted file mode 100644 index 445cab1e23..0000000000 --- a/src/generated/resources/.cache/5bcee44b915b4e0fcf0f5d8d83123c25b2271d3e +++ /dev/null @@ -1,2 +0,0 @@ -// 1.21.1 2024-12-15T12:57:56.5568465 Languages: en_us for mod: ars_nouveau -fcac50dc53a13bbb9b67f62e08e26c5e7ff52f47 assets/ars_nouveau/lang/en_us.json diff --git a/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 b/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 deleted file mode 100644 index b6ef7d04b4..0000000000 --- a/src/generated/resources/.cache/5c9e5647706b386caccf0aef27efaa68965030b8 +++ /dev/null @@ -1,65 +0,0 @@ -// 1.21.1 2024-10-19T10:39:38.2477422 Tags for minecraft:item mod id ars_nouveau -bde6ca31173d1f22d5f6fe355dc90c9faa35b239 data/ars_nouveau/tags/item/golem/shard.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/item/interact_jar_blacklist.json -a0800fbffa0e00aecb2e86a1e991d42904427191 data/ars_nouveau/tags/item/magic_food.json -779589c2173e840c19bb1975f746a3e6a407e968 data/ars_nouveau/tags/item/magic_shards.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/item/ritual_loot_blacklist.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/item/ritual_trade_blacklist.json -2bea9b95ffd91ffd3ad204aab2644fae06731943 data/ars_nouveau/tags/item/shady_wizard_fruits.json -f5e3f6895ab28e98f84db162bb5a7ec0d8484aae data/ars_nouveau/tags/item/summon_bed.json -9df18c2be6a7eba8d9ffaea4af55c89cf07a8674 data/ars_nouveau/tags/item/whirlisprig/denied_drop.json -efd77219e54deb73b590435b014edcbb9c0f5ee1 data/ars_nouveau/tags/item/wilden_drop.json -aa16961d2b945c22363c452b360f56d9b4b01e32 data/c/tags/item/armors.json -2f9b7e099208b0e404e0f81c89f2a368e5d909da data/c/tags/item/chests.json -2f9b7e099208b0e404e0f81c89f2a368e5d909da data/c/tags/item/chests/wooden.json -d975e125845630962d46be3215fd2bf3c557e5dc data/c/tags/item/crops.json -87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/c/tags/item/fences.json -87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/c/tags/item/fences/wooden.json -0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/c/tags/item/fence_gates.json -0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/c/tags/item/fence_gates/wooden.json -37ff325e2c724ad60fc99b6770ec7cfe48f1101d data/c/tags/item/foods.json -f36268e9375442e51cbf98f2c4d573082aa56378 data/c/tags/item/foods/berry.json -79c704885f8d5df4cd8bf9c7b063f6bddee0b7ad data/c/tags/item/foods/fruit.json -f36268e9375442e51cbf98f2c4d573082aa56378 data/c/tags/item/fruits/berry.json -0fab28203f8c9e1daa9c635ecb6c026ba0be0ba1 data/c/tags/item/gems.json -0fab28203f8c9e1daa9c635ecb6c026ba0be0ba1 data/c/tags/item/gems/source.json -f8f647d2f880955435d323e3c61b7d789d06d59c data/c/tags/item/logs/archwood.json -a350e3112294fc7f7f26561673046c76017f3198 data/c/tags/item/music_discs.json -f898aac12b01b598949701b1f6e45aa0cd1d9a25 data/c/tags/item/planks/archwood.json -3737e6b65e87993bd971b233c3aca5088721eb32 data/c/tags/item/seeds.json -6febc815f11d70abf442be0be941a9132ddd072d data/c/tags/item/storage_blocks.json -fbb0fe25e25b7fd86df64c2f168425efedf11710 data/c/tags/item/storage_blocks/quartz.json -6febc815f11d70abf442be0be941a9132ddd072d data/c/tags/item/storage_blocks/source.json -46865d605d1c44b2ab5023e21848213c969eec08 data/c/tags/item/tools/bow.json -d856556e7a50694e4fafc11b5b85240ad831548b data/c/tags/item/tools/crossbow.json -638c18209321ba35c9243fdd8aaefda97d64292e data/c/tags/item/tools/ranged_weapon.json -877c63c507be1e55a9f5eeed6e73dfabea015dab data/c/tags/item/tools/shield.json -0fab28203f8c9e1daa9c635ecb6c026ba0be0ba1 data/minecraft/tags/item/beacon_payment_items.json -30ef7d5d3bbd42c50ac6566dce458cb5f7ee404b data/minecraft/tags/item/bookshelf_books.json -43a847dca5f71ae27537abc65fabcd8d3fdb1c72 data/minecraft/tags/item/buttons.json -debde73c045884d2f3335478b8e70e443135fe48 data/minecraft/tags/item/chest_armor.json -a01909919207615cda1bb44f33db287efa02333b data/minecraft/tags/item/doors.json -46865d605d1c44b2ab5023e21848213c969eec08 data/minecraft/tags/item/enchantable/bow.json -d856556e7a50694e4fafc11b5b85240ad831548b data/minecraft/tags/item/enchantable/crossbow.json -877c63c507be1e55a9f5eeed6e73dfabea015dab data/minecraft/tags/item/enchantable/durability.json -87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/minecraft/tags/item/fences.json -c417d25dbf09fa35316563dab44086ea9c57398f data/minecraft/tags/item/foot_armor.json -b11f943ffa45a788b39c9d51e5bd83e321044249 data/minecraft/tags/item/head_armor.json -248bbddd99634aced7fd4adc84b0290de05f4a0a data/minecraft/tags/item/leaves.json -30ef7d5d3bbd42c50ac6566dce458cb5f7ee404b data/minecraft/tags/item/lectern_books.json -4106122c7c1fbe11b433269a6ae8ce58fe1926d5 data/minecraft/tags/item/leg_armor.json -f8f647d2f880955435d323e3c61b7d789d06d59c data/minecraft/tags/item/logs.json -f8f647d2f880955435d323e3c61b7d789d06d59c data/minecraft/tags/item/logs_that_burn.json -f898aac12b01b598949701b1f6e45aa0cd1d9a25 data/minecraft/tags/item/planks.json -ce9ccf92ade8cd330c990516ee0f8a30c35adea9 data/minecraft/tags/item/saplings.json -70afef6fe4926a8dbf1205248dc1371974ef3037 data/minecraft/tags/item/slabs.json -e5d97b748b59672ba4baec9c3f1093370adf0332 data/minecraft/tags/item/stairs.json -c4a5a335ee7bb70e73214b86cb2889caeaf5be79 data/minecraft/tags/item/swords.json -23fc13405d4dc43512deb39ee5bbbb73da177166 data/minecraft/tags/item/trapdoors.json -43a847dca5f71ae27537abc65fabcd8d3fdb1c72 data/minecraft/tags/item/wooden_buttons.json -a01909919207615cda1bb44f33db287efa02333b data/minecraft/tags/item/wooden_doors.json -87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/minecraft/tags/item/wooden_fences.json -7df208f0e5454cd8762173c46b867bf524fb1f7d data/minecraft/tags/item/wooden_pressure_plates.json -70afef6fe4926a8dbf1205248dc1371974ef3037 data/minecraft/tags/item/wooden_slabs.json -e5d97b748b59672ba4baec9c3f1093370adf0332 data/minecraft/tags/item/wooden_stairs.json -23fc13405d4dc43512deb39ee5bbbb73da177166 data/minecraft/tags/item/wooden_trapdoors.json diff --git a/src/generated/resources/.cache/73a0c150702b0db33c4f7a4031c7885e3223a862 b/src/generated/resources/.cache/73a0c150702b0db33c4f7a4031c7885e3223a862 deleted file mode 100644 index 103af981fc..0000000000 --- a/src/generated/resources/.cache/73a0c150702b0db33c4f7a4031c7885e3223a862 +++ /dev/null @@ -1,4 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.1783109 Tags for minecraft:mob_effect mod id ars_nouveau -08d652bf70406a53ea8f4c794d20f054284765b9 data/ars_nouveau/tags/mob_effect/deny_dispel.json -84bb5fad029e44f32f49e09611492a3f0cede482 data/ars_nouveau/tags/mob_effect/to_sync.json -0315b9264874191953c091e06cf2d340f81d6d67 data/ars_nouveau/tags/mob_effect/unstable_gifts.json diff --git a/src/generated/resources/.cache/7b0970ef111b287b053eb2a386d0fca6ee5aa291 b/src/generated/resources/.cache/7b0970ef111b287b053eb2a386d0fca6ee5aa291 deleted file mode 100644 index 245a74571a..0000000000 --- a/src/generated/resources/.cache/7b0970ef111b287b053eb2a386d0fca6ee5aa291 +++ /dev/null @@ -1,3 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.17178 Tags for minecraft:worldgen/placed_feature mod id ars_nouveau -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/worldgen/placed_feature/archwood_trees.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/worldgen/placed_feature/source_berries.json diff --git a/src/generated/resources/.cache/8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 b/src/generated/resources/.cache/8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 deleted file mode 100644 index 0025cd0e89..0000000000 --- a/src/generated/resources/.cache/8b3db1e27f2abe56f6016cbf2b3caa59e9d0ff55 +++ /dev/null @@ -1,6 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.1951343 Grab bag Datagen -9f12aa688a076e34ed4b457c7fe492205a824d83 data/ars_nouveau/recipe/apprentice_book_upgrade.json -98ef162dd5449b8a1e3b5f9a98cf46852e4d2da3 data/ars_nouveau/recipe/archmage_book_upgrade.json -09fbe1cf323f738d045cfc231fc12a311ab62325 data/ars_nouveau/recipe/fill_potion_flask_0.json -d025f6ba019ba625c109a69e2ca55ae5665222aa data/ars_nouveau/recipe/fill_potion_flask_1.json -edfa9b51fb03808e57d280092c71f8cb95cd4518 data/ars_nouveau/recipe/fill_potion_flask_2.json diff --git a/src/generated/resources/.cache/95c82c0d51fb7266bfeb5f2d122be5f9b82ff056 b/src/generated/resources/.cache/95c82c0d51fb7266bfeb5f2d122be5f9b82ff056 deleted file mode 100644 index 40bab15ddc..0000000000 --- a/src/generated/resources/.cache/95c82c0d51fb7266bfeb5f2d122be5f9b82ff056 +++ /dev/null @@ -1,2 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.1916083 Tags for minecraft:worldgen/structure mod id ars_nouveau -eedfc051e19e8fe8ea38287245711becdf5d7ba7 data/ars_nouveau/tags/worldgen/structure/wilden_den.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e deleted file mode 100644 index 666f5dd842..0000000000 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ /dev/null @@ -1,581 +0,0 @@ -// 1.21.1 2024-11-30T10:36:09.6049088 Recipes -a76e5d9eef406841f56740535ec2afdd509de507 data/ars_nouveau/advancement/recipes/building_blocks/archwood_button.json -443515bb80018fbe37a128cb6849f5e818be315d data/ars_nouveau/advancement/recipes/building_blocks/archwood_door.json -4dfc3afae271aae8423d20dedb67dc601ff71fa0 data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence.json -555bfa84b8d917ca5638f2d0dc23108870a9bc7b data/ars_nouveau/advancement/recipes/building_blocks/archwood_fence_gate.json -def127a7c0f29fad76cdaf9b743e36ef45328afe data/ars_nouveau/advancement/recipes/building_blocks/archwood_pressure_plate.json -2a416ecd7c9492d109f8dafb77314b51ea1ded48 data/ars_nouveau/advancement/recipes/building_blocks/archwood_slab.json -acae2362e9f3cd7a9935b9212b0ab3c8d0eef4b0 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_alternating_slab.json -f622578994052016b073f7aa8e80e9e98b39e7be data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_alternating_stonecutter_stair.json -9afdd42458a184c5761f459ed9780000b8203ed0 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_alternating_stone_cutterslab.json -078674526af2c5edf85d86d01059c2c8c895d18c data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_basketweave_slab.json -0089d7cd0b7f7210b0724e7956efdbd2c978b695 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_basketweave_stonecutter_stair.json -ef2363a53b3a5ca6b42d1b9ec48913e8a0057aba data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_basketweave_stone_cutterslab.json -d650ef0c4aa6837af4b3bee3c8661411ec1fa6e7 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_large_bricks_slab.json -7a7f51a16d4ee55cbdf9b1401c6ed2f5b446b239 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_large_bricks_stonecutter_stair.json -1050f3b7be67aeefaf50aaaa092af4fe5ffdfd44 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_large_bricks_stone_cutterslab.json -f833f91bb48646b21e69692fb205678de6d22a2e data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_mosaic_slab.json -2ab749ad52394319df6600d750a482fc68c1e767 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_mosaic_stonecutter_stair.json -efa780b453dcff5ec504342f3abacdfbf03ecbab data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_mosaic_stone_cutterslab.json -dc20aa018cf8af561123260fdaa5ba9c02cdd82d data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_small_bricks_slab.json -3a187cea09031d8a7d75efad0fb5963bfebe02c4 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_small_bricks_stonecutter_stair.json -721fb0c7512c13e39ee0c66412646b8b69517d16 data/ars_nouveau/advancement/recipes/building_blocks/gilded_sourcestone_small_bricks_stone_cutterslab.json -236bb8bd26f6fd83715c747e389df29a2367cd38 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_alternating_slab.json -16eea23e43b517a9a3015fb8520fe1e5e5ed9ee1 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stonecutter_stair.json -ff32ff93931cc54a01a3dd47a021d4af47d6acc3 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_alternating_stone_cutterslab.json -ddebb03f58448735210895ff13c5c1762c9a112c data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_slab.json -6a6eac4de0111e461fd5c3005e02e848fead529f data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json -af930a48344ba532c7a69cf15634e13458a826ec data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json -f1cb018ad70a83b05186e4d4822074cc975f06a1 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_slab.json -ed97fbda1c2262195ac3313c6e1aaa71918dbace data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json -5892375df57cc93c25283121e23dc65a627abadd data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json -6594e9eafd49193aee6d2cb9fa481ac7a80704d3 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_slab.json -a8c6d0d203453b90a20383fa92155a9b40827974 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json -a69d99414109b9d806ea4d084e13ef58294fec60 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json -9e920332e1c8ca217c15cd7a2e5fc785cfd71bb5 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_slab.json -a7bb35e3c2ffd1c3875d49588bc62181fee818b0 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json -960674ea166c33a4725a3c79993f8a49c6c01598 data/ars_nouveau/advancement/recipes/building_blocks/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json -e40138c4c84ea03c321debb52d5fdbeac59dd58d data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_alternating_slab.json -1775d41f83e81773725c4e060f44f19db61229ed data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_alternating_stonecutter_stair.json -545494407451ce5e534116aa047979ab79f9ee02 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_alternating_stone_cutterslab.json -f598288c789715f023c80c320a536fe7cb3283af data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_basketweave_slab.json -0ced393f47eb27c7a310d40a018b673be87b4b39 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_basketweave_stonecutter_stair.json -75d37aa86bb76534fca38428eed5ec5ac51b8778 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_basketweave_stone_cutterslab.json -2b5e688501f86d0d08c48ede453bd60e628dfd65 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_large_bricks_slab.json -0dd7fb8eafa45f1889540fa7459dcdd161a525ee data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_large_bricks_stonecutter_stair.json -623cf69535c7681b51b623c924ed38fcc4164a97 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_large_bricks_stone_cutterslab.json -14a5c7b3f502f4074d4af0ffe02907e463bd2ede data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_mosaic_slab.json -6f170e79b34a0f66c0cf7c3ff31fe7c6d2b7cd2d data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_mosaic_stonecutter_stair.json -1c6dbfffbb46fd90b889fb2f9b23f8d3b4c4d5cb data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_mosaic_stone_cutterslab.json -46e3735a1c31c396a9306dbfd48911387a40e740 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_slab.json -f822ea7d8ee0625be3ceb049f083939bbb2571d9 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_small_bricks_slab.json -9e944db43d890264df8bddacb306c6117e027b60 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_small_bricks_stonecutter_stair.json -ac4885ad10139b4019d931a904ca7726c292882e data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_small_bricks_stone_cutterslab.json -78dc0d1b15d6ce7b550ef61be56ba2ab0c0e84f7 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_stonecutter_stair.json -911edbee487fc32a143650648430faeb6b10c818 data/ars_nouveau/advancement/recipes/building_blocks/smooth_sourcestone_stone_cutterslab.json -1a48420aa9cd65137f3f339d46fba6aecc97a153 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_alternating_slab.json -5900b60ebd7e23a69b9b9b3e6cfb43d54c0de6a3 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_alternating_stonecutter_stair.json -e75f405d103a49e0390f020dcc8bd12dca01a77a data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_alternating_stone_cutterslab.json -ff4325d9957220595f9d9a0b1b0f2112f8db373e data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_basketweave_slab.json -31f5b6aaaa27aefe59594352b9e9818f054e5400 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_basketweave_stonecutter_stair.json -30dd9aa4e573a42b45a61c1d71aab0b094c89c76 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_basketweave_stone_cutterslab.json -c964d23995e4621aa26de3c579f193d96d18beb2 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_large_bricks_slab.json -472bf065e4180a91215633ee45954b79c71e5930 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_large_bricks_stonecutter_stair.json -4cd5bb29ca543cf6784beb5b51e527c307d23811 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_large_bricks_stone_cutterslab.json -1c36285d9b015cd3bed1e797f58dad8ab6fc6d69 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_mosaic_slab.json -0e9005aa01b1f981869f3f0898a7cde54e1562fd data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_mosaic_stonecutter_stair.json -58a72ea39e76cb7996cecfd9b76f4d9d792b9b62 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_mosaic_stone_cutterslab.json -b02dbe5c8976cb25f4beb11a85c01fb677d97d55 data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_small_bricks_slab.json -f27a3b46b1aa7331a4eee2e7cbb351f7b4194bdd data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_small_bricks_stonecutter_stair.json -b3d4856ab21f3709c7bd375b55d5a5ad7bd9b6cd data/ars_nouveau/advancement/recipes/building_blocks/sourcestone_small_bricks_stone_cutterslab.json -a028196e811c34f73ae9345be697b90244bde7af data/ars_nouveau/advancement/recipes/building_blocks/stripped_blue_archwood_wood.json -ae1cbf18f4372832fce1954024bf06642754fabe data/ars_nouveau/advancement/recipes/building_blocks/stripped_green_archwood_wood.json -3c24b90a75b046dfe7fb5d48e0db151ff492cbc9 data/ars_nouveau/advancement/recipes/building_blocks/stripped_purple_archwood_wood.json -9504299723911a9c0961b0f63c3a5cc7c49e6db0 data/ars_nouveau/advancement/recipes/building_blocks/stripped_red_archwood_wood.json -0bfb5848184aedfd2de89f2a7ce59eccbed3acb6 data/ars_nouveau/advancement/recipes/decorations/sourcestone_1.json -217cbcd7ec0889c2ed3879a5ad33ec5399bf3a5f data/ars_nouveau/advancement/recipes/decorations/sourcestone_10.json -fd3820b9df1ee0f44fda86f125ed34e410eb254e data/ars_nouveau/advancement/recipes/decorations/sourcestone_11.json -83a99f5b2ab8b347be80539551ffd99231189607 data/ars_nouveau/advancement/recipes/decorations/sourcestone_12.json -c361fd29bbb99f506ca12170021e9c38cd122554 data/ars_nouveau/advancement/recipes/decorations/sourcestone_13.json -2eb23bb53b36c2b3a54fee9b81f8079d604aa1c7 data/ars_nouveau/advancement/recipes/decorations/sourcestone_14.json -f947482197d70818fa29c9f4b3946cd39a0ff9e9 data/ars_nouveau/advancement/recipes/decorations/sourcestone_15.json -d953a2a42d765ee356f49362a86893c87c3645f5 data/ars_nouveau/advancement/recipes/decorations/sourcestone_16.json -813ce753869a767b0efbad254379c042f05b73e4 data/ars_nouveau/advancement/recipes/decorations/sourcestone_17.json -4df57f064fddb9dde116c51834fb182657649bfc data/ars_nouveau/advancement/recipes/decorations/sourcestone_18.json -9455b7cb4022b55b4d0f91b461584f5cd356b7e2 data/ars_nouveau/advancement/recipes/decorations/sourcestone_19.json -fcaead1d634ab9537bf157e7f5b2af1659e974cf data/ars_nouveau/advancement/recipes/decorations/sourcestone_2.json -5724f06e4412c74414637c9862173a77e6f3f208 data/ars_nouveau/advancement/recipes/decorations/sourcestone_20.json -a086407503fea0af68f8fd71820df368a0db4bf0 data/ars_nouveau/advancement/recipes/decorations/sourcestone_21.json -c21aa876357f5281b61f927bb3f292dc724a1518 data/ars_nouveau/advancement/recipes/decorations/sourcestone_3.json -1cda35e2d1d5eb50287d60c2d6d3a42d94cba36a data/ars_nouveau/advancement/recipes/decorations/sourcestone_4.json -74d4c1acd7dafa408a02f477bdf0d14371bc0738 data/ars_nouveau/advancement/recipes/decorations/sourcestone_5.json -bd6327a7a111128918f5fe8becca698c82bc4bfc data/ars_nouveau/advancement/recipes/decorations/sourcestone_6.json -06e5e009f02c83478cde570b296020f0736c438d data/ars_nouveau/advancement/recipes/decorations/sourcestone_7.json -33c52bd0c40a146e5b469e83bc95f141154be813 data/ars_nouveau/advancement/recipes/decorations/sourcestone_8.json -77faa19b8deb8942a14cb2e9e4b59167e12627cf data/ars_nouveau/advancement/recipes/decorations/sourcestone_9.json -dff19d1f78f12c4a744c10d8641c118dfa423cd8 data/ars_nouveau/advancement/recipes/misc/agronomic_sourcelink.json -39b1a153bd894af852d6c6da19e8f7fe712c9a8a data/ars_nouveau/advancement/recipes/misc/air_essence_to_snow_bucket.json -9d503500b088e272cbf6142cf62850efa0412288 data/ars_nouveau/advancement/recipes/misc/alchemical_sourcelink.json -ff5ad5968ba408751617333eed8b010958504587 data/ars_nouveau/advancement/recipes/misc/allow_scroll.json -15bb5ae5bd54f2c65512f5fc3834703844d96b04 data/ars_nouveau/advancement/recipes/misc/alteration_table.json -f2dff2e9a6bfcc46831335dca3e7c9aab16d78a4 data/ars_nouveau/advancement/recipes/misc/annotated_codex.json -59bc41df7fdc4ce872c6b3fc91d9c45ffb74aad6 data/ars_nouveau/advancement/recipes/misc/arcane_core.json -41dffa0b4b8ae8d44847841f35db31dfbdb76109 data/ars_nouveau/advancement/recipes/misc/arcane_pedestal.json -ac40320cca59dd0638b1b193d7914451f4f28039 data/ars_nouveau/advancement/recipes/misc/arcane_platform.json -184781612584160baf8103c9a056d7e4d9aece94 data/ars_nouveau/advancement/recipes/misc/archwood_chest.json -971d0c50e4a395391c1115a8fd96576ad89d6a10 data/ars_nouveau/advancement/recipes/misc/archwood_grate.json -8dbda63b9ccfeb5a9c92fdbe1200231e4e52eea2 data/ars_nouveau/advancement/recipes/misc/archwood_planks.json -2e416567343ab261eabe13203acd032ac550a3d0 data/ars_nouveau/advancement/recipes/misc/archwood_sconce.json -7a498e23b2bf3ee47abec88a833f894747134258 data/ars_nouveau/advancement/recipes/misc/archwood_stairs.json -a904ce4aeb217411f81762754850ee3dc6f8178b data/ars_nouveau/advancement/recipes/misc/archwood_to_chest.json -fe2d63b2c1ab989576d865de606e933041d432c9 data/ars_nouveau/advancement/recipes/misc/archwood_trapdoor.json -4188bbc9ea2e3daacc75e5522090d2e104ce125f data/ars_nouveau/advancement/recipes/misc/basic_spell_turret.json -88b3efa21297b86c0ea30d671c747f788db9ca19 data/ars_nouveau/advancement/recipes/misc/blank_parchment.json -2e3971fe417ffe9c3cc9f129f1958e8a9c7d1179 data/ars_nouveau/advancement/recipes/misc/blank_thread.json -1a7b11ebce4db493ec50cf75cba887031da1f10f data/ars_nouveau/advancement/recipes/misc/blue_archwood_wood.json -93e1fcf252f3070b7f8177b7bc53a40afef1b50a data/ars_nouveau/advancement/recipes/misc/blue_sbed.json -322033a1b280739bdbdb1727bcff7a062543f295 data/ars_nouveau/advancement/recipes/misc/challenge_2.json -60fb2d89f6829a85a743f7fb5e8164af8f3576b2 data/ars_nouveau/advancement/recipes/misc/clear_alakarkinos_charm.json -7da8bc295360a5593768f48cb28969e176ed9c26 data/ars_nouveau/advancement/recipes/misc/clear_allow.json -022bff3d3d654bc750717eb077eb7c9892df113f data/ars_nouveau/advancement/recipes/misc/clear_amethyst_golem_charm.json -b9f2fd2eb9477dd48886b165440a918350727c65 data/ars_nouveau/advancement/recipes/misc/clear_bookwyrm_charm.json -bd84245ddb990572c5b7c28344abbef91b6afffd data/ars_nouveau/advancement/recipes/misc/clear_deny.json -5a3d3f96e18e805b669bd8ff79668f4220b80132 data/ars_nouveau/advancement/recipes/misc/clear_drygmy_charm.json -549f8b6de89b380ff2c270c7b80319196afa0d45 data/ars_nouveau/advancement/recipes/misc/clear_starbuncle_charm.json -0aa677aa592a9c5b55085d2a19fbbe7efac8ddc8 data/ars_nouveau/advancement/recipes/misc/clear_starbuncle_shard.json -85f73c390801eb059a22b5a1865390dd98950eb8 data/ars_nouveau/advancement/recipes/misc/clear_whirlisprig_charm.json -60a32504ac4e3f07856443863abd295eaab31613 data/ars_nouveau/advancement/recipes/misc/clear_wixie_charm.json -3b9109fa6d74c9ea53ec1c988f11d63b82b158c8 data/ars_nouveau/advancement/recipes/misc/conjuration_essence_to_end_stone.json -51662ebf31064f23ee492a65c57354e3f379b3b2 data/ars_nouveau/advancement/recipes/misc/conjuration_essence_to_soul_sand.json -aeb58692a9a5d2ae343fb99c63c6e5b4face1165 data/ars_nouveau/advancement/recipes/misc/deny_scroll.json -ce68133533f50f14cb4e0aeb02bd95394eac1ee5 data/ars_nouveau/advancement/recipes/misc/dowsing_rod.json -ed76c3b2b1ae1548374d4b69476df1cf5f8e6c6f data/ars_nouveau/advancement/recipes/misc/dull_trinket.json -c029261ba3b02679f2c85b220bd57417a060f246 data/ars_nouveau/advancement/recipes/misc/enchanting_apparatus.json -cf5734766cf8f986445f4fb5120b2055083868ba data/ars_nouveau/advancement/recipes/misc/experience_gem.json -6e9008bf44e6ffa8e88a68e5990bd18d155708d3 data/ars_nouveau/advancement/recipes/misc/falseweave.json -af6da5b189736af8b7ce4a6ad9705a20dc95a7b8 data/ars_nouveau/advancement/recipes/misc/fire_essence_to_charge.json -2d4c590e01929f845a708fd67e6b7062ca4bebf0 data/ars_nouveau/advancement/recipes/misc/fire_essence_to_magma_block.json -e5e55d984db9ed44d27d9f12395375b9b1e22c77 data/ars_nouveau/advancement/recipes/misc/ghostweave.json -20fd074b90697747ac8740a3f13aa5b02c1fd2e6 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_alternating_stairs.json -43ed4e25b959439bff96f0a49cd1e4e40849c6f3 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_alternating_to_sourcestone.json -e1164262fe3158d03e9294ed0e850ec2299c1f1f data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_basketweave_stairs.json -12c4f697a4fbdc62c181f051ec0d6313f38f8330 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_basketweave_to_sourcestone.json -fbf73c4a98c3e43cdd895f124f4753748167f253 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_large_bricks_stairs.json -ba1b8a4c0e97363afc109a4be7effea8022519d1 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_large_bricks_to_sourcestone.json -692f74b3cbe8b2a26c2cfdf4b1c47048dc4bebd0 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_mosaic_stairs.json -1f6485887ec84595cc337327b67521363dccafd5 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_mosaic_to_sourcestone.json -0d86f240a2082b164a10e625ce962797a48278cb data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_small_bricks_stairs.json -21a1edbc70d25bc82e638a9836727b1ba960d471 data/ars_nouveau/advancement/recipes/misc/gilded_sourcestone_small_bricks_to_sourcestone.json -a4db3dfa291c9a22a82aaa409e747cd6e0399065 data/ars_nouveau/advancement/recipes/misc/gold_grate.json -fb08def3440513871b80cc47607bd9c5f7f645e8 data/ars_nouveau/advancement/recipes/misc/greater_experience_gem.json -0c3e6e5c6de7eab2f5b766f1780384132ed3ae16 data/ars_nouveau/advancement/recipes/misc/green_archwood_wood.json -165804892abcc34d9c826c841312e896362c9d7f data/ars_nouveau/advancement/recipes/misc/green_sbed.json -583682c3debd35d4ccf520ea0c42e9958082aab1 data/ars_nouveau/advancement/recipes/misc/horn_to_bonemeal.json -b298653b4c8246d9f54e6a625b671e7e6555dfba data/ars_nouveau/advancement/recipes/misc/imbuement_chamber.json -984b6dbb7e4cee65805d9fb7d0af59cac8007bc4 data/ars_nouveau/advancement/recipes/misc/item_detector.json -3cca43487ce3210de82f148837fa2e28809e9f11 data/ars_nouveau/advancement/recipes/misc/magebloom_block.json -c55767bb1ffcbfda3df3d07a9f62b5d13c137b49 data/ars_nouveau/advancement/recipes/misc/magebloom_block_to_magebloom.json -4e8d24e618c749de6bf4954d92eb5a0311528f64 data/ars_nouveau/advancement/recipes/misc/magebloom_fiber.json -d4e9027c9656ecb4974bfe8bc93a179e8975aa31 data/ars_nouveau/advancement/recipes/misc/magebloom_to_pink.json -cb993034dd83cf99abbcccb2365f18809f886768 data/ars_nouveau/advancement/recipes/misc/magelight_torch.json -9e315dede142b1d4fb61d0f5c4b289ad74bd378c data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_andesite.json -bdd327175bdbf17ff207d9bb8ab410d8194a0413 data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_blazin_sapling.json -ed79f8d415273a281bc1326ce41197f0dd125802 data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_calcite.json -d752f09cf359a1abd87d6ee030ba35d1c6d79018 data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_cascading_sapling.json -d3a7dc16eeb8685b7d8dafe881d6a392ef51de94 data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_deepslate.json -4d38c26b159df5c4c2c3dc59d5c35ede4fadc320 data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_diorite.json -769520d0389fc2674af93c23f431f1401f251df8 data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_flourishing_sapling.json -aa56c9db3a48ca9494abb404c6762f859f3a72ed data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_granite.json -8838e4822ebfbb59f6ad6b5e09eda9f7814cce1f data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_grass_block.json -7e7b64d8a57cf495af3b7f7448f45dd78d3897b6 data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_moss_block.json -d912575a1c027c166dbb79bc21fe0a0d83f74a13 data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_mycelium.json -281be0bb3b58787889e6f90546b398c93c82ed0d data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_tuff.json -2455dde539f665d6af904b2625f29026c46ee08c data/ars_nouveau/advancement/recipes/misc/manipulation_essence_to_vexing_sapling.json -f6f9ce0e87bc1e86a77a14e0d733955e615c5b31 data/ars_nouveau/advancement/recipes/misc/mimic_scroll.json -50e8dc4fb0c1c59c6d6915514a81d435a12d7c9c data/ars_nouveau/advancement/recipes/misc/mirrorweave.json -5ffb4999e39135815ed73f3e1b03fdcbd9a70028 data/ars_nouveau/advancement/recipes/misc/mob_jar.json -ebc4ca30ff3290926a30485b72ab6c4a7a288bbf data/ars_nouveau/advancement/recipes/misc/moonfall_2.json -1b554c4e460b09ab8dfa3fbe86d54d25deb34f39 data/ars_nouveau/advancement/recipes/misc/mundane_belt.json -fcbdea7a47c81d7b81d78dc923da2b6e8f053c62 data/ars_nouveau/advancement/recipes/misc/mycelial_sourcelink.json -c991770cb9c5b745fda1da97825a5a146ff4547b data/ars_nouveau/advancement/recipes/misc/novice_spell_book.json -8b0d8a29fda79d30b45a74888be2a59e6a78f6f4 data/ars_nouveau/advancement/recipes/misc/orange_sbed.json -4359acbc033050e0ed9799a3bfd98b885b3a9cf5 data/ars_nouveau/advancement/recipes/misc/platform_to_pedestal.json -0e66cca3efe59a05c6bdabe7b4402b6eeabb95a4 data/ars_nouveau/advancement/recipes/misc/polished_sconce.json -c7de7a1254dac01e3fb7489ea3b4bc99489b3b02 data/ars_nouveau/advancement/recipes/misc/polished_source_sconce.json -1067cdecf290cb72fc49d7cc335f1ac1d2df23ff data/ars_nouveau/advancement/recipes/misc/potion_jar.json -704e2ff8179f368d1f281beb28517186f944d2e5 data/ars_nouveau/advancement/recipes/misc/potion_jar_empty.json -1c40654d6e633350cb0b63bb6fa22d592640292c data/ars_nouveau/advancement/recipes/misc/purple_archwood_wood.json -418fbce7fb5bbccda8c8c552efa0191f0a324892 data/ars_nouveau/advancement/recipes/misc/purple_sbed.json -4da9eef356a8e78fbc35c6d64e12fc70cd2a2a2c data/ars_nouveau/advancement/recipes/misc/redstone_relay.json -bb32cde2de07df7f88b2ebc92986f1d4b3c14679 data/ars_nouveau/advancement/recipes/misc/red_archwood_wood.json -69f6e2bab56586ac49f320eeb09ba6d0c60c8ad3 data/ars_nouveau/advancement/recipes/misc/red_sbed.json -f230680eb5c4b413a6dab4982a27632136878308 data/ars_nouveau/advancement/recipes/misc/relay.json -96008186e68872c56e524c819bdd1d8b6a98657c data/ars_nouveau/advancement/recipes/misc/repository.json -f1fd2db5b3d12da41f0453b5473b8009b1451d1e data/ars_nouveau/advancement/recipes/misc/reset_stable_warp_scroll.json -d6646d684d97610b9de0796456f8ccc8785fb86d data/ars_nouveau/advancement/recipes/misc/reset_warp_scroll.json -6e07b1ac1089cb77c8d52e4b7eb51f382077bfa0 data/ars_nouveau/advancement/recipes/misc/ring_of_potential.json -93d0f7b6a18a85830f2bdd9bc18e6f25de6fbb23 data/ars_nouveau/advancement/recipes/misc/ritual_animal_summon.json -516c48e6f05c4a8863569d4b5d5d5cd237eef50f data/ars_nouveau/advancement/recipes/misc/ritual_awakening.json -b66daf9b8628197182eb657259add2219e327804 data/ars_nouveau/advancement/recipes/misc/ritual_binding.json -d6c64ae7cba1a4428f6fb6eb5725d70429aac28e data/ars_nouveau/advancement/recipes/misc/ritual_brazier.json -d585a28f9ec5c80c860a880da646a0e1cbd29891 data/ars_nouveau/advancement/recipes/misc/ritual_burrowing.json -3e00274831e0ee9b276e6296042f9058f7a19dba data/ars_nouveau/advancement/recipes/misc/ritual_challenge.json -a169a28459ed5cfb77c9423c2be75020fde5d075 data/ars_nouveau/advancement/recipes/misc/ritual_cloudshaping.json -6a9a6cb103cc5f382c698e02f6ee8f8bc55b39ba data/ars_nouveau/advancement/recipes/misc/ritual_conjure_island_desert.json -9c8e75ad389473120dd72ee1dc6fbbb6c2806f9d data/ars_nouveau/advancement/recipes/misc/ritual_conjure_island_plains.json -035ba59353171683d8e29234b2c140f4e0317377 data/ars_nouveau/advancement/recipes/misc/ritual_containment.json -f7221bb7722eaef8a0ea30dc18f36ca2d67caa49 data/ars_nouveau/advancement/recipes/misc/ritual_disintegration.json -bf6bff7bb9e86bf02874f4791d18af7057e91385 data/ars_nouveau/advancement/recipes/misc/ritual_fertility.json -5854b1f0d7e14337a7226d1c1a2769107fa99d0c data/ars_nouveau/advancement/recipes/misc/ritual_flight.json -66772fe673c2a8728e227bb410fd436466478900 data/ars_nouveau/advancement/recipes/misc/ritual_flowering.json -13acc4426232b1b9da9bf6f63ae55111c6de2f6e data/ars_nouveau/advancement/recipes/misc/ritual_forestation.json -3cf2cc260d4ed276100dd102bca4a56356a377e5 data/ars_nouveau/advancement/recipes/misc/ritual_gravity.json -295991526f870ad8a2713f6f26b31f9d6b712121 data/ars_nouveau/advancement/recipes/misc/ritual_harvest.json -6b948f8a98f03eee270b7e12a8fa1e38843de893 data/ars_nouveau/advancement/recipes/misc/ritual_moonfall.json -a2b6d4898b584b12bea6d560d0c5fbf29149cf4c data/ars_nouveau/advancement/recipes/misc/ritual_overgrowth.json -aae376becfe697176fd3b265e4a4629b75cbd642 data/ars_nouveau/advancement/recipes/misc/ritual_restoration.json -a9a598c2eed61ffef2f156b6aec2d5ad15852950 data/ars_nouveau/advancement/recipes/misc/ritual_sanctuary.json -4f85eabfebd50f55c0352595297738c8f54343ab data/ars_nouveau/advancement/recipes/misc/ritual_scrying.json -ab4423babbbf08ed9698fa451d4041813fe98c0c data/ars_nouveau/advancement/recipes/misc/ritual_sunrise.json -006841c9d6d77511f4275f097693dfa09bd91f30 data/ars_nouveau/advancement/recipes/misc/ritual_warping.json -997e5a8a51ca710dca7fcc46c49b8e7048d9066e data/ars_nouveau/advancement/recipes/misc/ritual_wilden_summon.json -b05fbed6a0c7478199d618b3f26b4d99af9efc9c data/ars_nouveau/advancement/recipes/misc/rotating_spell_turret.json -29bd8737e113c7b1543d7e7d893317d02fc4bc19 data/ars_nouveau/advancement/recipes/misc/rotating_turret_to_basic_spell_turret.json -82b9d17d9f7811b83b7a0e0c7db19d0afb5021a6 data/ars_nouveau/advancement/recipes/misc/runic_chalk.json -fa5266c90fae3ef135d5523c457225605e3b909f data/ars_nouveau/advancement/recipes/misc/sconce.json -91d29bdec0988ec8ea94712570e65858d7de1119 data/ars_nouveau/advancement/recipes/misc/scribes_table.json -85dffb3f1ef831d06f7ec0beb6bfa976c8c561c6 data/ars_nouveau/advancement/recipes/misc/scryers_crystal.json -2c4a2972a0af633956f26482ca37fe33ccc53435 data/ars_nouveau/advancement/recipes/misc/scry_to_blank_parchment.json -b52a5e166239ed32b8b93b330b2a9e7d43789c4e data/ars_nouveau/advancement/recipes/misc/sky_block.json -442bee3c3db279f9cc988b7973cb1cb3e6102f12 data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_alternating_stairs.json -9cffa208cb7232a2c9b4ac609383037c1bb98525 data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_alternating_to_sourcestone.json -27b1490e1058520e1f1c66b0c49b6ff1bcdf3369 data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_basketweave_stairs.json -f10a0f4b647296be5469daa92e5b8b0f9c1445eb data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_basketweave_to_sourcestone.json -2e47ddcc62bb3775f955c15dd8761b306f447955 data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_large_bricks_stairs.json -28cfd90070f17ecee262dfb31e579271a9cc848c data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json -0b5730776b4dd4232da1a4183b3b924fcf7ffbae data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_mosaic_stairs.json -5f66b6d6f8490f471f6eb53b25172ae71fbd04c9 data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_mosaic_to_sourcestone.json -0def42c4240ad1b40014168a0979568f406b7c06 data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_small_bricks_stairs.json -2e649a5b6049237a770a2c331ea6e1a809778f69 data/ars_nouveau/advancement/recipes/misc/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json -3fd9990348249a9967e41cb61431d6b0882b1504 data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_alternating_stairs.json -71d5edf9dbcda39acf3bfb8a426f13b0d1cc917d data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_alternating_to_sourcestone.json -709175e4bf0c9f5f356ec5174d5aba25e3ed57af data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_basketweave_stairs.json -3b064766fc4f8eb4b694ca40d704de4fc9b4814a data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_basketweave_to_sourcestone.json -6ba7e9ee235b8cdc5285c906c161134fc657cd4c data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_grate.json -14ad843efe394c96211d275db8044cd88d23f0e5 data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_large_bricks_stairs.json -b62bdc459f398a41f2dbe6a867a1165a7994f499 data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_large_bricks_to_sourcestone.json -8fba0b290f4a0f273bd6675039dd508e1838c99b data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_mosaic_stairs.json -019380077fa997a14314970b37e51210c915ee5a data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_mosaic_to_sourcestone.json -c26106da66b9864bc72422c85c8df751d6099c13 data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_small_bricks_stairs.json -9de521bc71c61cee74f407cc30f655ad911a1294 data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_small_bricks_to_sourcestone.json -6d58de9d2b8cc3dc6c074e0dfa6c1ec1d0da084e data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_stairs.json -467fbdae986ac021853baee924d400edf9f0f792 data/ars_nouveau/advancement/recipes/misc/smooth_sourcestone_to_sourcestone.json -41943cdd43e1784d00a0352877b28d51defc0a6c data/ars_nouveau/advancement/recipes/misc/sourceberry_sack.json -7fae9d67aa96c6c2641fdf63e2a73311fe475892 data/ars_nouveau/advancement/recipes/misc/sourceberry_sack_to_bush.json -1bc1aa2668cd3af3e50bb2b894f0dd86851e4c1e data/ars_nouveau/advancement/recipes/misc/sourceberry_to_purple.json -1c6aa0f934d18de34772236a077882be418b4783 data/ars_nouveau/advancement/recipes/misc/sourcestone.json -86d6f4a3bd6e988b9bc47f916a7f44525bf192e9 data/ars_nouveau/advancement/recipes/misc/sourcestone_alternating_stairs.json -75ec5bfd504ba4cbed8cc1b0ba32997e7222cbb7 data/ars_nouveau/advancement/recipes/misc/sourcestone_alternating_to_sourcestone.json -c29a360fa70068e3c07167d5899c6242cf17029a data/ars_nouveau/advancement/recipes/misc/sourcestone_basketweave_stairs.json -4dd17377c1407da4fa499fa1495e1764fa80cda1 data/ars_nouveau/advancement/recipes/misc/sourcestone_basketweave_to_sourcestone.json -6eb159f75a1a9fcaff3e0091bb79ba552e597530 data/ars_nouveau/advancement/recipes/misc/sourcestone_grate.json -e4717f22b89d122860734599e4f440959875f975 data/ars_nouveau/advancement/recipes/misc/sourcestone_large_bricks_stairs.json -cf81a21d61397d5b78975991b9ad41e4830178d8 data/ars_nouveau/advancement/recipes/misc/sourcestone_large_bricks_to_sourcestone.json -7f258c667bd762ddd40f03d3fed4ccd1a6407d40 data/ars_nouveau/advancement/recipes/misc/sourcestone_mosaic_stairs.json -981f6183c0644eaf3e9a986010bf94a3334dfd08 data/ars_nouveau/advancement/recipes/misc/sourcestone_mosaic_to_sourcestone.json -e0c811a47839c1fd402983c4c8ef5fa9d7d2414f data/ars_nouveau/advancement/recipes/misc/sourcestone_sconce.json -0a955c1d4c0ea3bd1ec8169203a445f848dd1a07 data/ars_nouveau/advancement/recipes/misc/sourcestone_small_bricks_stairs.json -b8f2593a25b47f91e79bef34fdd258113d044436 data/ars_nouveau/advancement/recipes/misc/sourcestone_small_bricks_to_sourcestone.json -d8e07f32cadfef1920a3f261bb6e443a789dae7e data/ars_nouveau/advancement/recipes/misc/source_berry_pie.json -070781d53653203a45a20a1425177870a2b5e39b data/ars_nouveau/advancement/recipes/misc/source_berry_roll.json -d534fabcb40063e41e50a9e759915a449f618a96 data/ars_nouveau/advancement/recipes/misc/source_gem_block.json -c6c2d1f29264f7653df4c3fa7162224c0a158e21 data/ars_nouveau/advancement/recipes/misc/source_gem_block_2.json -1a6acd884f55925ba6b37be57b56e394b2e5d08b data/ars_nouveau/advancement/recipes/misc/source_jar.json -a9566c298e757c8a2ab2781b29d862b35e3bf890 data/ars_nouveau/advancement/recipes/misc/source_lamp.json -269f32221e7761b07fda58c2d1f0e4d385be01a9 data/ars_nouveau/advancement/recipes/misc/spell_prism.json -72c1ae940c65ff0d29a11b7842b288b1227d02d1 data/ars_nouveau/advancement/recipes/misc/spike_to_arrow.json -bd91063f72b718971e580b32fe3520a1f2996982 data/ars_nouveau/advancement/recipes/misc/spike_to_dye.json -18f9e176cb6e92e34a3a01bdcc1afdd8c2aedf58 data/ars_nouveau/advancement/recipes/misc/starbuncle_shades.json -95a48ec579c57b38d7d0472cd016897fdfb8f542 data/ars_nouveau/advancement/recipes/misc/sunrise_2.json -5793395abd4db53a2742a5265b5eb6fafbbfa488 data/ars_nouveau/advancement/recipes/misc/vitalic_sourcelink.json -91d18c601d25407857547b9cf0b328c78ba87caa data/ars_nouveau/advancement/recipes/misc/void_prism.json -ba6873e6404bdd17126bf015f9779f3132a61779 data/ars_nouveau/advancement/recipes/misc/volcanic_sourcelink.json -b1a4e7eedc02c3d7d84c9e5076ba4cb05c050c6c data/ars_nouveau/advancement/recipes/misc/warp_scroll.json -b29d4b79698922fff384dcb4c8cfdc4f755e66a5 data/ars_nouveau/advancement/recipes/misc/water_essence_to_bucket.json -1170f3c85b47ac82d9efddd0475237e846b51466 data/ars_nouveau/advancement/recipes/misc/water_essence_to_obsidian.json -adb956258b9aff02e0b8396cd3b1c30743c00f3b data/ars_nouveau/advancement/recipes/misc/wilden_summon_alt.json -14cec136a7a9321a31b4fc30ccdb0b92fac35723 data/ars_nouveau/advancement/recipes/misc/wing_to_leather.json -db1612c9ca686be98cf08042852b554004c20b36 data/ars_nouveau/advancement/recipes/misc/wipe_spell_parchment.json -3c94cedc091410f9753fafd28c68c70e065e43d2 data/ars_nouveau/advancement/recipes/misc/wixie_hat.json -f5d0e8bf6c31595b6a37dc127d98a90a542353ca data/ars_nouveau/advancement/recipes/misc/worn_notebook.json -0d8e97944642ff8e877d0aa4688fa4407f09fe61 data/ars_nouveau/advancement/recipes/misc/yellow_sbed.json -5ab358eb773cad4086a5e61e11b3c83fcde87c1b data/ars_nouveau/recipe/agronomic_sourcelink.json -03c20e84c9f6180060bce50d07e0dfcae78afd9a data/ars_nouveau/recipe/air_essence_to_snow_bucket.json -164aed13b9ce118e4e04c4d4de6584f01bd44f7e data/ars_nouveau/recipe/alchemical_sourcelink.json -3bcad68084c5963d189a3adda7178e5c1d2cd72b data/ars_nouveau/recipe/allow_scroll.json -53ee254fdf04074f4e24818108e3df9a10ceb791 data/ars_nouveau/recipe/alteration_table.json -6893d65f6c1b20b176a80d4acddbf08bbf49031b data/ars_nouveau/recipe/annotated_codex.json -b668a35dfa9e5d5005cc5e871fa48941a0330a72 data/ars_nouveau/recipe/arcane_core.json -2abe5780b3c9b5e66f9fb89d3284cd5b01cf8ee0 data/ars_nouveau/recipe/arcane_pedestal.json -b3b729af157d37ce8fd800f06eb9723237fa6fde data/ars_nouveau/recipe/arcane_platform.json -68f7b6c77cb804e36cee558b93189b95a35affd1 data/ars_nouveau/recipe/archwood_button.json -3390b28cb95c3c54012968d9e5c8b0a45d7124e7 data/ars_nouveau/recipe/archwood_chest.json -19ade102ab38051edba714910dc8f966d23d2ea2 data/ars_nouveau/recipe/archwood_door.json -145c3b2469019bda16df0cb8493ca735fbcde977 data/ars_nouveau/recipe/archwood_fence.json -035beb9e6e73ee4e88daded672e57b2d806be214 data/ars_nouveau/recipe/archwood_fence_gate.json -4009ff6e5a1960dae901385f5909a39eba0a1289 data/ars_nouveau/recipe/archwood_grate.json -67f00645627dc667301f3e9a8e3b4d8808fa3994 data/ars_nouveau/recipe/archwood_planks.json -3b4decb139ef2bbc828c428eb13862980a763847 data/ars_nouveau/recipe/archwood_pressure_plate.json -2601d9a5a1a8028377d3916bdfa7b5da4657d6ce data/ars_nouveau/recipe/archwood_sconce.json -5201be3f889d6a51d065363f17600a4614969353 data/ars_nouveau/recipe/archwood_slab.json -986ff47f53636936ffd6e0f074ec802862d96e12 data/ars_nouveau/recipe/archwood_stairs.json -e27acf9a62c7ac6edd984df1f526089bb5d8c768 data/ars_nouveau/recipe/archwood_to_chest.json -4d6c7d5c0e64d0486d365377417117d5edb382c4 data/ars_nouveau/recipe/archwood_trapdoor.json -3f5387933813f70e39762ca4cd794fa504f82e89 data/ars_nouveau/recipe/basic_spell_turret.json -86f7be9a035d695bc99e98fc90d070a3c92e7935 data/ars_nouveau/recipe/blank_parchment.json -29b58ebf63ce034972b8aee060ab643fce3d9ba8 data/ars_nouveau/recipe/blank_thread.json -05a109cd0b76401aa94d1958644e15df3ee1295c data/ars_nouveau/recipe/blue_archwood_wood.json -f7f44d2c3eb30021937d9cec4fe65a1921d29c1e data/ars_nouveau/recipe/blue_sbed.json -fa6ef2dc0ff3bed59dae1e84d229529b02860109 data/ars_nouveau/recipe/challenge_2.json -36f93e4053af09f5393c6b147fffbc69c7ef1ddb data/ars_nouveau/recipe/clear_alakarkinos_charm.json -aaa983f63a03c4423709c2cd6b7c064df9fa555f data/ars_nouveau/recipe/clear_allow.json -6b2aa4d03411783352471307a0b74faf3b5ec516 data/ars_nouveau/recipe/clear_amethyst_golem_charm.json -ee6a4ca85028a4c6b2b7373d7da7a62573c1bb99 data/ars_nouveau/recipe/clear_bookwyrm_charm.json -4b75d660393bdf2ef048cd1d1b5a060ad2e1e69d data/ars_nouveau/recipe/clear_deny.json -28dd25917feed5b72c8f449830ddad58caf9710a data/ars_nouveau/recipe/clear_drygmy_charm.json -744dd39d50c1277291980520aeb5eaa548da6fb6 data/ars_nouveau/recipe/clear_starbuncle_charm.json -e40f3959e9af493782395c436060a4c80ee61929 data/ars_nouveau/recipe/clear_starbuncle_shard.json -642a9347a8cdbb423f8303d800738cc9319c93dd data/ars_nouveau/recipe/clear_whirlisprig_charm.json -c3023681f4c929c8990c1ae05f198d353daddd31 data/ars_nouveau/recipe/clear_wixie_charm.json -a6d152a895509e9499224a26df6a16958eb1a7ab data/ars_nouveau/recipe/conjuration_essence_to_end_stone.json -eb467e8db516eb4a594e598773148c391b95246b data/ars_nouveau/recipe/conjuration_essence_to_soul_sand.json -93301e4c21000b77f346500c66d17515abddb623 data/ars_nouveau/recipe/deny_scroll.json -1ae35513507490134369531a55de220f64f137e2 data/ars_nouveau/recipe/dowsing_rod.json -7df5535aa482f33d1c26dc11b4f33f6f671e4c02 data/ars_nouveau/recipe/dull_trinket.json -a106290849c3a7cf7fe7b954e007b6211d8683df data/ars_nouveau/recipe/enchanting_apparatus.json -b9ddb20217f0c3a7ccd43888986b8e1dd3737f5f data/ars_nouveau/recipe/experience_gem.json -2f5f3364bb268f60fecc7d2de647682aa5b876b8 data/ars_nouveau/recipe/falseweave.json -21d41cbd34de46e75115a6223a06142191138c42 data/ars_nouveau/recipe/fire_essence_to_charge.json -5c714e8a66c2b9d7bd58c263df92cedbea9ae252 data/ars_nouveau/recipe/fire_essence_to_magma_block.json -85af3fd5c829862cae286f2d9a3018bb8f87abdf data/ars_nouveau/recipe/ghostweave.json -d31c60a70ac056c62aa42633582c7ce8aaeef573 data/ars_nouveau/recipe/gilded_sourcestone_alternating_slab.json -21b874051ced8c33e45f5bf00117b04444f62587 data/ars_nouveau/recipe/gilded_sourcestone_alternating_stairs.json -65800bdb787ddbe7dab2974c509f18c9e69b0f53 data/ars_nouveau/recipe/gilded_sourcestone_alternating_stonecutter_stair.json -72dbd88e2d2faa69d739400a4168fe341715d304 data/ars_nouveau/recipe/gilded_sourcestone_alternating_stone_cutterslab.json -a530b27fb878b58d73c4f918d6aef268a454dd5a data/ars_nouveau/recipe/gilded_sourcestone_alternating_to_sourcestone.json -f435ab7ac3168eb2b07ef335257154167e05c021 data/ars_nouveau/recipe/gilded_sourcestone_basketweave_slab.json -2c467ba42d8d13245f32281b57f58af5dc366171 data/ars_nouveau/recipe/gilded_sourcestone_basketweave_stairs.json -5303510885a9e072c309bfe6b4159ac8ecb3e644 data/ars_nouveau/recipe/gilded_sourcestone_basketweave_stonecutter_stair.json -010fae0cdc8d9d88a214d94089abb2029b2ad90a data/ars_nouveau/recipe/gilded_sourcestone_basketweave_stone_cutterslab.json -d6b3a2917ddae9f41ebf370d674b71733e3e550f data/ars_nouveau/recipe/gilded_sourcestone_basketweave_to_sourcestone.json -7ce6626f86fc6722cd87e03c4f7159e580ba7b15 data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_slab.json -1c8e7831fec55dba45bf5d066ac01fbbd2a9eb6b data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_stairs.json -93078f7bf378895bf4db0a161a053cda119d0043 data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_stonecutter_stair.json -16b12c427a3243640cff98af2efe2134a1423a5a data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_stone_cutterslab.json -47999849d849266b83130193dbff3d0b6de777fe data/ars_nouveau/recipe/gilded_sourcestone_large_bricks_to_sourcestone.json -6be8ab4f5410b7159be110086fb96ced60662474 data/ars_nouveau/recipe/gilded_sourcestone_mosaic_slab.json -59e6a7bd5a0c59b37627d0ec01874970f1d36d41 data/ars_nouveau/recipe/gilded_sourcestone_mosaic_stairs.json -72cf3e2fff2482f8595dc047002c293c55ffcc42 data/ars_nouveau/recipe/gilded_sourcestone_mosaic_stonecutter_stair.json -97b8dbcf22d1c324149cae94fc390043e32ed426 data/ars_nouveau/recipe/gilded_sourcestone_mosaic_stone_cutterslab.json -1d7c57aebdf109cf029978d22d0e7c9a0b0fb969 data/ars_nouveau/recipe/gilded_sourcestone_mosaic_to_sourcestone.json -bec69a8d002ea373314fc0393c84d8036d415c17 data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_slab.json -2d878d6f32ab84ec46f5c3784da220cde6493772 data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stairs.json -077fadc7edaa58f40a873b955063b296f7c0607c data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stonecutter_stair.json -c2460feccf67516df403a9abb8c832911390bf4c data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_stone_cutterslab.json -29a297bd450b2f8df3a69bfe40bc0b75bee0ab55 data/ars_nouveau/recipe/gilded_sourcestone_small_bricks_to_sourcestone.json -852a46a3cadfda93186f4253b3a0891be96783fd data/ars_nouveau/recipe/gold_grate.json -68145936a0efb8b3b80e5469df8cd52caf7c85d8 data/ars_nouveau/recipe/greater_experience_gem.json -47d30e1bdf7c9e8947c5fa5f0fd047567abf195d data/ars_nouveau/recipe/green_archwood_wood.json -e54c68f5c220f3af8b9c996094a2ab213a05775e data/ars_nouveau/recipe/green_sbed.json -f07d4e92f2ecd9d05562cf1a7dd43c21e6c8d935 data/ars_nouveau/recipe/horn_to_bonemeal.json -fd0f5e2dcb502227b5583b181f196026d5f4f769 data/ars_nouveau/recipe/imbuement_chamber.json -da33ed3a448276094d5721a580910bc5bd068f3c data/ars_nouveau/recipe/item_detector.json -cd414f88fe9d90cb7e6e483612fabca6efece561 data/ars_nouveau/recipe/magebloom_block.json -32e401c4e59339f6be8e031cd31c11599ea94466 data/ars_nouveau/recipe/magebloom_block_to_magebloom.json -e6aa2f2be1609f389ab67f0ebeebfdc3470a7012 data/ars_nouveau/recipe/magebloom_fiber.json -205220ac210cf0a840b9559ab1336af5080d242b data/ars_nouveau/recipe/magebloom_to_pink.json -14701bc0c4eb6a1332322e1e981f740907b63ef2 data/ars_nouveau/recipe/magelight_torch.json -c92467ad911ade5f06c0135a3e0587c3f3ef9314 data/ars_nouveau/recipe/manipulation_essence_to_andesite.json -2e3dcdfe595b65c8ff6703a125b14d4a7817528e data/ars_nouveau/recipe/manipulation_essence_to_blazin_sapling.json -0426e0c3b309f6f0f5f7ab25d0ef32e22ca9d51a data/ars_nouveau/recipe/manipulation_essence_to_calcite.json -f4c014af6ca13688b188bfc70db5d0f92c5de585 data/ars_nouveau/recipe/manipulation_essence_to_cascading_sapling.json -f72b44924bb0c7c14584ac5555c65ec8233d6a91 data/ars_nouveau/recipe/manipulation_essence_to_deepslate.json -b9800ed946a7698a5338eea2c03fecb4660396e4 data/ars_nouveau/recipe/manipulation_essence_to_diorite.json -15825744662c224513e7a896c10bf7498e872378 data/ars_nouveau/recipe/manipulation_essence_to_flourishing_sapling.json -180fd298b3cac043bc226ffe98d292c7efe5f793 data/ars_nouveau/recipe/manipulation_essence_to_granite.json -d54eacc226f29a2c537fc491c0b56839155d988e data/ars_nouveau/recipe/manipulation_essence_to_grass_block.json -43c4e057c200e73cb7d86a6c85efc5b135dada3c data/ars_nouveau/recipe/manipulation_essence_to_moss_block.json -a36e18e1eb518eeaf677d8109574e13461c24561 data/ars_nouveau/recipe/manipulation_essence_to_mycelium.json -0b2950bc4680c5866c7f96ca2f81e144c9733066 data/ars_nouveau/recipe/manipulation_essence_to_tuff.json -80304edc468f0f9f988156764dc4bfd24979b874 data/ars_nouveau/recipe/manipulation_essence_to_vexing_sapling.json -707522a192ccd25e2da6490e5e9d6476fe66c5f7 data/ars_nouveau/recipe/mimic_scroll.json -2934fb39403c24a9c6c363dd2b1eea19a094c4cf data/ars_nouveau/recipe/mirrorweave.json -e1884cca124df55bf412d95549f86800492deaac data/ars_nouveau/recipe/mob_jar.json -60f6f54acffb0880bac374b48177fd9bd1dd4106 data/ars_nouveau/recipe/moonfall_2.json -98db5ff95dbb53d498ae0b405c7c4e0b244a52be data/ars_nouveau/recipe/mundane_belt.json -f3c87219dc4de1677d67aeeb5f82ae5c8be34bdd data/ars_nouveau/recipe/mycelial_sourcelink.json -b95a26ec7ca85f4b6c2d897f08188bcbce4aadf1 data/ars_nouveau/recipe/novice_spell_book.json -ca12f5dca463bbf0aca09c46b8efe2f6446c90ce data/ars_nouveau/recipe/orange_sbed.json -598c51209c60374d958b0a81afe37462dad45081 data/ars_nouveau/recipe/platform_to_pedestal.json -27e2e8438ba3dfdff05440abd1f751c50f0be420 data/ars_nouveau/recipe/polished_sconce.json -4c7cb2cfb58fde34c12f4672b9ec44b30d618eb1 data/ars_nouveau/recipe/polished_source_sconce.json -7873c2163a0b02d99e4c70be8af5e5d9c0bd34c4 data/ars_nouveau/recipe/potion_jar.json -21f23f67bae60bff26f2c255f38c0ab41f4a5cbd data/ars_nouveau/recipe/potion_jar_empty.json -ea63cf7bea666ed17912b8fae45be7eaa3ed7288 data/ars_nouveau/recipe/purple_archwood_wood.json -4a2c4815844b91e8cf3636d33b6d0c53bdaf267c data/ars_nouveau/recipe/purple_sbed.json -616946e3adf199d9d3c0707aeeb85982b10fce49 data/ars_nouveau/recipe/redstone_relay.json -5a328c1fbe2131697c8af1a91b48781d4d5b57ad data/ars_nouveau/recipe/red_archwood_wood.json -8ff451fad137ccc8a670fb3d335299810ea8eea0 data/ars_nouveau/recipe/red_sbed.json -25d2e36480a9d7d823739df070b6a2442fc00c7c data/ars_nouveau/recipe/relay.json -a67d41e3479aca3091003352a993477e07d36c7d data/ars_nouveau/recipe/repository.json -d69b689c9d3d9beacb19470d85ae0563d16eaf21 data/ars_nouveau/recipe/reset_stable_warp_scroll.json -e4fa6ed6a2cb95d4d609eb9f63342b4ff0cbaad9 data/ars_nouveau/recipe/reset_warp_scroll.json -edb21a2954e2ad301954256943914108e3659ef3 data/ars_nouveau/recipe/ring_of_potential.json -8a46330ef6197232cc0e87155b9834eb57f56620 data/ars_nouveau/recipe/ritual_animal_summon.json -880eeb058ab37b4c51ed9316d9284bdd49edea94 data/ars_nouveau/recipe/ritual_awakening.json -34cb48c0a5eafb291b5a4fa5b74b3ee49919b9de data/ars_nouveau/recipe/ritual_binding.json -524640c09874ddc3802035c8cacafd84cadf80b6 data/ars_nouveau/recipe/ritual_brazier.json -f372b9092ba4f2990fa6a944b2c0dbf730c32367 data/ars_nouveau/recipe/ritual_burrowing.json -f9607dc36c4f4626afa9d98369a5c21f471b32d9 data/ars_nouveau/recipe/ritual_challenge.json -9a136e682d91ea37df5c69280d9838cbe343fdc1 data/ars_nouveau/recipe/ritual_cloudshaping.json -d1b2121d00b5d216c29c005e195a835687939123 data/ars_nouveau/recipe/ritual_conjure_island_desert.json -4f6c73461d37232f39d4220994a7681298bd1f8c data/ars_nouveau/recipe/ritual_conjure_island_plains.json -71984fb8e25ca4a919b2332ee0e25256f92659af data/ars_nouveau/recipe/ritual_containment.json -5545ad0aba36dc60d030be3bb0ca8df335513850 data/ars_nouveau/recipe/ritual_disintegration.json -36806069545229e9791194e2c69ed3374aeedc08 data/ars_nouveau/recipe/ritual_fertility.json -fcf24b2cb4935579d70f679e9ce623fa8e3bcadf data/ars_nouveau/recipe/ritual_flight.json -cd4e3739a388e3303bcefcd30be39c4da6ea6d06 data/ars_nouveau/recipe/ritual_flowering.json -f2d2b98c71bf9a37fd9094eb2a805164c24f04e0 data/ars_nouveau/recipe/ritual_forestation.json -58d97163c8181c5bd2ab07ffa4a08a540b0cf845 data/ars_nouveau/recipe/ritual_gravity.json -d7e8c558924b2edb195713f67a840134bdf20d84 data/ars_nouveau/recipe/ritual_harvest.json -b66a7c4bd80359f57c798857de8e566e432cd126 data/ars_nouveau/recipe/ritual_moonfall.json -b2a0966389179ec0f881c489fa5ecbc2c5055473 data/ars_nouveau/recipe/ritual_overgrowth.json -5061c6aafaad2e5b027adb74257390a262f13603 data/ars_nouveau/recipe/ritual_restoration.json -f3c8e1e452d9e3da0d41bf55e60da60b476a204a data/ars_nouveau/recipe/ritual_sanctuary.json -2d7430516998d606e1e4f7c36803d358e91320e5 data/ars_nouveau/recipe/ritual_scrying.json -5123654f5081a2901bb2919e9308c65c0358ab95 data/ars_nouveau/recipe/ritual_sunrise.json -a4194bc3caca8f56ee425021f31738c189bec74d data/ars_nouveau/recipe/ritual_warping.json -6e3200ffef781dc82bad2f6b9658836cd816511b data/ars_nouveau/recipe/ritual_wilden_summon.json -a37c13de84a1b1166110870ce4e289955bbb7126 data/ars_nouveau/recipe/rotating_spell_turret.json -c575a5b0c428b291f1cfc84eeabd4dbbbb2c2a34 data/ars_nouveau/recipe/rotating_turret_to_basic_spell_turret.json -43458f912f2a3eef45c0786aafa19e8cdca7eae4 data/ars_nouveau/recipe/runic_chalk.json -ee5ba21b4320d4bd645ac3dad8243ca0515ddd8c data/ars_nouveau/recipe/sconce.json -825db5da332f1a056bd22a0e3e3e3cb8579d40fd data/ars_nouveau/recipe/scribes_table.json -5c800ecff28b24432eda44bd4d60b33e5e0cb739 data/ars_nouveau/recipe/scryers_crystal.json -40ac99a48606b92662bbab965d4a7d973e5580c7 data/ars_nouveau/recipe/scry_to_blank_parchment.json -0d8e0aa41af9c50473968e97f935509bf2891de9 data/ars_nouveau/recipe/sky_block.json -1ae6da8aeb72f0a39bd555e3e0ba3836f2425c08 data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_slab.json -9cf986d982d9babb27efd1f08f016f1a90ee279b data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_stairs.json -5286a1149ff48ec0f9ccd24d86b9a6ba85888dc7 data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_stonecutter_stair.json -b2aa1274857a762eea51ce2290b6159c9ae884e3 data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_stone_cutterslab.json -41747a7c1df5324d4c1c3cb7749582c7ad4f42e2 data/ars_nouveau/recipe/smooth_gilded_sourcestone_alternating_to_sourcestone.json -d603cfd482db284b650c443a4daac2b429f2f355 data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_slab.json -f73f2114bd9891fb8811637048befc3e3b503fc6 data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_stairs.json -fd9828f0eca7c883bdf5c2de9fcee960d40cd45e data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_stonecutter_stair.json -0d50893b86460068ee53c04cdb87835679ecf312 data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_stone_cutterslab.json -401c05cb82f1a186c95b53efa4b568e13d942ffa data/ars_nouveau/recipe/smooth_gilded_sourcestone_basketweave_to_sourcestone.json -a3448158fb4f4a9d811d1bf329fa1560bbc44efd data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_slab.json -c37f97def8efa69e9cc45e6a734fa65ca64b2040 data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_stairs.json -638081ba1ec2a17971fe028dfda9e427535f433b data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_stonecutter_stair.json -997a3a6c9a8afb4eb889706ea151170e52f9fb20 data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_stone_cutterslab.json -599200cbe797865023bbea5fdf3b626f70b404aa data/ars_nouveau/recipe/smooth_gilded_sourcestone_large_bricks_to_sourcestone.json -87f03e363d4d9ddde833f4a0b35f156dfccfb950 data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_slab.json -cc1cc37a2b321648efb307d9e44fb3bfeb2b4ffc data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_stairs.json -33a3d5cbf47243297753df92a9d51b912ec9237f data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_stonecutter_stair.json -feb07332e311c2d8565eb59ce6469bd4cc2bdd36 data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_stone_cutterslab.json -cf1c3934d4d1b7e0a3739d129c934502b23a7a0c data/ars_nouveau/recipe/smooth_gilded_sourcestone_mosaic_to_sourcestone.json -edabd715e2c0681e5a40fb01d05bbd3eec348a44 data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_slab.json -7cde0b5dea4fdf5294ac974d22cbb1b56363666c data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_stairs.json -027af62b9ac0066493147fb27149cff581a3f091 data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_stonecutter_stair.json -42e48354ce520118af057bb26e4127608c9a8685 data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_stone_cutterslab.json -993fa30ea7ad937b570745c57747fbc7857b38cb data/ars_nouveau/recipe/smooth_gilded_sourcestone_small_bricks_to_sourcestone.json -b68748358f0cb152bdff59e4483485c477754e6c data/ars_nouveau/recipe/smooth_sourcestone_alternating_slab.json -1a131fbece02b012ea835d06dcdb0ab29351edd6 data/ars_nouveau/recipe/smooth_sourcestone_alternating_stairs.json -076f2e1e468ae7fa4cb235f7115f67b6273df50c data/ars_nouveau/recipe/smooth_sourcestone_alternating_stonecutter_stair.json -291c6a88ae2a27925d626b09cd796a0f5ff1b4be data/ars_nouveau/recipe/smooth_sourcestone_alternating_stone_cutterslab.json -4b11b94f89f7d55c5f36ada8d789a6a15302518c data/ars_nouveau/recipe/smooth_sourcestone_alternating_to_sourcestone.json -acbe5a1fb8f456d08d8a86621ca5551c68b64df4 data/ars_nouveau/recipe/smooth_sourcestone_basketweave_slab.json -de8804b81bb11ad699c118c674a5ec92e54f2e8f data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stairs.json -d0263bb0d14c77a757f1444371caff2686f3b335 data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stonecutter_stair.json -49d5eee984f3df841e993c5a2e9c616816a6cc8b data/ars_nouveau/recipe/smooth_sourcestone_basketweave_stone_cutterslab.json -8a7130ffa41374909ef985ec4c1ec350d654f162 data/ars_nouveau/recipe/smooth_sourcestone_basketweave_to_sourcestone.json -59fb26e9ba04e8dc02a3501ec8173876871b430c data/ars_nouveau/recipe/smooth_sourcestone_grate.json -400372944ed98be7d1b7cb5e1f5ae072bafbc63e data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_slab.json -e18cc711473df298fe44a175b0c213098ee30c7e data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stairs.json -0f8d955c626ea38620e19169c0f1ef44efcebd7a data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stonecutter_stair.json -15f3705f7b46ca54c466f11f5995c0128ccee15f data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_stone_cutterslab.json -0a51b41ba8045d99c34e73e68f87f0d6c916c42d data/ars_nouveau/recipe/smooth_sourcestone_large_bricks_to_sourcestone.json -72a51d1e712113f01339cc90f3760a45da2e96e8 data/ars_nouveau/recipe/smooth_sourcestone_mosaic_slab.json -0e7d4e14121efb8091b2d28435043a2a86140f32 data/ars_nouveau/recipe/smooth_sourcestone_mosaic_stairs.json -5226c6ab60c3d2fc686ff7d41c49ef7600b2350b data/ars_nouveau/recipe/smooth_sourcestone_mosaic_stonecutter_stair.json -79f98eb6af3b66bbcde4dd4aa2eac4d568204c63 data/ars_nouveau/recipe/smooth_sourcestone_mosaic_stone_cutterslab.json -a14378f3918389d0bf3b384611bf0d7e83a8468d data/ars_nouveau/recipe/smooth_sourcestone_mosaic_to_sourcestone.json -92af529e7cd0999cd17c58283341826986e3bd21 data/ars_nouveau/recipe/smooth_sourcestone_slab.json -baa85035a6ee43dadafc6f4882e19134d6d2edec data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_slab.json -01bc82b98db62c0b558e83333593f2ea2e9f18de data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_stairs.json -95f339b25fd4e0a308f820633bc55153a625fc7d data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_stonecutter_stair.json -3cdfe411f2ccd0f012721780a375d7d795085c78 data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_stone_cutterslab.json -5c091fd7739ce37ed1f0ca819e76820586f7409d data/ars_nouveau/recipe/smooth_sourcestone_small_bricks_to_sourcestone.json -b4e0da986074b8609eb152ea0127dfd29e7d904f data/ars_nouveau/recipe/smooth_sourcestone_stairs.json -2a1c4eedde39a9ccf22526a9036356590ce7d437 data/ars_nouveau/recipe/smooth_sourcestone_stonecutter_stair.json -c5463533191816bf832dd59136803829ebfbfe3b data/ars_nouveau/recipe/smooth_sourcestone_stone_cutterslab.json -0c5925117feaa9dc6d3f825b19f89984c943911e data/ars_nouveau/recipe/smooth_sourcestone_to_sourcestone.json -815af537716d5a9879a3e51c39ea662b8d34d669 data/ars_nouveau/recipe/sourceberry_sack.json -d7293d221e0717498eb71355af2008ea2ad9c0ae data/ars_nouveau/recipe/sourceberry_sack_to_bush.json -2e861cae2c767aa5892e58bc39ffca478553316d data/ars_nouveau/recipe/sourceberry_to_purple.json -7452c7e0da8e56b63fb4fee9b0c7a3fce916b320 data/ars_nouveau/recipe/sourcestone.json -b159d2ff355a3f08def030f597621b034126b94e data/ars_nouveau/recipe/sourcestone_1.json -5c80647e01b985769d977f597af8f397b8c444b7 data/ars_nouveau/recipe/sourcestone_10.json -dadc5af121d0e6547541b38271af71e758cb4232 data/ars_nouveau/recipe/sourcestone_11.json -e1b4c37eb9b22541eaa02967ff91797e7ad882a6 data/ars_nouveau/recipe/sourcestone_12.json -e0da83103834adb3dfd9df2989b75a5a513e5c20 data/ars_nouveau/recipe/sourcestone_13.json -b83fc2b852867eb2ebab51e83a1da1c94e6a5a40 data/ars_nouveau/recipe/sourcestone_14.json -bd75333f67ffbb471769db4aae0eb7582e0806fe data/ars_nouveau/recipe/sourcestone_15.json -58606e1aa6ab0eb8885f670585e34e224b0f7c7d data/ars_nouveau/recipe/sourcestone_16.json -cdef5a28e311087d7d8efa68d67bdcb7f371340e data/ars_nouveau/recipe/sourcestone_17.json -d6b9c1bb422584f2fee25f681795e8c2cce69ec2 data/ars_nouveau/recipe/sourcestone_18.json -9f145274e8a2726d9428fde5801387ee25425ec0 data/ars_nouveau/recipe/sourcestone_19.json -6ea62abbb740ee890efe9e9ba79baf3c76a6cc24 data/ars_nouveau/recipe/sourcestone_2.json -a00160fa1d58d426fdecab6c095dd146b4344b4b data/ars_nouveau/recipe/sourcestone_20.json -7bdd0fddeeedf5e99f84930887585b2ada74efa1 data/ars_nouveau/recipe/sourcestone_21.json -2a210426af321b4df999879edc2640e9bb7f7e02 data/ars_nouveau/recipe/sourcestone_3.json -3486cf69f78cc17517415c90ad1e79227faab7c0 data/ars_nouveau/recipe/sourcestone_4.json -bab03894df49ef652c72176013430594c46f0721 data/ars_nouveau/recipe/sourcestone_5.json -68a8a95d6e3529329cdaa2bf25879b9df43a17ed data/ars_nouveau/recipe/sourcestone_6.json -d3eb1d7ea5eeb8b2f85c58383d4c94b40ac216f0 data/ars_nouveau/recipe/sourcestone_7.json -ff5c63c8a8789d2c83d357dc049662e4fd477d86 data/ars_nouveau/recipe/sourcestone_8.json -7e6bb85ea469420c27d9b78d26ff122b73620296 data/ars_nouveau/recipe/sourcestone_9.json -403b68d8066f10b3bff82ebc776e4f0319573215 data/ars_nouveau/recipe/sourcestone_alternating_slab.json -e687db6c44b28f20bbe43fcab295bc902a8d795a data/ars_nouveau/recipe/sourcestone_alternating_stairs.json -39b748e5cf116e29cd2dc95900ed69c48c517462 data/ars_nouveau/recipe/sourcestone_alternating_stonecutter_stair.json -69dd8f536ce20b2944488d90d26bda71ffe6ac04 data/ars_nouveau/recipe/sourcestone_alternating_stone_cutterslab.json -8b6e1873b09131090b5c9262f038b4a643444df1 data/ars_nouveau/recipe/sourcestone_alternating_to_sourcestone.json -8a7ac1181c49b97c3a70aa5c089c353353a48722 data/ars_nouveau/recipe/sourcestone_basketweave_slab.json -d8987e3cd5b7933ddad2fa0f5f8eef4dc6c757af data/ars_nouveau/recipe/sourcestone_basketweave_stairs.json -75cc98a03d013ad872bad29c0e1fc2cc84de3fae data/ars_nouveau/recipe/sourcestone_basketweave_stonecutter_stair.json -f7a36183332cee6b288bd113af0b38335c746e2b data/ars_nouveau/recipe/sourcestone_basketweave_stone_cutterslab.json -21e59abdf2bc5b18c2cdbcf84a7b08c00a586ead data/ars_nouveau/recipe/sourcestone_basketweave_to_sourcestone.json -83c9dc96311bb25d320fb4a57da9f0a55498e715 data/ars_nouveau/recipe/sourcestone_grate.json -4cdf9a8b4bde0f985a01d1b772323df62c5a214c data/ars_nouveau/recipe/sourcestone_large_bricks_slab.json -055ecd2a82200dbba5aae29e67953f824ae4d49a data/ars_nouveau/recipe/sourcestone_large_bricks_stairs.json -58271d6404ad2fcbf894a99c197bd5ed4f885d4c data/ars_nouveau/recipe/sourcestone_large_bricks_stonecutter_stair.json -4dd8855c114c924326c2e56dc4f09a66c0b15bc4 data/ars_nouveau/recipe/sourcestone_large_bricks_stone_cutterslab.json -fbef7ce258ce205b3025282fe6184d6c2b9ee8a6 data/ars_nouveau/recipe/sourcestone_large_bricks_to_sourcestone.json -30340db1f04937e6523a64b8645be6e9524c1bbb data/ars_nouveau/recipe/sourcestone_mosaic_slab.json -8ce7fbf1157565bf6612cb3420b84f78d836d2c1 data/ars_nouveau/recipe/sourcestone_mosaic_stairs.json -e99742a48cbaefae14294f67296528e3ebc9fcfb data/ars_nouveau/recipe/sourcestone_mosaic_stonecutter_stair.json -6d345bf331f36f58111429200c9263f69c9f796f data/ars_nouveau/recipe/sourcestone_mosaic_stone_cutterslab.json -9b48c087b8662d53b6bd459a2e14d7de9fc1cd10 data/ars_nouveau/recipe/sourcestone_mosaic_to_sourcestone.json -ab449f75dad19bff5448702d67bb32ab387e68de data/ars_nouveau/recipe/sourcestone_sconce.json -1cf3f3ec1144f994fb1951b1e839466c305c98d6 data/ars_nouveau/recipe/sourcestone_small_bricks_slab.json -206a6ae71999c8bcb2aee40ec68a71c1bf57b832 data/ars_nouveau/recipe/sourcestone_small_bricks_stairs.json -4a17f86391b25d61a3c5a2947434367826cc596b data/ars_nouveau/recipe/sourcestone_small_bricks_stonecutter_stair.json -e44f13b1e300032a8b8f5c6751ed7fc583b210be data/ars_nouveau/recipe/sourcestone_small_bricks_stone_cutterslab.json -7f6168d5ae8e831e77cb0806e3a06d91b5450155 data/ars_nouveau/recipe/sourcestone_small_bricks_to_sourcestone.json -fb928e4220c714f21512e797870c15e474f50dba data/ars_nouveau/recipe/source_berry_pie.json -afe7ecef1ee8ae08a8d3a2acc1b08327d0ef9618 data/ars_nouveau/recipe/source_berry_roll.json -8e73daa42d1c3b50da95e8e9b17dd378394cb5e6 data/ars_nouveau/recipe/source_gem_block.json -c06a657b4454d37d6a163c4cc10704a5c8cf5065 data/ars_nouveau/recipe/source_gem_block_2.json -9f629e68870a9bcb8827301b66f253caa5731d80 data/ars_nouveau/recipe/source_jar.json -fd4f54e3b9e232813f6ee2d0dad241594674f090 data/ars_nouveau/recipe/source_lamp.json -d8b09f182394f57f1695154e21df6df2de1edb3c data/ars_nouveau/recipe/spell_prism.json -2ba1f528e85a732de26d7a83a4bc4924cbfd59f8 data/ars_nouveau/recipe/spike_to_arrow.json -958a7d7aedff3bc57fdfcb14ac84ed435927e115 data/ars_nouveau/recipe/spike_to_dye.json -068807a1afd31b9497831aeefe2df60d2565d690 data/ars_nouveau/recipe/starbuncle_shades.json -62b1c75eb9640af367537bf8ca9cc86f2150b91a data/ars_nouveau/recipe/stripped_blue_archwood_wood.json -0f063f4016238c46eeaf1c3f3eb8a50860958552 data/ars_nouveau/recipe/stripped_green_archwood_wood.json -87f04a42c9dd11a6b0f87b823206876d8914afd6 data/ars_nouveau/recipe/stripped_purple_archwood_wood.json -d128ca0b445cec01f08427a1161cc5d7c7786ca3 data/ars_nouveau/recipe/stripped_red_archwood_wood.json -ca56d495360055deb4f24de0c41884339e8f9d56 data/ars_nouveau/recipe/sunrise_2.json -f41669b944e5d9142e27e27c4042b8bc554d0734 data/ars_nouveau/recipe/vitalic_sourcelink.json -814123e61686726650596240db521172b91f7535 data/ars_nouveau/recipe/void_prism.json -018e98d19ca5d5afc67bad5191cd73cb510a1fa2 data/ars_nouveau/recipe/volcanic_sourcelink.json -aecf98c0d3730be9578dbceaac39fc5596d9982b data/ars_nouveau/recipe/warp_scroll.json -c19871c38692c25e6045b280e8b4b5d36203c15f data/ars_nouveau/recipe/water_essence_to_bucket.json -3a1671e8f9c1c4f6348ee0ea0bb6626f104e850c data/ars_nouveau/recipe/water_essence_to_obsidian.json -f9c3f8eef713e609e22c9c5b3eba2b848c13af89 data/ars_nouveau/recipe/wilden_summon_alt.json -70042fe858652ec14314d20f993b5bade0b7de16 data/ars_nouveau/recipe/wing_to_leather.json -532075e3c595e9d3b3b067289d5efbaf7fe49362 data/ars_nouveau/recipe/wipe_spell_parchment.json -c1ff140a7eea0c25559c9445572b928edec0d5f1 data/ars_nouveau/recipe/wixie_hat.json -635ab6a0a28315545b61d556d8924deac512ac98 data/ars_nouveau/recipe/worn_notebook.json -6fd5261e1412280fcc8d3a12414c7cb6342b78f3 data/ars_nouveau/recipe/yellow_sbed.json diff --git a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 b/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 deleted file mode 100644 index 8e0b4ce7e4..0000000000 --- a/src/generated/resources/.cache/a4c3c262a85f6a179e7e29128e8b31d4da806803 +++ /dev/null @@ -1,259 +0,0 @@ -// 1.21.1 2024-10-20T14:26:18.8460366 Ars Nouveau Item Models -11ee554b11a3a830e89b742762e5b754c2ecb5ee assets/ars_nouveau/models/item/agronomic_sourcelink.json -20a434b964b88bc010c17e0616f2c2601b53479d assets/ars_nouveau/models/item/alakarkinos_charm.json -533b61aabca43719a266cddda3b7ec426135e5e6 assets/ars_nouveau/models/item/alakarkinos_hat.json -63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/ars_nouveau/models/item/alakarkinos_se.json -cf5f914263c22eabc17be749ade10e9d64736851 assets/ars_nouveau/models/item/alakarkinos_token.json -339a05323ebef7efc5c70db708a2e7a24708e9bc assets/ars_nouveau/models/item/alchemical_sourcelink.json -a0214090201827dd5f954d0b33e64e4df6e53764 assets/ars_nouveau/models/item/alchemists_crown.json -8587f05b17902c512f27c3eecf7a1a6319709f51 assets/ars_nouveau/models/item/archwood_grate.json -89e2e712ca344bff16882883d45b8e62536ea0d5 assets/ars_nouveau/models/item/archwood_sconce.json -f9eb0905e283cab647712716770a244a1bdb25f0 assets/ars_nouveau/models/item/bastion_pod.json -84bdd95fc8506c6d9054e5ffb87c24c20b2ae628 assets/ars_nouveau/models/item/blank_thread.json -a81ea25c1312389ff436100c29d1ae20d35b0a40 assets/ars_nouveau/models/item/blue_sbed.json -3b7dc3023a667efe5ff64cb937ee25047a853697 assets/ars_nouveau/models/item/bombegranate_pod.json -63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/ars_nouveau/models/item/drygmy_se.json -23781f068b9b788d0077a478b0470af583d759f5 assets/ars_nouveau/models/item/experience_gem.json -70d392c53a05ad554f3f3b1d3faa5fd1445e2a77 assets/ars_nouveau/models/item/falseweave.json -5f620c31cc6d4f1a569dbd943e5a45e75217303a assets/ars_nouveau/models/item/familiar_amethyst_golem.json -4bc7e5eecef2a4f3bc455bc93f3ce198a87be724 assets/ars_nouveau/models/item/familiar_bookwyrm.json -16945eab1b54f9b8bea70f9a887b675a05915c6a assets/ars_nouveau/models/item/familiar_drygmy.json -8a45aacdb1fb20c97da171f238c1b8025a3722d8 assets/ars_nouveau/models/item/familiar_starbuncle.json -eaa89494e16ef68f9fd897a8b6162fb2672f88a2 assets/ars_nouveau/models/item/familiar_whirlisprig.json -b3cd664ec510945fdd0482f5f9d850aa80687e74 assets/ars_nouveau/models/item/familiar_wixie.json -44954c84fd3b72144532cad5fb5bf355893d2e50 assets/ars_nouveau/models/item/frostaya_pod.json -54df022bbe10937673032f757129f5205b36fd19 assets/ars_nouveau/models/item/ghostweave.json -5970dbaafd6e721abb2d5d21c262a5c913d4e621 assets/ars_nouveau/models/item/gilded_sourcestone_alternating.json -ba60b2ebc2152000ccb8303acca518569a803752 assets/ars_nouveau/models/item/gilded_sourcestone_alternating_slab.json -802313ddc8abc5b351a4038ad29b04adad369bef assets/ars_nouveau/models/item/gilded_sourcestone_alternating_stairs.json -7bd4bc22ab3f7f03c6d9f22d3107dd5a02e7039f assets/ars_nouveau/models/item/gilded_sourcestone_basketweave.json -6071e0667a978d4ec02f6e1090433d163bc27516 assets/ars_nouveau/models/item/gilded_sourcestone_basketweave_slab.json -3a010ef8c60b1c0b8d2f523b7e835db2768bb8ce assets/ars_nouveau/models/item/gilded_sourcestone_basketweave_stairs.json -20c3f69d76faf609a95cbcb2cf77f99aa7fb4231 assets/ars_nouveau/models/item/gilded_sourcestone_large_bricks.json -878e180ed29a86e628012f0ea65a12eef5adf51d assets/ars_nouveau/models/item/gilded_sourcestone_large_bricks_slab.json -1866d54b6aa24177349f4efaf024dfba6f24fc53 assets/ars_nouveau/models/item/gilded_sourcestone_large_bricks_stairs.json -2b715012aa4f924986a9081dbbb8fed735b4d85e assets/ars_nouveau/models/item/gilded_sourcestone_mosaic.json -aa2296804bfd9726c4e0290a77beb606491dc1c2 assets/ars_nouveau/models/item/gilded_sourcestone_mosaic_slab.json -83b13e070d4817901037425f2d9431dbd251610b assets/ars_nouveau/models/item/gilded_sourcestone_mosaic_stairs.json -073e4c16bd75ae774c08f746c8d21ea85fb608ed assets/ars_nouveau/models/item/gilded_sourcestone_small_bricks.json -af33ffce50ea2887f7d0077adc78b9bf386b4bd1 assets/ars_nouveau/models/item/gilded_sourcestone_small_bricks_slab.json -281907cb0a37871d909dac39a30a3e27110726c2 assets/ars_nouveau/models/item/gilded_sourcestone_small_bricks_stairs.json -928a556e4a323a8f1675b3d12a9f824e1f25fb7f assets/ars_nouveau/models/item/glyph_accelerate.json -0b970e2a75901a3042dacfcd1a263ceab9a58207 assets/ars_nouveau/models/item/glyph_amplify.json -e90b0d3b7816c04c63969ee51f69f521d44d5444 assets/ars_nouveau/models/item/glyph_animate_block.json -1c1ed0488d4ff12373d07e7b17b99b17d81e9714 assets/ars_nouveau/models/item/glyph_aoe.json -8ad4f1e52ce9f588136032f323a0d76fc4849101 assets/ars_nouveau/models/item/glyph_blink.json -7441fa49080a68e1d9dfdaeb277d9b17229aac87 assets/ars_nouveau/models/item/glyph_bounce.json -c3de1abdd00608d7f5b4b71953119d218787f318 assets/ars_nouveau/models/item/glyph_break.json -86e2436793db61ff59fd3404138dc41d98dd94f3 assets/ars_nouveau/models/item/glyph_bubble.json -57a68c0d674b3622478b1b83f8543be58f6e3018 assets/ars_nouveau/models/item/glyph_burst.json -25e3368d3a84c449ff2d6c7ca27f76377fa2b3a7 assets/ars_nouveau/models/item/glyph_cold_snap.json -715f6e40e53b95cd4c4bd566ab43e226872ed02b assets/ars_nouveau/models/item/glyph_conjure_water.json -f72d7e2b785b1eb940997edfedb3edf7386cc026 assets/ars_nouveau/models/item/glyph_craft.json -b4e6a1291bc03fe1e9ffcf78c5a8360c443fc67e assets/ars_nouveau/models/item/glyph_crush.json -53a812ac2b161a979ccfe98a8775572a823eb157 assets/ars_nouveau/models/item/glyph_cut.json -08018238edcefab4a21f4213909b988802b54926 assets/ars_nouveau/models/item/glyph_dampen.json -58d1b36cdfeafbc407cbe1deeaf76d237dabf338 assets/ars_nouveau/models/item/glyph_decelerate.json -210c0c73a22a120955905ed8988bbd693a40f7c9 assets/ars_nouveau/models/item/glyph_delay.json -b54e84e6f0c091648fe3d6602805d9383c4e12c2 assets/ars_nouveau/models/item/glyph_dispel.json -2bd57a51ea648ff766c3895f7a6fe2373baa7912 assets/ars_nouveau/models/item/glyph_duration_down.json -118233d436c4f3c21daeb945c671c8f8582de00e assets/ars_nouveau/models/item/glyph_ender_inventory.json -0159c5cd5f684c5951fdfc8c43a6beeaa6e396fd assets/ars_nouveau/models/item/glyph_evaporate.json -8c4eb3caeb78fb0b5a536bc83eadf2872e7be4be assets/ars_nouveau/models/item/glyph_exchange.json -99bd2157bee9fc19e815663b64c46c38b2f3b099 assets/ars_nouveau/models/item/glyph_explosion.json -cb3aba57ca712621406b5e09f9e7a4dafcfc5120 assets/ars_nouveau/models/item/glyph_extend_time.json -51d420ba4def3e969597c40189575de845298124 assets/ars_nouveau/models/item/glyph_extract.json -b4d3fbaf340fb51214a27d494697b8f487766964 assets/ars_nouveau/models/item/glyph_fangs.json -5745972e152cbcd1618d66ed10a7c5f080d3b13d assets/ars_nouveau/models/item/glyph_fell.json -d79bbca208ca1d708ff5eb809b0e82baf79bb78e assets/ars_nouveau/models/item/glyph_firework.json -535b7f911c79bf7fba93cd7238e523c47f33d268 assets/ars_nouveau/models/item/glyph_flare.json -5294a33a229ff227551282050b9cb0a93a535b1d assets/ars_nouveau/models/item/glyph_fortune.json -225b7361e33ed14c607655618777cabed34e161a assets/ars_nouveau/models/item/glyph_freeze.json -99211098ddf8bd6b7b8ba8883d69b6e461f53360 assets/ars_nouveau/models/item/glyph_glide.json -39d5f2cab61dae3be24f3c690615fec437f51ed0 assets/ars_nouveau/models/item/glyph_gravity.json -c68b80b6d3d166db941ce597d4b7c4884f5556bd assets/ars_nouveau/models/item/glyph_grow.json -e3b23cc4536ccb16eefd7f87e849979f7bb4e8ec assets/ars_nouveau/models/item/glyph_gust.json -6c7c516ab86f0e58164bf8076df710388adc7237 assets/ars_nouveau/models/item/glyph_harm.json -c827799050558fd4e048a868beeb8031c4eb3eb8 assets/ars_nouveau/models/item/glyph_harvest.json -0d311218f330a4a7dbfb291a9ab365873eb550e8 assets/ars_nouveau/models/item/glyph_heal.json -e1d846fc426c2af3949719f53b99cc70f141e292 assets/ars_nouveau/models/item/glyph_hex.json -c7f02242194a81f406605495297aa443e45f6fd6 assets/ars_nouveau/models/item/glyph_ignite.json -7b9a2f216f4deadf921f006e23bb3f22a860aa7d assets/ars_nouveau/models/item/glyph_infuse.json -27a24a5fe4ea25085c03909d82c3a06d9d279cca assets/ars_nouveau/models/item/glyph_intangible.json -b10fde36f35f8256d4eda0a96b693987fdf2b9aa assets/ars_nouveau/models/item/glyph_interact.json -7a4108c9cbe3a9220f98b24cbe6e17d49fc45f85 assets/ars_nouveau/models/item/glyph_invisibility.json -d9e46109037ba05c4a0e01972c04e9fb1b48d303 assets/ars_nouveau/models/item/glyph_launch.json -e3b974bab5c8be7489356151f62e5fad349bf6fe assets/ars_nouveau/models/item/glyph_leap.json -680c18d8c12fd96d76bc3b26b535f0bfe86eca5e assets/ars_nouveau/models/item/glyph_light.json -e7f54893e02f4e74cfb8d6942c3e334e46b46cbe assets/ars_nouveau/models/item/glyph_lightning.json -01efb621125fc242e1a803e81a8bf9e219e71984 assets/ars_nouveau/models/item/glyph_linger.json -fbfe10752f07a26aebd57e6484d5f00a053c4636 assets/ars_nouveau/models/item/glyph_name.json -3a292eab2d9aca2dbdc6267d346c0261d7476dce assets/ars_nouveau/models/item/glyph_orbit.json -b348998e3b6f8de7e17e910fa81ddcf3b4809476 assets/ars_nouveau/models/item/glyph_pantomime.json -65a10959b3e356b62f457e98109dfe3b06a179d1 assets/ars_nouveau/models/item/glyph_phantom_block.json -1c5bddc31dfc2beb8898de056ec11219e5fb64a1 assets/ars_nouveau/models/item/glyph_pickup.json -0b8d3bc964187373a08a2f9ca02665f5485eb410 assets/ars_nouveau/models/item/glyph_pierce.json -9ba86517b6eff6389269b76ef79b0c30cdaa7d83 assets/ars_nouveau/models/item/glyph_place_block.json -7b5f192bbbfab3508efba29f9c2c99f7cb34792f assets/ars_nouveau/models/item/glyph_projectile.json -4aae4d9c31df4e7c77ab9281b31bd227a249c7fa assets/ars_nouveau/models/item/glyph_pull.json -5dea560185bf354975f8f94bd56a7e3623080c68 assets/ars_nouveau/models/item/glyph_randomize.json -597b7e7e70a00c4c0aa0fd311e72e5ad3dc95215 assets/ars_nouveau/models/item/glyph_redstone_signal.json -bfc3c86585cb7dc814d110686717138e093e1de8 assets/ars_nouveau/models/item/glyph_rotate.json -f2b0ad974f69bd9e85dcba810b82dca58572241b assets/ars_nouveau/models/item/glyph_rune.json -d1259c3c35adb938be0d7d7c05e96f95cfd830d7 assets/ars_nouveau/models/item/glyph_self.json -cd9c819503cc4cf2932623a5457f09c8cc47de30 assets/ars_nouveau/models/item/glyph_sense_magic.json -f302ffff7303a402b3a9c393f0fca3cc69b8e2c7 assets/ars_nouveau/models/item/glyph_sensitive.json -db8ca9471cd31f7847e81dc13e94bc6fcb473844 assets/ars_nouveau/models/item/glyph_slowfall.json -4b081846a6863c59db2ef22f91373ab3260334d2 assets/ars_nouveau/models/item/glyph_smelt.json -d4dfd1a22941e98d6d5d1ec2cb0953a7e93e14b1 assets/ars_nouveau/models/item/glyph_snare.json -c5166c3ed0e5d0e05540cc39483f9e0158b51d91 assets/ars_nouveau/models/item/glyph_split.json -3bdcf72e7889d61a7c76f90f9ecadd1dea6d2fc8 assets/ars_nouveau/models/item/glyph_summon_decoy.json -f2edab899f0044f6fa062a3bf49f41cf8ea40704 assets/ars_nouveau/models/item/glyph_summon_steed.json -c552037ed81bc5d78ef5ab5ef092e4404a140da0 assets/ars_nouveau/models/item/glyph_summon_undead.json -b713a72281403bad956460f4c8cd9392b6c5a3fa assets/ars_nouveau/models/item/glyph_summon_vex.json -0bff9ad272fcfb95d62b9653be0dd1b2fd09c796 assets/ars_nouveau/models/item/glyph_summon_wolves.json -ecea5b49f1dae0f8df81414efadbc66b75d07ecc assets/ars_nouveau/models/item/glyph_toss.json -e211bc125e4638f3492319e443e345cbb07dbc41 assets/ars_nouveau/models/item/glyph_touch.json -2ff59aea0b2b89a1a640aca9d73b6f9f1b452c57 assets/ars_nouveau/models/item/glyph_underfoot.json -304273aade4aa3b0239c56b9890b898f13f6d50d assets/ars_nouveau/models/item/glyph_wall.json -60285e0e9d2f9e3c84be706235308e2c848f63ff assets/ars_nouveau/models/item/glyph_wind_shear.json -04551cfe2d701b382487417cf2ddafbc8cfb68cf assets/ars_nouveau/models/item/glyph_wither.json -b2ccbfa09498159ed4b45d3dc49963fdc5d4c1cd assets/ars_nouveau/models/item/gold_grate.json -1ea37799aba1357a8fc65398b71a5d1738e9e6af assets/ars_nouveau/models/item/greater_experience_gem.json -8a3874b48013ee67b3d362bb9b7974924c5898d0 assets/ars_nouveau/models/item/green_sbed.json -486511474b99fb4803c0781259ef5620ac0b5adf assets/ars_nouveau/models/item/item_detector.json -abbab026c7b967ee35b53345b2fe7bacee12c3b7 assets/ars_nouveau/models/item/jump_ring.json -6b4020f44475f6afeb58072fb014c8e53664a2c5 assets/ars_nouveau/models/item/magebloom_block.json -dfb72f1f778ccff4efb558a02fc745c8d7f7fae3 assets/ars_nouveau/models/item/mendosteen_pod.json -a869ede0c768f982722b00764902abac8e30fde9 assets/ars_nouveau/models/item/mirrorweave.json -7f06a58b039169460038e9ea360096835bd4f854 assets/ars_nouveau/models/item/music_disc_firel_the_wild_hunt.json -7df4c87bf98b125b9e890a368ec0b284d0c32eb2 assets/ars_nouveau/models/item/music_disc_thistle_the_sound_of_glass.json -65fb3413e125a437efc88f8ed415abe97fb6ce87 assets/ars_nouveau/models/item/mycelial_sourcelink.json -7f12abdda6ac867ceb9f3c3cca0b3529670ca9b4 assets/ars_nouveau/models/item/orange_sbed.json -818bcb1048ef4519613b5e82724c8f7b40b9aaaa assets/ars_nouveau/models/item/polished_sconce.json -c556576b522dd93927e5ca14d62f6afb27005eb6 assets/ars_nouveau/models/item/potion_diffuser.json -6ae8eae13ac3fc5ab7cc3f91cb303584faf53255 assets/ars_nouveau/models/item/purple_sbed.json -b77d7daa65f5d4a3af491e82aeebe9c020df980c assets/ars_nouveau/models/item/red_sbed.json -174f338f205b669d15e7db166c4905a5055dd67c assets/ars_nouveau/models/item/reset.json -7c1b8502813759586798a31b46cddb6bd7779c7d assets/ars_nouveau/models/item/rewind.json -d00a9e50be792514762504fb0359de062420a8b3 assets/ars_nouveau/models/item/ritual_animal_summon.json -e80809d703494d6eb95a837c3db5424fc2514a1d assets/ars_nouveau/models/item/ritual_awakening.json -ddfeaa8b3a19fb5974ad9f52674985e276caefa7 assets/ars_nouveau/models/item/ritual_binding.json -89cdb7cb78037d809e061894a8f61a09e25e1915 assets/ars_nouveau/models/item/ritual_brazier.json -de650bc7652e3537d4fc9b99e60cf73cb3b61d8a assets/ars_nouveau/models/item/ritual_burrowing.json -4597e6cf88ddab2b7f2fa3a92cd032f9c911a6f5 assets/ars_nouveau/models/item/ritual_challenge.json -a88735286e20552489f18939fad8ad9d87263777 assets/ars_nouveau/models/item/ritual_cloudshaping.json -ed32beda231de99b0f56ddb9eeb0af1d8c2088a2 assets/ars_nouveau/models/item/ritual_conjure_island_desert.json -ce847936f7966cc0b8ed668488a2ddd947541963 assets/ars_nouveau/models/item/ritual_conjure_island_plains.json -71c000f1d18c8b8471e2d1e8bd195f2ad96b294a assets/ars_nouveau/models/item/ritual_containment.json -ccf89ea4d71dfcba117b73cff4da8ff9cc7179f9 assets/ars_nouveau/models/item/ritual_disintegration.json -c1626a0f087fedafc08c42505f1f85f29a867b45 assets/ars_nouveau/models/item/ritual_fertility.json -9c553deac48ba0f9240c59eb59e8add39b2a3242 assets/ars_nouveau/models/item/ritual_flight.json -5e9a95ac3da33e9f1de54af8629b4c0bf805144c assets/ars_nouveau/models/item/ritual_flowering.json -9cb0d169f0fbb9ae38762378d30edfa617addda6 assets/ars_nouveau/models/item/ritual_forestation.json -b280f28794ef322e19eea074fae60bed4edee0db assets/ars_nouveau/models/item/ritual_gravity.json -a98250f321e85ee0aaf3c8c6da5d85d1d133d92c assets/ars_nouveau/models/item/ritual_harvest.json -3df96cf4eb6eeec0d30ff666207cc8c46084dcea assets/ars_nouveau/models/item/ritual_moonfall.json -1725a459a4898426fdf524ec8615e736d5c29698 assets/ars_nouveau/models/item/ritual_overgrowth.json -a0d589fc56eaa4ccac5aa47616497483a38f88f0 assets/ars_nouveau/models/item/ritual_restoration.json -615a3174d66cd27362557580bd5c7b038e19ce50 assets/ars_nouveau/models/item/ritual_sanctuary.json -637dd800161974725318efcbce9f27008979c5e6 assets/ars_nouveau/models/item/ritual_scrying.json -9356e2e8a4597f27f46e4163df57548435f21338 assets/ars_nouveau/models/item/ritual_sunrise.json -954d4d93e373d1f4e07d59790f3a598ab7e29938 assets/ars_nouveau/models/item/ritual_warping.json -21cd121f04479b877e8a16a66a03d10748eab8c7 assets/ars_nouveau/models/item/ritual_wilden_summon.json -3dbc5ec6fbe1be8fed2933aa64364fd2e16cc313 assets/ars_nouveau/models/item/sconce.json -411417734ff2f7b5588002d7b137e6392a66ce10 assets/ars_nouveau/models/item/smooth_gilded_sourcestone_alternating.json -161f44d81ae019d9a362562e346db08b7db897fa assets/ars_nouveau/models/item/smooth_gilded_sourcestone_alternating_slab.json -7ae1154ca382551351863c64b514cf389ffe7372 assets/ars_nouveau/models/item/smooth_gilded_sourcestone_alternating_stairs.json -d03ed9741339a9aea544333eb10b21c91cf9e4e0 assets/ars_nouveau/models/item/smooth_gilded_sourcestone_basketweave.json -841a376c0d34045db6fb51109a53f9de2454053f assets/ars_nouveau/models/item/smooth_gilded_sourcestone_basketweave_slab.json -5bf70fa3a9a3efe429a93ec8670f49d2576e8659 assets/ars_nouveau/models/item/smooth_gilded_sourcestone_basketweave_stairs.json -45e521e751dd55b7cba0c6b188140ca676e22958 assets/ars_nouveau/models/item/smooth_gilded_sourcestone_large_bricks.json -47de27525062815725133d15de49993e43f96d6b assets/ars_nouveau/models/item/smooth_gilded_sourcestone_large_bricks_slab.json -5a97610be36eddb51c0dbab76268b1e7908828e9 assets/ars_nouveau/models/item/smooth_gilded_sourcestone_large_bricks_stairs.json -1d13f580f532b5ad13e6b997b52ebe3e019607ff assets/ars_nouveau/models/item/smooth_gilded_sourcestone_mosaic.json -8bcb8546099f0ff24b7386056f2e1a9439d16419 assets/ars_nouveau/models/item/smooth_gilded_sourcestone_mosaic_slab.json -d8968291355c073280274e283b2edde6a49c506f assets/ars_nouveau/models/item/smooth_gilded_sourcestone_mosaic_stairs.json -b7e9fda47591eebba119a6088d7676e373d7a71a assets/ars_nouveau/models/item/smooth_gilded_sourcestone_small_bricks.json -e96426ff495c3c5a488fd0c5705848aec822ba67 assets/ars_nouveau/models/item/smooth_gilded_sourcestone_small_bricks_slab.json -17c05f00758175451cbce1723ae7093df35707ad assets/ars_nouveau/models/item/smooth_gilded_sourcestone_small_bricks_stairs.json -32a5eedcdb9d84fa9d5480ee0b9105368cea2d4b assets/ars_nouveau/models/item/smooth_sourcestone.json -37fded6e8a338d8e11ca8f6fd25287947d89fca6 assets/ars_nouveau/models/item/smooth_sourcestone_alternating.json -2a537f21211a03e507d1f70d790b17470e2f3781 assets/ars_nouveau/models/item/smooth_sourcestone_alternating_slab.json -41a0ef6345ebcccb52d9f505636257b192564433 assets/ars_nouveau/models/item/smooth_sourcestone_alternating_stairs.json -758d09c378b1bc5929654b1dca8b08b05242a3ec assets/ars_nouveau/models/item/smooth_sourcestone_basketweave.json -f71ffd937f1b69765271603f84794b491d8581bc assets/ars_nouveau/models/item/smooth_sourcestone_basketweave_slab.json -7fe2c5ef8b790627896b18484c9c7c58b18d0b40 assets/ars_nouveau/models/item/smooth_sourcestone_basketweave_stairs.json -57514403cbe8466c76ddfce26d3abf6efc3e19bf assets/ars_nouveau/models/item/smooth_sourcestone_grate.json -8c50cfe4e081f82f438c0df110939a2917e13c53 assets/ars_nouveau/models/item/smooth_sourcestone_large_bricks.json -2faa92efc5a22484ed4e38fc0cace3100db61e72 assets/ars_nouveau/models/item/smooth_sourcestone_large_bricks_slab.json -da9f27fe432242ef7cc20775a962af384f3c8ea4 assets/ars_nouveau/models/item/smooth_sourcestone_large_bricks_stairs.json -e5231658bf7f72000ed928faead72c2d34a3f9b8 assets/ars_nouveau/models/item/smooth_sourcestone_mosaic.json -cf45679e2952eb1de07d205a1eb8362774620fb7 assets/ars_nouveau/models/item/smooth_sourcestone_mosaic_slab.json -342b37beff08ee9b22e404c4a3831c7704ea1da0 assets/ars_nouveau/models/item/smooth_sourcestone_mosaic_stairs.json -61f876e959a2348863ae453f2053009c4ce3b987 assets/ars_nouveau/models/item/smooth_sourcestone_slab.json -5d4980a4a234354d2195cd6da9cc6a71efa196f8 assets/ars_nouveau/models/item/smooth_sourcestone_small_bricks.json -43615342494eb429314512444d35e2cd50c566c6 assets/ars_nouveau/models/item/smooth_sourcestone_small_bricks_slab.json -7337e37689d7db3ed020e04974c30d0d06c6c366 assets/ars_nouveau/models/item/smooth_sourcestone_small_bricks_stairs.json -1904ab3c884664130d6126629eaaf6ad5960c8b2 assets/ars_nouveau/models/item/smooth_sourcestone_stairs.json -7a6dbdbbeacc27e17ba070cbf5c0658793b9e68a assets/ars_nouveau/models/item/sourceberry_sack.json -4872637ae7f0ea6401d85bfb8e345286ed5438e6 assets/ars_nouveau/models/item/sourcestone.json -e93914b4ab0533dd0fd5062d9010292fe776809f assets/ars_nouveau/models/item/sourcestone_alternating.json -03a4acd44496c433b8d4f5cf63dcf64be720755b assets/ars_nouveau/models/item/sourcestone_alternating_slab.json -be3360cf360f91a63f92fc91cebe45839ad54849 assets/ars_nouveau/models/item/sourcestone_alternating_stairs.json -e14755cd9537696c6c53c2a4f06e389ec24ce325 assets/ars_nouveau/models/item/sourcestone_basketweave.json -bd573dd3910a1b6c42392af7c32bb56e023e483d assets/ars_nouveau/models/item/sourcestone_basketweave_slab.json -90058293228062fee79eca67d0286b8f03707478 assets/ars_nouveau/models/item/sourcestone_basketweave_stairs.json -f714074cacf3eaf5296611f7b04ef08e1c003eb4 assets/ars_nouveau/models/item/sourcestone_grate.json -b889117827370fae1dad4e2ba50b488ce64cd04e assets/ars_nouveau/models/item/sourcestone_large_bricks.json -1848731d5f7e9298bfcfbe78b76cf4e346657e10 assets/ars_nouveau/models/item/sourcestone_large_bricks_slab.json -a0cbe40039bd177a44c304b6f7bc183a44bd1fc3 assets/ars_nouveau/models/item/sourcestone_large_bricks_stairs.json -ae2ea78a62d7da3321ff6e05889e8f44944d7173 assets/ars_nouveau/models/item/sourcestone_mosaic.json -df0fb36e8687177809598e61a39868d2d480f9b1 assets/ars_nouveau/models/item/sourcestone_mosaic_slab.json -39872199db5fd6fec9284ce763a479e80d043341 assets/ars_nouveau/models/item/sourcestone_mosaic_stairs.json -6e7b6129236fc0cc168e468623af052c542fd313 assets/ars_nouveau/models/item/sourcestone_sconce.json -62ca13d333e90786c03a13b3df9a3071db867cb1 assets/ars_nouveau/models/item/sourcestone_slab.json -fad002103bb7ccaea2998a2fe617fcf5fd54d416 assets/ars_nouveau/models/item/sourcestone_small_bricks.json -6ef6a6b58d3b8fbc449f5f376d432eb4a8fb605e assets/ars_nouveau/models/item/sourcestone_small_bricks_slab.json -b476712880e974a70c1fadea694f0d61adb9c291 assets/ars_nouveau/models/item/sourcestone_small_bricks_stairs.json -a7b3f41fce153ebc7540a0dfbe855fc724f521b1 assets/ars_nouveau/models/item/sourcestone_stairs.json -f433c503db1699241353f198a0d427f708716930 assets/ars_nouveau/models/item/source_gem_block.json -456330a19a0028b82be0c6bb1ebe9486b3613a1a assets/ars_nouveau/models/item/source_lamp.json -9d2205eb9012b0585bff4adaf4c02419b2f01d9a assets/ars_nouveau/models/item/spell_sensor.json -63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/ars_nouveau/models/item/starbuncle_se.json -1a921e2809c2a9588e7e8f5fbe4556f5f6729487 assets/ars_nouveau/models/item/stripped_blue_archwood_log.json -1205608f4c722986291eb4255ad2e405715515cf assets/ars_nouveau/models/item/stripped_blue_archwood_wood.json -8cf33c617e9b25c0fe978d8e517ff8f7d03f266f assets/ars_nouveau/models/item/stripped_green_archwood_log.json -9034eac0eab443eea4a19276966a9270a3689341 assets/ars_nouveau/models/item/stripped_green_archwood_wood.json -5819a058a6b539fd3a48ab6ee14f669ea725a8d7 assets/ars_nouveau/models/item/stripped_purple_archwood_log.json -4ce7d7c72442bd77c5fd6836d94093fbe73cb963 assets/ars_nouveau/models/item/stripped_purple_archwood_wood.json -10c29c1b35b6f95b823e92730026cb3fb347025d assets/ars_nouveau/models/item/stripped_red_archwood_log.json -7052178b5c9233f560a337b0c56577e0b93fc686 assets/ars_nouveau/models/item/stripped_red_archwood_wood.json -902ea71b6c0c7979bd27baabb3fbf410e34081f5 assets/ars_nouveau/models/item/thread_amethyst_golem.json -d5ef5427010b136d98f14ef24528e45353df0b18 assets/ars_nouveau/models/item/thread_chilling.json -13f004d67171fee857077cecabf3857783ef7fc3 assets/ars_nouveau/models/item/thread_depths.json -05e26f33a3efb26ee866eeaa60ccc43c0c509555 assets/ars_nouveau/models/item/thread_drygmy.json -8ffdfeb2deea906e44f147f6b1021eefbdabd025 assets/ars_nouveau/models/item/thread_feather.json -bcaf08c0dd4a42d575bef53ef73d60bb982ff66f assets/ars_nouveau/models/item/thread_gliding.json -1b6c772dcd254983d4cb5ba81313bd5708bab868 assets/ars_nouveau/models/item/thread_heights.json -6a126451ee8e4096f972b17ff14fd967eebde6b9 assets/ars_nouveau/models/item/thread_high_step.json -df3e97fbe60e71537e0dde1d851655a37e1732b7 assets/ars_nouveau/models/item/thread_immolation.json -0fdb663aa2aa579ef262aea467ed65837a34c71a assets/ars_nouveau/models/item/thread_kindling.json -8e58b686e89a68da5e24fa505567c4d90aa306f7 assets/ars_nouveau/models/item/thread_life_drain.json -88950df5bdb65890d4bbfde2915908877d5e1a10 assets/ars_nouveau/models/item/thread_magic_capacity.json -a4ffca2412825a4d106ab13934206ffd6fd2b4e8 assets/ars_nouveau/models/item/thread_repairing.json -6e13643cc92a1612116716d442d141ae04ebbaaf assets/ars_nouveau/models/item/thread_spellpower.json -7ecdcabbc52ed76e97ffbbf28e3a20014123b0c5 assets/ars_nouveau/models/item/thread_starbuncle.json -ff97a7b10e755acb82336adf54c9c81694a3261b assets/ars_nouveau/models/item/thread_undying.json -8e336fb8067ed59e2d9b39e3def2a5879dcb27e1 assets/ars_nouveau/models/item/thread_warding.json -2800a160f9fb100881fab9c2431bfc3b2277fe4a assets/ars_nouveau/models/item/thread_whirlisprig.json -b79310281aae70a7aa6af5e3270c5034106dc2a1 assets/ars_nouveau/models/item/thread_wixie.json -51225dd289572d53a0ed0f767380081712411813 assets/ars_nouveau/models/item/vitalic_sourcelink.json -7137ce0392d01860ba8bd7d15c962d4a44d2b390 assets/ars_nouveau/models/item/void_prism.json -49086385023fb8590e80567ae57e7104543ceb0c assets/ars_nouveau/models/item/volcanic_sourcelink.json -63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/ars_nouveau/models/item/whirlisprig_se.json -63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/ars_nouveau/models/item/wilden_guardian_se.json -63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/ars_nouveau/models/item/wilden_hunter_se.json -63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/ars_nouveau/models/item/wilden_stalker_se.json -15996959ddfb148e5e775a865eddb46d16177866 assets/ars_nouveau/models/item/wololo.json -1a84ca1f514d9cf90ecf8384a579b0ea43cb71f8 assets/ars_nouveau/models/item/yellow_sbed.json diff --git a/src/generated/resources/.cache/a5922da861c7ee259705eec42cf3df986f0db576 b/src/generated/resources/.cache/a5922da861c7ee259705eec42cf3df986f0db576 deleted file mode 100644 index e344cec387..0000000000 --- a/src/generated/resources/.cache/a5922da861c7ee259705eec42cf3df986f0db576 +++ /dev/null @@ -1,237 +0,0 @@ -// 1.21.1 2024-09-27T19:20:30.6753948 Block States: ars_nouveau -1b2e60c29cbc9cba57df1e1d0fd9b6f5394b7980 assets/ars_nouveau/blockstates/agronomic_sourcelink.json -d445d0443f46e8aade3134187d121e73d66b8568 assets/ars_nouveau/blockstates/alakarkinos_hat.json -ca9e60aa92a8af0ebf19eb2abd29e68574574b75 assets/ars_nouveau/blockstates/alchemical_sourcelink.json -638796836b1f117aedad8d79ecec507b605c60d3 assets/ars_nouveau/blockstates/archwood_door.json -09093623f66766be51fb83bf905f5fe9328245bd assets/ars_nouveau/blockstates/blue_sbed.json -668e5987c0d339969b44395982a80f7550a018b2 assets/ars_nouveau/blockstates/falseweave.json -f6ee03dee1fe062a043f52b768f765a4d8b82352 assets/ars_nouveau/blockstates/ghostweave.json -9f76c49f3d3a7bc73930fa1b976b1c343a722b7d assets/ars_nouveau/blockstates/gilded_sourcestone_alternating.json -9273f22b35c26a487ac67d99f95bb447f450d35c assets/ars_nouveau/blockstates/gilded_sourcestone_alternating_slab.json -e26a84a5bdfa3d66df88d34635dafdc8b7206132 assets/ars_nouveau/blockstates/gilded_sourcestone_alternating_stairs.json -8fdb2821a93179cef0f7cbd17f3e832d000c48e1 assets/ars_nouveau/blockstates/gilded_sourcestone_basketweave.json -a7c83f827b70953336740e9c2494b382866e48fe assets/ars_nouveau/blockstates/gilded_sourcestone_basketweave_slab.json -e4ca7028bbee72b2cb6bffe54f0fcc2cd2c04249 assets/ars_nouveau/blockstates/gilded_sourcestone_basketweave_stairs.json -377fddfa7b000b983e8fa4a028d9de90481fed2d assets/ars_nouveau/blockstates/gilded_sourcestone_large_bricks.json -5c57c9fd39f638cead3ab1256c30f70db2e96584 assets/ars_nouveau/blockstates/gilded_sourcestone_large_bricks_slab.json -313cd7145c028ebd5bd57dfdf2fb6d0027986b29 assets/ars_nouveau/blockstates/gilded_sourcestone_large_bricks_stairs.json -1b489685bf2c9be32f391df5bc3f1a670ecd9e37 assets/ars_nouveau/blockstates/gilded_sourcestone_mosaic.json -be20dad23aa69af52c091221d1968ef9fa9c40f9 assets/ars_nouveau/blockstates/gilded_sourcestone_mosaic_slab.json -f538a2c82abb1dfe4a7a1f92b0602fb782547e32 assets/ars_nouveau/blockstates/gilded_sourcestone_mosaic_stairs.json -2317103602745b071476e3f17cae6231ca7e23fc assets/ars_nouveau/blockstates/gilded_sourcestone_small_bricks.json -3dea1622db5766c0b5e6dc5d21652d8261449828 assets/ars_nouveau/blockstates/gilded_sourcestone_small_bricks_slab.json -2a75ee83ae624ff804a1be4932247da5ffdb327d assets/ars_nouveau/blockstates/gilded_sourcestone_small_bricks_stairs.json -c0e1bfdef5b5305493754922051e292e1cb9659b assets/ars_nouveau/blockstates/green_sbed.json -d6ac3c7462899d6abba551deb9acbdbf2d515afe assets/ars_nouveau/blockstates/magebloom_block.json -5b7f65045e6d8b3685951b64144b24a81c423f25 assets/ars_nouveau/blockstates/mirrorweave.json -e2e093df31fef1c51780cfc2826dc2a6bcb44bdc assets/ars_nouveau/blockstates/mycelial_sourcelink.json -8363057fb4c3bd154eca0a1f5d93e24dbd234f81 assets/ars_nouveau/blockstates/orange_sbed.json -9f0d064fb386fbd14764681d4ce94cd9100b0e6a assets/ars_nouveau/blockstates/potion_diffuser.json -c511c53e3df625f56d7ed5fe0d451ab93fd484cb assets/ars_nouveau/blockstates/potted_blue_archwood_sapling.json -07341deca84084e762d5be29ae38297fb42a133c assets/ars_nouveau/blockstates/potted_green_archwood_sapling.json -3688a39d8952bfda0410d4209c103f40a48c0e4b assets/ars_nouveau/blockstates/potted_magebloom_crop.json -fdfbed24e64b2867fbe50f10ef6db5e849a70fe1 assets/ars_nouveau/blockstates/potted_purple_archwood_sapling.json -3032d351e50d290b946d266765fa0ece687e2e29 assets/ars_nouveau/blockstates/potted_red_archwood_sapling.json -a7f85eb5567e936f9f5ca621a1cb69e4f4ae75e4 assets/ars_nouveau/blockstates/purple_sbed.json -f541f62381b34f065006919d8dbd51459a90f848 assets/ars_nouveau/blockstates/red_sbed.json -17f78ae9578f848a30ea35fa838361d3b1b37046 assets/ars_nouveau/blockstates/smooth_gilded_sourcestone_alternating.json -33f552c25a4547b26c8b628b93275783612c7266 assets/ars_nouveau/blockstates/smooth_gilded_sourcestone_alternating_slab.json -9c4ec85b6a137f5fd460e92ebeec90cb679570b2 assets/ars_nouveau/blockstates/smooth_gilded_sourcestone_alternating_stairs.json -e9341b43035bcf08768152ab86ce1afc213f02d2 assets/ars_nouveau/blockstates/smooth_gilded_sourcestone_basketweave.json -650820ff8f58ca3b230e3ac576bb9662a31e2cdb assets/ars_nouveau/blockstates/smooth_gilded_sourcestone_basketweave_slab.json -57f4e0a22a03803291f24ed7095828b59ff1aa88 assets/ars_nouveau/blockstates/smooth_gilded_sourcestone_basketweave_stairs.json -c4e8202a47b8a1a9bd60a3dd05e1660808fdfa9d assets/ars_nouveau/blockstates/smooth_gilded_sourcestone_large_bricks.json -980c53127ef4bb855cf5c6999cc920768e3ab80e assets/ars_nouveau/blockstates/smooth_gilded_sourcestone_large_bricks_slab.json -97ac683001a43696396347800e8c62f8d6930efe assets/ars_nouveau/blockstates/smooth_gilded_sourcestone_large_bricks_stairs.json -92cded1d55f5ee0cbc4862040282b2eb33a6f01a assets/ars_nouveau/blockstates/smooth_gilded_sourcestone_mosaic.json -1da7bf29e99d7f37f8cead1f5bd7432111b8cc8d assets/ars_nouveau/blockstates/smooth_gilded_sourcestone_mosaic_slab.json -e551a4cecf708eb5fcb1e0499b67a4f6151a4311 assets/ars_nouveau/blockstates/smooth_gilded_sourcestone_mosaic_stairs.json -970b1aa43a1381fa520e9575f51ded7cf196d36d assets/ars_nouveau/blockstates/smooth_gilded_sourcestone_small_bricks.json -b69aa016d9537dedae2d753889d074f6aeafa54d assets/ars_nouveau/blockstates/smooth_gilded_sourcestone_small_bricks_slab.json -bd5f84b8830ee176c58daef8769a26424f36ae01 assets/ars_nouveau/blockstates/smooth_gilded_sourcestone_small_bricks_stairs.json -cc4099cc4f2e0f95885ab8b9ae873777349b35b2 assets/ars_nouveau/blockstates/smooth_sourcestone.json -d49e441265aa5b5b0e7cd3fff59ac48386c5c3b5 assets/ars_nouveau/blockstates/smooth_sourcestone_alternating.json -2b088836f45c2ff94f3e3905e3b21c48e6a1b3ea assets/ars_nouveau/blockstates/smooth_sourcestone_alternating_slab.json -66794a18537fc2cd2614b84d5dd6934b3b02ae45 assets/ars_nouveau/blockstates/smooth_sourcestone_alternating_stairs.json -fd8d1bdae5acc610eea4cffff6e1f32d12186a82 assets/ars_nouveau/blockstates/smooth_sourcestone_basketweave.json -271cdb46e2d5f1d0d80ec06fc2831044e4463321 assets/ars_nouveau/blockstates/smooth_sourcestone_basketweave_slab.json -85ad8201730469d1ba246232ef57dcf7e84af3de assets/ars_nouveau/blockstates/smooth_sourcestone_basketweave_stairs.json -f7ce712d8fd77864d4b42f3ff75cce264663536d assets/ars_nouveau/blockstates/smooth_sourcestone_large_bricks.json -a1f84dd477c836df1523b47c402f70b0de9be6b9 assets/ars_nouveau/blockstates/smooth_sourcestone_large_bricks_slab.json -fe8725318dcefcafec4013ce6847c4ba4df6723b assets/ars_nouveau/blockstates/smooth_sourcestone_large_bricks_stairs.json -e14749d55def0f1259d0d2102dbf525040920cbb assets/ars_nouveau/blockstates/smooth_sourcestone_mosaic.json -9a8a3b8f69ccad81d59070d051eb0275c8cd344f assets/ars_nouveau/blockstates/smooth_sourcestone_mosaic_slab.json -df4424e7348fdc926374495878007d4d2ab473b2 assets/ars_nouveau/blockstates/smooth_sourcestone_mosaic_stairs.json -980d3c73f6a4dddd9e521fcc7b92a7ddd82de433 assets/ars_nouveau/blockstates/smooth_sourcestone_slab.json -889e728cad95d448d91ef932f4020f28a1c85554 assets/ars_nouveau/blockstates/smooth_sourcestone_small_bricks.json -038a4bbcd7e18c421a5819b02db203d27133109f assets/ars_nouveau/blockstates/smooth_sourcestone_small_bricks_slab.json -36f0662f4897806c7624e94db3b9de51fcd9de6d assets/ars_nouveau/blockstates/smooth_sourcestone_small_bricks_stairs.json -ca77b4e908f868435eb4bbd74a2d678ab0d4c1dd assets/ars_nouveau/blockstates/smooth_sourcestone_stairs.json -c7b0f0d05d16af4b6bffd222340f3dce64c4967c assets/ars_nouveau/blockstates/sourcestone.json -88511948326140158fc4c2133d655dd36bdd5c9a assets/ars_nouveau/blockstates/sourcestone_alternating.json -cfe3eea5d1cda445fedf592e4d9a2a59cf8ee4f6 assets/ars_nouveau/blockstates/sourcestone_alternating_slab.json -f67167839e178c8e8cc81caac2260784d2949bac assets/ars_nouveau/blockstates/sourcestone_alternating_stairs.json -feddd8e9a42b5eca88f840cd58465747e56c092d assets/ars_nouveau/blockstates/sourcestone_basketweave.json -2daa37056678743f51ff539e58d6bad229973bbf assets/ars_nouveau/blockstates/sourcestone_basketweave_slab.json -96f1f2c4021d1561a28ea90db93a503377a66df0 assets/ars_nouveau/blockstates/sourcestone_basketweave_stairs.json -b5fb6842d07eeec18fa78f251e4c35d80c26ca73 assets/ars_nouveau/blockstates/sourcestone_large_bricks.json -ca17c46b113688b6ab9852f3f239a1c55709e82f assets/ars_nouveau/blockstates/sourcestone_large_bricks_slab.json -e784fe1244c9ba8424e1a898fb4dc695253fbdbc assets/ars_nouveau/blockstates/sourcestone_large_bricks_stairs.json -653b4d1652b3b301b3f8668a997e828e83aad340 assets/ars_nouveau/blockstates/sourcestone_mosaic.json -6b50fa8702a726e7e27fa350e4773ca6577d80d2 assets/ars_nouveau/blockstates/sourcestone_mosaic_slab.json -9b85f28abf61e19deb65019b5548e7f94c775f67 assets/ars_nouveau/blockstates/sourcestone_mosaic_stairs.json -3082e13e3add22310db78081d3c9ade6698de6a0 assets/ars_nouveau/blockstates/sourcestone_slab.json -0b9e57fe3b71fb6564e2a3ac68bd7df2832a417f assets/ars_nouveau/blockstates/sourcestone_small_bricks.json -2b58b2de9653f4372523aa1cf792cc43a80d5ac7 assets/ars_nouveau/blockstates/sourcestone_small_bricks_slab.json -0ae9eb7ef21f99e854f70c1009d7c8b95b99e514 assets/ars_nouveau/blockstates/sourcestone_small_bricks_stairs.json -ae396dee982e060191ac6792de5dc83de6dc9f69 assets/ars_nouveau/blockstates/sourcestone_stairs.json -a9f5d436ff3fac4f112eb726e491876c32bcfdaf assets/ars_nouveau/blockstates/source_gem_block.json -a8bf716c019e9200936a9b8d3dab96dd4f73b06c assets/ars_nouveau/blockstates/vitalic_sourcelink.json -b52aaf46129c1616adb12277717a8c00203a5eb4 assets/ars_nouveau/blockstates/void_prism.json -d18ede1b00d2c30d906e15d15e80b98a9cc6fe84 assets/ars_nouveau/blockstates/volcanic_sourcelink.json -6e678774dd73b39e97b07e0b389097e15a4f0583 assets/ars_nouveau/blockstates/yellow_sbed.json -efde21e840543c8ac4846328db6ee8fac6d7365f assets/ars_nouveau/models/block/archwood_door_door_bottom_left.json -2a941fbdbac517a78c34ff08aeec5edd61b89c3c assets/ars_nouveau/models/block/archwood_door_door_bottom_left_open.json -56c27b3ccb1e5bf7fcc53b5bd3fa162c73dc5b38 assets/ars_nouveau/models/block/archwood_door_door_bottom_right.json -a5a7518a42a2415145b33176d9ebc2049971401f assets/ars_nouveau/models/block/archwood_door_door_bottom_right_open.json -d48ca3c31fad5489d588d4d19c62456d088bf037 assets/ars_nouveau/models/block/archwood_door_door_top_left.json -69408f39ea7a0f4b9f002935a264f9a988a1f0ad assets/ars_nouveau/models/block/archwood_door_door_top_left_open.json -68108981e8f2a3fb69eb42a73c26bf08c42e29c6 assets/ars_nouveau/models/block/archwood_door_door_top_right.json -48b1db32c58637ec2c82e05081aa2da270b42a0d assets/ars_nouveau/models/block/archwood_door_door_top_right_open.json -e468da53a293b84ee8b20371f682ff7000c695eb assets/ars_nouveau/models/block/falseweave.json -13aa521a64379f523313827fabd3d5214dfb6d6a assets/ars_nouveau/models/block/ghostweave.json -10c81f0efb55138a6d26e15a00eb202e0bbb68c9 assets/ars_nouveau/models/block/gilded_sourcestone_alternating.json -5cef4f5be9f359866b20510b61ca6609cb5eb7dc assets/ars_nouveau/models/block/gilded_sourcestone_alternating_slab.json -de4939c35887aeb77c0e0868a044b010b7de3b99 assets/ars_nouveau/models/block/gilded_sourcestone_alternating_slab_top.json -dd1b192943b90930830b87138d244450f9cfc310 assets/ars_nouveau/models/block/gilded_sourcestone_alternating_stairs.json -9be0d733341bdd9b656a04bd0c45490c726ad962 assets/ars_nouveau/models/block/gilded_sourcestone_alternating_stairs_inner.json -fc22cf16644bd4bd39241049d0fa0622ebac6452 assets/ars_nouveau/models/block/gilded_sourcestone_alternating_stairs_outer.json -912bf00b16423b1ccd7f77a12e9bc56049adecd4 assets/ars_nouveau/models/block/gilded_sourcestone_basketweave.json -ac78e214c0effdb1109f029365921f0bd7215da6 assets/ars_nouveau/models/block/gilded_sourcestone_basketweave_slab.json -0f24214d148321e793270cedc4f45c0bca849564 assets/ars_nouveau/models/block/gilded_sourcestone_basketweave_slab_top.json -6d998b0015fc21522272a0bdd7eb96671b2748a2 assets/ars_nouveau/models/block/gilded_sourcestone_basketweave_stairs.json -e1012867eec14211b916ae2b85f3d88f0d34b853 assets/ars_nouveau/models/block/gilded_sourcestone_basketweave_stairs_inner.json -fa1f0a0d31bc96501a7738010ab0dde7430520bc assets/ars_nouveau/models/block/gilded_sourcestone_basketweave_stairs_outer.json -002cb3904ba51f8e51860761b111dbea9ab9900b assets/ars_nouveau/models/block/gilded_sourcestone_large_bricks.json -a18699605facb3e029d968a7e5ecdbd37de462ef assets/ars_nouveau/models/block/gilded_sourcestone_large_bricks_slab.json -82f83ee19247d8c5e7162d5ae2c3406fc8a1d6ae assets/ars_nouveau/models/block/gilded_sourcestone_large_bricks_slab_top.json -80f37882f100b4e8b3548cb3d5843a9c93742a3b assets/ars_nouveau/models/block/gilded_sourcestone_large_bricks_stairs.json -dc01df0af0fe34984fda2289492573354a785b5a assets/ars_nouveau/models/block/gilded_sourcestone_large_bricks_stairs_inner.json -a0c6afb09c96a46006e89551c534012619956a71 assets/ars_nouveau/models/block/gilded_sourcestone_large_bricks_stairs_outer.json -84f873db523a0f60b5b1b8677167804a9ec7b62d assets/ars_nouveau/models/block/gilded_sourcestone_mosaic.json -6511d47f2cef553ffbea32a789c50ded8d48734d assets/ars_nouveau/models/block/gilded_sourcestone_mosaic_slab.json -3cca207a76344eb637da64fc89dcde3c103b164b assets/ars_nouveau/models/block/gilded_sourcestone_mosaic_slab_top.json -10733efae22550d1e3ff6cfa7c4408ba8df3e287 assets/ars_nouveau/models/block/gilded_sourcestone_mosaic_stairs.json -62e08da9fcf9e47c312d8ddd2027764d6aac3c8b assets/ars_nouveau/models/block/gilded_sourcestone_mosaic_stairs_inner.json -3538fd934028d58962bc26c5cd896ddcddcb0d0b assets/ars_nouveau/models/block/gilded_sourcestone_mosaic_stairs_outer.json -7cc356685c5bc6a62179278025c34dc5b89d7135 assets/ars_nouveau/models/block/gilded_sourcestone_small_bricks.json -017b2b7ac93525e8ce7d815387e7d5132c99ee08 assets/ars_nouveau/models/block/gilded_sourcestone_small_bricks_slab.json -68ad6a0c3440356dff4701cad338267f69264ab0 assets/ars_nouveau/models/block/gilded_sourcestone_small_bricks_slab_top.json -265ff51f0f41035b30e7021b3413aa17a147ef11 assets/ars_nouveau/models/block/gilded_sourcestone_small_bricks_stairs.json -58a6b32ea349dda7aaa7f26339767afb3ddfd050 assets/ars_nouveau/models/block/gilded_sourcestone_small_bricks_stairs_inner.json -2f67429363bd26c685f80397a2729f4f400845cd assets/ars_nouveau/models/block/gilded_sourcestone_small_bricks_stairs_outer.json -bdd936b5c44d52a85d3483ffa2f26170f3a35ce1 assets/ars_nouveau/models/block/magebloom_block.json -3a3c2d5b8941d81f4893d7d4fa2b2f438d925a03 assets/ars_nouveau/models/block/mirrorweave.json -d36499980b289301ddd7034e6ede1e168580ff7e assets/ars_nouveau/models/block/smooth_gilded_sourcestone_alternating.json -c1794bec57fc0970ddd8d6c8f9547bfa1176ad31 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_alternating_slab.json -d9a9e38831799aba555a11aea51bbbd7267faa4f assets/ars_nouveau/models/block/smooth_gilded_sourcestone_alternating_slab_top.json -992bf4bd3ce61a4b35a1475a60c29985cf66cd4d assets/ars_nouveau/models/block/smooth_gilded_sourcestone_alternating_stairs.json -bf419f4731dec356fba9be23aa2bfcb471e7e2e8 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_alternating_stairs_inner.json -434a0674ae2fe1aa4a19184683e4f14078aecc49 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_alternating_stairs_outer.json -bbe3f2feb3d7027e63098a99f5976e96c39f6bd3 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_basketweave.json -8bb64ba97c982cf9714357bf43d1788a83e19046 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_basketweave_slab.json -b8c7442c2d29ddaee24df19f888d73b08945b4b1 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_basketweave_slab_top.json -ca21d03db0f92bfcaeab0259e4b429468ff60708 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_basketweave_stairs.json -fd530cdb43640006b249fe39c837db1523399416 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_basketweave_stairs_inner.json -9a427d5f5a9a13582107ee62dd2540cc23a2026a assets/ars_nouveau/models/block/smooth_gilded_sourcestone_basketweave_stairs_outer.json -4d1efb24106f7dbeedf76dad59c7d421254f98e9 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_large_bricks.json -b8647157e845ef897c2ed9c5c71df648a3b359b6 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_large_bricks_slab.json -2f6d77442273095902f0247151ea3b20c140e0ee assets/ars_nouveau/models/block/smooth_gilded_sourcestone_large_bricks_slab_top.json -0e26fd0504736e77e4e644be0a5c09e5c02ede02 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_large_bricks_stairs.json -8e3cfcf60d1dcf1ac56d489e716ddc5de73e3cd2 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_large_bricks_stairs_inner.json -c7f26a8913498afa7a312e7c9c8011952684f650 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_large_bricks_stairs_outer.json -4ef4a730920aabd1b7d48088c463f52a2563f804 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_mosaic.json -3df990d298c0f3b7f7da96f79a80dc91ddb8c644 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_mosaic_slab.json -895356a07964ef1df29b80b3ca0ae95a7c907924 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_mosaic_slab_top.json -705ce38a9c423a4f607e659038abf89398609240 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_mosaic_stairs.json -3ffa25a21bd3d3609f0e81792a7cd88bc08bcd39 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_mosaic_stairs_inner.json -b8d36932b0f6bc5028e6e55935acb0dacba67858 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_mosaic_stairs_outer.json -5655de87ffad8c34d81a18a4eb65cf80204bb796 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_small_bricks.json -d4ac19017762fd47a7120e3ad9d0a4f99c8b6b59 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_small_bricks_slab.json -122aa5223f813381b80f9c90166e463c2c201e57 assets/ars_nouveau/models/block/smooth_gilded_sourcestone_small_bricks_slab_top.json -d1ac886ad28615713136389a6c8f20028a5dd21b assets/ars_nouveau/models/block/smooth_gilded_sourcestone_small_bricks_stairs.json -c22a0afa6112a8c34fddd882d142e8c37a029d0f assets/ars_nouveau/models/block/smooth_gilded_sourcestone_small_bricks_stairs_inner.json -67ab5bf7c822f98d9b171849f2f87fac38847d4c assets/ars_nouveau/models/block/smooth_gilded_sourcestone_small_bricks_stairs_outer.json -0426f54b93ab7fcc9cf17e8264d194ee71ca7ae1 assets/ars_nouveau/models/block/smooth_sourcestone.json -99a51e49851254991545b73c9e2e7c8fc374e3ef assets/ars_nouveau/models/block/smooth_sourcestone_alternating.json -761c78646a046e669d1bd19ab4cbfbb20565f5c0 assets/ars_nouveau/models/block/smooth_sourcestone_alternating_slab.json -76a4a73f2a809fe8b20fdfcc8980407b1463d61b assets/ars_nouveau/models/block/smooth_sourcestone_alternating_slab_top.json -3c8ac071d573e0d53ad276b6df3defabd9671e91 assets/ars_nouveau/models/block/smooth_sourcestone_alternating_stairs.json -5df5967746da8d4cbcfd56007ff081f1fe078a4f assets/ars_nouveau/models/block/smooth_sourcestone_alternating_stairs_inner.json -7f7c44f2ec241ab16570796263dce3734458c94a assets/ars_nouveau/models/block/smooth_sourcestone_alternating_stairs_outer.json -1a3e9f880dcb66f5e837b1298b3f0b956411c00a assets/ars_nouveau/models/block/smooth_sourcestone_basketweave.json -74b50236f3fcca83f55c8f4a2baa31dbe9eb3473 assets/ars_nouveau/models/block/smooth_sourcestone_basketweave_slab.json -6f7afb0ab8bcf86d44f5a8005a53b34f13a95e78 assets/ars_nouveau/models/block/smooth_sourcestone_basketweave_slab_top.json -31f103c6044b67309296d2af1690775af6a021e5 assets/ars_nouveau/models/block/smooth_sourcestone_basketweave_stairs.json -b3db2a779428f41db788731620215a2c09fd9432 assets/ars_nouveau/models/block/smooth_sourcestone_basketweave_stairs_inner.json -746e747561696221e27a2b5a8852a09d4009ba71 assets/ars_nouveau/models/block/smooth_sourcestone_basketweave_stairs_outer.json -b171977c145a15d6112f9b62c099d2e37183df3e assets/ars_nouveau/models/block/smooth_sourcestone_large_bricks.json -1e2dd8844c027aeea9ec9a812595e18949ae0462 assets/ars_nouveau/models/block/smooth_sourcestone_large_bricks_slab.json -1090df2c79931c91e68add2a767b053cb62f4501 assets/ars_nouveau/models/block/smooth_sourcestone_large_bricks_slab_top.json -9680b165ed297f82c2989459cb554d10df06694d assets/ars_nouveau/models/block/smooth_sourcestone_large_bricks_stairs.json -3d3873219414421fd447bc4876b4fcb48d69a771 assets/ars_nouveau/models/block/smooth_sourcestone_large_bricks_stairs_inner.json -21995a116612587f9206c0bc6a7e6f709dd825c2 assets/ars_nouveau/models/block/smooth_sourcestone_large_bricks_stairs_outer.json -3a360fcdf1d6470d8468928f27e4b7774c2e57b0 assets/ars_nouveau/models/block/smooth_sourcestone_mosaic.json -743632d91cf4579631fd28a3fe7a6d5b4d2ed719 assets/ars_nouveau/models/block/smooth_sourcestone_mosaic_slab.json -00996d5b165ba3b0b505d94b9c4c50aeb483141b assets/ars_nouveau/models/block/smooth_sourcestone_mosaic_slab_top.json -38e95c7e183adff9679e653b5f87e4c8a7829cf1 assets/ars_nouveau/models/block/smooth_sourcestone_mosaic_stairs.json -3cee755e593103c0ff01cbfcf52f2213a56711b1 assets/ars_nouveau/models/block/smooth_sourcestone_mosaic_stairs_inner.json -aba896b07272778dd4dd43aa4bc1700d3f2fb18b assets/ars_nouveau/models/block/smooth_sourcestone_mosaic_stairs_outer.json -27bf2f6a62105a77d2d8f8ccdeaff8f3559182c1 assets/ars_nouveau/models/block/smooth_sourcestone_slab.json -48d5cbc92506a2172b111ef79b1e21f46d554a9b assets/ars_nouveau/models/block/smooth_sourcestone_slab_top.json -6a5a692644af2954b6a811712a8fe8ac8664817c assets/ars_nouveau/models/block/smooth_sourcestone_small_bricks.json -0d1ef9780ded5d2666bf74d2fd94f4dbf582f301 assets/ars_nouveau/models/block/smooth_sourcestone_small_bricks_slab.json -182956321c5d676fc7706cd330c62c150887a073 assets/ars_nouveau/models/block/smooth_sourcestone_small_bricks_slab_top.json -86b76906c293fa1cb89be95ad4ba6329a70393be assets/ars_nouveau/models/block/smooth_sourcestone_small_bricks_stairs.json -60a7579317b2171cabe997fe440f9454ea8129fa assets/ars_nouveau/models/block/smooth_sourcestone_small_bricks_stairs_inner.json -2de300b2e941a4a9b9f9e885488249268f8346a5 assets/ars_nouveau/models/block/smooth_sourcestone_small_bricks_stairs_outer.json -76be328669cad0a3d18f774ef1b516672db20ef0 assets/ars_nouveau/models/block/smooth_sourcestone_stairs.json -ad53d6c4d9136ab3ea6c26068fcbd0722fd2d8e2 assets/ars_nouveau/models/block/smooth_sourcestone_stairs_inner.json -274043134e05c9d25d816e2205ea499cf4dc9ed4 assets/ars_nouveau/models/block/smooth_sourcestone_stairs_outer.json -d2be2b984220b20a5105391a0cab75d6769a5c23 assets/ars_nouveau/models/block/sourcestone.json -362e92931ca2053c373b62a8afdeaa776de32cb4 assets/ars_nouveau/models/block/sourcestone_alternating.json -f8844e401cc4ddb550fa5e844a4b27f5d78eb4d4 assets/ars_nouveau/models/block/sourcestone_alternating_slab.json -3933c8123a85eef2734a6f726c49408da8794b57 assets/ars_nouveau/models/block/sourcestone_alternating_slab_top.json -679b5a7dfeae8ec160209c10439985128edfc837 assets/ars_nouveau/models/block/sourcestone_alternating_stairs.json -b2dcba30fe9298203a142e552816e2bcfd8bab3d assets/ars_nouveau/models/block/sourcestone_alternating_stairs_inner.json -6c0c9aded2fa8f75c5fedd75fb009ca4bd11d2f2 assets/ars_nouveau/models/block/sourcestone_alternating_stairs_outer.json -03e107e2211331ff71c596d89df2abec4cec96b6 assets/ars_nouveau/models/block/sourcestone_basketweave.json -83816e3677376c3bf0bfe3ed94ea1b290ee62779 assets/ars_nouveau/models/block/sourcestone_basketweave_slab.json -8ee8b3dfeabd1295ea84ff942754f5b4880c11ce assets/ars_nouveau/models/block/sourcestone_basketweave_slab_top.json -1844080c4fba6d5bd4bfced9f4f673a9e7a1c78e assets/ars_nouveau/models/block/sourcestone_basketweave_stairs.json -c115173d185838a36d8b012edf41814c93ae2972 assets/ars_nouveau/models/block/sourcestone_basketweave_stairs_inner.json -2a8632d230734555c0fe20869e93c46dfba8bdfc assets/ars_nouveau/models/block/sourcestone_basketweave_stairs_outer.json -f158d9eef7ec1d0a77aa337b5d5fd0e97ad0a6de assets/ars_nouveau/models/block/sourcestone_large_bricks.json -df27b739f2257b3e0381e564d2b1bdc295df086a assets/ars_nouveau/models/block/sourcestone_large_bricks_slab.json -05d4d29634e4795cda136dc6f2f39628147eab1d assets/ars_nouveau/models/block/sourcestone_large_bricks_slab_top.json -5a120e96db6f1335a54b0f934525de57cfb35a25 assets/ars_nouveau/models/block/sourcestone_large_bricks_stairs.json -822120cf221ca67f86128f3e3df575df8eafaeb2 assets/ars_nouveau/models/block/sourcestone_large_bricks_stairs_inner.json -47470859582c205770121140bbe23014e43893df assets/ars_nouveau/models/block/sourcestone_large_bricks_stairs_outer.json -e9f1c81d0947a8e728dc238a6e12a8597264d821 assets/ars_nouveau/models/block/sourcestone_mosaic.json -d221b18610af785de9a5e339c3683474b949985f assets/ars_nouveau/models/block/sourcestone_mosaic_slab.json -50af3ea0fccd8386f0a4bd64dfb47e0a857841dd assets/ars_nouveau/models/block/sourcestone_mosaic_slab_top.json -bdfe7a07fb083ced2ddaac8ecd9ecca9ef1deacb assets/ars_nouveau/models/block/sourcestone_mosaic_stairs.json -0890f21d8bc4bf4068668dab0452c4578265e412 assets/ars_nouveau/models/block/sourcestone_mosaic_stairs_inner.json -f20933032b3d5bd4de9f0c3c4ccac25f2fa53079 assets/ars_nouveau/models/block/sourcestone_mosaic_stairs_outer.json -995432305a0df2d0711f03140cb54068a6c396c2 assets/ars_nouveau/models/block/sourcestone_slab.json -3527e557e3de28529c381a696c26df8aa693f6ee assets/ars_nouveau/models/block/sourcestone_slab_top.json -b9c2693e1881d1b09f9b095ecc03c9ad7e138a89 assets/ars_nouveau/models/block/sourcestone_small_bricks.json -e4657c3733a79f262af4b2d2d954d0ca12cd4503 assets/ars_nouveau/models/block/sourcestone_small_bricks_slab.json -77ca3303b173b33fe7f07f38b9dc8f08be17f8e9 assets/ars_nouveau/models/block/sourcestone_small_bricks_slab_top.json -3442416f7b3ef10ff3ba644260e0b2f942353659 assets/ars_nouveau/models/block/sourcestone_small_bricks_stairs.json -e573158bdcfc5bf8903b4386d349e362b7a08392 assets/ars_nouveau/models/block/sourcestone_small_bricks_stairs_inner.json -41f8a5d234bbddb140fe992f66623f2f9b96f1fa assets/ars_nouveau/models/block/sourcestone_small_bricks_stairs_outer.json -e83352513a2bffed410e7b69ffd777779cc11cba assets/ars_nouveau/models/block/sourcestone_stairs.json -bceb92ea30608fef50b3ee1abc511568a81eb53c assets/ars_nouveau/models/block/sourcestone_stairs_inner.json -b532f1b3bfa9eb24d760ff0c05884f3db34c1471 assets/ars_nouveau/models/block/sourcestone_stairs_outer.json -f254702fe5be7e4b7b3c575caf41d4a74567da59 assets/ars_nouveau/models/block/void_prism.json diff --git a/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc b/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc deleted file mode 100644 index 89077780ad..0000000000 --- a/src/generated/resources/.cache/abe0934abf823d33d3e88ae408c1d215f03f6bdc +++ /dev/null @@ -1,2 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.1896081 Budding Conversion Datagen -bc1af13edf233755680b29b8951ea6dc71e98707 data/ars_nouveau/recipe/budding_conversion/budding_amethyst.json diff --git a/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 b/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 deleted file mode 100644 index 2f3b077dac..0000000000 --- a/src/generated/resources/.cache/af617d50f86666f21b24a8919c1c50aad8faa4f8 +++ /dev/null @@ -1,14 +0,0 @@ -// 1.21.1 2024-10-16T21:01:35.2873963 Imbuement -d8ef9562f603943cf768422fb009c9ec77d7dc65 data/ars_nouveau/recipe/imbuement_abjuration_essence.json -98efa28dfca47cd27a0e31e89208825c7e320e61 data/ars_nouveau/recipe/imbuement_air_essence.json -6d57a8685026b987a6012bb592cf26c3dba0e89c data/ars_nouveau/recipe/imbuement_amethyst.json -5bce1f0b9b92a9acdf9b856dfccd8ff4fb933c67 data/ars_nouveau/recipe/imbuement_amethyst_block.json -82af4f7ca94590a4c01cbc4e7ab7524f6b603ed9 data/ars_nouveau/recipe/imbuement_amplify_arrow.json -4b3e5edb67c9661e999ef3aa56b07330d78052c0 data/ars_nouveau/recipe/imbuement_conjuration_essence.json -71640142f8e3f340f1b4078e7a3e8fcbbbe232a9 data/ars_nouveau/recipe/imbuement_earth_essence.json -bb798f4b25b7a191edb246e9122dd5756c83fa7c data/ars_nouveau/recipe/imbuement_fire_essence.json -6ba22e7cf702e9be5ff66d6b28f62a61639679ce data/ars_nouveau/recipe/imbuement_lapis.json -7823618d4052b659f3cbb2036a28e098d263d5ae data/ars_nouveau/recipe/imbuement_manipulation_essence.json -4c1e38069e88502d94768dae302127da9f8efbfd data/ars_nouveau/recipe/imbuement_pierce_arrow.json -7103454e5168ee74e4e2363a76d8c94733b90433 data/ars_nouveau/recipe/imbuement_split_arrow.json -adbed7df2e908a20415400f5e5d86a20d4f2fe42 data/ars_nouveau/recipe/imbuement_water_essence.json diff --git a/src/generated/resources/.cache/b7d20159a598c550a793f4787d1e0a9f9d0b61c6 b/src/generated/resources/.cache/b7d20159a598c550a793f4787d1e0a9f9d0b61c6 deleted file mode 100644 index fa6d3c066a..0000000000 --- a/src/generated/resources/.cache/b7d20159a598c550a793f4787d1e0a9f9d0b61c6 +++ /dev/null @@ -1,7 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.1941224 Curios for ars_nouveau -a515afa522bcbf0b8b05736bae63a9af4054cf26 data/ars_nouveau/curios/entities/an_curios.json -84db829ff6895b514af66069168752d2bc107a02 data/ars_nouveau/curios/slots/an_focus.json -240e1f476f220fc486f85d0132786a1374faaa46 data/ars_nouveau/curios/slots/belt.json -240e1f476f220fc486f85d0132786a1374faaa46 data/ars_nouveau/curios/slots/head.json -240e1f476f220fc486f85d0132786a1374faaa46 data/ars_nouveau/curios/slots/necklace.json -73c12c96c060bd6e4fc4f3fd712b76dce176a840 data/ars_nouveau/curios/slots/ring.json diff --git a/src/generated/resources/.cache/c03ccd0f93606faadfab316dc8aedf1ba96c844a b/src/generated/resources/.cache/c03ccd0f93606faadfab316dc8aedf1ba96c844a deleted file mode 100644 index 570a5bf8d6..0000000000 --- a/src/generated/resources/.cache/c03ccd0f93606faadfab316dc8aedf1ba96c844a +++ /dev/null @@ -1,3 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.1632562 Tags for minecraft:enchantment mod id ars_nouveau -e654e32b0c3eb36d0912b1f29ad16fa0429c826f data/minecraft/tags/enchantment/non_treasure.json -e654e32b0c3eb36d0912b1f29ad16fa0429c826f data/minecraft/tags/enchantment/tradeable.json diff --git a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 b/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 deleted file mode 100644 index 6ca9a5901b..0000000000 --- a/src/generated/resources/.cache/cdae075e2d4d58384fe4d2075f6d5323fe5baa69 +++ /dev/null @@ -1,33 +0,0 @@ -// 1.21.1 2024-11-24T22:12:56.6409296 Ars Nouveau Caster Tomes Datagen -ab9cf50e4958592dcee6f5dae6d6bad2e7fe08ab data/ars_nouveau/recipe/tomes/alex_tome.json -dae41a867bde9258624fe4676128e8140f2e7fe4 data/ars_nouveau/recipe/tomes/arachne_tome.json -71e004bfa5837d293c6ee00dd9fd99493b9b9aba data/ars_nouveau/recipe/tomes/aurellia_tome.json -2027d79f560de6a1a7829a478f64ccd8f1723bc2 data/ars_nouveau/recipe/tomes/bailey_tome.json -0be05276a18b4cac328dc05898e560b28f7e3a31 data/ars_nouveau/recipe/tomes/chems_tome.json -d975f667f8c7de86a8fc5dcc4cc2d07e4ff38096 data/ars_nouveau/recipe/tomes/chosenarchitect_tome.json -19564f80b5f660f4e472b2fab542e98a71c9b108 data/ars_nouveau/recipe/tomes/crowdrone_tome.json -e9b37b1592c51345f27cd0571a12a373a469be73 data/ars_nouveau/recipe/tomes/darkfira_tome.json -3c4d9ad61832042e38046f7763047126dbc320a0 data/ars_nouveau/recipe/tomes/farfalla_tome.json -f64772fb96f68b7865f64ee40a8718e1a2412fce data/ars_nouveau/recipe/tomes/fireball_tome.json -47410afb03915eaf6626f6cbfb872b647c9ea826 data/ars_nouveau/recipe/tomes/glow_tome.json -787770b1ff09200b5f0b8ad6b30236f532ed7687 data/ars_nouveau/recipe/tomes/gootastic_tome.json -fa2eefd9631a78bf8c31e4c9aad34a2517bb9736 data/ars_nouveau/recipe/tomes/ivy_tome.json -488adf82fa89d69891e333e9bb94290f8ff6b6b1 data/ars_nouveau/recipe/tomes/kirin_tome.json -43d839ec049575b8c5a5cff6c6c7ff9f2605994c data/ars_nouveau/recipe/tomes/lufia_tome.json -9836505724bc647ab6d1f92f212ad618456c878c data/ars_nouveau/recipe/tomes/lyrellion_tome.json -9cdb7fe0028ff63dddcb16992aad8233a111da3c data/ars_nouveau/recipe/tomes/mystifi_tome.json -d7ff05ccece42ac8ee440c7ef0d707e7c3f7e78b data/ars_nouveau/recipe/tomes/othy_tome.json -119ae572bc9a0f96c350bc53454d0919f0de75d3 data/ars_nouveau/recipe/tomes/plauged757_tome.json -b7b6cc3145b830c0e936f67d3aec459142c85a2c data/ars_nouveau/recipe/tomes/poseidon_tome.json -2a0f47cc40a8be0d2cd08db1a457463b10ed3cf9 data/ars_nouveau/recipe/tomes/renew_rune_tome.json -f50e62b11676774b3822a8cbd7acf1b0efe8df85 data/ars_nouveau/recipe/tomes/shadow_tome.json -a2701c983e0c938a26238d7707a1342cfb74d209 data/ars_nouveau/recipe/tomes/silvanus_tome.json -605a531f2ec2283e77813a283433ff7e10be8340 data/ars_nouveau/recipe/tomes/spinoftw_tome.json -f9bd322e0480d9727fb8b5286163370b3d6f9f3c data/ars_nouveau/recipe/tomes/takeoff_tome.json -d709ea8b46d9d67ee0095740a84645f80e5e1260 data/ars_nouveau/recipe/tomes/toxin_tome.json -966bfe77dcd335285472bd8b7a1b07e88555fd14 data/ars_nouveau/recipe/tomes/uni_tome.json -902b87a75b3feb454c214088587be3aacf8974a5 data/ars_nouveau/recipe/tomes/vault_tome.json -04a2e3eb1f94ccad819d6f6cf49a6b1e23e6ab1b data/ars_nouveau/recipe/tomes/warp_impact_tome.json -f854283682fc7abb17dc158e8383073b07ae96f0 data/ars_nouveau/recipe/tomes/xacris_2_tome.json -4b725a8d4df69200a345a12a58e432979883470e data/ars_nouveau/recipe/tomes/xacris_tome.json -61ac4334cc4de3037b7e803112439361f8d7800d data/ars_nouveau/recipe/tomes/yeet_tome.json diff --git a/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 b/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 deleted file mode 100644 index 61b14ef544..0000000000 --- a/src/generated/resources/.cache/d0c924a870929ce1baf161c329e85242236b3530 +++ /dev/null @@ -1,17 +0,0 @@ -// 1.21.1 2024-11-06T20:55:11.216698 Tags for minecraft:entity_type mod id ars_nouveau -4d0235b95823f5d315aae7e9f9e484cbde8294a0 data/ars_nouveau/tags/entity_type/animal_summon_blacklist.json -a958530eef4b0d5ac2f1c7bd552b60e23cb66d9a data/ars_nouveau/tags/entity_type/an_hostile.json -290c285b1e334d322b8d070b2c6a071114b1d70c data/ars_nouveau/tags/entity_type/berry_blacklist.json -7bddc9acec76a3ed5a2e6c0fb20d3fc69857c7ac data/ars_nouveau/tags/entity_type/burst_whitelist.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_type/disintegration_blacklist.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_type/disintegration_whitelist.json -29671cfa11d074462c259806e9d60468451e3cdb data/ars_nouveau/tags/entity_type/drygmy_blacklist.json -d7241e9bb8f594e377c93623dbf68fe446f1b65f data/ars_nouveau/tags/entity_type/familiar.json -626ec463a66bcda15fd17dfe131322f296b2ff38 data/ars_nouveau/tags/entity_type/jar_blacklist.json -e00f2931577049b9a4400a87ed9c249373be376c data/ars_nouveau/tags/entity_type/jar_release_blacklist.json -81129e21b3ae9fc2579ae17d4c228b76271a2b4d data/ars_nouveau/tags/entity_type/jar_whitelist.json -6ea663c420f871864a11d18e9448d602520eeff9 data/ars_nouveau/tags/entity_type/lingering_blacklist.json -a8425355e51f2ea7ed823f1214e5f785f5f4ebc4 data/ars_nouveau/tags/entity_type/magic_find.json -86a469d8e9ee317a1ca5b93bfed0be34ff5b0d89 data/ars_nouveau/tags/entity_type/rewind_blacklist.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/entity_type/spell_can_hit.json -ac003d93bbb50df3d9d0d7bf1561a9b274c4e65b data/c/tags/entity_type/bosses.json diff --git a/src/generated/resources/.cache/d2032e9832fa171affe4a9c0c99fb97f183ff8a6 b/src/generated/resources/.cache/d2032e9832fa171affe4a9c0c99fb97f183ff8a6 deleted file mode 100644 index a0b4546b67..0000000000 --- a/src/generated/resources/.cache/d2032e9832fa171affe4a9c0c99fb97f183ff8a6 +++ /dev/null @@ -1,2 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.172785 atlases generator for ars_nouveau -0824a6d8558f29057b8af23a64a6dfa5da2ca88b assets/minecraft/atlases/chests.json diff --git a/src/generated/resources/.cache/d784f732a4c9f307e882d11a0eb56178c990bc6f b/src/generated/resources/.cache/d784f732a4c9f307e882d11a0eb56178c990bc6f deleted file mode 100644 index 4ceb8c8f24..0000000000 --- a/src/generated/resources/.cache/d784f732a4c9f307e882d11a0eb56178c990bc6f +++ /dev/null @@ -1,7 +0,0 @@ -// 1.21.1 2024-09-28T13:26:15.7514484 Alakarkinos Recipe Datagen -c9b4aad4995335ec8b522c2c100de2e2fa349ca1 data/ars_nouveau/recipe/alakarkinos/desert_pyramid.json -f4f6bc699a6ece68a4258f1debce219b4c214c3a data/ars_nouveau/recipe/alakarkinos/desert_well.json -30b79d6af39f4d9ab774eda8ccb9e760e6f6a01f data/ars_nouveau/recipe/alakarkinos/ocean_ruins_cold.json -9e727c69faf9cb5269b27d461c7297ec4f20b2f2 data/ars_nouveau/recipe/alakarkinos/ocean_ruins_warm.json -94a24483e65ad4cf60804e547e63315f010c5654 data/ars_nouveau/recipe/alakarkinos/trail_ruins_common.json -d09af4789c436c1146b80db150a4172b63bfd57f data/ars_nouveau/recipe/alakarkinos/trail_ruins_rare.json diff --git a/src/generated/resources/.cache/e0d3d0b8d9c807675613821fa865a35f707cd83f b/src/generated/resources/.cache/e0d3d0b8d9c807675613821fa865a35f707cd83f deleted file mode 100644 index 8f4ff4d14b..0000000000 --- a/src/generated/resources/.cache/e0d3d0b8d9c807675613821fa865a35f707cd83f +++ /dev/null @@ -1,2 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.2021298 Data Maps -835362efe6b3a85abe6e05e01dcb8d34823e18a0 data/neoforge/data_maps/item/compostables.json diff --git a/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 b/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 deleted file mode 100644 index 8d96951aae..0000000000 --- a/src/generated/resources/.cache/e581a97017dbee0dfb224f8cd0af2a5bd8d029a8 +++ /dev/null @@ -1,177 +0,0 @@ -// 1.21.1 2024-10-15T18:07:37.2635734 Apparatus -54b2918a0b959ae3e055dae2681322a8800177a2 data/ars_nouveau/recipe/alakarkinos_charm.json -adc3e3b582ab4d1fd6f29537bddaaecb9eaa0c2d data/ars_nouveau/recipe/alchemists_crown.json -9a7fefa487b159935c1f620dc9516a6600fb0d4b data/ars_nouveau/recipe/amulet_of_mana_boost.json -a653f866167b0fd7d0f7ded2166d45a2ff104d0d data/ars_nouveau/recipe/amulet_of_mana_regen.json -e0ede63fb9e91f8442442cda1dc14bcc89ef87ff data/ars_nouveau/recipe/aqua_affinity_1.json -96764d0d1d6065369fb46ddcfb990499e386dd24 data/ars_nouveau/recipe/arcanist_boots.json -ccbfd1ce265f3c21637747b7c34bb6ec877d621c data/ars_nouveau/recipe/arcanist_hood.json -d0f08dac1d7b5b3425d9df08cf446579311751f6 data/ars_nouveau/recipe/arcanist_leggings.json -9f811c123e1d73a606699a2a584db811ba362820 data/ars_nouveau/recipe/arcanist_robes.json -3306cf588159153c442a70d90a6e9893010c4def data/ars_nouveau/recipe/bane_of_arthropods_1.json -b1fd833a474ba2a21b2f196d753dc42606ce4d13 data/ars_nouveau/recipe/bane_of_arthropods_2.json -56f655b3dd536e8be63b051548d74d3256c74bad data/ars_nouveau/recipe/bane_of_arthropods_3.json -bdce3a3b190f3e920aed58aacea65d0ea41f5beb data/ars_nouveau/recipe/bane_of_arthropods_4.json -37cde589d1bf7b71c6e4b01ba234ff73bea2c50d data/ars_nouveau/recipe/bane_of_arthropods_5.json -55ee89af0523501993d31dc7f4c1f53d16a45d79 data/ars_nouveau/recipe/battlemage_boots.json -db6cc03b8c0827571f8ed1b4ff28e560a00f624d data/ars_nouveau/recipe/battlemage_hood.json -80f55b2d64b5e90a9881119019c2fe4579f38fd1 data/ars_nouveau/recipe/battlemage_leggings.json -817efea3bd03f62a05b8237c37055658980da1ff data/ars_nouveau/recipe/battlemage_robes.json -513212420a63579f686068ddd83cad055772a60b data/ars_nouveau/recipe/belt_of_levitation.json -3e8803b889657fd206be6a5d3be96e430d6bad03 data/ars_nouveau/recipe/belt_of_unstable_gifts.json -6d64042c146609fc4e052d7b7bd8fcee52eecff0 data/ars_nouveau/recipe/blast_protection_1.json -00218d0ab9e9deaa66d86060de60db62402ec397 data/ars_nouveau/recipe/blast_protection_2.json -a2ad8a49fe6cba6e11d13dc9f324647c674569b3 data/ars_nouveau/recipe/blast_protection_3.json -7965036dc90156eb95997759a6c0f90b8870b534 data/ars_nouveau/recipe/blast_protection_4.json -46bcd2e3d2267631de94dee8d44076cf5481332b data/ars_nouveau/recipe/brazier_relay.json -e6f0a11f58915ff515855bc56c4f606e70d88f87 data/ars_nouveau/recipe/depth_strider_1.json -a67db7bb1da0c861575559510bc83547803ae35e data/ars_nouveau/recipe/depth_strider_2.json -38d04b9b2faf0bc989bfd23fc735633957c22d16 data/ars_nouveau/recipe/depth_strider_3.json -802f73c849d161bd6eb1275982e043c3d397a5f9 data/ars_nouveau/recipe/dominion_wand.json -87e7b2ae1b18dde1411af59f47d42a3cf63327e0 data/ars_nouveau/recipe/drygmy_charm.json -2bb510c44c282a609978f5ed39b4b324ed3bf366 data/ars_nouveau/recipe/efficiency_1.json -ba94b8d4ebbb4ed60256abd9e23a5b354b297a66 data/ars_nouveau/recipe/efficiency_2.json -435f7bb8cc02fd02f6d9f7c4b9c9ac7eac27930c data/ars_nouveau/recipe/efficiency_3.json -29aa663334fce55ba539ea2d63bd10bb8c82be88 data/ars_nouveau/recipe/efficiency_4.json -ffd676653c81de14822f5859347f245b4cc0ce25 data/ars_nouveau/recipe/efficiency_5.json -1177e27111938b858fe4cbe43a3c8267e315c57c data/ars_nouveau/recipe/enchanters_eye.json -67be8410e6968e09ed0eb852bda93a0932a77d11 data/ars_nouveau/recipe/enchanters_mirror.json -321f4d386c03038ff92a9233c1c6898123bdd80d data/ars_nouveau/recipe/enchanters_shield.json -f2c4f98facacbc8b2e4e322e99af3eaa56c16c07 data/ars_nouveau/recipe/enchanters_sword.json -b94d896ec37f1f50ed5b6b1d71a03779261cbd6f data/ars_nouveau/recipe/feather_falling_1.json -501853d55ff7e69cab7826f9160a4dfcdceb0355 data/ars_nouveau/recipe/feather_falling_2.json -adee2bfa7bf7e244bc68a8b764038fa7d06a3e67 data/ars_nouveau/recipe/feather_falling_3.json -4d06aa8e39bfdd88040ab6c3cb5c917fa2d5e08d data/ars_nouveau/recipe/feather_falling_4.json -3a7bf4296a6eefee537d6fcb0b9c39f637ec8faf data/ars_nouveau/recipe/fire_aspect_1.json -89e9d058e692de7cab497404006842e1ec2d60e7 data/ars_nouveau/recipe/fire_aspect_2.json -739a3142c0fdfb61227ce74ca827501ef0a7faac data/ars_nouveau/recipe/fire_protection_1.json -8dedde3000d689cc3e6f4c0271ef126166fd26ed data/ars_nouveau/recipe/fire_protection_2.json -7869da04f7ef6bfee215bd8bb00bb2b16bdce594 data/ars_nouveau/recipe/fire_protection_3.json -222ae77d9d460ceab431071aa0c58d28421964a1 data/ars_nouveau/recipe/fire_protection_4.json -850db054d7dafe3bb52702482746ea94d0a33960 data/ars_nouveau/recipe/fire_protection_5.json -891a9103db5ab6a8e7fc019a0eabbafe6c400263 data/ars_nouveau/recipe/first_armor_upgrade.json -5ad83bd08d654192cdbbdeffdc7d3d29bcf138e7 data/ars_nouveau/recipe/flame_1.json -d5e5caf96f7c96de6e4c2526c92b971df23a68c4 data/ars_nouveau/recipe/fortune_1.json -4c012bab66e2f760d82a114218faf81918990dbe data/ars_nouveau/recipe/fortune_2.json -49c2c048fe15de5de5f7105ea0ecc32e7e7bd593 data/ars_nouveau/recipe/fortune_3.json -83baea4f1c4fd98b9ef02fb4be1d5eaa5bdc6583 data/ars_nouveau/recipe/infinity_1.json -d714a9e43538aa400e99ebda2de4dac2aeb315e6 data/ars_nouveau/recipe/jar_of_light.json -eed7cfd0f57e1b29f07d6f63f835a00f731ac18c data/ars_nouveau/recipe/jump_ring.json -424dd35dc4f31fa68f7b8c8c935457144d82a42c data/ars_nouveau/recipe/knockback_1.json -e1dc14480092525b1cf7913da5ca96f9c1e443ce data/ars_nouveau/recipe/knockback_2.json -a0fa0cf20066df47ac661b2eed172d114d693fb5 data/ars_nouveau/recipe/lingering_flask_cannon.json -ab597727803d76430871e3d423de2d61eb33bb3b data/ars_nouveau/recipe/looting_1.json -494600cf0a4328d870ece1316060dcf143f2ec5e data/ars_nouveau/recipe/looting_2.json -cc5389614ad3c7a85e79b2f2af7fa9239d0642bf data/ars_nouveau/recipe/looting_3.json -a830c33c0e77c830822fef2ee453201d5edf4fe5 data/ars_nouveau/recipe/magebloom_crop.json -abd6d0c3fd3ed63b0b4b12f65de7f1282bd7e710 data/ars_nouveau/recipe/mana_boost_1.json -e08e78544df38a0f8d1ebb410cb89b4e799231fb data/ars_nouveau/recipe/mana_boost_2.json -ff1f4c919b00d0362639d663ebb44c80f8ba8242 data/ars_nouveau/recipe/mana_boost_3.json -a298345e529420c84782a7fa489164f56c33fa3f data/ars_nouveau/recipe/mana_regen_1.json -7e927aa9ea56dabd8c897ce9866776461aa5ca36 data/ars_nouveau/recipe/mana_regen_2.json -48363af492d7d25aa03b42a6a9939062010290a0 data/ars_nouveau/recipe/mana_regen_3.json -f8ec79e93f8b1cc78c57833888b56a69d34be535 data/ars_nouveau/recipe/multishot_1.json -f1be2866f2800f904f6852da0f832b437fd6d290 data/ars_nouveau/recipe/piercing_1.json -e981a18401fc20feedcf33b53a395cc3b269e61f data/ars_nouveau/recipe/piercing_2.json -08dcd5a3f296194d199161772d42a8ec568101ec data/ars_nouveau/recipe/piercing_3.json -dccac5cdc1903e824a53fec92a253a5d5fe33708 data/ars_nouveau/recipe/piercing_4.json -946b4f2c7226fb68ce62e48f64610e918a31417b data/ars_nouveau/recipe/potion_diffuser.json -45fe525c3b44e6577796b57e25a7c2530393e380 data/ars_nouveau/recipe/potion_flask.json -036e4f8c9ba8b1e91627021c43283ee08a15693d data/ars_nouveau/recipe/potion_flask_amplify.json -14373b9cbd4d828f577f37674813be308a39b711 data/ars_nouveau/recipe/potion_flask_extend_time.json -9607d38c036f878bc54cd4813c673c1c80f20e49 data/ars_nouveau/recipe/potion_melder.json -ff7e61b9d71beeaa6302dbe370092d51df402468 data/ars_nouveau/recipe/power_1.json -92f28b2fe1bdb6ab8e56713a11c7b6dfbcd18e5f data/ars_nouveau/recipe/power_2.json -2d327c178a3ec18a8b01c9f636c0de93662f8a6e data/ars_nouveau/recipe/power_3.json -cf7a139ec7b47cd2615d1f0089b8f9ed0bcc4f30 data/ars_nouveau/recipe/power_4.json -a9943800ea132c316e5fe74cd0a0f0a9426598c0 data/ars_nouveau/recipe/power_5.json -99a5914a2a5cf47da0b4afcb21ef7e5791bfd54f data/ars_nouveau/recipe/projectile_protection_1.json -7587503e049e9a42740dd0e9ee6d7bfd5d422241 data/ars_nouveau/recipe/projectile_protection_2.json -c017a730e2d6fd8c4dc8f67e1dd7f8b029e1f113 data/ars_nouveau/recipe/projectile_protection_3.json -2066c88a742ba565349dd2ed9acfd4fef8048b31 data/ars_nouveau/recipe/projectile_protection_4.json -148ea785edb678d3bb6e4b4302b884f27dd01d67 data/ars_nouveau/recipe/projectile_protection_5.json -3753894e8209039ac41f373ea5d69fad403b7da1 data/ars_nouveau/recipe/protection_1.json -4223d9ac4fb2b113abc68c97e9340b029e6346e0 data/ars_nouveau/recipe/protection_2.json -20f3456b64546967b03b62bf90e6b65477104f93 data/ars_nouveau/recipe/protection_3.json -22186a33de99cd766b4d5e3d2bf71e52ff4e7322 data/ars_nouveau/recipe/protection_4.json -ae2d828cd3cf6afa7f18a367895827e21b70aacb data/ars_nouveau/recipe/protection_5.json -968255c290b40a37d5139eac4497eecdf8d356a9 data/ars_nouveau/recipe/punch_1.json -73b60592e4055cff5c3375dadd548a190d6538b3 data/ars_nouveau/recipe/punch_2.json -77816a335f883fb91cfa69abdfcddd57ebc8145e data/ars_nouveau/recipe/quick_charge_1.json -d8a8ae0d973af9f4983c9ba0cc785327a2d72a17 data/ars_nouveau/recipe/quick_charge_2.json -353bc9276470a20f0737d0908dd27d99910f74de data/ars_nouveau/recipe/quick_charge_3.json -291c08ec15ed58c1b8d905c09ec874b5c7024af7 data/ars_nouveau/recipe/reactive.json -f8d2a48ea7cbb131ffce8dfbeaa54e7c668be22f data/ars_nouveau/recipe/reactive_2.json -e1a23f3407ed876596ba65d5a38b32ea365db494 data/ars_nouveau/recipe/reactive_3.json -672d478694316122e6784152221af74d032d336a data/ars_nouveau/recipe/reactive_4.json -954bf970a853a1ea853b2cdd51dde2302fa49ea2 data/ars_nouveau/recipe/relay_collector.json -cd92ef2ff820bcbf43c00429923659e14ecc9f78 data/ars_nouveau/recipe/relay_deposit.json -a72c98dc52caaa8b2186f851b8f57f33fb349200 data/ars_nouveau/recipe/relay_splitter.json -758f93d64c237455314fb2b2b5c8d7d616c55967 data/ars_nouveau/recipe/relay_warp.json -520e500239a71332157eeecee049beb88ce5a8f4 data/ars_nouveau/recipe/respiration_1.json -405a046ef3cb131f49c1f80d3e620cbb68daef21 data/ars_nouveau/recipe/respiration_2.json -0b8c1cba990621e1f06f9b967ac6f034b24a7094 data/ars_nouveau/recipe/respiration_3.json -a0105e2734c691161034cd98da6e9e3c26e03bab data/ars_nouveau/recipe/ring_of_greater_discount.json -d786fabdeee81841edad435f4a6382e473ef35f3 data/ars_nouveau/recipe/ring_of_lesser_discount.json -713d1ea6d6e63ab4bff5eef516eb822badc6dd8d data/ars_nouveau/recipe/scryers_oculus.json -ee32a2dac6a622671113f3ab1f9a723c1b27c0bf data/ars_nouveau/recipe/second_armor_upgrade.json -173ddd3af438bfd8b6d1e4ca37ae7df8993aaae8 data/ars_nouveau/recipe/shapers_focus.json -eb7e2f2df686b900e8bd5f64adc2b2ff5d2bdc1f data/ars_nouveau/recipe/sharpness_1.json -0f60b6d00f08a680b6d37358c8a05e6ddaf1fef4 data/ars_nouveau/recipe/sharpness_2.json -3571c706391ea234f29393ddb25485e0b4cbffd7 data/ars_nouveau/recipe/sharpness_3.json -dc4d90374183a39c28c58abebf5130a17111fe00 data/ars_nouveau/recipe/sharpness_4.json -6b488793612606c581dc70e0c7e968653312543c data/ars_nouveau/recipe/sharpness_5.json -fe8bdb9ba8519d7dcfb32b0779c60a3b5633b507 data/ars_nouveau/recipe/silk_touch_1.json -d16b43c54cb3ed81e09d782fd97e04a6ca1f0581 data/ars_nouveau/recipe/smite_1.json -8c68ec02d0c433dc0a04cf3afb54afc954533255 data/ars_nouveau/recipe/smite_2.json -9a148c3928a92d59906353b9cf37fd52e8ebd6c9 data/ars_nouveau/recipe/smite_3.json -ea46ed0dea6fcb2cda6805784ce9b1fb5dab23c0 data/ars_nouveau/recipe/smite_4.json -d6afa6eb0ee482e343f702960e7bb5593758f366 data/ars_nouveau/recipe/smite_5.json -5890abc9dd6733e00b7cebdffacd0678c0ce1d5b data/ars_nouveau/recipe/sorcerer_boots.json -90635fd044ea07f1ace643ea91762bb3e94f19b5 data/ars_nouveau/recipe/sorcerer_hood.json -efdab074a439128fcb823de36e7818d9acecb442 data/ars_nouveau/recipe/sorcerer_leggings.json -24bcf391984d3d2876a2651f27fc368e4193339b data/ars_nouveau/recipe/sorcerer_robes.json -5d3affe68675b0c6a9e5b90395f3c65b81913ab0 data/ars_nouveau/recipe/spell_bow.json -5fb4c790b5d7ffb001c1e99c211f57b7c3d70f4c data/ars_nouveau/recipe/spell_crossbow.json -d4a9d6c6cea711285eef80cf56774ce6f1816f47 data/ars_nouveau/recipe/spell_sensor.json -248fe93ead9f6ae30d8a940b92c25f6080bff210 data/ars_nouveau/recipe/spell_turret.json -13ef111444d4c98faaecb82de62c7e4c260ac457 data/ars_nouveau/recipe/spell_write.json -2d0007371e00dbf644b90cc0eadb70592f9033fb data/ars_nouveau/recipe/splash_flask_cannon.json -ecb2c1b5460c72e4e7cd7de78efc5f13d6623a41 data/ars_nouveau/recipe/stable_warp_scroll.json -0006d2de334ea83140b7a860ca693048d8d5866e data/ars_nouveau/recipe/starbuncle_charm.json -78aaf214ae173d9e3fe75d13f1da07d176855355 data/ars_nouveau/recipe/storage_lectern.json -cb413e475021660182ca2c5da7096c7af4185d63 data/ars_nouveau/recipe/summon_focus.json -45640e50e3509b7587535d03f8d0a1ae95e4ddfa data/ars_nouveau/recipe/sweeping_edge_1.json -c2395f7c82cdcad36a461c0b9bf8171cfb02524b data/ars_nouveau/recipe/sweeping_edge_2.json -113aff634b21e9f69eb2e0235e9a1168def50f89 data/ars_nouveau/recipe/sweeping_edge_3.json -b8163f68cf9b5de956b9af9a8d4d312ca2ae716b data/ars_nouveau/recipe/thorns_1.json -c0a42357afbe1dbc1a89b7bcd2530b2de0e2b953 data/ars_nouveau/recipe/thorns_2.json -2fbfeb666dde166ebea42498e082dd3ea6f82edc data/ars_nouveau/recipe/thorns_3.json -edacda871b183d1a339585fc8f902782100701c1 data/ars_nouveau/recipe/thread_amethyst_golem.json -f1397781e9783a88b148fd73d59b2e9ce839d380 data/ars_nouveau/recipe/thread_chilling.json -18fca0f8164800609527ffb8a65f269fc064d656 data/ars_nouveau/recipe/thread_depths.json -06d2efb2e02dd7be897f1cbf85f868236aae736b data/ars_nouveau/recipe/thread_drygmy.json -9e6fba712b5c7b7d4af4314175554c188550733e data/ars_nouveau/recipe/thread_feather.json -a9630999240dda8471118ea1298c47f6712dc905 data/ars_nouveau/recipe/thread_gliding.json -f0c497bc5ea24ad1eefb445df9dcc70348dfbc4d data/ars_nouveau/recipe/thread_heights.json -473c9ffbccd5573620bf4424a38e920363ff2e91 data/ars_nouveau/recipe/thread_high_step.json -06c5fb579d537f23c1f1e8cb85fdf78373f39a42 data/ars_nouveau/recipe/thread_immolation.json -5be71cc2182a095914d54136aedeb122f6f252bb data/ars_nouveau/recipe/thread_kindling.json -5ec36b06cdf8f1474c8654199dbc24a08d34c740 data/ars_nouveau/recipe/thread_life_drain.json -e63df50577eb5ef924f5d1e2c3881df3b4b6793c data/ars_nouveau/recipe/thread_magic_capacity.json -3a76e4548fd874fd875b5c97711785209d5c4e91 data/ars_nouveau/recipe/thread_repairing.json -93ff63c3d3e03c296bf7610f403863f68aefadb8 data/ars_nouveau/recipe/thread_spellpower.json -8e2fd516179da666c02f37ba5f223ed96109dfb0 data/ars_nouveau/recipe/thread_starbuncle.json -bdfa9e7d7be9d1ab936d8c37cf74b4a6ff5e8153 data/ars_nouveau/recipe/thread_undying.json -30f30169eb67b3bfa0890e0e0a70a5a964a148b7 data/ars_nouveau/recipe/thread_warding.json -b24cab06a489af2b77eb182eae3b644aa15ced2e data/ars_nouveau/recipe/thread_whirlisprig.json -7d29e5fb5849312821a060dc2909138b99418dd6 data/ars_nouveau/recipe/thread_wixie.json -616c14a7aba336d86ad3f4e80e72ff55e7b04dff data/ars_nouveau/recipe/timer_spell_turret.json -06b23e343143f8ef7b804f45f5a59b995ee230b4 data/ars_nouveau/recipe/unbreaking_1.json -113d45ce053669cfb20138847894ce82800f6a86 data/ars_nouveau/recipe/unbreaking_2.json -aeb4943d3a16b38b623a6a252c1ec1b7fbc4df22 data/ars_nouveau/recipe/unbreaking_3.json -fcf211f490f9bba03511bb94d59ff606007e81fd data/ars_nouveau/recipe/void_jar.json -bc0dd44f2a595f7622aaa6a68801b6f35167dc3b data/ars_nouveau/recipe/wand.json -39f2882ad3d4a7d3b822bf5a8f7b034c9ee093a7 data/ars_nouveau/recipe/warp_scroll_copy.json -fe5f114abf42ad1f6ba98978b2ac564f6ab720f2 data/ars_nouveau/recipe/whirlisprig_charm.json -608aff1e7a08a5431bf22133fc2201f56ce3bcf0 data/ars_nouveau/recipe/wixie_charm.json diff --git a/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 b/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 deleted file mode 100644 index b4b3bfac74..0000000000 --- a/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 +++ /dev/null @@ -1,40 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.2171764 Advancements -48dd44d88536431cef54a84d4a7dce06d6567a5d data/ars_nouveau/advancement/alteration_table.json -da10d6cfc3154e84e349a4f51c6cb4b1bdd9cb97 data/ars_nouveau/advancement/amethyst_golem_charm.json -576e3c90dbff03f0668db9bce1d6d88ed511e672 data/ars_nouveau/advancement/apprentice_spell_book.json -34f9a0e9e7dcdb96a0553f28852b11a0f2b4f924 data/ars_nouveau/advancement/archmage_spell_book.json -025052e5d7381c2ad5776814b5f5c54a2986e044 data/ars_nouveau/advancement/basic_spell_turret.json -c2f835310d25bddc609920d35b301e69c491dee2 data/ars_nouveau/advancement/catch_lightning.json -2de4b15f3eb43aa4fc1ffe163d99a1cdbec0d3a9 data/ars_nouveau/advancement/create_portal.json -767f0952899b54bd4a66f50f1bc76ccf988fb628 data/ars_nouveau/advancement/drygmy_charm.json -9b55110cfc4ce805ebec5819747651ed83981a18 data/ars_nouveau/advancement/eat_bombegranate.json -95ba5a701816b72842b38be5c2b99815fc58c5d7 data/ars_nouveau/advancement/enchanting_apparatus.json -53364031e9b48f7e570c63c417c9f16ed49b68b3 data/ars_nouveau/advancement/familiar.json -6b8ed5b6cb733b4db63f5141c16ddab053863fcb data/ars_nouveau/advancement/imbuement_chamber.json -314db4db4c52b6733dbe5a15c9d965e5085451d8 data/ars_nouveau/advancement/magebloom_crop.json -dcc2ec877809d1e81ded0cf1b48ed764702ef7de data/ars_nouveau/advancement/mob_jar.json -1cbb3499bb2c1c8c989851aa3f75f397730660a6 data/ars_nouveau/advancement/novice_spell_book.json -50a2b92225b64d46ce09a522f4b0fb1363fdd701 data/ars_nouveau/advancement/poof_mob.json -c718823ad3bf3084c7e9337688487a33cee7722b data/ars_nouveau/advancement/potion_diffuser.json -02470aee5b815f93a5390bb8a26eb79dce4e2e9c data/ars_nouveau/advancement/potion_flask.json -a156b38ebcdeea8bf6eb8300c198a34f0c016a61 data/ars_nouveau/advancement/potion_jar.json -1acfa564b71a688c1ee3791bbf2f7d6a6e9039e5 data/ars_nouveau/advancement/potion_melder.json -118121e301e09b139959e3dc96b23c097f4bcad0 data/ars_nouveau/advancement/prismatic.json -606f9ce00dba2290ed04cf0d913612a472ad441e data/ars_nouveau/advancement/ritual_brazier.json -f4a12c645243c28ee124e0ae1c01709e61f3db5c data/ars_nouveau/advancement/ritual_gravity.json -f8a2df2ff9bac6e637f619d7a2d41815bfd19ea1 data/ars_nouveau/advancement/root.json -1b2cda18fc65f6ced0adc768241357049f6b732f data/ars_nouveau/advancement/scryers_oculus.json -8849b85859743964af35b5477dbceed044e1906e data/ars_nouveau/advancement/shapers_focus.json -7a2d463300f16ca61a282e4ad269a5158bc375eb data/ars_nouveau/advancement/shrunk_starbuncle.json -fbaf7e26165e4a424e25be9c9de51b448d311bb3 data/ars_nouveau/advancement/source_jar.json -3b8c22be8dec7f707cccde99979934ea9ddce4c1 data/ars_nouveau/advancement/spell_prism.json -9772bf00b998c18828985edb1e7b6b2a8e7de80b data/ars_nouveau/advancement/starbuncle_shades.json -acfa5fae1daf1caa4856fa1eaa7c87393c3b387a data/ars_nouveau/advancement/starby_charm.json -d7d0f7d9c2fb3adbcf16b93c3c483899d17c3eec data/ars_nouveau/advancement/summon_focus.json -f9d69f4739a6659928668fec062d8f8e886a4ef7 data/ars_nouveau/advancement/time_in_a_bottle.json -634b6e5d5a65125bc7e11e5b758d323ddc4a2a52 data/ars_nouveau/advancement/warp_scroll.json -79bc127a92e39ff26da4b96b21990462f806f9a1 data/ars_nouveau/advancement/whirlisprig_charm.json -b6df1a4d14a2af309e8111700f7af2b460e0b85d data/ars_nouveau/advancement/wilden_explosion.json -7e7bc4f1c9dead03e194a1bf072fda402867dfb2 data/ars_nouveau/advancement/wilden_tribute.json -01628bc7755261fe3bd013e2b1e1d355107d2c10 data/ars_nouveau/advancement/wixie_charm.json -b83e08512e38cfe0675f9217ad7056bb50ac17bb data/ars_nouveau/advancement/wixie_hat.json diff --git a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 b/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 deleted file mode 100644 index 7d11c9541f..0000000000 --- a/src/generated/resources/.cache/e7c243f38c2b0774b1bff1a90ede0b19a4077240 +++ /dev/null @@ -1,239 +0,0 @@ -// 1.21.1 2024-12-01T18:48:06.435762 Patchouli -2ec536fea831588201432d61d70af61385882054 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/alteration_table.json -a82f4fc73946d228b1e3f5e03d0ecef46f33cdfb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/applying_perks.json -8ce1d8e886b45066bc5c1d9d8e87bdabbb27ae27 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor.json -677a941d61bd1f46d2960aa812d2f55d8f4ce373 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/armor_upgrade.json -5e1350ec3f7613b487ab5e40c32b74802c7e038f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_amethyst_golem.json -b9069e1ccb5feff6c8bbc4278225b089fc4f6c4f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_chilling.json -5a797472d2955e71e014d353ac3314b3d76dd839 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_depths.json -d32422c250f8bffcf49349b24dc71691c80d4d01 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_drygmy.json -87142f1e3b440e324318a6433b3677fb93936c35 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_feather.json -8ceb3916a28f0e6810b2771ece030829385c6c82 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_gliding.json -f12cf26f3db8a2c302faf3ff2bef6ac6fccae616 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_heights.json -303cda95d5f210496d97982369b1d07fe8777a3b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_high_step.json -1fe7fe78b2d6e3bc0bf1985cbc7ac0c8526ad08a assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_immolation.json -9b16ed32a1faf6b7824001f7c404dd02bbff3a32 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_kindling.json -fe7da3a6b49e4f051f2cff76294ebfdf57f439d4 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_life_drain.json -cdd4f3e50b0925ed9b7ebcc6dcb72c4801a58d88 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_magic_capacity.json -26c57cb6e89922a97ddd8fd2777156f61810280b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_repairing.json -af2cad176d06d76255562c4a402a1a8e5aad89d1 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_spellpower.json -d18984196578c97c968118f1fe6398cb683c292e assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_starbuncle.json -2f07db7ac217bf07759c616a08ff8c2a57ed3fe0 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_undying.json -d9e621409981d50547758d2106d4d1d368823389 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_warding.json -9eb1a48929505b0957ea3192aeb875d716e30510 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_whirlisprig.json -8a65d3abee43b8131b8c43d46caa1f5f66123045 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/armor/thread_wixie.json -12f3206810699b1c8ee94ff9ddeb5330b52749b6 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/alakarkinos.json -c365b920481cbe283c09f7b26cc070b6eb422cf9 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/allow_scroll.json -4cd0f67b4702dff32f62ee6f45270a62985674ae assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/amethyst_golem_charm.json -c7d187c5baed53c4ddb63b6b6dc9ec9847c21a45 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/deny_scroll.json -7c468a3d4e1c4612edaa4f88af7704ea2d14b417 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/dominion_wand.json -6c48b4ea2dedda187ac31933c8d54e8c40744aff assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/drygmy_charm.json -f13c06f8bad4eea6dc04fe65a11e7dee635edcd7 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/grates.json -2aa6f0796e1c44db6a5f89ce86c71b51d30f55ab assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/mimic_scroll.json -8d8c1da8e10e4e6bdb2e372d9091d6520bb050ee assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/redstone_relay.json -b619a9ff2b42715a4f02335f3d16e0d38278131f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/source_lamp.json -269964459879bd2f251da0caecebfdd380dd3c77 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/spell_prism.json -756f36ebd89cd34e9beee7dc014e59ca6e651f2a assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/spell_sensor.json -c5c734978c587616db905cdcdd4da1bd054ab42b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/spell_turret.json -9703d7297fd5d617de38d9265f5358ca3848b04d assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/starbuncle_charm.json -83400883b7c5713d903c1eff29a461751e6ed84c assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/starbuncle_shades.json -2ea9c13e62cb450b8b22d140922ec1dc5647e7c0 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/summon_bed.json -70e9745b59840561d25e8261355bcfd61a7d2efd assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/void_prism.json -f6550bcc2b3942c8c56bcee77a7eb1b665f94dce assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/whirlisprig_charm.json -6c33f9c15e7ae17847d3d0b827d2fed0f25dab47 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/wixie_charm.json -3ac1fbba7133877181a6dfb45a3912643d84c057 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/automation/wixie_hat.json -d50e699fd8864679faf31cce12f56187089c702e assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/how_to_enchant.json -a0ad396126caa1957af15dcea3c0d6d2fb69d215 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/alchemists_crown.json -2fb96ae53395bc9195823d0dbf32f14c16714746 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/amulet_of_mana_boost.json -c84b12bd9cb206176f3622b44713687dbd816ee3 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/amulet_of_mana_regen.json -945e6db9c8cdc08d2fec4d02221df616509a1096 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/annotated_codex.json -9d94e46037ec12f1379e03ee800ca78afb5a0896 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/belt_of_levitation.json -5cc0147018de6b5b8ee7edd44c3e6884352b6f5f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/belt_of_unstable_gifts.json -fced5f08bd0960593e89b7a7f1da2be28534a620 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/dowsing_rod.json -2a6b395445cd156ef0410c2ce3101c13b8523cc9 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/dull_items.json -959c29d43b553dd3f83860baecb862c276a37fae assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/enchanters_eye.json -aa48c7abc8d3ff5f1cf5253df73c14cf9dca6f21 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/enchanters_mirror.json -de0893ea7345811d79f946808a1c91cc58ec2798 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/enchanters_shield.json -d1e6009f319c0bc546af9a39f184102cb9a15c99 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/enchanters_sword.json -3fab58c25a4f9679d73a4c406de4bb9b6922b15e assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/flask_launcher.json -af03840f0988505b31a14e18fbe2045198f0aa39 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/jar_of_light.json -465677fa8bf0b032fe80693036603174ac5a9f42 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/jump_ring.json -7e1795fd2a7e4b0d55ab428d554484931caad96e assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/potion_flask.json -802dddbf926b3996a1e647e45f45d02f7d812bfb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/reactive_enchantment.json -b71740ed0f131157a6bf36d3df15d6dbc61cb993 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/ring_of_greater_discount.json -9f6c54b8e0bf992a845d6f774a514721ae4c2117 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/ring_of_lesser_discount.json -08db3f3111f327f73110e2376b7e276c194b3be8 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/runic_chalk.json -daa37877675a08762048e26cc75ffc00a369b93b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/shapers_focus.json -f332a9580792035793b5939e2fe037c4e8a34b29 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/spell_books.json -639ae4004196fbc889beff01446749011188c998 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/spell_bow.json -1c43f5926d50c083a3bf1d7543d4919bbfe816c4 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/spell_crossbow.json -640df81b52c050665f652b08780b61c38d62e072 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/stable_warp_scroll.json -b155f48d21b3352b4f206bd96ca802ab2a2dd3fe assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/summon_focus.json -e0022761fc50026b77ec64bc5ad58c69c9f13605 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/void_jar.json -d7851e5dd97febffac7058815a47f93a9c5c50a6 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/wand.json -96f5265be0b3043557b261d39847ef19baa9c9cd assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/warp_scroll.json -3b139ba75c3752c541ee359ca4cfa618ebf2db59 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/familiars/familiar_amethyst_golem.json -8ecad7c5b7f4c2f39804405aaccccabb9460adb6 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/familiars/familiar_bookwyrm.json -46e55942eaf950d9d72f38e4edc3b4c3f0a3b8cb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/familiars/familiar_drygmy.json -bad5903ed7c684d271018903b883dd0d93e90be9 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/familiars/familiar_starbuncle.json -28d5400a00e0a3815baca6c09638bd9975b7b39c assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/familiars/familiar_whirlisprig.json -6132f230c492940e5fe2300d68e5beda78a8123d assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/familiars/familiar_wixie.json -a0ff769b287c249b70f38c077c166d2fe535a908 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/familiars/summoning_familiars.json -c01907f9d8427a918dc5b87120bd72737e949a4b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/apparatus_crafting.json -4f9fc7476eb34327f97b015055b5c347211aab70 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/better_casting.json -db85a7250583470d885c54c2968242ce9c8ff0f2 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/new_glyphs.json -85e31bb2a768d84f1265893451861f0292002b69 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/obtaining_gems.json -a09f89d0ec927fce49d1736c39305bcfeac052cf assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/source.json -52b9c730450e087dfefce08cf571f3ebbf380329 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/spell_casting.json -50373f3a5f79ecb0c44b2cca7a19ca0aa2da1278 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/spell_mana.json -5e942499fb8b8722be86a3961ce502638b8ffc26 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/starting_automation.json -81fcf49cd2e09ae38f0105066a60dd0c996a8146 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/trinkets.json -877210c24dbbaf4e365c30c8ba571cf2708e7d03 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/upgrades.json -521277fbf32424a30a8be24b137c786dc0b89cdc assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/getting_started/world_generation.json -a80d0aabd3eff91451b0e80fb34514c5ce57eadf assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_amplify.json -e6a01dcd171d462c0eb988478f64f994c63180f0 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_bounce.json -7d579e642d5c9a7c5dba516e1eadca7d87f9ad56 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_break.json -eb15f2f9c76d93709c34b433813730699ed7936b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_bubble.json -82768fc93e42445de3bc7bb16615dc28f7f11533 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_craft.json -399cd02e6fb2950c465d058cdc470ca0082c58e1 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_cut.json -13799a3efaff17fa0a56d7de80276bd9a43aa278 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_delay.json -694d3ccabcb3655d2a253cf60f9add0a8fe1cef7 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_dispel.json -f7ceec5276f7b095abd92a70c2e970247d09893c assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_evaporate.json -d424b2cededb3497cf8a94451ce6d4e9bec78842 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_fell.json -0e3d480a8d74426a62bbc2796e2133001f49e5e3 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_freeze.json -756640c49d1032463f9da3aa35d37f55f9397ea3 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_gust.json -22c13e43a26b347df1db355ad7b0406da021c8a5 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_harm.json -3e7a48a468b1762546f9e9f9d189d907e4289c83 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_harvest.json -c6ec7c3830c8a56d0a43ef7b0e76ef720fce7b08 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_ignite.json -b76616cf71ff62944c11560b2915d6600683f696 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_interact.json -589e170f6a45abd57d82f0a31d3153bbd92c778e assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_launch.json -64aaae029f866e7e288d3f69239e9ff9f5043d68 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_leap.json -0251ef29596c07db5958dcaf3131407c1e97eef7 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_light.json -de57d3e446040e4dd9d50dc754930c50a66041a1 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_pantomime.json -1990bd69025686c60aecee87d2c95a2c477b72fe assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_phantom_block.json -9fe654f846500785f20e623c2ce2ed95696849df assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_pickup.json -e1c2bb82ba84d8b9dc8e609b4ec02d021f51832a assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_place_block.json -81a3a3d4b742b79fa1638874d512fe4a71a6cbdc assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_projectile.json -09289602d184ba9ad58dbf2880ada24654ba3c3a assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_pull.json -5b2fe24785ee4c1d802b5b77cece2cf470b7c92a assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_randomize.json -a710a88019b4e40c290ecf1a7968bba9aecffdf5 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_redstone_signal.json -d964e1974330118f11ca742653d8b922c7460e47 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_rotate.json -32f252f5e4cd406d7cd85d9618e0bff77caa5ca3 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_rune.json -b43ded84b2777a6dd596a4d9f7250b36f6ff3da7 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_self.json -a80fd1d7c4971c06bcbf041f29b382cd5e37e559 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_sensitive.json -1f0b089d9bc9a24cb651a7c2ac07d562e2545445 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_snare.json -c9f0e41aa566b269652b4529a246c19173bf599a assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_summon_steed.json -afa09d8be159404d9869120126942614132e5c61 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_summon_wolves.json -a1b7028e04516cdcadcc927f663613067c9deba6 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_toss.json -e999260357f85e716f8544ba6c4af37b1d5eb885 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_touch.json -deb046c747058d3688c9003fdf3d2578b296979d assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/glyph_underfoot.json -38e5016f7ff0dd951180e8dbb242ff1a01348b1f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/reset.json -d62f9129040ed674ffe7064c35cb3ed07b89e43a assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_1/wololo.json -d27613c894ae69c16ce34c6bf55b82e9d59c7584 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_accelerate.json -c152445a18f10860cda9b4b3a3ffb95a26fcec34 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_animate_block.json -d6954eb33a373421475ac205e94eac6499a5a9a9 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_aoe.json -2e58981fe3ddfa73a3e4ebcbc1811d0889f187ab assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_cold_snap.json -644fd542c72cbf4f8fd79ce8757af25ba402db73 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_conjure_water.json -08744b154da13e4dd020b41a221b5dd0e2662580 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_crush.json -e8f5f09442934e595db11dfd613e38a55bb513e5 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_dampen.json -bd30b3e67bb4816334f39959e11ce1901f273244 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_decelerate.json -bc20dbbe119d90c25594e3070ebb293322d09c65 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_duration_down.json -635269febb648849c64d2305004edbb53bff14ea assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_ender_inventory.json -c465ae8d8710976d6ca16233f4b4a16863dfac99 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_exchange.json -342267f77beadab673e1c35f734fa412e3d14cf1 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_explosion.json -f417798a7ca36a7aef884afb29016044ca2a303d assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_extend_time.json -a09e1a060693eac5a91b051c1663c6802cd533ed assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_extract.json -fa55525f0c26529b2c645109a97c91a2725b11c2 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_firework.json -44e69fd7b2727ccb83407c9e123534795d1505bb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_flare.json -1aecb4b03aece4974a89657509de82e35f40d6ab assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_fortune.json -de84e2717a620922a234c7fb63cdae70eb75d866 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_gravity.json -dea2f1d5db56a35a2113e9270860c195443302db assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_grow.json -c514bc416367d1ee2b209a2f319559560d1570d7 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_heal.json -f2011c9715f5aff05e5e09c6f75ee8ac35fb8677 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_infuse.json -76eab06beeb8feb1bc4f922a3c7b29fa7cdab96c assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_invisibility.json -2b7341e9faeb7d594615ccd709c8a8664e066d4b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_name.json -4985c3f23805a5cce373a3112e7b333a4ec1b7ac assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_pierce.json -dcec678226980154062e130d3e611f51eb181e23 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_sense_magic.json -ff30b58b9f8180eaa8c2a00a32d6f012f2c2805f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_slowfall.json -e31cdbbceef9ce55067aa334463abad1bbbf14c2 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_smelt.json -a3f2fc942ad9e5cb68dda86b5876c87cc3da2dbb assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_2/glyph_wind_shear.json -bfc911fbc580b331beece90d2a27ca63efb9d4e6 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_blink.json -682fe48624532f99ebe80795a2169e8aead63ec6 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_burst.json -4837262a06b75fc36db36831af94b2426973e380 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_fangs.json -ada61102a55bc63f124a6a53510f29a77c21ce3c assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_glide.json -5fc4b3d4aa8a87b7f22be7397ae23abc31f099be assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_hex.json -3aba4b6e5bd7d24f7718cda705c1922cec821af0 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_intangible.json -28d81eb8a960f1c11dc5e5989f9c0679055e31d2 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_lightning.json -ab1e390d0cbbb99186f472b7e3900e7d5ea23fef assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_linger.json -436568398fc78d510a033bfa99fd8a551d0d08e7 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_orbit.json -1b9f57f52e2a3844fdcd166473f2601940998277 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_split.json -b4fa0ba50c09a58436480ef00c0885402acaf50f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_summon_decoy.json -5f966a23d7be2c353b72070d28469ab160339a8f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_summon_undead.json -6b73deabd2da3292c56eafe5523bc40b6a27862e assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_summon_vex.json -9eabc682bf4db9cf279c69762b12c1e657b1dc3c assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_wall.json -4cc981601776c7b95dab585271966183f450b228 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/glyph_wither.json -5f6a0b507b8bc0c8a36125bb54a27b66d27c6ebf assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/glyphs_3/rewind.json -50235d1b87546d57973ce69945517a432f22ed3e assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/bookwyrm_charm.json -1a25ac02c68a2ba58342ed551f59c60f5f8832d8 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/brazier_relay.json -730a6bdae91b4a8239778753105a2b36e23e06b4 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/enchanting_apparatus.json -26e32ff5fc343058cd9974fb3372606463380065 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/imbuement_chamber.json -345d9b909e4a6bfea97ba5f405bfccff996ba238 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/item_detector.json -b1c0819c2462345dc589028e940e97c1c84f9a91 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/mob_jar.json -a717a73df9902994f3cbe64b30aa41aef33b6123 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/potion_diffuser.json -52bc66ce57be298a81a9c94d9bf9a87d64b971fc assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/potion_jar.json -eb9ec934fad69de9859f3ea369e0b425e5f49a8e assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/potion_melder.json -2cd9fc82feaf6ce609abcf49183c5211b4d9e832 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/repository.json -6706644869dc084dfb5b0e2140702bae084e7c65 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/ritual_brazier.json -68a05b40e14eb4556f0353f8a69477230b616461 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/scribes_block.json -8ab5a8da4ca767b38afd42f1992ab17de84014e6 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/scryers_crystal.json -343b90150349cbdba99d647b63912f48967fecda assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/scryers_oculus.json -9ea03a0bf9efe62392c5f2739a3689fdc39c31de assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/scryer_scroll.json -7be64662ebd5e76cdc477b564d6554127f1f41a0 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/storage_lectern.json -e797ff6d4a79504b65178376196d5442fed62f42 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/machines/warp_portal.json -71b1f74e7cc2ad20e3a61b777a7b46ea53f93a02 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mod_news/mod_news.json -21aed4a27c6c0ad3be1f054f3fc1d3317aa0a03b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/mod_news/support_mod.json -c0133d1f6bc4d504f978862421be5322cce9a8f2 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/archwood.json -be9750fac4d703ce1091a78ddd1e68afe7d07c57 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/archwood_forest.json -a8873366db454ebb1a2b3bc4b4a1e231c1149368 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/decorative.json -76e888409ff047d66154fd87259db4eb8002dad6 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/illusion_blocks.json -79e7f31087e87e7a1ca0cf32f9a2c857d85c9505 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/magebloom_crop.json -d233d1c6e535ed96c4b0d658a3753a872b244b3e assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/magelighting.json -470e5c7898f68e4ebd1e4d875572220b34ae005b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/sourceberry.json -db2496ea2719bf0896a2bc677d6b7acfc70b2bfc assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/weald_walker.json -538a462442e2a483ae77691159097b15c550ee41 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/resources/wilden.json -9aead2cc81b16e5fae92249660da4f6ba82d6285 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/performing_rituals.json -183986f935c469bdf1fdb35de3fb0db38694c893 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_animal_summon.json -49aeb97ef8a6053c66144350d3844e1b0335a745 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_awakening.json -7399c48d1a6ab9986304eb9e9a12e7d2695895e8 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_binding.json -a99f3d48d08cdf727169afbf76cf571b82be6f91 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_burrowing.json -7ad7eec5ee73cd7f8f103d473284b8f85eacc69d assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_challenge.json -5a8357495f9343c63a778493188bc6eee00f8b21 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_cloudshaping.json -3290ca2d59b15d2e99fcfb3416b5b17f567e97b2 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_conjure_island_desert.json -2a50b09a67a28517b3d2f242e5c4c77e0359b2b5 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_conjure_island_plains.json -09cbf1685b6219df7832885c243bf04f4d5553c6 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_containment.json -d0bd0c1279692b40a1586ea8b4d2522828f35913 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_disintegration.json -a730ce45e432076fae64c368f89dd9697803304a assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_fertility.json -3d62d84ed6a28beb35761cfda0711500b26d09d8 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_flight.json -20c59d0321aae8169be644b0231d88f7f939cc65 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_flowering.json -cc434d380d70d0002dd8bc48f8783d118349ce51 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_forestation.json -a3fa03d6359b468ff05357f222945c5c77a3645d assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_gravity.json -b7b236fb3ef28fea2260bcbf5abe2c202ee8a271 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_harvest.json -be5c7be210f8e88dba08fd658065c693c154bff5 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_moonfall.json -b4b44e353840375ed13ffa9657902f68fdd339c0 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_overgrowth.json -55e04e43172c1bebb6b8ae203dfdcb080bd5de09 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_restoration.json -ec591ffd95169da87b8c22b4813193df78d55bc1 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_sanctuary.json -1a41fbd27f00cdec873ec6727bf9a18f132151a6 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_scrying.json -c8758a36d9c9d49d217acf78b132c5aa8cf67c72 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_sunrise.json -682bd8c651c407289485d6b874f0711792e390f6 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_warping.json -38d8253759c61f192b156e87c67de8674058ad9f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/rituals/ritual_wilden_summon.json -5c9d742c9d9f7c4e9edb008f162b47b8b5443405 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/agronomic_sourcelink.json -a15996ea5afdc6cb22c8836b07ff5ea9f9094f5f assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/alchemical_sourcelink.json -3db09458abf213e57f9706cd310b11b53eb49ccd assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/mycelial_sourcelink.json -b023564bc9452a188c1042830ed6d21b045b6d17 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/relay.json -e8dd3e7da488206194505f9ac3dc5f3cc1dab3a7 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/relay_collector.json -d7507128658b7179b51d141ce2b4b70864983cdc assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/relay_deposit.json -6eb48f161497d06d06d8e22fcd89cf73fad6469b assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/relay_splitter.json -62c3e2bc0a96eb2fd3f57bc5037e83b8ed3b29a7 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/relay_warp.json -9064367451a30de1e079fe457416ae9a8ceeee4e assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/source_jar.json -c1d3cc4349a72b0b4173d25b8a7a0959b6b6983a assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/vitalic_sourcelink.json -8f1a33d70f98b657d619f325b2f6fc434876ba30 assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/source/volcanic_sourcelink.json diff --git a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 b/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 deleted file mode 100644 index 9ad5c730c1..0000000000 --- a/src/generated/resources/.cache/eac00f78ae0d33a31d4f208cb05939a004e6cb91 +++ /dev/null @@ -1,68 +0,0 @@ -// 1.21.1 2024-12-15T12:10:45.2466694 AN tags -939cde8f97e4e8d7ea8445415522f703b2b927d4 data/ars_nouveau/tags/block/an_decorative.json -de95bc21249101b079255a1a00274f60d55e0602 data/ars_nouveau/tags/block/blazing_logs.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/block/break_blacklist.json -d4330c0670a8ff0476a64cff8c8e30d9e6d5d760 data/ars_nouveau/tags/block/break_with_pickaxe.json -f18ad76deff8743ab0ab66eec039a6b49e1af706 data/ars_nouveau/tags/block/cascading_logs.json -f897daf999684561d1d4a41ba1401c1e4f0a57bf data/ars_nouveau/tags/block/dowsing_rod.json -bffdd6dd7a1a644d46e5f7a0fad91ff652e495c8 data/ars_nouveau/tags/block/flourishing_logs.json -a6a64805262317e89ec5a7353c2584f80b7a9ce8 data/ars_nouveau/tags/block/golem/budding.json -d4330c0670a8ff0476a64cff8c8e30d9e6d5d760 data/ars_nouveau/tags/block/golem/cluster.json -245fdfab101831211397a667863633b9c6d8bf79 data/ars_nouveau/tags/block/gravity_blacklist.json -ca6ae04e3b5412d751537558230d824bfd86d7da data/ars_nouveau/tags/block/harvest/fellable.json -df87c9e82c58b24ac8e979c73fc3be68bf25b4b0 data/ars_nouveau/tags/block/harvest/foliage.json -7d78d30b1cc01fb43cfb8364ed31026ee0640387 data/ars_nouveau/tags/block/harvest/stems.json -5efa96a28ef2e2290cc0a0f827844a96bd9f94f2 data/ars_nouveau/tags/block/ignore_tile.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/block/interact_blacklist.json -bf1a44f8a79b447f1e7b6541e8c3d93e4ef6f71f data/ars_nouveau/tags/block/magic_plants.json -ce9ccf92ade8cd330c990516ee0f8a30c35adea9 data/ars_nouveau/tags/block/magic_saplings.json -6429b3e3e4f89e7bb44af0c2ab98368717674afc data/ars_nouveau/tags/block/no_break_drop.json -7d0c18d2019049acf42d10f3ae809011f4e968c1 data/ars_nouveau/tags/block/occludes_spell_sensor.json -b0d3df2afba9d4095985b91440f57652d9217d04 data/ars_nouveau/tags/block/storage/autopull_disabled.json -f5e3f6895ab28e98f84db162bb5a7ec0d8484aae data/ars_nouveau/tags/block/summon_bed.json -449d2dab531ac4032acb37910e9a380d07431391 data/ars_nouveau/tags/block/summon_sleepable.json -47f1f23357a86b9184362224b5c7095555f6846d data/ars_nouveau/tags/block/vexing_logs.json -981d908724ea5e1adc2db78de0da831bd18cdb1b data/ars_nouveau/tags/block/whirlisprig/greatly_likes.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/ars_nouveau/tags/block/whirlisprig/kinda_likes.json -f36268e9375442e51cbf98f2c4d573082aa56378 data/c/tags/block/bushes.json -2f9b7e099208b0e404e0f81c89f2a368e5d909da data/c/tags/block/chests.json -2f9b7e099208b0e404e0f81c89f2a368e5d909da data/c/tags/block/chests/wooden.json -87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/c/tags/block/fences.json -87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/c/tags/block/fences/wooden.json -0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/c/tags/block/fence_gates.json -0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/c/tags/block/fence_gates/wooden.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/c/tags/block/relocation_not_supported.json -0cdb8fe6639628884e8e4eaad21566b8fc40b5d3 data/c/tags/block/storage_blocks.json -7d0c18d2019049acf42d10f3ae809011f4e968c1 data/c/tags/block/storage_blocks/mage_bloom.json -6febc815f11d70abf442be0be941a9132ddd072d data/c/tags/block/storage_blocks/source_gem.json -3737e6b65e87993bd971b233c3aca5088721eb32 data/minecraft/tags/block/bee_growables.json -43a847dca5f71ae27537abc65fabcd8d3fdb1c72 data/minecraft/tags/block/buttons.json -3737e6b65e87993bd971b233c3aca5088721eb32 data/minecraft/tags/block/crops.json -a01909919207615cda1bb44f33db287efa02333b data/minecraft/tags/block/doors.json -87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/minecraft/tags/block/fences.json -0a05d2d0fafe11fe202f401f1dbed0401ced9eca data/minecraft/tags/block/fence_gates.json -538ec6e043a39f9e362acfa8b44db2f266ace007 data/minecraft/tags/block/fire.json -248bbddd99634aced7fd4adc84b0290de05f4a0a data/minecraft/tags/block/leaves.json -248bbddd99634aced7fd4adc84b0290de05f4a0a data/minecraft/tags/block/leaves/archwood_leaves.json -f2b25f247457d4d7d843b0ea99833212138f6405 data/minecraft/tags/block/logs.json -f2b25f247457d4d7d843b0ea99833212138f6405 data/minecraft/tags/block/logs_that_burn.json -e8c6b8b119d79bc393cacf55b78f9847be95731a data/minecraft/tags/block/mineable/axe.json -09d25939216754a32aee1e0e3278aa55cc5b770c data/minecraft/tags/block/mineable/hoe.json -64244edd8b8158a4fb1c4e1be3c9b10af2f36e08 data/minecraft/tags/block/mineable/pickaxe.json -f898aac12b01b598949701b1f6e45aa0cd1d9a25 data/minecraft/tags/block/planks.json -5a18f153ac2947c6cea854e2fa5be21d85eb6766 data/minecraft/tags/block/portals.json -ce9ccf92ade8cd330c990516ee0f8a30c35adea9 data/minecraft/tags/block/saplings.json -c5ffd8d59cb98c262e42a783ddf9a73a9b76ad9d data/minecraft/tags/block/slabs.json -e1f9228fcfd5239b31f41c19010ba7d145266843 data/minecraft/tags/block/snow_layer_cannot_survive_on.json -e0e9a39db9de083bbe33dbea99e0f4c0be9627d0 data/minecraft/tags/block/stairs.json -23fc13405d4dc43512deb39ee5bbbb73da177166 data/minecraft/tags/block/trapdoors.json -43a847dca5f71ae27537abc65fabcd8d3fdb1c72 data/minecraft/tags/block/wooden_buttons.json -a01909919207615cda1bb44f33db287efa02333b data/minecraft/tags/block/wooden_doors.json -87c0ae6c7a718897569f2f2b4d81fdcf8e9b269b data/minecraft/tags/block/wooden_fences.json -70afef6fe4926a8dbf1205248dc1371974ef3037 data/minecraft/tags/block/wooden_slabs.json -e5d97b748b59672ba4baec9c3f1093370adf0332 data/minecraft/tags/block/wooden_stairs.json -23fc13405d4dc43512deb39ee5bbbb73da177166 data/minecraft/tags/block/wooden_trapdoors.json -336846dc81b26d8bbe0f7a94c56cd769dc47fe1d data/sereneseasons/tags/block/autumn_crops.json -89c5ef23119c5bce8be294cd59d6c42530dca3a2 data/sereneseasons/tags/block/spring_crops.json -b71c14024b9d4ee697d0a80dcc6be06be52da98e data/sereneseasons/tags/block/summer_crops.json -abdb4d3d8f68389efc82016295267c54f9ca7f42 data/sereneseasons/tags/block/winter_crops.json diff --git a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c b/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c deleted file mode 100644 index 9a6b6bca83..0000000000 --- a/src/generated/resources/.cache/f0f2bcace349d412215f006e6183aa56b9316c3c +++ /dev/null @@ -1,84 +0,0 @@ -// 1.21.1 2024-10-19T19:02:13.8288799 Glyph Recipes -231d9f126c606465601e36e83948dda99a508834 data/ars_nouveau/recipe/glyph_accelerate.json -dbad772acd31382cfcf19c7f276da5f91354dfcf data/ars_nouveau/recipe/glyph_amplify.json -1a8499b67d1ce8614ef1d420106d32d27567eeb9 data/ars_nouveau/recipe/glyph_animate_block.json -232197139f5fa7a33b4e1d42c453833394a4c4ba data/ars_nouveau/recipe/glyph_aoe.json -c827180b8f5111736c1641e4683e63b3f764a80a data/ars_nouveau/recipe/glyph_blink.json -e7d1836f1f0438e05c86aee27c2de1d32742f217 data/ars_nouveau/recipe/glyph_bounce.json -6989360984c711d43b4e9175efbec3a23608db8e data/ars_nouveau/recipe/glyph_break.json -9af644833096edb37284b038a00e101269cd1893 data/ars_nouveau/recipe/glyph_bubble.json -c5d245630add4160c2ea36ef8df4add7a45f7616 data/ars_nouveau/recipe/glyph_burst.json -5a951b64a1a102d1e71ee5ba85524cf1877378d5 data/ars_nouveau/recipe/glyph_cold_snap.json -72ba14e65f67b1d570b69ec9ad7b99e59cd3f4b4 data/ars_nouveau/recipe/glyph_conjure_water.json -a8c81b73dd2931d4fafd62ad9a5cf1d3f625f0d4 data/ars_nouveau/recipe/glyph_craft.json -ab897cc6b68edf7d2365f61468932fcf60cbd1f4 data/ars_nouveau/recipe/glyph_crush.json -42bb3eea2f932857071a7e38f20e84ba81f482ff data/ars_nouveau/recipe/glyph_cut.json -b8fb5c3be6bed43b317f4b6b27f1910a239c594d data/ars_nouveau/recipe/glyph_dampen.json -4d25fb5ad590feac114cdaae11b3663c29fa4e4c data/ars_nouveau/recipe/glyph_decelerate.json -987bd77e5ab1c1b0436b08ae380af36eb7c6547c data/ars_nouveau/recipe/glyph_delay.json -9c6a87a8757c008c758f9ccf7887f8a58db05744 data/ars_nouveau/recipe/glyph_dispel.json -008ea29e5d898666148172f992a6ddd041bb47b0 data/ars_nouveau/recipe/glyph_duration_down.json -d4ae461ab45cdbbac689c764f298726683049a26 data/ars_nouveau/recipe/glyph_ender_inventory.json -cd873cf0d46f6ba4e2c998ed6d5a04ef597cf46c data/ars_nouveau/recipe/glyph_evaporate.json -d8d880345a737b8b24396aeef8352770ca90feab data/ars_nouveau/recipe/glyph_exchange.json -7568f1596bc768eea2ef1bda86dcd4f3a848ee4b data/ars_nouveau/recipe/glyph_explosion.json -6b8ea8aaae3fd2ca6c3c591327a0b808397259d0 data/ars_nouveau/recipe/glyph_extend_time.json -0e1e39590260c18ad420726df344e2e65d30fafa data/ars_nouveau/recipe/glyph_extract.json -07e73684b1ade6f98a368e443defda54d548c99f data/ars_nouveau/recipe/glyph_fangs.json -a81784afea6cfa82cd7708e94bd7c5c6ba02f017 data/ars_nouveau/recipe/glyph_fell.json -aa39ad2ae584abc4382a354b207a9cd026ff09d8 data/ars_nouveau/recipe/glyph_firework.json -5354678271392f1bba0c18a563a591c48c0df576 data/ars_nouveau/recipe/glyph_flare.json -c178c687f7aee57cff3a46e9b5dcd874bfb9c592 data/ars_nouveau/recipe/glyph_fortune.json -3b57b32e90f0e30fc169fcb165a9a891ffaaedf3 data/ars_nouveau/recipe/glyph_freeze.json -2f3d7dda111fd0caaa2a74ef1798f1b9d7687548 data/ars_nouveau/recipe/glyph_glide.json -58b14279016f94441c2df45760224754e2f25e63 data/ars_nouveau/recipe/glyph_gravity.json -c55af6d1555f2a7cae90a4e7b25d901f0e467181 data/ars_nouveau/recipe/glyph_grow.json -cb816f8988d010f3bceb7f24e26248f0076c2ea3 data/ars_nouveau/recipe/glyph_gust.json -7cd7b44e904811c1c1f063dbb2b12e1d0df8966f data/ars_nouveau/recipe/glyph_harm.json -35aa6f30e86f9f1ccd5de1133a19a20661149287 data/ars_nouveau/recipe/glyph_harvest.json -c4b55b257641d5e97be4b1b5f21ca56eb3403944 data/ars_nouveau/recipe/glyph_heal.json -2a8c46f95455ebf86020647b2e26820608d2128e data/ars_nouveau/recipe/glyph_hex.json -2b737657257b63876f188c39588fde7b316aa9dc data/ars_nouveau/recipe/glyph_ignite.json -7c3b09fcc5947d98b38d1a69a298201b882e77a0 data/ars_nouveau/recipe/glyph_infuse.json -b8ac8256861678647a80558a1aaa7c4703436d9c data/ars_nouveau/recipe/glyph_intangible.json -ae31357a9f8a0c3918322ac3c287263a8cfab5ac data/ars_nouveau/recipe/glyph_interact.json -0e7ac7ce215ce1e43eff2fc76d715548eed43526 data/ars_nouveau/recipe/glyph_invisibility.json -1ac6dc38d9cef8e101f9c4aba913061462b35973 data/ars_nouveau/recipe/glyph_launch.json -191be45e6b8e1a7a36c22314fafc0b53f3793fa0 data/ars_nouveau/recipe/glyph_leap.json -c769db20cc6e9dbcff0c0327e870b5e69176092b data/ars_nouveau/recipe/glyph_light.json -b4d02e99a79be1d9f2a1f134a68a8b891e3cd46a data/ars_nouveau/recipe/glyph_lightning.json -2df04f2acf02666969cb91de1041ef827f009f16 data/ars_nouveau/recipe/glyph_linger.json -a33daf748ab3dab2279e9a2da7c984c53f3e3e12 data/ars_nouveau/recipe/glyph_name.json -7911daac7df742c40d4fde6edc370d58c331461c data/ars_nouveau/recipe/glyph_orbit.json -1e8cfd09d0a8886145eb70a721274d477f40d500 data/ars_nouveau/recipe/glyph_pantomime.json -395c37ef2bc2ec7a1195e046f0bf2ea575a05675 data/ars_nouveau/recipe/glyph_phantom_block.json -18f917d7d13955d3fe0a7a37181e6825c0186da4 data/ars_nouveau/recipe/glyph_pickup.json -2fbf32d7c45ee4783d83e24ffc87ee8702372415 data/ars_nouveau/recipe/glyph_pierce.json -96288b4456decd13d7fd768a0a62a2111797903d data/ars_nouveau/recipe/glyph_place_block.json -7429c6abe680095a97ee3155dc17b7faaa71e7cb data/ars_nouveau/recipe/glyph_projectile.json -1eb1af37b7715393e536308f211ffb0e6caba19a data/ars_nouveau/recipe/glyph_pull.json -69dd8532fe7b5dae62ec98abbe7711e9f5131a4c data/ars_nouveau/recipe/glyph_randomize.json -ea45f8d2be917a600d659aa540731fccb150264b data/ars_nouveau/recipe/glyph_redstone_signal.json -c520920d02f486e8f8c7fcb0412c365d7a7c012d data/ars_nouveau/recipe/glyph_rotate.json -1c66a7a6be218c3cbc7414a8440c70768627fb8c data/ars_nouveau/recipe/glyph_rune.json -b2f64840be388a3554da4378ee2bedf0aaa2f88a data/ars_nouveau/recipe/glyph_self.json -792225624855fbfca03f66bd9fbebdb7667b9563 data/ars_nouveau/recipe/glyph_sense_magic.json -969ff52182ee67595d7802b0805e7abc698d0465 data/ars_nouveau/recipe/glyph_sensitive.json -5fb2abe9c980b7ab9ab6038bfaee0f00b3e07786 data/ars_nouveau/recipe/glyph_slowfall.json -2712e80ff047431f2ff378a3954b3e93fb879e1a data/ars_nouveau/recipe/glyph_smelt.json -62a0cf6ce285c640c91a00807ba5a643e64cb4d9 data/ars_nouveau/recipe/glyph_snare.json -256490178cef30838be78dc288d3b1a321798993 data/ars_nouveau/recipe/glyph_split.json -e0ec2068e57d19949f8b7213387f96673ceb2085 data/ars_nouveau/recipe/glyph_summon_decoy.json -9dd317e86bfb62fcfb1665e0deb2016642cccd33 data/ars_nouveau/recipe/glyph_summon_steed.json -4dec31b0851b4090e0c9ba1f677cd485d67c7885 data/ars_nouveau/recipe/glyph_summon_undead.json -8bd6c68acdf6ec4fda4c2ab7ea2645adcd209357 data/ars_nouveau/recipe/glyph_summon_vex.json -bb56552835fa27efc459b95f60a02bb767c08661 data/ars_nouveau/recipe/glyph_summon_wolves.json -77340a1e0ace0df0ec3fc593bca81245c18b9746 data/ars_nouveau/recipe/glyph_toss.json -db19c804b364f5ff7c081e6f3f658effd5ba556a data/ars_nouveau/recipe/glyph_touch.json -cb00129024d9b53917b02aeca2f33e4eeae547d4 data/ars_nouveau/recipe/glyph_underfoot.json -39d5a88c68997e3f5fd6f172aacf29130da5beff data/ars_nouveau/recipe/glyph_wall.json -18575eed1eb8c235743d1b3e84a0073240d65d12 data/ars_nouveau/recipe/glyph_wind_shear.json -d1a64ab03f22393c77b75dbb271f2cc1ba2a416e data/ars_nouveau/recipe/glyph_wither.json -a40fe2e80c72faf58a0878e1b63bcee9ad6b39c4 data/ars_nouveau/recipe/reset.json -57e04103e141ca3d58341737ce5df01c3682be13 data/ars_nouveau/recipe/rewind.json -67a04eec7019ec33e114f5a5815fa93ae59bf684 data/ars_nouveau/recipe/wololo.json diff --git a/src/generated/resources/.cache/f49682cfc17456297bb895b136258055d85afc0c b/src/generated/resources/.cache/f49682cfc17456297bb895b136258055d85afc0c deleted file mode 100644 index 58165ae490..0000000000 --- a/src/generated/resources/.cache/f49682cfc17456297bb895b136258055d85afc0c +++ /dev/null @@ -1,16 +0,0 @@ -// 1.21.1 2024-08-17T10:54:39.2031315 ArsNouveau: Json Datagen -e59d0832c1d168df4772338fe24485c4b6b94723 data/ars_nouveau/recipe/dye_apprentice_spell_book.json -d89b9456df55cd4bd1c30fa9fa253ac31fc7bf37 data/ars_nouveau/recipe/dye_arcanist_boots.json -9e0bcbe43d8ea6f0c1d354eb28878c8053ebe006 data/ars_nouveau/recipe/dye_arcanist_hood.json -41253ba787d247092cc0aa01a63f611f1960d495 data/ars_nouveau/recipe/dye_arcanist_leggings.json -189ad235d1115d185132d8d04fdac48e615a785b data/ars_nouveau/recipe/dye_arcanist_robes.json -29defc84bb87d7412f33f288516e36f45552dda9 data/ars_nouveau/recipe/dye_archmage_spell_book.json -2bf5abd01fa5e7206391bce9f1f7e7323b49af1c data/ars_nouveau/recipe/dye_battlemage_boots.json -172bcb20f3c1e37210dc0049f021bdbb1cb4db09 data/ars_nouveau/recipe/dye_battlemage_hood.json -ee135fc9c4739d1c73fb8e98288a5b24c6f518a6 data/ars_nouveau/recipe/dye_battlemage_leggings.json -f6099c592818ed29dc459e38f1e3da1a682da357 data/ars_nouveau/recipe/dye_battlemage_robes.json -4bbbd1b2d5198c2c905ba478db19c3c89088130e data/ars_nouveau/recipe/dye_novice_spell_book.json -30f621c895fd77d008e986f9e4270a3a6f814f2a data/ars_nouveau/recipe/dye_sorcerer_boots.json -afc5b6ee4ae0d417f1577d42b7fc8b9ab8b59207 data/ars_nouveau/recipe/dye_sorcerer_hood.json -64d136a9e98f5a1900692bd5fd5338f2b2691101 data/ars_nouveau/recipe/dye_sorcerer_leggings.json -5b91e0567ec0850bc91d899bfa91fc74faae4627 data/ars_nouveau/recipe/dye_sorcerer_robes.json From 682dd1f2da53948082ca883105d665cb86d34069 Mon Sep 17 00:00:00 2001 From: Qther Date: Thu, 2 Jan 2025 05:06:33 +0800 Subject: [PATCH 337/363] feat: make adjustable spell turrets use placer uuid from BasicSpellTurretTile (#1564) --- .../arsnouveau/common/block/tile/BasicSpellTurretTile.java | 2 +- .../arsnouveau/common/block/tile/RotatingTurretTile.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java index b452a5892b..d893bb0502 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java @@ -41,7 +41,7 @@ public class BasicSpellTurretTile extends ModdedTile implements ITooltipProvider boolean playRecoil; protected SpellCaster spellCaster = new SpellCaster(0, null, false, null, 1); - private @Nullable UUID uuid = null; + @Nullable UUID uuid = null; public BasicSpellTurretTile(BlockEntityType p_i48289_1_, BlockPos pos, BlockState state) { super(p_i48289_1_, pos, state); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RotatingTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RotatingTurretTile.java index efdcba87ac..2ad969001b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RotatingTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RotatingTurretTile.java @@ -12,6 +12,7 @@ import com.hollingsworth.arsnouveau.common.network.PacketOneShotAnimation; import com.hollingsworth.arsnouveau.common.util.PortUtil; import com.hollingsworth.arsnouveau.setup.registry.BlockRegistry; +import com.mojang.authlib.GameProfile; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; @@ -27,6 +28,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.common.util.FakePlayer; +import net.neoforged.neoforge.common.util.FakePlayerFactory; import org.jetbrains.annotations.Nullable; import static net.minecraft.core.Direction.*; @@ -156,7 +158,9 @@ public void shootSpell() { return; Networking.sendToNearbyClient(level, pos, new PacketOneShotAnimation(pos)); Position iposition = RotatingSpellTurret.getDispensePosition(pos, this); - FakePlayer fakePlayer = ANFakePlayer.getPlayer(level); + FakePlayer fakePlayer = uuid != null + ? FakePlayerFactory.get(level, new GameProfile(uuid, "")) + : ANFakePlayer.getPlayer(level); fakePlayer.setPos(pos.getX(), pos.getY(), pos.getZ()); EntitySpellResolver resolver = new EntitySpellResolver(new SpellContext(level, spellCaster.getSpell(), fakePlayer, new TileCaster(this, SpellContext.CasterType.TURRET))); if (resolver.castType != null && RotatingSpellTurret.ROT_TURRET_BEHAVIOR_MAP.containsKey(resolver.castType)) { From edd1cad3693d796f4d65bc7d74f831afe72b026c Mon Sep 17 00:00:00 2001 From: Qther Date: Thu, 2 Jan 2025 05:09:05 +0800 Subject: [PATCH 338/363] fix: re-add enchantments to worn notebook (#1562) Co-authored-by: Bailey Hollingsworth --- .../entries/enchantments/aqua_affinity.json | 11 ++++++ .../enchantments/bane_of_arthropods.json | 27 +++++++++++++ .../enchantments/blast_protection.json | 23 +++++++++++ .../entries/enchantments/depth_strider.json | 19 +++++++++ .../entries/enchantments/efficiency.json | 27 +++++++++++++ .../entries/enchantments/feather_falling.json | 23 +++++++++++ .../entries/enchantments/fire_aspect.json | 15 +++++++ .../entries/enchantments/fire_protection.json | 23 +++++++++++ .../en_us/entries/enchantments/flame.json | 11 ++++++ .../en_us/entries/enchantments/fortune.json | 19 +++++++++ .../en_us/entries/enchantments/infinity.json | 11 ++++++ .../en_us/entries/enchantments/knockback.json | 15 +++++++ .../en_us/entries/enchantments/looting.json | 19 +++++++++ .../entries/enchantments/mana_boost.json | 19 +++++++++ .../entries/enchantments/mana_regen.json | 19 +++++++++ .../en_us/entries/enchantments/multishot.json | 11 ++++++ .../en_us/entries/enchantments/piercing.json | 23 +++++++++++ .../en_us/entries/enchantments/power.json | 27 +++++++++++++ .../enchantments/projectile_protection.json | 23 +++++++++++ .../entries/enchantments/protection.json | 23 +++++++++++ .../en_us/entries/enchantments/punch.json | 15 +++++++ .../entries/enchantments/quick_charge.json | 19 +++++++++ .../entries/enchantments/respiration.json | 19 +++++++++ .../en_us/entries/enchantments/sharpness.json | 27 +++++++++++++ .../entries/enchantments/silk_touch.json | 11 ++++++ .../en_us/entries/enchantments/smite.json | 27 +++++++++++++ .../entries/enchantments/sweeping_edge.json | 19 +++++++++ .../en_us/entries/enchantments/thorns.json | 19 +++++++++ .../entries/enchantments/unbreaking.json | 19 +++++++++ .../common/datagen/EnchantmentProvider.java | 5 +++ .../arsnouveau/common/datagen/ModDatagen.java | 3 +- .../common/datagen/PatchouliProvider.java | 39 +++++++++++++++---- 32 files changed, 601 insertions(+), 9 deletions(-) create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/aqua_affinity.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/bane_of_arthropods.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/blast_protection.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/depth_strider.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/efficiency.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/feather_falling.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/fire_aspect.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/fire_protection.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/flame.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/fortune.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/infinity.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/knockback.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/looting.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/mana_boost.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/mana_regen.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/multishot.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/piercing.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/power.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/projectile_protection.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/protection.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/punch.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/quick_charge.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/respiration.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/sharpness.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/silk_touch.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/smite.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/sweeping_edge.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/thorns.json create mode 100644 src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/unbreaking.json diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/aqua_affinity.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/aqua_affinity.json new file mode 100644 index 0000000000..a64876517b --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/aqua_affinity.json @@ -0,0 +1,11 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.aqua_affinity", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:aqua_affinity_1" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/bane_of_arthropods.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/bane_of_arthropods.json new file mode 100644 index 0000000000..ec031e16a8 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/bane_of_arthropods.json @@ -0,0 +1,27 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.bane_of_arthropods", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:bane_of_arthropods_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:bane_of_arthropods_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:bane_of_arthropods_3" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:bane_of_arthropods_4" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:bane_of_arthropods_5" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/blast_protection.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/blast_protection.json new file mode 100644 index 0000000000..f40baacd70 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/blast_protection.json @@ -0,0 +1,23 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.blast_protection", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:blast_protection_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:blast_protection_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:blast_protection_3" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:blast_protection_4" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/depth_strider.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/depth_strider.json new file mode 100644 index 0000000000..4ab8fd48a4 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/depth_strider.json @@ -0,0 +1,19 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.depth_strider", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:depth_strider_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:depth_strider_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:depth_strider_3" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/efficiency.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/efficiency.json new file mode 100644 index 0000000000..3105d78404 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/efficiency.json @@ -0,0 +1,27 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.efficiency", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:efficiency_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:efficiency_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:efficiency_3" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:efficiency_4" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:efficiency_5" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/feather_falling.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/feather_falling.json new file mode 100644 index 0000000000..3818a0f0c4 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/feather_falling.json @@ -0,0 +1,23 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.feather_falling", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:feather_falling_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:feather_falling_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:feather_falling_3" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:feather_falling_4" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/fire_aspect.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/fire_aspect.json new file mode 100644 index 0000000000..469f18690e --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/fire_aspect.json @@ -0,0 +1,15 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.fire_aspect", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:fire_aspect_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:fire_aspect_2" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/fire_protection.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/fire_protection.json new file mode 100644 index 0000000000..14a4beed28 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/fire_protection.json @@ -0,0 +1,23 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.fire_protection", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:fire_protection_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:fire_protection_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:fire_protection_3" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:fire_protection_4" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/flame.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/flame.json new file mode 100644 index 0000000000..87ebab4056 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/flame.json @@ -0,0 +1,11 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.flame", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:flame_1" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/fortune.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/fortune.json new file mode 100644 index 0000000000..2b535d79a3 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/fortune.json @@ -0,0 +1,19 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.fortune", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:fortune_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:fortune_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:fortune_3" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/infinity.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/infinity.json new file mode 100644 index 0000000000..2de38e2b14 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/infinity.json @@ -0,0 +1,11 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.infinity", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:infinity_1" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/knockback.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/knockback.json new file mode 100644 index 0000000000..5180ec3c07 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/knockback.json @@ -0,0 +1,15 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.knockback", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:knockback_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:knockback_2" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/looting.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/looting.json new file mode 100644 index 0000000000..3f6a0df225 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/looting.json @@ -0,0 +1,19 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.looting", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:looting_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:looting_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:looting_3" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/mana_boost.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/mana_boost.json new file mode 100644 index 0000000000..d22e878d2a --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/mana_boost.json @@ -0,0 +1,19 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.ars_nouveau.mana_boost", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:mana_boost_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:mana_boost_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:mana_boost_3" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/mana_regen.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/mana_regen.json new file mode 100644 index 0000000000..023e71f2ca --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/mana_regen.json @@ -0,0 +1,19 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.ars_nouveau.mana_regen", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:mana_regen_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:mana_regen_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:mana_regen_3" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/multishot.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/multishot.json new file mode 100644 index 0000000000..ded57db370 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/multishot.json @@ -0,0 +1,11 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.multishot", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:multishot_1" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/piercing.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/piercing.json new file mode 100644 index 0000000000..a768a4e1b0 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/piercing.json @@ -0,0 +1,23 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.piercing", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:piercing_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:piercing_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:piercing_3" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:piercing_4" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/power.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/power.json new file mode 100644 index 0000000000..1af3b333a0 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/power.json @@ -0,0 +1,27 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.power", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:power_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:power_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:power_3" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:power_4" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:power_5" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/projectile_protection.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/projectile_protection.json new file mode 100644 index 0000000000..507cdb1902 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/projectile_protection.json @@ -0,0 +1,23 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.projectile_protection", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:projectile_protection_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:projectile_protection_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:projectile_protection_3" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:projectile_protection_4" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/protection.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/protection.json new file mode 100644 index 0000000000..15555513c1 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/protection.json @@ -0,0 +1,23 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.protection", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:protection_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:protection_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:protection_3" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:protection_4" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/punch.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/punch.json new file mode 100644 index 0000000000..b2033e0eb2 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/punch.json @@ -0,0 +1,15 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.punch", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:punch_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:punch_2" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/quick_charge.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/quick_charge.json new file mode 100644 index 0000000000..9df948de2c --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/quick_charge.json @@ -0,0 +1,19 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.quick_charge", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:quick_charge_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:quick_charge_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:quick_charge_3" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/respiration.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/respiration.json new file mode 100644 index 0000000000..33b2f34155 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/respiration.json @@ -0,0 +1,19 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.respiration", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:respiration_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:respiration_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:respiration_3" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/sharpness.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/sharpness.json new file mode 100644 index 0000000000..f3ae480c88 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/sharpness.json @@ -0,0 +1,27 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.sharpness", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:sharpness_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:sharpness_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:sharpness_3" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:sharpness_4" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:sharpness_5" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/silk_touch.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/silk_touch.json new file mode 100644 index 0000000000..e119e9230d --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/silk_touch.json @@ -0,0 +1,11 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.silk_touch", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:silk_touch_1" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/smite.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/smite.json new file mode 100644 index 0000000000..0ff3725044 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/smite.json @@ -0,0 +1,27 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.smite", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:smite_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:smite_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:smite_3" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:smite_4" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:smite_5" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/sweeping_edge.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/sweeping_edge.json new file mode 100644 index 0000000000..fb3ef178b8 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/sweeping_edge.json @@ -0,0 +1,19 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.sweeping_edge", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:sweeping_edge_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:sweeping_edge_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:sweeping_edge_3" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/thorns.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/thorns.json new file mode 100644 index 0000000000..fdbe3b89df --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/thorns.json @@ -0,0 +1,19 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.thorns", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:thorns_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:thorns_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:thorns_3" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/unbreaking.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/unbreaking.json new file mode 100644 index 0000000000..a2a12f0480 --- /dev/null +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/enchantments/unbreaking.json @@ -0,0 +1,19 @@ +{ + "category": "ars_nouveau:enchantments", + "icon": "minecraft:enchanted_book", + "name": "enchantment.minecraft.unbreaking", + "pages": [ + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:unbreaking_1" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:unbreaking_2" + }, + { + "type": "ars_nouveau:enchanting_recipe", + "recipe": "ars_nouveau:unbreaking_3" + } + ] +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EnchantmentProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EnchantmentProvider.java index 7b63aa4ac0..ce330e429f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EnchantmentProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/EnchantmentProvider.java @@ -5,6 +5,7 @@ import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import net.minecraft.core.HolderGetter; import net.minecraft.core.HolderLookup; +import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistrySetBuilder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; @@ -93,6 +94,10 @@ public String getName() { return "Ars Nouveau's Enchantment Data"; } + public static HolderLookup.Provider createLookup() { + RegistryAccess.Frozen frozen = RegistryAccess.fromRegistryOfRegistries(BuiltInRegistries.REGISTRY); + return BUILDER.build(frozen); + } public static class EnchantmentTagsProvider extends net.minecraft.data.tags.EnchantmentTagsProvider { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java index e4741ca5ab..0d38b50432 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ModDatagen.java @@ -31,7 +31,6 @@ public static void datagen(GatherDataEvent event) { event.getGenerator().addProvider(event.includeServer(), new BlockStatesDatagen(output, ArsNouveau.MODID, fileHelper)); event.getGenerator().addProvider(event.includeServer(), new GlyphRecipeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new ApparatusRecipeProvider(event.getGenerator())); - event.getGenerator().addProvider(event.includeServer(), new PatchouliProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new DefaultTableProvider(output, provider)); event.getGenerator().addProvider(event.includeServer(), new ImbuementRecipeProvider(event.getGenerator())); event.getGenerator().addProvider(event.includeServer(), new CrushRecipeProvider(event.getGenerator())); @@ -60,6 +59,8 @@ public static void datagen(GatherDataEvent event) { event.getGenerator().addProvider(event.includeServer(), new ANCurioProvider(output, fileHelper, provider)); + event.getGenerator().addProvider(event.includeServer(), new PatchouliProvider(event.getGenerator(), provider)); + DatapackBuiltinEntriesProvider datapackProvider = new WorldgenProvider(output, provider); event.getGenerator().addProvider(event.includeServer(), datapackProvider); CompletableFuture lookupProvider = datapackProvider.getRegistryProvider(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java index 9dbac0c29a..a1c40d13e2 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java @@ -21,8 +21,12 @@ import com.hollingsworth.arsnouveau.setup.registry.EnchantmentRegistry; import com.hollingsworth.arsnouveau.setup.registry.ItemsRegistry; import com.hollingsworth.arsnouveau.setup.registry.ModEntities; +import net.minecraft.client.Minecraft; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; +import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; @@ -37,6 +41,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.concurrent.CompletableFuture; import static com.hollingsworth.arsnouveau.setup.registry.RegistryHelper.getRegistryName; @@ -62,8 +67,11 @@ public class PatchouliProvider extends SimpleDataProvider{ public List pages = new ArrayList<>(); - public PatchouliProvider(DataGenerator generatorIn) { + public CompletableFuture registries; + + public PatchouliProvider(DataGenerator generatorIn, CompletableFuture registries) { super(generatorIn); + this.registries = registries; } public void addEntries() { @@ -760,13 +768,28 @@ public void addRitualPage(AbstractRitual ritual) { this.pages.add(new PatchouliPage(builder, this.output.resolve("assets/" + ritual.getRegistryName().getNamespace() + "/patchouli_books/worn_notebook/en_us/entries/rituals/" + ritual.getRegistryName().getPath() + ".json"))); } - public void addEnchantmentPage(ResourceKey enchantment) { -// PatchouliBuilder builder = new PatchouliBuilder(ENCHANTMENTS, enchantment.getDescriptionId()) -// .withIcon(getRegistryName(Items.ENCHANTED_BOOK).toString()); -// for (int i = enchantment.getMinLevel(); i <= enchantment.getMaxLevel(); i++) { -// builder.withPage(new EnchantingPage("ars_nouveau:" + enchantment.location().getPath() + "_" + i)); -// } -// this.pages.add(new PatchouliPage(builder, this.output.resolve("assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/" + enchantment.location().getPath() + ".json"))); + public void addEnchantmentPage(ResourceKey enchKey) { + var provider = this.registries.join(); + var enchantmentRegistry = provider.lookupOrThrow(Registries.ENCHANTMENT); + var maybeEnchant = enchantmentRegistry.get(enchKey); + if (maybeEnchant.isEmpty()) { + var arsEnchantmentRegistry = EnchantmentProvider.createLookup(); + maybeEnchant = arsEnchantmentRegistry.lookupOrThrow(Registries.ENCHANTMENT).get(enchKey); + } + if (maybeEnchant.isEmpty()) { + return; + } + var enchantment = maybeEnchant.get().value(); + + var path = enchKey.location().getPath(); + PatchouliBuilder builder = new PatchouliBuilder(ENCHANTMENTS, path) + .withName(((TranslatableContents) enchantment.description().getContents()).getKey()) + .withIcon(Items.ENCHANTED_BOOK); + + for (int i = enchantment.getMinLevel(); i <= enchantment.getMaxLevel(); i++) { + builder.withPage(new EnchantingPage("ars_nouveau:" + path + "_" + i)); + } + addPage(builder, getPath(ENCHANTMENTS, path)); } public void addPerkPage(IPerk perk){ From f228d8a5e86bde6c9287e7b2b273119dc3b601fc Mon Sep 17 00:00:00 2001 From: Qther Date: Thu, 2 Jan 2025 05:11:05 +0800 Subject: [PATCH 339/363] fix: jarred villagers should not restock before player exits gui (#1559) --- .../common/mob_jar/VillagerBehavior.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/VillagerBehavior.java b/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/VillagerBehavior.java index f2be038ceb..5990a55a70 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/VillagerBehavior.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/mob_jar/VillagerBehavior.java @@ -10,17 +10,20 @@ public void tick(MobJarTile tile) { if(tile.getLevel().isClientSide) return; Villager villager = entityFromJar(tile); - if (!villager.isTrading() && villager.updateMerchantTimer > 0) { - --villager.updateMerchantTimer; - if (villager.updateMerchantTimer <= 0) { - if (villager.increaseProfessionLevelOnUpdate) { - villager.increaseMerchantCareer(); - villager.increaseProfessionLevelOnUpdate = false; + if (!villager.isTrading()) { + if (villager.updateMerchantTimer > 0) { + --villager.updateMerchantTimer; + if (villager.updateMerchantTimer <= 0) { + if (villager.increaseProfessionLevelOnUpdate) { + villager.increaseMerchantCareer(); + villager.increaseProfessionLevelOnUpdate = false; + } } } - } - if(villager.shouldRestock()){ - villager.restock(); + + if (villager.shouldRestock()) { + villager.restock(); + } } } } From 9dab256c58fe780345af727b11f1f31bcf1c2945 Mon Sep 17 00:00:00 2001 From: Qther Date: Thu, 2 Jan 2025 05:12:34 +0800 Subject: [PATCH 340/363] fix: recipe for Reactive 1 not showing properly in worn notebook (#1560) Co-authored-by: Bailey Hollingsworth --- .../en_us/entries/equipment/reactive_enchantment.json | 2 +- .../arsnouveau/common/datagen/PatchouliProvider.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/reactive_enchantment.json b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/reactive_enchantment.json index 10631bd02b..3b86514c61 100644 --- a/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/reactive_enchantment.json +++ b/src/generated/resources/assets/ars_nouveau/patchouli_books/worn_notebook/en_us/entries/equipment/reactive_enchantment.json @@ -9,7 +9,7 @@ }, { "type": "ars_nouveau:enchanting_recipe", - "recipe": "ars_nouveau:reactive_1" + "recipe": "ars_nouveau:reactive" }, { "type": "patchouli:text", diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java index a1c40d13e2..dce232be31 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/PatchouliProvider.java @@ -221,7 +221,7 @@ public void addEntries() { addPage(new PatchouliBuilder(EQUIPMENT, "reactive_enchantment") .withIcon(Items.ENCHANTED_BOOK) .withLocalizedText() - .withPage(new EnchantingPage("ars_nouveau:" + EnchantmentRegistry.REACTIVE_ENCHANTMENT.location().getPath() + "_" + 1)) + .withPage(new EnchantingPage("ars_nouveau:" + EnchantmentRegistry.REACTIVE_ENCHANTMENT.location().getPath())) .withLocalizedText() .withPage(new EnchantingPage("ars_nouveau:" + EnchantmentRegistry.REACTIVE_ENCHANTMENT.location().getPath() + "_" + 2)) .withPage(new EnchantingPage("ars_nouveau:" + EnchantmentRegistry.REACTIVE_ENCHANTMENT.location().getPath() + "_" + 3)) From 60f91605a95546c32886d3589e2a77ab37ee5f00 Mon Sep 17 00:00:00 2001 From: Qther Date: Thu, 2 Jan 2025 05:12:49 +0800 Subject: [PATCH 341/363] fix: caster tome double flavor text when holding shift (#1558) --- .../com/hollingsworth/arsnouveau/common/items/CasterTome.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java index dbbb9a083e..5e4bc9da2b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/CasterTome.java @@ -64,7 +64,7 @@ public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext co getInformation(stack, context, tooltip2, flagIn); } - if (!caster.getFlavorText().isEmpty()) + if (!Screen.hasShiftDown() && !caster.getFlavorText().isEmpty()) tooltip2.add(Component.literal(caster.getFlavorText()).withStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.BLUE))); tooltip2.add(Component.translatable("tooltip.ars_nouveau.caster_tome")); From 261cfa63aafed45ab8fba1e5ee5ddf2d5049c813 Mon Sep 17 00:00:00 2001 From: Qther Date: Thu, 2 Jan 2025 05:13:03 +0800 Subject: [PATCH 342/363] fix: alakarkinos cold ruins conversion uses warm ruins loot table (#1557) * fix: alakarkinos cold ruins conversion uses warm ruins loot table * run datagen --- .../ars_nouveau/recipe/alakarkinos/ocean_ruins_cold.json | 2 +- .../arsnouveau/common/datagen/AlakarkinosRecipeProvider.java | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/ocean_ruins_cold.json b/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/ocean_ruins_cold.json index 969602fbb0..ff5bd30585 100644 --- a/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/ocean_ruins_cold.json +++ b/src/generated/resources/data/ars_nouveau/recipe/alakarkinos/ocean_ruins_cold.json @@ -1,6 +1,6 @@ { "type": "ars_nouveau:alakarkinos_conversion", "input": "minecraft:gravel", - "table": "minecraft:archaeology/ocean_ruin_warm", + "table": "minecraft:archaeology/ocean_ruin_cold", "weight": 25 } \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AlakarkinosRecipeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AlakarkinosRecipeProvider.java index 4df8ce772e..6038c23666 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AlakarkinosRecipeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/AlakarkinosRecipeProvider.java @@ -36,12 +36,9 @@ protected void addEntries() { recipes.add(new Wrapper(ArsNouveau.prefix( "desert_pyramid"), new AlakarkinosRecipe(Blocks.SAND, BuiltInLootTables.DESERT_PYRAMID_ARCHAEOLOGY, 25))); recipes.add(new Wrapper(ArsNouveau.prefix( "ocean_ruins_warm"), new AlakarkinosRecipe(Blocks.SAND, BuiltInLootTables.OCEAN_RUIN_WARM_ARCHAEOLOGY, 25))); - - - recipes.add(new Wrapper(ArsNouveau.prefix( "ocean_ruins_cold"), new AlakarkinosRecipe(Blocks.GRAVEL, BuiltInLootTables.OCEAN_RUIN_WARM_ARCHAEOLOGY, 25))); + recipes.add(new Wrapper(ArsNouveau.prefix( "ocean_ruins_cold"), new AlakarkinosRecipe(Blocks.GRAVEL, BuiltInLootTables.OCEAN_RUIN_COLD_ARCHAEOLOGY, 25))); recipes.add(new Wrapper(ArsNouveau.prefix( "trail_ruins_common"), new AlakarkinosRecipe(Blocks.GRAVEL, BuiltInLootTables.TRAIL_RUINS_ARCHAEOLOGY_COMMON, 100))); - recipes.add(new Wrapper(ArsNouveau.prefix( "trail_ruins_rare"), new AlakarkinosRecipe(Blocks.GRAVEL, BuiltInLootTables.TRAIL_RUINS_ARCHAEOLOGY_RARE, 25))); } From 5003eb95148361483896b3b777f700c84cd09ea5 Mon Sep 17 00:00:00 2001 From: Qther Date: Thu, 2 Jan 2025 05:14:19 +0800 Subject: [PATCH 343/363] fix: tier displays for armor (#1553) this issue was caused by ars_nouveau.tier changing from "Tier %s" to "Tier" some time ago. This commit rolls that change back, but since the new definition is used in GlyphProcessor, it adds ars_nouveau.spell_tier for that use case. --- src/generated/resources/assets/ars_nouveau/lang/en_us.json | 3 ++- .../arsnouveau/client/patchouli/GlyphProcessor.java | 2 +- .../hollingsworth/arsnouveau/common/datagen/LangDatagen.java | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index 511bd0dc1e..c4246b6db4 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -1171,6 +1171,7 @@ "ars_nouveau.spell_parchment.no_spell": "Set your spell book to a spell.", "ars_nouveau.spell_schools": "Spell Schools", "ars_nouveau.spell_set": "Spell set.", + "ars_nouveau.spell_tier": "Tier: %s", "ars_nouveau.spell_tier.1": "ONE", "ars_nouveau.spell_tier.2": "TWO", "ars_nouveau.spell_tier.3": "THREE", @@ -1216,7 +1217,7 @@ "ars_nouveau.thread_layout": "Thread Tiers", "ars_nouveau.thread_of": "Thread of %s", "ars_nouveau.threads": "Thread Slots", - "ars_nouveau.tier": "Tier", + "ars_nouveau.tier": "Tier %s", "ars_nouveau.tier_1_spells": "Tier 1 Glyphs", "ars_nouveau.tier_1_spells_desc": "Glyphs that may be cast using a Novice Spellbook.", "ars_nouveau.tier_2_spells": "Tier 2 Glyphs", diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/GlyphProcessor.java b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/GlyphProcessor.java index e9c9a21eaf..0f67371daf 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/GlyphProcessor.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/patchouli/GlyphProcessor.java @@ -34,7 +34,7 @@ public IVariable process(Level level, String s) { return null; var recipe = holder.value(); if (s.equals("tier")) { - return IVariable.wrap(Component.translatable("ars_nouveau.tier").getString() + ": " + Component.translatable("ars_nouveau.spell_tier." + recipe.getSpellPart().getConfigTier().value).getString()); + return IVariable.wrap(Component.translatable("ars_nouveau.spell_tier", Component.translatable("ars_nouveau.spell_tier." + recipe.getSpellPart().getConfigTier().value)).getString()); } if (s.equals("schools")) { AbstractSpellPart part = ((Glyph) recipe.output.getItem()).spellPart; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index 7d45b45e19..e7ed7c8078 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -310,6 +310,7 @@ protected void addTranslations() { add("ars_nouveau.thread_of", "Thread of %s"); add("ars_nouveau.book.name", "Worn Notebook"); add("ars_nouveau.book.landing_text", "Ars Nouveau provides spell crafting, magical devices, powerful trinkets, and magical entity automation. To help development or report issues, join the community: https://discord.gg/y7TMXZu Thank you for playing."); + add("ars_nouveau.spell_tier", "Tier: %s"); add("ars_nouveau.spell_tier.1", "ONE"); add("ars_nouveau.spell_tier.2", "TWO"); add("ars_nouveau.spell_tier.3", "THREE"); @@ -640,7 +641,7 @@ protected void addTranslations() { add("ars_nouveau.page.weald_walker", "Weald Walkers"); add("ars_nouveau.spell_schools", "Spell Schools"); add("ars_nouveau.casting_cost", "Casting Cost"); - add("ars_nouveau.tier", "Tier"); + add("ars_nouveau.tier", "Tier %s"); add("ars_nouveau.page.agronomic_sourcelink", "The Agronomic Sourcelink generates source from crop and tree growth within 15 blocks. Bonus source is generated for magical plants such as Mageblooms, Source Berry Bushes, and Archwood Saplings. Source will be output from the Sourcelink to nearby jars within 5 blocks. Note: Bonemealing crops will not grant Source."); add("ars_nouveau.page.source_jar", "Source Jars store source gathered from nearby Sourcelinks. Source is used in glyphs and rituals by powering devices like the Imbuement Chamber and Enchanting Apparatus. Source may be moved using a Source Relay or by breaking and moving it. To use Source in a jar, simply place the jar near your desired device. Source Jars will provide a signal to Redstone Comparators based on their fill level."); add("ars_nouveau.page1.volcanic_sourcelink", "The Volcanic Sourcelink generates Source by consuming burnable items. Archwood logs will generate bonus Source, with Blazing Archwood generating the most. As the Volcanic Sourcelink produces Source, it also produces $(item)heat$(), used for spawning Lava Lilies and converting stone into lava. The Volcanic Sourcelink automatically outputs to nearby jars, starting with the one closest to it."); From cb747f83b20bfd387a367b028c96d0a235d77ff7 Mon Sep 17 00:00:00 2001 From: Darshan Phaldesai <51489635+dphaldes@users.noreply.github.com> Date: Wed, 1 Jan 2025 14:14:54 -0700 Subject: [PATCH 344/363] fix capability checks by inverting direction (#1550) --- .../java/com/hollingsworth/arsnouveau/api/util/InvUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java index 673f8a82c8..bd4d96f4cb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/InvUtil.java @@ -29,7 +29,7 @@ public static List adjacentInventories(Level level, Block if (adjacentInvTile == null || adjacentInvTile.isRemoved()) continue; - IItemHandler handler = level.getCapability(Capabilities.ItemHandler.BLOCK, relativePos, level.getBlockState(relativePos), adjacentInvTile, d); + IItemHandler handler = level.getCapability(Capabilities.ItemHandler.BLOCK, relativePos, level.getBlockState(relativePos), adjacentInvTile, d.getOpposite()); if(handler == null) continue; inventories.add(new FilterableItemHandler(handler, filtersOnTile(adjacentInvTile))); From 63d83271329c13a78b1508f5b720a0d1a49d7393 Mon Sep 17 00:00:00 2001 From: Qther Date: Thu, 2 Jan 2025 05:59:03 +0800 Subject: [PATCH 345/363] feat: spellbook control improvements (#1544) --- .../client/gui/book/GuiSpellBook.java | 214 +++++++++++++----- 1 file changed, 156 insertions(+), 58 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java index 9127dcfe12..567fc1d08d 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/gui/book/GuiSpellBook.java @@ -46,8 +46,10 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.ItemStack; +import org.lwjgl.glfw.GLFW; import java.net.URI; import java.net.URISyntaxException; @@ -87,7 +89,6 @@ public class GuiSpellBook extends BaseBook { public CreateSpellButton createSpellButton; - public boolean setFocusOnLoad = true; public Renderable hoveredWidget = null; public List spell = new ArrayList<>(); @@ -98,13 +99,18 @@ public class GuiSpellBook extends BaseBook { public String spellname = ""; public AbstractCaster caster; + public long timeOpened; + public GuiSpellBook(InteractionHand hand) { super(); this.hand = hand; - IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(Minecraft.getInstance().player); - ItemStack heldStack = Minecraft.getInstance().player.getItemInHand(hand); + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + + IPlayerCap cap = CapabilityRegistry.getPlayerDataCap(player); + ItemStack heldStack = player.getItemInHand(hand); List parts = cap == null ? new ArrayList<>() : new ArrayList<>(cap.getKnownGlyphs().stream().filter(AbstractSpellPart::shouldShowInSpellBook).toList()); - maxManaCache = ManaUtil.getMaxMana(Minecraft.getInstance().player); + maxManaCache = ManaUtil.getMaxMana(player); parts.addAll(GlyphRegistry.getDefaultStartingSpells()); int tier = 1; if (heldStack.getItem() instanceof SpellBook book) { @@ -134,10 +140,10 @@ public GuiSpellBook(InteractionHand hand) { spell = new ArrayList<>(recipe); } - public void onBookstackUpdated(ItemStack stack){ + public void onBookstackUpdated(ItemStack stack) { this.bookStack = stack; this.caster = SpellCasterRegistry.from(stack); - if(caster == null){ + if (caster == null) { Minecraft.getInstance().setScreen(null); } } @@ -145,6 +151,7 @@ public void onBookstackUpdated(ItemStack stack){ @Override public void init() { super.init(); + timeOpened = System.currentTimeMillis(); craftingCells = new ArrayList<>(); resetCraftingCells(); @@ -231,25 +238,29 @@ private void layoutAllGlyphs(int page) { formTextRow = 0; augmentTextRow = 0; effectTextRow = 0; + + if (displayedGlyphs.isEmpty()) { + return; + } + final int PER_ROW = 6; final int MAX_ROWS = 6; boolean nextPage = false; int xStart = nextPage ? bookLeft + 154 : bookLeft + 20; int adjustedRowsPlaced = 0; - int yStart = bookTop + 20; boolean foundForms = false; boolean foundAugments = false; boolean foundEffects = false; - List sorted = new ArrayList<>(); - sorted.addAll(displayedGlyphs.stream().filter(s -> s instanceof AbstractCastMethod).toList()); - sorted.addAll(displayedGlyphs.stream().filter(s -> s instanceof AbstractAugment).toList()); - sorted.addAll(displayedGlyphs.stream().filter(s -> s instanceof AbstractEffect).toList()); + + List sorted = new ArrayList<>(displayedGlyphs); sorted.sort(CreativeTabRegistry.COMPARE_SPELL_TYPE_NAME); + sorted = sorted.subList(glyphsPerPage * page, Math.min(sorted.size(), glyphsPerPage * (page + 1))); int adjustedXPlaced = 0; int totalRowsPlaced = 0; - int row_offset = page == 0 ? 2 : 0; + int rowOffset = page == 0 ? 2 : 0; + int yStart = bookTop + 2 + (page != 0 || sorted.getFirst() instanceof AbstractCastMethod ? 18 : 0); for (AbstractSpellPart part : sorted) { if (!foundForms && part instanceof AbstractCastMethod) { @@ -258,28 +269,24 @@ private void layoutAllGlyphs(int page) { totalRowsPlaced += 1; formTextRow = page != 0 ? 0 : totalRowsPlaced; adjustedXPlaced = 0; - } - - if (!foundAugments && part instanceof AbstractAugment) { + } else if (!foundAugments && part instanceof AbstractAugment) { foundAugments = true; - adjustedRowsPlaced += row_offset; - totalRowsPlaced += row_offset; + adjustedRowsPlaced += rowOffset; + totalRowsPlaced += rowOffset; augmentTextRow = page != 0 ? 0 : totalRowsPlaced - 1; adjustedXPlaced = 0; } else if (!foundEffects && part instanceof AbstractEffect) { foundEffects = true; - adjustedRowsPlaced += row_offset; - totalRowsPlaced += row_offset; + adjustedRowsPlaced += rowOffset; + totalRowsPlaced += rowOffset; effectTextRow = page != 0 ? 0 : totalRowsPlaced - 1; adjustedXPlaced = 0; - } else { - - if (adjustedXPlaced >= PER_ROW) { - adjustedRowsPlaced++; - totalRowsPlaced++; - adjustedXPlaced = 0; - } + } else if (adjustedXPlaced >= PER_ROW) { + adjustedRowsPlaced++; + totalRowsPlaced++; + adjustedXPlaced = 0; } + if (adjustedRowsPlaced > MAX_ROWS) { if (nextPage) { break; @@ -298,7 +305,6 @@ private void layoutAllGlyphs(int page) { } } - public void onSearchChanged(String str) { if (str.equals(previousString)) return; @@ -453,11 +459,11 @@ public void onCraftingSlotClick(Button button) { public void onGlyphClick(Button button) { GlyphButton button1 = (GlyphButton) button; - if(!button1.validationErrors.isEmpty()){ + if (!button1.validationErrors.isEmpty()) { return; } for (CraftingButton b : craftingCells.subList(spellWindowOffset, Math.min(spellWindowOffset + 10, craftingCells.size()))) { - if(b.getAbstractSpellPart() != null){ + if (b.getAbstractSpellPart() != null) { continue; } @@ -500,28 +506,121 @@ public void onSlotChange(Button button) { @Override public boolean charTyped(char pCodePoint, int pModifiers) { - if (hoveredWidget instanceof GlyphButton glyphButton && glyphButton.validationErrors.isEmpty()) { - // check if char is a number - if (pCodePoint >= '0' && pCodePoint <= '9') { - int num = Integer.parseInt(String.valueOf(pCodePoint)); - if (num == 0) { - num = 10; + if (pCodePoint >= '0' && pCodePoint <= '9') { + int idx = Integer.parseInt(String.valueOf(pCodePoint)); + if (idx == 0) { + idx = 10; + } + idx = idx - 1 + spellWindowOffset; + + switch (hoveredWidget) { + case GlyphButton button -> { + if (!button.validationErrors.isEmpty()) { + return true; + } + + CraftingButton currentCell = craftingCells.get(idx); + currentCell.setAbstractSpellPart(button.abstractSpellPart); + for (int i = spell.size(); i <= idx; i++) { + spell.add(null); + } + spell.set(idx, button.abstractSpellPart); + validate(); + this.setFocused(button); + + return true; } - num -= 1; - this.craftingCells.get(num).setAbstractSpellPart(glyphButton.abstractSpellPart); - validate(); + case CraftingButton button -> { + if (idx < this.spell.size()) { + Collections.swap(spell, button.slotNum, idx); + } else { + spell.add(button.getAbstractSpellPart()); + } + + int left = -1; + int right = -1; + + for (CraftingButton cell : craftingCells) { + if (cell.slotNum == button.slotNum) { + left = cell.slotNum; + } + if (cell.slotNum == idx) { + right = cell.slotNum; + } + + if (left != -1 && right != -1) { + break; + } + } + + if (left == -1 || right == -1) { + return true; + } + + Collections.swap(craftingCells, left, right); + craftingCells.get(left).slotNum = right; + craftingCells.get(right).slotNum = left; + validate(); + this.setFocused(button); + + return true; + } + case null, default -> {} + } + } + + if (!super.charTyped(pCodePoint, pModifiers)) { + if ((!searchBar.isFocused() || !searchBar.active) && System.currentTimeMillis() - timeOpened > 30) { + this.clearFocus(); + this.setFocused(searchBar); + searchBar.active = true; + this.searchBar.setValue(""); + this.searchBar.onClear.apply(""); + return searchBar.charTyped(pCodePoint, pModifiers); + } + return false; + } + + return true; + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == GLFW.GLFW_MOUSE_BUTTON_3 && hoveredWidget instanceof CraftingButton craftingCell) { + int idx = -1; + for (int i = 0; i < craftingCells.size(); i++) { + CraftingButton cell = craftingCells.get(i); + if (cell.slotNum == craftingCell.slotNum) { + idx = i; + break; + } + } + + if (idx == -1 || craftingCells.getLast().getAbstractSpellPart() != null) { return true; } + + for (int i = craftingCells.size() - 1; i >= idx + 1; i--) { + CraftingButton cell = craftingCells.get(i); + CraftingButton prev = craftingCells.get(i - 1); + + cell.setAbstractSpellPart(prev.getAbstractSpellPart()); + } + + spell.add(idx, null); + craftingCells.get(idx).setAbstractSpellPart(null); + this.setFocused(craftingCell); } - return super.charTyped(pCodePoint, pModifiers); + + return super.mouseClicked(mouseX, mouseY, button); } - public void resetCraftingCells(){ - for(CraftingButton button : craftingCells){ + public void resetCraftingCells() { + for (CraftingButton button : craftingCells) { removeWidget(button); } craftingCells = new ArrayList<>(); - for(int i = 0; i < numLinks + getExtraGlyphSlots(); i++){ + for (int i = 0; i < numLinks + getExtraGlyphSlots(); i++) { CraftingButton cell = new CraftingButton(0, 0, this::onCraftingSlotClick, i); addRenderableWidget(cell); craftingCells.add(cell); @@ -530,11 +629,11 @@ public void resetCraftingCells(){ cell.setAbstractSpellPart(spellPart); } - for(int i = 0; i < 10; i++){ + for (int i = 0; i < 10; i++) { int placementOffset = i % 10; int offset = placementOffset >= 5 ? 14 : 0; - if(i + spellWindowOffset >= craftingCells.size()){ + if (i + spellWindowOffset >= craftingCells.size()) { break; } var cell = craftingCells.get(spellWindowOffset + i); @@ -592,14 +691,17 @@ public static void open(InteractionHand hand) { public void drawBackgroundElements(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { super.drawBackgroundElements(graphics, mouseX, mouseY, partialTicks); + int formOffset = 0; if (formTextRow >= 1) { graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.form").getString(), formTextRow > 6 ? 154 : 20, 5 + 18 * (formTextRow + (formTextRow == 1 ? 0 : 1)), -8355712, false); + formOffset = 1; } + if (effectTextRow >= 1) { - graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.effect").getString(), effectTextRow > 6 ? 154 : 20, 5 + 18 * (effectTextRow + 1), -8355712, false); + graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.effect").getString(), effectTextRow > 6 ? 154 : 20, 5 + 18 * (effectTextRow + formOffset), -8355712, false); } if (augmentTextRow >= 1) { - graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.augment").getString(), augmentTextRow > 6 ? 154 : 20, 5 + 18 * (augmentTextRow + 1), -8355712, false); + graphics.drawString(font, Component.translatable("ars_nouveau.spell_book_gui.augment").getString(), augmentTextRow > 6 ? 154 : 20, 5 + 18 * (augmentTextRow + formOffset), -8355712, false); } graphics.blit(ArsNouveau.prefix("textures/gui/spell_name_paper.png"), 16, 179, 0, 0, 109, 15, 109, 15); graphics.blit(ArsNouveau.prefix("textures/gui/search_paper.png"), 203, 0, 0, 0, 72, 15, 72, 15); @@ -688,17 +790,17 @@ private void validate() { } this.validationErrors = errors; - for(CraftingButton craftingButton : craftingCells){ + for (CraftingButton craftingButton : craftingCells) { craftingButton.setAugmenting(null); } AbstractSpellPart parent = null; - for(int i = 0; i < Math.max(spell.size(), craftingCells.size()); i++){ + for (int i = 0; i < Math.max(spell.size(), craftingCells.size()); i++) { AbstractSpellPart part = i < spell.size() ? spell.get(i) : null; - if(!(part instanceof AbstractAugment)) { + if (!(part instanceof AbstractAugment)) { parent = part; } - for(CraftingButton craftingButton : craftingCells){ - if(craftingButton.slotNum == i){ + for (CraftingButton craftingButton : craftingCells) { + if (craftingButton.slotNum == i) { craftingButton.setAugmenting(parent); } } @@ -706,12 +808,12 @@ private void validate() { // Find the last effect before an empty space AbstractSpellPart lastEffect = null; int lastGlyphNoGap = 0; - for(int i = 0; i < spell.size(); i++){ + for (int i = 0; i < spell.size(); i++) { AbstractSpellPart effect = spell.get(i); - if(effect == null){ + if (effect == null) { break; } - if(!(effect instanceof AbstractAugment)){ + if (!(effect instanceof AbstractAugment)) { lastEffect = effect; } lastGlyphNoGap = i; @@ -740,10 +842,6 @@ private void validate() { @Override public void render(GuiGraphics ms, int mouseX, int mouseY, float partialTicks) { super.render(ms, mouseX, mouseY, partialTicks); - if (this.setFocusOnLoad) { - this.setFocusOnLoad = false; - this.setInitialFocus(searchBar); - } hoveredWidget = null; for (Renderable widget : renderables) { if (widget instanceof AbstractWidget abstractWidget && GuiUtils.isMouseInRelativeRange(mouseX, mouseY, abstractWidget)) { From b1e58b2ebafd893c79379707f607dc71d6581187 Mon Sep 17 00:00:00 2001 From: Qther Date: Sun, 5 Jan 2025 05:31:10 +0800 Subject: [PATCH 346/363] feat: cache ParticleColor in ColoredProjectile to reduce NBT traversal (#1566) --- .../arsnouveau/common/entity/ColoredProjectile.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/ColoredProjectile.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/ColoredProjectile.java index 3823b10d7c..8ffbacb71c 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/ColoredProjectile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/ColoredProjectile.java @@ -22,6 +22,7 @@ public abstract class ColoredProjectile extends Projectile { public static final EntityDataAccessor GREEN = SynchedEntityData.defineId(ColoredProjectile.class, EntityDataSerializers.INT); public static final EntityDataAccessor BLUE = SynchedEntityData.defineId(ColoredProjectile.class, EntityDataSerializers.INT); public static final EntityDataAccessor PARTICLE_TAG = SynchedEntityData.defineId(ColoredProjectile.class, EntityDataSerializers.COMPOUND_TAG); + private ParticleColor color; public int rainbowStartTick = 0; public ColoredProjectile(EntityType type, Level worldIn) { @@ -40,8 +41,12 @@ public ColoredProjectile(EntityType type, Level wor } public ParticleColor getParticleColor() { + if (this.color != null) { + return this.color; + } CompoundTag tag = entityData.get(PARTICLE_TAG); - return ParticleColorRegistry.from(entityData.get(PARTICLE_TAG)).transition(tickCount*50); + this.color = ParticleColorRegistry.from(tag).transition(tickCount*50); + return this.color; } public boolean isRainbow() { @@ -49,10 +54,11 @@ public boolean isRainbow() { } public ParticleColor.IntWrapper getParticleColorWrapper() { - return new ParticleColor.IntWrapper(entityData.get(RED), entityData.get(GREEN), entityData.get(BLUE)); + return this.getParticleColor().toWrapper(); } public void setColor(ParticleColor colors) { + this.color = colors; ParticleColor.IntWrapper wrapper = colors.toWrapper(); entityData.set(RED, wrapper.r); entityData.set(GREEN, wrapper.g); @@ -62,6 +68,7 @@ public void setColor(ParticleColor colors) { @Override public void load(CompoundTag compound) { + this.color = null; super.load(compound); entityData.set(RED, compound.getInt("red")); entityData.set(GREEN, compound.getInt("green")); From a2131c3ec2fc98ec2ad59bbbf469f1cf9c2f0b35 Mon Sep 17 00:00:00 2001 From: Qther Date: Sun, 5 Jan 2025 07:02:41 +0800 Subject: [PATCH 347/363] feat: sanctuary deny village sieges (#1565) --- .../arsnouveau/common/event/EventHandler.java | 8 ++++++++ .../arsnouveau/common/ritual/DenySpawnRitual.java | 12 ++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java index 0e161ce24f..c37f77540a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/EventHandler.java @@ -81,6 +81,7 @@ import net.neoforged.neoforge.event.level.BlockGrowFeatureEvent; import net.neoforged.neoforge.event.tick.PlayerTickEvent; import net.neoforged.neoforge.event.tick.ServerTickEvent; +import net.neoforged.neoforge.event.village.VillageSiegeEvent; import net.neoforged.neoforge.event.village.VillagerTradesEvent; import net.neoforged.neoforge.items.ItemHandlerHelper; @@ -167,6 +168,13 @@ public static void livingSpawnEvent(FinalizeSpawnEvent checkSpawn) { } } + @SubscribeEvent + public static void villageSiegeEvent(VillageSiegeEvent checkSpawn) { + if (checkSpawn.getLevel() instanceof Level level && !level.isClientSide) { + RitualEventQueue.getRitual(level, DenySpawnRitual.class, ritu -> ritu.denySiege(checkSpawn)); + } + } + @SubscribeEvent public static void jumpEvent(LivingEvent.LivingJumpEvent e) { diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java index 7a7e7f236e..f37ead6ccd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/ritual/DenySpawnRitual.java @@ -7,11 +7,14 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.ai.village.VillageSiege; import net.minecraft.world.entity.monster.Enemy; +import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.neoforged.neoforge.event.entity.living.FinalizeSpawnEvent; +import net.neoforged.neoforge.event.village.VillageSiegeEvent; import org.jetbrains.annotations.Nullable; public class DenySpawnRitual extends RangeRitual { @@ -29,6 +32,15 @@ public boolean denySpawn(FinalizeSpawnEvent checkSpawn){ return shouldDeny; } + public boolean denySiege(VillageSiegeEvent checkSpawn) { + boolean shouldDeny = checkSpawn.getAttemptedSpawnPos().distanceToSqr(getPos().getX(), getPos().getY(), getPos().getZ()) <= radius * radius; + if (shouldDeny) { + checkSpawn.setCanceled(true); + deniedSpawn = true; + } + return shouldDeny; + } + @Override public void onStart(@Nullable Player player) { super.onStart(player); From f8d3b8166476ab12091356ae0d086639abef2b2b Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 4 Jan 2025 20:33:42 -0600 Subject: [PATCH 348/363] Update supporters.json --- supporters.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/supporters.json b/supporters.json index 119a7db599..1423471999 100644 --- a/supporters.json +++ b/supporters.json @@ -33,7 +33,8 @@ "db489a87-6509-4d75-917d-9c426b519c64", "eb079f27-e266-4b3c-beba-b34d34bef268", "831086b8-d566-4f25-aa09-ecb505e54885", "e3298bd7-61bf-427f-af89-4e418a20bf57", "01b53c7e-c7f4-4465-88df-f8b6c645b6b9", "a29ffabb-ac40-4754-8df8-94b9f394045c", "aef9c054-e96e-4332-944b-9393105b6ac6", "1f62ed4b-91f9-42fa-b331-b7e3e3c0637f", "eb14192a-c53f-44c0-bb13-7f7ff1a0e662", - "758ca96e-100a-4611-a849-5d76229b6c83", "1cf6b68a-a396-4ac1-8146-21fc314f6455", "f476db17-6995-44ab-b002-0a326959f01a"], + "758ca96e-100a-4611-a849-5d76229b6c83", "1cf6b68a-a396-4ac1-8146-21fc314f6455", "f476db17-6995-44ab-b002-0a326959f01a", + "4a405d17-9e7b-4007-b4e3-a1adcd41c489"], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -540,6 +541,11 @@ "color": "green", "adopter": "allypandaa", "bio": "A rogue little monster that somehow escaped. Contain him! Who knows what he'll do now he's free! Last time he blew up! It was a miracle he lived that..." + },{ + "name": "Lilia", + "color": "purple", + "adopter": "TheFayeWitch", + "bio": "Lilia thrives in the moonlit night. Known to give powerful visions of the future to those who gaze at the moon while holding her." } ] } From ecd420ae859ee47728aa3fd144f90280e9becd53 Mon Sep 17 00:00:00 2001 From: Qther Date: Sun, 5 Jan 2025 11:42:45 +0800 Subject: [PATCH 349/363] fix: alteration table breaks when "OTHER" part receives shape update on non-head side (#1561) * fix: alteration table breaks when "OTHER" part receives shape update on non-head side * Revert "fix: alteration table breaks when "OTHER" part receives shape update on non-head side" This reverts commit 147d7d5e4d99878acd6eef6fd0fff5bf992820c0. * fix it in a different way --- .../hollingsworth/arsnouveau/common/block/AlterationTable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/AlterationTable.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/AlterationTable.java index 54656fc26f..d4730664b6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/AlterationTable.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/AlterationTable.java @@ -172,7 +172,7 @@ public BlockState updateShape(BlockState state, Direction direction, BlockState } } } - return super.updateShape(state, direction, state2, world, pos, pos2); + return state; } public List getConnectedDirections(BlockState state){ From d4e196c987a20e902e3f35f9fd69b8558b0421eb Mon Sep 17 00:00:00 2001 From: Qther Date: Sun, 5 Jan 2025 11:43:02 +0800 Subject: [PATCH 350/363] fix: starby stacking behaviour (#1569) starby stacking breaks when done far from 0, 0 (presumably if not loaded) also makes it so the new starby tries to ride the topmost starby or fails the interaction if it cant. --- .../arsnouveau/common/entity/Starbuncle.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java index 06baa4ecda..ffe30b71cb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/Starbuncle.java @@ -471,13 +471,22 @@ protected void updateControlFlags() { return InteractionResult.SUCCESS; ItemStack stack = player.getItemInHand(hand); - if (player.getMainHandItem().getItem() instanceof StarbuncleCharm starbuncleCharm) { + if (player.getMainHandItem().getItem() instanceof StarbuncleCharm) { + Starbuncle toRide = this; + while (toRide.getFirstPassenger() instanceof Starbuncle riding) { + toRide = riding; + } + + if (toRide.hasPassenger(e -> true)) { + return InteractionResult.FAIL; + } Starbuncle carbuncle = new Starbuncle(level, true); carbuncle.data = player.getMainHandItem().getOrDefault(DataComponentRegistry.STARBUNCLE_DATA, new StarbuncleCharmData()).mutable(); + carbuncle.setPos(toRide.position().add(0, toRide.getBoundingBox().getYsize(), 0)); level.addFreshEntity(carbuncle); carbuncle.restoreFromTag(); - carbuncle.startRiding(this); + carbuncle.startRiding(toRide); stack.shrink(1); return InteractionResult.SUCCESS; } From 2f58711dc5b5f448d8734221a7aa80e147d627aa Mon Sep 17 00:00:00 2001 From: Jarva <4622609+Jarva@users.noreply.github.com> Date: Mon, 6 Jan 2025 14:42:18 +0000 Subject: [PATCH 351/363] feat: parameterised tier display for Alteration Table (#1575) * feat: add parameterised tier display * feat: add basic tier rendering for AlterationTableRenderer * feat: center tier renderer * fix: update item positioning and fix component label --------- Co-authored-by: Darshan Phaldesai --- .../tile/AlterationTableRenderer.java | 99 +++++++++++-------- 1 file changed, 58 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java index 6eaa75f817..2d8c917eb6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java +++ b/src/main/java/com/hollingsworth/arsnouveau/client/renderer/tile/AlterationTableRenderer.java @@ -13,7 +13,9 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Axis; +import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; import net.minecraft.client.model.ArmorStandArmorModel; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.Model; @@ -28,6 +30,7 @@ import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponents; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.FastColor; import net.minecraft.util.Mth; @@ -40,6 +43,9 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.neoforged.neoforge.client.ClientHooks; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.joml.Matrix4f; import org.joml.Quaternionf; import org.joml.Vector3d; import software.bernie.geckolib.cache.object.BakedGeoModel; @@ -124,6 +130,50 @@ public void renderPerks(AlterationTile tile, PoseStack matrixStack, MultiBufferS } } + public void renderSlate(AlterationTile tile, PoseStack matrixStack, MultiBufferSource bufferSource, int packedLight) { + String[] rowNames = new String[]{"top", "mid", "bot"}; + for (String s : rowNames) { + for (int i = 0; i < 4; i++) { + int finalI = i; + model.getBone(s + "_" + i).ifPresent(bone -> bone.setHidden(finalI != 0)); + } + } + + if (!(PerkUtil.getPerkHolder(tile.armorStack) instanceof StackPerkHolder armorPerkHolder)) { + return; + } + Font font = Minecraft.getInstance().font; + List perks = armorPerkHolder.getSlotsForTier(tile.armorStack); + for (int i = 0; i < Math.min(3, perks.size()); i++) { + var tier = perks.get(i); + var component = Component.translatable("enchantment.level." + tier.value()).withStyle(ChatFormatting.BOLD); + var height = font.lineHeight/2; + + matrixStack.pushPose(); + matrixStack.translate(0.25, 1 - (0.175 * i), -0.05 - (0.175 * i)); + GeoBone bone = model.getBone("display").get(); + if (bone.getRotZ() != 0.0F) { + matrixStack.mulPose(Axis.ZP.rotation(-bone.getRotZ())); + } + + if (bone.getRotY() != 0.0F) { + matrixStack.mulPose(Axis.YP.rotation(-bone.getRotY())); + } + + if (bone.getRotX() != 0.0F) { + matrixStack.mulPose(Axis.XP.rotation(-bone.getRotX())); + } + + GeoBone locBone = model.getBone("top_" + (i + 1)).get(); + RenderUtil.translateToPivotPoint(matrixStack, locBone); + matrixStack.translate(0.0815, -0.20, 0); + matrixStack.scale(-0.02f, -0.02f, -0.02f); + float x = (float) (font.width("WWW") - font.width(component)) / 2; + font.drawInBatch(component, x, height, 5987163, false, matrixStack.last().pose(), bufferSource, Font.DisplayMode.NORMAL, 0, packedLight); + matrixStack.popPose(); + } + } + public float rotForSlot(EquipmentSlot slot) { return switch (slot) { case HEAD -> 0.3f; @@ -184,7 +234,6 @@ private void renderTrim( p_289663_.renderToBuffer(p_289687_, vertexconsumer, p_289683_, OverlayTexture.NO_OVERLAY); } - private void renderGlint(PoseStack p_289673_, MultiBufferSource p_289654_, int p_289649_, net.minecraft.client.model.Model p_289659_) { p_289659_.renderToBuffer(p_289673_, p_289654_.getBuffer(RenderType.armorEntityGlint()), p_289649_, OverlayTexture.NO_OVERLAY); } @@ -219,7 +268,6 @@ public void actuallyRender(PoseStack stack, AlterationTile tile, BakedGeoModel m stack.translate(0, 0, 1); } - renderSlate(model, animatable); super.actuallyRender(stack, tile, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); stack.popPose(); } @@ -241,17 +289,17 @@ public void render(AlterationTile animatable, float partialTick, PoseStack stack if (direction == Direction.SOUTH) { perkQuat = Axis.YP.rotationDegrees(90); - perkTranslate = new Vector3d(.5, 0, .5); + perkTranslate = new Vector3d(.55, 0, .5); } if (direction == Direction.WEST) { perkQuat = Axis.YP.rotationDegrees(0); - perkTranslate = new Vector3d(1.5, 0, 0.5); + perkTranslate = new Vector3d(1.55, 0, 0.5); } if (direction == Direction.EAST) { perkQuat = Axis.YP.rotationDegrees(180); - perkTranslate = new Vector3d(.5, 0, -.5); + perkTranslate = new Vector3d(.55, 0, -.5); } double ticks = animatable.getTick(animatable); stack.pushPose(); @@ -266,44 +314,14 @@ public void render(AlterationTile animatable, float partialTick, PoseStack stack this.renderArmorStack(animatable, stack, (float) ticks, bufferSource, packedLight, packedOverlay); stack.popPose(); - stack.pushPose(); stack.mulPose(perkQuat); stack.translate(perkTranslate.x, perkTranslate.y, perkTranslate.z); + this.renderSlate(animatable, stack, bufferSource, packedLight); this.renderPerks(animatable, stack, bufferSource, packedLight, packedOverlay); stack.popPose(); } - public void renderSlate(BakedGeoModel model, AlterationTile tile) { - String[] rowNames = new String[]{"top", "mid", "bot"}; - if (tile.armorStack.isEmpty()) { - for (String s : rowNames) { - setSlateRow(model, s, 0); - } - return; - } - if (!(PerkUtil.getPerkHolder(tile.armorStack) instanceof StackPerkHolder armorPerkHolder)) { - return; - } - List perks = armorPerkHolder.getSlotsForTier(tile.armorStack); - - for (int i = 0; i < Math.min(perks.size(), rowNames.length); i++) { - PerkSlot perkSlot = perks.get(i); - setSlateRow(model, rowNames[i], perkSlot.value()); - } - List remainingRows = List.of(rowNames); - remainingRows.subList(perks.size(), remainingRows.size()).forEach(s -> setSlateRow(model, s, 0)); - } - - public void setSlateRow(BakedGeoModel model, String loc, int tier) { - for (int i = 0; i < 4; i++) { - if (tier != i) { - model.getBone(loc + "_" + i).ifPresent(bone -> bone.setHidden(true)); - } else { - model.getBone(loc + "_" + i).ifPresent(bone -> bone.setHidden(false)); - } - } - } public static GenericItemBlockRenderer getISTER() { @@ -315,7 +333,7 @@ public RenderType getRenderType(AlterationTile animatable, ResourceLocation text return RenderType.entityTranslucent(texture); } - protected void setPartVisibility(HumanoidModel pModel, EquipmentSlot pSlot) { + protected void setPartVisibility(HumanoidModel pModel, EquipmentSlot pSlot) { pModel.setAllVisible(false); switch (pSlot) { case HEAD: @@ -338,9 +356,8 @@ protected void setPartVisibility(HumanoidModel pModel, EquipmentSlot pSlot) { } } - @Override - public boolean shouldRenderOffScreen(AlterationTile pBlockEntity) { + public boolean shouldRenderOffScreen(@NotNull AlterationTile pBlockEntity) { return true; } @@ -350,7 +367,7 @@ public int getViewDistance() { } @Override - public AABB getRenderBoundingBox(AlterationTile blockEntity) { + public @NotNull AABB getRenderBoundingBox(@NotNull AlterationTile blockEntity) { return AABB.INFINITE; } -} \ No newline at end of file +} From 783e132b2683c73a0ae898eb505138f933dd88d4 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Thu, 9 Jan 2025 21:44:16 -0600 Subject: [PATCH 352/363] update supporters --- .../recipe/tomes/bugcolez_tome.json | 27 +++++++++++++++++++ .../common/datagen/CasterTomeProvider.java | 3 +++ supporters.json | 12 ++++++++- 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/generated/resources/data/ars_nouveau/recipe/tomes/bugcolez_tome.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/tomes/bugcolez_tome.json b/src/generated/resources/data/ars_nouveau/recipe/tomes/bugcolez_tome.json new file mode 100644 index 0000000000..fcd74a5bfb --- /dev/null +++ b/src/generated/resources/data/ars_nouveau/recipe/tomes/bugcolez_tome.json @@ -0,0 +1,27 @@ +{ + "type": "ars_nouveau:caster_tome", + "color": { + "b": 180, + "g": 25, + "id": "ars_nouveau:constant", + "r": 255 + }, + "flavour_text": "Their Friends are their power!", + "name": "Pixie Pummel", + "sound": { + "pitch": 1.9 + }, + "spell": [ + "ars_nouveau:glyph_self", + "ars_nouveau:glyph_summon_vex", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time", + "ars_nouveau:glyph_extend_time" + ], + "tome_type": "ars_nouveau:caster_tome" +} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java index a2f1496438..16f8f4d8bd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/CasterTomeProvider.java @@ -288,6 +288,9 @@ public void collectJsons(CachedOutput pOutput) { .add(AugmentAOE.INSTANCE, 6) .withSound(new ConfiguredSpellSound(SoundRegistry.GAIA_SPELL_SOUND)), "WARNING: ONLY TO BE USED AS A LAST RESORT!!", new ParticleColor(255, 1, 1))); + tomes.add(buildTome("bugcolez", "Pixie Pummel", new Spell(MethodSelf.INSTANCE).add(EffectSummonVex.INSTANCE).add(AugmentExtendTime.INSTANCE, 8) + .withSound(new ConfiguredSpellSound(SoundRegistry.DEFAULT_SPELL_SOUND, 1.0f, 1.9f)), "Their Friends are their power!", new ParticleColor(255, 25, 180))); + for (CasterRecipeWrapper g : tomes) { Path path = getRecipePath(output, g.id().getPath()); saveStable(pOutput, CasterTomeData.CODEC.encodeStart(JsonOps.INSTANCE, g.toData()).getOrThrow(), path); diff --git a/supporters.json b/supporters.json index 1423471999..523419d88c 100644 --- a/supporters.json +++ b/supporters.json @@ -34,7 +34,7 @@ "e3298bd7-61bf-427f-af89-4e418a20bf57", "01b53c7e-c7f4-4465-88df-f8b6c645b6b9", "a29ffabb-ac40-4754-8df8-94b9f394045c", "aef9c054-e96e-4332-944b-9393105b6ac6", "1f62ed4b-91f9-42fa-b331-b7e3e3c0637f", "eb14192a-c53f-44c0-bb13-7f7ff1a0e662", "758ca96e-100a-4611-a849-5d76229b6c83", "1cf6b68a-a396-4ac1-8146-21fc314f6455", "f476db17-6995-44ab-b002-0a326959f01a", - "4a405d17-9e7b-4007-b4e3-a1adcd41c489"], + "4a405d17-9e7b-4007-b4e3-a1adcd41c489", "f64bd7f1-ae18-4e9e-834e-eb0caf7f37d4", "ee6d035a-600d-40a3-b444-b987766121ee"], "starbuncleAdoptions": [ { "name": "Stekkie", @@ -546,6 +546,16 @@ "color": "purple", "adopter": "TheFayeWitch", "bio": "Lilia thrives in the moonlit night. Known to give powerful visions of the future to those who gaze at the moon while holding her." + },{ + "name": "Ladislaw", + "bio": " If you ever see him falling, it probably wasn't him, you better check again.", + "color": "cyan", + "adopter": "The_Sebuss" + },{ + "adopter": "Bugcolez", + "name": "Puff Ball", + "color": "magenta", + "bio": "A energetic and curious little Starbuncle that grows a bond to strengthen its heart. Many of worlds and friends have been made over the years and will continue to be made through its lifetime." } ] } From fa44a3a5d1d279eb1fcc7e06c409a425c2f0f474 Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Sat, 11 Jan 2025 20:05:40 +0100 Subject: [PATCH 353/363] make SpellSchools final so they can be used in switch blocks (#1580) --- .../arsnouveau/api/spell/SpellSchools.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSchools.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSchools.java index 70a117587f..a71aa5bd76 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSchools.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/SpellSchools.java @@ -2,13 +2,13 @@ public class SpellSchools { - public static SpellSchool ABJURATION = new SpellSchool("abjuration"); - public static SpellSchool CONJURATION = new SpellSchool("conjuration"); - public static SpellSchool NECROMANCY = new SpellSchool("necromancy"); - public static SpellSchool MANIPULATION = new SpellSchool("manipulation"); - public static SpellSchool ELEMENTAL_AIR = new SpellSchool("air"); - public static SpellSchool ELEMENTAL_EARTH = new SpellSchool("earth"); - public static SpellSchool ELEMENTAL_FIRE = new SpellSchool("fire"); - public static SpellSchool ELEMENTAL_WATER = new SpellSchool("water"); - public static SpellSchool ELEMENTAL = new SpellSchool("elemental").withSubSchool(ELEMENTAL_AIR).withSubSchool(ELEMENTAL_EARTH).withSubSchool(ELEMENTAL_FIRE).withSubSchool(ELEMENTAL_WATER); + public static final SpellSchool ABJURATION = new SpellSchool("abjuration"); + public static final SpellSchool CONJURATION = new SpellSchool("conjuration"); + public static final SpellSchool NECROMANCY = new SpellSchool("necromancy"); + public static final SpellSchool MANIPULATION = new SpellSchool("manipulation"); + public static final SpellSchool ELEMENTAL_AIR = new SpellSchool("air"); + public static final SpellSchool ELEMENTAL_EARTH = new SpellSchool("earth"); + public static final SpellSchool ELEMENTAL_FIRE = new SpellSchool("fire"); + public static final SpellSchool ELEMENTAL_WATER = new SpellSchool("water"); + public static final SpellSchool ELEMENTAL = new SpellSchool("elemental").withSubSchool(ELEMENTAL_AIR).withSubSchool(ELEMENTAL_EARTH).withSubSchool(ELEMENTAL_FIRE).withSubSchool(ELEMENTAL_WATER); } From 298b6c3473991a357374b79135ef2630d6544229 Mon Sep 17 00:00:00 2001 From: Alexthw <77152778+Alexthw46@users.noreply.github.com> Date: Sat, 11 Jan 2025 20:05:54 +0100 Subject: [PATCH 354/363] add isAlliedTo on the ice shard damage check (#1579) --- .../arsnouveau/common/entity/IceShardEntity.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/IceShardEntity.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/IceShardEntity.java index 7ee82a0237..7f9f0ca1aa 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/IceShardEntity.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/IceShardEntity.java @@ -23,6 +23,7 @@ public class IceShardEntity extends EnchantedFallingBlock { public LivingEntity shooter; + public IceShardEntity(EntityType p_31950_, Level p_31951_) { super(p_31950_, p_31951_); } @@ -36,9 +37,9 @@ public IceShardEntity(Level worldIn, double x, double y, double z, BlockState fa public void callOnBrokenAfterFall(Block p_149651_, BlockPos p_149652_) { super.callOnBrokenAfterFall(p_149651_, p_149652_); - if(level instanceof ServerLevel world){ - for(LivingEntity living : world.getEntitiesOfClass(LivingEntity.class, new AABB(BlockPos.containing(position)).inflate(1.25))){ - if(living == shooter) + if (level instanceof ServerLevel world) { + for (LivingEntity living : world.getEntitiesOfClass(LivingEntity.class, new AABB(BlockPos.containing(position)).inflate(1.25))) { + if (living == shooter || living.isAlliedTo(shooter)) continue; living.hurt(DamageUtil.source(world, DamageTypesRegistry.COLD_SNAP, shooter == null ? ANFakePlayer.getPlayer(world) : shooter), baseDamage); living.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 20 * 3, 1)); @@ -46,7 +47,7 @@ public void callOnBrokenAfterFall(Block p_149651_, BlockPos p_149652_) { world.sendParticles(ParticleTypes.SPIT, position.x, position.y + 0.5, position.z, 10, ParticleUtil.inRange(-0.1, 0.1), ParticleUtil.inRange(-0.1, 0.1), ParticleUtil.inRange(-0.1, 0.1), 0.3); - world.playSound(null, BlockPos.containing(position), SoundEvents.GLASS_FALL, SoundSource.BLOCKS, 0.8f, 0.8f); + world.playSound(null, BlockPos.containing(position), SoundEvents.GLASS_FALL, SoundSource.BLOCKS, 0.8f, 0.8f); } } From 9d51ed51e039aaa54dc3e7dc4e97f9125888e637 Mon Sep 17 00:00:00 2001 From: Poseidon13856 Date: Sat, 11 Jan 2025 20:08:34 +0100 Subject: [PATCH 355/363] Update PortalFrameTester.java (Closes #1063 ) (#1577) Fixes horizontal portals getting destroyed by block updates and horizontal portal generation. Horizontal portals will no longer break when receiving a block update. Horizontal portals can now be generated by throwing the scroll anywhere inside the frame and not just on the northernmost line of blocks. --- .../hollingsworth/arsnouveau/api/util/PortalFrameTester.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/PortalFrameTester.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/PortalFrameTester.java index b7dca52f77..f7e527b1ca 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/PortalFrameTester.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/PortalFrameTester.java @@ -34,7 +34,7 @@ protected BlockPos getLowerCorner(BlockPos blockPos, Direction.Axis axis1, Direc } blockPos = blockPos.relative(axis1, -(offsetX - 1)); int offsetY = 1; - while (blockPos.getZ() - offsetY > 0 && validStateInsidePortal(world.getBlockState(blockPos.relative(axis2, -offsetY)))) { + while (validStateInsidePortal(world.getBlockState(blockPos.relative(axis2, -offsetY)))) { offsetY++; if (offsetY > 20) return null; } From 43f9df93783035b6d9b104b9314658ab6540e6fe Mon Sep 17 00:00:00 2001 From: Qther Date: Sun, 12 Jan 2025 03:09:25 +0800 Subject: [PATCH 356/363] feat: SourceUtil multi-provider take (#1556) * feat: SourceUtil multi-provider take allows SourceUtil#takeSource to extract from multiple ISpecialSourceProviders in order to reach the desired amount. Also short circuits if a Creative Source Jar is found. * rename multi-provider take functions and restore single-provider takes for backwards compat * reorder methods * convert internal usages of SourceUtil to use multi-provider take and don't break when needed < 0 * deprecate single-provider takes * rename potentialRefunds to takenFrom for clarity * fix typo in comment * short circuit faster if needed <= 0 --- .../api/spell/wrapped_caster/TileCaster.java | 2 +- .../arsnouveau/api/util/SourceUtil.java | 112 +++++++++++++++++- .../block/tile/BasicSpellTurretTile.java | 2 +- .../common/block/tile/DrygmyTile.java | 2 +- .../block/tile/EnchantingApparatusTile.java | 2 +- .../common/block/tile/ImbuementTile.java | 8 +- .../common/block/tile/PotionMelderTile.java | 2 +- .../common/block/tile/RitualBrazierTile.java | 4 +- .../common/block/tile/RotatingTurretTile.java | 2 +- .../common/block/tile/RuneTile.java | 2 +- .../common/block/tile/WhirlisprigTile.java | 2 +- .../common/block/tile/WixieCauldronTile.java | 2 +- .../alakarkinos/DecideCrabActionState.java | 2 +- .../arsnouveau/common/items/WarpScroll.java | 2 +- 14 files changed, 124 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/TileCaster.java b/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/TileCaster.java index 44c4e65eb1..5fab272e32 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/TileCaster.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/spell/wrapped_caster/TileCaster.java @@ -74,7 +74,7 @@ public boolean enoughMana(int totalCost) { public void expendMana(int totalCost) { if (tile instanceof BasicSpellTurretTile spellTurretTile) { if (spellTurretTile.getManaCost() <= 0) return; - SourceUtil.takeSourceWithParticles(tile.getBlockPos(), tile.getLevel(), 10, spellTurretTile.getManaCost()); + SourceUtil.takeSourceMultipleWithParticles(tile.getBlockPos(), tile.getLevel(), 10, spellTurretTile.getManaCost()); } } } diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java b/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java index 9c1bb8744f..0e1cea348a 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/util/SourceUtil.java @@ -1,8 +1,9 @@ package com.hollingsworth.arsnouveau.api.util; -import com.hollingsworth.arsnouveau.api.source.ISpecialSourceProvider; -import com.hollingsworth.arsnouveau.api.source.SourceManager; -import com.hollingsworth.arsnouveau.api.source.SourceProvider; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; +import com.hollingsworth.arsnouveau.api.source.*; +import com.hollingsworth.arsnouveau.common.block.tile.CreativeSourceJarTile; import com.hollingsworth.arsnouveau.common.block.tile.SourceJarTile; import com.hollingsworth.arsnouveau.common.entity.EntityFollowProjectile; import net.minecraft.core.BlockPos; @@ -10,9 +11,7 @@ import net.minecraft.world.level.Level; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; +import java.util.*; public class SourceUtil { @@ -42,6 +41,15 @@ public static List canTakeSource(BlockPos pos, Level wor return posList; } + /** + * @deprecated Use {@link SourceUtil#takeSourceMultiple} + * @param pos Position around which to find source providers + * @param level Level to find source providers in + * @param range Range to check around `pos` + * @param source How much source to extract + * @return Provider that was extracted from, or null if none had enough source. + */ + @Deprecated(forRemoval = true) public static @Nullable ISpecialSourceProvider takeSource(BlockPos pos, Level level, int range, int source){ List providers = canTakeSource(pos, level, range); for(ISpecialSourceProvider provider : providers){ @@ -53,10 +61,86 @@ public static List canTakeSource(BlockPos pos, Level wor return null; } + /** + * @param pos Position around which to find source providers + * @param level Level to find source providers in + * @param range Range to check around `pos` + * @param source How much source to extract + * @return List of all the providers extracted from, or null if there was not enough total source. + */ + public static @Nullable List takeSourceMultiple(BlockPos pos, Level level, int range, int source) { + List providers = canTakeSource(pos, level, range); + Multimap takenFrom = Multimaps.newMultimap(new HashMap<>(), ArrayList::new); + + int needed = source; + for (ISpecialSourceProvider provider : providers) { + ISourceTile sourceTile = provider.getSource(); + if (sourceTile instanceof CreativeSourceJarTile) { + for (Map.Entry entry : takenFrom.entries()) { + entry.getKey().getSource().addSource(entry.getValue()); + } + + return List.of(provider); + } + + if (needed <= 0) { + continue; + } + + int initial = sourceTile.getSource(); + int available = Math.min(needed, initial); + int after = sourceTile.removeSource(available); + if (initial > after) { + int extracted = initial - after; + needed -= extracted; + takenFrom.put(provider, extracted); + } + + // We can't break even if needed <= 0 as there may still be a Creative Source Jar in the list + } + + if (needed > 0) { + for (Map.Entry entry : takenFrom.entries()) { + entry.getKey().getSource().addSource(entry.getValue()); + } + return null; + } + + return new ArrayList<>(takenFrom.keys()); + } + /** + * @deprecated Use {@link SourceUtil#takeSourceMultipleWithParticles(BlockPos, Level, int, int)} + * @param pos Position around which to find source providers + * @param level Level to find source providers in + * @param range Range to check around `pos` + * @param source How much source to extract + * @return Provider that was extracted from, or null if none had enough source. + */ + @Deprecated(forRemoval = true) public static @Nullable ISpecialSourceProvider takeSourceWithParticles(BlockPos pos, Level level, int range, int source){ return takeSourceWithParticles(pos, pos, level, range, source); } + /** + * @param pos Position around which to find source providers + * @param level Level to find source providers in + * @param range Range to check around `pos` + * @param source How much source to extract + * @return List of all the providers extracted from, or null if there was not enough total source. + */ + public static @Nullable List takeSourceMultipleWithParticles(BlockPos pos, Level level, int range, int source){ + return takeSourceMultipleWithParticles(pos, pos, level, range, source); + } + + /** + * @deprecated Use {@link SourceUtil#takeSourceMultipleWithParticles(BlockPos, BlockPos, Level, int, int)} + * @param pos Position around which to find source providers + * @param level Level to find source providers in + * @param range Range to check around `pos` + * @param source How much source to extract + * @return Provider that was extracted from, or null if none had enough source. + */ + @Deprecated(forRemoval = true) public static @Nullable ISpecialSourceProvider takeSourceWithParticles(BlockPos pos, BlockPos particlesTo, Level level, int range, int source){ ISpecialSourceProvider result = takeSource(pos, level, range, source); if(result != null && level instanceof ServerLevel serverLevel){ @@ -65,6 +149,22 @@ public static List canTakeSource(BlockPos pos, Level wor return result; } + /** + * @param pos Position around which to find source providers + * @param level Level to find source providers in + * @param range Range to check around `pos` + * @param source How much source to extract + * @return List of all the providers extracted from, or null if there was not enough total source. + */ + public static @Nullable List takeSourceMultipleWithParticles(BlockPos pos, BlockPos particlesTo, Level level, int range, int source){ + List result = takeSourceMultiple(pos, level, range, source); + if(result != null && level instanceof ServerLevel serverLevel){ + for (ISpecialSourceProvider provider : result) { + EntityFollowProjectile.spawn(serverLevel, provider.getCurrentPos(), particlesTo); + } + } + return result; + } /** * Searches for nearby mana jars that have enough mana. diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java index d893bb0502..b2c5b295fd 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/BasicSpellTurretTile.java @@ -69,7 +69,7 @@ public void shootSpell(){ if (spellCaster.getSpell().isEmpty() || !(this.level instanceof ServerLevel level)) return; int manaCost = getManaCost(); - if (manaCost > 0 && SourceUtil.takeSourceWithParticles(pos, level, 10, manaCost) == null) + if (manaCost > 0 && SourceUtil.takeSourceMultipleWithParticles(pos, level, 10, manaCost) == null) return; Networking.sendToNearbyClient(level, pos, new PacketOneShotAnimation(pos)); Position iposition = BasicSpellTurret.getDispensePosition(pos, level.getBlockState(pos).getValue(BasicSpellTurret.FACING)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java index c7c1008c65..0e328257fe 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/DrygmyTile.java @@ -71,7 +71,7 @@ public void tick() { refreshEntitiesAndBonus(); } - if (level.getGameTime() % 80 == 0 && needsMana && SourceUtil.takeSourceWithParticles(worldPosition, level, 7, Config.DRYGMY_MANA_COST.get()) != null) { + if (level.getGameTime() % 80 == 0 && needsMana && SourceUtil.takeSourceMultipleWithParticles(worldPosition, level, 7, Config.DRYGMY_MANA_COST.get()) != null) { this.needsMana = false; updateBlock(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java index dbe646f671..3e9478ade1 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/EnchantingApparatusTile.java @@ -151,7 +151,7 @@ public boolean attemptCraft(ItemStack catalyst, @Nullable Player playerEntity) { } IEnchantingRecipe recipe = this.getRecipe(catalyst, playerEntity); if (recipe.consumesSource()) - SourceUtil.takeSourceWithParticles(worldPosition, level, 10, recipe.sourceCost()); + SourceUtil.takeSourceMultipleWithParticles(worldPosition, level, 10, recipe.sourceCost()); this.isCrafting = true; updateBlock(); Networking.sendToNearbyClient(level, worldPosition, new PacketOneShotAnimation(worldPosition)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java index 3bee701d30..0ab1d56d31 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/ImbuementTile.java @@ -140,11 +140,13 @@ public void tick() { if (!canAcceptSource(Math.min(200, cost))) return; - ISpecialSourceProvider takePos = SourceUtil.takeSource(worldPosition, level, 2, Math.min(200, cost)); + List takePos = SourceUtil.takeSourceMultiple(worldPosition, level, 2, Math.min(200, cost)); if (takePos != null) { this.addSource(transferRate); - EntityFlyingItem.spawn(worldPosition, serverLevel, takePos.getCurrentPos().above(), worldPosition) - .withNoTouch().setDistanceAdjust(2f); + for (ISpecialSourceProvider provider : takePos) { + EntityFlyingItem.spawn(worldPosition, serverLevel, provider.getCurrentPos().above(), worldPosition) + .withNoTouch().setDistanceAdjust(2f); + } if (!draining) { draining = true; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java index fc2d0fd151..28b4ec6f9b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PotionMelderTile.java @@ -72,7 +72,7 @@ public void tick() { return; } if (!level.isClientSide && !hasSource && level.getGameTime() % 20 == 0) { - if (SourceUtil.takeSourceWithParticles(worldPosition, level, 5, Config.MELDER_SOURCE_COST.get()) != null) { + if (SourceUtil.takeSourceMultipleWithParticles(worldPosition, level, 5, Config.MELDER_SOURCE_COST.get()) != null) { hasSource = true; updateBlock(); } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java index 8f7a889d23..7676ac7b80 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java @@ -152,7 +152,7 @@ public void tick() { } if (ritual.consumesSource() && ritual.needsSourceNow()) { int cost = ritual.getSourceCost(); - if (SourceUtil.takeSourceWithParticles(getBlockPos(), getLevel(), 6, cost) != null) { + if (SourceUtil.takeSourceMultipleWithParticles(getBlockPos(), getLevel(), 6, cost) != null) { ritual.setNeedsSource(false); updateBlock(); } else { @@ -172,7 +172,7 @@ public void tick() { public boolean takeSource(){ if (ritual.consumesSource() && ritual.needsSourceNow()) { int cost = ritual.getSourceCost(); - if (SourceUtil.takeSourceWithParticles(getBlockPos(), getLevel(), 6, cost) != null) { + if (SourceUtil.takeSourceMultipleWithParticles(getBlockPos(), getLevel(), 6, cost) != null) { ritual.setNeedsSource(false); updateBlock(); return true; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RotatingTurretTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RotatingTurretTile.java index 2ad969001b..588249c257 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RotatingTurretTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RotatingTurretTile.java @@ -154,7 +154,7 @@ public void shootSpell() { if (spellCaster.getSpell().isEmpty() || !(level instanceof ServerLevel level)) return; int manaCost = getManaCost(); - if (manaCost > 0 && SourceUtil.takeSourceWithParticles(pos, level, 10, manaCost) == null) + if (manaCost > 0 && SourceUtil.takeSourceMultipleWithParticles(pos, level, 10, manaCost) == null) return; Networking.sendToNearbyClient(level, pos, new PacketOneShotAnimation(pos)); Position iposition = RotatingSpellTurret.getDispensePosition(pos, this); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java index 4ad6fee068..2eebe14b45 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RuneTile.java @@ -138,7 +138,7 @@ public void tick() { level.destroyBlock(this.worldPosition, false); } if (!level.isClientSide) { - ISpecialSourceProvider provider = SourceUtil.takeSourceWithParticles(worldPosition, level, 10, 100); + List provider = SourceUtil.takeSourceMultipleWithParticles(worldPosition, level, 10, 100); if (provider != null) { this.isCharged = true; level.setBlockAndUpdate(worldPosition, level.getBlockState(worldPosition).cycle(RuneBlock.POWERED)); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java index f79162b509..f8e4d34e10 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WhirlisprigTile.java @@ -78,7 +78,7 @@ public void tick() { if (ticksToNextEval <= 0) evaluateGrove(); - if (level.getGameTime() % 60 == 0 && progress >= Config.WHIRLISPRIG_MAX_PROGRESS.get() && SourceUtil.takeSourceWithParticles(worldPosition, level, 5, Config.WHIRLISPRIG_SOURCE_COST.get()) != null) { + if (level.getGameTime() % 60 == 0 && progress >= Config.WHIRLISPRIG_MAX_PROGRESS.get() && SourceUtil.takeSourceMultipleWithParticles(worldPosition, level, 5, Config.WHIRLISPRIG_SOURCE_COST.get()) != null) { this.progress = 0; DropDistribution blockDropDistribution = new DropDistribution<>(genTable); int numDrops = getDropsByDiversity() + 3; diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java index 09e70b0a5f..99f23df51e 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/WixieCauldronTile.java @@ -80,7 +80,7 @@ public void tick() { return; } - if (!hasSource && level.getGameTime() % 5 == 0 && SourceUtil.takeSourceWithParticles(worldPosition, level, 6, 50) != null) { + if (!hasSource && level.getGameTime() % 5 == 0 && SourceUtil.takeSourceMultipleWithParticles(worldPosition, level, 6, 50) != null) { this.hasSource = true; level.setBlockAndUpdate(worldPosition, level.getBlockState(worldPosition).setValue(WixieCauldron.FILLED, true)); setChanged(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/DecideCrabActionState.java b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/DecideCrabActionState.java index 7f885886ba..f90b313d0f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/DecideCrabActionState.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/entity/statemachine/alakarkinos/DecideCrabActionState.java @@ -21,7 +21,7 @@ public DecideCrabActionState(Alakarkinos alakarkinos) { } if(alakarkinos.needSource() && alakarkinos.level.getGameTime() % 20 == 0){ - var result = SourceUtil.takeSourceWithParticles(alakarkinos.getHome(), alakarkinos.blockPosition().above(), alakarkinos.level, 5, Config.ALAKARKINOS_SOURCE_COST.get()); + var result = SourceUtil.takeSourceMultipleWithParticles(alakarkinos.getHome(), alakarkinos.blockPosition().above(), alakarkinos.level, 5, Config.ALAKARKINOS_SOURCE_COST.get()); if(result != null ){ alakarkinos.setNeedSource(false); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java index 8dc6a53e88..255a37db3f 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java @@ -46,7 +46,7 @@ public boolean onEntityItemUpdate(@NotNull ItemStack stack, ItemEntity entity) { && data.canTeleportWithDim(entity.getCommandSenderWorld().dimension().location().toString()) && SourceUtil.hasSourceNearby(entity.blockPosition(), entity.getCommandSenderWorld(), 10, 9000) && BlockRegistry.PORTAL_BLOCK.get().trySpawnPortal(entity.getCommandSenderWorld(), entity.blockPosition(), data, displayName) - && SourceUtil.takeSourceWithParticles(entity.blockPosition(), entity.getCommandSenderWorld(), 10, 9000) != null) { + && SourceUtil.takeSourceMultipleWithParticles(entity.blockPosition(), entity.getCommandSenderWorld(), 10, 9000) != null) { BlockPos pos = entity.blockPosition(); ServerLevel world = (ServerLevel) entity.getCommandSenderWorld(); world.sendParticles(ParticleTypes.PORTAL, pos.getX(), pos.getY() + 1.0, pos.getZ(), From d072004cf73074a9c9cd90ad5efc6a728fc94f58 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 11 Jan 2025 13:13:52 -0600 Subject: [PATCH 357/363] Fix explosion augment #1578 --- .../arsnouveau/common/spell/effect/EffectExplosion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExplosion.java b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExplosion.java index 24a2ebad2d..eeef96f47b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExplosion.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/spell/effect/EffectExplosion.java @@ -40,7 +40,7 @@ public void onResolve(HitResult rayTraceResult, Level world, @Nullable LivingEnt int dampen = spellStats.getBuffCount(AugmentDampen.INSTANCE); intensity -= 0.5 * dampen; - Explosion.BlockInteraction mode = spellStats.hasBuff(AugmentExtract.INSTANCE) ? Explosion.BlockInteraction.KEEP : Explosion.BlockInteraction.DESTROY; + Explosion.BlockInteraction mode = spellStats.hasBuff(AugmentExtract.INSTANCE) ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.DESTROY_WITH_DECAY; explode(world, shooter, null, null, vec.x, vec.y, vec.z, (float) intensity, false, mode, spellStats.getAmpMultiplier()); } From 677a8acfe4654f0631493500f1eca114131a85a5 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 11 Jan 2025 13:15:26 -0600 Subject: [PATCH 358/363] Add missing null guard on brazier #1574 --- .../arsnouveau/common/block/tile/RitualBrazierTile.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java index 7676ac7b80..2483d803f9 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/RitualBrazierTile.java @@ -170,7 +170,7 @@ public void tick() { } public boolean takeSource(){ - if (ritual.consumesSource() && ritual.needsSourceNow()) { + if (ritual != null && ritual.consumesSource() && ritual.needsSourceNow()) { int cost = ritual.getSourceCost(); if (SourceUtil.takeSourceMultipleWithParticles(getBlockPos(), getLevel(), 6, cost) != null) { ritual.setNeedsSource(false); From 360cc3bd8ac931489f284c488926919b47d8a87f Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 11 Jan 2025 13:18:51 -0600 Subject: [PATCH 359/363] Fix missing oculus lang #1572 --- .../hollingsworth/arsnouveau/common/block/ScryersOculus.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java index e04e622213..bb16181230 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/ScryersOculus.java @@ -76,7 +76,7 @@ public void openMenu(Level pLevel, BlockPos pPos, Player pPlayer) { Minecraft.getInstance().setScreen(new GuiRadialMenu<>(new RadialMenu<>((int scroll) -> { ScryPosData data = stackList.get(scroll).get(DataComponentRegistry.SCRY_DATA); if (data == null || data.pos().isEmpty()) { - PortUtil.sendMessage(pPlayer, Component.translatable("ars_nouveau.scryers_eye.no_pos")); + PortUtil.sendMessage(pPlayer, Component.translatable("ars_nouveau.scryers_oculus.no_pos")); return; } Networking.sendToServer(new PacketMountCamera(data.pos().orElse(null))); From 2dc400f067806d10d9852c680de7779857c10200 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 11 Jan 2025 13:22:07 -0600 Subject: [PATCH 360/363] Fix recovery description lang #1542 --- src/generated/resources/assets/ars_nouveau/lang/en_us.json | 2 +- .../hollingsworth/arsnouveau/common/datagen/LangDatagen.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/generated/resources/assets/ars_nouveau/lang/en_us.json b/src/generated/resources/assets/ars_nouveau/lang/en_us.json index c4246b6db4..9045040b74 100644 --- a/src/generated/resources/assets/ars_nouveau/lang/en_us.json +++ b/src/generated/resources/assets/ars_nouveau/lang/en_us.json @@ -1485,8 +1485,8 @@ "effect.ars_nouveau.magic_find.desc": "Causes nearby magical entities to glow.", "effect.ars_nouveau.mana_regen": "Mana Regeneration", "effect.ars_nouveau.mana_regen.desc": "Improves mana regeneration", - "effect.ars_nouveau.recorvery.desc": "Increases healing received from all sources.", "effect.ars_nouveau.recovery": "Recovery", + "effect.ars_nouveau.recovery.desc": "Increases healing received from all sources.", "effect.ars_nouveau.scrying": "Scrying", "effect.ars_nouveau.scrying.desc": "Reveals certain blocks around you.", "effect.ars_nouveau.shielding": "Shielding", diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java index e7ed7c8078..670c1719c7 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/LangDatagen.java @@ -989,7 +989,7 @@ protected void addTranslations() { add("item.minecraft.tipped_arrow.effect.shielding_potion", "Arrow of Shielding"); add("item.minecraft.tipped_arrow.effect.shielding_potion_long", "Arrow of Shielding"); add("effect.ars_nouveau.recovery", "Recovery"); - add("effect.ars_nouveau.recorvery.desc","Increases healing received from all sources."); + add("effect.ars_nouveau.recovery.desc","Increases healing received from all sources."); add("effect.ars_nouveau.blasting", "Blasting"); add("effect.ars_nouveau.blasting.desc","Causes the target to explode when the duration ends."); add("effect.ars_nouveau.freezing", "Freezing"); From 2ce4d78fb9fe68c764c09aa01e65072b608f0d62 Mon Sep 17 00:00:00 2001 From: Bailey Hollingsworth Date: Sat, 11 Jan 2025 13:24:39 -0600 Subject: [PATCH 361/363] Remove amethyst block scry #1576 --- .../data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json | 5 ----- .../arsnouveau/common/datagen/ScryRitualProvider.java | 1 - 2 files changed, 6 deletions(-) delete mode 100644 src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json diff --git a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json b/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json deleted file mode 100644 index da2d135b75..0000000000 --- a/src/generated/resources/data/ars_nouveau/recipe/scry_ritual/amethyst_blocks.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "type": "ars_nouveau:scry_ritual", - "augment": "c:storage_blocks/amethyst", - "highlight": "c:storage_blocks/amethyst" -} \ No newline at end of file diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java index 1a79dc8567..564f67756b 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/datagen/ScryRitualProvider.java @@ -40,7 +40,6 @@ protected void addEntries() { addForgeOreRecipe(ore); } recipes.add(new ScryRecipeWrapper(ArsNouveau.prefix( "amethyst_gems"), forgeItemTag("gems/amethyst"), forgeBlockTag("storage_blocks/amethyst"))); - recipes.add(new ScryRecipeWrapper(ArsNouveau.prefix( "amethyst_blocks"), forgeItemTag("storage_blocks/amethyst"), forgeBlockTag("storage_blocks/amethyst"))); } private void addForgeOreRecipe(String ore) { From 4bca17985413be7c824720cb168cdad496e2b052 Mon Sep 17 00:00:00 2001 From: Jarva <4622609+Jarva@users.noreply.github.com> Date: Sat, 11 Jan 2025 21:04:43 +0000 Subject: [PATCH 362/363] fix: remove empty portal labels (#1586) --- .../arsnouveau/common/block/PortalBlock.java | 8 ++++---- .../arsnouveau/common/block/tile/PortalTile.java | 2 +- .../hollingsworth/arsnouveau/common/items/WarpScroll.java | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java index 0d0999f4e8..9ea1e7cabb 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/PortalBlock.java @@ -121,13 +121,13 @@ public void entityInside(BlockState state, Level worldIn, BlockPos pos, Entity e } } - public boolean trySpawnPortal(Level worldIn, BlockPos stackPos, WarpScrollData data, String displayName) { + public boolean trySpawnPortal(Level worldIn, BlockPos stackPos, WarpScrollData data, @Nullable String displayName) { if (!ENABLE_WARP_PORTALS.get()) return false; return trySpawnVerticalPortal(worldIn, stackPos, data, displayName) || trySpawnHorizontalPortal(worldIn, stackPos, data, displayName); } - public boolean trySpawnVerticalPortal(LevelAccessor worldIn, BlockPos stackPos, WarpScrollData data, String displayName) { + public boolean trySpawnVerticalPortal(LevelAccessor worldIn, BlockPos stackPos, WarpScrollData data, @Nullable String displayName) { Size portalblock$size = this.isPortal(worldIn, stackPos); if (portalblock$size != null) { portalblock$size.placePortalBlocks(data, displayName); @@ -137,7 +137,7 @@ public boolean trySpawnVerticalPortal(LevelAccessor worldIn, BlockPos stackPos, } } - public boolean trySpawnHorizontalPortal(Level worldIn, BlockPos stackPos, WarpScrollData data, String displayName) { + public boolean trySpawnHorizontalPortal(Level worldIn, BlockPos stackPos, WarpScrollData data, @Nullable String displayName) { FlatPortalAreaHelper helper = new FlatPortalAreaHelper().init(worldIn, stackPos, null, (bs) -> bs.is(BlockTagProvider.DECORATIVE_AN)); if (helper.isValidFrame()) { BlockPos.betweenClosed(helper.lowerCorner, helper.lowerCorner.relative(Direction.Axis.X, helper.xSize - 1).relative(Direction.Axis.Z, helper.zSize - 1)).forEach((blockPos) -> { @@ -340,7 +340,7 @@ public boolean isValid() { return this.bottomLeft != null && this.width >= 1 && this.width <= 21 && this.height >= 1 && this.height <= 21; } - public void placePortalBlocks(WarpScrollData data, String displayName) { + public void placePortalBlocks(WarpScrollData data, @Nullable String displayName) { for (int i = 0; i < this.width; ++i) { BlockPos blockpos = this.bottomLeft.relative(this.rightDir, i); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java index 5ec51f7a33..fb1355bac6 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/block/tile/PortalTile.java @@ -42,7 +42,7 @@ public class PortalTile extends ModdedTile implements ITickable, ITooltipProvide public BlockPos warpPos; public String dimID; public Vec2 rotationVec; - public String displayName; + public @Nullable String displayName; public boolean isHorizontal; public Set entityQueue = new HashSet<>(); diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java index 255a37db3f..086cd3c425 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/items/WarpScroll.java @@ -40,7 +40,7 @@ public boolean onEntityItemUpdate(@NotNull ItemStack stack, ItemEntity entity) { if (entity.getCommandSenderWorld().isClientSide) return false; - String displayName = stack.get(DataComponents.CUSTOM_NAME) != null ? stack.getHoverName().getString() : ""; + String displayName = stack.get(DataComponents.CUSTOM_NAME) != null ? stack.getHoverName().getString() : null; WarpScrollData data = stack.get(DataComponentRegistry.WARP_SCROLL); if (data.isValid() && data.canTeleportWithDim(entity.getCommandSenderWorld().dimension().location().toString()) From a586d2e92d5287208c74631ddf1eca8632342a54 Mon Sep 17 00:00:00 2001 From: Jarva <4622609+Jarva@users.noreply.github.com> Date: Sat, 11 Jan 2025 21:06:33 +0000 Subject: [PATCH 363/363] feat: add function for perk added and removed (#1585) --- .../arsnouveau/api/perk/IPerk.java | 4 ++ .../arsnouveau/common/event/PerkEvents.java | 68 +++++++++++++------ 2 files changed, 50 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerk.java b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerk.java index 54d9d599cc..ed09e3d982 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerk.java +++ b/src/main/java/com/hollingsworth/arsnouveau/api/perk/IPerk.java @@ -8,6 +8,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.EquipmentSlotGroup; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.player.Player; @@ -90,4 +91,7 @@ default String getLangDescription() { default String getDescriptionKey() { return getRegistryName().getNamespace() + ".perk_desc." + getRegistryName().getPath(); } + + default void onRemoved(LivingEntity entity) {} + default void onAdded(LivingEntity entity) {} } diff --git a/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java b/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java index 1fea6aad4d..667a714ef5 100644 --- a/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java +++ b/src/main/java/com/hollingsworth/arsnouveau/common/event/PerkEvents.java @@ -25,37 +25,61 @@ import net.neoforged.neoforge.event.entity.living.LivingEquipmentChangeEvent; import net.neoforged.neoforge.event.level.SleepFinishedTimeEvent; -import java.util.ArrayList; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; @EventBusSubscriber(modid = ArsNouveau.MODID) public class PerkEvents { @SubscribeEvent public static void equipmentChangedEvent(final LivingEquipmentChangeEvent event) { - if (!event.getEntity().level.isClientSide) { - if (event.getSlot().getType() != EquipmentSlot.Type.HUMANOID_ARMOR) - return; - List perkInstances = PerkUtil.getPerksFromItem(event.getFrom()); - List toInstances = PerkUtil.getPerksFromItem(event.getTo()); - if (perkInstances.equals(toInstances)) - return; - - List playerPerks = new ArrayList<>(PerkUtil.getPerksFromLiving(event.getEntity()).stream().map(PerkInstance::getPerk).toList()); - List itemPerks = PerkUtil.getPerksFromItem(event.getTo()).stream().map(PerkInstance::getPerk).toList(); - // This event is called after the item is equipped, and the player contains the perks already from the item that was equipped. - // Remove them, so we can detect actual duplicate. - for (IPerk perk : itemPerks) { - playerPerks.remove(perk); - } + if (event.getEntity().level.isClientSide()) return; + + if (event.getSlot().getType() != EquipmentSlot.Type.HUMANOID_ARMOR) return; + + List fromInstances = PerkUtil.getPerksFromItem(event.getFrom()); + List toInstances = PerkUtil.getPerksFromItem(event.getTo()); + + if (fromInstances.equals(toInstances)) return; + + LivingEntity entity = event.getEntity(); + + ArrayList playerPerks = PerkUtil.getPerksFromLiving(entity).stream().map(PerkInstance::getPerk).collect(Collectors.toCollection(ArrayList::new)); + ArrayList fromPerks = fromInstances.stream().map(PerkInstance::getPerk).collect(Collectors.toCollection(ArrayList::new)); + ArrayList toPerks = toInstances.stream().map(PerkInstance::getPerk).collect(Collectors.toCollection(ArrayList::new)); + + for (IPerk toPerk : toPerks) { + playerPerks.remove(toPerk); + } - for (IPerk equippedPerks : playerPerks) { - if (itemPerks.contains(equippedPerks)) { - PortUtil.sendMessageNoSpam(event.getEntity(), Component.translatable("ars_nouveau.perks.duplicated")); - return; - } + boolean duplicate = false; + for (IPerk playerPerk : playerPerks) { + if (toPerks.contains(playerPerk)) { + duplicate = true; + toPerks.remove(playerPerk); } } + + if (duplicate) { + PortUtil.sendMessageNoSpam(event.getEntity(), Component.translatable("ars_nouveau.perks.duplicated")); + } + + Set fromSet = new HashSet<>(fromPerks); + Set toSet = new HashSet<>(toPerks); + + Set removedPerks = new HashSet<>(fromSet); + removedPerks.removeAll(toSet); + + for (IPerk removedPerk : removedPerks) { + removedPerk.onRemoved(entity); + } + + Set addedPerks = new HashSet<>(toSet); + addedPerks.removeAll(fromSet); + + for (IPerk addedPerk : addedPerks) { + addedPerk.onAdded(entity); + } } @SubscribeEvent

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ⓈjS@R!2_2Bv()fPlQgpb@yIZxuYv_)U3_In=Cms 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 z

Dme_Q8qGaI;wk){zlj7yZL-wUY&UO%gtve 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